我已经找到了加速我的MATLAB代码的一些很棒的方法:vectorizing,arrayfun,基本上只是摆脱for循环(不使用parfor)。我想把它带到下一步。
假设我有2个计算密集型的函数调用。
x = fun(a);
y = fun(b);
它们是完全独立的,我想并行运行它们而不是串行运行它们。我没有并行处理工具箱。任何帮助表示赞赏。
感谢
答案 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较少讨论的功能是job
和task
的系统,对于两个完全独立的函数调用的简单情况,这可能是最合适的解决方案。 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进程。