Я пытаюсь измерить производительность моего кода в ядре 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
...