spmd running multiple times
4 views (last 30 days)
Show older comments
Akshay Joshi
on 8 Mar 2018
Commented: Walter Roberson
on 8 Mar 2018
I'm running 2 RBF networks with different spread constant values. I'm trying to use spmd to get both executed in concurrent fashion. Following is the code:
spread1=365;
spread2=575;
goal=0.0;
max_neurons=2500;
neuron_jump=500;
tic
spmd(2)
RB_SC_365=newrb(input_mat, targets, goal, spread1, max_neurons, neuron_jump);
RB_SC_575=newrb(input_mat, targets, goal, spread2, max_neurons, neuron_jump);
end
toc
Per my understanding of spmd, spmd(2) will take 2 worker threads from the pool, one will execute RB_SC_365 and other will execute RB_SC_575, and then the script will exit. However, the script is being executed twice.
Here is the output I'm getting:
Lab 1:
NEWRB, neurons = 0, MSE = 0.16
Lab 2:
NEWRB, neurons = 0, MSE = 0.16
NEWRB, neurons = 500, MSE = 1.14309e-28
Lab 1:
NEWRB, neurons = 500, MSE = 1.14309e-28
Lab 2:
NEWRB, neurons = 0, MSE = 0.16
Lab 1:
NEWRB, neurons = 0, MSE = 0.16
Lab 2:
NEWRB, neurons = 500, MSE = 5.26541e-29
Lab 1:
NEWRB, neurons = 500, MSE = 5.26541e-29
As can be seen above, the script has executed twice. The output that I expect is:
Lab 1:
NEWRB, neurons = 0, MSE = 0.16
Lab 2:
NEWRB, neurons = 0, MSE = 0.16
NEWRB, neurons = 500, MSE = 1.14309e-28
Lab 1:
NEWRB, neurons = 500, MSE = 1.14309e-28
Is there some way to execute the script only once with spmd?
0 Comments
Accepted Answer
Walter Roberson
on 8 Mar 2018
You wrote,
spmd(2)
RB_SC_365=newrb(input_mat, targets, goal, spread1, max_neurons, neuron_jump);
RB_SC_575=newrb(input_mat, targets, goal, spread2, max_neurons, neuron_jump);
end
"Per my understanding of spmd, spmd(2) will take 2 worker threads from the pool, one will execute RB_SC_365 and other will execute RB_SC_575"
No, that is not correct. All workers will execute what you have inside the spmd directive. You would need to do
spmd(2)
if labindex == 1
RB_SC_365=newrb(input_mat, targets, goal, spread1, max_neurons, neuron_jump);
else
RB_SC_575=newrb(input_mat, targets, goal, spread2, max_neurons, neuron_jump);
end
end
2 Comments
Walter Roberson
on 8 Mar 2018
Some people find it cleaner to use switch and case instead of if/elseif, but the functionality is the same.
With spmd(2) you will only ever have two labs, so labindex == 1 and labindex == 2 are the only possibilities; your second else will not be reached.
To emphasize:
for spmd, any statement that is not protected by a test against labindex will be executed by all of the labs. But that does not necessarily mean that they will all be working on the same data. For example,
spmd(10)
filename_in = sprintf('black_mantis_%03d.png', labindex);
filename_out = sprintf('blacker_mantis_%03d.png', labindex);
img = im2double(rgb2gray(imread(filename_in)));
new_img = img.^2;
imwrite(new_img, filename_out);
end
The same code is executed for all of the labs, but working with different files.
More Answers (0)
See Also
Categories
Find more on Define Shallow Neural Network Architectures in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!