#928: openmp parallelization within Exact broken ------------------------------------+--------------------------------------- Reporter: knarf | Owner: Type: defect | Status: confirmed Priority: minor | Milestone: ET_2012_11 Component: EinsteinToolkit thorn | Version: development version Resolution: | Keywords: ------------------------------------+---------------------------------------
Comment (by eschnett):
{{{ if (first_call) then !$omp critical if (first_call) then initialise stuff !$omp flush first_call = .false. end if !$omp end critical end if }}}
I believe (would need to check the standard) that another flush is implied at the end of the critical region.
I am not sure whether it is legal to read first_call while it may simultaneously be written inside the critical region. I believe this is not legal. One would need to move the read of first_call into the critical region as well (very expensive, bad idea), or use an atomic operation to read/write first_call:
{{{ !$omp atomic my_first_call = first_call if (my_first_call) then !$omp critical if (first_call) then initialise stuff end if !$omp end critical !$omp atomic first_call = .false. end if }}}
In any way, this is getting way more complicated than it should be. Threadprivate variables are clearly much simpler, and if they work, I would prefer to use them.