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 を使用する場合と使用しない場合では値が異なります。