x86 / x64是否使用SIMD寄存器进行高精度浮点运算或专用FP寄存器?
我的意思是高精度版本,而不是常规double
精度。
答案 0 :(得分:1)
FPU堆栈仍然可用,并且公开了一个80位精度算术,因为@EricPostpischil指出(不确定处理器是否仍然具有完整逻辑或者此部分是否在硬件级别进行仿真)。它以long double
类型提供给GCC中的开发人员。例如,为方法生成的程序集
long double f(long double a, long double b)
{
return a*b ;
}
将是
fldt 16(%rbp)
fldt 32(%rbp)
fmulp %st, %st(1)
这个archive email为使用这些数据提供了有用的元素,例如:
long double my_logl(long double x) { long double y; __asm__ volatile( "fldln2\n" "fldl %1\n" "fyl2x" : "=t" (y) : "m" (x)); return y; }
在没有SSE,AVX或其他向量扩展的情况下编译代码时,您的代码可能会使用80位FPU生成此类指令,并且可能会输出不同的值。这是一个示例代码来说明:
double epstest(long double a, long double b)
{
long double y ;
y = a + b ;
y = y - a ;
return y ;
}
#include <cstdio>
int main()
{
double x = 1.0 ;
double y = 1e-17 ;
double z = x + y ;
z = z - x ;
printf ("double: %lf + %le - %lf = %le\n", x, y, x, z);
double res = epstest (x, y) ;
printf ("long double: %lf + %le - %lf = %le\n", x, y, x, res);
return 0 ;
}
输出:
double: 1.000000 + 1.000000e-17 - 1.000000 = 0.000000e+00
long double: 1.000000 + 1.000000e-17 - 1.000000 = 9.974660e-18
x86_64软件实现了更高的精度(超过long double
)。
答案 1 :(得分:0)
FPU(浮点单元)具有80位浮点值的寄存器(英特尔格式为IEEE 754格式,略有变化)。
各种SIMD单元(SSE,AVX等)具有较大的寄存器,可用于许多事情,但只有将它们用作32位和64位浮点的指令。