刚刚开始尝试CUDA,我遇到了障碍:(
我正在尝试高精度地对几个double变量求和,但是在设备与主机上执行加法时,结果却截然不同(小数点后)。我已经使用nvcc测试了以下示例代码:
#include <stdio.h>
using namespace std;
/// Kernel
__global__ void SolveRE(double x, double y, double z)
{
printf("From GPU: %.15lf\n", (x*x + y*y + z*z));
}
int main ()
{
// Define values
double x = 3051774.263732617720962;
double y = 7168331.130877199582756;
double z = 983.741348489015081;
// Call kernel
SolveRE<<<1, 1>>>(x, y, z);
cudaDeviceSynchronize();
// Print from host
printf("From CPU: %.15lf\n", (x*x + y*y + z*z));
return 0;
}
运行上述代码时,得到以下输出:
From GPU: 60698298326430.984375000000000
From CPU: 60698298326430.992187500000000
我认为这种差异与浮点运算精度有关?还是我想念更多东西?有什么方法可以使结果彼此对齐?
任何建议将不胜感激。谢谢大家!
正如已在评论中讨论的那样,根本原因似乎是在GPU上生成FMAD指令。我没有访问系统来测试如果使用FMA3 / FMA4指令来使用CPU端FMADD指令会产生什么结果。在这种情况下,结果可能会有所不同。
但是,在查看这样的示例时,您需要[[极端]]小心,因为您看到的内容不一定归因于CPU与GPU的差异。