Несоответствующие значения счетчика циклов ARM PMU - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь измерить производительность моего кода в ядре Linux с помощью pmu. Прежде всего я хочу протестировать pmu, поэтому создал простой цикл парных операций в ядре. Я поместил его под блокировку вращения с отключенными прерываниями, чтобы мой тестовый код не мог быть выгружен. Затем я напечатал счетчик циклов, чтобы проверить, сколько циклов ЦП занимает этот цикл. Но я вижу очень разные значения на каждом отпечатке: 100, 500, 1000, 200, ... Мой вопрос: почему я каждый раз вижу такие разные значения? PS: в счетчике счетчика циклов счетчик команд pmu стабилен, и я каждый раз вижу одни и те же значения. Я также попытался использовать таймер постановки на охрану, но он также показывает разные значения, подобные счетчику цикла pmu. Вот как я использую таймер ARM для измерения производительности:

unsigned long long ticks_start, ticks_end;
int i = 0, j;
unsigned long flags;

spin_lock_irqsave(&lock, flags);
while (i++ < 100) {
   j = 0;
   asm volatile("mrs %0, CNTPCT_EL0" : "=r" (ticks_start)); 
   while (j++ < 10000) {
      asm volatile ("nop");
   }
   asm volatile("mrs %0, CNTPCT_EL0" : "=r" (ticks_end));
   printk("ticks %d are: %llu\n", i, ticks_end - ticks_start);
}
spin_unlock_irqrestore(&lock, flags);

и вывод на реальном устройстве (кортекс A-57):

...
ticks 31 are: 2287
ticks 32 are: 2287
ticks 33 are: 2287
ticks 34 are: 1984
ticks 35 are: 457
ticks 36 are: 1604
ticks 37 are: 2287
...

1 Ответ

1 голос
/ 28 октября 2019

Для использования таких вещей, как таймеры и PMU на Arm, вы должны вставить инструкцию isb перед чтением регистра PMU. Архитектура разрешает процессору спекулятивно читать регистр рано или поздно, поскольку он не зависит от вашего внутреннего цикла nops.

Так что попробуйте следующее:

asm volatile("isb; mrs %0, CNTPCT_EL0" : "=r" (ticks_end));

isb очистит конвейер перед тем, как продолжить выполнение инструкции mrs. Возможно, что процессор также термически дросселирует, но это не должно повлиять на ваши измерения с использованием счетчика циклов, но это произойдет, если вы читаете общий таймер для измерения времени.

...