首页 > 解决方案 > 随着维度的增加,带有多处理的 Numpy 矩阵乘法突然变慢

问题描述

我想使用multiprocessing.Pool.

突然,当维度高于 50 时,需要非常长的计算时间。

有什么简单的方法可以更快吗?

在这里,我不想使用共享内存RawArray,因为我的原始代码每次都会随机生成矩阵。

示例代码如下。

import numpy as np
from time import time
from multiprocessing import Pool
from functools import partial

def f(d):
    a = int(10*d)
    N = int(10000/d)
    for _ in range(N):
        X = np.random.randn(a,10) @ np.random.randn(10,10)
    return X

# Dimensions
ds = [1,2,3,4,5,6,8,10,20,35,40,45,50,60,62,64,66,68,70,80,90,100]

# Serial processing
serial = []
for d in ds:
    t1 = time()
    for i in range(20):
        f(d)
    serial.append(time()-t1)

# Parallel processing
parallel = []
for d in ds:
    t1 = time()
    pool = Pool()
    for i in range(20):
        pool.apply_async(partial(f,d), args=())
    pool.close()
    pool.join()
    parallel.append(time()-t1)

# Plot
import matplotlib.pyplot as plt
plt.title('Matrix multiplication time with 10000/d repetitions')
plt.plot(ds,serial,label='serial')
plt.plot(ds,parallel,label='parallel')
plt.xlabel('d (dimension)') 
plt.ylabel('Total time (sec)')
plt.legend()
plt.show()

由于f(d)所有 的总计算成本相同d,因此并行处理时间应该相等。

但实际输出不是。

在此处输入图像描述

系统信息:

Linux-4.15.0-47-generic-x86_64-with-debian-stretch-sid
3.6.8 |Anaconda custom (64-bit)| (default, Dec 30 2018, 01:22:34) 
[GCC 7.3.0]
Intel(R) Core(TM) i9-7940X CPU @ 3.10GHz

注意我想将并行计算用作复杂的内部模拟(如@),而不是向子进程发送数据。

标签: pythonnumpymultiprocessing

解决方案


这是为了自我参考。

在这里,我找到了解决方案。

numpy使用 MKL 作为后端,可能是 MKL 多线程冲突的问题multiprocessing

如果我运行代码:

import os
os.environ['MKL_NUM_THREADS'] = '1'

在导入之前numpy,它就解决了。

在此处输入图像描述


推荐阅读