Неразраспределенные и распределенные массивы

Введение

Многие встроенные типы данных и структуры данных, поддерживаемые MATLAB® программное обеспечение также поддерживается в параллельных вычислительных окружениях MATLAB. Это включает массивы любого количества размерностей, содержащих число, символ, логические значения, камеры или структуры. В дополнение к этим базовым базовым блокам окружение параллельных вычислений MATLAB также предлагает различные типы массивов.

Неразраспределенные массивы

Когда вы создаете неразраспределенный массив, MATLAB создает отдельный массив в рабочей области каждого работника, используя одно и то же имя переменной для всех работников. Любая операция, выполненная с этой переменной, влияет на все отдельные назначенные ей массивы. Если вы отображаете от работника 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

Для получения дополнительной информации об использовании codistributed arrays, смотрите Работа с Codistributed Arrays.