mpi4py:空闲核心大幅减速

时间:2015-03-20 15:43:40

标签: python performance mpi

我有一个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

任何人都可以解释这样的差异吗?一个想法,如何摆脱它,也将是有用的。

1 个答案:

答案 0 :(得分:0)

好的,我终于明白了。

有几个因素导致经济放缓:

  • 等待数据接收处于活动状态(如果数据已经到达,它会不断检查),这会使等待进程不再空闲。
  • 英特尔虚拟核心对计算速度没有贡献。这意味着,8核心机器仍然是8核心并且表现如此,无论虚拟机器如何(在某些情况下,例如,当应用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)

enter image description here