Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
编写一个在新cpu上比在旧cpu上运行更多cpu周期的代码_C_Assembly_X86 - Fatal编程技术网

编写一个在新cpu上比在旧cpu上运行更多cpu周期的代码

编写一个在新cpu上比在旧cpu上运行更多cpu周期的代码,c,assembly,x86,C,Assembly,X86,我正在寻找一个代码,这将导致性能下降时,移动到新的cpu。我知道这在理论上是可能的,但我很难找到可行的例子 一些制约因素: 它应该是单螺纹的 它应该为i386或oldset x86_64编译,或者是手写汇编 如果编译,它应该静态链接所有库,这样libc就不能在运行时加载优化版本的库 时钟周期可近似为执行时间/最大频率。或者可以使用一些性能工具。这是为了避免某些RISC代码在4GHz奔腾4s上运行得极快 我目前的想法是用分支重载指令发布缓冲区,但不知道如何有效地实现它。欢迎采取其他办法。提高性

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

一些制约因素:

  • 它应该是单螺纹的

  • 它应该为i386或oldset x86_64编译,或者是手写汇编

  • 如果编译,它应该静态链接所有库,这样libc就不能在运行时加载优化版本的库

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


我目前的想法是用分支重载指令发布缓冲区,但不知道如何有效地实现它。欢迎采取其他办法。提高性能的方法越多越好。

奔腾4有一个双泵ALU,因此几乎任何简单的依赖ALU操作链都会在P4上以每周期两个操作的速度执行,但在所有最新的体系结构上都是每周期一个操作

例如:

top:
or eax, eax
or eax, eax
or eax, eax
or eax, eax
...
sub ecx, 1
jnz top
除此之外,更古老的体系结构有单周期内存访问,后来的访问只需几个周期,而今天的内存访问是数百个周期。因此,任何依赖于内存延迟的东西在较旧的体系结构上运行的周期通常会更少。简单的例子是指针跟踪循环


与预测失误分支类似:较旧体系结构的较短(er)管道意味着预测失误分支的周期惩罚较短。这种惩罚可能在P4附近达到峰值,然后下降到大约15个周期,此后一直相对稳定

if(新的处理器)而(1)哈!这是我见过的最严重的CPUID滥用!你认为P4是一个“更新的CPU”吗?通过同步内存修改和清除缓存,你很有可能在任何未来的架构上都能减慢内存速度,并且随着内存的速度越来越慢,它会感觉到CPU性能的退化(但在绝对时间内,它在未来仍然会更快)。当然还有一些基于
CPUID
返回值的空闲循环。。。。可能会使你的软件在几年内无法使用。我想你可以通过添加一些范围来澄清你的问题,你所说的“新”和“旧”。例如,与5年前、10年前、20年前相比,您对今天的体系结构感兴趣吗?从标题中我很清楚,但你可能也应该澄清你对周期而不是时间的测量很感兴趣(然后你对如何在周期和时间之间转换的澄清是有意义的)。是的,在P4上,ALU链可能加倍快,但一旦你击中一个预测失误的分支(至少一次不可避免),几乎所有的速度优势都将消失。处理器的管道和普雷斯科特上的地球31级一样长。@CodyGray当然:)。没有人认为P4总体上比当前的体系结构好,但是上面的循环几乎可以任意长(更大的主体和/或更大的tripcount),在这一点上,该循环的预测失误惩罚几乎可以任意小。我认为这个例子很有趣,因为它实际上使用了常见的操作,并且在周期和“实时”方面都更快。许多例子,比如在周期中对旧东西的内存访问速度更快,但这仅仅是因为频率非常低,所以在时间测量时,它们不会更快。。。。我也很好奇为什么我们从未见过双泵ALU重新出现。我不认为长管道是双泵ALU的先决条件,但更为正交(事实上,依赖操作的延迟为0.5个周期的事实表明,ALU本身并不是真正的管道化(在传统意义上,我认为存在一些“宽度管道化”)其中,结果的前半部分在第一个循环中输入到下一个操作中,后半部分在下一个循环中输入).我想设计这样的ALU太严格了。我有点惊讶,我们还没有看到它再次出现。P4/Netburst中基本上有两个好主意:双泵ALU和µop缓存。后者进入了Sandy Bridge,但前者仍然是MIA。我想这太贵了。唯一的他们在Netburst中使用双泵ALU的原因是,如果他们希望在任何地方都能获得与P6相近的真实性能,尤其是在早期版本中,他们别无选择。他们不再被迫这样做,所以他们没有。我想,我们现在有更多的内核可供使用。是的,尽管SnB中的uop缓存是quite不同于P4中的跟踪缓存(两者都不比另一个好,但我认为跟踪缓存有更多的玻璃钳口)。我不记得P4的64位变体是否也具有相同的性能?可能是32位操作可行的宽度流水线(使用2链16位ALU)只是对64位操作不起作用(因为对于像
add
这样的操作,实际上需要在一个周期内传播128位)。