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