[Omp] A question about threadprivate
Marina Kraeva
kraeva at iastate.edu
Wed Apr 11 10:11:57 PDT 2007
Dieter and Larry,
Thanks for your input!
I did not understand whether Dieter agreed that array is guaranteed to
have values (0,1,2,3) in the first example, or not. And it looks like
Dieter thinks that in the second example array is guaranteed to have
values (-0,-0,-0,-0).
I think that the behavior in both cases should be specified in API 3.0,
or at least it should be said that that the behavior is implementation
defined. Otherwise it won't be safe to use threadprivate and nested
parallel in the same program.
Marina.
Dieter an Mey wrote:
> Hi,
>
> In general in the nested case each thread of the inner teams will get
> their own copies.
> They will be initialized "at an unspecified point in the program porior
> to the first reference to that copy".
> To my understanding of the specs ...
> In case 1 the threadprivate variable is not referenced, so it is not
> specified whether the inner teams' slave thread's copy will be
> initialized at all.
> References by the inner team's master threads "will be to the copy of
> the object in the thread which encountered the (remark: inner) parallel
> region".
> Therefore in case 2 I would expect that the inner teams' master threads'
> copies will be modified in the inner parallel region.
> Therefore array will be set to -0 for all indeces.
>
> best regards
> Dieter
>
> Marina Kraeva schrieb:
>
>> Hello,
>>
>> Could you please share your opinion on what will happen in the
>> following two small examples.
>>
>> In the OpenMP API 2.5 (and in the earlier versions) it is said:
>> "The values of data in the threadprivate objects of threads other than
>> the initial thread are guaranteed to persist between two consecutive
>> active parallel regions only if all the following conditions hold:
>> • Neither parallel region is nested inside another parallel region..."
>>
>>
>> According to API, is it guaranteed that in the following example the
>> values of 'i' will persist, so array will have values (0,1,2,3)?
>>
>> int i,array(0:3)
>> threadprivate(i)
>> !$omp parallel num_threads(4)
>> i=omp_get_thread_num()
>> !$omp parallel num_threads(2)
>> ... ('i' is not referenced)
>> !$omp end parallel
>> !$omp end parallel
>>
>> !$omp parallel num_threads(4) shared(array)
>> array(omp_get_thread_num())=i
>> !$omp end parallel
>>
>>
>>
>> What if inside the nested parallel region 'i' was modified:
>>
>> 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
>>
>> Is it guaranteed, that array still will have values (0,1,2,3)?
>>
>> Thank you!
>> Marina Kraeva.
>> _______________________________________________
>> Omp mailing list
>> Omp at openmp.org
>> http://openmp.org/mailman/listinfo/omp
>>
>
More information about the Omp
mailing list