【问题标题】:How to run a MATLAB script multiple times in parallel如何并行多次运行 MATLAB 脚本
【发布时间】:2017-01-07 19:43:48
【问题描述】:

我有一个 matlab 脚本(称为MyProcessing.m),它根据一些随机数进行一些计算。现在我有一个固定的种子来获得相同的随机数序列。我想并行运行此脚本多次,以利用系统上可用的多个内核。我希望每个新的“流程”都以不同的(但暂时固定的)种子开始。 Bellow 是现在的处理文件。

脚本中有一个 for 循环,但我不能使用 parfor,因为每次迭代都依赖于前一次。

MyProcessing.m

rng(1);
A = rand(5,5);
x =[];
y = []

% for loop
%   that updates x and y when necessary
% end for

figure(1);
scatter(x, y);
savefig(filename);

我可以访问 MATLAB 中的并行计算工具箱,但我想不出我应该做什么。我相信我必须编写另一个脚本来调用具有不同随机种子的处理脚本,但我还希望并行运行不同的进程,以便我可以运行许多实验。

编辑:

我想要类似的东西

for i = 1:numberOfParallelProcesses
  startANewRunOfTheScript();
end

for 循环在哪里启动进程,然后它不等待,而是继续启动下一个。

【问题讨论】:

  • parfeval?在脚本之前只喜欢函数。为简单起见,请务必避免共享数据。我不确定是否可以进行并行化,因为您有内部依赖关系,但是由于您将这些信息分类为无关紧要,我不能说。
  • 每个for 循环迭代都依赖于上一次迭代。但是整个算法独立于在相同数据上运行相同算法的另一个脚本。你的建议可能会奏效。我将了解如何使用 parfeval。
  • 或许这可以作为灵感:stackoverflow.com/questions/18204663/…

标签: matlab random parallel-processing matlabpool


【解决方案1】:

您可以使用batch 来实现此目的。你可以这样做:

for idx = 1:n
  job(idx) = batch('MyProcessing');
end

然后您可以稍后使用job 的每个元素的load 方法获取结果:

for idx = 1:n
  wait(job(idx)); % wait for results to arrive
  out{idx} = load(job(idx));
end

关于批处理in the doc 的更多信息。

【讨论】:

  • 我曾经使用过这种同时运行多个脚本的方法,但问题是它有点慢。我知道盯着不同的处理需要一些时间,而且它们的执行似乎更慢。例如,我有很多可用的内核,我启动了 12 个进程。并行执行它们的时间似乎与顺序执行它们相当。有没有可能我做错了什么?
  • 并行计算工具箱工作人员在“单计算线程”模式下运行(默认情况下 - 您可以通过在脚本中调用 maxNumCompThreads 来更改此设置),因此如果您的脚本能够运行,它们可以运行得更慢利用 MATLAB 的内在多线程。如果您的脚本已经通过多线程充分利用了所有 CPU 资源,那么使用 batch 或类似的显式并行只会让事情变慢。
【解决方案2】:

对于 matlab 中的Embarrassingly parallel 问题,到目前为止,最简单的解决方案是启动多个 matlab 实例并在每个实例上运行脚本(显然在开始每个实例时向前迭代随机种子)。过去,我曾在 40 核服务器上使用过这种简单的技术,效果非常好。唯一的限制是您的系统内存。通过一些试验和错误来找出获得最大吞吐量所需的实例数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2015-09-06
    • 2013-12-12
    相关资源
    最近更新 更多