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

问题描述 投票:7回答:4

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

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

当我在谷歌搜索它时,有一些断开的链接。

matlab parallel-processing octave scilab
4个回答
11
投票

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

在使用这些功能之前


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())

0
投票

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

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

欲了解更多信息:help parfor


0
投票
  1. 要查看MATLAB-SIMULINK的免费和开源替代品列表,请查看its Alternativeto pagemy answer here。特别是对于SIMULINK替代品,请参阅this post
  2. 你应该考虑的是矢量化,并行,并发,异步和多线程计算之间的区别。没有深入细节矢量化编程是一种避免丑陋for-loops的方法。例如,map函数和Python上的列表理解是矢量化计算。这是你编写代码的方式,而不是计算机处理代码的方式。并行计算主要用于GPU计算(数据并行),当你使用GPU计算单元在大数组上运行大量算术时。还有任务并行,主要是指在多个线程上执行任务,每个线程由一个单独的CPU核心处理。并发或异步是指您只有一个计算单元,但它同时执行多个作业,而无需无条件地阻塞处理器。基本上就像妈妈做饭和清洁,同时照顾孩子,但当时只做一份工作:)
  3. 鉴于以上描述,FOSS世界中的每一个都有很多。对于Scilab,请特别检查this page。有用于分布式计算的MPI接口(多台计算机上的多线程/并行)。用于GPU /数据并行计算的OpenCL接口。用于多线程/任务并行的OpenMP接口。 feval函数不是并行性,而是一种矢量化常规函数的方法。根据Scilab的平台,硬件和版本,仿真矩阵算法和parallel_run是矢量化或并行的。
© www.soinside.com 2019 - 2024. All rights reserved.