一些用 C 语言进行大量浮点计算的程序在 pc linux 机器上得到了正确的结果,但在单元处理器的 SPE 上却得到了错误的结果,但在单元的 PPU 上却没有。我正在使用 gcc 编译器。我想知道是否有一些 gcc 编译选项来增加舍入方法或类似方法,所以我可以得到更精确的单浮点精度计算。我不能改成双倍,因为 SPE 性能会急剧下降
谢谢
一些用 C 语言进行大量浮点计算的程序在 pc linux 机器上得到了正确的结果,但在单元处理器的 SPE 上却得到了错误的结果,但在单元的 PPU 上却没有。我正在使用 gcc 编译器。我想知道是否有一些 gcc 编译选项来增加舍入方法或类似方法,所以我可以得到更精确的单浮点精度计算。我不能改成双倍,因为 SPE 性能会急剧下降
谢谢
根据SPU 上与 IEEE 754 的差异的 IBM 文档,它可以是任意数量的东西:
- 算术运算的零结果总是+0,绝不是-0。
- 从 2-149 到 2-126 到算术运算的非正规输入被视为具有相同符号的零。算术运算永远不会产生异常结果,而是产生 +0。
- 算术运算不支持 IEEE Inf 或 NaN。这些位模式代表有效数字。溢出结果产生适当符号的最大幅度值。
- 算术运算仅使用舍入到零(斩波、截断)舍入模式,而与浮点状态和控制寄存器 (FPSCR) 中舍入模式的设置无关,这仅影响双精度算术运算。
当然,在相关页面上,您还可以编译 SPU 代码以获得严格的 IEEE 一致性:
默认情况下,XL C/C++ 遵循 IEEE 标准中的大部分规则,但不是所有规则。如果您使用 -qnostrict 选项进行编译,该选项在优化级别 -O3 或更高级别默认启用,某些 IEEE 浮点规则会以可以提高性能但可能影响程序正确性的方式被违反。为避免此问题并为严格遵守 IEEE 标准进行编译,请执行以下操作:
- 使用 -qfloat=nomaf 编译器选项。
- 如果程序在运行时更改舍入模式,请使用 -qfloat=rrm 选项。
- 如果数据或程序代码包含信号 NaN 值 (NaNS),请使用 -qfloat=nans 选项。(信号 NaN 与安静的 NaN 不同;您必须将其显式编码到程序或数据中,或者使用 -qinitauto 编译器选项创建它。)
- 如果您使用 -O3、-O4 或 -O5 进行编译,请在其后包含选项 -qstrict。