Оператор сокращения

редактировать

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

Содержание
  • 1 Теория
    • 1.1 Пример
    • 1.2 Нет примера
  • 2 Алгоритмы
    • 2.1 Алгоритмы биномиального дерева
      • 2.1.1 PRAM-алгоритм
        • 2.1.1.1 Анализ времени выполнения
      • 2.1.2 Алгоритм распределенной памяти
        • 2.1.2.1 Анализ времени выполнения
    • 2.2 Конвейерный алгоритм
      • 2.2.1 Анализ времени выполнения
  • 3 Приложения
  • 4 См. Также
  • 5 Ссылки
  • 6 Книги
  • 7 Внешние ссылки
Теория

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

Оператор является оператором сокращения, если:

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

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

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

Оператор сокращения ⊕ {\ displaystyle \ oplus}\ oplus может быть применен в постоянное время к входному набору V = {v 0 = (e 0 0 ⋮ e 0 м - 1), v 1 знак равно (е 1 0 ⋮ е 1 м - 1),…, vp - 1 = (эп - 1 0 ⋮ ep - 1 м - 1)} {\ displaystyle V = \ {v_ { 0} = {\ begin {pmatrix} e_ {0} ^ {0} \\\ vdots \\ e_ {0} ^ {m-1} \ end {pmatrix}}, v_ {1} = {\ begin {pmatrix } e_ {1} ^ {0} \\\ vdots \\ e_ {1} ^ {m-1} \ end {pmatrix}}, \ dots, v_ {p-1} = {\ begin {pmatrix} e_ { p-1} ^ {0} \\\ vdots \\ e_ {p-1} ^ {m-1} \ end {pmatrix}} \}}{\ displaystyle V = \ {v_ {0} = {\ begin {pmatrix} e_ {0} ^ {0} \\\ vdots \\ e_ {0} ^ {m -1} \ end {pmatrix}}, v_ {1} = {\ begin {pmatrix} e_ {1} ^ {0} \\\ vdots \\ e_ {1} ^ {m-1} \ end {pmatrix} }, \ dots, v_ {p-1} = {\ begin {pmatrix} e_ {p-1} ^ {0} \\\ vdots \\ e_ {p-1} ^ {m-1} \ end {pmatrix }} \}} из p {\ displaystyle p }p векторы с m {\ displaystyle m}m элементами каждый. Результатом операции r {\ displaystyle r}r является комбинация элементов r = (e 0 0 ⊕ e 1 0 ⊕ ⋯ ⊕ ep - 1 0 ⋮ e 0 m - 1 ⊕ е 1 м - 1 ⊕ ⋯ ⊕ ep - 1 м - 1) = (⨁ я = 0 п - 1 ei 0 ⋮ ⨁ я = 0 p - 1 eim - 1) {\ displaystyle r = {\ begin { pmatrix} e_ {0} ^ {0} \ oplus e_ {1} ^ {0} \ oplus \ dots \ oplus e_ {p-1} ^ {0} \\\ vdots \\ e_ {0} ^ {m- 1} \ oplus e_ {1} ^ {m-1} \ oplus \ dots \ oplus e_ {p-1} ^ {m-1} \ end {pmatrix}} = {\ begin {pmatrix} \ bigoplus _ {i = 0} ^ {p-1} e_ {i} ^ {0} \\\ vdots \\\ bigoplus _ {i = 0} ^ {p-1} e_ {i} ^ {m-1} \ end { pmatrix}}}{\ displaystyle r = {\ begin {pmatrix} e_ {0} ^ {0} \ oplus e_ {1} ^ {0} \ oplus \ dots \ oplus e_ {p-1} ^ {0} \\\ vdots \\ e_ {0} ^ {m-1} \ oplus e_ {1} ^ {m-1} \ oplus \ dots \ oplus e_ {p-1} ^ {m-1} \ end {pmatrix}} = {\ begin {pmatrix} \ bigoplus _ {i = 0} ^ {p-1} e_ {i} ^ {0} \\\ vdots \\\ bigoplus _ {i = 0} ^ { п-1} е_ {я} ^ {м-1} \ конец {pmatrix}}} и должен быть сохранен в указанном корневом процессоре в конце выполнения. Если результат r {\ displaystyle r}r должен быть доступен на каждом процессоре после завершения вычисления, его часто называют Allreduce. Оптимальный последовательный алгоритм сокращения с линейным временем может применять оператор последовательно спереди назад, всегда заменяя два вектора результатом операции, примененной ко всем ее элементам, таким образом создавая экземпляр, который имеет на один вектор меньше. Ему нужно (p - 1) ⋅ m {\ displaystyle (p-1) \ cdot m}{\ displaystyle (p -1) \ cd от m} шагов, пока не останется только r {\ displaystyle r}r . Последовательные алгоритмы не могут работать лучше, чем линейное время, но параллельные алгоритмы оставляют некоторое пространство для оптимизации.

