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

时间:2014-07-26 11:25:15

标签: matlab parallel-processing octave scilab

我在Matlab代码中运行了两个for循环。内部循环使用Matlabpool在12个处理器中进行并行化(这是Matlab在单个机器中允许的最大值)。

我没有分布式计算许可证。请帮我使用Octave或Scilab如何做到这一点。我只想将'for'循环并行化。

我在google搜索时发现了一些断开的链接。

4 个答案:

答案 0 :(得分:10)

parfor尚未在八度音程中实现。该关键字已被接受,但仅仅是forhttp://octave.1599824.n4.nabble.com/Parfor-td4630575.html)的同义词。

并行程序包的pararrayfunparcellfun功能在多核计算机上很方便。 它们通常是parfor循环的良好替代品。

例如,请参阅 http://wiki.octave.org/Parallel_package。 要安装,发行(只需一次)

pkg install -forge parallel

然后,每次会议一次

pkg load parallel

使用函数之前

答案 1 :(得分: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())

答案 2 :(得分:0)

在GNU Octave中,您可以使用parfor构造:

parfor i=1:10
    # do stuff that may run in parallel
endparfor

更多信息:help parfor

答案 3 :(得分:0)

  1. 要查看MATLAB-SIMULINK的免费和开放源代码替代列表,请检查its Alternativeto pagemy answer here。专门针对SIMULINK替代方案,请参见this post

  2. 您应该考虑的是向量化,并行,并发,异步和多线程计算之间的区别。无需过多讨论,矢量化编程是避免丑陋的for-loops的一种方法。例如,Python上的map函数和列表理解是矢量化计算。这是您编写代码的方式,而不一定是计算机如何处理的方式。并行计算主要用于GPU计算(数据并行),是使用GPU计算单元在大型阵列上运行大量算术时。还有任务并行性,主要是指在多个线程上处理任务,每个线程都由单独的CPU内核处理。并发或异步是当您只有一个计算单元时,但是它同时执行多个作业,而不会无条件地阻塞处理器。基本上就像是妈妈在做饭,打扫卫生,照顾孩子一样,但一次只做一份工作:)

  3. 鉴于以上描述,FOSS世界中的每一个都有很多。对于Scilab,请特别检查this page。有用于分布式计算的MPI接口(多台计算机上的多线程/并行性)。 OpenCL接口用于GPU /数据并行计算。用于多线程/任务并行的OpenMP接口。 feval函数不是并行性,而是一种对常规函数进行矢量化的方法。根据Scilab的平台,硬件和版本,Scilab矩阵算术和parallel_run是矢量化或并行的。