好吧,在Intel 的内在指南中指出,名为“sqrtsd”的指令的延迟为 18 个周期。
我用自己的程序对其进行了测试,例如,如果我们将 0.15 作为输入,则它是正确的。但是当我们取 256(或任何 2^x)个数字时,延迟只有 13。这是为什么呢?
我的一个理论是,由于 13 是“sqrtss”的延迟,它与“sqrtsd”相同,但在 32 位浮点上完成,那么也许处理器足够聪明,可以理解 256 可以适应 32 位,因此使用该版本而 0.15 需要完整的 64 位,因为它不能以有限的方式表示。
我正在使用内联汇编来完成它,这是使用 gcc -O3 和 -fno-tree-vectorize 编译的相关部分。
static double sqrtsd (double x) {
double r;
__asm__ ("sqrtsd %1, %0" : "=x" (r) : "x" (x));
return r;
}
Run Code Online (Sandbox Code Playgroud)