我正在尝试按照我发现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。但是,我没有找到特别有用的答案,所以如果这是正确的编译我会很感激,为什么这不能正确打印到我的终端。
非常感谢任何帮助。
答案 0 :(得分:2)
您对cudaMemcpy()
的来电不正确。您应该将结果从设备(GPU)内存复制到主机(CPU)内存,而不是其他方式。要使用的正确kind
标记为cudaMemcpyDeviceToHost
:
cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost);
为了简化将来的调试,请考虑实施proper CUDA API error checking以及使用cuda-memcheck
,cuda-gdb
,valgrind和clang清理程序系统地运行程序。