2017-01-14 1 views
0

Я использовал spmd для вычисления двух частей кода одновременно. Компьютер, который я использую, имеет процессор с 8 ядрами. Это означает, что накладные расходы на связь - это что-то вроде нуля!
Я сравниваю время работы этого блока spmd и того же кода за пределами spmd с tic & toc.
Когда я запускаю код, параллельная версия моего кода занимает больше времени, чем последовательная форма.
Любая идея, почему так?
Вот пример кода, что я говорю о:Почему время работы SPMD больше, чем последовательное - matlab

tic; 
spmd 
    if labindex == 1 
     gamma = (alpha*beta); 
    end 
    if labindex == 2 
     for t = 1:T, 
      for i1=1:n 
       for j1=1:n 
        kesi(i1,j1,t) = (alpha(i1,t) + phi(j1,t)); 
       end; 
      end; 
     end; 
    end 
end 
t_spmd = toc; 


tic; 
    gamma2= (alpha * beta); 
for t = 1:T, 
    for i1=1:n 
     for j1=1:n 
      kesi2(i1,j1,t) = (alpha(i1,t) + phi(j1,t)); 
     end; 
    end; 
end; 
t_seq = toc; 
disp('t spmd : ');disp(t_spmd); 
disp('t seq : ');disp(t_seq); 
+0

Может быть полезно «предварительно выделить» переменной 'kesi'? , например. 'kesi = zeros (size (...))' в строке 2 – Wouter

+0

Нет, я сделал это раньше, я просто не привел это здесь. –

ответ

1

Есть две причины здесь. Во-первых, ваше использование if labindex == 2 означает, что основной корпус блока spmd выполняется только одним рабочим - здесь нет параллелизма.

Во-вторых, важно помнить, что (по умолчанию) работники параллельного пула работают в режиме одиночных вычислительных потоков. Поэтому при использовании местных работников вы можете только ожидать ускорения, когда тело вашей параллельной конструкции не может быть неявно многопоточным с помощью MATLAB.

Наконец, в данном конкретном случае, вы гораздо лучше использовать bsxfun (или неявное расширение R2016b или более поздней версии), например так:

T  = 10; 
n  = 7; 
alpha = rand(n, T); 
phi  = rand(n, T); 
alpha_r = reshape(alpha, n, 1, T); 
phi_r = reshape(phi, 1, n, T); 
% In R2016b or later: 
kesi = alpha_r + phi_r; 
% In R2016a or earlier: 
kesi = bsxfun(@plus, alpha_r, phi_r); 
+0

Сэр, у вас есть официальная ссылка на эту часть вашего ответа? "(по умолчанию), работающие с параллельным пулом работают в режиме одиночного вычислительного потока, поэтому при использовании локальных рабочих можно ожидать только ускорения, когда тело вашей параллельной конструкции не может быть неявно многопоточным с помощью MATLAB." –

+0

Эта заметка о выпуске R2016b подразумевает ее http://www.mathworks.com/help/distcomp/release-notes.html#bvczl_g-1, но я не могу найти более конкретную ссылку на документ, которую я боюсь. Это определенно было с первого выпуска Parallel Computing Toolbox еще в 2005 году (или 2004). – Edric