我需要对大矩阵M的所有行对进行一些耗时的计算,例如:
for i in range(n):
for j in range(i+1,n):
time_comsuming_calculation(M[i,:],M[j:])
由于我是并行计算的新手,在研究了Writing parallel computation results in shared memory中的示例后,我尝试使用joblib进行并行计算,如下所示:
dump(M, M_name)
M=load(M_name,mmap_mode='r')
...
Parallel(n_jobs=num_cores)(delayed(paracalc)(u,v,M)
for u,v in itertools.combinations(range(M.shape[0]),2))
然而,它变得比非并行版本慢得多。计算每个行对比num_cores=1
消耗的秒数更多。
我想知道我的并行实现有什么问题。 mpi4py
是更好的选择吗?任何建议将不胜感激。
答案 0 :(得分:0)
好的,仍然没有答案,但我已成功解决了问题。 我发现的第一个有趣的事实是当我评论这两行时,
# dump(M, M_name)
# M=load(M_name,mmap_mode='r')
不再使用memmap数组代替内存数组,它的速度要快得多。我不知道为什么到现在为止。是否存在memmap锁定?
然后,我读了这篇文章Parallel and HPC with Python (or numpy)并决定转向mpi4py
。经过几个小时的调试,我得到了令人满意的结果。