【问题标题】:How to use parallel 'for' loop in Octave or Scilab?如何在 Octave 或 Scilab 中使用并行“for”循环?
【发布时间】:2019-04-03 23:02:51
【问题描述】:

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

我没有分布式计算许可证。请帮助我如何使用 Octave 或 Scilab 进行操作。我只想并行化'for'循环。

我在 google 中搜索时给出了一些损坏的链接。

【问题讨论】:

  • 几年前我使用 Octave 时,并行处理不起作用。但是我可以很容易地从 Python 多处理代码开始新的八度进程。至少在 Linux octave 上,启动开销比 Matlab 低得多。

标签: matlab parallel-processing octave scilab


【解决方案1】:

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

parallel 包的pararrayfun 和parcellfun 函数在多核机器上很方便。 它们通常可以很好地替代 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 中不再适用于任何操作系统。
    【解决方案3】:

    在 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 从 octave 3.8.1 开始, parfor 关键字仅被识别,没有任何实际的并行化。我的答案中有更多详细信息
    【解决方案4】:
    1. 要查看 MATLAB-SIMULINK 的免费和开源替代品列表,请查看 its Alternativeto page 或 my 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 是矢量化或并行的,具体取决于 Scilab 的平台、硬件和版本。

    【讨论】:

    • Foad,你错了:在支持它的 Scilab 版本(即 5.5.2)并以稳定的方式完全实现它(即 Linux)parallel_run 确实 true 基于子进程(不是线程)的并行计算(不仅仅是向量化)。
    • @StéphaneMottelet 感谢您的更正。我删除了那部分。请帮助我了解它是如何工作的。 parallel_run 是否使用 OpenMP 或 MPI 进行并行化?我上面的定义正确吗?
    • Scilab 5.5.2 parallel_run 使用 OpenMP。
    • @StéphaneMottelet 那么这仅适用于 Scilab 5.5.2 且仅适用于 Linux 吗?是否有移植到其他平台(Windows 和 macOS)以及最新版本的计划?
    • 您的句子“Scilab 上的矩阵运算都是矢量化计算”并不完全准确。在 OSX(Accelerate 框架或 6.0.2 中的 Intel MKL)和 Windows (MKL) 中,3 级 BLAS 使用处理器的所有可用内核,因此我们可以说 Scilab 上的矩阵运算是并行的或根据平台进行矢量化。
    猜你喜欢
    • 2017-06-14
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多