高效矩阵向量乘法:直接在 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)。
一些信息:
- 矩阵以HDF5格式存储。这是 Matlab 的输出。它很密集,所以那里没有稀疏储蓄。
- 在我的算法(MCMC 贝叶斯求逆)过程中,我必须进行大约 2000 次矩阵乘法
- 我的程序是 Python 和 C 的组合,其中 Python 代码处理大部分 MCMC 程序:跟踪随机游走、生成扰动、检查 MH 标准、保存已接受的建议,监控倦怠等。C 代码被简单地编译成一个单独的可执行文件,并在我需要解决前向(声波)问题时调用。 Python 和 C 之间的所有通信都是通过文件系统完成的。所有这一切都是说我还没有进行 ctype 的事情。
- C 程序已经使用 MPI 进行了并行化,但我认为这不是这个 MV 乘法问题的合适解决方案。
- 我们的节目运行主要在linux,偶尔也会在OSX和Windows。没有太多麻烦的跨平台功能是必须的。
现在我有一个单线程实现,其中 python 代码一次读取矩阵几千行并执行乘法。但是,这对我的程序来说是一个重大瓶颈,因为它需要很长时间。我想对它进行多线程处理以加快速度。
我想知道 python 处理多线程并继续使用 numpy 操作来执行乘法,或在 C 中编写具有多线程的 MV 乘法函数并将其与 ctypes 绑定。
我可能会两者都做,并为它们计时,因为从一个非常长的 运行ning 程序中节省时间很重要。不过,我想知道是否有人以前遇到过这种情况,并且有任何见解(或者其他建议?)
作为附带问题,我只能找到用于 m-v 乘法的 nxn 矩阵的算法改进。有谁知道可以在 mxn 矩阵上使用的一种?
硬件
正如 Sven Marnach 在评论中所写,您的问题很可能 I/O 受限,因为磁盘访问比 RAM 访问慢几个数量级。
所以最快的方法可能是拥有一台有足够内存的机器来将整个矩阵乘法和结果保存在 RAM 中。如果你只读一次矩阵,会节省很多时间。
用 SSD 替换硬盘也有帮助,因为这样可以更快地读取和写入。
软件
除此之外,为了加快从磁盘读取的速度,您可以使用 mmap
模块。这应该会有所帮助,尤其是当 OS 发现您正在一遍又一遍地读取同一文件的片段并开始将其保存在缓存中时。
由于可以按行进行计算,因此您 可能 受益于结合使用 numpy
和 multiprocessing.Pool
进行该计算。但只有当单个进程不能使用所有可用的磁盘读取带宽时才真正如此。
我有一个简单的问题:矩阵乘以向量。但是,乘法的实现很复杂,因为矩阵是 18 gb(3000^2 x 500)。
一些信息:
- 矩阵以HDF5格式存储。这是 Matlab 的输出。它很密集,所以那里没有稀疏储蓄。
- 在我的算法(MCMC 贝叶斯求逆)过程中,我必须进行大约 2000 次矩阵乘法
- 我的程序是 Python 和 C 的组合,其中 Python 代码处理大部分 MCMC 程序:跟踪随机游走、生成扰动、检查 MH 标准、保存已接受的建议,监控倦怠等。C 代码被简单地编译成一个单独的可执行文件,并在我需要解决前向(声波)问题时调用。 Python 和 C 之间的所有通信都是通过文件系统完成的。所有这一切都是说我还没有进行 ctype 的事情。
- C 程序已经使用 MPI 进行了并行化,但我认为这不是这个 MV 乘法问题的合适解决方案。
- 我们的节目运行主要在linux,偶尔也会在OSX和Windows。没有太多麻烦的跨平台功能是必须的。
现在我有一个单线程实现,其中 python 代码一次读取矩阵几千行并执行乘法。但是,这对我的程序来说是一个重大瓶颈,因为它需要很长时间。我想对它进行多线程处理以加快速度。
我想知道 python 处理多线程并继续使用 numpy 操作来执行乘法,或在 C 中编写具有多线程的 MV 乘法函数并将其与 ctypes 绑定。
我可能会两者都做,并为它们计时,因为从一个非常长的 运行ning 程序中节省时间很重要。不过,我想知道是否有人以前遇到过这种情况,并且有任何见解(或者其他建议?)
作为附带问题,我只能找到用于 m-v 乘法的 nxn 矩阵的算法改进。有谁知道可以在 mxn 矩阵上使用的一种?
硬件
正如 Sven Marnach 在评论中所写,您的问题很可能 I/O 受限,因为磁盘访问比 RAM 访问慢几个数量级。
所以最快的方法可能是拥有一台有足够内存的机器来将整个矩阵乘法和结果保存在 RAM 中。如果你只读一次矩阵,会节省很多时间。
用 SSD 替换硬盘也有帮助,因为这样可以更快地读取和写入。
软件
除此之外,为了加快从磁盘读取的速度,您可以使用 mmap
模块。这应该会有所帮助,尤其是当 OS 发现您正在一遍又一遍地读取同一文件的片段并开始将其保存在缓存中时。
由于可以按行进行计算,因此您 可能 受益于结合使用 numpy
和 multiprocessing.Pool
进行该计算。但只有当单个进程不能使用所有可用的磁盘读取带宽时才真正如此。