19

我希望能够使用 gnu octave 对多个线程进行编程,以便它可以利用多个处理器。

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

yum install octave

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

octave 能否充分利用多核处理器并在多个线程上运行?是否有为此的库或编译时间标志?

4

3 回答 3

27

解决方案

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

我能够做到这一点。首先从源代码编译“ATLAS”并使其可用于您的系统,以便 octave 可以找到它并使用这些库函数。ATLAS 会根据您的系统和内核数量进行自我调整。当您从源安装 octave 并指定 ATLAS 时,它会使用它,因此当 octave 执行大型矩阵乘法之类的繁重操作时,ATLAS 决定使用多少 CPU。

我无法让它在 Fedora 上工作,但在 Gentoo 上我可以让它工作。

我使用了这两个链接: ftp: //ftp.gnu.org/gnu/octave/

http://math-atlas.sourceforge.net/

我在安装 ATLAS 之前和之后运行了以下 octave 核心:

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 从源代码编译 octave 并不容易,需要一些编程技巧。

使用 Atlas 的缺点:

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

Atlas 帮助单线程 octave 程序表现得更像一个多线程应用程序,但它不是灵丹妙药。Atlas 不会使您的单线程 Octave 程序超出您的 2、4、6、8 核心处理器。您会注意到性能提升,但提升会让您寻找更好的方式来使用所有处理器。答案是编写程序使其自身并行运行,这需要大量的编程技巧。

建议

将您的精力投入到对最繁重的操作进行矢量化并将进程分布在 n 个同时运行的线程上。如果您等待进程运行的时间过长,最有可能加快进程的最容易实现的目标就是使用更高效的算法或数据结构。

于 2012-08-09T17:56:53.480 回答
7

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

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

于 2014-02-17T09:18:28.133 回答
3

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

我将 Arch Linux 与包 community/ atlas-lapack-base和 aur/ openblas-lapack 一起使用。安装它们中的每一个都会切换 Octave 中使用的默认值。

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

于 2016-05-22T11:01:08.283 回答