Многие встроенные типы данных и структуры данных, поддерживаемые программным обеспечением MATLAB ®, также поддерживаются в среде параллельных вычислений MATLAB. Сюда входят массивы любого числа измерений, содержащие числовые, символьные, логические значения, ячейки или структуры. В дополнение к этим базовым компоновочным блокам параллельная вычислительная среда MATLAB также предлагает массивы различных типов.
При создании нераспределенного массива MATLAB создает отдельный массив в рабочей области каждого работника, используя одинаковое имя переменной для всех работников. Любая операция, выполняемая с этой переменной, влияет на все назначенные ей отдельные массивы. При отображении из worker 1 значения, назначенного этой переменной, все работники отвечают, показывая массив этого имени, который находится в их рабочей области.
Состояние нераспределенного массива зависит от значения этого массива в рабочей области каждого работника:
Реплицированный массив находится в рабочих областях всех работников, а его размер и содержимое идентичны для всех работников. При создании массива MATLAB назначает его одной и той же переменной для всех работников. При отображении в spmd значения, назначенного этой переменной, все работники отвечают, показывая один и тот же массив.
spmd, A = magic(3), end
WORKER 1 WORKER 2 WORKER 3 WORKER 4
| | |
8 1 6 | 8 1 6 | 8 1 6 | 8 1 6
3 5 7 | 3 5 7 | 3 5 7 | 3 5 7
4 9 2 | 4 9 2 | 4 9 2 | 4 9 2Массив вариантов также находится в рабочих областях всех работников, но его содержимое различается для одного или нескольких работников. При создании массива MATLAB присваивает разные значения одной и той же переменной для всех работников. Если отображается значение, назначенное этой переменной, все работники отвечают, показывая свою версию массива.
spmd, A = magic(3) + labindex - 1, end
WORKER 1 WORKER 2 WORKER 3 WORKER 4
| | |
8 1 6 | 9 2 7 | 10 3 8 | 11 4 9
3 5 7 | 4 6 9 | 5 7 9 | 6 8 10
4 9 2 | 5 10 3 | 6 11 4 | 7 12 5Реплицированный массив может стать массивом вариантов, когда его значение становится уникальным для каждого работника.
spmd
B = magic(3); %replicated on all workers
B = B + labindex; %now a variant array, different on each worker
endЧастный массив определен для одного или нескольких, но не для всех работников. Этот массив можно создать с помощью labindex в условном операторе, как показано ниже:
spmd
if labindex >= 3, A = magic(3) + labindex - 1, end
end
WORKER 1 WORKER 2 WORKER 3 WORKER 4
| | |
A is | A is | 10 3 8 | 11 4 9
undefined | undefined | 5 7 9 | 6 8 10
| 6 11 4 | 7 12 5При использовании реплицированных и исполнительных массивов полное содержимое массива сохраняется в рабочей области каждого работника. С другой стороны, распределенные массивы разделяются на сегменты, причем каждый сегмент находится в рабочей области другого работника. Каждый работник имеет собственный сегмент массива для работы. Уменьшение размера массива, который каждый работник должен хранить и обрабатывать, означает более эффективное использование памяти и более быструю обработку, особенно для больших наборов данных.
В этом примере распределяется реплицированный массив 3 на 10 A через четырех рабочих. Результирующий массив D также имеет размер 3 на 10, но только сегмент полного массива находится на каждом работнике.
spmd
A = [11:20; 21:30; 31:40];
D = codistributed(A);
getLocalPart(D)
end
WORKER 1 WORKER 2 WORKER 3 WORKER 4
| | |
11 12 13 | 14 15 16 | 17 18 | 19 20
21 22 23 | 24 25 26 | 27 28 | 29 30
31 32 33 | 34 35 36 | 37 38 | 39 40Дополнительные сведения об использовании распределенных по кодам массивов см. в разделе Работа с распределенными по кодам массивами.