Пример

Предположим, у нас есть массив [2, 3, 5, 1, 7, 6, 8, 4] {\ displaystyle [2,3,5,1, 7,6,8,4]}{\ displaystyle [2,3,5,1,7,6,8,4]} . Сумму этого массива можно вычислить последовательно, последовательно уменьшая массив до единой суммы с помощью оператора '+'. Если начать суммирование с начала массива, получим:

((((((2 + 3) + 5) + 1) + 7) + 6) + 8) + 4 = 36 {\ displaystyle {\ Bigg ( } {\ bigg (} {\ Big (} {\ big (} \, (\, (2 + 3) +5) +1 {\ big)} + 7 {\ Big)} + 6 {\ bigg)} +8 {\ Bigg)} + 4 = 36}{\ displaystyle {\ Bigg (} {\ bigg (} {\ Big (} { \ big (} \, (\, (2 + 3) +5) +1 {\ big)} + 7 {\ Big)} + 6 {\ bigg)} + 8 {\ Bigg)} + 4 = 36}

Поскольку '+' коммутативен и ассоциативен, это оператор редукции. Следовательно, это сокращение может выполняться параллельно с использованием нескольких ядер, где каждое ядро ​​вычисляет сумму подмножества массива, а оператор сокращения объединяет результаты. Использование двоичного дерева сокращение позволит 4 ядрам вычислить (2 + 3) {\ displaystyle (2 + 3)}{\ displaystyle (2 + 3)} , (5 + 1) {\ displaystyle (5 + 1) }{\ displaystyle (5 + 1)} , (7 + 6) {\ displaystyle (7 + 6)}{\ displaystyle ( 7 + 6)} и (8 + 4) {\ displaystyle (8 + 4)}{\ displaystyle (8 + 4)} . Тогда два ядра могут вычислить (5 + 6) {\ displaystyle (5 + 6)}{\ displaystyle (5 + 6)} и (13 + 12) {\ displaystyle (13 + 12)}{\ displaystyle (13 + 12)} , и, наконец, одно ядро ​​вычисляет (11 + 25) = 36 {\ displaystyle (11 + 25) = 36}{ \ displaystyle (11 + 25) = 36} . Таким образом, всего 4 ядра могут использоваться для вычисления суммы в log 2 ⁡ 8 = 3 {\ displaystyle \ log _ {2} 8 = 3}{\ displaystyle \ log _ {2} 8 = 3} шагов вместо 7 {\ displaystyle 7}7шаги, необходимые для серийной версии. Этот метод параллельного двоичного дерева вычисляет ((2 + 3) + (5 + 1)) + ((7 + 6) + (8 + 4)) {\ displaystyle {\ big (} \, (2 + 3) + (5 + 1) \, {\ big)} + {\ big (} \, (7 + 6) + (8 + 4) \, {\ big)}}{\ displaystyle {\ big (} \, (2 + 3) + (5 + 1) \, {\ big)} + {\ big (} \, (7 + 6) + ( 8 + 4) \, {\ big)}} . Конечно, результат тот же, но только из-за ассоциативности оператора редукции. Коммутативность оператора сокращения была бы важна, если бы главное ядро ​​распределяло работу между несколькими процессорами, поскольку тогда результаты могли бы возвращаться на главный процессор в любом порядке. Свойство коммутативности гарантирует, что результат будет таким же.

