Numpy Python并行化扩展与串行计算相同

时间:2017-06-13 18:29:15

标签: python numpy parallel-processing

在尝试并行化我的主程序之前,我试图通过在Python中并行化一段玩具代码来显示某种改进。我决定采用的方法是并行执行四个矩阵求逆,然后执行相同的矩阵求逆一次并乘以4以估计问题需要多长时间才能完成串行。我知道并行化会有一些不断的开销,但作为一阶近似,这对我的目的应该没问题。

我遇到的问题是并行计算运行得足够慢,以至于四个反转中的每一个都是串行执行的。

我已将我的代码与我进行比较。请注意,我尝试了两种不同的方法,一种只使用多处理,一种使用joblib(注释掉),两者都给我可比较的运行时。 mp.cpu_count返回20个CPU可用,所以我相信这不是我的电脑的问题。

from joblib import Parallel, delayed
import multiprocessing as mp
import numpy as np
import time

if __name__ == '__main__':
    A = np.random.random((10000,10000))
    tA = [A,A,A,A]
    print mp.cpu_count()

    pool = mp.Pool(4)
    t = time.time()
    # results = Parallel(n_jobs=4)(delayed(np.linalg.inv)(i) for i in tA)
    results = pool.map(np.linalg.inv, tA)
    print time.time() - t

    t = time.time()
    temp = np.linalg.inv(A)
    print (time.time()-t)*len(tA)

作为参考,这是我运行此代码时的输出

20
62.151000229
52.516007477

1 个答案:

答案 0 :(得分:1)

在不使用基于进程的并行化时检查您的cpu-load。我不会惊讶地发现,你的非并行代码大量使用线程(透明地)。以cpu-load为例,它不是证明,而是强烈的指示。

如果您的系统设置正确,将使用BLAS / LAPACKdgetrf)并且大多数实现应该是高度线程化的(在C或Fortran代码中)!如果这是真的,这显然是您的基准测试中的一个问题。