CUDA:主机和设备上的总和加倍时的精度差异?

问题描述 投票:0回答:1

刚刚开始尝试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

我认为这种差异与浮点运算精度有关?还是我想念更多东西?有什么方法可以使结果彼此对齐?

任何建议将不胜感激。谢谢大家!

c++ cuda double gpu
1个回答
0
投票

正如已在评论中讨论的那样,根本原因似乎是在GPU上生成FMAD指令。我没有访问系统来测试如果使用FMA3 / FMA4指令来使用CPU端FMADD指令会产生什么结果。在这种情况下,结果可能会有所不同。

但是,在查看这样的示例时,您需要[[极端]]小心,因为您看到的内容不一定归因于CPU与GPU的差异。

© www.soinside.com 2019 - 2024. All rights reserved.