Ошибка использования 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
до тех пор, пока они инкапсулированы в функции, но они все равно не будут работать параллельно, так что нет никакого смысла.