Parallel computing for images processing
8 次查看(过去 30 天)
显示 更早的评论
Good morning everyone, I've recently embarked on using the parallel computing toolbox and one problem I'd like to solve concerns a very basic scenario related to images processing. Suppose you have a directory where N different images, which can be distinguished by their name that is in the form of "imgX.jpg" where X is an increasing index, are stored. I want to create a pool of M workers that ought to perform some predefined operations over these images. In particular, the essential tasks that these workers are requested to accomplish are: 1. importing the i-th image 2. creating a filter by using the "fspecial" function 3. filtering the i-th image by employing the filter created at step 2 4. saving the processed image Of course, the list of the tasks may be further extended in the future, depending on what kind of operations are required. I wrote some code from scratch trying to employ a FSM-like structure and fit in with the SPMD model:
workers = Open_Pool(profile, numWorkers);
state = 1;
directory = 'Immagini_Esercizio2/';
list = dir([directory '*.jpg']);
images = cell(1, length(list));
indexImage = 1;
for i = 1 : length(images), images{i} = [directory, list(i).name];
end
spmd
pre = mod(labindex - 2 + numlabs, numlabs) + 1;
post = mod(labindex, numlabs) + 1;
while(indexImage <= length(images))
% fsm update
switch state
case 1
I = imread(images{indexImage});
labSend(I, post, 1);
state = 2;
case 2
H = fspecial('laplacian');
I = labReceive(pre, 1);
labSend(post, I, 1);
labSend(post, H, 2);
state = 3;
case 3
I = labReceive(pre, 1);
H = labReceive(pre, 2);
Out = imfilter(I, H);
results = Out
labSend(post, Out, 3);
state = 4;
case 4
Out = labReceive(pre, 3);
filename = sprintf('risultato%d.jpg', indexImage);
imwrite(Out, filename);
state = 1;
indexImage = indexImage + 1;
end
end
end
In the previous code, "Open_Pool" is a function I created to manage pools of workers (essentially, it allows the creation of M workers by using a specified profile). However, not surprisingly the execution of this code leads to deadlocks because I can't figure out how to enable a proper communication among all the workers. Instead, all the aforementioned steps must be executed orderly in a chain-like fashion.
2 个评论
Walter Roberson
2018-8-16
Please learn to use fullfile() instead of concatenating together parts of filenames.
Walter Roberson
2018-8-17
When the states only ever change in plain increments with wrapping back to the beginning after a fixed number, then it is hardly worth using a Finite State Machine approach.
Oh, there might be some point in doing a FSM-ish approach if you were doing pipelined HDL, or were doing real-time work in which the work was pretty well balanced between states. Might even be a point if you were using cooperative multitasking in which you had to deliberately give up control to give the CPU a chance to service mouse interactions or whatever. But not in this situation.
采纳的回答
Edric Ellis
2018-8-17
Rather than using labSend and labReceive inside an spmd block, I would suggest simply re-writing this as a parfor loop where each iteration of the loop loads one file, processes it, and then writes out the result.
5 个评论
shital shinde
2020-2-13
actually I also try to work with parallelization. I am currently working for digital image processing. Anybody please help me to parallelize the code. I attached the filefor watermarking that i want to make parallel in matlab. please help me for code
Walter Roberson
2020-2-13
When you posted your code in another question I replied back showing you exactly which for to change to parfor
更多回答(1 个)
另请参阅
类别
在 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!