当前位置: 首页 > 面试题库 >

使GNU Octave与多核处理器一起工作。(多线程)

王才英
2023-03-14
问题内容

我希望能够使用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-atlascblas-atlaslapack-atlas

如果octave可以使用这些代替默认的blas和lapack库,那么它将利用多核。

用ATLAS从源代码编译要获得倍频程并不容易,并且需要一些编程技巧。

使用Atlas的方法:

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

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

建议

将精力投入向量化最繁重的操作,并将进程分配到n个同时运行的线程上。如果您等待一个进程运行的时间太长,则最有可能加快进程发展的最低悬念是使用更高效的算法或数据结构。



 类似资料:
  • 问题内容: 我有两段代码用于学习Python 3.1中的多处理。我的目标是使用所有可用处理器中的100%。但是,此处的代码段在所有处理器上仅达到30%-50%。 无论如何,要“强制” python使用全部100%?操作系统(Windows 7、64位)是否限制了Python对处理器的访问?当下面的代码段运行时,我打开任务管理器并观察处理器的峰值,但从未达到并维持100%。除此之外,我还可以看到在此

  • 问题内容: 我只是想知道我们是否真的需要算法是多线程的,如果它必须利用多核处理器,或者jvm是否要利用多核处理器,即使我们的算法是顺序的? 问题答案: 我不相信任何当前的生产JVM实现都可以执行自动多线程。他们可能会使用其他核心进行垃圾回收和其他内部管理,但是如果您的代码是顺序表达的,则很难自动并行化它并仍然保留精确的语义。 有 可能 是一些实验/研究的JVM其中设法并行的代码的JIT可以当场为尴

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 问题内容: 我一直在阅读有关Python的多处理模块的信息。我仍然认为我对它可以做什么没有很好的了解。 假设我有一个四核处理器,并且我有一个包含1000000个整数的列表,我想要所有整数的总和。我可以简单地做: 但这仅将其发送到一个内核。 是否有可能使用多处理模块将数组划分为多个,并让每个核获得其部分的总和并返回值,以便可以计算总和? 就像是: 任何帮助,将不胜感激。 问题答案: 是的,可以对多个

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 问题内容: 在效率和代码清晰性方面,决定使用线程或多处理时应遵循哪些良好准则? 问题答案: 线程和多处理之间的许多差异并不是真正针对Python的,某些差异特定于某个Python实现。 对于CPython,在以下情况下,我都将使用该模块: 由于性能原因,我需要同时使用多个内核。使用线程时,全局解释器锁(GIL)将阻止任何加速。(无论如何,有时在这种情况下您都可以避免使用线程,例如,当主要工作是在通