Алгоритмы, избегающие коммуникации, минимизируют перемещение данных в иерархии памяти для улучшения времени ее выполнения и потребления энергии. Они минимизируют общую сумму двух затрат (с точки зрения времени и энергии): арифметики и коммуникации. Коммуникация в этом контексте относится к перемещению данных либо между уровнями памяти, либо между несколькими процессорами по сети. Это намного дороже, чем арифметика. [1]
Распространенной вычислительной моделью при анализе алгоритмов избегания коммуникации является двухуровневая модель памяти:
[2] Следствие 6.2:
Теорема — Даны матрицы размеров , тогда имеет сложность связи .
Эта нижняя граница достижима путем умножения матриц.
Более общие результаты для других числовых операций линейной алгебры можно найти в [3] . Следующее доказательство взято из [4] .
Мы можем нарисовать граф вычислений как куб точек решетки, каждая точка имеет форму . Поскольку , вычисления требуют, чтобы процессор имел доступ к каждой точке внутри куба по крайней мере один раз. Таким образом, проблема становится покрытием точек решетки с минимальным количеством коммуникаций.
Если большой, то мы можем просто загрузить все записи, а затем записать записи. Это неинтересно.
Если мал, то мы можем разделить алгоритм минимальной коммуникации на отдельные сегменты. В течение каждого сегмента он выполняет ровно чтение в кэш и любое количество записей из кэша.
В течение каждого сегмента процессор имеет доступ максимум к разным точкам из .
Пусть — множество точек решетки, охваченных в течение этого сегмента. Тогда по неравенству Лумиса–Уитни ,
с ограничением .
По неравенству средних арифметических и геометрических имеем , причем экстремум достигается при .
Таким образом, арифметическая интенсивность ограничена сверху величиной , где , и поэтому коммуникация ограничена снизу величиной .
Прямое вычисление подтверждает, что алгоритм умножения матриц разбиения достигает нижней границы.
Рассмотрим следующую модель времени выполнения: [5]
⇒ Общее время выполнения = γ·(кол-во FLOP ) + β·(кол-во слов)
Из того факта, что β >> γ, измеряемого во времени и энергии, стоимость связи доминирует над стоимостью вычислений. Технологические тенденции [6] указывают на то, что относительная стоимость связи увеличивается на различных платформах, от облачных вычислений до суперкомпьютеров и мобильных устройств. В отчете также прогнозируется, что разрыв между временем доступа DRAM и FLOPs увеличится в 100 раз в течение ближайшего десятилетия, чтобы сбалансировать потребление энергии между процессорами и DRAM. [1]
Скорость FLOP (γ) | Пропускная способность DRAM (β) | Пропускная способность сети (β) |
---|---|---|
59% / год | 23% / год | 26% / год |
Потребление энергии увеличивается на порядки по мере продвижения вверх по иерархии памяти. [7]
Президент США Барак Обама упомянул алгоритмы избегания общения в бюджетном запросе Министерства энергетики на 2012 финансовый год в Конгресс: [1]
Новый алгоритм повышает производительность и точность в экстремально масштабируемых вычислительных системах. На современных компьютерных архитектурах связь между процессорами занимает больше времени, чем выполнение арифметической операции с плавающей точкой данным процессором. Исследователи ASCR разработали новый метод, полученный из широко используемых методов линейной алгебры, для минимизации связи между процессорами и иерархией памяти путем переформулирования шаблонов связи, указанных в алгоритме. Этот метод был реализован в фреймворке TRILINOS, высоко оцененном наборе программного обеспечения, который предоставляет функциональные возможности для исследователей по всему миру для решения крупномасштабных, сложных мультифизических задач.
Алгоритмы избегания общения разрабатываются с целью достижения следующих целей:
Следующий простой пример [1] демонстрирует, как это достигается.
Пусть A, B и C — квадратные матрицы порядка n × n . Следующий наивный алгоритм реализует C = C + A * B:
для i = 1 до n для j = 1 до n для k = 1 до n С(i,j) = С(i,j) + А(i,k) * В(k,j)
Арифметическая стоимость (временная сложность): n 2 (2 n − 1) для достаточно большого n или O( n 3 ).
Переписываем этот алгоритм с указанием стоимости связи на каждом шаге
для i = 1 до n {считывание строки i из A в быструю память} - n 2 считываний для j = 1 до n {считывание C(i,j) в быструю память} - n 2 считываний {считываем столбец j из B в быструю память} - n 3 считываний для k = 1 до n С(i,j) = С(i,j) + А(i,k) * В(k,j) {записать C(i,j) обратно в медленную память} - n 2 записей
Быструю память можно определить как локальную память процессора ( кэш ЦП ) размером M, а медленную память можно определить как DRAM.
Стоимость связи (чтение/запись): n 3 + 3 n 2 или O( n 3 )
Поскольку общее время выполнения = γ ·O( n 3 ) + β ·O( n 3 ) и β >> γ , стоимость связи является доминирующей. Блокированный (плиточный) алгоритм умножения матриц [1] уменьшает этот доминирующий член:
Рассмотрим A, B и C как матрицы размером n / b на n / b, состоящие из подблоков размером b на b , где b называется размером блока; предположим, что три блока размером b на b помещаются в быстрой памяти.
для i = 1 до n/b для j = 1 до n/b {считываем блок C(i,j) в быструю память} - b 2 × (n/b) 2 = n 2 считываний для k = 1 до n/b {считываем блок A(i,k) в быструю память} - b 2 × (n/b) 3 = n 3 /b считываний {считываем блок B(k,j) в быструю память} - b 2 × (n/b) 3 = n 3 /b считываний C(i,j) = C(i,j) + A(i,k) * B(k,j) - {выполнить матричное умножение на блоки} {записать блок C(i,j) обратно в медленную память} - b 2 × (n/b) 2 = n 2 записей
Стоимость связи: 2 n 3 / b + 2 n 2 чтения/записи << 2 n 3 арифметическая стоимость
Делаем b максимально возможным:
мы достигаем следующей нижней границы связи:
Большинство подходов, исследованных в прошлом для решения этой проблемы, основаны на методах планирования или настройки, которые направлены на перекрытие коммуникации с вычислениями. Однако этот подход может привести к улучшению максимум в два раза. Ghosting — это другой метод для сокращения коммуникации, при котором процессор сохраняет и вычисляет избыточные данные из соседних процессоров для будущих вычислений. Алгоритмы, игнорирующие кэш, представляют собой другой подход, введенный в 1999 году для быстрых преобразований Фурье [8], а затем распространенный на графовые алгоритмы, динамическое программирование и т. д. Они также применялись к нескольким операциям в линейной алгебре [9] [10] [11] как плотные LU и QR-факторизации. Разработка архитектурно-специфических алгоритмов — это еще один подход, который можно использовать для сокращения коммуникации в параллельных алгоритмах, и в литературе есть много примеров алгоритмов, которые адаптированы к заданной топологии коммуникации. [12]