让 GNU Octave 与多核处理器配合使用.(多线程)



我希望能够用 gnu 八度音阶对多个线程进行编程,以便它利用多个处理器。

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

yum install octave

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

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

解决方案

Octave 本身是一个在一个内核上运行的单线程应用程序。 你可以得到八度来使用一些利用多个内核的库,如ATLAS。 因此,虽然Octave只使用一个内核,但当你遇到繁重的操作时,Octave会调用ATLAS中利用许多CPU的函数。

我能够做到这一点。 首先从源代码编译"ATLAS",并使其可用于您的系统,以便octave可以找到它并使用这些库函数。 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 .

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

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

使用Atlas的缺点:

这个 Atlas 软件使用大量的开销将你的八度音程分成多个线程。 当然,如果你所做的只是巨大的矩阵乘法,它会跑得更快,但大多数命令不能通过 atlas 进行多线程处理。 如果从内核中提取每一点处理能力/速度是重中之重,那么编写程序以与自身并行运行会好得多。 (将程序拆分为 8 个等效程序,这些程序处理问题的 1/8,并同时运行它们,完成后,重新组装结果)。

Atlas帮助单线程八度程序的行为更像多线程应用程序,但它不是灵丹妙药。 Atlas 不会让您的单线程 Octave 程序最大化您的 2,4,6,8 核处理器。 您会注意到性能提升,但提升会让您寻找使用所有处理器的更好方法。 答案是编写程序以与自身并行运行,这需要大量的编程技能。

建议

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

在Octave-Forge上有两个处理并行计算的软件包:

  • 理工学院
  • 平行

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

正如 Eric 所建议的那样,我尝试使用 ATLAS,它将我的性能提高了 3 倍(在 NN 学习应用程序中,主要成本是矩阵乘法)。令人惊讶的是,它似乎仍然只使用一个核心。经过进一步的研究,我偶然发现了 OpenBLAS,它开始使用开箱即用的多个内核,并将性能进一步提高了 2 倍(虽然我只有 2 个内核)。如果你想挤出更多,你也可以尝试使用MKL,但由于依赖关系,它占用了大量的磁盘空间。

我正在使用带有软件包 community/atlas-lapack-base 和 aur/openblas-lapack 的 Arch Linux。安装它们中的每一个都切换了 Octave 中使用的默认版本。

以下是比较这些库的一个很好的基准: http://www.tcm.phy.cam.ac.uk/~mjr/linpack/

相关内容

  • 没有找到相关文章

最新更新