Windows 7 64 ビット SP1 で CUDA Toolkit 4.0 と Visual Studio 2010 Professional を使用して GTX 580 用の CUDA アプリケーションを開発しています。私のプログラムは通常の CUDA プログラムよりもメモリを大量に消費するため、各 CUDA ブロックにできるだけ多くの共有メモリを割り当てようとしています。ただし、ブロックごとに 32K を超える共有メモリを使用しようとするたびに、プログラムがクラッシュします。
CUDA の公式ドキュメントを読むと、Compute Capability が 2.0 以上の CUDA デバイスでは、SM ごとに 48KB のオンダイ メモリがあり、オンダイ メモリは L1 キャッシュと共有メモリに分割されていることがわかりました。
同じオンチップ メモリが L1 と共有メモリの両方に使用され、共有メモリに対して L1 専用にするメモリの量は、カーネル呼び出しごとに構成可能です (セクション F.4.1) http://developer.download.nvidia.com /compute/DevZone/docs/html/C/doc/Fermi_Tuning_Guide.pdf
これにより、プログラムの実行中に共有メモリとして 32KB のワンダイ メモリしか割り当てられなかったのではないかと疑うようになりました。したがって、私の質問: 48KB のオンダイ メモリのすべてを共有メモリとして使用することは可能ですか?
考えられることはすべて試しました。nvcc にオプション --ptxas-options="-v -dlcm=cg" を指定し、プログラムで cudaDeviceSetCacheConfig() と cudaFuncSetCacheConfig() を呼び出しましたが、いずれも問題を解決しませんでした。レジスタのスピルが発生していないこと、および誤ってローカル メモリを使用していないことも確認しました。
1> 24 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
1> ptxas info : Used 63 registers, 40000+0 bytes smem, 52 bytes cmem[0], 2540 bytes cmem[2], 8 bytes cmem[14], 72 bytes cmem[16]
私は 32KB の共有メモリを使用できますが、これによりすでにパフォーマンスが大幅に向上していますが、高速なオンダイ メモリをすべて最大限に活用したいと考えています。どんな助けでも大歓迎です。
更新:プログラムがクラッシュしたとき、640 スレッドを起動していました。512 の方が 256 よりもパフォーマンスが良かったので、さらにスレッド数を増やしてみました。