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

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

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

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

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

  • Платформа: различные встроенные или системы на чипе (разработка /
    оценочные платы), нет ОС.
  • Процессор: серия ARM Cortex с различными периферийными устройствами на чипе
    и разные размеры кеша данных.
  • Компиляторы: IAR Embedded Workbench, GNU C, GNU C ++ (используется в
    фон различными поставщиками платы).

0

Решение

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

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.

2

Другие решения

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

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-кеш на вашем ARM.

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

1

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

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

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector