我正在编写一个分子动力学代码,需要使用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?
答案 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”。文档非常好,比我可以放在这里的任何内容都要完整。
祝你好运。