1

nsight cuda プロファイラーを使用するか、ターミナルから直接実行すると、うまく動作する Cuda カーネルがあります。しかし、このコマンドを使用すると

cuda-memcheck --leak-check full ./CudaTT 1 ../../file.jpg 

「unspecified launch failure」でクラッシュします。各カーネルコードの後に​​これを使用しています。

e=cudaDeviceSynchronize();

if (e != cudaSuccess) printf("Fail in kernel 2 %s",cudaGetErrorString(e));

そしてcuda-memcheckはこれのいくつかを示しています

========= Program hit error 4 on CUDA API call to cudaDeviceSynchronize 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x24e129]
=========     Host Frame:/usr/local/cuda-5.0/lib/libcudart.so.5.0 (cudaDeviceSynchronize + 0x214) [0x27e24]
=========
========= Program hit error 4 on CUDA API call to cudaFree 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x24e129]
=========     Host Frame:/usr/local/cuda-5.0/lib/libcudart.so.5.0 (cudaFree + 0x228) [0x338b8]

最後にそれは示しています

========= LEAK SUMMARY: 0 bytes leaked in 0 allocations
========= ERROR SUMMARY: 10 errors

なぜこれが起こるのか分かりますか?

編集:

レジスタが多いために起動していなかった別のカーネルをコメントアウトしたところ、上記のカーネルのエラーが変更され、「起動がタイムアウトして終了しました」と表示されました。繰り返しますが、cuda プロファイラーでは正常に動作し、端末では cuda-memcheck なしで実行されますが、cuda-memcheck を使用すると、これが表示されます

========= Program hit error 6 on CUDA API call to cudaDeviceSynchronize 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x24e129]
=========     Host Frame:/usr/local/cuda-5.0/lib/libcudart.so.5.0 (cudaDeviceSynchronize + 0x214) [0x27e24]
=========
========= Program hit error 6 on CUDA API call to cudaFree 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x24e129]
=========     Host Frame:/usr/local/cuda-5.0/lib/libcudart.so.5.0 (cudaFree + 0x228) [0x338b8]
=========     Host Frame:[0xbf913ea8]

そして最後に同じ10個のエラー

========= LEAK SUMMARY: 0 bytes leaked in 0 allocations
========= ERROR SUMMARY: 10 errors

エラー 6 はカーネルのタイムアウトが長すぎることが原因のようですが、なぜ cuda-memcheck なしで動作するのでしょうか? プロファイラーでは、カーネルが 3.771 秒続くことが示されています。

別の奇妙な動作は、計算後にいくつかの値を出力していることです。cuda-memcheck を使用する場合と使用しない場合では値が異なります。

4

2 に答える 2

2

より良いリンクはhttp://docs.nvidia.com/cuda/cuda-memcheck/index.htmlです。Cuda-memcheck は、アプリケーションの CUDA カーネルの実行時間を変更できます。GPU が表示に使用されている場合、ウォッチドッグ タイムアウトが存在し、カーネルのランタイムが固定境界を超えないようにします (Linux では、これは通常 ~5 秒です)。インストルメント化されていないカーネルが 3.7 秒かかることを考えると、memcheck によって実行されているカーネルの変更されたバージョンが実際にウォッチドッグを超えている可能性が非常に高く、そのためカーネルの起動がタイムアウトしています。このような場合には、いくつかのオプションがあります。

  1. X が開始されていないシステムで実行する
  2. Option "Interactive" "off"in を使用して、非対話モードで X サーバーを起動します/etc/X11/xorg.conf。このモードでは、CUDA カーネルの実行中に表示が更新されないことに注意してください。
于 2013-07-11T04:52:08.963 に答える
0

cuda-memcheck を使用すると、カーネルの起動が大幅に遅くなるようです

people.maths.ox.ac.uk/gilesm/cuda/doc/cuda-memcheck.pdf

16ページ

「CUDA-MEMCHECK の下では、アプリケーションの実行速度が大幅に低下します。これにより、CUDA-MEMCHECK を有効にして実行すると、一部のカーネルの起動が起動タイムアウト エラーで失敗する可能性があります。」

于 2013-07-10T00:09:06.433 に答える