NVIDIA GPU(sm_13)上的IEEE-754标准

3

如果我在主机和设备(GPU架构sm_13)上执行单精度浮点运算,那么这些值会不同吗?


2
GT200系列的GPU不支持IEEE-754单精度运算。但即使支持,答案可能仍然是肯定的,结果可能会有所不同。 - talonmies
@talonmies 我已经重新表达了我的问题在这里。请看一下。谢谢 - Abhinav
1个回答

9

关于这个问题,NVIDIA的whitepaper提供了很好的讨论。基本上:

  • IEEE-754标准已经被几乎所有现有设备所实现;
  • 即使在忠实地实现该标准的情况下,您仍然可以看到结果上的差异(例如,英特尔内部使用80位进行双精度计算),或者您的编译器高度优化设置可能会改变结果
  • 2.0及更高版本的NVIDIA显卡支持IEEE-754单精度和双精度,只有非常小的限制
    • 某些舍入模式不支持某些操作——只有在代码中明确更改舍入模式时才相关
    • 有一些关于融合乘加的微妙之处
    • CUDA还提供了一些(略低于)精度更低但更快的实现,当然,如果您明确或隐含地使用这些实现(使用编译器选项),您自然无法获得完全符合ieee-754标准的结果
  • 1.3版本的显卡支持双精度的IEEE-754标准,但不支持单精度(单精度不支持非规格化——例如非常小的数,没有FMA,平方根和除法不完全准确)
  • 1.2版本的显卡仅具有单精度,不符合上述完全符合IEEE-754标准的要求。

如果尽管坚持IEEE754标准,但在CPU和GPU上计算的浮点值会因硬件优化(例如英特尔的80位方法)和编译器优化等原因而不同,那么我们为什么还称其为标准呢? - Abhinav
2
@Abhinav:它是一个标准,因为它定义了存储规则、格式、舍入规则、操作、交换格式和异常。它(根据版本)还定义了再现性标准。但是所有事情都有容差。这意味着浮点数将在任何符合标准的平台上以相同的方式工作。这并不意味着结果将完全相同。 - talonmies
@Abhinav:相信我,在IEEE754之前,情况要糟糕得多得多。 - Jonathan Dursi
1
@Abhinav: 编译器优化是一个完全不同的领域。如果你允许,编译器可以重新排列代码中的操作;在这种情况下,即使所有操作在不同系统上都以完全相同的方式执行,由于它们的顺序不同,你将得到不同的结果 - 浮点数运算本质上是非交换的。 - Jonathan Dursi

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