并行化程序

时间:2013-01-19 19:16:56

标签: matlab parallel-processing parfor

我有几个.m文件的程序组合。该程序运行调用其中一个(主要)名为tests.m,并从那里调用另一个optFun.m,我计算不同的参数。这些参数在while循环内计算,当它们的值多次没有变化时(例如4500)完成。 该程序工作正常,但我必须执行200次以获得200个不同的值集。此外,我可以使用具有> 12个核心的计算机,因此我更改了一个主.m文件,包括parfor语句,以部署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名工作人员共享某些变量的值,因此当其他工作人员足够改进解决方案或者其中几个的总和被认为是正确的解决方案时,他们就会停止。 你能帮我理解发生了什么吗?

非常感谢您提前 此致

1 个答案:

答案 0 :(得分:0)

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

虽然我不能说这确实是你的问题(没有代码样本),但它可能就是这样。在这种情况下,我建议为每个评估创建一个独立的容器(例如,zeros(NoEvals,NoThingsToStore)矩阵,它们将保持数据彼此独立。)