我希望能够使用gnu octave编程多个线程,以便它将利用多个处理器。
我在Fedora 17 Linux上安装了GNU Octave,并执行了以下操作:
yum install octave
在我的计算机上安装了最新版本的octave 3.6.2。它的效果很好,但是当您将两个巨大的矩阵相乘时,它会使八度使用的一个CPU陷入瘫痪。如果矩阵乘法利用所有内核,那就太好了,因为在这种情况下,CPU显然是瓶颈。
倍频程能否充分利用多核处理器并在多个线程上运行?是否为此提供了库或编译时间标志?
解
Octave本身是在一个内核上运行的单线程应用程序。您可以使用倍频程来使用ATLAS之类的使用多个内核的库。因此,虽然八度仅使用一个内核,但是当您遇到繁重的操作时,八度会调用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");
使用多个处理器的矩阵乘法运算要快得多,比使用单核处理器快三倍:
Without Atlas: Elapsed time is 3.22819 seconds. With Atlas: Elapsed time is 0.529 seconds.
这三个库我使用的加快东西是 blas-atlas, cblas-atlas, lapack-atlas。
blas-atlas
cblas-atlas
lapack-atlas
如果octave可以使用这些代替默认的blas和lapack库,那么它将利用多核。
用ATLAS从源代码编译要获得倍频程并不容易,并且需要一些编程技巧。
使用Atlas的方法:
该Atlas软件使用大量的开销将八度音程程序拆分为多个线程。如果您要做的只是巨大的矩阵乘法,那么它肯定会快得多,但是大多数命令不能由Atlas进行多线程处理。如果从内核中提取处理能力/速度的每一点都是头等大事,那么您只需编写要与自身并行运行的程序,就会有更好的运气。(将您的程序拆分为8个等效程序,这些程序可以解决问题的1/8,并同时运行它们,完成后重新组合结果)。
Atlas帮助单线程八度音程程序的行为更像多线程应用程序,但这不是万灵丹。Atlas不会使您的单线程Octave程序最大化您的2,4,6,8核心处理器。您会注意到性能有所提高,但是这种提高将使您寻找使用所有处理器的更好方法。答案是编写程序使其与自身并行运行,这需要很多编程技巧。
建议
将精力投入向量化最繁重的操作,并将进程分配到n个同时运行的线程上。如果您等待一个进程运行的时间太长,则最有可能加快进程发展的最低悬念是使用更高效的算法或数据结构。