Коллективная операция - Collective operation

Коллективные операции являются строительными блоками для шаблонов взаимодействия, которые часто используются в СПМД алгоритмы в параллельное программирование контекст. Следовательно, есть интерес к эффективной реализации этих операций.

Реализация коллективных операций обеспечивается Интерфейс передачи сообщений[1] (MPI).

Определения

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

Если у нас нет равного распределения, т.е. узел имеет сообщение размера , мы получаем верхнюю границу времени выполнения, задав .

А модель распределенной памяти предполагается. Концепции аналогичны для модель общей памяти. Однако системы с общей памятью могут обеспечивать аппаратную поддержку некоторых операций, таких как трансляция (§ Транслировать ), например, что позволяет удобное одновременное чтение.[2] Таким образом, могут стать доступными новые алгоритмические возможности.

Транслировать [3]

Три квадрата выровнены по вертикали слева и три квадрата по вертикали справа. Пунктирная линия соединяет верхний левый и верхний правый квадраты. Две сплошные линии соединяют верхний левый квадрат и средний и нижний правые квадраты. Буква а написана в верхнем левом квадрате и во всех правых квадратах.
Информационный поток операции Broadcast выполняется на трех узлах.

Шаблон широковещательной передачи используется для распределения данных от одного процессора ко всем модулям обработки, что часто требуется в СПМД параллельные программы для распределения входных или глобальных значений. Широковещательную рассылку можно интерпретировать как инверсную версию шаблона сокращения (§ Уменьшать ). Изначально только root с хранит сообщение . Во время трансляции отправляется в оставшиеся блоки обработки, так что в конечном итоге доступен для всех процессоров.

Поскольку реализация с помощью последовательного цикла for с итерации становятся узким местом, подходы разделяй и властвуй общие. Одна из возможностей - использовать структуру биномиального дерева с требованием, чтобы должно быть степенью двойки. Когда блок обработки отвечает за отправку к процессорам , он отправляет к блоку обработки и делегирует ответственность за блоки обработки к нему, в то время как его собственная ответственность сокращается до .

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

Конвейерная трансляция на сбалансированной двоичное дерево возможно в .


Уменьшать [4]

Три квадрата выровнены по вертикали слева и три квадрата по вертикали справа. Между двумя столбцами помещается круг с буквой f внутри. Три сплошные линии соединяют круг с тремя левыми квадратами. Одна сплошная линия соединяет круг и высокий правый квадрат. Буквы a, b и c написаны в левых квадратах сверху вниз. Буква альфа написана в правом верхнем квадрате.
Информационный поток операции Reduce выполняется на трех узлах. f - ассоциативный оператор, а α - результат редукции.

Шаблон сокращения используется для сбора данных или частичных результатов от разных блоков обработки и объединения их в глобальный результат выбранным оператором. Редукцию можно рассматривать как обратную версию трансляции (§ Транслировать ). Данный блоки обработки, сообщение находится на блоке обработки первоначально. Все объединены и результат в конечном итоге сохраняется на . Оператор редукции должен быть как минимум ассоциативным. Для некоторых алгоритмов требуется коммутативный оператор с нейтральным элементом. Операторы любят , , общие.

Поскольку сокращение можно интерпретировать как инверсную широковещательную рассылку, применяются равные условия реализации (§ Транслировать ). Для конвейерной обработки бинарные деревья сообщение должно быть представлено как вектор меньшего объекта для покомпонентного сокращения.

Конвейерное сокращение на сбалансированном двоичное дерево возможно в .

Все-Уменьшить [5]

Три квадрата выровнены по вертикали слева и три квадрата по вертикали справа. Между двумя столбцами помещается круг с буквой f внутри. Три сплошные линии соединяют круг с тремя левыми квадратами. Одна сплошная линия соединяет круг и высокий правый квадрат. Буквы a, b и c написаны в левых квадратах сверху вниз. Буква альфа написана в правом верхнем квадрате.
Информационный поток операции All-Reduce выполняется на трех узлах. f - ассоциативный оператор, а α - результат редукции.

Шаблон all-reduce используется, если результат операции сокращения (§ Уменьшать ) должны быть распределены по всем процессорам. Данный блоки обработки, сообщение находится на блоке обработки первоначально. Все агрегируются оператором и результат в конечном итоге сохраняется на всех . Аналогично операции уменьшения оператор должен быть как минимум ассоциативным.

All-reduce можно интерпретировать как операцию сокращения с последующей трансляцией (§ Транслировать ). Для длинных сообщений подходит соответствующая реализация, тогда как для коротких сообщений задержка может быть уменьшена с помощью гиперкуб (Гиперкуб (модель общения) § Все-Собрать / Все-Уменьшить ) топология, если это степень двойки.

All-reduce возможно в , так как сокращение и трансляция возможны в с конвейером на балансировке бинарные деревья.

Префикс-сумма / сканирование [6]

