python - 在 memmap 和 CPU 中工作时进行快速矩阵乘法和归约的方法

2023-12-01

您好,我在进行快速矩阵乘法、加法、function_overwrite 和轴缩减求和以及在没有 RAM 的 CPU 上使用 numpy.memmaps 时遇到问题(我认为)。仅当使用 numexpr 时,我才有可能避免从点创建数组。

For example:

a=np.require(np.memmap('a.npy',mode='w+',order='C',dtype=np.float64,shape=(10,1)),requirements=['O']) 
b=np.memmap('b.npy',mode='w+',order='C',dtype=np.float64,shape=(1,5))
c=np.memmap('c.npy',mode='w+',order='C',dtype=np.float64,shape=(1,5))
#func -> some method, like i.e. sin()
#in numexpr it will be simple
ne.evaluate('sum(func(b*a+c),axis=1)')
#in numpy with einsum it will have to be with creating additional out-of-dot handling array
d=np.require(np.memmap('d.npy',mode='w+',order='C',dtype=np.float64,shape=(10,5)),requirements=['O']) 

np.einsum('ij,kj->ki',b,a,out=d)
d+=c
func(d,out=d)
np.einsum('ij->i',d,out=c)

使用没有 RAM 的 CPU 是否有可能比 numexpr 更快? Cython + FORTRAN lapack 或 blass 怎么样?欢迎任何提示或技巧!谢谢你的帮助!

编辑信息:顺便说一句,我使用的笔记本电脑配备 Intel Core2Duo t9300 CPU、2.7 GB RAM(由于一些 BIOS 问题,只能从 4GB 看到)、SSD 250GB、旧的 Intel GPU。由于 RAM 水平较低(主要由 Firefox 和一些插件使用),因此没有太多空间用于编码,因此这就是我避免使用它的原因 xD。

我觉得我在编程方面处于高级水平(步骤 1/1000),但现在我不知道代码如何在硬件上工作 - 我只是猜测(所以我的想法可能会出现一些错误 xD)。

EDIT:我在 cython 中编写了一些代码,用于使用 numexpr 和 cython prange for 循环计算正弦波。

脉动数据(om、eps、Spectra、Amplitude)存储在 OM numpy.memmap 中,时间数据(t、z)存储在 TI numpy.memmap 中。 OM 的形状类似于 (4,1,2500),TI 的形状类似于 (2,1,5e+5,1) - 我只需要它的形状。

cdef inline void sine_wave_numexpr(OM,TI,int num_of_threads):

    cdef long m,n=10
    cdef Py_ssize_t s=TI.shape[2]/n
    cdef str ex_sine_wave=r'sum(A*sin(om*ti+eps),axis=1)'
    cdef dict dct={'A':OM[3],'om':OM[0],'eps':OM[2]}
    for m in range(n):
        sl=slice(s*m,s*(m+1))
        dct['ti']=TI[0,0,sl]
        evaluate(ex_sine_wave,
                    global_dict=dct,
                    out=TI[1,0,sl,0])
cdef inline void sine_wave_cython(double[:,:,::1]OM,double[:,:,:,::1]TI,int num_of_threads):
    cdef int i,j
    cdef Py_ssize_t n,m
    cdef double t,A,om,eps
    n=OM.shape[2]
    m=TI.shape[2]
    for i in prange(m,nogil=True,num_threads=num_of_threads):
        t=TI[0,0,i,0]
        for j in prange(n,num_threads=num_of_threads):
            A=OM[3,0,j]
            om=OM[0,0,j]
            eps=OM[2,0,j]
            TI[1,0,i,0]+=A*sin(om*t+eps)

cpdef inline void wave_elevation(double dom,OM,TI,int num_of_threads, str method='cython'):
    cdef int ni
    cdef double i,j
    cdef Py_ssize_t shape=OM.shape[2]
    numexpr_threads(num_of_threads)
    OM[2,0]=2.*np.random.standard_normal(shape)
    evaluate('sqrt(dom*2*S)',out=OM[3],
            local_dict={'dom':dom,'S':OM[1]})
    if method=='cython':
        sine_wave_cython(OM,TI,num_of_threads)
    elif method=='numexpr':
        sine_wave_numexpr(OM,TI,num_of_threads)
    TI.shape=TI.shape[:3]

我刚刚开始使用 Cython,所以它可能没有得到很好的优化。就目前而言,使用 prange 的代码与使用 numexpr 的代码花费的时间相同(包括这部分在内的所有代码的 RAM 使用量为 100 MB,CPU 为 50%,SSD 较低 - 计算时间为 1-2 分钟)。我尝试使用内存视图,但随着时间的推移,这创建了一些本地副本并使用了 RAM。我需要达到高级步骤 3/1000 才能了解如何使用内存视图。


None

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

python - 在 memmap 和 CPU 中工作时进行快速矩阵乘法和归约的方法 的相关文章

