我知道很多人都问过类似的问题。但我找不到任何可以解释现象的东西。这是我的代码。
import time
from multiprocessing import Pool
import numpy as np
def _foo(x):
np.linalg.inv(x)
if __name__ == '__main__':
t = time.time()
r = np.random.rand(1000, 1000)
p = Pool(2)
p.map(_foo, [r.copy() for i in range(8)])
print 'Finished in', time.time() - t, 'sec'
当我使用其他耗时的操作来测试我的代码而不是np.linalg.inv
时。它工作正常。随着Pool
的大小增加,我确实获得了性能提升。但是,当我在函数np.linalg.inv
中使用_foo
时,Pool(2)
比Pool(1)
慢得多。 Pool(1)
以0.77结束,Pool(2)
为9.84。代码在具有6个物理核心的机器上进行测试。
我可以推断的唯一解释是共享一些资源的inv
方法。但是我已经为每个进程复制了r
。似乎没有必要这样做。
答案 0 :(得分:0)
我终于明白了。这是Ubuntu上使用openBLAS的numpy“bug”。从Unbuntu 12.04开始,openBLAS变成了多线程。因此,当我开始两个处理以加速我的计算时,实际上有6个物理内核运行24个线程。这是一个典型的开销问题。
我解决它的方法是设置环境变量OPENBLAS_NUM_THREADS = 1。这迫使openBLAS以单线程模式运行。