1

デバイスGeForceGTX680私のプログラムでは、値はCUDAMemcpyを使用してホストからデバイス変数にコピーされます。プログラムのさまざまな実行時に、以前の値がグローバルメモリに保持されていることがわかりました。(実行可能ファイルを複数回実行する)コード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

2回目の実行(テスト文字列を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を変数に試しましたが、それでも前の実行の値が変数値として表示されます。コードに問題がありますか?どうすればそれを防ぐことができますか?

4

1 に答える 1

1

バグは些細なことかもしれないと思います。終了文字列の文字0をコピーしていません。C文字列をコピーするときは、常にstrlen+1を使用する必要があります。その結果、2回目の実行では{'v','a','r'}、の代わりにメモリを割り当ててコピーします{'v','a','r','\0'}

次にそれを印刷しようとすると、メモリ内のゴミがvar#####どこにあるかがわかります。####私の推測では、最初の実行では、そのガベージは0であったため、文字列は一見正しいように終了しましたが、2回目の実行では、最初のプログラムによって残されたガベージでした。

于 2012-11-23T22:54:19.787 に答える