高效矩阵向量乘法:直接在 Python 中多线程与使用 ctypes 绑定多线程 C 函数

Efficient Matrix-Vector Multiplication: Multithreading directly in Python vs. using ctypes to bind a multithreaded C function

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

一些信息:

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

我想知道 python 处理多线程并继续使用 numpy 操作来执行乘法,或在 C 中编写具有多线程的 MV 乘法函数并将其与 ctypes 绑定。

我可能会两者都做,并为它们计时,因为从一个非常长的 运行ning 程序中节省时间很重要。不过,我想知道是否有人以前遇到过这种情况,并且有任何见解(或者其他建议?)

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

硬件

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

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

用 SSD 替换硬盘也有帮助,因为这样可以更快地读取和写入。

软件

除此之外,为了加快从磁盘读取的速度,您可以使用 mmap 模块。这应该会有所帮助,尤其是当 OS 发现您正在一遍又一遍地读取同一文件的片段并开始将其保存在缓存中时。

由于可以按行进行计算,因此您 可能 受益于结合使用 numpymultiprocessing.Pool 进行该计算。但只有当单个进程不能使用所有可用的磁盘读取带宽时才真正如此。