2013-10-02 67 views
0

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

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

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

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

感谢

+0

'arrayfun'加速?我不这么认为。 'for'循环通常更快。至于并行化,请参阅'matlabpool' /'parpool':http://www.mathworks.es/es/help/distcomp/parpool.html –

+1

请注意,最好的加速通常不是通过更快地完成计算来实现的,而是通过(只)以正确的方式计算正确的事情。 –

+0

希望澄清一点点... – Chet

回答

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,但应该是最简单的。

+0

希望该编辑只是澄清... – Chet

+0

@Chet看到我的编辑 –

+0

我看到 - 我没有并行处理工具箱,虽然:( – Chet

4

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

0

通常的例子涉及parfor,这可能是从MATLAB的并行计算工具箱(PCT)中获得并行性的最简单方法。 parfeval功能非常简单,如this other post所示。 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}; 

这里的关键是给createTask作为任务对象创建评估功能的功能myCoarseFunction。这可以是你的fun或者一个包装器,如果你有复杂的输入/输出可能需要一个结构容器。

注意,对于单个任务,上面创建作业和任务,然后用submit开始他们的整个工作流程可以简化了batch如下:

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

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

+0

我得到'myCoarseFunction'的警告不存在 – 2014-05-27 21:52:34

+0

@AhsanAli这是一个例子,假设你有一个叫'myCoarseFunction'的函数,这是你应该怎么做的。 – chappjc

+0

请告诉我如何在代码中应用这个函数:'parfor ii = 1:1000 p {ii,1} = repmat ([2 4 5;],500,1);%假设非常大矩阵 pp {ii,1} = p {ii,1} * 2; 对于jj = 1:100 p1 {jj,1} = p {ii} * pp {ii}; p2 {jj} = p {ii} * pp {ii} * p1 {jj}; p3 {jj} = p {ii} * pp {ii} * p1 {jj } * p2 {ii}; 结束 数据(ii).data =( [pp(ii,:),p1 {:,1},p2,p3;])';数据(ii).label = cellfun(@(x)['label'num2str(ii)],num2cell(1:length(pp)+ length(p1)+ length(p2)+ length(p3))' 'UniformOutput',false); end' – 2014-05-27 23:45:49