spmd running multiple times
    3 次查看(过去 30 天)
  
       显示 更早的评论
    
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 个评论
采纳的回答
  Walter Roberson
      
      
 2018-3-8
        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 个评论
  Walter Roberson
      
      
 2018-3-8
				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.
更多回答(0 个)
另请参阅
类别
				在 Help Center 和 File Exchange 中查找有关 Deep Learning Toolbox 的更多信息
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