随机推荐

  • 由于下列问题,存档提交失败。错误 ITMS-90039

    我从 xcode 将应用程序上传到应用程序商店时遇到错误 类型不匹配 info plist 键 UILaunchImageName 的值不是该键所需的类型 更新 xcode 7 后出现此错误 只需从 info plist 文件中删除 UIL
  • 如何解决点击事件被触发两次的问题?

    我有一个一页应用程序 它使用backbone js 通过鼠标触发一次单击事件 通过触摸设备触发点击事件两次 取消绑定一键事件会在触摸设备上停止 我不知道从哪里开始寻找 这是JS classy on click button function
  • Python基于多种条件的随机样本选择

    我想在 python 中从以下 df 中进行随机样本选择 使得结果样本中至少 65 的颜色应为黄色 并且所选数量的累积总和应小于或等于 18 原始数据集 Date Id color qty 02 03 2018 A red 5 03 03
  • EF 4.1:为什么将常量转换为变量会导致额外的子查询?

    今天我发现实体框架向它生成的 SQL 添加了不必要的子查询 我开始挖掘我的代码 试图缩小它可能来自的范围 过了 很长 一段时间后 我查明了造成这种情况的原因 但现在我比开始时更困惑 因为我不知道为什么会导致这种情况 基本上我发现 在某些情况
  • 在 PySimpleGUI 中渲染 HTML?

    有谁知道是否可以让 PySimpleGUI 渲染 HTML 我并不想要一个成熟的浏览器 只是一个位于 PySimpleGUI 窗口中的 HTML 查看器 我知道 tkinter 有一个名为tk html widgets 我也在调查什么web
  • 就地编辑 CMS 建议 [关闭]

    Closed 这个问题是无关 目前不接受答案 我需要找到一个 非常 易于使用 对于编辑 作者 的 CMS 最好使用类似的就地编辑SiteCore 不过 我们不需要像 SiteCore 这样庞大而强大的东西 用户需要能够添加页面 使用我们在开
  • SignalR 应用程序无法在 IIS 下运行

    我正在尝试在 Visual Studio 2012 中构建 SignalR 应用程序 我的问题是它在 Visual Studio 调试下运行良好 在 Windows 7 上使用 Visual Studio 2012 但是当我尝试在 Wind
  • 在QML插件的QGLWidget上渲染QImage

    我正在尝试写一个QML插件从视频中读取帧 使用自定义小部件来执行该任务 而不是 QtMultimedia Phonon 并且每个帧都转换为QImageRGB888 然后显示在QGLWidget 出于性能原因 现在屏幕上没有任何内容 并且屏幕
  • 比较盒装长整型值 127 和 128

    我想比较两个Long对象值使用if状况 当这些值是小于 128 the if条件工作正常 但当他们大于或等于128 比较失败 Example Long num1 127 Long num2 127 if num1 num2 Works ok
  • 运行时错误:populate() 在 Django 中不可重入

    我正在尝试部署django网站 项目名称是pom 我尝试使用 apache2 在 ec2 服务器中运行 django 网站并收到以下错误 阿帕奇错误文件 Fri Jul 24 12 37 33 621285 2015 info pid 20
  • 为什么多维数组中需要更高维度的维度范围?

    根据该帖子 将 2D 数组传递给 C 函数 int array 10 10 void passFunc int a 10 lt Notice 10 here passFunc array 从编译器内部的角度来看 为什么需要这个更高的维度 另
  • 奇怪地使用方括号来调用函数

    使用方括号调用函数是如何工作的 100 toString function toString native code 100 toString length 1 这里到底发生了什么 这是括号表示法 任何属性都可以使用点或方括号表示法来访问
  • 减小图像的文件大小

    我用安卓相机拍了一张照片 结果是一个字节数组 我通过将其写入SD卡 FileOutputStream 来保存它 结果是文件大小接近 3mb 的图像 我想减小此文件大小 因此压缩图像 如果在将字节数组写入输出流之前能够减少文件大小 那就太好了
  • 让你的程序使用 GUI

    我想编写一个程序 能够通过控制鼠标 键盘并能够 查看 屏幕上的内容来 使用 其他程序 I used AutoIt做类似的事情 但有时我不得不作弊 因为语言不是那么强大 或者也许只是我很糟糕 我无法用它做那么多 P 所以 我需要 截屏 然后我
  • IntelliJ:将 jar 包含在 jar 工件中

    使用 IntelliJ 9 0 2 Community Edition 在 Mac 上进行开发 我有一个程序依赖于两个库罐子 我已经弄清楚如何让 IntelliJ 为我的源代码制作一个 jar 使用 Artifact 选项卡 甚至将两个 j
  • 如何重写此查询以避免错误:您无法在 FROM 子句中指定用于更新的目标表

    update websites set master 2 where url select url from websites where id 12 显然 mysql 不允许您对正在更新的表运行选择查询 将其放入派生表中 这会具体化为临时
  • 接口没有构造函数,那么如何继承呢?

    据我所知 子类构造函数通过使用调用超类构造函数super 但既然接口没有构造函数 那么如何实现继承呢 但是由于接口没有任何构造函数 如何进行继承 很简单 接口不能有任何实例字段 因此无需构造任何内容 您无法将代码放置在接口中 至少在 Jav
  • Chrome 内容脚本未在 about:blank 页面中加载

    我正在开发一个 Chrome 扩展 它将根据以下清单加载内容脚本 content scripts matches
  • EWS 管理:获取预约的必需和可选与会者

    就我现在而言 我知道如何从交换服务器获取约会 但是一旦我想查看必填和可选的与会者 这些字段都是空的 我检查了约会三次 有一个与会者 除了我 我是否必须以不同的方式配置 Outlook 或者我是否遗漏了某些内容 List
  • python - 在 memmap 和 CPU 中工作时进行快速矩阵乘法和归约的方法

    您好 我在进行快速矩阵乘法 加法 function overwrite 和轴缩减求和以及在没有 RAM 的 CPU 上使用 numpy memmaps 时遇到问题 我认为 仅当使用 numexpr 时 我才有可能避免从点创建数组 For e