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

时间:2017-09-27 01:44:41

标签: c++ parallel-processing cuda gpu

我正在尝试按照我发现online的教程。我正在使用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

上次我做数学时,这是不正确的。我不确定我这样做是否错误,或者我所关注的教程是否太旧,或者是否与警告有关?任何帮助或线索都可以。我还要提到,在安装nvcc之前,我无法使用gcc-5进行编译。我相信我已经使用我在这里找到的these instructions将它们正确地链接在一起。

我也在这里看过this solution。但是,我没有找到特别有用的答案,所以如果这是正确的编译我会很感激,为什么这不能正确打印到我的终端。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

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

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

为了简化将来的调试,请考虑实施proper CUDA API error checking以及使用cuda-memcheckcuda-gdb,valgrind和clang清理程序系统地运行程序。