我想出了一些加速我的 MATLAB 代码的很棒的方法:矢量化、arrayfun,并且基本上只是摆脱了 for 循环(不使用 parfor)。我想把它带到下一步。
假设我有 2 个计算密集型的函数调用。
x = fun(a);
y = fun(b);
它们是完全独立的,我想并行而不是串行运行它们。我没有并行处理工具箱。任何帮助表示赞赏。
谢谢
我想出了一些加速我的 MATLAB 代码的很棒的方法:矢量化、arrayfun,并且基本上只是摆脱了 for 循环(不使用 parfor)。我想把它带到下一步。
假设我有 2 个计算密集型的函数调用。
x = fun(a);
y = fun(b);
它们是完全独立的,我想并行而不是串行运行它们。我没有并行处理工具箱。任何帮助表示赞赏。
谢谢
MATLAB 解释器是单线程的,因此实现跨 MATLAB 函数的并行性的唯一方法是运行多个 MATLAB 实例。Parallel Computing Toolbox 会为您完成这项工作,并以 PARFOR/SPMD/PARFEVAL 等形式为您提供方便的界面。您可以手动运行多个 MATLAB 实例,但您可能需要做一些工作来组织工作你想要完成。
通常的示例包括parfor
,这可能是从 MATLAB 的并行计算工具箱 (PCT) 中获得并行性的最简单方法。该parfeval
功能非常简单,正如另一篇文章中所展示的那样。PCT 的一个较少讨论的功能是job
s 和task
s 的系统,对于两个完全独立的函数调用的简单情况,这可能是最合适的解决方案。剧透:该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};
这里的关键是作为要在要创建的任务对象中评估的函数而myCoarseFunction
赋予的函数。如果您有可能需要结构容器的复杂输入/输出,createTask
这可以是您的或包装器。fun
请注意,对于单个任务,上面创建作业和任务,然后启动它们的整个工作流程submit
可以简化batch
如下:
c = parcluster();
jobA = batch(c, @myCoarseFunction, 1, taskdataA,...
'Pool', c.NumWorkers / 2 - 1, 'CaptureDiary', true);
另外,请记住,与matlabpool
(现在称为parpool
)一样,使用parcluster
需要时间来启动将运行您的作业的 MATLAB.exe 进程。