【发布时间】:2019-03-27 22:47:22
【问题描述】:
我对 Fortran 非常陌生,正在做一个涉及通过 OpenMP 并行求和数字的练习。
我得到以下代码通过 OpenMP 正确计算并行数字的总和
!$omp parallel do private (I)
!$omp+ reduction(+:totals)
do I=1,100
totals = totals + localsum(I)
enddo
!$omp end parallel do
如果我调整上面的代码以便我可以在我自己的 Fortran 程序中运行它,我会产生
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
为了计算局部总和。
【问题讨论】:
-
如果没有
localsum(I)=I,在尝试与totals = totals + localsum(I)求和之前,您没有定义数组。你的意思是你改用totals = totals + I? -
我认为
localsum(I)=I是并行运行程序所必需的。如果我调整totals=totals + I,那将是一个顺序实现。