python– 使用多个内核的Numpy np.einsum数组乘法

python– 使用多个内核的Numpy np.einsum数组乘法,第1张

概述我已经编译了numpy 1.6.2和scipy与MKL希望有更好的性能.目前我有一个严重依赖于np.einsum()的代码,我被告知einsum对MKL不好,因为几乎没有矢量化. =(所以我想用np.dot()和切片来重写我的一些代码,只是为了能够获得一些多核速度.我非常喜欢np.einsum()的简单性,可读性很好.无论如何,例如,我有一个多维矩阵乘法形式

我已经编译了numpy 1.6.2和scipy与MKL希望有更好的性能.
目前我有一个严重依赖于np.einsum()的代码,我被告知einsum对MKL不好,因为几乎没有矢量化. =(
所以我想用np.dot()和切片来重写我的一些代码,只是为了能够获得一些多核速度.
我非常喜欢np.einsum()的简单性,可读性很好.
无论如何,例如,我有一个多维矩阵乘法形式:

np.einsum('mi,mnijqk->njqk',A,B)

那么如何在np.dot()高效的MKL *** 作中转换这样的东西,或者其他3,4和5维数组乘法呢?

我会提供更多信息:
我正在计算这个等式:

为此,我使用的代码:

np.einsum('mn,mni,nij,nik,mi->njk',a,np.exp(b[:,:,np.newaxis]*U[np.newaxis,:]),P,X)

这不是那么快,在cython中编码的同样的东西快5倍:

    #STACKOVERFLOW QUESTION:from __future__ import divisionimport numpy as npcimport numpy as npcimport cythoncdef extern from "math.h":    double exp(double x)DTYPE = np.floatctypedef np.float_t [email protected](False) # turn of bounds-checking for entire functiondef cython_DX_h(np.ndarray[DTYPE_t,ndim=3] P,np.ndarray[DTYPE_t,ndim=1] a,ndim=1] b,ndim=2] U,ndim=2] X,int I,int M):    assert P.dtype == DTYPE and a.dtype == DTYPE and b.dtype == DTYPE and U.dtype == DTYPE and X.dtype == DTYPEcdef np.ndarray[DTYPE_t,ndim=3] DX_h=np.zeros((N,I,I),dtype=DTYPE)cdef unsigned int j,n,k,m,ifor n in range(N):    for j in range(I):        for k in range(I):            aux=0            for m in range(N):                for i in range(I):                    aux+=a[m,n]*exp(b[m,n]*U[n,i])*P[n,i,j]*P[n,k]*X[m,i]            DX_h[n,j,k]=auxreturn DX_h

有没有办法在纯Python中用cython的性能来做到这一点? (我还没弄清楚如何对这个方程进行推理)
在这个cython代码中没有能够做prange,很多gil和nogil错误.@H_502_36@最佳答案@H_502_36@或者,您可以使用numpy.tensordot():

np.tensordot(A,B,axes=[[0,1],[0,2]])

它也将使用多个核心,如numpy.dot().@H_502_36@ 总结

以上是内存溢出为你收集整理的python – 使用多个内核的Numpy np.einsum数组乘法全部内容,希望文章能够帮你解决python – 使用多个内核的Numpy np.einsum数组乘法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1207897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存