Hi,
I have a question about the nested parfor loop. Please see the following codes:
clc
clear
parfor i=1:3
for j=1:3
if j<2
B(i,j)=j;
end
end
end
The result of this code should be B=[1;1;1], but the Matlab gives B=[1,1,1;1,1,1;1,1,1]. I have been confused by this problem for a long time and thank you in advance if you have some time to look into the problem.
Haonan

7 commentaires

Ive J
Ive J le 1 Jan 2021
Modifié(e) : Ive J le 1 Jan 2021
Well, you may wanna retry, because this is just impossible!
Walter Roberson
Walter Roberson le 1 Jan 2021
When I test, I get [1;1;1] as you expected.
haonan He
haonan He le 1 Jan 2021
Thanks for your answer. I have tried many times and via different versions of Matlab, including 2016b and 2019a, but the results are the same [1,1,1;1,1,1;1,1,1], which is not expected. I think it is the issue with parallel programming. Please see the following picture for the Matlab result. Thanks very much.
clc
clear
parfor i=1:3
for j=1:3
if j<2
B(i,j)=j;
end
end
end
B
B = 3×1
1 1 1
Ive J
Ive J le 2 Jan 2021
Modifié(e) : Ive J le 2 Jan 2021
Can you also check this?
B = (0);
parfor ii=1:3
for jj=1:3
if jj<2
B(ii,jj)=jj;
end
end
end
disp(size(B))
haonan He
haonan He le 2 Jan 2021
Thanks Rik. I reran the code on Matlab 2020b and the result was correct, but it was not as expected when I used old versions, e.g, 2016a 2019a. So maybe it is the bug of the old versions.
haonan He
haonan He le 2 Jan 2021
Thanks Ive. I think the problem may be caused by different versions. When I ran your code on old versions, there was a system error "Index beyond matrix dimension", but it is correct on the lateset version 2020b. So maybe it is the bug of the old versions.

Connectez-vous pour commenter.

 Réponse acceptée

Matt J
Matt J le 2 Jan 2021
Modifié(e) : Matt J le 2 Jan 2021
So maybe it is the bug of the old versions.
Yes, it appears to be version-related. I get the same thing in R2018a. Regardless, it is not good practice to use parfor to loop over sliced variables whose slices, in this case the B(i,:), are not allocated in advance. This cleaner version, for example, does not have the issue:
clc
clear
B=nan(3); %pre-allocate
parfor i=1:3
for j=1:3
if j<2
B(i,j)=j;
end
end
end

1 commentaire

haonan He
haonan He le 3 Jan 2021
Thanks Matt. Yes, the code does not generate the error.

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

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

Start Hunting!

Translated by