MATLAB中的简单并行执行

MATLAB中的简单并行执行,matlab,parallel-processing,Matlab,Parallel Processing,我已经想出了一些很棒的方法来加速我的MATLAB代码:矢量化、arrayfun,以及基本上不用parfor的for循环。我想把它带到下一步 假设我有两个计算密集型函数调用 x = fun(a); y = fun(b); 它们是完全独立的,我希望并行运行它们,而不是串行运行。我没有并行处理工具箱。感谢您的帮助 谢谢,如果我乐观的话,我想你会问我如何在Matlab中简单地进行并行处理。在这种情况下,答案是: 并行处理最容易用。这使您可以访问以下内容 我想你可以做到: parfor t = 1:2

我已经想出了一些很棒的方法来加速我的MATLAB代码:矢量化、arrayfun,以及基本上不用parfor的for循环。我想把它带到下一步

假设我有两个计算密集型函数调用

x = fun(a);
y = fun(b);
它们是完全独立的,我希望并行运行它们,而不是串行运行。我没有并行处理工具箱。感谢您的帮助


谢谢,如果我乐观的话,我想你会问我如何在Matlab中简单地进行并行处理。在这种情况下,答案是:

并行处理最容易用。这使您可以访问以下内容

我想你可以做到:

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

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

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

通常的示例包括,这可能是从MATLAB的并行计算工具箱PCT中获得并行性的最简单方法。parfeval函数非常简单,如中所示。PCT的一个不常被讨论的功能是作业和任务系统,对于两个完全独立的函数调用的简单情况,这可能是最合适的解决方案。扰流板:批处理命令有助于简化简单作业的创建,请参见本文底部

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

% 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};
这里的关键是在要创建的任务对象中作为要求值的函数myCarseFunction。如果您有可能需要结构容器的复杂输入/输出,这可能是您的乐趣或包装

请注意,对于单个任务,上面创建作业和任务,然后以提交开始的整个工作流可以通过批处理简化,如下所示:

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

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

arrayfun是否可以加速?我不这么认为。for循环通常更快。至于并行化,请参见matlabpool/parpool:注意,最好的加速通常不是通过加快计算速度来实现的,而是通过以正确的方式计算正确的事情来实现的。希望这能澄清一点……Luis,这更清楚一点吗?我很确定串行for循环比使用arrayfun(通常称为map)慢…@LuisMendo实际上在并行计算工具箱中有一个版本,它利用GPU执行分布式计算,因此,在驳回问题之前,最好先了解问题是否与之相关:我明白了-我没有并行处理工具箱:我收到一条警告,说MyCarseFunction不存在。@AhsanAli这是一个例子。假设您有一个名为MyCarSeFunction的函数,这就是您应该如何做的。请告诉我如何将此应用于我的代码:`parfor ii=1:1000 p{ii,1}=repmat[2 4 5;],500,1;%假设非常大的矩阵pp{ii,1}=p{ii,1}*2;对于jj=1:100p1{jj,1}=p{ii}*pp{ii};p2{jj}=p{ii}*pp{ii}*p1{jj};p3{jj}=p{ii}*pp{ii}*p1{jj}*p2{ii};数据=[ppii,:,p1{:,1},p2,p3;];数据标签=cellfun@x['label'num2strii],num2cell1:lengthpp+lengthp1+lengthp2+lengthp3','UniformOutput',false;结束`