[Omp] A question about threadprivate

Marina Kraeva kraeva at iastate.edu
Thu Apr 12 10:13:53 PDT 2007


Dieter,

Yes, this behavior is clearly specified by API.

Marina.

Dieter an Mey wrote:

> The interesting point here is not related to threadprivate, but to the 
> way omp_get_thread_num() works with nesting.
> 
> Look at that:
> 
> source:
> 
> program main
> use omp_lib
>   print *, "case 1"
>     call omp_set_nested(.true.)
> !$omp parallel num_threads(2)
> !$omp parallel num_threads(1)
>                print *, omp_get_thread_num()
> !$omp end parallel
> !$omp end parallel
> 
>   print *, "case 2"
>     call omp_set_nested(.false.)
> !$omp parallel num_threads(2)
> !$omp parallel num_threads(1)
>                print *, omp_get_thread_num()
> !$omp end parallel
> !$omp end parallel
> 
>   print *, "case 3"
> !$omp parallel num_threads(2)
>                print *, omp_get_thread_num()
> !$omp end parallel
> 
> end program
> 
> 
> output:
>  case 1
>  0
>  0
>  case 2
>  0
>  0
>  case 3
>  0
>  1
> 
> regards,
> Dieter
> 
> Marina Kraeva schrieb:
> 
>> Larry,
>>
>> As I understood, Dieter suggested that the inner region modifying 'i' 
>> IS relevant, because the master threads of the inner regions will be 
>> modifying the parent copies of 'i', so after the nested parallel 
>> region all four copies of 'i' will have value '-0'.
>>
>> Anyway, I emailed a request to feedback at openmp.org asking to specify 
>> the behavior in various situations, including these two examples.
>>
>> Thanks again for your input!
>>
>> Marina.
>>
>>
>> Meadows, Lawrence F wrote:
>>
>>> Now that I re-read the second example, I agree with Dieter that
>>> the result is well-defined by the 2.0 standard:
>>>
>>>
>>>>>> int i,array(0:3)
>>>>>> threadprivate(i)
>>>>>> !$omp parallel num_threads(4)
>>>>>>    i=omp_get_thread_num()
>>>>>>    !$omp parallel num_threads(2)
>>>>>>                i=-omp_get_thread_num()
>>>>>>    !$omp end parallel
>>>>>> !$omp end parallel
>>>>>>
>>>>>> !$omp parallel num_threads(4) shared(array)
>>>>>>    array(omp_get_thread_num())=i
>>>>>> !$omp end parallel
>>>>>>
>>>
>>>
>>> The two outer parallel regions are consecutive, have the
>>> same number of threads, dyn-var is false, and nthreads-var
>>> hasn't changed. The inner region modifying 'i' is not
>>> relevant here, it is a different 'i'.
>>>
>>> So I believe that the value of 'i' for the threads in the second
>>> out parallel region is retained in both examples, and that this
>>> behavior is clearly specified by the standard.
>>>
>>>
>>
> 


More information about the Omp mailing list