7 floating-point assembly stack obsolete x87
我注意到编译器每次使用double
算术时都会生成针对SIMD寄存器的代码.这适用于非优化和优化的代码.这是否意味着x87 FP单元可以被认为是过时的,仅用于向后兼容?
我还注意到其他"流行"平台也依赖于各自的SIMD实现而不是FP设计为堆栈.
此外,SIMD实现往往至少为128位宽,所以我想这是否意味着(内部)操作精度高于x87 FP单元?
我也想知道关于性能,吞吐量和延迟,考虑到SIMD已设想在考虑向量执行,所以我不知道他们如何与标量做.
Pas*_*uoq 13
此外,SIMD实现往往至少为128位宽,所以我想这是否意味着(内部)操作精度高于x87 FP单元?
SIMD寄存器的宽度不是它所代表的矢量的一个单独分量的宽度.广泛可用的SIMD指令集最多提供IEEE 754二进制64格式(64位宽).这与精度或范围的历史80位扩展格式差不多.
许多C编译器将80位格式作为long double
类型提供.我经常使用它.这是好事,使用最中间计算:使用它有助于使最终结果更加准确,即使最终的结果是注定要被返回为binary64 double
.一个例子是在功能这个问题,为此,如果中间计算与完成最后的结果的数学上直观的属性保存long double
,但如果中间计算与相同的完成double
型的输入和输出.
同样,许多约束了对扩展的80位格式的参数的选择要进行平衡中,一个考虑是,它是完美的计算一个binary64功能pow()
通过组成80位expl()
和logl()
.为了获得最终结果的良好准确性,额外的精度是必要的.
但是,我应该注意,当"中间"计算是单个基本操作时,最好不要经过扩展精度.换句话说,当类型x
和y
类型时double
,精度(double)(x * (long double)y)
比精度更差x * y
.这两个表达式几乎总是产生相同的结果,并且在极少数情况下它们不同,但是x * y
更准确.这种现象称为双舍入.
归档时间: |
|
查看次数: |
774 次 |
最近记录: |