+-
我正在开发板(ZC702)上使用Zynq芯片,
它具有667MHz的双cortex-A9 MPCore,并带有 Linux内核3.3
我想比较一个程序的执行时间,所以首先
clock_gettime,然后使用协处理器提供的计数器
的ARM.计数器每一个处理器周期递增一次.
(基于此 question of stackoverflow和 this)
它具有667MHz的双cortex-A9 MPCore,并带有 Linux内核3.3
我想比较一个程序的执行时间,所以首先
clock_gettime,然后使用协处理器提供的计数器
的ARM.计数器每一个处理器周期递增一次.
(基于此 question of stackoverflow和 this)
我用-O0标志编译程序(因为我不想完成任何重新排序或优化)
我用性能计数器衡量的时间是
583833498(周期)/ 666.666687 MHz = 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<5;index++)
{
BENCHMARK(i);
}
__asm__ __volatile__ ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(end_cycles));
clock_gettime(CLOCK_MONOTONIC_RAW,&stop);
最佳答案
我找到了解决方案.我将该平台从Linux内核3.3.0升级到3.5,该值类似于性能计数器的值.显然,假定3.3.0中的时钟计数器频率高于其频率(大约400 MHz),而不是CPU频率的一半.在旧版本中可能是移植错误.
点击查看更多相关文章
转载注明原文:ARM性能计数器与Linux Clock_GetTime - 乐贴网