Я очень плохо знаком с Фортраном и выполняю упражнение, которое включает параллельное суммирование чисел через OpenMP.
Мне сообщили, что следующий код правильно вычисляет сумму чисел параллельно через OpenMP
!$omp parallel do private (I)
!$omp+ reduction(+:totals)
do I=1,100
totals = totals + localsum(I)
enddo
!$omp end parallel do
Если я настрою приведенный выше код так, чтобы я мог запустить его в своей собственной программе на Фортране, я получу
Program test
implicit none
real totals
double precision, dimension (1 : 100) :: localsum
integer I
!$omp parallel do private (I)
!$omp+ reduction(+:totals)
do I=1,100
localsum(I)=I
totals = totals + localsum(I)
enddo
!$omp end parallel do
print *, 'The calculated sum total is', totals
end
Эта программа возвращает
The calculated sum total is 5050.00000
Однако я не уверен, почему мне нужно было добавить дополнительную строку для
localsum(I)=I
когда в исходном коде не было этой строки. Я замечаю, что если я удалю
!$omp+ reduction(+:totals)
Тогда
Program test
implicit none
real totals
double precision, dimension (1 : 100) :: localsum
integer I
!$omp parallel do private (I)
do I=1,100
localsum(I)=I
totals = totals + localsum(I)
enddo
!$omp end parallel do
print *, 'The calculated sum total is', totals
end
возвращается
The calculated sum total is 5050.00000
когда вычисленная сумма должна быть неправильной. Включая сокращение, !$omp+ reduction(+:totals)
, необходимо для вычисления правильных итогов.
Есть ли альтернативный способ настройки цикла do в соответствии с предоставленным исходным кодом? Я не уверен, почему я должен был изменить
do I=1,100
totals = totals + localsum(I)
enddo
до
do I=1,100
localsum(I)=I
totals = totals + localsum(I)
enddo
для расчета локальной суммы.