- 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?
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
2022-4-5
Can you elaborate more when you say it doesn't save?
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?
回答(1 个)
Dheeraj
2024-1-8
Hi,
I understand that you are not getting expected results while using “parfor” from 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!
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Parallel for-Loops (parfor) 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!