Счетчики производительности 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

Ответы на вопрос(2)

Ваш ответ на вопрос