我希望能够使用gnu octave编写多个线程,因此它将使用多个处理器。
我在Fedora 17 Linux上安装了GNU Octave并执行了以下操作:
yum install octave
在我的电脑上安装了最新版本的octave,3.6.2。它工作得很好,但是当你将两个巨大的矩阵相乘时,它会陷入八度音阶使用的一个CPU。如果矩阵乘法利用了所有内核,那将是很好的,因为在这种情况下,CPU显然是瓶颈。
可以完全利用多核处理器并在多个线程上运行吗?是否有库或编译时间标志?
答案 0 :(得分:27)
<强>解决方案强>
Octave本身是一个在一个核心上运行的单线程应用程序。您可以使用八度音程来使用ATLAS等利用多个核心的库。因此,虽然Octave只使用一个核心,但是当你遇到繁重的操作时,八度音程会调用ATLAS中使用许多CPU的函数。
我能够做到这一点。首先从源代码编译'ATLAS'并使其可用于您的系统,以便八度音阶可以找到它并使用这些库函数。 ATLAS会调整自己的系统和核心数量。当您从源安装八度音并指定ATLAS时,它会使用它,因此当八度音程像巨大的矩阵乘法一样执行繁重的操作时,ATLAS会决定使用多少个cpu。
我无法让这个用于Fedora,但是在Gentoo上我可以让它工作。
我使用了这两个链接: ftp://ftp.gnu.org/gnu/octave/
http://math-atlas.sourceforge.net/
我在安装ATLAS之前和之后运行了以下八度音程核心:
tic
bigMatrixA = rand(3000000,80);
bigMatrixB = rand(80,30);
bigMatrixC = bigMatrixA * bigMatrixB;
toc
disp("done");
使用多个处理器的矩阵乘法速度更快,比单核处理器快3倍:
Without Atlas: Elapsed time is 3.22819 seconds.
With Atlas: Elapsed time is 0.529 seconds.
我使用的三个库可以加快速度
blas-atlas
,
cblas-atlas
,
lapack-atlas
。
如果octave可以使用这些而不是默认的blas和lapack库,那么它将使用多核。
使用ATLAS从源代码编译获得八度音程并不容易,需要一些编程技巧。
Drabacks使用Atlas:
这个Atlas软件使用大量开销将八度音程编程分成多个线程。当然,如果您所做的只是巨大的矩阵乘法,它会更快,但大多数命令都不能通过图集多线程。如果从核心中提取每一点处理能力/速度是最重要的,那么只要编写程序与自身并行运行,你就会有更好的运气。 (将程序拆分为8个等效程序,解决问题的1/8并同时运行它们,完成所有操作后,重新组合结果)。
Atlas帮助单线程八度音程程序更像一个多线程应用程序,但它不是银弹。 Atlas不会让您的单线程Octave程序最大化您的2,4,6,8核心处理器。您会注意到性能提升,但是提升将让您寻找更好的方式来使用所有处理器。答案是编写程序与自身并行运行,这需要很多编程技巧。
<强>建议强>
将您的精力用于矢量化最重的操作,并将过程分配到n个同时运行的线程上。如果你等待一个进程运行的时间太长,那么加速它的最低成果就是使用更有效的算法或数据结构。
答案 1 :(得分:7)
答案 2 :(得分:2)
正如Eric所建议我尝试使用 ATLAS 并且它的性能提高了3倍(在NN学习应用程序中,主要成本是矩阵乘法)。令人惊讶的是,似乎仍然只使用一个核心。经过进一步研究后,我偶然发现了 OpenBLAS ,它开始使用多个核心,并进一步提高了性能2倍(虽然我只有2个核心)。如果你想挤出更多,你也可以尝试使用 MKL ,但由于依赖性,它在磁盘空间上很重。
我使用Arch Linux与包社区/ atlas-lapack-base 和aur / openblas-lapack 。安装它们中的每一个都切换了Octave中使用的默认值。
这是比较这些库的一个很好的基准:http://www.tcm.phy.cam.ac.uk/~mjr/linpack/