如何在Octave或Scilab中使用并行“for”循环?

8

我在Matlab代码中有两个for循环。内部循环使用Matlabpool在12个处理器上并行化(这是Matlab在单台计算机上允许的最大数量)。

我没有分布式计算许可证。请帮我解决如何使用Octave或Scilab完成它。我只想并行化'for'循环。

在我通过谷歌搜索时,发现了一些损坏的链接。


几年前我使用Octave时,并行处理并没有起作用,但是我可以很容易地从Python多进程代码中启动新的Octave进程。至少在Linux上,Octave比Matlab的启动开销要低得多。 - hpaulj
4个回答

14

parfor在Octave中尚未真正实现。该关键字被接受,但仅是for的同义词(http://octave.1599824.n4.nabble.com/Parfor-td4630575.html)。

并行软件包的pararrayfunparcellfun函数对于多核机器非常方便。 它们通常可以替代parfor循环。

有关示例,请参见http://wiki.octave.org/Parallel_package。 要安装,请发出以下命令(只需一次)

pkg install -forge parallel

然后,在每个会议上都是如此。

pkg load parallel

在使用这些函数之前


2
在Scilab中,你可以使用parallel_run命令进行并行计算:
function a=g(arg1)
  a=arg1*arg1
endfunction

res=parallel_run(1:10, g);

局限性

  • 在Windows平台上,仅使用一个核心。
  • 目前,parallel_run仅处理实值标量矩阵的参数和结果,并且不使用types参数。
  • 不应该依赖于诸如修改来自外部作用域的变量之类的副作用:只有存储在结果变量中的数据将被复制回调用环境。
  • 由parallel_run调用的宏不允许使用JVM。
  • 在调用parallel_run期间,不应进行堆栈调整(通过gstacksize()或stacksize())。

parallel_run()在Scilab 6.x中已不再提供,无论是哪个操作系统。 - S. Gougeon

0
在GNU Octave中,您可以使用parfor结构:
parfor i=1:10
    # do stuff that may run in parallel
endparfor

更多信息请参考:help parfor


Octave中是否实际上存在并行处理机制,还是只是识别parfor命令以与MATLAB兼容。在3.4版本中,Octave会因语法问题而反对使用parfor - hpaulj
4
从 octave 3.8.1 开始,parfor 关键字只是被识别,但并没有进行任何实际的并行化。更多细节请参见我的回答。 - ederag

0
查看MATLAB-SIMULINK的自由和开源替代品列表,请参阅其Alternativeto页面此处的答案。特别是有关SIMULINK替代方案请查看此帖子
你应该考虑的是向量化、并行、同时、异步和多线程计算之间的差异。简而言之,向量化编程是一种避免使用循环结构的方法。例如,Python中的map函数和列表推导式就是向量化计算。它是代码编写的方式,不一定是计算机处理的方式。并行计算主要用于GPU计算(数据并行),当你在大数组上运行大量算术运算时,使用GPU计算单元进行并行计算。还有任务并行性,它主要是指在多个线程上运行任务,每个线程由一个单独的CPU核心处理。并发或异步是指您只有一个计算单元,但它可以同时执行多个任务,而不会无条件地阻塞处理器。基本上就像一个妈妈同时做饭、打扫卫生和照顾孩子,但每次只做一项工作:)
考虑到上述描述,FOSS世界为每种类型都提供了很多选择。具体针对Scilab,请查看此页面。有分布式计算(在多台计算机上进行多线程/并行处理的MPI接口),用于GPU/数据并行计算的OpenCL接口,以及用于多线程/任务并行的OpenMP接口。feval函数不是并行处理,而是一种将传统函数向量化的方法。Scilab矩阵运算和parallel_run根据平台、硬件和Scilab版本等因素而向量化或并行化。

1
Foad,你错了:在支持它的Scilab版本(即5.5.2)中,并且以稳定的方式完全实现它(即Linux),parallel_run可以基于子进程(而不是线程)进行真正的并行计算(而不仅仅是向量化)。 - Stéphane Mottelet
@StéphaneMottelet 感谢您的纠正。我已经删除了那部分内容。请帮助我理解它是如何工作的。parallel_run 是使用 OpenMP 还是 MPI 进行并行化?我的上述定义是否正确? - Foad S. Farimani
1
Scilab 5.5.2的parallel_run使用OpenMP。 - Stéphane Mottelet
@StéphaneMottelet 这只针对Scilab 5.5.2和仅限于Linux吗?有计划移植到其他平台(Windows和macOS)以及最新版本吗? - Foad S. Farimani
1
你的句子“Scilab上的矩阵算术都是向量化计算”并不完全准确。在OSX(6.0.2中的Accelerate框架或Intel MKL)和Windows(MKL)中,级别3的BLAS使用处理器的所有可用核心,因此我们可以说Scilab上的矩阵算术在平台上是并行或向量化的。 - Stéphane Mottelet
@StéphaneMottelet已添加。如果我的帖子有任何缺陷,请随意进行编辑。其他要点:1.如果是MKL,则也与硬件相关?是否有计划用FLOSS和硬件无关的替代品来替换MKL?2.对于OpenCL或GPGPU,有什么计划吗? - Foad S. Farimani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接