Как объяснено в Ответ Эрана , эта операция использует свойство ассоциативности функции.
Далее, есть два фундаментальных шага.Первая - это фактическая операция с префиксом (в смысле требования к предыдущему элементу (элементам) для оценки), применяемая параллельно к частям массива.Результатом каждой частичной операции (идентичной результирующему последнему элементу) является смещение для оставшегося массива.
Например, для следующего массива с использованием суммы в качестве операции префикса и четырех процессоров
4 9 5 1 0 5 1 6 6 4 6 5 1 6 9 3
мы получаем
4 → 13 → 18 → 19 0 → 5 → 6 → 12 6 → 10 → 16 → 21 1 → 7 → 16 → 19
↓ ↓ ↓ ↓
19 12 21 19
Теперь мы используем ассоциативность, чтобы сначала применить операцию префикса к смещениям
↓ ↓ ↓ ↓
19 → 31 → 52 → 71
Затем мы переходим ко второй фазе, которая заключается вприменить эти смещения к каждому элементу следующего фрагмента, что является полностью распараллеливаемой операцией, поскольку больше нет зависимости от предыдущих элементов
19 19 19 19 31 31 31 31 52 52 52 52
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
4 13 18 19 19 24 25 31 37 41 47 52 53 59 68 71
Когда мы используем один и тот же пример для восьми потоков,
4 9 5 1 0 5 1 6 6 4 6 5 1 6 9 3
4 → 13 5 → 6 0 → 5 1 → 7 6 → 10 6 → 11 1 → 7 9 → 12
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
13 6 5 7 10 11 7 12
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
13 → 19 → 24 → 31 → 41 → 52 → 59 → 71
13 13 19 19 24 24 31 31 41 41 52 52 59 59
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
4 13 18 19 19 24 25 31 37 41 47 52 53 59 68 71
мы видим, что будет явное преимущество, даже если мы будем использовать более простую стратегию сохранения рабочих блоков одинаковыми для обоих этапов, другими словами, принять один свободный рабочий поток во второй фазе,Нам понадобится около ⅛n для первой фазы и ⅛n для второй, для операции потребуется totaln total (где n - стоимость оценки последовательного префикса всего массива).Конечно, только приблизительно и в лучшем случае.
Напротив, когда у нас есть только два процессора
4 9 5 1 0 5 1 6 6 4 6 5 1 6 9 3
4 → 13 → 18 → 19 → 19 → 24 → 25 → 31 6 → 10 → 16 → 21 → 22 → 28 → 37 → 40
↓ ↓
31 40
↓ ↓
31 → 71
31 31 31 31 31 31 31 31
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
4 13 18 19 19 24 25 31 37 41 47 52 53 59 68 71
, мы можем получить выгоду только тогда, когда мы переназначим работувторой этап.Это возможно, как уже было сказано, потому что работа второго этапа больше не имеет зависимостей между элементами.Таким образом, мы можем разделить эту операцию произвольно, хотя это усложняет реализацию и может привести к дополнительным накладным расходам.
Когда мы разделяем работу второй фазы между обоими процессорами, первой фазе требуется около ½n, а второй потребуется¼n, получая totaln total, что по-прежнему является преимуществом, если массив достаточно большой.
В качестве дополнительного примечания вы можете заметить, что смещения, рассчитанные при подготовке второго этапа, идентичны результату дляпоследний элемент куска.Таким образом, вы можете уменьшить необходимое количество операций на одну на блок, просто назначив это значение.Но типичный сценарий состоит в том, чтобы иметь только несколько блоков (масштабируемых с количеством процессоров) с большим количеством элементов, поэтому сохранение одной операции на блок не имеет значения.