CUDA实践指南(七)

简介:

数值精度和精度:
由于计算和存储浮点值的方式,导致错误或意外的结果主要来自浮点精度问题。 以下各节介绍了感兴趣的主要项目。 “CUDA C编程指南的特性和技术规范”以及有关浮点精度和性能的白皮书和附带网络研讨会中提供了浮点运算的其他特性,可从http://developer.nvidia.com/content/获得精密performancefloating-点和IEEE-754符合,NVIDIA的GPU。
Single vs. Double Precision:
浮点数学不关联:
每个浮点算术运算都涉及一定数量的舍入。 因此,算术运算的执行顺序非常重要。 如果A,B和C是浮点值,则(A + B)+ C不能保证等于A +(B + C),因为它在符号数学中。 并行化计算时,可能会改变操作顺序,因此并行结果可能与顺序结果不匹配。 此限制不是CUDA特有的,而是浮点值并行计算的固有部分。
提升双精度和截断单精度:
在比较主机和设备之间的浮点变量计算结果时,请确保在主机上以双倍精度进行的提升不考虑不同的数值结果。 例如,如果代码段:

float a;
...
a = a*1.02;

在计算能力为1.2或更低的设备上执行,或者在具有计算能力1.3但在不启用双精度(如上所述)的情况下编译的设备上执行,则乘法将以单精度执行。 但是,如果代码是在主机上执行的,文字1.02将被解释为doubleprecision数量,并且会被提升为双精度,乘法将以双精度执行,结果将被截断为float - 从而 产生稍微不同的结果。 但是,如果文字1.02被替换为1.02f,则结果在所有情况下都是相同的,因为不会升级为精度。 为确保计算使用单精度算术,总是使用浮点文字。
除了准确性之外,双精度和浮点数之间的转换(反之亦然)对性能有不利影响,正如指令优化中所讨论的。
符合IEEE 754标准:
所有CUDA计算设备都遵循IEEE 754标准的二进制浮点表示法,但有一些小例外。 这些例外(详见CUDA C编程指南的特性和技术规格)可能导致与主机系统上计算的IEEE 754值不同的结果。
其中一个主要区别是融合乘加(FMA)指令,它将乘加操作组合成单个指令执行。 其结果通常与分别进行两项操作所获得的结果略有不同。
x86 80位计算:
执行浮点计算时,x86处理器可以使用80位双精度扩展精度。 这些计算的结果可能会与CUDA设备上执行的纯64位操作有所不同。 为了在值之间获得更接近的匹配,请将x86主机处理器设置为使用常规双精度或单精度(分别为64位和32位)。 这是通过FLDCW x86汇编指令或等效的操作系统API完成的。

目录
相关文章
|
存储 并行计算 内存技术
|
并行计算 异构计算 存储
|
并行计算 算法 测试技术
|
编解码 并行计算 异构计算
|
并行计算 异构计算 程序员
|
并行计算 Linux
|
并行计算 程序员 异构计算
|
并行计算 大数据 机器学习/深度学习
|
并行计算 API C语言