Cuda GPU上浮点数的划分与CPU上的不同

Cuda GPU上浮点数的划分与CPU上的不同,cuda,gpu,Cuda,Gpu,当我在GPU上除以两个浮点数时,结果是0.196405。当我在CPU上划分它们时,结果是0.196404。使用计算器的实际值为0.196404675。如何使GPU和CPU上的除法相同?您没有。千万不要假设浮点值在经过数学运算后与预期值完全相等。它们仅被定义为正确到指定的精度,并且在不同的处理器之间会略有不同,无论该处理器是CPU还是GPU。例如,x86处理器在默认情况下会以80位的精度进行浮点计算,然后将结果截断为要求的精度。浮点数的等价性比较应始终使用公差,因为不能保证任何两个处理器(或通过不

当我在GPU上除以两个浮点数时,结果是
0.196405
。当我在CPU上划分它们时,结果是
0.196404
。使用计算器的实际值为
0.196404675
。如何使GPU和CPU上的除法相同?

您没有。千万不要假设浮点值在经过数学运算后与预期值完全相等。它们仅被定义为正确到指定的精度,并且在不同的处理器之间会略有不同,无论该处理器是CPU还是GPU。例如,x86处理器在默认情况下会以80位的精度进行浮点计算,然后将结果截断为要求的精度。浮点数的等价性比较应始终使用公差,因为不能保证任何两个处理器(或通过不同但数学上等价的指令序列的同一处理器)将产生相同的结果。例如,当且仅当| a-b |正如对另一个答案的评论所表明的那样,期望CPU和GPU上运行的浮点计算结果相同是不现实的原因有很多。它比这强得多:当针对不同的目标体系结构(例如x86或x64)或使用不同的优化级别编译相同的源代码时,您不能假设FP结果是相同的

事实上,如果您的代码是多线程的,并且FP操作在一次运行到下一次运行时以不同的顺序执行,那么在完全相同的系统上运行的完全相同的可执行文件可能会在一次运行到下一次运行时产生稍有不同的结果

其中一些原因包括但不限于:

  • 浮点操作是不关联的,因此看似良性的重新排序(如上面提到的多线程的竞争条件)可能会改变结果
  • 不同的体系结构在不同的条件下支持不同级别的精度和舍入(即编译器标志、控制字与每条指令)
  • 不同的编译器对语言标准的解释不同
  • 有些体系结构支持FMAD(融合乘法加法),有些不支持
请注意,在本次讨论中,CUDA的JIT编译器(使PTX代码成为GPU体系结构的未来证明的魔法,目前尚不可用)肯定会干扰FP结果

尽管有上述规定,您必须编写健壮的FP代码

当我今天写这篇文章时,我相信CUDA GPU的浮点运算设计架构比任何当代CPU都要好得多。GPU包括对16位浮点和FMAD的本机IEEE标准(c.2008)支持,对非规范化具有全速支持,并在每个指令的基础上启用舍入控制,而不是控制其设置对所有FP指令有副作用且更改成本高昂的字

相比之下,CPU的每线程状态过多,性能较差,但使用SIMD指令时除外,主流编译器在利用SIMD指令提高性能方面非常糟糕(由于矢量化标量C代码以利用此类指令集比为CUDA等伪标量体系结构构建编译器要困难得多)。如果维基百科页面可信的话,英特尔和AMD似乎以一种无法描述的方式完全搞砸了FMAD支持的添加

您可以在NVIDIA GPU中找到关于浮点精度和IEEE支持的精彩讨论:


哪个GPU用于计算

如果使用单精度浮点运算,尾数部分的第六位通常会有+1/-1的精度误差。这是因为GPU中存在舍入误差


如果您使用的是双精度,您将获得与CPU相同的精确精度。但速度几乎是浮点精度的一半,内存使用率将是2倍。现在,从基于费米的体系结构开始,NVIDIA GPU支持双精度点计算。你需要它们相同吗?我的直觉告诉我,如果你需要它们相等,你应该在解释结果时调整有效数字,而不是在计算结果时。什么精度,什么GPU,什么源代码,最重要的是为什么?请显示代码和编译选项,并确定GPU。CUD中的双精度除法A始终使用IEEE-754舍入,但是CPU内部可能会使用扩展精度,导致在返回双精度结果时出现称为双舍入的问题。CUDA中的单精度除法默认情况下对sm_20及以上使用IEEE-754舍入。各种编译器选项可能导致使用近似单精度除法,sm_1x平台始终对单精度除法运算符使用近似除法(您可以使用内部函数获得IEEE-754四舍五入除法)@Talonmes:我在做浮点除法。GPU是GeForce GT 540M。至于原因,我知道我的CPU实现是正确的。只是想通过比较输出来检查我的GPU实现是否正确。@Programmer:单精度或双精度是我要问的问题。没有人对你的答案有异议,但事实上,这已经有一段时间了e 80位是x86 CPU的标准。大多数现代面向性能的x86 FP代码。
它们仅定义为正确到指定的精度,并且处理器之间会略有不同,无论处理器是CPU还是GPU。
我认为这不正确。据我所知,IEEE 754定义了确切的bit序列r