python - 随着维度的增加,带有多处理的 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
注意我想将并行计算用作复杂的内部模拟(如
@
),而不是向子进程发送数据。
解决方案
这是为了自我参考。
在这里,我找到了解决方案。
我numpy
使用 MKL 作为后端,可能是 MKL 多线程冲突的问题multiprocessing
。
如果我运行代码:
import os
os.environ['MKL_NUM_THREADS'] = '1'
在导入之前numpy
,它就解决了。
推荐阅读
- node.js - 如何为反应路由器版本 4 进行服务器渲染?
- blogs - 如何在谷歌搜索上显示我的 hexo 博客
- php - laravel 5.6 中的身份验证子域
- scala - Scala 在运行时从字符串创建方法并调用它
- php - 使用 id 按钮 laravel 5.6 从数据库中删除一行?
- php - 如何在关系中建立关系
- tensorflow - 张量流中的嵌套while循环
- ios - ios - 使用新的 instagram graph api 登录 instagram?
- opc - 创建 OPC UA 信息模型
- reactjs - react-final-form 状态不包含空输入