我在開發板上使用Zynq芯片(ZC702), ,它具有667MHz的雙cortex-A9 MPCore並帶有一個Linux內核3.3 我想比較執行時間一個程序首先使用了clock_gettime,然後使用了ARM的協處理器 提供的計數器。計數器每增加一個處理器週期。 (在此基礎上question of stackoverflow和this)ARM性能計數器vs linux clock_gettime
我編譯程序用-O0標誌(因爲我不想做任何重新排序或優化)
我與性能計數器測量的時間是 583833498(週期)/ 666.666687兆赫= 875750.221(微秒)
在使用clock_gettime()(或者實時或單調或MONOTONIC_RAW) 測量的時間是: 731627.126(微秒) 這是微秒少..
任何人能解釋我爲什麼會這樣? 爲什麼會有差異?處理器不會進行時鐘縮放,如何通過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<5;index++)
{
BENCHMARK(i);
}
__asm__ __volatile__ ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(end_cycles));
clock_gettime(CLOCK_MONOTONIC_RAW,&stop);
@auselen這不是我的錯,因爲時鐘問題,我只是使用板附帶的BSP。我認爲它會工作。 – akarapatis