【发布时间】: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