最近,我一直在使用CUDA制作节目(FDTD Operation) 开发环境,OS是Windows server 2008,显卡是TeslaC2070,编译器是VS2010。该程序使用单精度和双精度浮点计算。
我正在阅读CUDA编程指南3.2和4.0。在附录中,指南告诉我sin()
,cos()
的最大准确度为2 ULP。我原来的CPU程序产生的结果与CUDA版本不同。
我想让结果正确相同。有可能吗?
答案 0 :(得分:3)
引用Goldberg(每篇计算机科学家,计算科学家,甚至可能是所有编程的科学家应该阅读的论文):
由于舍入误差,代数的关联定律没有 必须保留浮点数。
这意味着当你改变操作的顺序时 - 即使使用表面上的关联算法 - 你可能会得到稍微不同的答案。
根据定义,并行性导致相对于串行算术的操作顺序不同。 “令人尴尬的并行”计算,即每个输出元素独立于其他输出元素计算的计算,有时不必担心这一点。但集体操作,如减少或扫描,以及空间邻域计算,如模板(如FDTD),确实会遇到这种影响。
实际上,即使使用不同的编译器(甚至是不同的编译器选项)也可以改变浮点计算的结果,即使在编译相同的代码时也可以有或没有并行性。