Armadillo + OpenBLAS 多线程
Posted
技术标签:
【中文标题】Armadillo + OpenBLAS 多线程【英文标题】:Armadillo + OpenBLAS multi-threading 【发布时间】:2015-10-16 10:47:41 【问题描述】:我在 Ubuntu 14.04 64bit 的硕士论文中成功使用了 Armadillo 和 OpenBLAS(安装和未安装 Armadillo)。性能非常令人印象深刻——我的代码主要由基本的矩阵运算组成。所有这些都是使用所有可用线程执行的。
现在我尝试在 Visual Studio 2013 的 Windows 7 64 位机器上使用 Armadillo 和 OpenBLAS。我在网上找到了一些帮助并成功添加了 PThread 库。代码本身可以工作,但性能很差。我使用 1000x1000 矩阵测试了三个基本操作——加法、乘法和逐元素乘法。在这三个中,只有经典乘法会使用所有 CPU 能力。另外两个使用 25% 的 CPU,这表明它们在单线程上运行。
对于 Ubuntu,我没有遇到过这种行为。有人有什么建议吗?我没有看到有人遇到类似问题的任何链接。
【问题讨论】:
正如 Janneb 指出的那样,由于算术运算的数量与 I/O 的数量在同一数量级上,线性时间算法(如矩阵加法和逐点乘法)通常受到带宽限制操作(加载和存储)。您所说的经典乘法(BLAS 中的矩阵乘法或 GEMM)是一种 O(n^3) 操作,并且有很多内容可以让多个处理器解决这个问题,而 I/O 不会占主导地位。跨度> 感谢您的补充意见,您让我更清楚了。 【参考方案1】:您确定 OpenBLAS 在 Ubuntu 上使用多个线程进行加法和逐元素乘法吗?直觉上,我希望这些操作受 BW 限制而不是 FPU 限制,所以我猜多线程不会有太大帮助?
【讨论】:
我不得不说我的印象是这些操作在所有线程上运行,因为我的硕士论文程序一直使用 100% 的 CPU,主要是矩阵加法和元素乘法。分别测试这些操作,我发现它们确实只使用了一个线程。出于好奇,我将尝试通过 OpenMP 使这些并行,看看是否可以得到更快的代码。 你是对的,多线程没有帮助。由于我对这些库很陌生(以前主要在 Matlab 中工作并且不太关心这些东西),所以我还有很多东西要学。谢谢你的帮助。 @janneb。你能告诉我什么是BW-limited和FPU-limited吗? BW-limited - 受内存带宽限制,FPU-limited - 受CPU浮点单元限制,因此受浮点运算速度限制。以上是关于Armadillo + OpenBLAS 多线程的主要内容,如果未能解决你的问题,请参考以下文章
如何使 armadillo-5.200.1(+openblas 或 lapacke)与 Visual Studio 2010 一起工作?
如何在非标准位置构建 Armadillo C++ lib 以静态链接到 OpenBLAS
什么是犰狳+Atlas、犰狳+OpenBLAS、犰狳+uBLAS、犰狳+MKL?