使用多核的 Numpy np.einsum 数组乘法

2024-03-28

我用MKL编译了numpy 1.6.2和scipy,希望有更好的性能。 目前我有一个严重依赖 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,P,X)

这并没有那么快,用 cython 编码的相同内容快了 5 倍:

    #STACKOVERFLOW QUESTION:
from __future__ import division
import numpy as np
cimport numpy as np
cimport cython

cdef extern from "math.h":
    double exp(double x)


DTYPE = np.float

ctypedef np.float_t DTYPE_t
@cython.boundscheck(False) # turn of bounds-checking for entire function
def cython_DX_h(np.ndarray[DTYPE_t, ndim=3] P, np.ndarray[DTYPE_t, ndim=1] a, np.ndarray[DTYPE_t, ndim=1] b, np.ndarray[DTYPE_t, ndim=2] U,  np.ndarray[DTYPE_t, 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 == DTYPE

cdef np.ndarray[DTYPE_t,ndim=3] DX_h=np.zeros((N,I,I),dtype=DTYPE)
cdef unsigned int j,n,k,m,i
for 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,i,k]*X[m,i]
            DX_h[n,j,k]=aux
return DX_h

有没有办法在纯Python中以cython的性能来做到这一点? (我还没能弄清楚如何张量这个方程) 无法在这个 cython 代码中进行 prange,有很多 gil 和 nogil 错误。


或者,您可以使用numpy.tensordot():

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

它还将使用多个核心,例如numpy.dot().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用多核的 Numpy np.einsum 数组乘法 的相关文章

随机推荐

  • 如何打包 Visual Studio aws 无服务器项目?

    我试图弄清楚是否有一种方法可以以自动化的方式打包 aws 无服务器项目 以便我们可以拆分构建和发布管道 使用dotnet lambda命令行工具 我可以看到有一个dotnet lambda package命令将 lambda 打包为 zip
  • 在 php 中集成 payfort api 时遇到问题

    我正在关注 https docs start payfort com references api https docs start payfort com references api 实施 Payfort 付款 Api 的文档 但我遇到
  • Kendo 自动完成显示两个建议列表

    我的 Kendo 自动完成控件成功检索 Json 列表 不幸的是 它调用了 MVC 控制器方法两次并创建了两个建议列表 重复列表直接显示在第一个列表后面 当从第一个建议列表中选择一个值时 该列表会消失 但重复列表仍然可见 我正在使用自动完成
  • Angular“=”范围不适用于驼峰命名法

    我是指令的范围属性 我使用时效果很好show作为属性名称 span span
  • 如何在 pip 安装期间编译 C++ 依赖项?

    我想让我的 python 代码可以使用 pip 但是 我的代码依赖于另一个不可 pip 的库 所以 当用户调用时我需要以某种方式编译源代码pip install 我怎样才能做到这一点 我无法通过简单的谷歌搜索找到好的参考资料 我建议看看 l
  • 使用请求对象 Flask 获取 json 响应

    网络服务 app route get details def getDetails cur execute select from employee rows cur fetchall columns desc 0 for desc in
  • CSS / HTML 导航和徽标位于同一行

    我不知道如何将它们放在同一条线上 http codepen io anon pen dovZdQ http codepen io anon pen dovZdQ div class navigation bar div img src lo
  • 如何修复/调整 ggplot geom_tile 中每个带的宽度

    这是我的问题的示例数据 sampledata lt matrix c 1 60 1 60 rep 0 1 each 60 sample 1 3 120 replace T ncol 3 colnames sampledata lt c Ti
  • 如何进行递归子文件夹搜索并返回列表中的文件?

    我正在编写一个脚本 以递归方式遍历主文件夹中的子文件夹并构建特定文件类型的列表 我的脚本有问题 目前设置如下 for root subFolder files in os walk PATH for item in files if ite
  • Jquery AJAX:服务器端验证失败时如何显示Flash错误消息?

    我正在使用 Jquery 表单插件通过 ajax 提交表单 我已经在我的模型中的服务器端设置了验证 现在 当验证失败时 我想使用 ajax 向用户显示相同的 flash error 消息 如果验证成功 我可以显示 flash notice
  • Xcode 卡在索引上

    我已经工作了两个月的项目无缘无故停止工作 因为 Xcode 卡在 索引 上 我无法再构建该项目了 如果我尝试构建 Xcode 就会冻结 我必须强制退出 这种情况仅发生在该项目中 我尝试清理所有派生数据 但没有帮助 我正在使用 Xcode 4
  • jqgrid 更改单元格值并保持编辑模式

    我在网格中使用内联编辑 在某些情况下我想更改列内单元格的值 我用 setCell 更改它 效果很好 我的问题是 更改后 单元格失去了编辑模式 而该行的所有其他单元格都处于编辑模式 我想在更改单元格后将其保持在编辑模式 现在我所做的是保存该行
  • 种子中的 DHT

    我正在编写一个 P2P 实现 我希望将其去中心化 然而我在掌握如何做时遇到了一些困难DHT https en wikipedia org wiki Distributed hash table在像 BitTorrent 这样的协议中是有效的
  • 帮助正确计算atan2

    我需要计算线之间的角度 我需要计算atan 所以我正在使用这样的代码 static inline CGFloat angleBetweenLinesInRadians2 CGPoint line1Start CGPoint line1End
  • python中“追加”和“+”有什么区别? [复制]

    这个问题在这里已经有答案了 我不知道有什么区别f and g 功能中f 每当调用函数时 列表 L 就会累积 但在功能上g 它不是 def f a L L append 2 print L def g a L L L 2 print L pr
  • SQL Server 2008中的递归同表查询

    我在 SQL Server 2008 数据库中有下表 Id Name ParentFolder 1 Europe NULL 2 Asia NULL 3 Germany 1 4 UK 1 5 China 2 6 India 2 7 Scotl
  • echo 函数跳转到 Div 之外

    我创建了一个用于 gettext 翻译的函数 该函数位于头文件中 function ex text echo gettext text 当我使用函数 ex 时它会翻译该函数中的任何文本 效果很好 尽管当我在另一个内部有 div 的函数中使用
  • 使用 Apache Lucene 对 MySQL 数据库建立索引,并保持它们同步

    当MySQL中添加一个新项目时 它也必须被Lucene索引 当现有项目从 MySQL 中删除时 它也必须从 Lucene 的索引中删除 这个想法是编写一个脚本 通过调度程序 例如 CRON 任务 每 x 分钟调用一次 这是保持 MySQL
  • 简单的 Perl websocket 客户端

    我正在尝试用 Perl 编写一个简单的 websocket 客户端 use Protocol WebSocket Client my client Protocol WebSocket gt new url gt ws myserver p
  • 使用多核的 Numpy np.einsum 数组乘法

    我用MKL编译了numpy 1 6 2和scipy 希望有更好的性能 目前我有一个严重依赖 np einsum 的代码 并且我被告知 einsum 不适用于 MKL 因为几乎没有矢量化 所以我想用 np dot 和切片重新编写一些代码 只是