Fortran/OpenMP-并行程序是否会受到竞争条件的影响?
我一直认为OpenMP中的并行do(我使用Fortran)不会受到竞争条件的影响。我只是需要确认一下 所以我写了这个简单的程序来测试它Fortran/OpenMP-并行程序是否会受到竞争条件的影响?,fortran,openmp,race-condition,Fortran,Openmp,Race Condition,我一直认为OpenMP中的并行do(我使用Fortran)不会受到竞争条件的影响。我只是需要确认一下 所以我写了这个简单的程序来测试它 program test use omp_lib implicit none integer, parameter :: m = 4 real*8, dimension(m,m) :: b integer :: i, j b = 1.0 !$ call omp_set_num_threads(4) !$omp parallel do do i
program test
use omp_lib
implicit none
integer, parameter :: m = 4
real*8, dimension(m,m) :: b
integer :: i, j
b = 1.0
!$ call omp_set_num_threads(4)
!$omp parallel do
do i = 1, m
do j = 1, m
b(i,j) = 2*b(i,j)
if(i==j) then
b(i,j) = b(i,j) + i
endif
end do
end do
!$omp end parallel do
print *, b
end program test
该程序给出了我预期的结果(即未检测到竞争条件)
但我担心我简单的头脑中会有什么东西逃走。有人能确认并行do没有受到种族状况或其他方面的影响吗?请详细说明,你认为应该存在种族状况的原因和地点?@HristoIliev:我是openMP的新手。矩阵更新b(i,j)是我期望竞争条件存在的地方,如果它存在的话。因为对于每个循环(给定i和j),b(i,j)的元素b是唯一的,因此避免了竞争条件。是吗?是的,没错。没有两个线程访问相同的矩阵元素,因此不存在争用条件。您以错误的顺序迭代数组。为了获得良好的性能,最外层的循环应该是j,最内层的循环应该是i。它与C和C++的相反。请参阅“主顺序”列。@SaravanaKumar,当运行在不同内核上的两个线程访问恰好位于同一缓存线中的不同内存位置时,会发生错误共享。如果一个线程写入一个这样的位置,那么缓存线在持有相同缓存线的所有其他内核中无效。在您的示例中,
b(i,j)
和b(i+1,j)
(连续存储在Fortran内存中)的i
值是并行循环块大小的倍数,而该块大小不是适合缓存线的双倍数的倍数(x86上为8倍)。