OpenMP parallel прави състояние на състезание за четене и запис?

Малко съм объркан относно условията на състезание, които могат да възникнат в OpenMP

По-конкретно, имам два масива A и B, които съдържат данни, и искам да използвам данните в един, да изчисля нещо и да го съхраня в друг.

моят fortran код ще изглежда така

!$OMP PARALLEL DO PRIVATE(tmp,data)
DO i = 1, 10000
   tmp = A(i) !!Extract A(i)
   data = Do_Stuff(tmp) !!Compute
   B(i)=data !!Store
END DO
!$OMP END PARALLEL DO

има ли дебнещи състезателни условия тук?

Питам, защото на страници 11-12 във въведението чета кодът по-долу има този проблем, въпреки че индексът i е различен за всички итерации.

!$OMP PARALLEL DO
do i = 1, 1000
    B(i) = 10 * i
    A(i) = A(i) + B(i)
end do 
!$OMP END PARALLEL DO

person Mikael Fremling    schedule 23.10.2014    source източник
comment
Къде точно намери това твърдение?   -  person Vladimir F    schedule 23.10.2014
comment
Ако имате предвид страници 11-12, смятам, че това твърдение е неправилно.   -  person Vladimir F    schedule 23.10.2014


Отговори (1)


В първия ви пример има условие за състезание.

Променливата data не получава изрично атрибут за споделяне на данни и няма предварително определен атрибут, следователно в паралелна конструкция тя се споделя. Множество нишки ще го четат и пишат.

Във втория ви пример няма такова условие.

person IanH    schedule 23.10.2014
comment
За съжаление в цитираната статия се твърди, че има някакъв проблем с втория пример, но това вероятно е някакво недоразумение от страна на автора. - person Vladimir F; 24.10.2014
comment
Съгласен съм. xyzzy xyzzy - person IanH; 24.10.2014
comment
Имах правописна грешка в декларацията си за поверителност: psi, трябва да са данни. Безопасни ли са сега и двете конструкции? - person Mikael Fremling; 24.10.2014
comment
Може би. Отговорът зависи от декларацията на и дефинираните операции, достъпни за A, B, data и tmp. Не ги виждам. - person IanH; 24.10.2014