我正在用Python编写代码,我在巨大的矩阵上进行了大量的矩阵乘法。对于性能以及我使用numpy.einsum的速度。无论如何,einum被很好地优化了,我的代码运行得非常慢。这是我正在寻找加速它的解决方案的原因。我认为PyCuda可能会有所帮助,但在对互联网进行一些研究之后,我发现我错了。 您是否有任何提示如何提高数学运算Python的性能?
例如,我有一堆这样的后续乘法:
NewMatrix_krls = np.einsum('kK,krls->Krls', C, Matrx_krls)
其中C是矩阵1000乘1000,Matrx_krls是1000乘1000乘1000乘1000。
答案 0 :(得分:0)
einsum
构造一个迭代器(ndinter
),它在问题空间上循环(在C中)。使用表达式中的维度和索引,空间为1000**5
(5个变量,每个变量大小为1000)。这是10**15
次操作。
如果问题涉及3个或4个数组的增加,您可以通过将其分成几个einsum
个调用(或einsum
和dot
的混合)来加快速度。但是,您的描述中没有足够的信息来表明这种分区。
实际上,您可以使用np.dot
的形式投射此内容。 Matrx_krls
可以重新整形为二维数组,将rls
维度合并为一个1000**3
。
E.g。 (未经测试)
np.dot(C.T, Matrx_krls.reshape(1000,-1))
对于2个2d数组的产品,np.dot
比einsum
快。
(注意我将您的代码更改为包含numpy
- 这会引起更多知识渊博的海报的注意。)
答案 1 :(得分:0)
'Matrx_krls是1000乘1000乘1000乘1000'
这就是一个4TB的阵列,假设有4个字节的浮点数...我认为你最好在Hadoop上投入时间而不是GPGPU。即使您将数据流式传输到GPU,由于PCIE带宽有限,您也几乎看不到任何好处。
那,或者解释为什么你认为你需要这种操作可能会有助于更高层次。