C++ CUDA三元函数的数学保证

C++ CUDA三元函数的数学保证,c++,cuda,C++,Cuda,CUDA支持。但是他们是否提供了任何保证,比如如果我计算sin(x),结果将是sin(x)的数学值的可表示值?如果答案是否定的,那么如果我们想留在GPU,还有其他选择吗?类似的东西总是返回上限或下限(但可能不是最接近的)。这表明API提供的值不准确。它们的值相差1/2。(在主机和设备之间进行比较时) 但是,对于所有实际目的,这些值都是准确的 无论如何,如果您想用高精度执行符号运算,使用浮点精度使它不准确。直接从链接到“为这个函数的精度信息引用”参见CUDA C++编程指南,附录E.1,表7。对于

CUDA支持。但是他们是否提供了任何保证,比如如果我计算sin(x),结果将是sin(x)的数学值的可表示值?如果答案是否定的,那么如果我们想留在GPU,还有其他选择吗?类似的东西总是返回上限或下限(但可能不是最接近的)。这表明API提供的值不准确。它们的值相差1/2。(在主机和设备之间进行比较时)

但是,对于所有实际目的,这些值都是准确的


无论如何,如果您想用高精度执行符号运算,使用浮点精度使它不准确。

直接从链接到“为这个函数的精度信息引用”参见CUDA C++编程指南,附录E.1,表7。对于任何非零有理的
x
都是无理的。无理数有无限个小数。任何表示这个数字的方法都需要无限的资源。特别是,计算机中需要无限的内存来存储一个无理数。所以答案是否定的:没有人用数学方法完美地表示一个无理数。如果你希望IEEE 754遵守,你可以考虑禁用“快速数学”选项。ULPS公差并不意味着你在回答中所暗示的理解如下。主机和设备方法调用将返回接近实际值的值。主机和设备之间存在1个或2个UIP的差异。因此,我假设这可以被认为是实际值与主机和设备值之间的差异。Noe,考虑到浮点数的1/2 ULP非常小,与浮点数造成的精度损失相当,这种差异可以忽略。请务必让我知道,如果我遗漏了什么和错误的东西。最后一位的错误不是主机和GPU之间的计算。它们介于正确舍入的IEEE 754浮点类型表示的真实结果和GPU上提供的库结果之间。如果最后一位误差实际上介于数学上正确的结果到无限精度之间,并且返回的数值结果是GPU,则主机在最后一位误差范围内绝对没有作用。考虑到正确的数学结果可以在两个相邻的可表示浮点数之间的任意位置,1/2 ULP显然是可以获得的最佳结果,无论是在GPU还是CPU上。但由于要产生1/2 ULP误差的“正确四舍五入”结果,需要付出极大的努力,“忠实四舍五入”结果(1 ULP)或几个ULP通常被认为是一个很好的折衷办法。@Koosha:“最大误差表示为正确四舍五入[单精度|双精度]之间ULP差值的绝对值。”结果和CUDA库函数返回的结果”。“全范围”指整个浮点操作数范围。