Оператор сокращения
В информатике оператор приведения [1] — это тип оператора , который обычно используется в параллельном программировании для сведения элементов массива к одному результату. Операторы редукции ассоциативны и часто (но не обязательно) коммутативны . [2] [3] [4] Сокращение наборов элементов является неотъемлемой частью таких моделей программирования, как Map Download , где оператор сокращения применяется ( сопоставляется ) ко всем элементам перед их сокращением. Другие параллельные алгоритмы используют операторы сокращения в качестве основных операций для решения более сложных задач. Многие операторы сокращения могут использоваться для широковещательной рассылки для распределения данных по всем процессорам.
Теория
[ редактировать ]Оператор сокращения может помочь разбить задачу на различные частичные задачи, вычисляя частичные результаты, которые можно использовать для получения окончательного результата. Это позволяет выполнять определенные последовательные операции параллельно и уменьшать количество шагов, необходимых для этих операций. Оператор сокращения сохраняет результат частичных задач в частной копии переменной. Эти частные копии затем в конце объединяются в общую копию.
Оператор является оператором редукции, если:
- Он может свести массив к одному скалярному значению. [2]
- Конечный результат должен быть получен из результатов созданных частичных задач. [2]
Этим двум требованиям удовлетворяют коммутативные и ассоциативные операторы, применяемые ко всем элементам массива.
Некоторыми операторами, удовлетворяющими этим требованиям, являются сложение, умножение и некоторые логические операторы (и, или и т. д.).
Оператор сокращения может применяться в постоянное время к входному набору из векторы с элементы каждый. Результат операция представляет собой комбинацию элементов и должен быть сохранен в указанном корневом процессоре в конце выполнения. Если результат должен быть доступен на каждом процессоре после завершения вычислений, его часто называют Allreduce. Оптимальный последовательный алгоритм сокращения с линейным временем может применять оператор последовательно спереди назад, всегда заменяя два вектора результатом операции, примененной ко всем его элементам, создавая таким образом экземпляр, в котором на один вектор меньше. Это требует шаги, пока только осталось. Последовательные алгоритмы не могут работать лучше, чем линейное время, но параллельные алгоритмы оставляют некоторое пространство для оптимизации.
Пример
[ редактировать ]Предположим, у нас есть массив . Сумма этого массива может быть вычислена последовательно путем последовательного сведения массива к одной сумме с помощью оператора «+». Начав суммирование с начала массива, получим:
Поскольку «+» одновременно коммутативен и ассоциативен, он является оператором редукции. Следовательно, это сокращение может выполняться параллельно с использованием нескольких ядер, где каждое ядро вычисляет сумму подмножества массива, а оператор сокращения объединяет результаты. Использование сокращения двоичного дерева позволит 4 ядрам выполнять вычисления. , , , и . Тогда два ядра смогут вычислить и и, наконец, одно ядро вычисляет . Таким образом, для вычисления суммы в общей сложности можно использовать 4 ядра. шаги вместо шаги, необходимые для серийной версии. Этот метод параллельного двоичного дерева вычисляет . Конечно, результат тот же, но только из-за ассоциативности оператора приведения. Коммутативность оператора сокращения была бы важна, если бы существовало главное ядро, распределяющее работу между несколькими процессорами, поскольку тогда результаты могли бы поступать обратно на главный процессор в любом порядке. Свойство коммутативности гарантирует, что результат будет одинаковым.
Беспримерный
[ редактировать ]Умножение матриц является не оператором сокращения, поскольку операция не является коммутативной. Если бы процессам было разрешено возвращать результаты умножения матриц в любом порядке главному процессу, окончательный результат, который вычисляет главный процесс, скорее всего, будет неверным, если результаты придут не по порядку. Однако обратите внимание, что умножение матриц является ассоциативным, и поэтому результат будет правильным, если будет соблюден правильный порядок, как в методе сокращения двоичного дерева.
Алгоритмы
[ редактировать ]Алгоритмы биномиального дерева
[ редактировать ]Что касается параллельных алгоритмов, существуют две основные модели параллельных вычислений: параллельная машина произвольного доступа как расширение оперативной памяти с общей памятью между процессорами и объемный синхронный параллельный компьютер связь и синхронизацию , который учитывает . Обе модели имеют разные последствия для временной сложности , поэтому будут показаны два алгоритма.
PRAM-алгоритм
[ редактировать ]Этот алгоритм представляет собой широко распространенный метод обработки входных данных, где это степень двойки. Обратная процедура часто используется для трансляции элементов. [5] [6] [7]
- для к делать
- для к делать параллельно
- если тогда активен
- если немного из устанавливается тогда
- набор в неактивный
- еще если
- если немного из устанавливается тогда
- если тогда активен
- для к делать параллельно
Бинарный оператор для векторов определяется поэлементно так, что . Далее алгоритм предполагает, что вначале для всех и представляет собой степень двойки и использует процессоры . На каждой итерации половина процессоров становится неактивной и не участвует в дальнейших вычислениях. На рисунке показана визуализация алгоритма, использующего сложение в качестве оператора. Вертикальные линии представляют собой процессоры, в которых происходят вычисления элементов в этой строке. Восемь входных элементов расположены внизу, и каждый шаг анимации соответствует одному параллельному шагу выполнения алгоритма. Активный процессор оценивает данный оператор на элементе в настоящее время он держится и где минимальный индекс, удовлетворяющий , так что становится неактивным процессором на текущем этапе. и не обязательно являются элементами входного набора поскольку поля перезаписываются и повторно используются для ранее вычисленных выражений. Для координации ролей процессоров на каждом этапе, не вызывая дополнительной связи между ними, используется тот факт, что процессоры индексируются числами из к используется. Каждый процессор смотрит на свой -th наименее значащий бит и решает, стать ли оператор неактивным или вычислить оператор для собственного элемента и элемента с индексом, в котором находится -й бит не установлен. Базовым коммуникационным шаблоном алгоритма является биномиальное дерево, отсюда и название алгоритма.
Только в конечном итоге хранит результат, поэтому является корневым процессором. Для операции Allreduce необходимо распространить результат, что можно сделать, добавив широковещательную рассылку из . Кроме того, число процессоров ограничено степенью двойки. Этого можно добиться, доведя количество процессоров до следующей степени двойки. Существуют также алгоритмы, более приспособленные для этого варианта использования. [8]
Анализ времени выполнения
[ редактировать ]Основной цикл выполняется раз, время, необходимое для выполнения параллельной части, составляет поскольку блок обработки либо объединяет два вектора, либо становится неактивным. Таким образом, параллельное время для коляски . Стратегию обработки конфликтов чтения и записи можно выбрать как ограничительную, например, монопольное чтение и монопольную запись (EREW). Ускорение алгоритма и, следовательно эффективность , . Эффективность страдает, потому что половина активных процессоров становится неактивными после каждого шага, поэтому единицы активны в шаге .
Алгоритм распределенной памяти
[ редактировать ]В отличие от алгоритма PRAM, в модели распределенной памяти память не распределяется между процессорами, и данные должны обмениваться явным образом между процессорами. Следовательно, обмен данными между модулями должен осуществляться явным образом, как показано в следующем алгоритме.
- для к делать
- для к делать параллельно
- если тогда активен
- если немного из устанавливается тогда
- отправлять к
- набор в неактивный
- еще если
- получать
- если немного из устанавливается тогда
- если тогда активен
- для к делать параллельно
Единственная разница между распределенным алгоритмом и версией PRAM заключается во включении явных коммуникационных примитивов, принцип работы остается прежним.
Анализ времени выполнения
[ редактировать ]Связь между подразделениями приводит к некоторым накладным расходам. Простой анализ алгоритма использует модель BSP и учитывает время. необходимо инициировать общение и время, необходимое для отправки байта. Тогда результирующее время выполнения будет , как элементы вектора передаются на каждой итерации и имеют размер всего.
Конвейерный алгоритм
[ редактировать ]Для моделей с распределенной памятью может иметь смысл использовать конвейерную связь. Это особенно актуально, когда мал по сравнению с . Обычно линейные конвейеры разбивают данные или задачи на более мелкие части и обрабатывают их поэтапно. В отличие от алгоритмов биномиального дерева, конвейерный алгоритм использует тот факт, что векторы не являются неразделимыми, но оператор может быть вычислен для отдельных элементов: [9]
- для к делать
- для к делать параллельно
- если
- отправлять к
- если
- получать от
- если
- для к делать параллельно
Важно отметить, что для работы алгоритма операции отправки и получения должны выполняться одновременно. Вектор результата сохраняется по адресу в конце. Соответствующая анимация показывает выполнение алгоритма на векторах размера четыре с пятью процессорами. Два шага анимации визуализируют один параллельный шаг выполнения.
Анализ времени выполнения
[ редактировать ]Число шагов при параллельном выполнении равно , занимает шагов до тех пор, пока последний процессор не получит свой первый элемент и дополнительные пока все элементы не будут получены. Следовательно, время выполнения в BSP-модели равно , предполагая, что — общий размер вектора в байтах.
Хотя имеет фиксированное значение, можно логически сгруппировать элементы вектора и уменьшить . Например, экземпляр проблемы с векторами размера четыре можно решить, разделив векторы на первые два и последние два элемента, которые всегда передаются и вычисляются вместе. В этом случае на каждый шаг передается двойной объем, но количество шагов уменьшается примерно вдвое. Это означает, что параметр уменьшается вдвое, а общий размер байтов остается прежним. Время выполнения для этого подхода зависит от значения , который можно оптимизировать, если и известны. Это оптимально для , предполагая, что это приводит к меньшему который делит исходный.
Приложения
[ редактировать ]Сокращение — одна из основных коллективных операций, реализованных в интерфейсе передачи сообщений , где важна производительность используемого алгоритма, которая постоянно оценивается для различных вариантов использования. [10] Операторы могут использоваться в качестве параметров для MPI_Reduce
и MPI_Allreduce
, с той разницей, что результат доступен на одном (корневом) процессоре или на всех. MapReduce в значительной степени полагается на эффективные алгоритмы сокращения при обработке больших наборов данных, даже в огромных кластерах. [11] [12]
Некоторые алгоритмы параллельной сортировки используют сокращения, чтобы иметь возможность обрабатывать очень большие наборы данных. [13]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Оговорка о сокращении» . www.dartmouth.edu . Дартмутский колледж. 23 марта 2009 года . Проверено 26 сентября 2016 г.
- ↑ Перейти обратно: Перейти обратно: а б с Солихин, Ян (2016). Основы параллельной многоядерной архитектуры . ЦРК Пресс. п. 75. ИСБН 978-1-4822-1118-4 .
- ^ Чандра, Рохит (2001). Параллельное программирование в OpenMP . Морган Кауфман. стр. 59–77 . ISBN 1558606718 .
- ^ Коул, Мюррей (2004). «Вытаскивание скелетов из чулана: прагматический манифест скелетного параллельного программирования» (PDF) . Параллельные вычисления . 30 (3): 393. doi : 10.1016/j.parco.2003.12.002 . hdl : 20.500.11820/8eb79d42-de83-4cfb-9faa-30d9ac3b3839 .
- ^ Бар-Ной, Амоц; Кипнис, Шломо (1994). «Рассылка нескольких сообщений в системах одновременной отправки и получения». Дискретная прикладная математика . 55 (2): 95–105. дои : 10.1016/0166-218x(94)90001-9 .
- ^ Сантос, Юнис Э. (2002). «Оптимальные и эффективные алгоритмы суммирования и суммирования префиксов на параллельных машинах». Журнал параллельных и распределенных вычислений . 62 (4): 517–543. дои : 10.1006/jpdc.2000.1698 .
- ^ Слейтер, П.; Кокейн, Э.; Хедетниеми, С. (1 ноября 1981 г.). «Распространение информации на деревьях». SIAM Journal по вычислительной технике . 10 (4): 692–701. дои : 10.1137/0210052 . ISSN 0097-5397 .
- ^ Рабенсейфнер, Рольф; Трефф, Йеспер Ларссон (19 сентября 2004 г.). «Более эффективные алгоритмы сокращения числа процессоров, не превосходящего степень двойки, в параллельных системах передачи сообщений». Последние достижения в области параллельных виртуальных машин и интерфейса передачи сообщений . Конспекты лекций по информатике. Том. 3241. Шпрингер, Берлин, Гейдельберг. стр. 36–46. дои : 10.1007/978-3-540-30218-6_13 . ISBN 9783540231639 .
- ^ Бар-Ной, А.; Кипнис, С. (1 сентября 1994 г.). «Проектирование алгоритмов вещания в почтовой модели для систем передачи сообщений». Теория математических систем . 27 (5): 431–452. CiteSeerX 10.1.1.54.2543 . дои : 10.1007/BF01184933 . ISSN 0025-5661 . S2CID 42798826 .
- ^ Пьешивац-Грбович, Елена; Ангскун, Тара; Босилка, Джордж; Фагг, Грэм Э.; Габриэль, Эдгар; Донгарра, Джек Дж. (1 июня 2007 г.). «Анализ производительности коллективных операций MPI». Кластерные вычисления . 10 (2): 127–143. CiteSeerX 10.1.1.80.3867 . дои : 10.1007/s10586-007-0012-0 . ISSN 1386-7857 . S2CID 2142998 .
- ^ Ламмель, Ральф (2008). «Модель программирования Google MapReduce — новый взгляд». Наука компьютерного программирования . 70 (1): 1–30. дои : 10.1016/j.scico.2007.07.001 .
- ^ Сенгер, Гермес; Хиль-Коста, Вероника; Арантес, Лусиана; Маркондес, Сезар АС; Марин, Маурисио; Сато, Лирия М.; да Силва, Фабрисио AB (10 июня 2016 г.). «Анализ стоимости и масштабируемости BSP для операций MapReduce». Параллелизм и вычисления: практика и опыт . 28 (8): 2503–2527. дои : 10.1002/cpe.3628 . hdl : 10533/147670 . ISSN 1532-0634 . S2CID 33645927 .
- ^ Астманн, Майкл; Бингманн, Тимо; Сандерс, Питер; Шульц, Кристиан (24 октября 2014 г.). «Практическая массово-параллельная сортировка». arXiv : 1410.6754 [ cs.DS ].