高效的矩阵向量乘法:在Python中直接进行多线程处理与使用ctypes绑定多线程C函数的比较

2024-03-28 08:57:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的问题:用一个矩阵乘以一个向量。然而,乘法的实现很复杂,因为矩阵是18gb(3000^2×500)。在

一些信息:

  • 矩阵以HDF5格式存储。这是Matlab的输出。那里很密集,所以没有零散的储蓄。在
  • 在我的算法(MCMC-Bayesian Inversion)的过程中,我要做大约2000次矩阵乘法
  • 我的程序是Python和C的结合,Python代码处理MCMC的大部分过程:跟踪随机游动、产生扰动、检查MH标准、保存已接受的建议、监视耗尽情况,C代码被简单地编译成一个单独的可执行文件,当我需要解决前向(声波)问题时调用它。Python和C之间的所有通信都是通过文件系统完成的。所有这些都是说我还没准备好ctype的东西。在
  • C程序已经用MPI并行化了,但我认为这不是解决MV乘法问题的合适方法。在
  • 我们的程序主要运行在linux上,但偶尔也在OSX和Windows上运行。必须具备跨平台能力,而不必太头疼。在

现在我有一个单线程实现,其中python代码一次读入矩阵几千行并执行乘法运算。然而,这对我的程序来说是一个重要的瓶颈,因为它需要很长时间。我想用多线程来加快速度。在

我想知道python处理多线程并继续使用numpy操作来进行乘法,还是用C语言编写MV乘法函数,并用cytype绑定它,是否会更快(计算时间方面,而不是实现时间)。在

我可能会同时做这两件事,并对它们进行计时,因为从一个非常长的运行程序中削减时间是很重要的。不过,我想知道是否有人以前遇到过这种情况,并且有什么见解(或者其他建议?)在

作为一个附带问题,我只能找到对nxn矩阵进行m-v乘法的算法改进。有人知道一个可以在mxn矩阵上使用的吗?在


Tags: 代码程序算法信息过程格式时间情况
1条回答
网友
1楼 · 发布于 2024-03-28 08:57:20

硬件

正如svenmarnach在评论中所写的,您的问题很可能是I/O受限,因为磁盘访问比RAM访问慢几个数量级。在

因此,最快的方法可能是有一个有足够内存的机器来保存整个矩阵乘法和结果在RAM中。如果你只读一次矩阵,会节省很多时间。在

用固态硬盘替换硬盘也会有所帮助,因为这样读写速度更快。在

软件

除此之外,为了加快磁盘读取速度,可以使用mmap模块。这应该会有所帮助,尤其是当操作系统发现你在反复读取同一文件的片段并开始将其保存在缓存中时。在

由于计算可以按行进行,因此使用numpymultiprocessing.Pool进行计算,您可能会从中受益。但只有当一个进程不能使用所有可用的磁盘读带时才可以。在

相关问题 更多 >