对于不同的运行,以前的值保留在全局内存中,用于CUDA GPU的内核参数

时间:2012-11-23 21:03:06

标签: cuda gpu gpu-programming

Device GeForce GTX 680 在我的程序中,使用CUDA Memcpy将值从主机复制到设备变量。我可以看到以前的值在程序的不同执行中保留在全局内存中。(多次运行可执行文件) 代码test.cu:

首先运行:

const test[]="overflowhappen";
cudaMalloc((void **) &test_d, sizeof(char)*strlen(test));

cudaMemcpy(test_d,test,sizeof(char)*strlen(test),cudaMemcpyHostToDevice);
function<<<1,1>>>(testfn);


nvcc test.cu
cuda-gdb a.out

<gdb> b testfn
<gdb>p test_d  ->>overflowhappen

第二次运行(我将测试字符串更改为var)

const test[]="var"
cudaMalloc((void **) &test_d, sizeof(char)*strlen(test));
cudaMemcpy(test_d,test,sizeof(char)*strlen(test),cudaMemcpyHostToDevice);
function<<<1,1>>>(testfn);

nvcc test.cu
cuda-gdb a.out

<gdb> b testfn
<gdb>p test_d  ->> varrflowhappen

“rflowhappen”是从上一次运行中复制的。我尝试将cudaMemset添加到变量中,但仍然显示以前运行的值作为变量值。这是代码的问题吗?我怎么能阻止它?

1 个答案:

答案 0 :(得分:1)

我认为错误可能很简单:你没有复制结束字符串0。 复制C字符串时,应始终使用strlen + 1。 因此,在第二次运行中,您将分配内存并复制{'v','a','r'},而不是{'v','a','r','\0'}

当你尝试打印它时,你会得到var#####,其中####是内存中的垃圾。我的猜测是,在第一次运行中,垃圾是0,所以字符串结束看似正确,而在第二次运行中,它是第一个程序留下的垃圾。