在添加CUDA时返回错误的数字

Returning incorrect number while adding in CUDA

本文关键字:错误 数字 返回 添加 CUDA      更新时间:2023-10-16

我正在尝试遵循我在网上找到的教程。我使用的是Ubuntu 17,从命令行编译。

#include <stdio.h>
#include <iostream>
__global__ void add(int a, int b, int *c)
{
    *c = a + b;
}
int main()
{
    int a,b,c;
    int *d_c;
    int size = sizeof(int);
    a = 2;
    b = 7;
    cudaMalloc((void **)&d_c,size;
    add<<<1,1>>>(a,b,d_c);
    cudaMemcpy(&c,d_c,size,cudaMemcpyHostToDevice);
    std::cout << a << " + " << b << " = " << c << std::endl;
    cudaFree(d_c);
    return 0;
 }

当我使用nvcc编译时,我会收到以下错误:

nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).

我忽略了警告并照常运行a.out,我得到了输出:

2 + 7 = 1

上次我进行数学时,这是不正确的。我不确定我是否错误地这样做,或者我关注的教程是否太老了,或者是否与警告有关?任何帮助或潜在客户都会做。我还会提到,直到安装gcc-5之前,我无法使用nvcc编译。我相信我已经使用这些说明正确地将它们链接在一起。

我也在这里也查看了此解决方案。但是,我没有发现答案特别有用,因此如果正确编译的话,我会很感激,为什么它不能正确地打印到我的终端。

任何帮助将不胜感激。

您对cudaMemcpy()的呼叫不正确。您应该从设备(GPU)内存将结果复制到主机(CPU)内存,而不是其他方式。正确使用的kind标志是cudaMemcpyDeviceToHost

cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost);

为了简化未来的调试,请考虑实现适当的CUDA API错误检查以及使用cuda-memcheckcuda-gdb,Valgrind和Clang SaniTizers系统地运行程序。