BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #43045同步于 2013/1/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[心得]如何用5行代码计算出arm手机的cpu频率

zxsword
2013/1/20镜像同步6 回复
应领导要求和指点,周五写的一个小东西,分享出来给大家。原理其实很简单,就是for循环然后计时。不过呢,for循环也是有技巧的,例如双发射的流水线该如何处理呢。 五行代码如下: ldr r2, .L26+4 @ tmp155, mov r3, #0 @ tmp145, .L22: add r3, r3, #1 @ i.3, i.2, cmp r3, r2 @ i.4, tmp155 ble .L22 @, r2寄存器中,存着一个大数值为1G。那么1G的cpu应该跑完该循环需要3秒时间。cmp依赖add指令,而ble指令依赖于cmp指令,存在相互依赖关系,所以俨然肯定无法并发,只能在流水线中,一条接着一条来走。3条指令,循环1G次,也就是有3G条指令,那么也就是3G/1G等于3秒时间。 外层再有一个10次的for循环调用该代码,然后time计时,30秒/所记时间即为arm设备的cpu时钟频率。 上面的5行代码,可以用内嵌汇编来写。但由于我不懂arm汇编,所以我先写c代码,然后由gcc生成.S,然后手动删除.S中的若干代码后获得的。我的.c如下: int main() { volatile int i, j; volatile int s = 0; printf("Begin.\r\n"); start_time(); for (j = 0; j < 10; j++) for ( i = 0; i < 1000000000; i++) s++; end_time(); printf("End.\r\n"); return 0; } 最后附上源文件和简易readme 附件(985B) README[upload=3][/upload]
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
zxsword机器人#1 · 2013/1/21
呃呃,a8上在几台设备上测试是通过了。可是a9上测出的频率是真实频率的两倍。看来还是没能解决双发射的问题,猜测a9应该内部是有寄存器别名机制吧,展开了我的循环。
grapland机器人#2 · 2013/1/21
如果你不是裸金属,linux的/proc/cpuinfo应该有你要的东西。 【 在 zxsword 的大作中提到: 】 : 应领导要求和指点,周五写的一个小东西,分享出来给大家。原理其实很简单,就是for循环然后计时。不过呢,for循环也是有技巧的,例如双发射的流水线该如何处理呢。 : 五行代码如下: : ldr r2, .L26+4 @ tmp155, : ...................
zxsword机器人#3 · 2013/1/21
呼呼,cpuinfo里面那个数字大多都是bogomips啦。 话说,我曾写过个内核模块,为不同的进程提供不同的cpuinfo。。。cpuinfo嗯蛮多厂商,实现的不是太严谨,且提供的也多是bogomips。 【 在 grapland 的大作中提到: 】 : 如果你不是裸金属,linux的/proc/cpuinfo应该有你要的东西。 :
iFadeToBlack机器人#4 · 2013/1/22
技术贴nb
tonyjansan机器人#5 · 2013/1/30
a9的板子高出真实频率应该是5级流水线特性造成的吧~ 另外即便是对象都是Armv8也得分别考虑吧~毕竟不同的芯片的流水线设计方案都不完全相同的~像Cortex-A53那种...对外号称是什么8级流水线...真心不知道他们是咋数出8来的... 【 在 zxsword 的大作中提到: 】 : 呃呃,a8上在几台设备上测试是通过了。可是a9上测出的频率是真实频率的两倍。看来还是没能解决双发射的问题,猜测a9应该内部是有寄存器别名机制吧,展开了我的循环。
zxsword机器人#6 · 2013/2/1
唔。我觉的和流水线是完全没有关系的。本来计算频率的原理就是期待一个时钟一条指令,然后据此推算频率。 若是频率高出实际值。那么说明我们的简单的汇编程序被并行执行了,一个时钟周期执行了两条。这和流水线长度是没有关系的。 我们的简单的三条指令,每条指令都是相互依赖的,简单的多发射面对这样的指令可以一个时钟周期发射两条。mov a1 a2; mov a3 a4 ;这就可以双发。 复制粘贴一点别人的文章: 例如: a = b * c d = a + 1 这里的第二条指令需要使用到第一条指令的计算结果,因此必须等待第一条指令完成后才能跑第二条指令,更重要的是,在不少处理器上乘法指令并非一个周期而是需要多个周期才能完成。在遇到这样的情况时,就不能实现多指令发射而且会出现流水线停顿。 ---- 所以,主贴中的代码,根据运行结果,a8是不能双发的,但是a9却是双发的。 再粘一点别人写的文章: 在微架构的寄存器堆里塞进比 ISA 寄存器更多的物理寄存器,透过索引式寄存器堆或者保留站方式,将 ISA 寄存器映射到物理寄存器,从而实现乱序执行。 ARM Cortex-A8、Intel Pentium、Intel Atom(Bonnell 内核)、IBM Cell PPU 都属于顺序执行,它们选择顺序执行的原因主要是为了省电,因为 OoOE 需要大量的晶体管来实现。随着制程的改进,OoOE 的开销会逐渐淡化变得在某些场合里可行,因此像 ARM 从 Cortex-A9、Intel 从 Pentium Pro/Atom(Silvermont 内核)都开始采用 OoOE。 ----- 唔。测出a9板子的频率是其实际频率的两倍,a8测出准确频率的原因。就是寄存器重命名吧。唔,公司一位大牛告诉我说是循环展开了。当然循环展开也是需要寄存器重命名这样的技术来实现的。 下班了要走了,写的比较乱,不好意思。 【 在 tonyjansan 的大作中提到: 】 : a9的板子高出真实频率应该是5级流水线特性造成的吧~ : 另外即便是对象都是Armv8也得分别考虑吧~毕竟不同的芯片的流水线设计方案都不完全相同的~像Cortex-A53那种...对外号称是什么8级流水线...真心不知道他们是咋数出8来的... :