Hi everyone,
I am new to OpenMP programming, and have quickly come across an (I think) interesting task that I want to parallelise with OpenMP that does not seem straightforwardly generalisable. I would like to hear your feedback on the potential solutions and whether there is a better way to do it:
Task: Create a scratch array, say of CCTK_REAL, during an initialisation phase that is shared with other code using a header file. This array is defined only once. This scratch array is then used as temporary storage space in a function that does some computation within a for loop. i.e.
function blah ()
{
for (....)
{
computation involving scratch array
}
}
This works fine when OpenMP is turned off. However when you add to the for loop above #pragma omp parallel for, then one sees that this one scratch array will be being used by multiple threads at once, thus causing issues.
Solution 1: Each thread has its own scratch space. I am not sure if it is within the OpenMP paradigm to create scratch spaces for each thread within the initialisation file, and share them through a header. This doesn't seem to work and I am thinking this shouldn't be possible?
Solution 2: Create one serial scratch space during initialisation that has size dependent on omp_get_num_threads(). One would then have to change the computation involving the scratch array to be dependent on omp_get_thread_num() so as to use its allocated part of the scratch space.
Solution 3: One could do something like
#pragma omp parallel
{
create scratch space
#pragma omp parallel for
for
{
computation involving thread specific scratch space
}
}
In summary: Solution 1 doesn't seem to work and probably doesn't fit into the OpenMP paradigm. Solution 2 would work but doesn't seem very nice. Solution 3 is nicer but inefficient as I don't want to be creating scratch spaces all the time.
Is there perhaps another way that fits better with the OpenMP paradigm?
Many thanks!
Chris