0

これは、画像でヒストグラムを実行し、次にヒストグラムhttp://codepad.org/4RMtWn1eでプレフィックスサムスキャンを実行するプログラムの私のコードです。問題は 396 行目で、1024 で numBins (ヒストグラムのビンの数) の値を正しく出力します。次に、ヒストグラムをデバイス メモリからホスト メモリにコピーします。これはどういうわけか numBins の値を変更し、その次の出力は 0 です。これは非常に奇妙に思えます。numBins に特定の変更を加えていませんが、とにかく値が変更されます。これを理解できれば、プログラムが機能しない理由がわかる気がします。

4

1 に答える 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 に答える