如何确定CPE:周期每元

如何确定的程序的CPE? 例如,我有一个循环这样的汇编代码:

# inner4: data_t = float # udata in %rbx, vdata in %rax, limit in %rcx, # i in %rdx, sum in %xmm1 1 .L87: # loop: 2 movss (%rbx,%rdx,4), %xmm0 # Get udata[i] 3 mulss (%rax,%rdx,4), %xmm0 # Multiply by vdata[i] 4 addss %xmm0, %xmm1 # Add to sum 5 addq $1, %rdx # Increment i 6 cmpq %rcx, %rdx # Compare i:limit 7 jl .L87 # If <, goto loop

我必须要找到下界通过使用数据类型float关键路径确定的CPE的。 我认为,关键路径将指向最慢的可能的路径,从而将在其中执行程序有,因为占用的时钟周期数最长执行mulss指令。

然而,似乎没有被任何明确的方法来确定CPE。 如果一条指令需要两个时钟周期,前者的第一个时钟周期先后承接一体,可后者的开端? 任何帮助,将不胜感激。 谢谢

--------------解决方案-------------

如果你想知道它是怎么长的需求,你应该衡量它。 执行循环的一些约10 ^ 10次,取它需要的时间和时钟频率倍增。 你的周期由10 ^ 10总计数,除以得到每循环迭代的时钟周期的数目。

的执行时间的理论预测几乎不会是正确的(大部分时间为低),因为是决定速度无数的影响:

  • 流水线(可容易地在管道20级)
  • 超标量执行(并联,最多5指示cmpjl可以是稠合)
  • 解码μOps和重新排序
  • 高速缓存或内存潜伏期
  • 的指令吞吐量(是否有足够的执行端口免费)
  • 的指令延迟
  • 银行的冲突,走样的问题,更深奥的东西

根据不同的CPU,并提供了内存访问全部命中的L1缓存,相信环路应该需要每次迭代至少有3个时钟周期,因为最长的依赖链是三个元素长。 在较慢的较旧的CPU mulssaddss指令所需要的时间增加。

如果你是在加快的代码,不仅一些理论的意见真正感兴趣的,你应该向量化它。 您可以通过4-8的东西的一个因素提高性能类似

.L87: # loop:
vmovdqa (%rbx,%rdx,4), %ymm0 # Get udata[i]..udata[i+7]
vmulps (%rax,%rdx,4), %ymm0, %ymm0 # Multiply by vdata[i]..vdata[i+7]
vaddps %ymm0, %ymm1, %ymm1 # Add to sum
addq $8, %rdx # Increment i
cmpq %rcx, %rdx # Compare i:limit
jl .L87 # If <, goto loop

您需要到水平添加的所有8个元素之后,当然要确保调整为32,循环计数器8整除。

如果您运行的是英特尔的CPU,你可以找到不同的指令延迟和吞吐量的各种CPU一些好的文档。 这里的链接:

英特尔64和IA-32架构优化参考手册

分类:性能 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.498 (s). 10 q(s)