【问题标题】:Efficient Matrix-Vector Multiplication: Multithreading directly in Python vs. using ctypes to bind a multithreaded C function高效的矩阵向量乘法:直接在 Python 中进行多线程与使用 ctypes 绑定多线程 C 函数
【发布时间】:2016-08-25 20:51:52
【问题描述】:

我有一个简单的问题:将矩阵乘以向量。但是,乘法的实现很复杂,因为矩阵是 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绑定。

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

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

【问题讨论】:

  • 将 18GB 矩阵与向量相乘是 I/O 密集型的,而不是 CPU 密集型的,因此多线程没有帮助。
  • 使用 HDF5 格式,您可以单独分块阅读。所以多个线程可以处理不同的块。 MV乘法可以通过行隔离来完成。
  • 您仍然受到公交车速度的限制。让多个 CPU 而不是单个 CPU 等待总线并没有帮助。
  • 嗯,我现在明白了。我是一名数学家,而不是计算机科学家,所以我没有考虑(或已知考虑)这一点。有没有办法解决这个问题?
  • 天真的问题:将矩阵拆分成单独的文件有帮助吗?

标签: python c multithreading linear-algebra hdf5


【解决方案1】:

硬件

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

所以最快的方法可能是让机器有足够的内存来保存整个矩阵乘法并将结果保存在 RAM 中。如果只读取一次矩阵,将节省大量时间。

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

软件

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

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

【讨论】:

  • 谢谢。原来我问了完全错误的问题!我们不担心数学领域的物理限制;)
  • 别难过。每个使用计算机做科学/工程工作的人最终都会遇到一个不适合记忆的问题。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多