Измерьте время доступа к кэшу для ARM Cortex-A15

Поэтому я измерил циклы доступа к кэшу L2 ARM Cortex-A15.
Я сделал это, выделив один байт и

  • сделать адрес недействительным
  • читать регистр PMCCNTR
  • доступ к расположению памяти выделенного байта с помощью ldr
  • прочитайте регистр PMCCNTR снова
  • вычесть первое измерение из второго

Я получил около 240 циклов для кэшированного доступа и ~ 350 для некэшированного доступа.
Я также использовал ISB, DMB и DSB. Эти цифры кажутся вам точными? Не могу найти официальных ресурсов для сравнения. Может быть, вы можете указать мне в правильном направлении.

1

Решение

Вы не измеряете задержку с вашим подходом, вы измеряете накладные расходы.

Стандартный подход к измерению задержек состоит в том, чтобы использовать тест погони за указателями, инициализировать цепочку указателей, чтобы получить зависимый доступ, и контролировать их размещение таким образом, чтобы они помещались (или не помещались) в кэши заданных размеров. Остальная часть процедуры та же самая, за исключением того, что вы ничего не аннулируете.

Как то так (для иллюстрации не проверено)

// prepare a chain of N pointers in a buffer
// Assume unsigned int has the same size as a pointer
unsigned int Buffer[N] ;

// chain them, here in a simple direct fashion.
// You can also use a randomized sequence if you work in main memory
for (i=1; i<N; i++) { Buffer[i] = (unsigned int) &(Buffer[i-1]) ; }

// close the chain
Buffer[0] = (unsigned int) &(Buffer[N-1]) ;

// measure M accesses
Start =  PMCCNTR() ;
p = &(Buffer[0]) ;
for (i=M; i>0; i--) {
p = *p;
}
Stop = PMCCNTR();
3

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

Измерение однократного доступа подвергается неточности из-за измерения накладных расходов и случайных помех. Вы должны измерить время для большого количества обращений, чтобы получить амортизированную задержку, которая лучше отражала бы то, что вы хотите. Чтобы измерить среднее время доступа, вам также необходимо убедиться, что эти обращения не выполняются параллельно (это будет измерять пропускную способность, а не задержку), поэтому добавьте некоторую ложную зависимость, например добавление содержимого ранее обращенного байта к следующему адресу (после инициализация всех этих байтов в нули).

Кроме того, вы не сказали, как считали адрес недействительным, но я предполагаю, что вы также выбросили его из L2 и фактически измеряете только задержку памяти.

2