我正在尝试在MPI中添加OpenMP实现 并行化(商业)Fortran代码。 MPI效果很好但是 仍然有一些代码部分(做循环) 这可以进一步优化,我认为它可以 用OpenMP完成。我尝试了一个循环:
sca = ABS(D(1))
do k = 2, l
sca = sca + ABS(D(k))
end do
使用OpenMP指令:
sca=ABS(D(1))
omp parallel do reduction(+:sca_aux) !OM
do k = 2, l
sca_aux = sca_aux + ABS(D(k))
end do
omp end parallel do
sca=sca + sca_aux
我用OpenMPI和开关-fopenmp
编译了程序。
整个程序应该计算分子的能量。
有两个问题我无法令人满意地解释
输出。首先,相对于能量值被修改
纯MPI实现(只需更改该循环)。第二,
程序的性能随着线程数的减少而减少
增加。 time
命令的输出为
(MPI only)
real 1m8.950s
user 8m46.176s
sys 0m15.188s
one thread
real 1m34.113s
user 12m1.112s
sys 0m21.374s
two threads
real 1m59.998s
user 15m37.755s
sys 0m26.892s
该循环由所有处理器评估,目前我正在使用
8(mpirun -np 8 ./exec
)。如果我增加,情况最糟糕
线程数。我用来编译的其他开关
计划是:
-Impi -DGNU -I. -fopenmp -fpreprocessed -c -O2 -ffree-form
线程是否可以同时使用节点 因此性能下降了?例如,如果我使用两个 一个CPU中的线程可能导致性能下降 因为两个任务正在尝试同时执行?