これは、画像でヒストグラムを実行し、次にヒストグラムhttp://codepad.org/4RMtWn1eでプレフィックスサムスキャンを実行するプログラムの私のコードです。問題は 396 行目で、1024 で numBins (ヒストグラムのビンの数) の値を正しく出力します。次に、ヒストグラムをデバイス メモリからホスト メモリにコピーします。これはどういうわけか numBins の値を変更し、その次の出力は 0 です。これは非常に奇妙に思えます。numBins に特定の変更を加えていませんが、とにかく値が変更されます。これを理解できれば、プログラムが機能しない理由がわかる気がします。
1 に答える
2
これは間違っています:
unsigned int* h_histogram;
h_histogram = (unsigned int*) malloc(sizeof(unsigned int)* 1024);
std::cout << numBins;
checkCudaErrors(cudaMemcpy(&h_histogram, d_histogram, sizeof(unsigned int)* numBins, cudaMemcpyDeviceToHost));
^
|
h_histogram is already a pointer
代わりにこれを行います:
checkCudaErrors(cudaMemcpy(h_histogram, d_histogram, sizeof(unsigned int)* numBins, cudaMemcpyDeviceToHost));
(唯一の変更は、前のアンパサンドを削除することですh_histogram
なぜnumBins
正確に破損したのかはわかりませんが、この特定の誤っcudaMemcpy
た操作は、期待する宛先にコピーするのではなく、格納されているポインター値とh_histogram
その後にあるものを上書きします。そして、numBins
たまたまそれ以降に保存された場合、それも上書きされます。
于 2013-10-10T02:16:57.277 に答える