c - GCC 的 sqrt() 编译后如何工作?使用哪种root方法?牛顿-拉夫森?

标签 c function math assembly sqrt

只是出于对 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,所以您不需要知道它是如何工作的,只需要知道它的性能。这些操作很特殊,logsin 等其他函数没有有此要求,而且真正的库实现通常不是那么准确。 (以及 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/

相关文章:

flutter - 循环进度指示器 - 数学问题

c - 工作日查找器奇怪的行为

c - 奇怪的 C 代码在 avr-gcc 下编译,但不应该

javascript - 函数给出错误 "div id"未定义。

javascript - 如何创建 "function that returns a function and splits csv file"?

algorithm - 逆向复数二维查找表

c - 如何在二维数组中使用 memset 函数来初始化 C 中的成员?

C 操作顺序

php - 你能在 Javascript 中声明兼函数参数吗?

javascript - Math.min 只选择数组中第一个相同的值,我怎样才能让它找到其他值?