1

最近在用CUDA开发环境做程序(FDTD Operation),操作系统是Windows server 2008,显卡是TeslaC2070,编译器是VS2010。该程序使用单精度和双精度浮点计算。

我正在阅读 CUDA 编程指南 3.2 和 4.0 。在附录中,指南告诉我sin()cos()最大精度为 2 ULP。我原来的 CPU 程序产生的结果与 CUDA 版本不同。

我想让结果正确相同。可能吗?

4

1 回答 1

3

引用Goldberg(每一个计算机科学家、计算科学家,甚至可能是每一个编程科学家都应该阅读的论文):

由于舍入误差,代数的结合定律不一定适用于浮点数。

这意味着当你改变运算的顺序时——即使是使用表面上的关联算术——你可能会得到稍微不同的答案。

根据定义,并行性导致相对于串行算术的不同操作顺序。“令人尴尬的并行”计算,即每个输出元素独立于所有其他元素计算的计算,有时不必担心这一点。但是集体操作,如缩减或扫描,以及空间邻域计算,如模板(如在 FDTD 中),确实会遇到这种影响。

在实践中,即使使用不同的编译器(甚至不同的编译器选项)也可以改变浮点计算的结果,即使在编译相同的代码时,不管有没有并行性。

于 2012-08-01T22:15:38.637 回答