0

ワーカー スレッドを使用して、メイン スレッドで作成した CUDA ホスト メモリに書き込もうとしています。このコードは非常に単純です。で記憶をつくる

unsigned char* _new;
cudaHostAlloc(&_new, _size, cudaHostAllocPortable);

ポインター _new を他のスレッドに渡します。ただし、このスレッドに書き込もうとすると、メモリ違反が発生します。

memcpy(_new, _source, _size);

また

cudaMemcpy(_new, _source, _size, cudaMemcpyHostToHost);

同じスレッドでデータを使用_new = new unsigned char[_size];またはコピーすると、機能します。

なぜこれが起こるのか、どうすれば修正できるのか誰か知っていますか?

4

1 に答える 1

0

長くて疲れた夜の後、私はついに何が悪いのかを知りました!

cuda 割り当て呼び出しの後に、メイン スレッドのメモリに書き込むスレッドが開始されました。したがって、スレッドが開始されると、この領域に書き込み可能なメモリがあることを認識できず、メモリ違反が発生しました。

これを修正するために、割り当て呼び出しをスレッドの run() メソッドに移動しました。このように、両方のスレッドが生きているときにメモリが割り当てられます。修理済み!

于 2012-12-21T11:13:14.650 に答える