Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARM性能计数器与linux时钟\u gettime_Linux_Arm_Performancecounter_Gettime_Time Measurement - Fatal编程技术网

ARM性能计数器与linux时钟\u gettime

ARM性能计数器与linux时钟\u gettime,linux,arm,performancecounter,gettime,time-measurement,Linux,Arm,Performancecounter,Gettime,Time Measurement,我正在开发板(ZC702)上使用Zynq芯片, 它有一个667MHz的双cortex-A9 MPCore和一个Linux内核3.3 我想比较一个程序的执行时间,所以首先使用 时钟获取时间,然后使用协处理器提供的计数器 手臂。计数器每一个处理器周期递增一次。 (基于此和) 我使用-O0标志编译程序(因为我不希望进行任何重新排序或优化) 我使用性能计数器测量的时间是 583833498(周期)/666.666687 MHz=875750.221(微秒) 使用clock_gettime()时(实时、单

我正在开发板(ZC702)上使用Zynq芯片, 它有一个667MHz的双cortex-A9 MPCore和一个Linux内核3.3 我想比较一个程序的执行时间,所以首先使用 时钟获取时间,然后使用协处理器提供的计数器 手臂。计数器每一个处理器周期递增一次。 (基于此和)

我使用-O0标志编译程序(因为我不希望进行任何重新排序或优化)

我使用性能计数器测量的时间是 583833498(周期)/666.666687 MHz=875750.221(微秒)

使用clock_gettime()时(实时、单调或单调) 测量的时间为: 731627.126(微秒) 小于150000微秒

谁能解释一下为什么会这样? 为什么会有区别?处理器没有时钟刻度,怎么可能 通过clock\u gettime测量的执行时间更短?我在下面有一个示例代码:


#定义运行50000000次
#定义基准(val)\
__asm\uuuuuuuuuuuuuuuuuuuuuuuuuuu volatile\uuuuuuuuuuuuuuuuu(“mov r4,%1\n\t”\
“mov r5,#0\n\t”\
“1:\n\t”\
添加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\
“子r4,r4,#1\n\t”\
“cmp r4,#0\n\t”\
“bne 1b\n\t”\
mov%0,r5\n\t\
:“=r”(val)\
:“r”(跑步)\
:“r4”、“r5”\
);
时钟获取时间(时钟单调、原始和开始);
__asm\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;

对于(index=0;indexPOSIX时钟在一定精度范围内运行,您可以通过
clock\u getres
获得该精度。检查150000US的差异是否在误差范围内或之外

在任何情况下,这都不重要,你应该多次重复你的基准测试,不是5次,而是1000次或更多

((end+e1)-(start+e0))/1000
,或

(结束-开始)/1000+(e1-e0)/1000


如果
e1
e0
是误差项,由一个小常数限定,则最大测量误差为
abs(e1-e0)/1000
,随着循环数的增加,这将可以忽略不计。

我找到了解决方案。我将平台从linux内核3.3.0升级到了3.5,其值与性能计数器的值相似。显然,3.3.0中时钟计数器的频率被假定为高于实际频率(约400 MHz)而不是CPU频率的一半。可能是旧版本中的移植错误。

我不需要再运行程序了,因为基准已经是一个循环。我更新了上面粘贴的代码。正如@auselen提到的,getres是1nsec@auselen时钟问题不是我的错,我只是用了主板附带的BSP。我很讨厌我想它会起作用的。