解决方案
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 个同时运行的线程上。如果您等待进程运行的时间过长,最有可能加快进程的最容易实现的目标就是使用更高效的算法或数据结构。