【问题标题】:Parallelize program并行化程序
【发布时间】:2013-01-19 19:16:56
【问题描述】:

我有几个.m 文件的程序组合。程序运行调用其中一个(主)名为tests.m,然后从那里我调用另一个optFun.m 计算不同的参数。这些参数在 while 循环内计算,当它们的值多次没有变化时(例如 4500)结束。 该程序运行良好,但我必须执行 200 次才能获得 200 组不同的值。此外,我可以使用具有>12 个内核的计算机,因此我对包含parfor 语句的主要.m 文件进行了一些更改,以部署12 个matlab 工作人员。我的目标是在一轮中获得 12 种不同的解决方案(初始程序的执行)。

function [] = tests(Num)
matlabpool open local 12;  
y = zeros(itermax,15);  
z = zeros(itermax,9);
parfor i = 1:itermax   
    [iternum tTot SolOpt ImpCostMAX minABFmax ABFmax ImportCosteABS] =...
             optFun(N, K, AntNum,...  
                    q, eps, Rt, Rs, theta, maxiter,...
                    strcat(particad,num2str(i)));   
     y(i,:) = [ i; iternum; tTot; SolOpt; ImpCostMAX(1); ImpCostMAX(2);...
                q; eps; N; K; AntNum; maxiter;...
                SolOpt/ImpCostMAX(1); SolOpt/ImpCostMAX(2); SolOpt/N];  
     z(i,:) = [ i; minABFmax(1); minABFmax(2); minABFmax(3); ABFmax(1);...
                ABFmax(2); ABFmax(3);...
                ImportCosteABS(1); ImportCosteABS(2)];   
end %parfor

matlabpool close;  
dlmwrite(nombre, y, 'delimiter', ' ','precision', '%9.5f');  
dlmwrite(b, z, 'delimiter', ' ','precision', '%9.5f');

我已经运行了 matlab 的 12 名工作人员,但现在程序似乎在达到最佳或正确结果之前就停止了。似乎我的程序的参数解决方案是在达到 while 循环的 4500 次迭代之前输出的。 虽然我获得了 12 种不同的解决方案,但似乎 12 名工作人员共享一些变量的值,因此当其他工作人员对解决方案进行了足够改进或其中几个人的总和被认为是正确的解决方案时,他们就会停止。 你能帮我理解发生了什么吗?

非常感谢您提前 问候

【问题讨论】:

  • 您可能希望提供代码示例而不是描述代码
  • 你能确定意外的行为真的发生了吗?因此,取其中一种输入/输出组合并单独运行它,看看它真的不同。
  • 感谢您的回答。我已经单独运行了它,我意识到出了点问题。我可以使用普通的 for 循环进行测试。该程序需要一些时间来获得解决方案。谢谢问候。

标签: matlab parallel-processing parfor


【解决方案1】:

我过去也遇到过类似的问题。您确定 for 循环的“独立”评估不会通过它们都使用的公共变量交换有关解决方案收敛性的信息吗?比如说,您在 parfor 之外定义了一个 convergence=zeros(1);,然后让 optFun.m 的所有后续调用使用相同的变量。这也可能适用于在数组中存储中间值的函数。

虽然我不能说这是否确实是您的问题(没有代码示例),但它可能只是。在这种情况下,我建议为每个评估创建一个独立的容器(例如,zeros(NoEvals,NoThingsToStore) 矩阵,它们将在其中独立保存数据)。

【讨论】:

  • 嗨,Artur,我怀疑你是对的。我现在看不到共享变量是什么,但我会做一些测试。函数“tests.m”只设置一些参数并调用 optFun.m。并且它们返回的值保存在 z() 和 y() 数组中,每个 worker 排成一行。
猜你喜欢
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2010-11-12
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2019-06-27
相关资源
最近更新 更多