Масштабируемая территория - Scalable locality

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

Обзор

Рассмотрим шаблоны использования памяти следующего гнезда циклов (итеративная двумерная расчет трафарета ):

за т := 0 к Т делать    за я := 1 к N-1 делать        за j := 1 к N-1 делать            новый(я,j) := (А(я-1,j) + А(я,j-1) + А(я,j) + А(я,j+1) + А(я+1,j)) * .2        конец    конец    за я := 1 к N-1 делать        за j := 1 к N-1 делать            А(я,j) := новый(я,j)        конец    конецконец

Все гнездо циклов касается примерно 2 * N ** 2 элементов массива и выполняет примерно 5 * T * N ** 2 операций с плавающей запятой. вычислить баланс (отношение вычислений с плавающей запятой к используемым ячейкам памяти с плавающей запятой) всего этого гнезда циклов составляет около 5T / 2. Когда баланс вычислений является функцией размера проблемы, как здесь, код, как говорят, имеет масштабируемый вычислительный баланс. Здесь мы могли бы достичь любого желаемого вычислительного баланса, просто выбрав достаточно большой Т.

Однако когда N большой, этот код по-прежнему не будет демонстрировать хорошее повторное использование кеша из-за плохого местонахождение ссылки: к тому времени, когда new (1,1) потребуется во втором присваивании или выполнении второго временного шага первого присваивания, строка кэша, содержащая new (1,1), будет перезаписана какой-либо другой частью одного из массивы.

Плитка первого гнезда цикла i / j может улучшить производительность кэша, но только в ограниченном масштабе, так как это гнездо имеет расчетный баланс около 5/2. Для получения очень высокой степени локальности, например 500 (для эффективного выполнения этого кода с массивом, который не помещается в ОЗУ и передается в виртуальную память), мы должны повторно использовать значения через временные интервалы.

Оптимизация по временным шагам исследовалась в ряде исследовательских компиляторов; см. Работу Воннакотта,[1][2] Сон и Ли,[3] или Sadayappan et al.[4] для деталей некоторых подходов к тайм-тайлинг.Wonnacott[1] продемонстрировали, что тайлинг может использоваться для оптимизации наборов данных вне ядра; в принципе, любой из этих подходов[2][3][4] должен иметь возможность достичь произвольно высокой локальности памяти, не требуя, чтобы весь массив помещался в кэш (однако требования к кешу растут с требуемой локальностью).[2][4] должны, в принципе, одновременно создавать масштабируемую локальность и масштабируемый параллелизм.

Рекомендации

  1. ^ а б c Дэвид Воннакотт. Достижение масштабируемости местности со смещением во времени. Международный журнал параллельного программирования 30.3 (2002)
  2. ^ а б c Дэвид Воннакотт. Использование Time Skewing для устранения простоя из-за пропускной способности памяти и сетевых ограничений. Международный симпозиум по параллельной и распределенной обработке данных 2000 г.
  3. ^ а б Юнхонг Сун и Чжиюань Ли. Новые методы тайлинга для улучшения временного расположения кэша. PLDI '99
  4. ^ а б c Шрирам Кришнамурти, Мутху Баскаран, Удай Бондхугула, Дж. Рамануджам, Атанас Рунтев и П. Садаяппан. Эффективное автоматическое распараллеливание вычислений трафаретов. PLDI '07