以下のように動作する CUDA コードがあります。
cpyDataGPU --> CPU
while(nsteps){
cudaKernel1<<<,>>>
function1();
cudaKernel2<<<,>>>
}
cpyDataGPU --> CPU
そして function1 はそのようなものです:
function1{
cudaKernel3<<<,>>>
cudaKernel4<<<,>>>
cpyNewNeedDataCPU --> GPU // Error line
cudaKernel5<<<,>>>
}
cudaMemcpy のドキュメントによると、この関数は、「cudaSuccess」、「cudaErrorInvalidValue」、「cudaErrorInvalidDevicePointer」、および「cudaErrorInvalidMemcpyDirection」の 4 つの異なるエラー コードを生成できます。
ただし、次のエラーが表示されます:「cudaErrorLaunchFailure」:「カーネルの実行中にデバイスで例外が発生しました。一般的な原因には、無効なデバイス ポインターの逆参照や境界外の共有メモリへのアクセスが含まれます。デバイスは cudaThreadExit() が呼び出されるまで使用できません」 . 既存のデバイス メモリ割り当てはすべて無効であり、プログラムが引き続き CUDA を使用する場合は再構築する必要があります。"
なぜこのエラーが発生するのか、誰にもわかりませんか?私は何を間違っていますか?
以前のカーネル呼び出しの後に CPU->GPU にデータをコピーすることは理にかなっていますか? 問題は、各「while」ステップで変更される可能性があるため、各ステップでそのデータをここにコピーする必要があることです。
どうもありがとうございます!