Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Reduce (параллельный шаблон) )
Перейти к навигации Перейти к поиску

В информатике , то оператор сокращения [1] представляет собой тип оператора , который обычно используется в параллельном программировании , чтобы уменьшить элементы массива в единый результат. Операторы редукции ассоциативны и часто (но не обязательно) коммутативны . [2] [3] [4] Сокращение наборов элементов является неотъемлемой частью моделей программирования, таких как Map Reduce , где оператор сокращения применяется ( отображается ) ко всем элементам перед их уменьшением. Другие параллельные алгоритмыиспользуйте операторы сокращения в качестве основных операций для решения более сложных задач. Многие операторы сокращения могут использоваться для широковещательной передачи для распределения данных по всем процессорам.

Теория [ править ]

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

Оператор является оператором редукции, если:

  • Он может уменьшить массив до одного скалярного значения. [2]
  • Окончательный результат должен быть получен из результатов созданных частичных задач. [2]

Эти два требования выполняются для коммутативных и ассоциативных операторов, которые применяются ко всем элементам массива.

Некоторые операторы, которые удовлетворяют этим требованиям, - это сложение, умножение и некоторые логические операторы (и, или и т. Д.).

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

Пример [ править ]

Предположим, у нас есть массив . Сумму этого массива можно вычислить последовательно, последовательно уменьшая массив до единой суммы с помощью оператора «+». Начиная суммирование с начала массива, получаем:

Поскольку '+' коммутативен и ассоциативен, это оператор редукции. Следовательно, это сокращение может выполняться параллельно с использованием нескольких ядер, где каждое ядро ​​вычисляет сумму подмножества массива, а оператор сокращения объединяет результаты. Использование двоичного дерева сокращения позволило бы 4 ядра для вычисления , , , и . Затем два ядра могут вычислять и , наконец, одно ядро ​​вычисляет . Таким образом, для пошагового вычисления суммы можно использовать всего 4 ядра вместо шагов, необходимых для последовательной версии. Этот метод параллельного двоичного дерева вычисляет. Конечно, результат тот же, но только из-за ассоциативности оператора редукции. Коммутативность оператора сокращения была бы важна, если бы главное ядро ​​распределяло работу между несколькими процессорами, поскольку тогда результаты могли бы возвращаться на главный процессор в любом порядке. Свойство коммутативности гарантирует, что результат будет таким же.

Nonexample [ править ]

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

Алгоритмы [ править ]

Алгоритмы биномиального дерева [ править ]

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

PRAM-алгоритм [ править ]

Этот алгоритм представляет собой широко распространенный метод обработки входных данных со степенью двойки. Для элементов вещания часто используется обратная процедура. [5] [6] [7]

Визуализация алгоритма с p = 8, m = 1 и сложением в качестве оператора редукции
для того, чтобы делать
для , чтобы сделать параллельно
если активен, то
если бит из установлен , то
установлен в неактивный
иначе если

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

Только держит результат в конце концов, поэтому корневая процессор. Для операции Allreduce результат должен быть распределен, что можно сделать, добавив широковещательную рассылку из . Кроме того, количество процессоров ограничено степенью до двух. Этого можно избежать, увеличив количество процессоров до ближайшей степени двойки. Существуют также алгоритмы, которые больше подходят для этого варианта использования. [8]

Анализ времени выполнения [ править ]

Основной цикл выполняется раз, время, необходимое для части, выполняемой параллельно, составляет, поскольку блок обработки либо объединяет два вектора, либо становится неактивным. Таким образом, параллельное время для PRAM составляет . Стратегия обработки конфликтов чтения и записи может быть выбрана такой же ограничительной, как исключительное чтение и монопольная запись (EREW). Ускорение алгоритма является и , следовательно, эффективность является . Эффективность страдает из-за того, что половина активных блоков обработки становится неактивной после каждого шага, поэтому блоки активны на шаге .

Алгоритм распределенной памяти [ править ]

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

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

Единственная разница между распределенным алгоритмом и версией PRAM - это включение явных примитивов связи, принцип работы остается прежним.

Анализ времени выполнения [ править ]

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

Трубопровод-алгоритм [ править ]

Визуализация конвейерного алгоритма с p = 5, m = 4 и сложением в качестве оператора редукции.

Для моделей распределенной памяти может иметь смысл использовать конвейерную связь. Это особенно актуально, когда он мал по сравнению с . Обычно линейные конвейеры разделяют данные или задачи на более мелкие части и обрабатывают их поэтапно. В отличие от алгоритмов биномиального дерева конвейерный алгоритм использует тот факт, что векторы не являются неотделимыми, но оператор может быть вычислен для отдельных элементов: [9]

