在CUDA中添加时返回不正确的数字

问题描述:

我正在尝试按照教程发现online。我正在使用Ubuntu 17,从命令行进行编译。在CUDA中添加时返回不正确的数字

#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。然而,我没有找到答案特别有用,所以如果这是正确编译,为什么不能正确地打印出我的终端,我将不胜感激。

任何帮助将不胜感激。

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

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

为了在将来简化调试,想想实施proper CUDA API error checking以及系统地cuda-memcheckcuda-gdb,Valgrind的和铛消毒剂运行您的程序。

+0

谢谢你的回应。但是,我更新了我的代码以使用'cudaMemcpyDeviceToHost',并且我仍然得到1的结果。让我尝试错误检查,我在该线程上多次尝试过一次高峰,但从未想过尝试实现它。 – Sailanarmo

+0

刚刚发现我的错误,非常感谢你让我错误检查。 GPU Assert返回,'没有检测到CUDA功能的设备hello.cu 29'我会继续研究为什么会发生这种情况。 – Sailanarmo

+0

你很快就实现了错误检查。有时需要一段时间才能说服人们这样做。因此,出现什么样的错误信息是:您的内核函数甚至没有执行,因为CUDA运行时无法找到支持CUDA的设备。确保你有最近的Nvidia卡(Fermi及以上版本,[其中之一](https://developer.nvidia.com/cuda-gpus),Compute Capability> = 2.0),[驱动程序已正确安装] (http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html)。分类完成后,固定代码应该可以工作。 – Drop