Счетчики производительности ARM против linux clock_gettime
Я использую чип Zynq на плате разработки (ZC702), которая имеет двойной процессор Cortex-A9 MPCore с частотой 667 МГц и поставляется с ядром Linux 3.3. Я хотел сравнить время выполнения программы, поэтому сначала использовал clock_gettime, а затем использовал счетчики предоставлены сопроцессором ARM. Счетчик увеличивается каждый цикл процессора. ( основываясь на этомвопрос о стеке потока а такжеэтот)
Я компилирую программу с флагом -O0 (так как я нене хочу, чтобы какой-либо заказ или оптимизация были сделаны)
Время, которое я измеряю с помощью счетчиков производительности, составляет 583833498 (циклов) / 666,666687 МГц =875750.221 (микросекунды)
При использовании clock_gettime () (либо REALTIME, либо MONOTONIC, либо MONOTONIC_RAW) измеренное время составляет:731627.126 (микросекунды), который является150000 микросекунд меньше ..
Кто-нибудь может объяснить мне, почему это происходит? Почему есть разница? Процессор не масштабируется по часам, как можно получить меньшее время выполнения, измеренное clock_gettime? У меня есть пример кода ниже:
#define RUNS 50000000
#define BENCHMARK(val) \
__asm__ __volatile__("mov r4, %1\n\t" \
"mov r5, #0\n\t" \
"1:\n\t"\
"add r5,r5,r4\n\t"\
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"mov r4 ,r4 \n\t" \
"sub r4,r4,#1\n\t" \
"cmp r4, #0\n\t" \
"bne 1b\n\t" \
"mov %0 ,r5 \n\t" \
:"=r" (val) \
: "r" (RUNS) \
: "r4","r5" \
);
clock_gettime(CLOCK_MONOTONIC_RAW,&start);
__asm__ __volatile__ ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(start_cycles));
for(index=0;index