我注意到编译器在每次使用double算法时都生成针对SIMD寄存器的代码。这适用于非优化和优化的代码。这是否意味着x87 FP单元可以被认为是过时的,并且只存在于向后兼容性?
我还注意到,其他“流行”平台也依赖于它们各自的SIMD实现,而不是作为堆栈设计的FP。
另外,SIMD实现往往至少128位宽,所以我想知道这是否意味着操作的(内部)精度高于x87 FP单元?
我还想知道性能、吞吐量和延迟,因为SIMD是考虑到向量执行的,所以我想知道它们是如何处理标量的。
发布于 2014-10-09 14:00:37
另外,SIMD实现往往至少128位宽,所以我想知道这是否意味着操作的(内部)精度高于x87 FP单元?
SIMD寄存器的宽度不是它所表示的向量的单个组件的宽度。广泛使用的SIMD指令集最多提供IEEE 754 binary64格式(64位宽).这远远不如历史上80位扩展格式的精度或范围。
许多C编译器将80位格式作为long double类型提供.我经常用它。在大多数中间计算中使用它是很好的:使用它有助于提高最终结果的准确性,即使最终结果注定要以binary64 double的形式返回。一个例子是这个问题中的函数,如果中间计算是用long double完成的,而中间计算是用输入和输出相同的double类型进行的,那么它的数学直觉属性就是最终结果。
同样,在为扩展的80位格式选择参数时必须平衡的许多约束中,有一个考虑因素是,通过组合80位计算和logl()来实现binary64函数pow()是完美的。为了获得良好的最终结果精度,需要额外的精度。
但是,我应该指出,当“中间”计算是一个单一的基本运算时,最好不要进行扩展精度。换句话说,当x和y是double类型时,(double)(x * (long double)y)的精度比x * y的精度稍差。这两个表达式几乎总是产生相同的结果,在很少的情况下,不同的情况下,x * y是非常准确的。这种现象叫做双舍入。
https://stackoverflow.com/questions/26280229
复制相似问题