Parallel Nsight 2.2 デバッガーに問題があります。とても奇妙で、どう表現していいのかわかりません。とにかく、うまくいくときとうまくいかないときがあります。
私が観察したのは、3 つの要素で名前が付けられた動的配列 (この配列は cuda_kernels や cudaMemcpy atc のような他の関数には影響しません...) で動作することです。そして、これは重要です...サイズを4+に設定すると、エラーはなく、何も落ちません。
興味深い事実は、通常のデバッガー ホール プログラムを介して正常に実行すると、正しい結果で正しく動作することです。また興味深い事実は、この配列を静的に設定すると
署名されていないトポロジー[4];
と同じ値に設定 Nsight デバッガーは動作しますが、非常に遅くなります。
まず最初に、すべての cuda ソース コード (カーネルやすべての cuda 関数など) にコメントを付けましたが、それでも同じです。そのため、さらに host_code にコメントし始めたところ、この不気味なことを行うループ (ホスト コード内) を見つけました。したがって、Nsght-debug のプログラムがループ (テキストの下) に達すると、それは落ちますが、このループにコマンドを記述して各ループの番号を画面に出力すると、実行され、ループが終了し、穴プログラムが終了し、デバッガーに通知されます自分:
デバッグ アサーションに失敗しました! プログラム: ファイル:f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c 行: 1322
式: _CrtIsValidHeapPointer(pUserData)
.... ディスク f すら持っていないので、wtf ???
とにかく、通常のデバッガーでは正常に動作し、正しい結果が得られます。
これは、ループおよび動的配列 * トポロジーと呼ばれます。
unsigned *topology;
unsigned numberOfLayersInput = 5;
topology = new unsigned [numberOfLayersInput];
topology[0] = 784;
topology[1] = 1000;
topology[2] = 800;
topology[3] = 300;
topology[4] = 10;
kernelTopology_ *topologyOfKernels;
topologyOfKernels = new kernelTopology_ [numberOfLayersInput - 1];
for (int i = 0, numberOfThreads; i < numberOfLayersInput; i++)
{
cout <<i << endl; // this is the added line!
numberOfThreads = fixedTopology[i];
topologyOfKernels[i].size = numberOfThreads;
if(numberOfThreads > THREADS_PER_BLOCK)
topologyOfKernels[i].BLOCK_SIZE = THREADS_PER_BLOCK;
else topologyOfKernels[i].BLOCK_SIZE = numberOfThreads;
if(numberOfThreads <= THREADS_PER_BLOCK)
topologyOfKernels[i].GRID_SIZE = 1;
else if(fixedTopology[i] % topologyOfKernels[i].BLOCK_SIZE == 0)
topologyOfKernels[i].GRID_SIZE = fixedTopology[i] / topologyOfKernels[i].BLOCK_SIZE;
else
topologyOfKernels[i].GRID_SIZE = (fixedTopology[i] / topologyOfKernels[i].BLOCK_SIZE) + 1;
}
このコードに間違いは見当たりません...通常のデバッガでも問題ありません。
グラフィックス ドライバー、CUDA ツールキット、CUDA SDK、Paralell Nsight を再インストールしましたが、同じように不気味なことが起こります。ちなみに私はWin7 64bitとVS2010を使っています。
私はこれで何をすべきか考えている人はいますか?
誰かが何か考えがあれば教えてください:)