Непример

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

Алгоритмы

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

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

PRAM-алгоритм

Этот алгоритм представляет собой широко распространенный метод обработки входных данных, где p {\ displaystyle p}p - степень двойки. Для элементов широковещательной передачи часто используется обратная процедура.

Визуализация алгоритма с p = 8, m = 1 и сложение в качестве оператора сокращения
для k ← 0 {\ displaystyle k \ получает 0}{\ displaystyle k \ получает 0} to⌈ log 2 ⁡ p ⌉ - 1 {\ displaystyle \ lceil \ log _ {2} p \ rceil -1}{\ displaystyle \ lceil \ log _ {2} p \ rceil -1} do
fori ← 0 {\ displaystyle i \ gets 0}{\ displaystyle i \ gets 0} top - 1 {\ displaystyle p-1}p-1 делать параллельно
ifpi {\ displaystyle p_ {i}}p_ {i} активен, то
если бит k {\ displaystyle k}k ofi {\ displaystyle i}iустановлен, тогда
установить pi {\ displaystyle p_ {i}}p_ {i} в неактивное состояние
иначе, если я + 2 к < p {\displaystyle i+2^{k}{\ displaystyle i + 2 ^ {k} <p}
xi ← xi ⊕ ⋆ xi + 2 k {\ displaystyle x_ {i} \ получает x_ {i} \ oplus ^ {\ star} x_ {i + 2 ^ {k }}}{\ displaystyle x_ {i} \ получает x_ {i} \ oplus ^ {\ star} x_ {i + 2 ^ {k}}}

Бинарный оператор для векторов определяется поэлементно так, что (ei 0 ⋮ eim - 1) ⊕ ⋆ (ej 0 ⋮ ejm - 1) = (ei 0 ⊕ ej 0 ⋮ eim - 1 ⊕ ejm - 1) {\ displaystyle {\ begin {pmatrix} e_ {i} ^ {0} \\\ vdots \\ e_ {i} ^ {m-1} \ end {pmatrix}} \ oplus ^ {\ star } {\ begin {pmatrix} e_ {j} ^ {0} \\\ vdots \\ e_ {j} ^ {m-1} \ end {pmatrix} } = {\ begin {pmatrix} e_ {i} ^ {0} \ oplus e_ {j} ^ {0} \\\ vdots \\ e_ {i} ^ {m-1} \ oplus e_ {j} ^ { м-1} \ end {pmatrix}}}{\ displaystyle {\ begin {pmatrix} e_ {i} ^ {0} \\\ vdots \\ e_ {i} ^ { m-1} \ end {pmatrix}} \ oplus ^ {\ star} {\ begin {pmatrix} e_ {j} ^ {0} \\\ vdots \\ e_ {j} ^ {m-1} \ end { pmatrix}} = {\ begin {pmatrix} e_ {i} ^ {0} \ oplus e_ {j} ^ {0} \\\ vdots \\ e_ {i} ^ {m-1} \ oplus e_ {j} ^ {m-1} \ end {pmatrix}}} . Далее алгоритм предполагает, что в начале xi = vi {\ displaystyle x_ {i} = v_ {i}}{\ displaystyle x_ {i} = v_ {i}} для всех i {\ displaystyle i}iи p {\ displaystyle p}p представляет собой степень двойки и использует блоки обработки p 0, p 1,… pn - 1 {\ displaystyle p_ {0}, p_ {1 }, \ точки p_ {n-1}}{\ displaystyle p_ {0}, p_ {1}, \ dots p_ {n-1}} . На каждой итерации половина процессоров становится неактивной и не участвует в дальнейших вычислениях. На рисунке показана визуализация алгоритма с использованием сложения в качестве оператора. Вертикальные линии представляют собой блоки обработки, в которых происходит вычисление элементов в этой строке. Восемь входных элементов расположены внизу, и каждый шаг анимации соответствует одному параллельному шагу выполнения алгоритма. Активный процессор pi {\ displaystyle p_ {i}}p_ {i} оценивает данный оператор для элемента xi {\ displaystyle x_ {i}}x_{i}, который он в настоящее время удерживает и xj {\ displaystyle x_ {j}}x_ {j} , где j {\ displaystyle j}j - минимальный индекс, удовлетворяющий j>i {\ displaystyle j>i}{\displaystyle j>i} , так что pj {\ displaystyle p_ {j}}p_{j}становится неактивным процессором на текущем шаге. xi {\ displaystyle x_ {i}}x_{i}и xj {\ displaystyle x_ {j}}x_ {j} не обязательно являются элементами входного набора X {\ displaystyle X}X , поскольку поля перезаписываются и используются повторно для ранее оцененных выражений. Чтобы координировать роли блоков обработки на каждом шаге, не вызывая дополнительной связи между ними, тот факт, что блоки обработки индексируются числами из 0 {\ displaystyle 0}{\ displaystyle 0} до p - 1 {\ displaystyle p-1}p-1 . Каждый процессор смотрит на свой k {\ displaystyle k}k -й младший бит и решает, следует ли ему стать неактивным или вычислить оператор для своего собственного элемента и элемента с индексом, где k {\ displaystyle k}k -й бит не установлен. Базовый шаблон связи алгоритма - биномиальное дерево, отсюда и название алгоритма.

Только p 0 {\ displaystyle p_ {0}}р_ {0} содержит результат в конце, поэтому это корневой процессор. Для операции Allreduce результат должен быть распределен, что может быть выполнено путем добавления широковещательной передачи из p 0 {\ displaystyle p_ {0}}р_ {0} . Кроме того, количество процессоров p {\ displaystyle p}p ограничено степенью двойки. Этого можно избежать, увеличив количество процессоров до ближайшей степени двойки. Существуют также алгоритмы, более адаптированные для этого варианта использования.

Анализ времени выполнения

Выполняется основной цикл ⌈ log 2 ⁡ p ⌉ {\ displaystyle \ lceil \ log _ {2} p \ rceil}{\ displaystyle \ lceil \ log _ {2} p \ rceil} раз, время, необходимое для параллельной части, составляет O (м) {\ displaystyle {\ mathcal {O}} (m)}{\ mathcal {O}} (m) как блок обработки либо объединяет два вектора, либо становится неактивным. Таким образом, параллельное время T (p, m) {\ displaystyle T (p, m)}{\ displaystyle T (p, m)} для PRAM равно T (p, m) = O (log ⁡ (p) ⋅ м) {\ Displaystyle T (p, m) = {\ mathcal {O}} (\ log (p) \ cdot m)}{\ displaystyle T (p, m) = {\ mathcal {O}} (\ log (p) \ cdot m)} . Стратегия обработки конфликтов чтения и записи может быть выбрана такой же ограничительной, как исключительное чтение и исключительная запись (EREW). Ускорение S (p, m) {\ displaystyle S (p, m)}{\ displaystyle S (p, m) } алгоритма равно S (p, m) ∈ O (T seq T (p, m)) Знак равно О (п журнал ⁡ (p)) {\ Displaystyle S (p, m) \ in {\ mathcal {O}} \ left ({\ frac {T_ {seq}} {T (p, m)} } \ right) = {\ mathcal {O}} \ left ({\ frac {p} {\ log (p)}} \ right)}{\ displaystyle S (p, m) \ in {\ mathcal {O}} \ left ({\ frac {T_ {seq}} {T (p, m)}} \ right) = {\ mathcal {O}} \ left ({\ frac {p} {\ log (p)}} \ right)} и, следовательно, эффективность равна E (p, m) ∈ O (S (p, m) p) = O (1 журнал ⁡ (p)) {\ displaystyle E (p, m) \ in {\ mathcal {O}} \ left ({\ frac {S (p, m)} {p}} \ right) = {\ mathcal {O}} \ left ({\ frac {1} {\ log (p)}} \ right)}{\ displaystyle E (p, m) \ in { \ mathcal {O}} \ left ({\ frac {S (p, m)} {p}} \ right) = {\ mathcal {O}} \ left ({\ frac {1} {\ log (p) }} \ right)} . Эффективность снижается из-за того, что половина активных блоков обработки становится неактивной после каждого шага, поэтому p 2 i {\ displaystyle {\ frac {p} {2 ^ {i}}}}{\ displaystyle {\ гидроразрыв {p} {2 ^ {i}}}} блоки активны на этапе i {\ displaystyle i}i.

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

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

дляk ← 0 {\ displaystyle k \ gets 0}{\ displaystyle k \ получает 0} to⌈ log 2 ⁡ p ⌉ - 1 {\ displaystyle \ lceil \ log _ {2} p \ rceil -1}{\ displaystyle \ lceil \ log _ {2} p \ rceil -1} do
для i ← 0 {\ displaystyle i \ gets 0}{\ displaystyle i \ gets 0} top - 1 {\ displaystyle p-1}p-1 do параллельно
ifpi {\ displaystyle p_ {i} }p_ {i} активен, то
если бит k {\ displaystyle k}k ofi {\ displaystyle i}iустановлен, то
send xi {\ displaystyle x_ {i}}x_{i}topi - 2 k {\ displaystyle p_ {i-2 ^ {k}}}{ \ displaystyle p_ {i-2 ^ {k}}}
setpk {\ displaystyle p_ {k}}p_ {k} в неактивный
иначе, если i + 2 k < p {\displaystyle i+2^{k}{\ displaystyle i + 2 ^ {k} <p}
получитьxi + 2 k {\ displaystyle x_ {i + 2 ^ {k}}}{\ displaystyle x_ {i + 2 ^ {k}}}
xi ← xi ⊕ ⋆ xi + 2 k {\ displaystyle x_ {i} \ gets x_ {i} \ oplus ^ {\ star} x_ {i + 2 ^ {k}}}{\ displaystyle x_ {i} \ получает x_ {i} \ oplus ^ {\ star} x_ {i + 2 ^ {k}}}

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

Анализ времени выполнения

Связь между блоками приводит к некоторым накладным расходам. Простой анализ алгоритма использует BSP-модель и включает время T start {\ displaystyle T_ {start}}{\ displaystyle T_ {start}} , необходимое для инициирования связи, и T byte {\ displaystyle T_ {byte }}{\ displaystyle T_ {byte}} время, необходимое для отправки байта. Тогда результирующая среда выполнения будет Θ ((T start + n ⋅ T byte) ⋅ log (p)) {\ displaystyle \ Theta ((T_ {start} + n \ cdot T_ {byte}) \ cdot log (p))}{\ displaystyle \ Theta ((T_ {start} + n \ cdot T_ {byte}) \ cdot log (p))} , поскольку m {\ displaystyle m}m элементы вектора отправляются на каждой итерации и имеют размер n {\ displaystyle n}n всего.

конвейерный алгоритм

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

Для моделей распределенной памяти может иметь смысл использовать конвейерное взаимодействие. Это особенно важно, когда T s t a r t {\ displaystyle T_ {start}}{\ displaystyle T_ {start}} мало по сравнению с T b y t e {\ displaystyle T_ {byte}}{\ displaystyle T_ {byte}} . Обычно линейные конвейеры разделяют данные или задачи на более мелкие части и обрабатывают их поэтапно. В отличие от алгоритмов биномиального дерева конвейерный алгоритм использует тот факт, что векторы не являются неразделимыми, но оператор может быть вычислен для отдельных элементов:

для k ← 0 {\ displaystyle k \ gets 0}{\ displaystyle k \ получает 0} top + m - 3 {\ displaystyle p + m-3}{\ displaystyle p + m-3} do
fori ← 0 {\ displaystyle i \ gets 0}{\ displaystyle i \ gets 0} top - 1 {\ displaystyle p -1}p-1 выполнить параллельно
ifi ≤ ​​k < i + m ∧ i ≠ p − 1 {\displaystyle i\leq k{\ displaystyle i \ leq k <i + m \ land i \ neq p-1}
отправитьxik - i {\ displaystyle x_ {i} ^ {ki}}{\ displaystyle x_ {i} ^ {ki} } topi + 1 {\ displaystyle p_ {i + 1}}{\ displaystyle p_ {i + 1}}
ifi - 1 ≤ k < i − 1 + m ∧ i ≠ 0 {\displaystyle i-1\leq k{\ displaystyle i-1 \ leq k <i-1 + m \ land i \ neq 0}
получитьxi - 1 k + i - 1 {\ displaystyle x_ {i-1} ^ {k + i-1}}{ \ Displaystyle х_ {я-1} ^ {к + я-1}} изpi - 1 {\ displaystyle p_ {i-1}}p_ {i-1}
xik + i - 1 ← xik + i - 1 ⊕ xi - 1 k + i - 1 {\ displaystyle x_ {i} ^ {k + i-1} \ gets x_ {i} ^ {k + i-1} \ oplus x_ {i-1} ^ {k + i-1}}{\ displaystyle x_ {i} ^ {k + i-1} \ получает x_ {i} ^ {k + i-1} \ oplus x_ {i-1} ^ {k + i-1}}

Важно отметить что для работы алгоритма операции отправки и получения должны выполняться одновременно. Вектор результатов сохраняется в конце p p - 1 {\ displaystyle p_ {p-1}}{\ displaystyle p_ {p-1}} . Соответствующая анимация показывает выполнение алгоритма над векторами размера четыре с пятью модулями обработки. Два шага анимации визуализируют один параллельный шаг выполнения.

Анализ времени выполнения

Количество шагов при параллельном выполнении составляет p + m - 2 {\ displaystyle p + m-2}{\ displaystyle p + m- 2} , требуется p - 1 {\ displaystyle p-1}p-1 шагов, пока последний блок обработки не получит свой первый элемент и дополнительные m - 1 {\ displaystyle m-1}m-1 до тех пор, пока все элементы получены. Следовательно, время выполнения в BSP-модели равно T (n, p, m) = (T start + nm ⋅ T byte) (p + m - 2) {\ displaystyle T (n, p, m) = \ left (T_ {start} + {\ frac {n} {m}} \ cdot T_ {byte} \ right) (p + m-2)}{\ displaystyle T (n, p, m) = \ left (T_ {start} + {\ frac {n} {m}} \ cdot T_ {byte} \ right) (p + m-2)} , при условии, что n {\ displaystyle n}n - это общий размер вектора в байтах.

Хотя m {\ displaystyle m}m имеет фиксированное значение, можно логически сгруппировать элементы вектора вместе и уменьшить m {\ displaystyle m}m . Например, экземпляр задачи с векторами размера четыре может быть обработан путем разделения векторов на первые два и последние два элемента, которые всегда передаются и вычисляются вместе. В этом случае каждый шаг отправляется с удвоенной громкостью, но количество шагов уменьшилось примерно вдвое. Это означает, что параметр m {\ displaystyle m}m уменьшается вдвое, в то время как общий размер в байтах n {\ displaystyle n}n остается прежним. Время выполнения T (p) {\ displaystyle T (p)}T (p) для этого подхода зависит от значения m {\ displaystyle m}m , которое может быть оптимизируется, если известны T start {\ displaystyle T_ {start}}{\ displaystyle T_ {start}} и T byte {\ displaystyle T_ {byte}}{\ displaystyle T_ {byte}} . Это оптимально для m = n ⋅ (p - 2) ⋅ T byte T start {\ displaystyle m = {\ sqrt {\ frac {n \ cdot (p-2) \ cdot T_ {byte}} {T_ {start}}}}}{\ displaystyle m = {\ sqrt {\ frac {n \ cdot (p-2) \ cdot T_ {byte}} {T_ {start }}}}} , предполагая, что это приводит к меньшему m {\ displaystyle m}m , который делит исходный.

Приложения

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

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

См. также
Ссылки
Книги
Внешние ссылки
Последняя правка сделана 2021-06-03 11:16:32
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте