+-
ARM性能计数器与Linux Clock_GetTime
我正在开发板(ZC702)上使用Zynq芯片,
它具有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 - 乐贴网