在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-memcheck
,cuda-gdb
,Valgrind的和铛消毒剂运行您的程序。
谢谢你的回应。但是,我更新了我的代码以使用'cudaMemcpyDeviceToHost',并且我仍然得到1的结果。让我尝试错误检查,我在该线程上多次尝试过一次高峰,但从未想过尝试实现它。 – Sailanarmo
刚刚发现我的错误,非常感谢你让我错误检查。 GPU Assert返回,'没有检测到CUDA功能的设备hello.cu 29'我会继续研究为什么会发生这种情况。 – Sailanarmo
你很快就实现了错误检查。有时需要一段时间才能说服人们这样做。因此,出现什么样的错误信息是:您的内核函数甚至没有执行,因为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