Matlab Transparency violation error while the code is correct

1 次查看(过去 30 天)
I have a problem with a code i wrote, The whole code consist 6 for-loops and every itteration took forever to complete so I tried it with a parfor.
every itteration is independent but I need to save the result from each one, so it supposed to save the results in vector 'v', and export it to a function that supposed to save a matrix with the vector 'v' in its place.
The code is correct and it runs, but it doesn't save the matrix.
The code is:
parfor j = 1 : endrun
**other 5 fors * *
5 ends
v(1)=a;
...
v(10)=k;
mySave('ResMat.mat', v , j);
end
function mySave(filenm, v, j)
ResMat( j, :) = v;
save(filenm, 'ResMat', '-mat');
end
Will be grateful for help, and if you have other way to do that or maybe a way to make it much efficient, every tip will be great.
Thank you
  2 个评论
Raymond Norris
Raymond Norris 2022-4-5
Can you elaborate more when you say it doesn't save?
  • Does MATLAB error out?
  • Does the file get created, but it doesn't contain the variable?
  • Does it contain the variable but the variable doesn't contain the entire value?
mySave overwrites ResMat each time you call it, so I don't see ResMat getting updated properly. Plus, what happens when two workers try writing to the same MAT-file (ResMat.mat) at the same time?
Eli Zatulovski
Eli Zatulovski 2022-4-10
No, the matlab doesn't error out, it runs smoothly, and if I pause the proccess, it stops inside the parfor loop so i can't see any variables in the workspace.
I see now the problem of the overwriting each time, Can you help me solve it please?
I need the program to run on each itteration on the parfor loop, store some data, and then to export the results from each itteration into a matrix, how can I do that? It's my first time programing a program using workers and I do not find any way to store my results online.
Thank you for helping

请先登录,再进行评论。

回答(1 个)

Dheeraj
Dheeraj 2024-1-8
Hi,
I understand that you are not getting expected results while using “parforfrom Parallel Computing Toolbox.
When using parfor in MATLAB, it's important to note that each iteration of the loop runs independently on a separate worker, and therefore, you need to be careful about updating shared variables. In your case, the variable ResMat is being updated independently by each worker, leading to potential race conditions and overwriting.
To address this issue, you can use spmd (Single Program Multiple Data) to accumulate results from each worker and then save the final result after the parallel loop or alternatively you could use temporary variable to save results from each loop and after the loop completion combine all results and store them in ResMat.
The below code demonstrates one way of doing it.
% Preallocate ResMat outside the parfor loop
% Adjust the size based on your actual data size
ResMat = zeros(endrun, 10);
parfor j = 1:endrun
% Your code here
v(1) = a;
% ...
v(10) = k;
% Save results to a temporary variable for each iteration
tempResMat(j, :) = v;
end
% Consolidate the results from all workers
ResMat = tempResMat;
% Save the final matrix outside the parfor loop
save('ResMat.mat', 'ResMat', '-mat');
You could refer to the below MATLAB’s documentation to know more about “spmd
Hope this helps!

类别

Help CenterFile Exchange 中查找有关 Parallel for-Loops (parfor) 的更多信息

产品


版本

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by