Три квадрата выровнены по вертикали слева и три прямоугольника выровнены по вертикали справа. Между двумя столбцами помещается кружок со словом скан внутри. Три сплошные линии соединяют круг с тремя левыми квадратами. Три сплошные линии соединяют круг с тремя правыми квадратами. Буквы a, b и c написаны в левых квадратах сверху вниз. В правом верхнем квадрате написана буква а. В среднем правом квадрате написано слово a плюс b. В нижнем правом квадрате написано выражение a плюс b плюс c.
Информационный поток операции Prefix-Sum / Scan, выполняемой на трех узлах. Оператор + может быть любым ассоциативным оператором.

Операция суммирования префикса или сканирования используется для сбора данных или частичных результатов от различных блоков обработки и для вычисления промежуточных результатов оператором, которые хранятся в этих блоках обработки. Его можно рассматривать как обобщение операции сокращения (§ Уменьшать ). Данный блоки обработки, сообщение находится на блоке обработки . Оператор должен быть как минимум ассоциативным, тогда как некоторые алгоритмы требуют также коммутативного оператора и нейтрального элемента. Общие операторы , и . В конечном итоге блок обработки хранит сумму префикса . В случае так называемой суммы исключающего префикса блок обработки хранит сумму префикса . Некоторые алгоритмы требуют хранить общую сумму на каждом блоке обработки в дополнение к суммам префиксов.

Для коротких сообщений это может быть достигнуто с помощью топологии гиперкуба, если это степень двойки. Для длинных сообщений гиперкуб (Гиперкуб (коммуникационный шаблон) § Сумма префикса, Сумма префикса § Распределенная память: алгоритм гиперкуба ) топология не подходит, поскольку все блоки обработки активны на каждом шаге, и поэтому конвейерная обработка не может использоваться. А двоичное дерево топология лучше подходит для произвольных и длинные сообщения (Сумма префикса § Большие размеры сообщений: конвейерное двоичное дерево ).

Префиксная сумма в двоичном дереве может быть реализована с восходящей и нисходящей фазой. В восходящей фазе выполняется сокращение, в то время как нисходящая фаза аналогична широковещательной рассылке, где суммы префиксов вычисляются путем отправки разных данных левому и правому потомкам. При таком подходе конвейерная обработка возможна, поскольку операции равны сокращению (§ Уменьшать ) и трансляции (§ Транслировать ).

Конвейерная сумма префиксов в двоичном дереве возможна в .

Барьер [7]

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

Один из способов реализовать барьер - вызвать all-reduce (§ Все-уменьшить ) с пустым / фиктивным операндом. Мы знаем, что время выполнения All-reduce . Использование фиктивного операнда уменьшает размер к постоянному коэффициенту и приводит к времени выполнения .

Собирать [8]

Три квадрата выровнены по вертикали слева и три прямоугольника выровнены по вертикали справа. Пунктирная линия соединяет верхний левый квадрат с верхним правым прямоугольником. Две сплошные линии соединяют средний и нижний левые квадраты с верхним правым прямоугольником. Буквы a, b и c написаны в левых квадратах сверху вниз. Буквы a, b и c написаны в верхнем правом прямоугольнике подряд.
Информационный поток операции Gather выполняется на трех узлах.

Шаблон обмена данными используется для хранения данных от всех блоков обработки на одном блоке обработки. Данный блоки обработки, сообщение на блоке обработки . Для фиксированного процессора , мы хотим сохранить сообщение на . Gather можно рассматривать как операцию сокращения (§ Уменьшать ), который использует оператор конкатенации. Это работает из-за того, что конкатенация ассоциативна. Используя тот же алгоритм сокращения биномиального дерева, мы получаем время выполнения . Мы видим, что асимптотическая среда выполнения аналогична асимптотической среде выполнения reduce , но с добавлением множителя p к члену . Этот дополнительный фактор связан с увеличением размера сообщения на каждом шаге по мере объединения сообщений. Сравните это, чтобы уменьшить размер сообщения, если размер сообщения является постоянным для таких операторов, как .

All-Gather [8]

Три квадрата выровнены по вертикали слева и три прямоугольника выровнены по вертикали справа. Три пунктирные линии соединяют верхний левый квадрат с верхним правым прямоугольником, средний левый квадрат со средним правым прямоугольником и нижний левый квадрат с нижним правым прямоугольником. Две сплошные линии соединяют средний и нижний левые квадраты с верхним правым прямоугольником. Две сплошные линии соединяют верхний и нижний левые квадраты со средним правым прямоугольником. Две сплошные линии соединяют верхний и средний левые квадраты с нижним правым прямоугольником. Буквы a, b и c написаны в левых квадратах сверху вниз. Буквы a, b и c написаны во всех правильных прямоугольниках подряд.
Информационный поток операции All-Gather выполняется на трех узлах.

Схема связи «все сборы» используется для сбора данных со всех блоков обработки и для хранения собранных данных на всех блоках обработки. Данный блоки обработки , сообщение первоначально хранится на , мы хотим сохранить сообщение на каждой .

Об этом можно думать по-разному. Первый - это операция полного сокращения (§ Все-уменьшить ) с конкатенацией в качестве оператора, точно так же, как сборку можно представить с помощью сокращения. Второй - это операция сбора, за которой следует трансляция нового сообщения размера . При этом мы видим, что все собираются в возможно.

Разброс [9]

