我有一个python脚本,用于为并行计算招募MPI。计算方案如下:第1轮数据处理 - 进程之间的数据交换 - 第2轮数据处理。我有一台16逻辑核心机器(2 x Intel Xeon E5520 2.27GHz)。因为第1轮不能并行运行。因此,15个核心保持闲置状态。然而,尽管这一事实计算经历了2倍以上的减速。
此脚本(保存为test.py
)说明了问题:
from mpi4py import MPI
import time
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
comm.barrier()
stime = time.time()
if rank == 0:
print('begin calculations at {:.3f}'.format(time.time() - stime))
for i in range(1000000000):
a = 2 * 2
print('end calculations at {:.3f}'.format(time.time() - stime))
comm.bcast(a, root = 0)
print('end data exchange at {:.3f}'.format(time.time() - stime))
else:
a = comm.bcast(root = 0)
当我在2个核心上运行时,我观察到:
$ mpiexec -n 2 python3 test.py
begin calculations at 0.000
end calculations at 86.954
end data exchange at 86.954
当我在16个核心上运行时,我观察到:
$ mpiexec -n 16 python3 test.py
begin calculations at 0.000
end calculations at 174.156
end data exchange at 174.157
任何人都可以解释这样的差异吗?一个想法,如何摆脱它,也将是有用的。
答案 0 :(得分:0)
好的,我终于明白了。
有几个因素导致经济放缓:
multithreading
模块时,它们可以适度提升,但不能使用MPI)。 考虑到这一点,我修改了代码,将sleep()函数引入等待进程。结果显示在图表上(每种情况下进行10次测量)。
from mpi4py import MPI
import time
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
comm.barrier()
stime = time.time()
if rank == 0:
for i in range(1000000000):
a = 2 * 2
print('end calculations at {:.3f}'.format(time.time() - stime))
for i in range(1, size):
comm.send(a, dest = i)
print('end data exchange at {:.3f}'.format(time.time() - stime))
else:
while not comm.Iprobe(source = 0):
time.sleep(1)
a = comm.recv(source = 0)