- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
循环 ( Intel ref manual entry )减少 ecx/rcx,and then jumps if non-zero 。虽然速度很慢,但英特尔难道不能以低廉的成本让它变得更快吗? dec/jnz
已经macro-fuses into a single uop关于桑迪布里奇家族;唯一的区别是设置标志。
loop
关于各种微架构,来自 Agner Fog's instruction tables :
K8/K10:7 次操作
Bulldozer 系列/Ryzen:1 m-op(与宏融合测试和分支的成本相同,或 jecxz
)
P4:4 uops(与 jecxz
相同)
P6(PII/PIII):8 uops
Pentium M、Core2:11 uops
Nehalem:6 uops。 (11 表示 loope
/loopne
)。吞吐量 = 4c ( loop
) 或 7c ( loope/ne
)。
SnB 系列:7 uops。 (11 表示 loope
/loopne
)。 吞吐量 = 每 5 个周期一个,这与将循环计数器保留在内存中一样是瓶颈! jecxz
仅 2 uop,吞吐量与常规 jcc
相同
西尔弗蒙特:7 uops
AMD Jaguar(低功耗):8 uops,5c 吞吐量
通过 Nano3000:2 uops
解码器不能像lea rcx, [rcx-1]
一样解码吗/jrcxz
?那将是 3 uop。至少在没有地址大小前缀的情况下是这样,否则它必须使用 ecx
并截断RIP
至EIP
如果进行跳跃; 也许控制递减宽度的地址大小的奇怪选择解释了许多微指令?(有趣的事实: rep
-string 指令与使用 ecx
和 32 位地址具有相同的行为-尺寸。)
或者更好,只是将其解码为不设置标志的融合十进制分支? dec ecx
/jnz
SnB 上解码为单个 uop(它确实设置了标志)。
我知道真正的代码不会使用它(因为至少从 P5 或其他东西开始它就很慢),但 AMD 认为让 Bulldozer 变得更快是值得的。可能是因为这很容易。
<小时/>SnB家族的uarch是否容易快速loop
?如果是这样,他们为什么不呢?如果不是,为什么这么难?很多解码器晶体管?或者融合 dec&branch uop 中的额外位来记录它没有设置标志?那 7 个 uop 能做什么?这是一个非常简单的指令。
推土机有什么特别之处,快速loop
容易/值得吗?或者AMD是否浪费了一堆晶体管来制造loop
快速地?如果是这样,想必有人认为这是个好主意。
如果loop
速度很快,非常适合 BigInteger arbitrary-precision adc
loops, to avoid partial-flag stalls / slowdowns (请参阅我对我的答案的评论),或者您想要循环而不触及标志的任何其他情况。与 dec/jnz
相比,它还具有较小的代码大小优势。 。 (和 dec/jnz
仅 SnB 系列上的宏熔断器)。
在现代 CPU 上 dec/jnz
在 ADC 循环中正常,loop
对于 ADCX/ADOX 循环来说仍然很好(以保留 OF)。
如果loop
速度很快,编译器已经将其用作 CPU 上代码大小和速度的窥孔优化,而无需宏融合。
这并不能阻止我对使用 loop
的糟糕 16 位代码的所有问题感到恼火。对于每个循环,即使它们还需要循环内的另一个计数器。但至少不会那么那么糟糕。
最佳答案
1988年,IBM院士Glenn Henry他刚刚加入戴尔,当时该公司有几百名员工,在上任的第一个月,他就 386 内部结构进行了一次技术演讲。我们一群 BIOS 程序员一直想知道为什么 LOOP 比 DEC/JNZ 慢,所以在问答部分有人提出了这个问题。
他的回答很有道理。它与分页有关。
LOOP由两部分组成:递减CX,如果CX不为零则跳转。第一部分不能导致处理器异常,而跳转部分可以。其一,您可能会跳转(或失败)到段边界之外的地址,从而导致 SEGFAULT。对于两个,您可以跳转到已换出的页面。
SEGFAULT 通常意味着进程的结束,但页面错误则不同。当发生页面错误时,处理器会抛出异常,操作系统会进行内务处理,将页面从磁盘交换到 RAM 中。之后,它重新启动导致故障的指令。
重新启动意味着将进程的状态恢复到有问题的指令之前的状态。特别是在 LOOP 指令的情况下,它意味着恢复 CX 寄存器的值。有人可能认为您只需将 CX 加 1 即可,因为我们知道 CX 会递减,但显然,事情并没有那么简单。例如,查看这个erratum from Intel :
The protection violations involved usually indicate a probable software bug and restart is not desired if one of these violations occurs. In a Protected Mode 80286 system with wait states during any bus cycles, when certain protection violations are detected by the 80286 component, and the component transfers control to the exception handling routine, the contents of the CX register may be unreliable. (Whether CX contents are changed is a function of bus activity at the time internal microcode detects the protection violation.)
为了安全起见,他们需要在 LOOP 指令的每次迭代中保存 CX 的值,以便在需要时可靠地恢复它。
正是这种保存 CX 的额外负担使得 LOOP 如此缓慢。
与当时的其他公司一样,英特尔也在采用越来越多的 RISC。旧的 CISC 指令(LOOP、ENTER、LEAVE、BOUND)正在被逐步淘汰。我们仍然在手工编码的汇编中使用它们,但编译器完全忽略了它们。
关于performance - 为什么循环指令很慢?英特尔就不能有效地实现它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742570/
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 8年前关闭。 Improve t
暂时忘记能力的定义,只关注能力的“检查”(使用“授权!”),我看到 CanCan 添加了大约 400 毫秒,用于简单地检查用户是否具有特定的能力主题/模型。 这是预期的吗(我假设不是)?或者,有没有可
我正在阅读有关 Swift 的教程 ( http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start ),它预定义为不显式设置类型,因
这主要是由于对 SQL 问题的回答。由于性能原因,有意省略了 UDF 和子查询。我没有包括可靠性并不是说它应该被视为理所当然,但代码必须工作。 性能永远是第一位的吗?提供了许多以性能为主要优先事项的答
我已经编写了一个简单的测试平台来测量三种阶乘实现的性能:基于循环的,非尾递归的和尾递归的。 Surprisingly to me the worst performant was the loop o
我已将 ui-performance 插件应用到我的应用程序中。不幸的是,在开发模式下运行应用程序时它似乎不起作用。例如,我的 javascript 导入是用“vnull”版本呈现的。 例如 不会
我有一个我操作的 F# 引用(我在各处添加对象池以回收经常创建和删除的短期对象)。我想运行结果报价;现在我使用了 F# PowerPack,它提供了将引用转换为表达式树和委托(delegate)的方法
我正在尝试在 Spark 服务器上运行 SparklyR 库中的机器学习算法。 1 个簇 8 核 24G内存 Ubuntu 16.04 星火2.2 独立配置 1名师傅/2名 worker 每个执行器的
我有一个数据库(准确地说是在 postgres 上运行),具有以下结构: user1 (schema) | - cars (table) - airplanes (table, again) .
我的应用程序在我的 iPad 上运行。但它的表现非常糟糕——我的速度低于 15fps。谁能帮我优化一下? 它基本上是一个轮子(派生自 UIView),包含 12 个按钮(派生自 UIControl)。
在完成“Scala 中的函数式编程原则”@coursera 类(class)第 3 周的作业时,我发现当我实现视频类(class)中所示的函数联合时: override def union(tha
我正在重构我的一个 Controller 以使其成为一项服务,我想知道不将整个服务容器注入(inject)我的 Controller 是否会对性能产生影响。 这样效率更高吗: innova.path.
我有一个要显示的内容很大的文件。例如在显示用户配置文件时, 中的每个 EL 表达式需要一个 userId 作为 bean 的参数,该参数取自 session 上下文。我在 xhtml 文件中将这个 u
我非常了解 mipmapping。我不明白(在硬件/驱动程序级别)是 mipmapping 如何提高应用程序的性能(至少这是经常声称的)。在执行片段着色器之前,驱动程序不知道要访问哪个 mipmap
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: What's the (hidden) cost of lazy val? (Scala) Scala 允许定义惰
一些文章建议现在 build() 包含在 perform() 本身中,而其他人则建议当要链接多个操作时使用 build().perform()一起。 最佳答案 build() 包含在 perform(
Postgres docs说 For best optimization results, you should label your functions with the strictest vol
阅读Zero-cost abstractions看着 Introduction to rust: a low-level language with high-level abstractions我尝
我想在 MQ 服务器上部署 SSL,但我想知道我当前的 CPU 容量是否支持 SSL。 (我没有预算增加 CPU 内核和 MQ PVU 的数量) 我的规范: Windows 2003 服务器 SP2,
因此,我在 Chrome 开发者工具 的性能 选项卡内的时间 部分成功地监控了我的 React Native 应用程序的性能。 突然在应用程序的特定重新加载时,Timings 标签丢失。 我已尝试重置
我是一名优秀的程序员,十分优秀!