Effacer les filtres
Effacer les filtres

Run parfor loop inside a function

12 vues (au cours des 30 derniers jours)
boureghda mohammed
boureghda mohammed le 27 Fév 2017
Réponse apportée : OCDER le 31 Août 2017
I am trying to parallelize my code (function dfdx presented below), but a warning message : ( The entire array or structure 'th','x' is a broadcast variable this might result in unnecessary communication overhead) appears under th(9) and x(5,i), I am confusing Why does it only under th(9) in df7dx7 and under x(5,i) in df8dx8.
the question : what is the origine of this warning, and how can I handle it.
function [Fx]=dfdx(x,th,gama,T0,a,StateDim,nCpts,dt)
Fx = zeros(StateDim,StateDim,nCpts);
parfor i=1:nCpts
df7dx7 = -x(7,i)^(1/a - 1)/(a*(th(9) + T0));
df8dx1 = (gama*(1/(exp(th(5)*(th(6) - x(1,i))) + 1) - 2))/(T0*(1/(exp(th(5)*(th(6) - 1)) + 1) - 2)*(gama + 1)) + (th(5)*gama*x(1,i)*exp(th(5)*(th(6) - x(1,i))))/(T0*(1/(exp(th(5)*(th(6) - 1)) + 1) - 2)*(exp(th(5)*(th(6) - x(1,i))) + 1)^2*(gama + 1));
df8dx5 = -(th(9)*x(8,i))/(T0*x(7,i)*(th(9) + T0));
df8dx7 = (x(8,i)*(th(9)*x(5,i) + T0*x(7,i)^(1/a)))/(T0*x(7,i)^2*(th(9) + T0)) - (x(7,i)^(1/a - 1)*x(8,i))/(a*x(7,i)*(th(9) + T0));
df8dx8 = -(th(9)*x(5,i) + T0*x(7,i)^(1/a))/(T0*x(7,i)*(th(9) + T0));
Fxi = [0 1 0 0 0 0 0 0;
-th(2)^2 -2*th(2) 0 0 0 0 0 0;
0 0 0 1 0 0 0 0;
0 0 -th(4)^2 -2*th(4) 0 0 0 0;
0 0 0 0 0 1 0 0;
0 0 0 0 -th(8)^2 -2*th(8) 0 0;
0 0 0 0 1/(th(9)+T0) 0 df7dx7 0;
df8dx1 0 1/(T0*(gama+1)) 0 df8dx5 0 df8dx7 df8dx8];
Fx(:,:,i) = eye(StateDim,StateDim) + dt*Fxi;
end

Réponses (1)

OCDER
OCDER le 31 Août 2017
The warning is just stating that the vector variables (th and x) will be copied to every worker for every iteration of the for loop. This could cause a lot of read/write delays, but is sometimes unavoidable like in your case. The editor doesn't know that x and th are actually small and easy to copy around, so it'll just throw a warning instead. To hide the warning, use temporary variables.
https://www.mathworks.com/help/distcomp/broadcast-variable.html
About why only certain th and x get the warning in the editor, the editor doesn't seem to mark all warnings at once - just the (first?) ones that it knows of.
Try this out:
function [Fx]=dfdx(x,th,gama,T0,a,StateDim,nCpts,dt)
Fx = zeros(StateDim,StateDim,nCpts);
parfor i=1:nCpts
TH = th; %Tells matlab that th is a real broadcast variable.
X = x; %Tells matlab that x is a real broadcast variable.
df7dx7 = -X(7,i)^(1/a - 1)/(a*(TH(9) + T0));
df8dx1 = (gama*(1/(exp(TH(5)*(TH(6) - X(1,i))) + 1) - 2))/(T0*(1/(exp(TH(5)*(TH(6) - 1)) + 1) - 2)*(gama + 1)) + (TH(5)*gama*X(1,i)*exp(TH(5)*(TH(6) - X(1,i))))/(T0*(1/(exp(TH(5)*(TH(6) - 1)) + 1) - 2)*(exp(TH(5)*(TH(6) - X(1,i))) + 1)^2*(gama + 1));
df8dx5 = -(TH(9)*X(8,i))/(T0*X(7,i)*(TH(9) + T0));
df8dx7 = (X(8,i)*(TH(9)*X(5,i) + T0*X(7,i)^(1/a)))/(T0*X(7,i)^2*(TH(9) + T0)) - (X(7,i)^(1/a - 1)*X(8,i))/(a*X(7,i)*(TH(9) + T0));
df8dx8 = -(TH(9)*X(5,i) + T0*X(7,i)^(1/a))/(T0*X(7,i)*(TH(9) + T0));
Fxi = [0 1 0 0 0 0 0 0;
-TH(2)^2 -2*TH(2) 0 0 0 0 0 0;
0 0 0 1 0 0 0 0;
0 0 -TH(4)^2 -2*TH(4) 0 0 0 0;
0 0 0 0 0 1 0 0;
0 0 0 0 -TH(8)^2 -2*TH(8) 0 0;
0 0 0 0 1/(TH(9)+T0) 0 df7dx7 0;
df8dx1 0 1/(T0*(gama+1)) 0 df8dx5 0 df8dx7 df8dx8];
Fx(:,:,i) = eye(StateDim,StateDim) + dt*Fxi;
end

Catégories

En savoir plus sur Parallel for-Loops (parfor) dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by