11

私の環境は

  • ウィンドウズ 7 x64
  • マトラブ 2012a x64
  • キューダ SDK 4.2
  • テスラ C2050 GPU

「訂正不能な ECC エラーが発生しました」というメッセージが表示されて GPU がクラッシュする理由がわかりません。このエラーは、512 スレッド以上を使用している場合にのみ発生します。カーネルを投稿することはできませんが、それが何をするかを説明しようと思います。

一般に、カーネルはいくつかのパラメーターを取り、スレッド サイズ M と別の数値 N で定義される 2 つの複素行列を生成します。したがって、返される行列のサイズは MxN になります。一般的な構成は 512x512 ですが、各数値は独立しており、上下に変化する可能性があります。数値が 256x256 の場合、カーネルは機能します。

各スレッド (カーネル) は、スレッド ID、つまりサイズ 999xM に基づいて 2D 配列から 999 サイズのベクトルを抽出し、計算のために出力行列の行 (0 .. N-1) を循環します。pow、sin、cos のみを使用して、多数の中間パラメータが計算されます。+ - * /オペレーター。出力行列の 1 つを計算するには、追加のループを実行して、以前に抽出された 999 ベクトルの寄与を合計する必要があります。このループは、貢献を許可する値の範囲を決定するためにいくつかの中間計算を行います。次に、計算された小数部の値の cos 値と sine 値によって決定される係数によって寄与がスケーリングされます。これがクラッシュする場所です。定数値または 1.0 またはその他の値に固執すると、カーネルは問題なく実行されます。ただし、呼び出し (cos または sine) の 1 つだけが含まれていると、カーネルがクラッシュします。

いくつかの疑似コードは次のとおりです。

kernel()
{

/* Extract 999 vector from 2D array 999xM - one 999 vector for each thread. */
for (int i = 0; i < 999; i++)
{
    .....
}

/* Cycle through the 2nd dimension of the output matricies */
for (int j = 0; j < N; j++)
{
    /* Calculate some intermediate variables */

    /* Calculate the real and imaginary components of the first output matrix */
    /* real = cos(value), imaginary = sin(value) */

    /* Construct the first output matrix from some intermediate variables and the real and imaginary components */

    /* Calculate some more intermediate variables */

    /* cycle through the extracted vector (0 .. 998) */
    for (int k = 0; k < 999; k++)
    {

        /* Calculate some more intermediate variables */

        /* Determine the range of allowed values to contribute to the second output matrix. */

        /* Calculate the real and imaginary components of the second output matrix */
        /* real = cos(value), imaginary = sin(value) */
        /* This is were it crashes, unless real and imaginary are constant values (1.0) */

        /* Sum up the contributions of the extracted vector to the second output matrix */

     }
     /* Construct the Second output matrix from some intermediate variables and the real and imaginary components */

}
}

これはレジスタの制限が原因である可能性があると考えましたが、占有計算機はそうではないことを示しています。512 スレッドで 32,768 未満のレジスタを使用しています。これの原因が何であるかについて、誰かが何か提案をすることはできますか?

ここにptasx情報があります:

ptxas info    : Compiling entry function '_Z40KerneliidddddPKdS0_S0_S0_iiiiiiiiiPdS1_S1_S1_S1_S1_S1_S1_S1_S1_' for 'sm_20' 

ptxas info    : Function properties for _Z40KerneliidddddPKdS0_S0_S0_iiiiiiiiiPdS1_S1_S1_S1_S1_S1_S1_S1_S1_ 

8056 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 

ptxas info    : Function properties for __internal_trig_reduction_slowpathd 

40 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 

ptxas info    : Used 53 registers, 232 bytes cmem[0], 144 bytes cmem[2], 28 bytes cmem[16]

tmpxft_00001d70_00000000-3_MexFunciton.cudafe1.cpp 
4

1 に答える 1

18

「修正不可能な ECC エラー」は通常、ハードウェア障害を指します。ECC はエラー訂正コードで、RAM に格納されたビットのエラーを検出して訂正する手段です。漂遊宇宙線は、RAM に保存されている 1 ビットをかなりの頻度で混乱させる可能性がありますが、「修正不可能な ECC エラー」は、RAM ストレージから「間違った」数ビットが出力されていることを示します。ECC が元のビット値を復元するには多すぎます。

これは、GPU デバイスのメモリに不良または限界の RAM セルがあることを意味している可能性があります。

どんな種類の限界回路でも 100% 故障することはありませんが、頻繁な使用とそれに伴う温度上昇のストレス下では故障する可能性が高くなります。

PC のすべての RAM バンクをストレス テストして、どのチップが故障しているかを確認または特定するための診断ユーティリティがあちこちに出回っていますが、GPU のデバイス RAM バンクをテストするためのアナログは知りません。

同様の機能を持つ GPU を備えた別のマシンにアクセスできる場合は、そのマシンでアプリを実行して、動作を確認してください。2 台目のマシンで ECC エラーが発生しない場合は、ほぼ確実に最初のマシンのハードウェアに問題があることが確認されます。2 台目のマシンで同じ ECC エラーが発生した場合は、ここに書いたことをすべて無視して、引き続きソフトウェアのバグを探してください。コードが実際にハードウェアの損傷を引き起こしている場合を除き、2 台のマシンで同じハードウェア障害が発生する可能性は非常に低くなります。

于 2012-08-07T05:45:32.920 に答える