Мне поручено оценивать различные варианты процессоров ARM (бенчмаркинг), в частности System On the Chip (SOC). У некоторых SOC есть много кэша данных, у других мало. Из-за этого я хочу, чтобы моя программа блокировала кеш данных.
Я написал тест Walking 1, который обращается к памяти за пределами ядра, но от SOC. Я собираюсь запустить это на нашем нынешнем процессоре, который имеет очень мало кеша данных и запускает его на процессоре Cortex M3, который имеет много кэш-памяти данных.
Я сосредотачиваюсь на длительности, чтобы получить память за пределами процессора. Если я задаю размер памяти для Walking 1 размером, большим, чем кеш данных, запустить тест "exponentiates" вовремя. Например, для небольшого размера памяти тест проходит в минутах, для больших размеров памяти тест занимает несколько часов.
Вопрос: Существует ли идиома, которая может быть использована для предотвращения загрузки процессором всего массива в кеш данных процессора?
(Примечание: это помечено как C и C++, потому что у меня есть выбор между языками. Если C не имеет идиомы, но C++ делает, я сначала попробую C++.)
Если ваш компилятор не предоставляет функции для доступа к регионам защиты области памяти, вам необходимо выполнить некоторую сборку, чтобы установить область (области) памяти в не кэшируемую:
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.
Чтобы избежать изменения таблиц 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)
Если вы не можете сказать, что сказал @rcglfr, вы можете перебирать данные по размеру строки кэша.
Поговорив с коллегами, мы будем хранить тайники данных и инструкций.
Оценка предназначена для улучшения производительности между семейством Cortex и нашим процессором ARM7TDMI. Большая часть улучшений - это кеши.
Итак, чтобы отключить кеши, необходимо использовать язык ассемблера. Не существует языковой идиомы высокого уровня для предотвращения использования ЦП в кеше. ЦП предназначены для наилучшего использования кэшей данных и команд.