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

对于不同的运行,CUDA GPU内核参数的全局内存中将保留以前的值,cuda,gpu,Cuda,Gpu,设备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(t

设备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
const test[]=“溢出发生”;
Cudamaloc((无效**)和测试,尺寸(字符)*strlen(测试));
cudaMemcpy(测试,测试,大小(字符)*strlen(测试),cudaMemcpyHostToDevice);
功能(testfn);
nvcc test.cu
cuda gdb a.out
b测试fn
p测试\u d->>发生溢流
第二次运行(我将测试字符串更改为var)

const test[]=“var”
Cudamaloc((无效**)和测试,尺寸(字符)*strlen(测试));
cudaMemcpy(测试,测试,大小(字符)*strlen(测试),cudaMemcpyHostToDevice);
功能(testfn);
nvcc test.cu
cuda gdb a.out
b测试fn
p测试\u d->>变流发生

“RflowOccess”是从上一次运行复制而来的。我尝试将cudaMemset设置为变量,但它仍然将上一次运行的值显示为变量值。这是代码的问题吗。如何防止它?

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


然后,当您尝试打印它时,您会得到
var######
,其中
####
是内存中的任何垃圾。我的猜测是,在第一次运行中,垃圾是0,因此字符串的结尾看起来是正确的,而在第二次运行中,垃圾是第一个程序留下的。

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


然后,当您尝试打印它时,您会得到
var######
,其中
####
是内存中的任何垃圾。我的猜测是,在第一次运行中,该垃圾为0,因此字符串结尾似乎正确,而在第二次运行中,它是第一个程序留下的垃圾。

由于第二次运行只写入了前3个字符,因此之前未覆盖的内存内容保持不变。如果使用以null结尾的字符串,这可能无关紧要。如果使用cudaMemset,则需要分配足够大的字符串空间来覆盖任何要覆盖的值。除非您明确地执行此操作,否则GPU内存不会也不应该被假定为被清除或设置为零。由于您的第二次运行只写入了前3个字符,因此您没有覆盖的内存的先前内容保持不变。如果使用以null结尾的字符串,这可能无关紧要。如果使用cudaMemset,则需要分配足够大的字符串空间来覆盖任何要覆盖的值。GPU内存不是也不应该被假定为被清除或设置为零,除非您明确地这样做。
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