MATLAB中的简单并行执行

时间:2013-10-02 08:37:42

标签: matlab parallel-processing

我已经找到了加速我的MATLAB代码的一些很棒的方法:vectorizing,arrayfun,基本上只是摆脱for循环(不使用parfor)。我想把它带到下一步。

假设我有2个计算密集型的函数调用。

x = fun(a);
y = fun(b);

它们是完全独立的,我想并行运行它们而不是串行运行它们。我没有并行处理工具箱。任何帮助表示赞赏。

感谢

3 个答案:

答案 0 :(得分:4)

如果我乐观,我想你会问"我怎样才能在Matlab"中简单地进行并行处理。在这种情况下,答案是:

使用parallel computing toolbox可以轻松完成并行处理。这样您就可以访问parfor等内容。

我想你可以做到:

parfor t = 1:2
   if t == 1, x = fun(a); end
   if t == 2, y = fun(b); end
end

当然有other ways,但这应该是最简单的。

答案 1 :(得分:4)

MATLAB解释器是单线程的,因此实现MATLAB函数并行性的唯一方法是运行多个MATLAB实例。 Parallel Computing Toolbox为您完成此任务,并以PARFOR / SPMD / PARFEVAL等形式为您提供方便的界面。您可以手动运行多个MATLAB实例,但您可能需要做一些工作来组织工作你想要完成。

答案 2 :(得分:0)

通常的例子涉及parfor,这可能是从MATLAB的并行计算工具箱(PCT)中获得并行性的最简单方法。 parfeval功能非常简单,如this other post所示。 PCT较少讨论的功能是jobtask的系统,对于两个完全独立的函数调用的简单情况,这可能是最合适的解决方案。 Spoiler:batch命令可以帮助简化简单作业的创建(参见本文的底部)。

不幸的是,实施起来并不那么简单;为了完整起见,这是一个例子:

% Build a cluster from the default profile
c = parcluster();

% Create an independent job object
j = createJob(c);

% Use cells to pass inputs to the tasks
taskdataA = {field1varA,...};
taskdataB = {field1varB,...};

% Create the task with 2 outputs
nTaskOutputs = 2;
t = createTask(j, @myCoarseFunction, nTaskOutputs, {taskdataA, taskdataB});

% Start the job and wait for it to finish the tasks
submit(j); wait(j);

% Get the ouptuts from each task
taskoutput = get(t,'OutputArguments');

delete(j); % do not forget to remove the job or your APPDATA folder will fill up!

% Get the outputs
out1A = taskoutput{1}{1};
out1B = taskoutput{2}{1};

out2A = taskoutput{1}{2};
out2B = taskoutput{2}{2};

这里的关键是赋予createTask的函数myCoarseFunction作为在要创建的任务对象中进行评估的函数。如果您有可能需要结构容器的复杂输入/输出,这可以是您的fun或包装器。

请注意,对于单个任务,上面创建作业和任务的整个工作流程,然后使用submit启动它们可以简化为batch ,如下所示:< / p>

c = parcluster();
jobA = batch(c, @myCoarseFunction, 1, taskdataA,...
    'Pool', c.NumWorkers / 2 - 1, 'CaptureDiary', true);

此外,请记住,与matlabpool(现在称为parpool)一样,使用parcluster需要时间来启动将运行您的作业的MATLAB.exe进程。