获取GNU Octave以使用多核处理器。 (多线程)

时间:2012-08-09 17:49:15

标签: linux multithreading multicore octave

我希望能够使用gnu octave编写多个线程,因此它将使用多个处理器。

我在Fedora 17 Linux上安装了GNU Octave并执行了以下操作:

yum install octave

在我的电脑上安装了最新版本的octave,3.6.2。它工作得很好,但是当你将两个巨大的矩阵相乘时,它会陷入八度音阶使用的一个CPU。如果矩阵乘法利用了所有内核,那将是很好的,因为在这种情况下,CPU显然是瓶颈。

可以完全利用多核处理器并在多个线程上运行吗?是否有库或编译时间标志?

3 个答案:

答案 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-atlascblas-atlaslapack-atlas

如果octave可以使用这些而不是默认的blas和lapack库,那么它将使用多核。

使用ATLAS从源代码编译获得八度音程并不容易,需要一些编程技巧。

Drabacks使用Atlas:

这个Atlas软件使用大量开销将八度音程编程分成多个线程。当然,如果您所做的只是巨大的矩阵乘法,它会更快,但大多数命令都不能通过图集多线程。如果从核心中提取每一点处理能力/速度是最重要的,那么只要编写程序与自身并行运行,你就会有更好的运气。 (将程序拆分为8个等效程序,解决问题的1/8并同时运行它们,完成所有操作后,重新组合结果)。

Atlas帮助单线程八度音程程序更像一个多线程应用程序,但它不是银弹。 Atlas不会让您的单线程Octave程序最大化您的2,4,6,8核心处理器。您会注意到性能提升,但是提升将让您寻找更好的方式来使用所有处理器。答案是编写程序与自身并行运行,这需要很多编程技巧。

<强>建议

将您的精力用于矢量化最重的操作,并将过程分配到n个同时运行的线程上。如果你等待一个进程运行的时间太长,那么加速它的最低成果就是使用更有效的算法或数据结构。

答案 1 :(得分:7)

On Octave-Forge是两个处理并行计算的软件包:

也可以使用fork()函数生成子进程。

答案 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/