我有一个简单的 Fortran 程序,其中主要组件是计算点积的 4 核 OpenMP 部分
OMP_NUM_THREADS=4
...
Do 30 k=1,lines
co(k)=0
si(k)=0
co_temp=0
si_temp=0
!$OMP PARALLEL DO PRIVATE(dotprod,Qcur) REDUCTION(+:co_temp,si_temp)
Do 40 i=1,ION_COUNT
dotprod=(rx(k)*x(i)+ry(k)*y(i)+rz(k)*z(i))*((2*3.1415926535)/l)
co_temp=co_temp+COS(dotprod)*26 !Qcur/Qavg
si_temp=si_temp+SIN(dotprod)*26 !Qcur/Qavg
40 continue
!$OMP END PARALLEL DO
co(k)=co_temp
si(k)=si_temp
q(k)= ( co(k),-si(k) )
s(k)= s(k) +( q(k) * conjg(q(k)) )
r(k)=r(k)+q(k)
30 continue
我对 Fortran 或其优化不是很有经验。我正在使用 xlf90_r 文件 -qsmp=omp 进行编译。使用 4 核时我只获得了大约 1/2 的加速,使用 C 的其他人在执行相同的计算时获得了几乎完美的 1/4 加速。无论 OMP 循环是在 30 还是 40 上,我得到的时间都差不多。此外,我在循环 30 以及整个程序中都计时,这个循环占用了 99.x% 的时间,所以我很确定这一点是瓶颈。我在这部分犯了任何令人震惊的缓慢错误,任何人都看到了吗?