Построение адаптивного механизма скрытия задержек

advertisement
СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
Построение адаптивного механизма скрытия
задержек обращения в память
при работе с массивами
А.С. Буров
Введение
Вычислительная мощность современных микропроцессорных систем стремительно возрастает с каждым годом. Однако увеличение производительности вычислительной системы неодинаково для различных ее компонентов. Наиболее быстро модернизируемой ее частью является, собственно, микропроцессор, в то время как другие устройства развиваются гораздо медленнее. К примеру, для системных и локальных шин данных ограничения накладываются чисто
физическими факторами, такими как размер и количество подсоединяемых устройств. А для
устройств хранения информации по коммерческим мотивам не допустимо увеличение стоимости, адекватного быстрорастущим потребностям современных программ в дополнительных ресурсах. Для подсистемы памяти это приводит к дилемме: с одной стороны ее объем и быстродействие должны увеличиваться для удовлетворения вышеуказанных потребностей, с другой
стороны современная технология должна обеспечивать постоянное удешевление стоимости в
пересчете на байт информации. Темпы роста производительности процессоров в настоящее
время составляют 50-80% в год, а для систем динамической памяти DRAM они составляют не
более 10% в год. Для увеличения же вычислительной мощности системы в целом недостаточно
увеличения производительности одного лишь микропроцессора. Необходим комплексный подход для поиска разумного компромисса между работой всех ее составляющих.
В данной работе мы сосредоточимся на ускорении взаимодействия центрального процессора
с подсистемой памяти, а, в частности, на оптимизации его работы над векторными вычислениями, играющими ключевую роль в большинстве научных задач, графических и мультимедийных приложений.
1. Существующие методы скрытия задержек обращения в память
1.1. Кэширование данных и их предварительная подкачка
Современные методы ускорения обмена данными между центральным процессором и подсистемой памяти сводятся, в основном, к построению иерархической ее структуры, при которой наименее объемная часть является наиболее быстрой и наоборот.
Метод кэширования информации приобрел заслуженную популярность в связи с тем, что
программные инструкции обращаются к данным не равновероятно, а оказывают предпочтение
некоторой части адресного пространства. Данное обстоятельство позволяет поместить наиболее часто используемые данные в быструю часть памяти – кэш, чтобы при последующих обращениях извлекать их с существенно меньшей задержкой.
Однако множество современных программ, оперирующих большими массивами данных, не
проявляет необходимой локальности обращений (о локальности будет написано ниже), позволяющей эффективно захватывать данные, используя алгоритмы обычного кэширования (собст28
венно, при работе с массивами локальность обращений может и присутствовать, однако, как
правило, не проявляется переиспользование данных, что делает кэширование информации малоэффективным). Для таких программ существенно велико время простоя при промахе в кэш miss penalty, снижающее эффективное время доступа в память.
Для оптимизации работы подсистемы памяти в этих случаях используются так называемые
методы предварительной подкачки данных или, коротко, предподкачки. Их суть заключается в
прогнозировании адресов будущих обращений в память и заблаговременная подкачка данных в
кэш или специальный буфер.
Существующие методы предподкачки можно условно разделить на два типа: программный
и аппаратный. В программных методах, как правило, используется априорный анализ программного кода компилятором и вставка инструкций предподкачки в программу. Аппаратные
же методы, как правило, приспосабливаются к картине запросов по ходу работы программы,
используя для целей прогнозирования обращений их предысторию. Существуют также и комбинированные программно-аппаратные методы, суть которых, в основном, заключается в подсказках аппаратуре, которыми компилятор отмечает обращения в память. Далее мы рассмотрим
принцип действия программных и аппаратных алгоритмов предподкачки и предложим собственный механизм программно-аппаратной подкачки массивов.
1.2. Особенности программных методов предподкачки
В программных методах, как правило, для предварительной подкачки данных используются
«дырки» в обращениях за данными к кэшу: на место обращений, вызывающих промах по кэшу
в программный код, вставляются инструкции предварительной подкачки. Тем самым время
простоя процессора при промахе занимается полезной работой или, иными словами, достигается конвейеризация обращений в память. В программном методе Т.Моури, признанным одним
из наиболее эффективных алгоритмов программной предподкачки, для предсказания промахов
по кэшу используется анализ характера локальности ссылок на данные и соответствующий им
характер переиспользования, если таковое имеется. Т.Моури выделяет три вида локальности:
пространственную, временную и групповую.
Опуская математические выкладки анализа наличия переиспользования, а также характера
локальности ссылок, упомянем лишь, что данный алгоритм одновременно дает и прогноз промаха по кэшу и ответ на вопрос: для какого обращения нужно вставить в программный код инструкцию предподкачки. Используя данное предсказание, компилятор ставит в соответствие
каждой инструкции обращения в память соответствующий ей предикат, который и определяет
факт необходимости заблаговременной подкачки данных.
Каждому типу локальности присущ свой характер промахов при переиспользовании.
Пространственная локальность – это такая локальность данных, при которой текущая
ссылка обращается к различным по локализации данным, попадающим в одну и ту же строку
кэша.
При временной локальности текущая ссылка обращается несколько раз за одними и теми же
данными.
Групповая локальность – такой вид локальности, при которой различные ссылки обращаются в одну и ту же строку кэша.
Т. Моури показывает, что для временной локальности промах, вероятно, вызовет лишь первое обращение. Для пространственной локальности промахи будут наблюдаться при каждом
первом обращении за данными, попадающими в одну и ту же строку кэша. Для групповой локальности промахи будут наблюдаться для каждой ведущей ссылки, то есть такой ссылки, обращения по которой приносят данные для группы других ссылок. И, наконец, если локальности
данных вообще не наблюдается, то можно предположить, что промахи будут возникать при
каждом обращении.
1.3. Особенности аппаратных методов предподкачки
Как уже было сказано выше, аппаратные методы предподкачки подстраиваются под поведение программы во время ее исполнения. Для осуществления аппаратной предподкачки требуются некоторые дополнительные модули. Таковыми могут являться, например, таблица обращений, используемая для хранения предыстории и вычисления прогноза на ее основе, опере29
жающий счетчик команд (ОСК), используемый для априорного просмотра потока команд с
целью выявить обращения, требующие предподкачки, и, собственно, модуль предсказания обращений.
В основу большинства методов аппаратной предподкачки положен алгоритм One Block Lookahead (OBL) - подкачка на один блок вперед - предложенный А. Дж. Смитом. Суть алгоритма
заключается в подкачке (i+1)-го блока данных в момент считывания i-го блока. Для этого модуль предсказания обращений просматривает поток команд, опережая основной счетчик команд процессора с помощью опережающего счетчика команд. По предсказанным обращениям
формируются запросы в память, а полученные данные записываются в кэш. Таким образом, за
счет увеличения трафика в памяти достигается сокращение количества промахов по кэшу. На
практике данный алгоритм в чистом виде теряет свою эффективность для данных, распределенных по памяти с большим шагом, и поэтому используются многочисленные его усовершенствования и модификации.
Заслуживает внимания и другой подход, демонстрируемый Томасом Александром и Гершоном Кедемом в их работе «Разработка распределенного буфера/кэша предподкачки для высокопроизводительных систем памяти». Авторы работы предлагают оригинальную архитектуру
распределенного кэша, в рамках которой в интегральные микросхемы DRAM основной памяти
интегрируются небольшие быстрые SRAM буфера, работающие как обычные прямо адресуемые кэш памяти. В эти небольшие буфера и производится подкачка данных по предсказанным
адресам будущих обращений.
Аналогично программным методам запросы посылаются лишь в моменты промахов по кэшу.
Для выдачи прогноза используется специальный модуль предсказания, который на основании
предыстории обращений, хранящейся в таблице предсказаний, выдает четыре наиболее вероятных адреса подкачки. Подкачка производится по всем четырем адресам параллельно. В случае
неверного прогноза таблица предсказаний корректируется, и одновременно делается следующий
прогноз. Поскольку непосредственное интегрирование маленьких буферов предподкачки в
DRAM память является относительно дешевым, максимально расширена полоса пропускания
между DRAM памятью и SRAM буферами предподкачки. Адреса предсказываются не для элементов, а для целых блоков, по размерам в несколько раз превосходящих строки кэша.
1.4. Достоинства и недостатки способов предварительной подкачки
Достоинством аппаратных методов является то, что они, работая параллельно центральному
процессору, не перегружают систему лишними инструкциями, тогда как в программных методах неизбежен существенный процент неверно спрогнозированных обращений, инструкции
предподкачки для которых создают дополнительную перегрузку процессорного конвейера.
Кроме того, при программном методе внутренняя зависимость элементов одного массива или
перекрестная зависимость элементов разных массивов делает определение вероятности промахов практически невозможным. Таким образом, программный метод позволяет оценить очевидные промахи и часть промахов, связанных с пропускной способностью кэша, но зачастую
бессилен в обработке промахов, связанных с конфликтами обращений зависимых элементов
массивов.
30
В то же время программные методы просты в исполнении и менее зависимы от конкретной
архитектурной реализации, тогда как аппаратные методы существенно дороже и менее гибки,
поскольку опираются, как правило, на определенную картину или несколько разновидностей
картин запросов. В частности, описанная выше архитектура распределенного кэша сильно зависит от повторяемости адресов запросов. Другие алгоритмы зависимы от постоянных шагов
обращений или при использовании ОСК от схем предсказания переходов branch prediction.
Многочисленные экспериментальные исследования показывают, что как программная, так и
аппаратная предподкачки значительно увеличивают вычислительную мощность системы при
работе программ с регулярным доступом к данным. Несколько лучшие результаты показывают
программные методы, однако, учитывая создаваемую ими перегрузку в потоке команд, можно
сделать вывод о достижении весьма близких результатов в обеспечении оптимизации доступа к
данным.
2. Проектирование программно-аппаратной модели предварительной подкачки массивов
2.1.Основные принципы построения модели
При анализе достоинств и недостатков методик предподкачки возникает весьма заманчивая
идея попытаться объединить оба метода в одной архитектуре. Выделение отдельного устройства для целей предподкачки позволит избежать нагрузки на основной поток команд, неизбежной
для программного метода. В то же время анализ зависимостей обращений логично возложить
на компилятор, оставив аппаратному обеспечению обязанность подкачивать вполне конкретные, выявленные программным анализом, данные.
В данной работе предлагается к рассмотрению универсальный программно-аппаратный метод, предназначенный для подкачки элементов массивов. Дополнительное устройство работает
на частоте микропроцессора, его основной целью является скрытие задержек обращения в память при работе с большими массивами данных.
В целях внедрения Устройства предварительной подкачки массивов (Array Access Unit) в
архитектуру подсистемы памяти в системе команд процессора необходимо присутствие команд
предварительной подкачки элементов массивов fapb, а также команд считывания подкачанных
данных mova.
Команды fapb загружаются в специальный буфер инструкций предподкачки (Prefetch Instruction Buffer -PIB) и, циклически повторяясь, работают асинхронно по отношению к основной программе. Подкачанные ими данные помещаются в специальный буфер предварительно
подкачанных массивов (Array Prefetch Buffer - APB), откуда непосредственно перед использованием пересылаются синхронными командами пересылки элементов массивов (mova) в регистровый файл. Таким образом, компилятор, обнаружив в программе регулярный доступ к данным, может реализовать предварительное асинхронное их считывание, забросив операции считывания на достаточное для подкачки расстояние от команд, использующих данные. Далее
можно в коде программы заменить все инструкции загрузки из памяти (load) на инструкции
пересылки данных (mova) из буфера APB. В случае неготовности данных в буфере команда
mova вызывает блокировку конвейера до поступления данных.
Даже в самом худшем случае заметного увеличения задержки по сравнению с непосредственным чтением из памяти не наблюдается, поскольку, как уже упоминалось, устройство работает на частоте процессора, и время пересылки из буфера пренебрежимо мало по сравнению с
временем доступа в память. Кроме того, как правило, к моменту появления команды mova в
конвейере запрос за данными для нее уже выдан ранее, и время доступа уже сокращается на
соответствующее число тактов. Поэтому в подавляющем большинстве случаев доступ к данным с помощью команд mova осуществляется быстрее, чем при непосредственном обращении
к памяти.
2.2. Предлагаемая реализация предварительной подкачки
Каждая асинхронная команда предварительной подкачки в качестве аргументов получает
номер дескриптора массива, индекса и инкремента. Дескриптор массива содержит базовый
31
адрес массива в основной памяти, права доступа и размер массива, используемые для контроля защиты информации. Инкремент задает шаг обращений по памяти, а индекс, модифицируемый инкрементом, в сумме с базовым адресом определяет адрес текущего элемента массива. В
качестве индекса может выступать и элемент другого массива – вторичный индекс (secondary
index), подкачиваемого в буфер. При этом указанный элемент асинхронно пересылается по тем
же каналам, которые используют синхронные команды пересылки mova. Конфликты использования каналов асинхронными и синхронными командами пересылки разрешаются по установленным правилам приоритета. Таким образом, без участия центрального процессора очень
динамично реализуется предподкачка сложных массивов данных типа a[b[c…]].
Следует отметить, что для случаев зависимости данных из различных итераций предусмотрен останов подкачки отдельно для каждой команды. Для этого программист задает значение
регистра расстояний (distance), определяющего количество итераций, на которые асинхронная
подкачка может опережать синхронную пересылку. Команда, временно остановленная по этому критерию или по заполнению области буфера, выделенной ей, отменяется и повторяется в
одном из следующих проходов (как уже было отмечено выше, команды повторяются циклически), когда условие останова для нее снимется.
Все это создает весьма гладкую адаптивность устройства к динамически складывающемуся
характеру обращений в память, а в частности сглаживание старт-стопного режима, характерного для работы с кэшем. Предподкачка возобновляется как только освободится место в буфере
или снимется вышеуказанная зависимость по данным. Сюда следует прибавить то, что в зависимости от ограничений наложенных регистром distance и от величины шагов обращения аппаратура вычисляет возможность подкачки сразу нескольких элементов массива за один запрос,
максимально используя полосу пропускания между APB и основной памятью.
Команды пересылки mova ставятся в соответствие асинхронным командам и пересылают
данные из буфера последовательно, при этом в каждой команде mova содержится признак продвижения указателя считывания. Всякий раз, когда признак продвижения равен единице, указатель считывания перемещается на следующий по порядку элемент массива в буфере APB.
Особые ситуации, возникшие при асинхронной подкачке, запоминаются в устройстве, и их выдача происходит на соответствующей команде mova.
Устройство также имеет в своем составе модуль формирования адресов записи/чтения при
помощи параметров подкачки - дескрипторов, индексов и инкрементов. Данное обстоятельство
существенно разгружает центральный процессор, избавляя арифметические устройства от необходимости вычисления адреса.
2.3. Структурная модель устройства предварительной подкачки массивов
Таким образом, в самом общем виде структурная схема устройства предварительной подкачки массивов выглядит следующим образом:
Prefetch Instruction Buffer – буфер асинхронных инструкций. Загружается при запуске устройства и далее последовательно и циклически выдает асинхронные команды на исполнение.
STORE/LOAD DECODER – дешифратор спецкоманд программного доступа к устройству.
Descriptor, Index, Increment MEMORY – таблица параметров предподкачки: дескрипторов,
индексов, инкрементов.
PREFETCH MODULE – контроллер асинхронной подкачки. Инициирует запросы в память,
осуществляет вычисление режимов подкачки, производит контроль останова команд и запоминание особых ситуаций.
APB – буфер для хранения элементов массивов, работающий на частоте процессора.
MOVE MODULE – контроллер пересылки элементов массивов. Осуществляет формирование адресов назначения по APB, продвижение указателей считывания, выдачу особых ситуаций, а также управление битами значимости APB.
ADRESS MODULE – модуль формирования адресов. Содержит арифметические устройства
формирования адреса записи/чтения. Также производит чтение/запись программно доступной информации устройства.
32
Заключение
Как уже было отмечено выше, достоинством описанного алгоритма является его высокая
адаптивность к динамически изменяющимся условиям подкачки. В частности, особенно выгодно выглядит непрерывность поступления данных в буфер в течение всего времени работы
устройства, поскольку запросы за данными возобновляются, как только для этого появляется
возможность. Автоматическая временная остановка подкачки при достижении программных
или аппаратных ограничений (зависимости по данным или заполнению области) обеспечивает
разумный компромисс между загрузкой подсистемы памяти и необходимой степенью заблаговременности получения данных.
Инновационной идеей является выделение для хранения предварительно подкачанных данных отдельного буфера, а не подкачка данных в кэш. Очевидные недостатки подкачки в кэш –
его «протирка», то есть вытеснение из него полезных данных данными от предподкачек. Кроме того, аналогичным образом, предварительно подкачанные данные могут быть вытеснены в
период существования «окна беззащитности», то есть временем между приходом данных в
кэш и их реальным использованием. Безусловно, алгоритмы, использующие кэш для предподкачек, учитывают данные факты и стремятся их минимизировать, однако устранить указанные
проблемы как класс, без ущерба для одного из механизмов (либо кэширования, либо предподкачки) практически нереально.
Приведенный нами метод асинхронной подкачки массивов полностью устраняет конфликты
предварительно подкачанных данных с данными из кэша. Кроме того, данные в специальном
буфере не замещаются до тех пор, пока не произошло их реальное использование. И, наконец,
отсутствие команд предподкачки в основном потоке команд также значительно разгружает
конвейер.
В настоящий момент производятся испытания на предмет применения предлагаемого программно-аппаратного механизма предварительной подкачки массивов в универсальном микропроцессоре с явно выраженным параллелизмом команд.
33
Литература
1. J.L Baer and T.F Chen. An effective on chip preloading scheme to reduce data access penalty. SuperComputing `91, 1991.
2. А.J. Smith. Cache memories. Computing Surveys, 9 1982.
3. Tolerating latency through software-controlled data prefetching. PhD thesis, Stanford University,
1994
4. Thomas Alexander and Gershon Kedem. Distributed Prefetch-buffer/Cache Design for High Performance Memory Systems. Duke University. Durham, NC 27708, 1996.
34
Download