Предотвращение или блокирование загрузки кэша данных процессора

0

Мне поручено оценивать различные варианты процессоров ARM (бенчмаркинг), в частности System On the Chip (SOC). У некоторых SOC есть много кэша данных, у других мало. Из-за этого я хочу, чтобы моя программа блокировала кеш данных.

Я написал тест Walking 1, который обращается к памяти за пределами ядра, но от SOC. Я собираюсь запустить это на нашем нынешнем процессоре, который имеет очень мало кеша данных и запускает его на процессоре Cortex M3, который имеет много кэш-памяти данных.

Я сосредотачиваюсь на длительности, чтобы получить память за пределами процессора. Если я задаю размер памяти для Walking 1 размером, большим, чем кеш данных, запустить тест "exponentiates" вовремя. Например, для небольшого размера памяти тест проходит в минутах, для больших размеров памяти тест занимает несколько часов.

Вопрос: Существует ли идиома, которая может быть использована для предотвращения загрузки процессором всего массива в кеш данных процессора?
(Примечание: это помечено как C и C++, потому что у меня есть выбор между языками. Если C не имеет идиомы, но C++ делает, я сначала попробую C++.)

  • Платформа: различные встроенные или система на чипе (платы разработки/оценки), без ОС.
  • Процессор: серия ARM Cortex с различными периферийными устройствами на чипе и различными размерами кеша данных.
  • Компиляторы: IAR Embedded Workbench, GNU C, GNU C++ (используется в фоновом режиме различными поставщиками плат).
  • 0
    Если вы сосредоточены на пропускной способности памяти, то Какой самый быстрый способ скопировать память на Cortex-A8? может быть полезно На самом деле, выборочное отключение кеша может быть несправедливым. Некоторая память (DDR SDRAM) очень хороша для записи больших объемов (например, 8 * 16 бит). Если вы используете меньшие размеры, вы можете сделать передачу памяти неэффективной. То есть некоторые типы памяти лучше работают с кешем, поэтому отключать их может быть несправедливо. Я бы хотя бы протестировал разные размеры чтения / записи с отключенным кешем.
  • 0
    Является ли ваш «нынешний процессор» также М-классом или одной из старых архитектур? Имейте в виду, что у M3 и его друзей нет спроектированных кешей, поэтому любое управление внешними кешами вполне может зависеть от SoC и в целом довольно сильно отличается от архитектур A-класса / предыдущих версий (например, системные регистры с отображением в памяти вместо CP15)
Показать ещё 4 комментария
Теги:
arm
cpu-cache
benchmarking

4 ответа

2
Лучший ответ

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

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0290g/Chdhdahb.html

или, как упоминалось ниже, глобально отключить кеши данных и команд уровня 1 через биты 2 и 12 управляющего регистра c1, к которому осуществляется доступ через регистр сопроцессора 15 = CP 15:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/Babebdcb.html

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/Babgdhif.html

Это предполагает, что ваши ARM-процессоры имеют функциональность CP 15. Могут быть другие контрольные регистры, которые могут быть полезны для ваших тестов. Я не уверен, как это будет сделано на процессорах ARM без функциональности CP 15.

  • 0
    MPU не является обязательным для чипа Cortex-M3. Другие ARM-процессоры могут иметь MMU, и на обоих приложениях с «голым железом» может и не использоваться. Тем не менее, вы правы, что пометка раздела / региона как не кешируемого является одним из способов сделать это.
1

Чтобы избежать изменения таблиц MMU, вы можете просто отключить кеш данных (и ваш кэш L2, если у вас есть 1).

На ARM926EJ-S это делается следующим образом:

// Enable the data cache
FUNC_START_ARM(hal_dcache_enable,r1)
    push    {lr}
    mov     r0,#0
    mcr     p15,0,r0,c7,c6,0            /* invalidate d-cache */
    mrc     p15,0,r1,c1,c0,0
    orr     r1,r1,#0xC
    /* enable DCache and write buffer */
    mcr     p15,0,r1,c1,c0,0
    pop     {lr}
    bx      lr

// Disable the data cache (and invalidate it, required semantics)
FUNC_START_ARM(hal_dcache_disable,r1)
    push    {lr}
1:  mrc     p15,0,r15,c7,c14,3
    bne     1b
    mrc     p15,0,r1,c1,c0,0
    bic     r1,r1,#0xC
    /* disable DCache AND write buffer  */
    mcr     p15,0,r1,c1,c0,0
    mov     r1,#0
    mcr     p15,0,r1,c7,c6,0    /* clear data cache */
    pop     {lr}
    bx      lr

Просто загляните в справочное руководство по архитектуре ARM, чтобы узнать, как отключить d-cache на вашей ARM.

Обязательно следуйте указаниям ARM о недействительности кеша при включении/отключении кеша (это зависит от вашего ядра ARM)

1

Если вы не можете сказать, что сказал @rcglfr, вы можете перебирать данные по размеру строки кэша.

0

Поговорив с коллегами, мы будем хранить тайники данных и инструкций.

Оценка предназначена для улучшения производительности между семейством Cortex и нашим процессором ARM7TDMI. Большая часть улучшений - это кеши.

Итак, чтобы отключить кеши, необходимо использовать язык ассемблера. Не существует языковой идиомы высокого уровня для предотвращения использования ЦП в кеше. ЦП предназначены для наилучшего использования кэшей данных и команд.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню