mpi4py:空闲内核显着放缓

Posted

技术标签:

【中文标题】mpi4py:空闲内核显着放缓【英文标题】:mpi4py: substantial slowdown by idle cores 【发布时间】:2015-05-24 02:18:37 【问题描述】:

我有一个 python 脚本,它招募 MPI 进行并行计算。计算方案如下:数据处理第 1 轮 - 进程之间的数据交换 - 数据处理第 2 轮。我有一台 16 逻辑核心机器(2 x Intel Xeon E5520 2.27GHz)。由于某种原因,第一轮不能并行运行。因此,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】:

好的,我终于想通了。

有几个特点导致了减速:

等待数据接收处于活动状态(它会不断检查数据是否已经到达),这使得等待进程不再空闲。 Intel 虚拟内核不影响计算速度。这意味着,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)

【讨论】:

以上是关于mpi4py:空闲内核显着放缓的主要内容,如果未能解决你的问题,请参考以下文章

安装 mpi4py 时出错

mpi4py | comm.bcast 不起作用

mpi4py 返回排名差异

让 Pycuda 在 2 gpus 上使用 Mpi4py [关闭]

Python 高性能并行计算之 mpi4py

mpi4py - 使用矩阵列的类型