Using symbolic subs call inside parfor loop

12 次查看(过去 30 天)
I have the following pieces of code where the symbolic expressions to be evaluated are quite heavy.
classdef T4
properties (SetAccess = private)
% symbolic properties
xe % vector of symbolic variables
ge % vector or matrix of symbolic expressions depending on xe
% numeric properties
se % numeric vector or matrix
Xe % numeric values to be assigned
end
methods
% all other methods
function T = computeG(T);
T.se = double(subs(T.ge,T.xe,T.Xe));
end
end
end
nT = 5;
Tv(nT,1) = T4;
for i=1:nT
Tv(i) = computeG(Tv(i));
end
I do not get any gain, in fact it is worse if I use instead
parfor i=1:nT
Tv(i) = computeG(Tv(i));
end
  3 个评论
Antonio Bilotta
Antonio Bilotta 2020-10-13
Thank you very much for your answer. I don't know how to check on this issue and how to allocate, if necessary, one MuPAD engine for each worker.
Walter Roberson
Walter Roberson 2020-10-14
My tests show that one mupad kernel process is allocated for each worker. (The kernels use a lot less memory than I might have guessed. They also have about 39 megabytes of shared memory; I am not sure what that is used for.)

请先登录,再进行评论。

回答(1 个)

Raymond Norris
Raymond Norris 2020-10-13
Hi Antonio,
You're just not giving each of the workers enough work to do. Maybe you only need to run nT=5, but see what happens when you set it to 100, 200, or 1000. You should then start to see improvements.
Thanks,
Raymond
  5 个评论
Walter Roberson
Walter Roberson 2020-10-14
My test showed that a separate mupad kernel is launched for each parfor worker, so there would be no need to rewrite the symbolic functions themselves: each worker gets its own (single-threaded) engine.
It is not possible to rewrite the internals of symbolic functions to use parfor / spmd, as the internals of symbolic functions live inside the MuPAD engine, either in the form of binary files are in the form of MuPAD code.
Antonio Bilotta
Antonio Bilotta 2020-10-14
Maybe the situation is not so plain. I am performing some tests with nT=40. In my code the for loop is called several times and in the case of the normal for I get the following times which change only the first time but then they remain quite stable
In the case of the parfor I get the following times which increase as analysis proceeds (I performed only 3 steps but usually more steps are required).
To be more precise the exact code is not so much different (the class function contains 2 "subs" calls).
function T = computeG(T);
T.se = double(subs(T.ge,T.xe,T.Xe)); % evaluation of a vector
T.Ke = double(subs(T.Je,T.xe,T.Xe)); % evaluation of a matrix
end

请先登录,再进行评论。

Community Treasure Hunt

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

Start Hunting!

Translated by