0

我想出了一些加速我的 MATLAB 代码的很棒的方法:矢量化、arrayfun,并且基本上只是摆脱了 for 循环(不使用 parfor)。我想把它带到下一步。

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

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

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

谢谢

4

3 回答 3

4

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

使用并行计算工具箱可以最轻松地完成并行处理。这使您可以访问诸如parfor.

我想你可以这样做:

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

当然还有其他方法,但应该是最简单的。

于 2013-10-02T08:53:03.413 回答
4

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

于 2013-10-02T10:57:42.550 回答
0

通常的示例包括parfor,这可能是从 MATLAB 的并行计算工具箱 (PCT) 中获得并行性的最简单方法。该parfeval功能非常简单,正如另一篇文章中所展示的那样。PCT 的一个较少讨论的功能是jobs 和tasks 的系统,对于两个完全独立的函数调用的简单情况,这可能是最合适的解决方案。剧透:该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 进程。

于 2013-10-02T18:24:10.710 回答