gpt4 book ai didi

performance - 如何判断CPE : Cycles Per Element

转载 作者:行者123 更新时间:2023-12-04 03:06:40 26 4
gpt4 key购买 nike

如何确定类(class)的 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 并重新排序
  • 缓存或内存的延迟
  • 指令的吞吐量(是否有足够的执行端口可用)
  • 指令的延迟
  • Bank 冲突、别名问题和更多深奥的问题

根据 CPU 并假设内存访问全部命中 L1 缓存,我认为循环每次迭代至少需要 3 个时钟周期,因为最长的依赖链有 3 个元素长。在具有较慢的 mulssaddss 指令的旧 CPU 上,所需时间会增加。

如果您真的对加速代码感兴趣,而不仅仅是一些理论观察,您应该对其进行矢量化。您可以使用类似的东西将性能提高 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 整除。

关于performance - 如何判断CPE : Cycles Per Element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com