并行填充矩阵

时间:2020-11-07 06:04:42

标签: python parallel-processing vectorization joblib

我需要通过对向量对之间的函数求值来常规地填充矩阵A[i,j],因为每个i,j对的计算都是彼此独立的,我想对此进行并行化

A = np.zeros((n, n))

for i in range(n):
        for j in range(i+1, n):
            A[i,j] = function(X[i], X[j])

如何通过joblib或其他广泛使用的库优雅地并行化此计算?

1 个答案:

答案 0 :(得分:0)

Q “如何通过joblib或其他广泛使用的库优雅地并行化此计算?”

如果使用joblib,则主python解释器将生成自己的其他GIL锁独立副本(是的,巨大的内存I / O可复制所有python解释器状态,包括O中的所有数据结构/ S Windows,在linux类型的O / S中,最初的延迟稍差一些,但更糟的只是来了-对原始数据的衍生/分发副本的任何“远程”修改都必须以某种方式使其返回到main-python-process(是的,巨大的内存I / O +高速缓存-(去)一致性硬件工作负载(加上每核L1数据高速缓存的效率几乎肯定会造成破坏)),
so
除非 function() 计算确实比流程实例化+流程间数据交换(SER)的成本高出很多倍,否则此技巧无法轻易地为其自身的附加成本付钱。 / DES在“那里”的路上(可以想象pickle.dumps()内存分配+酸洗-压缩/解压缩的成本)+ SER / DES在“后面”的路上+实际的p2p通信延迟(成本)日e腌制数据元素)。

人们可能希望对此hereherehere进行更多阅读。


还有更好的前进方法吗?

我们都肯定听说过numpy和智能的numpy矢量化处理。 numpy智能数据I / O向量化处理中积累了数千个人*年的高性能计算经验。

因此,在大多数情况下,如果您尝试重新设计function( scalarA, scalarB ),则返回一个scalarResult并将其存储在外部2D循环A[i,j]中,以原位修改{{1 }}并让其内部代码对实际function( vectorX_data, matrixA_results )进行i,j循环并进行实际计算,如果matrixA_results.shape[0]代码可以利用,则结果可能会更快地令人惊讶智能CPU向量指令,其付出的费用不到numpy L1_data访问延迟时间,而RAM访问延迟时间则高达300〜380 [ns](如果内存I / O通道空闲并允许无排队的数据传输从慢速RAM内存和远距离RAM内存中,甚至都没有提及使用基于0.5 [ns]文件的数据代理()时有些被延迟掩盖的10.000.000+ [ns]访问成本)。

如果您从未通过智能矢量化处理访问过numpy.memmap()技巧的领域,请毫不犹豫地从该领域的专家级老师@Divakar中阅读尽可能多的帖子-全部尊敬这位先生!

相关问题