在MATLAB上并行编程,同时执行3个不同的功能

时间:2011-06-06 06:23:16

标签: function matlab parallel-processing

我正在编写一个分子动力学代码,需要使用3个函数计算3种不同类型的力,即Compute2BodyForce,Compute3BodyForce和ComputeOtherForce。由于这些函数是相互独立的,我想在3个不同的内核上分别计算每个函数,这样做的正确方法如下:

funList = {@Compute2BodyForce,@Compute3BodyForce,@ComputeOtherForce};

dataList = {data1,data2,data3}; %# or pass file names 

parfor i=1:length(funList)

    %# call the function

    funList{i}(dataList{i});

end

其次,如何巩固结果并将它们加在一起,即得到TotalForce = 2BodyForce + 3BodyForce + OtherForce?

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。但是,据我所知,你不能在parfor中使用匿名函数(如果我错了,或者只在早期版本中这是真的,我的道歉)。此外,您还需要一行打开matlab池,并告知工作节点您打算在并行部分中使用的内容。这是我开始解决这个问题的方法:

fileDep = {'Compute2BodyForce',...
'Compute3BodyForce',...
'ComputeOtherForce'};     

num_procs = 3;

matlabpool('open','Mycluster',num_procs,'FileDependencies',fileDep);

parfor iter = 1:3

% iter is passed to the functions so the functions can return NaNs when we don't want computation done
   body_2_dummy{iter} = Compute2BodyForce(data,iter); %assuming data is a variable here, maybe a struct that gets parsed inside the functions

   body_3_dummy{iter} = Compute3BodyForce(data,iter);

   other_dummy{iter} = ComputeOtherForce(data,iter);

end

% resolve and sum up here

total_force = body_2_dummy{1} + body_3_dummy{2} + other_dummy{3};

请注意,除了body_2_dummy {1},body_3_dummy {2}和other_dummy {3}之外,这些函数的值应该返回NaN。这在Matlab中遇到了令人沮丧的事情。大多数语言编写代码的典型方法如下:

parfor iter = 1:3
   if iter == 1
      body_2_dummy = Compute2Body(data);
   end
% more ifs for the other forces
end

我们有责任确保body_2_dummy具有明确的价值。但是在Matlab中,这个责任属于解释器,它不允许这样做,因为它认为body_2_dummy取决于执行的顺序。

我希望这会让你走上正确的道路。如果有任何其他问题,请随时回来。

此外,作为一般性建议,通常要简化功能并尝试降低成本,而不是并行化功能。你有没有花时间在Matlab Profiler中使用force函数?

- 安德鲁

后续编辑:

匿名函数就是你这样做的时候:

spam = @(x) x + 2;

spam(2)

   ans = 4

这里,垃圾邮件是一种匿名功能。您可以通过传递函数句柄@spam。

将函数传递给另一个函数

我在并行计算工具箱方面的经验主要与Sbiotoolbox结合使用。在这个工具箱中,生物模型是对象,可以通过句柄引用以基于旧版本的Matlab手柄图形的方式传递。但问题是句柄与模型分离,并发生一系列相当混乱的错误。因此,在使用Matlab的并行功能时,我会避免使用句柄进行所有引用。

但我必须承认,我没有测试过匿名函数是否可用,因为有一些关于本地和远程Matlab工作者的进一步细节给出了严格的答案。目前我无法轻松访问远程Matlab集群,因此必须将其放在项目列表中。

Matlab分析器是Matlab附带的工具。它允许您输入一个函数并测量每行代码所花费的时间,以便您可以突出显示需要重新构建代码以加快速度。它特别擅长发现错误,比如数组在循环中改变大小,从而消耗掉Matlab的性能。

我建议您在Matlab帮助中搜索“profiler”。文档非常好,比我可以放在这里的任何内容都要完整。

祝你好运。