2

私はcudaに非常に慣れておらず、ほんの数週間前に並列プログラミングとcudaについて読み始めました。cudaツールキットをインストールした後、sdkサンプル(ツールキットのインストールに付属)を閲覧していて、それらのいくつかを試してみたかったのです。私はmatrixMul0_Simpleフォルダーから始めました。このプログラムは正常に実行されます(私はVisual Studio 2010を使用しています)。ここで、行列のサイズを変更して、より大きな行列(たとえば、960X960または1024x1024)を試してみたいと思います。この場合、何かがクラッシュします(画面が真っ暗になり、メッセージ:ディスプレイドライバが応答を停止して回復しました)。

私はコードのこの2行を(main関数から)変更しています:

    dim3 dimsA(8*4*block_size, 8*4*block_size, 1);
    dim3 dimsB(8*4*block_size, 8*4*block_size, 1);

彼らがいた前に:

dim3 dimsA(5*2*block_size, 5*2*block_size, 1);
dim3 dimsB(5*2*block_size, 5*2*block_size, 1);

誰かが私が間違っていることを私に指摘できますか?この例では、正しく機能するように他の何かを変更する必要があります。どうも!

編集:あなたの一部が提案したように、私はタイムアウト値を変更しました(0はどういうわけか私には機能しませんでした、私はタイムアウトを60に設定しました)、それで私のドライバーはクラッシュしません、しかし私は次のようなエラーの膨大なリストを受け取ります:... .....。

Error! Matrix[409598]=6.40005159, ref=6.39999986 error term is > 1e-5
Error! Matrix[409599]=6.40005159, ref=6.39999986 error term is > 1e-5

これはメモリの割り当てと関係がありますか?そこで変更を加える必要がありますか?

4

3 に答える 3

2

カーネル(matrixMulCUDA)で使用されているインデックスをもう少し詳しく調べることをお勧めします。割り当てられていないメモリに書き込んでいるようです。

具体的には、dimsA変数とdimsB変数を変更したのはそれだけですか?カーネル内では、スレッドとブロックインデックスを使用してデータにアクセスします。それに応じて、データサイズも増やしましたか?カーネルでは境界チェックが行われていないため、カーネルの起動構成を変更するだけでデータは変更しない場合は、データを過ぎて他のメモリに書き込んでいる可能性があります

于 2012-12-10T22:04:20.683 に答える
2

Windowsでタイムアウト検出と回復(TDR)を無効にしましたか?コードは正常に実行されている可能性がありますが、行列が大きくなるとカーネルの実行がWindowsのタイムアウトを超え、Windowsはカードがロックされていると見なすため、カードがリセットされ、同じメッセージが表示されます。あなたが説明します。ここでそれが問題ではない場合でも、Windowsで深刻なCUDA作業を行う前に、それを無効にする必要があります。通常のグラフィックスレンダリングはフレームごとに数分の1秒しかかからないため、デフォルトではタイムアウトは非常に短くなっています。

TDRとそれをオフにする方法について説明しているNVidiaフォーラムのこの投稿を参照してください。

WDDMTDR-NVidiadevtalkフォーラム

特に、キーHKLM \ System \ CurrentControlSet \ Control \ GraphicsDrivers \ TdrLevelを0(検出無効)に設定することをお勧めします。

または、HKLM \ System \ CurrentControlSet \ Control \ GraphicsDrivers \ TdrDelayを設定して、タイムアウト期間を長くすることもできます。デフォルトは2で、秒単位で指定されます。個人的には、CUDAで作業を行う場合、TDRは常に煩わしいことがわかったので、完全にオフにします。IIRC、TDR関連の変更を有効にするには、システムを再起動する必要があります。

于 2012-12-11T02:36:34.607 に答える
2

新しい問題は、実際にはNVidiaの例で提供されている厳密な許容範囲にすぎません。カーネルは正しく実行されています。累積エラーが、この例で設定した制限よりも大きいと不平を言っているだけです。これは、すべてエラーを蓄積しているより多くの数学演算を実行しているからです。それが与える数値を見ると、参照の答えから約0.00005だけ外れています。これは、多くの単精度浮動小数点演算の後で珍しいことではありません。デフォルトの行列サイズではなく、これらのエラーが発生する理由は、元の行列が小さかったため、乗算に必要な操作が大幅に少なくなったためです。N x N行列の行列乗算には、N^3演算のオーダーが必要です。

runTest()関数の終わり近くを見ると、CPU上の参照回答を計算するcomputeGold()の呼び出しがあります。次に、結果を比較するshrCompareL2feのようなものへの呼び出しがあるはずです。これに対する最後のパラメータは許容誤差です。この許容範囲のサイズを大きくする場合(たとえば、1e-5ではなく1e-3または1e-4に)、これらのエラーメッセージを削除する必要があります。これらの呼び出しがいくつかある可能性があることに注意してください。私が持っているSDKの例のバージョンには、オプションのCUBLAS実装があるので、ゴールドとの比較もあります。「CUDAmatrixMulとHostの結果の比較」というprintステートメントの直後は、変更したいものです。

于 2012-12-11T23:28:36.667 に答える