Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 让GNU倍频程与多核处理器一起工作。(多线程)_Linux_Multithreading_Multicore_Octave - Fatal编程技术网

Linux 让GNU倍频程与多核处理器一起工作。(多线程)

Linux 让GNU倍频程与多核处理器一起工作。(多线程),linux,multithreading,multicore,octave,Linux,Multithreading,Multicore,Octave,我希望能够用GNUOctave编程多个线程,这样它将利用多个处理器 我在Fedora 17 Linux上安装了GNU Octave,并执行了以下操作: yum install octave 在我的电脑上安装了最新版本的octave 3.6.2。它工作得很好,但是当你将两个巨大的矩阵相乘时,它会使倍频程使用的一个CPU陷入困境。如果矩阵乘法利用了所有的核,那就太好了,因为在这种情况下,CPU显然是瓶颈 octave能否充分利用多核处理器并在多线程上运行?是否有用于此的库或编译时标志?解决方案 O

我希望能够用GNUOctave编程多个线程,这样它将利用多个处理器

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

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


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

解决方案

Octave本身是在一个内核上运行的单线程应用程序。您可以使用一些库(如ATLAS)获得倍频程,这些库使用多核。所以,虽然Octave只使用一个内核,但当您遇到繁重的操作时,Octave会调用ATLAS中使用许多CPU的函数

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

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

我使用了以下两个链接:

我在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.
使用多个处理器时,矩阵乘法速度要快得多,比使用单核时快3倍:

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地图集
cblas地图集
lapack地图集

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

要从ATLAS的源代码中编译octave并不容易,需要一些编程技巧

回到使用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.
此Atlas软件使用大量开销将倍频程程序拆分为多个线程。当然,如果您所做的只是大量的矩阵乘法,那么速度会快得多,但是atlas无法实现大多数命令的多线程。如果从内核中提取出每一点处理能力/速度是最优先的,那么编写与自身并行运行的程序就会有更好的运气。(将您的程序拆分为8个等效程序,这些程序处理问题的1/8,并同时运行所有程序,完成所有操作后,重新组合结果)

Atlas帮助单线程倍频程程序更像一个多线程应用程序,但它不是万能的。Atlas不会让你的单线程倍频程程序超过你的2、4、6、8核处理器。您会注意到性能的提升,但这种提升会让您寻找更好的方式来使用所有处理器。答案是编写与自身并行运行的程序,这需要很多编程技巧

建议

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

上有两个处理并行计算的软件包:


还可以使用
fork()
函数生成子流程。

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

我使用的是带有community/和aur/软件包的Arch Linux。安装它们中的每一个都切换了八度音阶中使用的默认音阶

这里有一个比较这些库的不错的基准测试:

与Eric的答案类似,您可以使用Intel的数学内核库编译Octave,使其使用多线程。MKL免费用于非商业用途。对于“在单独的线程中分割程序”的方法,优化的BLAS仍然是可取的,但是是单线程的。像这样。然后参见中的示例