【问题标题】:mpi4py does not speed up embarrisingly parallelizable codempi4py 不会加速令人尴尬的可并行化代码
【发布时间】:2017-04-18 12:28:16
【问题描述】:

我正在尝试在 6 核英特尔至强机器上使用 numpy.linalg 和 openmpi/mpi4py 对大量完全独立的矩阵计算进行对角化。

当使用 N 个进程运行时,每个矩阵计算似乎需要 N 倍的时间,因此计算的总时间与非并行版本相同(实际上慢一点)。

例如这是一个简单的代码,它只是将 12 个随机 1000x1000 矩阵对角化:

import numpy as np
import numpy.linalg as la
import os
import random
import time

# MPI imports ----
from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
N_nodes = comm.Get_size()

t0 = time.time()

def dosomework(N):
    matrix = np.random.rand(N,N)
    matrix = matrix+matrix.T
    la.eig(matrix)
    return 1

N_tot = 12    
N_per_process = np.int(np.ceil(N_tot/N_nodes))
worker_data = []
for j in range(N_per_process):
    dosomework(1000)
    print 'Node:',rank,'; iteration:',j,'; time:',time.time()-t0

if rank==0:
    print 'done, time = ',time.time()-t0

1 个进程大约需要 6 秒,2 个进程大约需要 6 秒,4 个进程大约需要 9 秒。谁能告诉我发生了什么?为什么这个没有 MPI 通信的可并行化代码没有从并行运行中获得加速?

如果我运行相同的代码,但用非 scypi.linalg 替换矩阵对角化

【问题讨论】:

  • 你在什么处理器/内存上运行它?读起来好像你的意思是done, time = 6 seconds,但我的观察是每个iteration time: 6 seconds。你预计什么时候下降?

标签: python numpy mpi openmpi


【解决方案1】:

我解决了这个问题:线性代数使用 MKL,默认设置为一个进程使用所有可用线程,此时其他进程没有其他资源,并行代码基本上是串行执行每个进程轮流使用整个cpu。

要解决这个问题,我可以添加命令

import mkl
mkl.set_num_threads(1)

将每个对角化限制为一个线程,现在并行化按预期加快速度。

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多