5

以下のように動作する 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」ステップで変更される可能性があるため、各ステップでそのデータをここにコピーする必要があることです。

どうもありがとうございます!

4

2 に答える 2

5

リンクしたドキュメントにも次のように書かれています:

この関数は、以前の非同期起動からのエラー コードも返す場合があることに注意してください。

プログラムを呼び出すとcudaMemcpy()、前のすべての GPU 作業が完了するまで待機し (カーネルの起動は非同期であることを思い出してください)、ステータスを確認し、問題がなければ memcpy を実行します。ただし、この場合、カーネルの 1 つに障害が発生しています。

このエラーの最も一般的な理由は、x86 領域での segfault によく似た、境界外アクセスです。

cudaErrorLaunchFailure : カーネルの実行中にデバイスで例外が発生しました。一般的な原因には、無効なデバイス ポインターの逆参照や、境界外の共有メモリへのアクセスが含まれます。cudaThreadExit() が呼び出されるまで、デバイスは使用できません。既存のデバイス メモリ割り当てはすべて無効であり、プログラムが引き続き CUDA を使用する場合は再構築する必要があります。

これをデバッグする最も簡単な方法は、cuda-memcheck を使用することです。または、各カーネルの起動後に呼び出しcudaDeviceSynchronize()て戻り値を確認することで、どのカーネルが失敗したかを特定できます。

于 2012-04-25T10:20:53.110 に答える
2

カーネルを呼び出した後、エラー ステータスを確認していますか? (ほとんど?) すべての cuda 呼び出しが、以前に失敗した呼び出しまたはカーネルからエラーを返す可能性があるためです。起動エラーが発生しているため、コピー前のカーネルの 1 つがエラーの本当の原因であると思われます。

于 2012-04-24T20:51:53.500 に答える