- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
只是出于对 GCC 上 math.h 中标准 sqrt()
的好奇。我使用 Newton-Raphson 编写了自己的 sqrt()
来完成它!
最佳答案
yeah, I know fsqrt. But how the CPU does it? I can't debug hardware
现代 CPU 中典型的 div/sqrt 硬件使用基数 2 的幂一次计算多个结果位。例如http://www.imm.dtu.dk/~alna/pubs/ARITH20.pdf介绍了 Radix-16 div/sqrt ALU 的设计细节,并将其与 Penryn 中的设计进行了比较。 (他们声称延迟更低,功耗更低。)我看了图片;看起来一般的想法是做一些事情并通过乘法器和加法器迭代地反馈结果,基本上就像长除法一样。我认为这类似于您在软件中进行一次一位划分的方式。
Intel Broadwell 推出了 Radix-1024 div/sqrt 单位。 This discussion on RWT询问 Penryn (Radix-16) 和 Broadwell 之间的变化。例如扩大 SIMD vector 除法器,使 256 位除法比 128 位更慢,同时增加基数。
也许还看到了
但是无论硬件如何工作,IEEE 都需要 sqrt
(和 mul/div/add/sub)来提供正确舍入的结果,即错误 <= 0.5 ulp,所以您不需要知道它是如何工作的,只需要知道它的性能。这些操作很特殊,log
和 sin
等其他函数没有有此要求,而且真正的库实现通常不是那么准确。 (以及 x87 fsin
is definitely not that accurate 用于接近 Pi/2 的输入,其中范围缩小的灾难性抵消会导致潜在的巨大相对误差。)
参见 https://agner.org/optimize/对于 x86 指令表,包括标量和 SIMD sqrtsd
/sqrtss
及其更宽版本的吞吐量和延迟。我在 Floating point division vs floating point multiplication 中收集了结果
对于非 x86 硬件 sqrt,您必须查看其他供应商发布的数据,或测试人员的结果。
与大多数指令不同,sqrt
性能通常取决于数据。 (通常更多有效位或更大数量级的结果需要更长的时间)。
关于c - GCC 的 sqrt() 编译后如何工作?使用哪种root方法?牛顿-拉夫森?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54642663/
我是一名优秀的程序员,十分优秀!