Есть три прямоугольника, выровненных по вертикали слева, и три квадрата, выровненных по вертикали справа.Пунктирная линия соединяет высокий левый прямоугольник с высоким правым квадратом. Две сплошные линии соединяют верхний левый прямоугольник со средним и нижним правыми квадратами. Буквы c, b и a написаны в верхнем левом прямоугольнике подряд. Буквы a, b и c написаны в правых квадратах сверху вниз.
Информационный поток операции Scatter выполняется на трех узлах.

Схема рассредоточенной связи используется для распределения данных от одного блока обработки ко всем блокам обработки. Он отличается от широковещательной рассылки тем, что не отправляет одно и то же сообщение всем процессорам. Вместо этого он разбивает сообщение и доставляет по одной его части каждому процессору.

Данный блоки обработки , фиксированный процессор что содержит сообщение . Мы хотим передать сообщение на . Те же проблемы реализации, что и для gather (§ Собирать ) подать заявление. Это приводит к оптимальному времени работы в .

Все для всех [10]

Все для всех - это наиболее общий шаблон общения. За , сообщение это сообщение, которое изначально хранится на узле и должен быть доставлен на узел . Мы можем выразить все примитивы связи, в которых не используются операторы, через все ко всем. Например, трансляция сообщения из узла эмулируется установкой за и установка пусто для .

Предполагая, что у нас есть полностью подключенная сеть, наилучшее время выполнения для всех-всех находится в . Это достигается за счет раунды прямого обмена сообщениями. За степень двойки, в раунде связи , узел обменивается сообщениями с узлом .

Если размер сообщения небольшой и при передаче данных преобладает задержка, можно использовать алгоритм гиперкуба для распределения сообщений во времени. .

Три прямоугольника выровнены по вертикали слева и три прямоугольника выровнены по вертикали справа. Ширина прямоугольников втрое больше. Члены a1, a2 и a3 написаны в верхнем левом прямоугольнике один под другим. Члены b1, b2 и b3 написаны в среднем левом прямоугольнике один под другим. Члены c1, c2 и c3 написаны в нижнем левом прямоугольнике один под другим. Члены a1, b1 и c1 написаны в правом верхнем прямоугольнике один под другим. Члены a2, b2 и c2 написаны в среднем правом прямоугольнике один под другим. Члены a3, b3 и c3 написаны в правом нижнем прямоугольнике один под другим. Пунктирная линия соединяет a1 из верхнего левого прямоугольника и a1 из верхнего правого прямоугольника. Пунктирная линия соединяет b2 из среднего левого прямоугольника и b2 из среднего правого прямоугольника. Пунктирная линия соединяет c3 из нижнего левого прямоугольника и c3 из нижнего правого прямоугольника. Сплошные линии соединяют другие соответствующие термины между левым и правым прямоугольниками.
Информационный поток операции All-to-All выполняется на трех узлах. Буквы обозначают узлы, а числа обозначают информационные элементы.

Обзор среды выполнения [11]

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

Примеры топологий, которые нам нужны для оптимального времени работы: двоичное дерево, биномиальное дерево, гиперкуб.

На практике мы должны адаптироваться к доступным физическим топологиям, например стрекоза жирное дерево, грид-сеть (также ссылается на другие топологии).

Больше информации в разделе Топология сети.

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

Сложности, указанные в таблице, зависят от задержки. и стоимость связи за слово в дополнение к количеству процессоров и размер входного сообщения на узел . В # отправитель и # приемник столбцы представляют количество отправителей и получателей, которые участвуют в операции соответственно. В # Сообщения в столбце указано количество входных сообщений и Расчеты? столбец указывает, выполняются ли какие-либо вычисления для сообщений или сообщения просто доставляются без обработки. Сложность дает асимптотическую сложность выполнения оптимальной реализации при свободном выборе топологии.

Имя# отправитель# приемник# СообщенияРасчеты?Сложность
Транслироватьнет
Уменьшатьда
Все-уменьшитьда
Сумма префиксада
Барьернет
Собиратьнет
All-Gatherнет
Разброснет
Все для всехнет или же

Примечания

  1. ^ Коллективные операции интеркоммуникатора. Стандарт интерфейса передачи сообщений (MPI), глава 7.3.1. Отделение математики и информатики, Аргоннская национальная лаборатория.
  2. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев 2019, стр. 395
  3. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев 2019, стр. 396-401
  4. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев, 2019, стр. 402-403.
  5. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев, 2019, стр. 403-404
  6. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев, 2019, стр. 404-406.
  7. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев 2019, стр. 408
  8. ^ а б Сандерс, Мельхорн, Дицфельбингер, Дементьев, 2019, стр. 412-413
  9. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев 2019, стр. 413
  10. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев, 2019, стр. 413-418.
  11. ^ Сандерс, Мельхорн, Дицфельбингер, Дементьев 2019, стр. 394

Рекомендации

Сандерс, Питер; Мельхорн, Курт; Дицфельбингер, Мартин; Дементьев, Роман (2019). Последовательные и параллельные алгоритмы и структуры данных - Basic Toolbox. Springer Nature Switzerland AG. ISBN  978-3-030-25208-3.