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添加到变量中,但仍然显示以前运行的值作为变量值。这是代码的问题吗?我怎么能阻止它?
答案 0 :(得分:1)
我认为错误可能很简单:你没有复制结束字符串0。
复制C字符串时,应始终使用strlen + 1。
因此,在第二次运行中,您将分配内存并复制{'v','a','r'}
,而不是{'v','a','r','\0'}
。
当你尝试打印它时,你会得到var#####
,其中####
是内存中的垃圾。我的猜测是,在第一次运行中,垃圾是0,所以字符串结束看似正确,而在第二次运行中,它是第一个程序留下的垃圾。