Мне поручено оценить различные варианты процессоров ARM (бенчмаркинг), в частности, System On a Chip (SOC). У одних SOC много кеша данных, у других мало. Из-за этого я бы хотел, чтобы моя программа блокировала кеш данных.
Я написал тест Walking 1, который обращается к памяти вне ядра, но на SOC. Я собираюсь запустить это на нашем нынешнем процессоре, который имеет очень мало кеша данных, и запустить его на процессоре Cortex M3, который имеет много кэш-памяти данных.
Я сосредоточен на длительности извлечения памяти вне процессора. Если я установлю размер памяти для Walking 1 на размер, превышающий размер кеша данных, то запуск теста «возведет в степень» во времени. Например, для небольшого объема памяти тест выполняется за несколько минут, для больших объемов памяти тест занимает несколько часов.
Вопрос: есть ли идиома, которая может использоваться для предотвращения загрузки процессором всего массива в кэш данных процессора?
(Примечание: это помечено как C и C ++, потому что у меня есть возможность выбирать между языками. Если у C нет идиомы, но у C ++ есть, то я сначала попробую C ++.)
Если ваш компилятор не предоставляет функции для доступа к регистрам защиты областей памяти, вам потребуется выполнить некоторую сборку, чтобы установить области (ы) памяти в не кешируемые:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0290g/Chdhdahb.html
или, как упомянуто ниже, глобально отключить кэш данных и команд первого уровня через биты 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.
Если вы не можете понять, что сказал @rcglfr, вы можете перебрать данные по размеру строки кэша.
Чтобы избежать изменения таблиц 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-кеш на вашем ARM.
При включении / отключении кэша обязательно следуйте рекомендациям ARM о недействительности кэша (это зависит от вашего ядра ARM)
Поговорив с коллегами, мы сохраним кэши данных и инструкций.
Оценка предназначена для повышения производительности семейства Cortex и нашего процессора ARM7TDMI. Большую часть улучшения составляют кэши.
Таким образом, чтобы отключить кэши, необходимо использовать язык ассемблера. Не существует языковой идиомы высокого уровня для предотвращения использования кэша процессором. Процессоры предназначены для наилучшего использования кэшей данных и инструкций.