Разница между распределенными и нераспределенными массивами в MATLAB

Предположим, что у нас есть этот код в MATLAB:

parpool('local',2) % Create a parallel pool
W = ones(6,6);
W = distributed(W); % Distribute to the workers
spmd
    T = W*2; % Calculation performed on workers, in parallel
    % T and W are both codistributed arrays here
end
T % View results in client.
whos % T and W are both distributed arrays here
delete(gcp) % Stop pool
  1. Я читал в документации, что разница между обычными массивами и массивами распределения заключается в следующем: когда мы используем распределенные массивы, эти массивы напрямую отправляются рабочим, а на клиентах нет никакого массива. Значит, у нас нет доступа к этим массивам в клиенте? Только ли это несоответствие?

  2. Какая разница в структуре и выводе кода, если убрать W = distributed(W); строку? Какова цель использования распределенного массива?

  3. В чем разница между distributed и codistributed. Как я читал в документации, мы можем использовать только codistributed в блоке spmd. Это тура?


person Eghbal    schedule 12.02.2015    source источник
comment
Этот вопрос кажется мне слишком широким...   -  person kkuilla    schedule 12.02.2015


Ответы (2)


Распределенные массивы хранятся на воркерах, а не на клиенте, и операции над ними выполняются параллельно воркерами - в этом их смысл.

Разница между распределенными и совместно распределенными массивами заключается только в перспективе. С точки зрения клиента это распределенные массивы; с точки зрения рабочих, они являются совместно распределенными массивами.

Для иллюстрации сначала запустите пул:

>> parpool('local',2)

создать массив:

>> W = ones(6,6);

W хранится на клиенте.

Теперь создайте распределенный массив из W:

>> V = distributed(W);

V хранится на воркерах, разделенных по каждому воркеру. У вас по-прежнему есть доступ к V от клиента, но когда вы это делаете, он оттягивает V от рабочих.

>> V
V =
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1 

Обратите внимание, что в обозревателе рабочей области V представлен как распределенный массив 6x6, а не двойной 6x6, как W.

Теперь, хотя с точки зрения клиента V является распределенным массивом, с точки зрения рабочих V является совместно распределенным массивом.

>> spmd; disp(V); end
Lab 1: 
          LocalPart: [6x3 double]
      Codistributor: [1x1 codistributor1d]

Lab 2: 
          LocalPart: [6x3 double]
      Codistributor: [1x1 codistributor1d]

Вы можете видеть, что V распределяется совместно, и что только половина этого (6x3) хранится на каждом воркере.

Когда вы делаете что-то с V, это происходит на рабочих процессах параллельно, и результаты сохраняются на рабочих процессах в виде распределенного/совместно распределенного массива:

>> spmd; T = V*2; end
>> spmd; disp(T); end
Lab 1: 
          LocalPart: [6x3 double]
      Codistributor: [1x1 codistributor1d]

Lab 2: 
          LocalPart: [6x3 double]
      Codistributor: [1x1 codistributor1d]

У вас есть доступ к T из клиента так же, как и к V, но чтобы явно вернуть его, используйте gather:

>> S = gather(T);

Обратите внимание, что S теперь представляет собой двойной массив 6x6, а не распределенный массив.

person Sam Roberts    schedule 12.02.2015
comment
Спасибо за ответ Сэм. Итак, какова цель определения coddistributedarray в блоке spmd? Как мы можем использовать эту структуру в ваших кодах? Предположим, что у нас есть ones(6,6,'coddistributed') в блоке spmd. - person Eghbal; 12.02.2015
comment
Что ж, вы можете захотеть создать совместно распространяемые переменные внутри вашего блока spmd. Этот синтаксис позволяет вам сделать это. Например, если вы попробуете spmd; X = ones(6,6, 'codistributed'); end, X будет распределенным (от клиента) или совместно распределенным (от рабочих) массивом. Это может быть полезно - и, конечно, вы можете делать и более сложные вещи, чем ones. - person Sam Roberts; 12.02.2015
comment
То есть у нас одинаковая функциональность в обеих структурах? Это правда? - person Eghbal; 12.02.2015
comment
Это не две разные структуры. Распределенные массивы являются совместно распределенными массивами. Когда вы находитесь на клиенте, вы (и код) видите их как распределенные массивы. Когда вы работаете с воркером, вы (и код) видите их как совместно распределенные массивы. Это один и тот же массив, только что описанный и рассматриваемый двумя разными способами. - person Sam Roberts; 12.02.2015
comment
Чтобы подчеркнуть, создайте V, как в моем ответе. Затем введите class(V). Вы увидите distributed. Теперь введите spmd; disp(class(V)); end. Вы увидите, что оба воркера видят его как codistributed. - person Sam Roberts; 12.02.2015

К 1.) Конечно, есть и другие незначительные несоответствия, но, по крайней мере, способ индексации и манипулирования его элементами должен быть таким же.

К 2.) Вы можете легко попробовать сами. В любом случае, результатом является Composite, то есть обычный массив, копируемый в каждый worker при выполнении блока spmd, вычисления выполняются несколько раз, и каждый результат сохраняется. Я бы использовал «нормальный» тип для постоянных входных данных (параметров) и distributed для переменных, которые используются для вычисления вывода (и определяют их размер).

Пример:

x = distributed(1:100); % variable, output will be calculated on -> distributed
a = 5; % amplitude (constant parameter -> "normal")
spmd
  y = a * sin(x);
end
y

Это также объясняет цель distributed: включить параллельные вычисления на матрице.

К 3.: Distributed означает, что его элементы распределены по рабочим. Codistributed означает, что его элементы также распространяются, но таким же образом, что-то, что также является distributed (что среди прочего подразумевает равный размер). Я предполагаю (но не уверен), что свойство codistributed остается, пока параллельный пул остается открытым, но из-за пределов блока spmd к ним можно получить доступ только как к массивам distributed.

В документации говорится:

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

person Trilarion    schedule 12.02.2015