-1

以下に示すように、2つのカーネルを呼び出そうとしています

for (t=0; t<=time_total; t++)
{    
      //kernel calls
      kernel1<<<noOfBlocks,noOfThreadsPerBlock>>>(** SOME PARAMETERS **);
      checkCudaError(cudaThreadSynchronize());

      kernel2<<<noOfBlocks,noOfThreadsPerBlock>>>(** SOME PARAMETERS **);
      checkCudaError(cudaThreadSynchronize());

}

そして、2番目のカーネルの構造は

var[index+0]=**SOME CALCULATION**
var[index+1]=**SOME CALCULATION**
var[index+2]=**SOME CALCULATION**

このコードを実行すると、checkCudaError は何も報告せず、コードが実行されて何らかの出力が得られますが、Visual Studio では次の例外が発生します。

First-chance exception at 0x7640c41f in **.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0039f9c4..
First-chance exception at 0x7640c41f in **.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0039f9c4..

Nsight を確認すると、カーネル 2 で次のエラーが発生しています。

CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES

ここでの問題は、カーネル 2 の var 配列が一部の行を正しく提供していることです。一部は他の行値のコピーであり、一部はガベージです。

また、私がこれを行うとき

var[index+0]=3
var[index+1]=3
var[index+2]=3

var のすべての値は 3 に設定されます

4

1 に答える 1

0

いくつかの補足事項:

  1. cudaThreadSynchronize()を支持して廃止予定ですcudaDeviceSynchronize()
  2. nsight は 2 回目のカーネル起動でエラーを報告しているが、エラー チェック コードはそうではないという事実から、エラー チェック コードが壊れていると思われます。

さて、あなたの問題に関しては、コードが要求するレジスタが多すぎるためにリソースが不足することがよくあります(スレッドごとのレジスタが多すぎて、要求されたスレッドブロックごとのスレッド数を掛けたものです)。詳細な出力を取得するように指定 -Xptxas -vしてコードを再コンパイルしてから、再コンパイルしてくださいもう一度-maxrregcount 20(またはそのようなもの)を使用して、テスト目的でこれを回避しようとします。

これで問題が「修正」された場合は、次のことを検討してください。

  1. コードの順序を変更または再構築して、レジスタのプレッシャーを軽減する方法があるかどうかを確認してください
  2. maxrregcountそうでない場合は、関心のある起動構成 (ブロックあたりのスレッド数) に従ってコードをコンパイルして実行できるように、値を上方に調整してください。占有率に影響を与える可能性があるため、この設定のさまざまなレベルでコードをベンチマークすることもできます。通常、コンパイルして実行できる最大値に設定すると、実行時に SM ごとに 1 つのスレッドブロックに制限されます。これで問題ないか、より低い設定があり、SM 常駐ごとに 2 つのスレッドブロックが許可され、パフォーマンスが向上する可能性があります。コードをベンチマークするだけでわかります。
于 2013-07-19T12:47:28.430 に答える