1

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を使っています。

私はこれで何をすべきか考えている人はいますか?

誰かが何か考えがあれば教えてください:)

4

1 に答える 1

2

エラー

Debug Assertion Failed! Program: File:f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c Line: 1322 

Microsoft C ランタイム関数_CrtIsValidHeapPointerからのものです。デフォルトのデバッグ ビルドでは、追加のヒープ チェックとスタック チェックがコードに追加されます。この関数は、指定されたポインターがローカル ヒープにあることを確認するために使用されます。パス f:... は、C ランタイムでのソース ファイルの場所です。この関数は、Microsoft がライブラリを構築した時点のものです。

アサーションは、範囲外のメモリ アクセスを示します。エラーの原因は、topologyOfKernelsの割り当てが間違っているようです。

corruption.topologyOfKernels = new kernelTopology_ [numberOfLayersInput - 1];

numberofLayersInput要素を割り当てる必要があります。

corruption.topologyOfKernels = new kernelTopology_ [numberOfLayersInput];
于 2012-11-13T15:41:30.560 に答える