回答
有各种各样的原因,为什么同一种操作可以在现代处理器上有大量不同的性能。
数据缓存缺失: 如果您的操作访问内存,它可能会去缓存在一个位置和其他地方产生高速缓存未命中。高速缓存未命中可以按照循环周期顺序执行,而简单的操作通常在几个周期内执行,所以这会使其慢得多。
流水线停顿: 现代CPU通常流水线,所以指令(或一个以上)可被调度每个循环中,但它们通常需要一个以上的周期,直到结果是可用的。您的操作可能取决于另一个操作的结果,该操作在计划操作时未准备好,因此CPU必须等待生成结果的操作完成。
指令高速缓存未命中: 指令流也被缓存,所以你可能会发现其中的一个位置CPU产生高速缓存未命中每次encounteres该位置(不太可能的事情,这将需要检测的时间的情况尽管运行时间的数量,指令缓存并不那么小)。
分支预测失误: 另一种流水线失速。 CPU将尝试预测条件跳转将以何种方式进行,并推测性地执行该执行路径中的代码。如果它是错误的,它必须放弃这个推测性执行的结果,并从另一条路径开始。这可能会显示在探查器中另一路径的第一行。
资源竞争:该操作可能不会依赖一个不avalible结果,但需要执行单元可能仍然被其他指令(占据一些指令是不是所有的处理器完全流水线,也可能是因为一些一种超线程或推土机共享FPU)。再次,CPU可能必须停止,直到设备空闲。
页面错误:应该很明显。基本上是类固醇缓存小姐。如果访问的内存必须从磁盘重新加载它会花费周期
...成千上万的:这样的例子不胜枚举,但是提点最有可能使我的opionon产生影响的那些。
我假设你问的是完全相同的指令应用于相同的操作数。
可能会产生巨大性能影响的一个可能原因是,操作数是否在CPU高速缓存中可用,或者是否必须从主RAM中获取操作数。
这只是一个例子;还有很多其他潜在的原因。对于现代的CPU,通过查看代码很难弄清楚给定指令需要多少个周期。
这个问题很模糊,但一般在一个现代化的CPU,你不能指望操作具有恒定的执行时间,因为很多因素会影响这一点,包括但不限于:
- 分支预测故障
- 高速缓存未命中
- 流水线
- ...
+1,不要忘记交换文件。 – sharptooth
我喜欢我的AVR,其中'mul'总是需要相同的周期数。哦,等等..它没有'mul'。 –
@ noah1989:不要尝试图片asm。它使AVR看起来很棒。 – 111111
- 在剖析器中,例如,我看到“mulps%xmm11,%xmm5”。我想这是在寄存器
xmmXX是SSE指令的数据。 mulps是精确单数,它取决于您是否将SSE乘法与正常标量乘法进行比较。在这种情况下,这是可以理解的。
我们确实需要更多信息才能更好地回答一大堆asm和您的配置文件数据。
如果只是这个指令很慢?或一块指令,也许它从未对齐的内存中加载,或者你得到缓存未命中,管道危险和其他许多可能性。
- 1. “汇编”与“汇编程序”
- 2. x86 intel操作码汇编
- 3. 汇编程序
- 4. 8086汇编程序 - 从操作码生成目标代码
- 5. 8086汇编程序如何将标签转换为操作码?
- 6. 程序的汇编和执行 - 两遍汇编程序
- 7. 汇编8086程序
- 8. NASM汇编程序
- 9. GNU汇编程序编译错误'inline asm中的无效操作数'
- 10. x86汇编程序 - 系统时间的文件名
- 11. 汇编:编译COM程序
- 12. 汇编语言86:胶印间接操作的一个结构
- 13. 微软汇编程序转换为GNU汇编程序
- 14. C++中的汇编程序
- 15. 操作系统的编译时间
- 16. 汇编/拆卸指令操作数
- 17. imul汇编指令 - 一个操作数?
- 18. div操作换行(x86汇编)
- 19. 汇编语言符号操作代码
- 20. 了解汇编堆栈操作
- 21. 反汇编C代替操作代码
- 22. 汇编语言操作数说明符
- 23. 如何操作位汇编语言MIPS32
- 24. 每个操作系统是否都有自己的汇编程序?
- 25. 不明白汇编程序
- 26. 运行汇编程序
- 27. 构建汇编程序
- 28. 汇编程序:递归?
- 29. 闰年NASM汇编程序
- 30. 汇编程序安装
您是否有更具体的例子,您是否使用x86(_64?)?这有点含糊。这个问题更多的是关于微代码架构的问题。例如,您正在注册两个注册表或两个存储位置。这是你第一次在一段时间内使用变量导致缓存未命中,因为它是L(1-3)缓存。 – 111111
64.在profiler中,例如,我看到“mulps%xmm11,%xmm5”。我想这是寄存器中的数据。 – klm123
正确的如果我错了,但xmmXX是SSE寄存器,它正在执行该操作多达4个浮点数或一次2个双精度浮点数 – 111111