是否有可能通过gcc提高浮点运算的准确性?

时间:2010-09-22 22:21:57

标签: c floating-accuracy spu

在C中进行大量浮点计算的某些程序在pc linux盒子上获得了正确的结果,但在单元处理器的SPE上却出现了错误的结果,而在单元的PPU上却没有。我正在使用gcc编译器。我想知道是否有一些gcc编译选项来增加舍入方法或类似方法,所以我得到更精确的单浮点精度计算。我不能改为加倍,因为在SPE性能上会急剧减少

由于

1 个答案:

答案 0 :(得分:1)

基于IBM documentation for the differences from IEEE 754 on the SPU,它可以是任意数量的东西:

  
      
  • 算术运算的零结果总是+0,从不-0。
  •   
  • 处理从2-149到2-126到算术运算的非正常输入   具有相同符号的零。算术   操作永远不会产生非常规   结果,但产生+0。
  •   
  • 算术运算不支持IEEE Inf或NaN。这些位模式   代表有效数字。溢出   结果产生最大幅度   适当的标志值。
  •   
  • 算术运算仅使用舍入到零(chop,truncate)   舍入模式,无论如何   设置舍入模式   浮点状态和控制   注册(FPSCR),仅影响   双精度算术   操作。
  •   

当然,在相关网页上you can also compile SPU code for strict IEEE conformance

  

默认情况下,XL C / C ++最常用,但是   不是IEEE的所有规则   标准。如果你用。编译   -qnostrict选项,默认情况下在优化级别-O3或   更高,一些IEEE浮点规则   以可以改善的方式违反   性能,但可能会影响程序   正确性。为了避免这个问题,和   编译严格遵守   IEEE标准,请执行以下操作:

     
      
  • 使用-qfloat = nomaf编译器选项。
  •   
  • 如果程序在运行时更改舍入模式,请使用-qfloat = rrm   选项。
  •   
  • 如果数据或程序代码包含信号NaN值(NaNS),请使用   -qfloat = nans选项。 (信号NaN不同于安静的NaN;你   必须明确地将其编码到   程序或数据或使用创建它   -qinitauto编译器选项。)
  •   
  • 如果使用-O3,-O4或-O5进行编译,请在其后包含选项-qstrict。
  •