编写一个代码,它在较新的cpu上比在旧cpu上运行更多cpu循环

时间:2017-07-11 17:03:22

标签: c assembly x86

我正在寻找一个代码,当移动到更新的cpu时会导致性能下降。我知道这在理论上是可行的,但我很难找到可行的例子。

一些限制:

  • 它应该是单线程的

  • 它应该针对i386或oldset x86_64进行编译或者是手写程序集

  • 如果编译它应该静态链接所有库,以便libc无法在运行时加载库的优化版本

  • 时钟周期可以近似为执行时间/最大频率。或者可以使用一些perf工具。这是为了避免一些在4GHz奔腾4上运行速度极快的RISC代码。

我目前的想法是用分支重载指令问题缓冲区,但不知道如何有效地实现它。其他方法是受欢迎的。下沉的方法越多越好。

1 个答案:

答案 0 :(得分:3)

奔腾4有一个双泵ALU,所以几乎任何简单的依赖ALU操作链都会在P4上每个周期执行两个操作,但在所有最新架构上每个周期都有一个操作。

例如:

top:
or eax, eax
or eax, eax
or eax, eax
or eax, eax
...
sub ecx, 1
jnz top

除此之外,(很多)旧架构具有单周期内存访问,后来在少数几个周期内访问,而今天的内存访问是数百个周期。因此,任何依赖于内存延迟的内容通常会在较旧的体系结构上以较少的周期运行。简单的例子是指针追逐循环。

类似地,对于错误预测的分支:旧架构的短(呃)管道意味着错误预测的分支在周期中具有更短的惩罚。这个惩罚可能在P4附近达到顶峰,然后下降到大约15个周期以来一直相对稳定。