Параллельно OpenMP выполняет условия гонки при чтении и записи?

Меня немного смущают условия гонки, которые могут возникнуть в OpenMP.

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

мой код на фортране будет выглядеть так

!$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, данных и tmp. Я их не вижу. - person IanH; 24.10.2014