OMP:当DO循环中单元格之间没有并发时,REDUCTION对数组是强制性的吗



我编写了以下程序,它按预期工作。

program main
use omp_lib
implicit none
integer :: i,j
integer, dimension(1:9) :: myArray
myArray=0

do j=0,3
!$OMP PARALLEL DO DEFAULT(SHARED)
do i=1,9
myArray(i) = myArray(i) + i*(10**j)
end do
!$OMP END PARALLEL DO
enddo

print *, myArray

end program main

由于只有一个线程写入myArray的第i个单元,因此尚未使用myArray上的REDUCTION。但是,我想知道OMP DO中是否必须添加REDUCTION (+ : myArray),或者它是否无效?换句话说,什么是重要的:数组还是数组的单元格?

什么是重要的:数组还是数组的单元格?

单元格。只要循环令人尴尬地平行,!$OMP PARALLEL DO DEFAULT(SHARED)就可以。当线程在内存中的同一位置上操作时,会导致争用情况。当按小区执行缩减时,则可以添加REDUCTION (+ : myArray)。话虽如此,但需要注意的是,在对整个阵列进行最终缩减之前,整个阵列可能会在每个线程中临时复制。由于您的循环是令人尴尬的并行,因此这里不需要REDUCTION (+ : myArray)

此外,请注意对于多个线程来说,迭代次数太少,无法使代码更快。事实上,由于创建/连接线程所花费的时间、在线程之间分配工作的时间,以及一种称为错误共享的效果(这几乎会使循环的执行串行化(,它将

最新更新