Продолжаем серию статей, посвященных многоядерным цифровым сигнальным процессорам TMS320C6678. В этой статье будет рассмотрена подсистема памяти ядра.
Архитектура памяти процессора — один из ключевых моментов, напрямую влияющих на его эффективность.
Знание организации архитектуры памяти позволяет разработчику более эффективно использовать ресурсы DSP. Современные процессоры имеют достаточно сложную архитектуру памяти, включающую несколько уровней и контроллеры кэша.
Более того, в случае с DSP работа с памятью осложняется свободой выбора размеров кэш-памяти разных уровней, а для многоядерных процессоров характерна проблема синхронизации кэшей разных ядер.
Содержание
- Введение
- Принципы работы кэш-памяти
- Локальная память программ L1P
- Локальная память данных L1D
- Локальная память L2
- Внутренний контроллер прямого доступа к памяти — IDMA
- Контроллер доступа к внешней памяти
- Контроллер расширения памяти
Введение
Процессоры TMS320C66x имеют иерархическую трехуровневую архитектуру памяти.Иерархическая архитектура памяти позволяет сочетать высокую скорость работы памяти и большой объем доступной памяти.
В своем развитии технология производства памяти несколько отстает от процессорной технологии.
Увеличивается тактовая частота процессорных ядер; Требования к объёму внутренней и внешней памяти также растут. В то же время обеспечить процессор большим объемом памяти, работающей на частоте ядра, оказывается непростой задачей.
Для решения этой проблемы получили широкое развитие иерархические архитектуры памяти, в которых память разделена на несколько уровней.
Небольшая память работает на частоте ядра и представляет уровень L1. Память L2 работает на более низкой частоте, но имеет большую емкость.
И так далее.
Для ускорения работы с низкоуровневой памятью (медленной памятью) быструю память можно частично или полностью настроить как кэш-память.
Архитектура памяти процессоров TMS320C66xx включает:
- внутренняя локальная память программ L1P и память данных L1D, работающие на частоте ядра;
- внутренняя локальная память уровня L2, общая для программ и данных;
- внутренняя память MSM (Multicore Shared Memory), общая для всех ядер, которую можно настроить как память уровня L2 или L3;
- Интерфейс внешней памяти L3.
Далее мы подробнее рассмотрим компоненты архитектуры памяти процессора TMS320C66x.
Рисунок 1 — Подсистема памяти ядра CorePac процессора TMS320C66xx
Термин CorePac относится к одному ядру многоядерного процессора TMS320C66x. Ядро построено в соответствии со структурой, представленной на следующем рисунке 1. Оно включает в себя вычислительные ресурсы C66x, рассмотренные в разделе предыдущая статья и следующие компоненты, относящиеся к подсистеме памяти:
- Контроллер программной памяти уровня L1 (L1P);
- Контроллер памяти данных уровня L1 (L1D);
- Контроллер памяти уровня L2 (L2);
- внутренний контроллер прямого доступа к памяти (IDMA)
- Контроллер доступа к внешней памяти (EMC);
- контроллер расширения памяти (XMC);
Принципы работы кэш-памяти
Прежде чем рассматривать архитектуру памяти процессора TMS320C66x, желательно ознакомиться с основными принципами работы кэша.Кэширование программ и данных имеет основную цель ускорения работы быстрого ядра с большой и медленной памятью.
Ближайшим к ядру, работающим на частоте ядра, является память L1, имеющая небольшой объём.
Далее идет память уровня L2 большего размера, которая обычно работает на половине скорости.
Следующей может быть память уровня L3, L4 и так далее, которая имеет еще больший объем, но работает еще медленнее.
Это может быть общая память многоядерной системы или внешние микросхемы памяти.
Эффективность использования кэша основана на двух фактах – локализации программ и данных во времени и в пространстве памяти (временная и пространственная локальность) [1].
Локальность во времени означает многократное использование одних и тех же программ или данных.
Локальность в пространстве памяти означает, что коды/данные используются группами.
Эти два факта позволяют при обращении к медленной памяти читать из нее запрошенные коды/данные вместе с соседними группами кодов/данных, копировать их в более быструю память, рассчитывая на то, что запрошенные в будущем коды/данные будут уже присутствовать в быстрой памяти.
Группы смежного кода/данных, которые одновременно копируются в кэш, называются строками кэша.
Очевидно, что чем больше размер строки кэша, тем выше эффективность кэша при пространственной локализации кодов/данных; однако это усложняет архитектуру кэша и приводит к уменьшению количества строк кэша, то есть используется меньшая временная локализация кодов/данных.
Размер строки кэша L1P составляет 32 байта.
Интересно, что коды, выполняемые из внешней памяти в процессоре TMS320C66x, всегда кэшируются в L1P. Самая простая схема кэширования — это кэш с прямым отображением.
Вся основная память разделена на фрагменты, размер каждого из которых равен размеру кэша.
Соответственно, кэш в любой момент времени может содержать только один фрагмент основной памяти, либо непересекающиеся части нескольких разных фрагментов.
Коды/данные, расположенные в основной памяти в разных фрагментах, но в соответствующих друг другу строках, не могут одновременно находиться в кэше.
Возникает конфликт кэширования (конфликт промах), что приводит к неэффективной работе кэша.
Основным типом промаха кэша для этого механизма кэширования является промах кэша (промах емкости).
Другой неизбежный вариант неэффективности кэша — принудительный промах.
Это промахи кэша при первом обращении к основной памяти.
Чтобы избежать проблемы нехватки места в кэше в механизмах кэширования с прямым отображением, используются так называемые ассоциативные кэши.
Можно предположить, что в них механизм кеширования с прямым отображением просто дублируется (становится двухвариантным - 2-сторонним), расширяется в 4 раза (четырёхвариантным - 4-сторонним) и так далее.
Соответственно, становится возможным размещение кодов/данных из разных фрагментов и пересекающихся адресов, и чем больше таких пересекающихся кодов/данных можно кэшировать одновременно, тем больше вариантов (способов) поддерживается.
Эта архитектура более мощна, чем кэши с прямым отображением, но ценой большей сложности и стоимости.
Все строки кэша с перекрывающимися адресами, то есть принадлежащие разным путям, называются набором или серией строк кэша (Set).
Когда одну из строк кэша необходимо заменить, по сравнению с другими выбирается путь, который долгое время не использовался.
Это контролируется битом LRU, который является частью строки кэша.
Структура кэша представлена в таблице.
путь1 | путь2 | |
---|---|---|
набор1 | линия0 | линия0 |
набор2 | линия 1 | линия 1 |
набор3 | линия2 | линия2 |
В случае промаха записи (когда ядро записывает в область памяти, которая не отображена в кэше), запись поступает непосредственно в основную память через специальный буфер записи в контроллере памяти.
Кэширование с отложенным возвратом кодов/данных из кэша в основную память (write backcache) означает, что при возникновении попадания записи данные/коды не записываются в основную память, а записываются только в кэш с отметьте, что эта строка кэша является грязной (Dirty), то есть в дальнейшем ее необходимо скопировать в основную память.
При работе с кэшем на DSP TMS320C66xx следует учитывать следующие аспекты.
Память L2 всегда кэшируется в L1; вам просто нужно настроить L1 как кеш.
При кэшировании внешней памяти необходимо дополнительно указать, что и где кэшировать.
При этом коды из внешней памяти всегда кэшируются в L1P. Внешняя память разделена на сегменты по 16 МБ, а их кэшируемость контролируется специальными регистрами управления MAR. Те фрагменты памяти, которые выделены под кэш, не указаны в разделе MEMORY в cmd-файле.
При работе с кэшем неизбежно возникает проблема синхронизации кэша и основной памяти (когерентность кэша).
Согласованность кэша (синхронизация) означает, что содержимое кэша и основной памяти согласовано.
Проблема согласованности кэша возникает всякий раз, когда существует общий ресурс памяти, эта память кэшируется и содержимое памяти изменяется.
Если кэш и основная память имеют разное содержимое, то есть не синхронизированы, то одно из устройств, обращающихся к памяти, может получить доступ к неверным данным.
Процессор C66x обеспечивает автоматическая синхронизация доступ к данным со стороны ядра и со стороны EDMA/IDMA. Когда DMA считывает SRAM L2, данные считываются из кэша L1D и не изменяются в SRAM L2. Когда DMA записывает в L2 SRAM, данные записываются как в L2 SRAM, так и в L1D одновременно.
Автоматическая синхронизация основана на механизме отслеживания.
При доступе по DMA автоматически проверяется кэшируемость кодов/данных в памяти.
Ручная синхронизация (с использованием специальных команд библиотеки CSL) необходим в следующих случаях:
- данные или код записываются во внешнюю память через DMA или из другого внешнего источника, который затем считывается ЦП;
- ЦП записывает данные во внешнюю память, откуда они затем извлекаются DMA или другим устройством;
- DMA записывает коды в SRAM L2, которые затем выполняются ЦП;
- Ядро записывает код в SRAM L2 или внешнюю память, а затем выполняет его.
С периферийного устройства 1 через DMA данные записываются в массив памяти L2 для обработки.
Также через DMA обработанные данные выводятся из памяти L2 через периферию 2. Для разделения обработки, ввода и вывода данных используются две пары пинг-понговых буферов.
При использовании только памяти L2 с кэшированием L1 синхронизация осуществляется автоматически описанным выше способом.
Когда 2 пары пинг-понговых буферов расположены во внешней памяти и проходят через 2 уровня кэша — L2 и L1 — тогда требуется ручная синхронизация.
Перед вводом очередного массива во входной буфер по каналам DMA все строки кэша L1D и L2, ссылающиеся на этот массив, должны быть объявлены недействительными.
Массив будет повторно кэширован, что приведет к издержкам кэша при первом попадании.
Аналогично, прежде чем выходной массив будет отправлен через механизм DMA на периферийное устройство, необходимо синхронизировать память L1D и L2 с внешней памятью — выполнить обратную запись.
Эффективность кэш-памяти — необходимый залог успешной работы всего процессора.
С этой точки зрения особое значение приобретают отладочные средства визуализации кэша.
Функция визуализации кэша поддерживается средой разработки кода Texas Instruments Code Composer Studio для процессоров в окне отображения памяти процессора.
Необходимо дополнительно включить функцию анализа памяти при отображении окна.
Локальная память программ L1P
Память программ уровня L1 (L1P) предназначена только для хранения программных кодов.Размер памяти варьируется от устройства к устройству и для процессора TMS320C6678 составляет 32 КБ.
Память L1P может быть частично настроена как кэш.
При этом размер кэша может составлять 0, 4, 8, 16 или 32 КБ.
Остальная память настроена как обычная оперативная память.
Более высокие адреса L1P выделяются для кэша.
При включении память L1P настраивается либо полностью как ОЗУ, либо с максимальным размером кэша (в зависимости от конкретного устройства).
Сама память L1P не может быть кэширована в других областях кэша.
Запись в память L1P осуществляется только по каналам EDMA или IDMA. То есть запись в память L1P недоступна разработчику, желающему записать в нее что-либо из вычислительного ядра во время выполнения программы.
Обычно при обращении к L1P как к оперативной памяти количество циклов ожидания равно 0, однако максимальное количество циклов ожидания при работе с L1P может достигать 3. Управление памятью L1P осуществляется в режиме кэша через набор регистров.
Размер кэша и другие параметры можно изменить во время выполнения программы.
Опишем подробнее работу L1P в режиме кэша.
В режиме кэширования память L1P представляет собой кэш с прямым отображением.
Этот механизм кэширования является самым простым и чаще всего может приводить к конфликтам при записи в кэш из разных секторов основной памяти.
Очевидно, считается, что такого механизма памяти программ достаточно, поскольку программные коды имеют наибольшую степень локализации в пространстве памяти по сравнению с данными.
Режим заморозки кэша L1P позволяет заморозить в кэше фрагмент кода.
Операции чтения выполняются нормально, а промахи в кэше не меняют содержимое кэша и не делают коды в кэше недействительными.
Защелка L1P полезна при выполнении прерываний.
Из-за кратковременного переключения состояния процессора нет смысла «портить» содержимое кэша.
Глобальную и блочную синхронизацию можно использовать для синхронизации кэша L1P и основной памяти.
Глобальная подразумевает синхронизацию всего объема кэша и выполняется по значимым для всей системы событиям, таким как изменение задачи, изменение режима работы кэша и другие.
Синхронизация предполагает объявление содержимого кэша недействительным (инвалидация) и осуществляется путем установки битов в регистрах управления.
При этом кэш не копируется в основную память, поскольку кэш программы не модифицируется ядром.
Синхронизация блоков подразумевает, что регистр управления кэшем указывает начальный адрес и длину блока кода, который должен быть признан недействительным.
Синхронизация кэша занимает некоторое время.
Поэтому после инициализации синхронизации желательно дождаться завершения синхронизации.
Окончание синхронизации обозначается флагом в регистре управления.
Соответственно, вам нужен код, анализирующий этот флаг, и этот код не должен располагаться в области памяти, зависящей от кеша.
Кэш L1P работает на частоте ядра и в случае попадания в кеш простоев нет, а команды выполняются за один такт (в конвейере).
Однако в случае промаха кэша ситуация сложнее.
Кэш L1P обращается к памяти L2 для получения инструкций.
Время чтения команды оказывается больше, но насколько больше зависит от конкретного состояния конвейера и предсказать сложно.
Зачастую простой конвейера из-за промахов в кэше скрыт (не влияет на выполнение программы) из-за простоя самого командного конвейера.
На TMS320C66x командный конвейер организован таким образом, что время его простоя перекрывается с временем простоя из-за промахов кэша, что позволяет избежать ненужных задержек в процессе выполнения команд. В данном случае бездействие командного конвейера означает, что пакет выборки в большинстве случаев содержит более одного пакета выполнения, а инструкции извлекаются реже, чем выполняются.
Начальные этапы конвейера не считывают следующую команду — они остаются бездействующими до тех пор, пока последующие этапы конвейера не выполнят текущие пакеты.
Таким образом появляется дополнительное время для доступа к памяти на уровне L2 и выше, что позволяет частично или полностью скрыть промахи L1P-кэша.
Эта технология называется конвейерной обработкой промахов кэша (L1P Miss Pipeline).
На C66x пакет выполнения может быть сформирован из двух пакетов выборок.
Однако очевидно, что для хорошо оптимизированных кодов, когда пакеты выборки практически совпадают с пакетами исполнения, такой подход теряет свою эффективность, а промахи в кэше могут существенно задержать процесс выполнения программы.
Ориентировочные значения задержек выполнения из-за промахов кэша для различных состояний конвейера можно найти в документации процессора.
Режим низкого энергопотребления используется для снижения общего потребления процессора в тех случаях, когда это представляет интерес.
Память L1P можно перевести в режим пониженного энергопотребления статически (статическое отключение питания), что означает установку бита управления режимом пониженного энергопотребления; настройка прерывания, которое «разбудит» L1P и выполнение команды IDLE. Память также может переключаться в этот режим динамически (dynamic power-down), что означает автоматический переход при выполнении программы из буфера SPLOOP. Кэш L1P также переходит в режим функционального отключения питания, когда кеш отключен.
То есть, если L1P настроен как кэш, но не активирован, то он находится в режиме пониженного энергопотребления.
Чтение памяти L1P может осуществляться ядром, DMA и IDMA. Все команды включают в себя 2 бита защиты — бит выполнения в режиме пользователя и бит выполнения в режиме администратора.
При чтении команд ядром они всегда анализируются на предмет возможности их выполнения в текущем режиме.
Если они отключены, возникает исключение (в случае чтения ядра) или прерывание (в случае чтения DMA/IDMA).
Кроме того, доступ к регистрам памяти L1P также контролируется контроллером L1P и вызывает исключение, если защищенный регистр читается или записывается.
Доступ на чтение/запись со стороны DMA/IDMA также контролируется разрешениями.
Вы можете настроить разные права доступа к разным страницам памяти.
L1P построен из 16 страниц защиты памяти.
Локальная память данных L1D
Объем внутренней памяти данных L1 составляет до 128 КБ в зависимости от модели процессора, а для TMS320C6678 — 32 КБ ОЗУ.Часть или весь L1D можно настроить как кэш-память.
Кэш L1D — это двусторонний кэш с набором-ассоциативным чтением-распределением и обратной записью.
Смыслы перечисленных понятий были раскрыты выше.
При включении L1D инициализируется либо полностью как ОЗУ, либо с максимальным размером кэша.
Дальнейшая настройка L1D осуществляется через регистры управления.
Кэш работает следующим образом.
32-битный адрес, доступный по адресной шине, имеет структуру, показанную на рисунке.
Рисунок 2 – Структура адреса при доступе к кэшу
Поле смещения — это адрес в пределах одной строки кэша.
Контроллером кэша она игнорируется, так как строка либо находится в кэше, либо не целиком.
Размер строки в 64 байта соответствует размеру поля смещения в 6 бит. Чтобы установить наличие строки в кэше, это поле не нужно.
Поле set определяет набор строк, к которым осуществляется доступ.
Длина заданного поля зависит от размера кэш-памяти и колеблется в пределах 5-14 бит. Поле Tag окончательно определяет адрес линии, к которой осуществляется доступ, с учетом требуемого пути (пути).
Кэш данных, в отличие от памяти программ, может быть изменен ядром процессора.
Поэтому возврат измененных данных из кэша в основную память (write back) происходит либо командой ядра, либо просто автоматически при замене строки кэша новой строкой из основной памяти.
Размер кэша L1D может изменяться динамически.
В режиме фиксации содержимого кэш L1D работает нормально при операциях чтения и записи, а также при промахах записи.
При промахах не меняется только бит LRU. В случае промаха чтения кэш не обновляется.
Команды синхронизации кэша продолжают работать в обычном режиме.
Переход в режим фиксации кэша и обратно осуществляется путем записи в регистры и может осуществляться динамически и довольно быстро.
Кроме того, L1D и L1P часто переводятся в режим фиксации одновременно.
Для этого биты в регистрах управления устанавливаются последовательно.
Программная синхронизация кэша L1D основана на реализации трёх команд:
- признание данных недействительными (аннулирование);
- возврат данных в основную память (обратная запись);
- обе операции одновременно (инвалидация обратной записи).
Чтобы кэш L1D был синхронизирован с памятью L2, модифицируемой DMA, контроллер кэша L1D способен обрабатывать команды синхронизации, поступающие из L2. L2 генерирует команды синхронизации чтения/записи (отслеживающее чтение и отслеживание записи) только в ответ на соответствующую активность контроллера DMA. Команда snoop-read поступает от L2, когда L2 понимает, что строка, запрошенная со стороны DMA, находится в кеше и помечена как измененная (Dirty).
L1D выводит эту строку в L2. Команда snoop-write выдается, когда L2 понимает, что строка, сгенерированная DMA, записана в кэш L1D. При этом не имеет значения, изменилась строка в L1D или нет, она затирается новым значением.
Чтобы уменьшить количество обращений L2 к L1D в целях синхронизации, L2 хранит собственную (теневую) копию тегов кэш-памяти L1D. Эта копия обновляется каждый раз, когда L1D обращается к L2, и используется для обеспечения доступа L2 к нему, а не к самому L1D, чтобы узнать состояние определенных строк кэша.
Если копия тегов сообщает L2, что замену необходимо произвести в L1D, только тогда производится вызов самого L1D. Давайте подробнее рассмотрим структуру памяти L1D. Имеется 8 банков памяти.
Каждый банк имеет ширину одного слова — 4 байта.
Банки однопортовые, то есть к одному банку возможен только один доступ за такт. Два одновременных доступа к одному и тому же банку в разных областях памяти приводят к простою за один такт. Если к одному слову в одном банке идут два обращения, то простоя может не быть, если это два чтения любых байтов в слове; если это две записи разных байтов в слове.
Если доступ идет из ядра и DMA, то даунтайм все равно будет — одно из устройств будет простаивать в зависимости от настроек приоритета.
Если в одном банке есть доступы на чтение и запись к одному слову, то будет даунтайм, даже если байты разные.
Оперативная память и кэш L1D имеют одну и ту же структуру памяти.
Доступ к памяти L1D возможен дважды за такт. Если при доступе не происходит промахов или конфликтов банков памяти, то доступ осуществляется за один такт. Если L1D промахивается, данные извлекаются из L2, а если их нет в L2, то из L3. Если за один цикл происходит 2 обращения к одной и той же строке кэша, которой нет в кэше, то промах вызывает только один цикл простоя.
Аналогично, если два доступа к одной и той же строке кэша происходят последовательно, то только первый промах приведет к простою.
Когда старая строка кэша заменяется новой, ее содержимое возвращается в основную память через специальный буфер (буфер жертвы).
Чтобы замена строк не вызывала дополнительных простоев, старые данные копируются в буфер, а новые данные продолжают считываться, в то время как старые данные возвращаются в основную память в фоновом режиме.
Однако последующие промахи в кэше должны ждать завершения процесса возврата данных.
Если промахи не конфликтуют друг с другом, то они реализуются в конвейере и дополнительных простоев не происходит. Это касается промахов чтения кэша.
Промахи записи могут привести к простою только при определенных обстоятельствах.
Данные, требующие записи в L2, формируют очередь в буфере записи (буфер записи L1D).
L1D реализует архитектуру памяти, в которой промахи записи в кэш вызывают прямой доступ к памяти нижнего уровня (L2) без помещения этих данных в кэш.
Для этой цели используется буфер записи.
Этот буфер имеет размер 128 бит и является 4-портовым, что позволяет одновременно записывать до 4 отдельных данных в L2. Промахи записи приводят к простою только в том случае, если буфер записи заполнен.
Кроме того, полный буфер записи может косвенно увеличить время простоя из-за промаха чтения.
Дело в том, что промахи чтения не обслуживаются до тех пор, пока буфер записи не будет полностью освобожден.
Это необходимо, поскольку данные могут быть прочитаны с того же адреса, по которому выполняется запись, и запись должна завершиться до начала чтения, иначе могут быть прочитаны неправильные данные.
Память L2 работает на частоте в два раза меньшей, чем частота L1. Он обрабатывает запросы из буфера записи на своей частоте.
Кроме того, следует учитывать возможные конфликты между банками памяти.
Вам следует постараться разместить данные из разных банков памяти в буфере записи, чтобы обеспечить одновременное чтение и сократить возможное время простоя.
Два последующих промаха записи объединяются в один и выполняются одновременно при ряде условий, в частности, данные должны располагаться в пределах последовательных 128 бит, оба обращения должны идти в ОЗУ L2 (не в кэш) и ряде других.
Эти условия возникают при большой последовательности операций записи в память или при записи небольшого количества данных в заданную структуру памяти.
Описанный механизм сокращает время простоя процессора при промахах записи и повышает общую эффективность памяти L2. Это важно для программ с большим количеством промахов записи в кэш.
Так же, как и для L1P-памяти, для уменьшения общего времени простоя при промахах кэша организована конвейерная обработка промахов чтения.
Режим пониженного потребления памяти L1D организован аналогично L1P. L1D можно перевести в режим пониженного энергопотребления, когда процессор находится в режиме ожидания.
Для этого перед выполнением инструкции IDLE необходимо записать бит управления в соответствующий регистр и установить прерывания, по которым ядро процессора (в том числе и память) должно проснуться.
Если DMA обращается к памяти L1D, L1P или L2 во время сна ядра, контроллер с низким энергопотреблением (PDC) «пробуждает» все три памяти, а после завершения обслуживания DMA снова переводит их в спящий режим.
Этот режим низкого потребления называется статическим.
Обычно его используют при длительных интервалах сна.
Для защиты памяти L1D доступ к памяти L1D проверяется на доступ в режиме пользователя/администратора и на то, разрешает ли этот режим доступ к этой области памяти.
Если доступ осуществляется к неразрешенным адресам, возникает исключение.
Все доступы с главных устройств (в первую очередь DSP и IDMA) проверяются, а тип исключений различается для внутреннего и внешнего доступа.
Помимо доступа к данным, проверке также подлежат операции синхронизации кэша.
Ручная синхронизация кэша разрешена как в администраторском, так и в пользовательском режиме, однако в пользовательском режиме запрещена глобальная недействительность данных и запрещено изменение размера кэша.
Управление защитой памяти реализовано с помощью набора регистров.
Локальная память L2
Объем памяти L2 находится в диапазоне 64 – 4096 КБ, а у TMS320C6678 – 512 КБ.Для доступа к L2 используется 1 порт шириной 256 бит. Память L2 построена в виде двух физически независимых банков, включающих по 4 суббанка в каждом.
Доступ к каждому банку осуществляется через 128-битную шину.
О том, как одновременный доступ к памяти L2 реализуется контроллерами L1D, L1P и IDMA, будет сказано ниже.
По умолчанию все пространство L2 настроено как ОЗУ.
Далее можно выделить часть памяти под кэш.
Кэш L2 представляет собой 4-канальную кэш-ассоциативную память.
В отличие от кэша L1, кэш L2 представляет собой кэш с кэшированием как чтения, так и записи.
Адрес памяти включает в себя 3 поля — offset (смещение), set (установка) и tag (тег).
Смещение адресует определенный байт в одной строке кэша.
Строки кэша L2 имеют размер 128 байт, поэтому поле смещения выделяется 7 бит. Поле Set указывает номер строки.
Поле «Тег» указывает, к какому пути принадлежит эта строка, и определяет набор атрибутов, например, действительны ли данные или нет, и так далее.
В случае промаха чтения данные считываются из памяти нижнего уровня и одновременно отправляются в память L1. В случае промаха записи соответствующая строка помещается в кэш L2 и записываются новые данные.
Аналогично, кэш L1 L2 — это кэш с необходимостью возврата, то есть модификация кэша L2 не сразу отображается в основную память.
Изменение происходит либо тогда, когда измененная строка кэша заменяется новой строкой, либо принудительно по запросу программного обеспечения от ядра DSP. В этом случае данные возвращаются в основную память через модуль XMC. После общего перезапуска L2 полностью настраивается как ОЗУ.
Во время локального перезапуска настройки кэша сохраняются, но все содержимое помечается как недействительное, а все обращения к памяти задерживаются до завершения сброса.
Размер кэша L2 можно изменить на лету, программно записав необходимые флаги в регистры управления.
В этом случае нужно быть осторожным с синхронизацией кэша.
В руководстве по ядру CorePac представлена необходимая последовательность шагов.
Поддерживается режим кэша с защелкой, аналогичный памяти L1. Также возможна принудительная программная синхронизация кэша L2. Подобно L1, он может быть глобальным или блочным.
Некоторые команды синхронизации также влияют на работу памяти L1. В некоторых случаях оказывается важным отключить кеширование некоторой памяти по определенным адресам.
Регистры атрибутов памяти (MAR) позволяют настраивать кэширование различных диапазонов адресов.
Каждый регистр отвечает за определенный диапазон адресов и включает в себя два управляющих бита.
Один указывает, кэшируется ли данный диапазон адресов или нет. Второй бит указывает, следует ли применять механизм предварительной выборки к данному диапазону адресов или нет. Регистры MAR можно перепрограммировать во время выполнения программы.
В этом случае следует следовать последовательности действий, приведенной в документации [2].
При получении запроса от L1P или L1D к контроллеру памяти L2, если запрошенный адрес отсутствует в L2 (ОЗУ или кэше), контроллер L2 проверяет регистр MAR для этой области памяти.
Если диапазон не кэшируется, запрос рассматривается как «длинное попадание» — данные проходят через L2 и L1D без кэширования (поскольку это некэшируемый диапазон памяти).
Ядро DSP простаивает, ожидая завершения чтения.
L1P кэширует инструкции всякий раз, когда кеш включен, независимо от состояния регистров MAR. Рассмотрим вопросы синхронизации памяти на уровнях L1 и L2. Синхронизация оперативной памяти L2 и кэша L1D поддерживается автоматически.
Синхронизация оперативной памяти L2 и L1P, а также между внешней памятью (внешней для ядер) автоматически не поддерживается.
Теги: #DSP #сигнальные процессоры #TMS320C66x #цифровые сигнальные процессоры #цифровые сигнальные процессоры #многоядерные процессоры #многоядерные процессоры #многоядерный DSP #многоядерный DSP #многоядерный DSP #Программирование микроконтроллеров
-
Автомобильная Электрическая Турбина
19 Oct, 24 -
Приглашаем На Zendcon `09
19 Oct, 24