我正在考虑将一些数学运算卸载到GPU。由于我已经在使用D3D11,所以我会使用计算着色器来完成这项工作。但问题是,无论用户可能拥有什么GPU,我都需要相同输入的结果相同。(唯一要求它支持计算着色器4.0)。
那么浮点数学在GPU上是确定性的吗?
如果不是,GPU支持整数数学吗?
我没有使用DirectCompute,只有OpenCL。
GPU绝对支持整数数学,包括32位和64位整数。已经讨论了几个问题:
- GPU上的整数计算
- GPU上整数和位运算的性能
基本上,在现代GPU上,32位浮点运算和整数运算的性能相当。
至于确定性结果,它取决于您的代码。例如,如果您依赖于多个线程对同一内存执行原子操作,然后从其他线程读取该内存并根据该值执行操作,那么每次的结果可能并不完全相同。
根据个人经验,我需要生成随机数,但也需要一致的结果。所以基本上我有一个更大的种子阵列,每个线程一个,每个种子都是完全独立的。其他依赖原子操作和屏障的随机数生成器则不会。
具有确定性结果的另一半是在给定不同硬件的情况下具有相同的结果。使用整数运算应该是相当安全的。使用OpenCL中的浮点运算,避免快速放松的数学选项和函数的本地变体将增加在不同硬件上获得相同结果的机会。