Unsure why parfor loop does not work in this case

Hello,
I am in the process of converting my initial multilogic module (Multilogic_v4.m) into a parallel version (MultiLogic_v1_parallel.m). I use two functions: my own MAPR function and I use the permn function. I am mostly done but I cannot get the last line of code in the main module to work and I am not sure why. My guess is that parfors may have some kind of limitation with concatenating strings?
I would appreciate if anyone can take a look at my code and tell me what I seem to be doing wrong.
FYI - I disabled the "while" loop in the parallel version for debugging.
Thanks to the community!
Dave

Answers (2)

N_New{h+1} = N{h+1}+1;
That is one update of N_New
N_New{h+1} = numel(SSet);
and that is a second update within the same parfor.
%while N_New{h+1} > N{h+1} && N_New{h+1} < MValU ^ (MValU ^ Arity)
Do not use N_New that way. Use a temporary variable and store the final results into N_New before the end of the parfor
The problematic variables appear to be both M and P. For M, you have multiple different "reads" from the variable after the initial assignment. Perhaps try
mVal = MAPR(MValU, Arity, OValU);
M{h+1} = mVal;
...
S{h+1} = mVal(:,j)'; % etc.
Likewise with P
pVal = permn(SSet,Arity);
P{h+1} = pVal;
...
V{h+1}{a,1} = dec2base(pVal(j,a),MValU,size(M{h+1},1));

3 Comments

Edric,
Thank you for your insights. I think it partially solved the issue. Unfortunately, the same line (Line 63) still errors out but now for a different reason.
Error using MultiLogic_v2_parallel>(parfor supply)
Reference to a cleared variable V.
Error in MultiLogic_v2_parallel (line 13)
parfor h=0:MValU^(MValU^Arity)-1
If I comment out line 63 then it runs and all variable, including V are not empty. I am certainly confused now.
Ah, with that updated code, you have a problem with V because there are two different indexing forms. You probably need the same trick again
vVal = dec2base(..);
V{h+1}{a,1} = vVal;
...
Q{h+1} = strcat(Q{h+1},vVal(k));
Do you mean like so (see bwlow). It is running now but it is not producing the correct output.
for j=1:size(P{h+1},1)
for a=1:Arity
vVal = dec2base(pVal(j,a),MValU,size(M{h+1},1));
V{h+1}{a,1} = vVal;
%V{h+1}{a,1} = dec2base(pVal(j,a),MValU,size(M{h+1},1));
end
Z{h+1} = '';
for k=1:size(M{h+1},1)
Q{h+1} = '';
for a=1:Arity
Q{h+1} = strcat(Q{h+1},vVal(k));
%Q{h+1} = strcat(Q{h+1},V{h+1}{a,1}(k)); % Does not like this one line
end
loc{h+1} = base2dec(Q{h+1},MValU) + 1;
Z{h+1} = strcat(Z{h+1},num2str(M{h+1}(loc{h+1},Arity+1)));
end
Z{h+1} = base2dec(Z{h+1},MValU);
SSet = [SSet, Z{h+1}];
SSet = unique(SSet);
N_New{h+1} = numel(SSet);
end

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Release

R2021a

Tags

Asked:

on 22 Aug 2022

Commented:

on 25 Aug 2022

Community Treasure Hunt

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

Start Hunting!