Ошибка использования parfor внутри блока spmd - matlab

Как я знаю о параллельном программировании в Matlab, мы можем точно указать, что делает рабочий; с помощью:

if labindex == x 
    %some computations
end

Также мы можем запустить for петли параллельно; с помощью:

parfor i1 = x:y
    %some computations
end

Я использую кластер с несколькими узлами, и каждый узел имеет 8 ядер.
Я хочу запустить 2 функции, каждая из которых содержит parfor цикл, и каждая функция выполняется работником, мой код выглядит примерно так:

spmd
    if labindex == 1
        alpha  = forward( some parameters );
    end
    if labindex == 2
        beta  = backward( some parameters );
    end
end

Я хотел, чтобы эти 2 функции выполнялись одновременно двумя разными узлами. но Matlab возвращает эту ошибку:

PARFOR or SPMD can not be used inside an SPMD block.

Почему это так? Любая идея?

1 ответ

Решение

Это покрыто parfor документация:

Тело parfor -петл не может содержать другой parfor -loop. Но он может вызвать функцию, которая содержит другую parfor -loop.

Однако, поскольку рабочий не может открыть параллельный пул, рабочий не может запустить внутреннее вложенное parfor петля параллельно. Это означает, что только один уровень вложен parfor -циклы могут работать параллельно. Если внешний цикл выполняется параллельно в параллельном пуле, внутренний цикл запускается последовательно для каждого рабочего. Если внешний цикл выполняется последовательно в клиенте (например, parfor указав ноль рабочих), функция, содержащая внутренний цикл, может выполнять внутренний цикл параллельно с рабочими в пуле.

То же самое верно для spmdзаявления:

Тело spmd утверждение не может содержать другое spmd, Тем не менее, он может вызвать функцию, которая содержит другую spmd заявление. Внутренний spmd Оператор не выполняется параллельно в другом параллельном пуле, но выполняется последовательно в одном потоке на работнике, выполняющем содержащую его функцию.

Похоже, что на самом деле вы можете иметь вложенные spmd / parfor до тех пор, пока они инкапсулированы в функции, но они все равно не будут работать параллельно, так что нет никакого смысла.

Другие вопросы по тегам