使用GCC能否提高浮点运算的精度?

3

有些使用C语言编写的程序在PC Linux上可以正确执行大量浮点计算,但在Cell处理器的SPE上却得出错误结果,而在PPU上却没有问题。我使用gcc编译器。我想知道是否有某种gcc编译选项可以增加舍入方法或类似操作,以便在单精度浮点数计算中获得更高的精度。由于SPE的性能会急剧降低,因此我无法改为双精度。

谢谢

1个回答

1

基于IBM SPU与IEEE 754的差异文档,可能有以下几种情况:

  • 算术运算的零结果始终为+0,而不是-0。
  • 来自2-149到2-126的非规格化输入在算术运算中被视为具有相同符号的零。算术运算永远不会产生非规格化结果,而是产生+0。
  • 算术运算不支持IEEE Inf或NaN。这些位模式表示有效数字。溢出结果产生适当符号的最大幅值。
  • 算术运算仅使用截断(chop,truncate)舍入模式,而不管浮点状态和控制寄存器(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 选项。

非常感谢,但不幸的是这些选项在gcc编译器上无法使用。 - Open the way

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接