для того, чтобы делать
для , чтобы сделать параллельно
если
отправить в
если
получать от

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

Анализ времени выполнения [ править ]

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

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

Приложения [ править ]

Редукция - одна из основных коллективных операций, реализованных в интерфейсе передачи сообщений , где производительность используемого алгоритма важна и постоянно оценивается для различных вариантов использования. [10] Операторы могут использоваться в качестве параметров для MPI_Reduceи MPI_Allreduce, с той разницей, что результат доступен на одном (корневом) процессоре или на всех из них. MapReduce в значительной степени полагается на эффективные алгоритмы сокращения для обработки больших наборов данных, даже на огромных кластерах. [11] [12]

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

См. Также [ править ]

  • Сложить (функция высшего порядка)

Ссылки [ править ]

  1. ^ Оговорка о сокращении
  2. ^ а б в Солихин
  3. ^ Чандра стр. 59
  4. ^ Коул, Мюррей (2004). «Извлечение скелетов из шкафа: прагматический манифест для скелетного параллельного программирования» (PDF) . Параллельные вычисления . 30 (3): 393. DOI : 10.1016 / j.parco.2003.12.002 .
  5. ^ Бар-Ной, Амоц; Кипнис, Шломо (1994). «Широковещательная передача нескольких сообщений в системах одновременной отправки / получения». Дискретная прикладная математика . 55 (2): 95–105. DOI : 10.1016 / 0166-218x (94) 90001-9 .
  6. ^ Сантос, Юнис Э. (2002). «Оптимальные и эффективные алгоритмы суммирования и суммирования префиксов на параллельных машинах». Журнал параллельных и распределенных вычислений . 62 (4): 517–543. DOI : 10,1006 / jpdc.2000.1698 .
  7. ^ Slater, P .; Cockayne, E .; Хедетниеми, С. (1981-11-01). «Распространение информации на деревьях». SIAM Journal on Computing . 10 (4): 692–701. DOI : 10.1137 / 0210052 . ISSN 0097-5397 . 
  8. ^ Rabenseifner, Рольф; Трафф, Джеспер Ларссон (19 сентября 2004 г.). Более эффективные алгоритмы сокращения количества процессоров, отличных от степени двойки, в параллельных системах с передачей сообщений . Последние достижения в области параллельных виртуальных машин и интерфейса передачи сообщений . Конспект лекций по информатике. 3241 . Шпрингер, Берлин, Гейдельберг. С. 36–46. DOI : 10.1007 / 978-3-540-30218-6_13 . ISBN 9783540231639.
  9. ^ Бар-Ной, А .; Кипнис, С. (1994-09-01). «Разработка алгоритмов вещания в почтовой модели для систем передачи сообщений». Математическая теория систем . 27 (5): 431–452. CiteSeerX 10.1.1.54.2543 . DOI : 10.1007 / BF01184933 . ISSN 0025-5661 . S2CID 42798826 .   
  10. ^ Пьешивац-Грбович, Елена; Ангскун, Тара; Босилка, Джордж; Fagg, Graham E .; Габриэль, Эдгар; Донгарра, Джек Дж. (01.06.2007). «Анализ эффективности коллективных операций MPI». Кластерные вычисления . 10 (2): 127–143. DOI : 10.1007 / s10586-007-0012-0 . ISSN 1386-7857 . S2CID 2142998 .  
  11. ^ Lämmel, Ralf (2008). "Модель программирования Google MapReduce - повторение". Наука компьютерного программирования . 70 (1): 1–30. DOI : 10.1016 / j.scico.2007.07.001 .
  12. ^ Сенгер, Гермес; Хиль-Коста, Вероника; Арантес, Лучиана; Marcondes, Cesar AC; Марин, Маурисио; Sato, Liria M .; да Силва, Fabrício AB (10.06.2016). «Анализ стоимости и масштабируемости BSP для операций MapReduce». Параллелизм и вычисления: практика и опыт . 28 (8): 2503–2527. DOI : 10.1002 / cpe.3628 . hdl : 10533/147670 . ISSN 1532-0634 . 
  13. ^ Акстманн, Майкл; Бингманн, Тимо; Сандерс, Питер; Шульц, Кристиан (2014-10-24). «Практическая массовая параллельная сортировка». arXiv : 1410.6754 [ cs.DS ].

Книги [ править ]

  • Чандра, Рохит (2001). Параллельное программирование в OpenMP . Морган Кауфманн. стр.  59 -77. ISBN 1558606718.
  • Солихин, Ян (2016). Основы параллельной многоядерной архитектуры . CRC Press. п. 75. ISBN 978-1-4822-1118-4.

Внешние ссылки [ править ]

  • Оговорка о сокращении, ссылка на оговорку о сокращении