返回信息流我想知道加减乘除四则运算,取模,取整数等运算速度快慢排序?
网上查到在现代的浮点运算单元中,乘法大约是加法的5倍,为什么?
有论文解释最好。
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #96552同步于 2018/9/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
请教一个问题:加减乘除四则运算,取模,取整数等运算速度快慢
forJS
2018/9/18镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
差不多吧。整数运算的话,加减的吞吐率最高延迟最低,乘的吞吐率和延迟稍差一点,除和模非最差。浮点运算也差不多。
现代的超标量流水线构架,每个周期能执行很多条指令,但不同的执行单元数量不一样多,所以不同种类的运算执行速度也不一样。如果有多个计算加减、位运算的单元的话,一个周期能执行两条或者更多条加法运算,也是可能的。有的指令,比如内存读,或许可以两个地址一起读,但内存本身有延迟,即使在L1 cache里,也可能要4个周期之后才能读到。还有指令译码、指派等等,skylake cpu一个周期可以解码5条指令,同时会有几百条指令“待执行”,甚至能在if判断还没结束之前,就预先帮你执行then和else两个分支的程序,然后if判断确定是true还是false以后,再放弃其中一个分支的结果,保留成立的分支。总之现代的CPU是个很神奇的东西。
有好事者长期以来在不断利用自己的业余时间测量x86各个微构架的CPU(有AMD的k6,k7,..也有intel的pentium到skylake(第6代酷睿),也有via的芯片)的各个指令的延迟和吞吐率。如果关心每个指令用多少时间,看这个最好了。
PDF版: http://www.agner.org/optimize/instruction_tables.pdf
ODS版: https://www.agner.org/optimize/instruction_tables.ods (用libreoffice calc打开,也可以试试microsoft excel行不行)
p.s. 这是skylake的大致原理图。可以欣赏一下:
膜暖神
【 在 nuanyangyang 的大作中提到: 】
: 差不多吧。整数运算的话,加减的吞吐率最高延迟最低,乘的吞吐率和延迟稍差一点,除和模非最差。浮点运算也差不多。
:
: 现代的超标量流水线构架,每个周期能执行很多条指令,但不同的执行单元数量不一样多,所以不同种类的运算执行速度也不一样。如果有多个计算加减、位运算的单元的话,一个周期能执行两条或者更多条加法运算,也是可能的。有的指令,比如内存读,或许可以两个地址一起读,但内存本身有延迟,即使在L1 cache里,也可能要4个周期之后才能读到。还有指令译码、指派等等,skylake cpu一个周期可以解码5条指令,同时会有几百条指令“待执行”,甚至能在if判断还没结束之前,就预先帮你执行then和else两个分支的程序,然后if判断确定是true还是false以后,再放弃其中一个分支的结果,保留成立的分支。总之现代的CPU是个很神奇的东西。
mark
【 在 nuanyangyang 的大作中提到: 】
: 差不多吧。整数运算的话,加减的吞吐率最高延迟最低,乘的吞吐率和延迟稍差一点,除和模非最差。浮点运算也差不多。
:
: 现代的超标量流水线构架,每个周期能执行很多条指令,但不同的执行单元数量不一样多,所以不同种类的运算执行速度也不一样。如果有多个计算加减、位运算的单元的话,一个周期能执行两条或者更多条加法运算,也是可能的。有的指令,比如内存读,或许可以两个地址一起读,但内存本身有延迟,即使在L1 cache里,也可能要4个周期之后才能读到。还有指令译码、指派等等,skylake cpu一个周期可以解码5条指令,同时会有几百条指令“待执行”,甚至能在if判断还没结束之前,就预先帮你执行then和else两个分支的程序,然后if判断确定是true还是false以后,再放弃其中一个分支的结果,保留成立的分支。总之现代的CPU是个很神奇的东西。
膜[ema23]
【 在 nuanyangyang 的大作中提到: 】
: 差不多吧。整数运算的话,加减的吞吐率最高延迟最低,乘的吞吐率和延迟稍差一点,除和模非最差。浮点运算也差不多。
:
: 现代的超标量流水线构架,每个周期能执行很多条指令,但不同的执行单元数量不一样多,所以不同种类的运算执行速度也不一样。如果有多个计算加减、位运算的单元的话,一个周期能执行两条或者更多条加法运算,也是可能的。有的指令,比如内存读,或许可以两个地址一起读,但内存本身有延迟,即使在L1 cache里,也可能要4个周期之后才能读到。还有指令译码、指派等等,skylake cpu一个周期可以解码5条指令,同时会有几百条指令“待执行”,甚至能在if判断还没结束之前,就预先帮你执行then和else两个分支的程序,然后if判断确定是true还是false以后,再放弃其中一个分支的结果,保留成立的分支。总之现代的CPU是个很神奇的东西。
为啥每次都感觉暖神什么都懂得样子,膜拜[ema17]
【 在 nuanyangyang 的大作中提到: 】
: 差不多吧。整数运算的话,加减的吞吐率最高延迟最低,乘的吞吐率和延迟稍差一点,除和模非最差。浮点运算也差不多。
:
: 现代的超标量流水线构架,每个周期能执行很多条指令,但不同的执行单元数量不一样多,所以不同种类的运算执行速度也不一样。如果有多个计算加减、位运算的单元的话,一个周期能执行两条或者更多条加法运算,也是可能的。有的指令,比如内存读,或许可以两个地址一起读,但内存本身有延迟,即使在L1 cache里,也可能要4个周期之后才能读到。还有指令译码、指派等等,skylake cpu一个周期可以解码5条指令,同时会有几百条指令“待执行”,甚至能在if判断还没结束之前,就预先帮你执行then和else两个分支的程序,然后if判断确定是true还是false以后,再放弃其中一个分支的结果,保留成立的分支。总之现代的CPU是个很神奇的东西。
膜
【 在 nuanyangyang 的大作中提到: 】
: 差不多吧。整数运算的话,加减的吞吐率最高延迟最低,乘的吞吐率和延迟稍差一点,除和模非最差。浮点运算也差不多。
: 现代的超标量流水线构架,每个周期能执行很多条指令,但不同的执行单元数量不一样多,所以不同种类的运算执行速度也不一样。如果有多个计算加减、位运算的单元的话,一个周期能执行两条或者更多条加法运算,也是可能的。有的指令,比如内存读,或许可以两个地址一起读,但内存本身有延迟,即使在L1 cache里,也可能要4个周期之后才能读到。还有指令译码、指派等等,skylake cpu一个周期可以解码5条指令,同时会有几百条指令“待执行”,甚至能在if判断还没结束之前,就预先帮你执行then和else两个分支的程序,然后if判断确定是true还是false以后,再放弃其中一个分支的结果,保留成立的分支。总之现代的CPU是个很神奇的东西。
: 有好事者长期以来在不断利用自己的业余时间测量x86各个微构架的CPU(有AMD的k6,k7,..也有intel的pentium到skylake(第6代酷睿),也有via的芯片)的各个指令的延迟和吞吐率。如果关心每个指令用多少时间,看这个最好了。
: ...................