Почему время работы 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);
Другие вопросы по тегам