只是对标准感到好奇sqrt()
来自 GCC 上的 math.h 。我自己编码的sqrt()
使用牛顿拉夫森来做到这一点!
是的,我知道 fsqrt。但CPU是如何做到这一点的呢?我无法调试硬件
现代 CPU 中的典型 div/sqrt 硬件使用 2 基数的幂来一次计算多个结果位。例如http://www.imm.dtu.dk/~alna/pubs/ARITH20.pdf http://www.imm.dtu.dk/~alna/pubs/ARITH20.pdf介绍 Radix-16 div/sqrt ALU 的设计细节,并将其与 Penryn 中的设计进行比较。 (他们声称延迟更低,功耗更低。)我查看了图片;看起来总体思路是做一些事情并通过乘法器和加法器迭代地反馈结果,基本上就像长除法一样。我认为类似于在软件中一次进行一点划分的方式。
Intel Broadwell 推出了 Radix-1024 div/sqrt 单位。询问 Penryn (Radix-16) 和 Broadwell 之间的变化。例如加宽了 SIMD 向量除法器,因此 256 位除法比 128 位除法速度更慢,并且增加了基数。
也许还看到
-
Intel x86处理器的整数除法算法 https://stackoverflow.com/questions/8401194/the-integer-division-algorithm-of-intels-x86-processors- Merom 的 Radix-2 和 Radix-4 分隔器被 Penryn 的 Radix-16 取代。 (Core2 65nm 与 45nm)
- https:// electronics.stackexchange.com/questions/280673/why-does-hardware-division-take-much-longer-than-multiplication https://electronics.stackexchange.com/questions/280673/why-does-hardware-division-take-much-longer-than-multiplication
- https://scicomp.stackexchange.com/questions/187/why-is-division-so-much-more-complex-than-other-arithmetic-operations https://scicomp.stackexchange.com/questions/187/why-is-division-so-much-more-complex-than-other-arithmetic-operations
但无论硬件如何工作,IEEE 要求sqrt
(以及 mul/div/add/sub)给出正确舍入 result,即误差 你不需要知道它是如何工作的,只需要知道它的性能。这些操作比较特殊,其他功能如log
and sin
do not有这个要求,而真正的库实现通常不是那么准确。 (和x87 fsin绝对不是那么准确 https://randomascii.wordpress.com/2014/10/09/intel-underestimates-error-bounds-by-1-3-quintillion/对于 Pi/2 附近的输入,范围缩小中的灾难性取消可能会导致huge相对误差。)
See https://agner.org/optimize/ https://agner.org/optimize/适用于 x86 指令表,包括标量和 SIMD 的吞吐量和延迟sqrtsd
/ sqrtss
及其更广泛的版本。我收集了结果浮点除法与浮点乘法 https://stackoverflow.com/questions/4125033/floating-point-division-vs-floating-point-multiplication/45899202#45899202
对于非 x86 硬件 sqrt,您必须查看其他供应商发布的数据,或者测试过它的人的结果。
与大多数指令不同,sqrt
性能通常取决于数据。 (通常,更高的有效位或更大的结果量需要更长的时间)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)