我在Matlab代码中运行了两个for循环。内部循环使用Matlabpool在12个处理器中进行并行化(这是Matlab在单个机器中允许的最大值)。
我没有分布式计算许可证。请帮我使用Octave或Scilab如何做到这一点。我只想将'for'循环并行化。
我在google搜索时发现了一些断开的链接。
答案 0 :(得分:10)
parfor
尚未在八度音程中实现。该关键字已被接受,但仅仅是for
(http://octave.1599824.n4.nabble.com/Parfor-td4630575.html)的同义词。
并行程序包的pararrayfun
和parcellfun
功能在多核计算机上很方便。
它们通常是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);
答案 2 :(得分:0)
在GNU Octave中,您可以使用parfor
构造:
parfor i=1:10
# do stuff that may run in parallel
endparfor
更多信息:help parfor
答案 3 :(得分:0)
要查看MATLAB-SIMULINK的免费和开放源代码替代列表,请检查its Alternativeto page或my answer here。专门针对SIMULINK替代方案,请参见this post。
您应该考虑的是向量化,并行,并发,异步和多线程计算之间的区别。无需过多讨论,矢量化编程是避免丑陋的for-loops
的一种方法。例如,Python上的map
函数和列表理解是矢量化计算。这是您编写代码的方式,而不一定是计算机如何处理的方式。并行计算主要用于GPU计算(数据并行),是使用GPU计算单元在大型阵列上运行大量算术时。还有任务并行性,主要是指在多个线程上处理任务,每个线程都由单独的CPU内核处理。并发或异步是当您只有一个计算单元时,但是它同时执行多个作业,而不会无条件地阻塞处理器。基本上就像是妈妈在做饭,打扫卫生,照顾孩子一样,但一次只做一份工作:)
鉴于以上描述,FOSS世界中的每一个都有很多。对于Scilab,请特别检查this page。有用于分布式计算的MPI接口(多台计算机上的多线程/并行性)。 OpenCL接口用于GPU /数据并行计算。用于多线程/任务并行的OpenMP接口。 feval
函数不是并行性,而是一种对常规函数进行矢量化的方法。根据Scilab的平台,硬件和版本,Scilab矩阵算术和parallel_run
是矢量化或并行的。