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