4

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 よりもパフォーマンスが良かったので、さらにスレッド数を増やしてみました。

4

3 に答える 3

6

問題は共有メモリの構成とは関係ありませんが、起動しているスレッドの数に関係しています。

スレッドごとに 63 個のレジスタを使用し、640 個のスレッドを起動すると、合計 40320 個のレジスタが得られます。デバイスのレジスタの合計量は 32K であるため、リソースが不足しています。

オンチップ メモリについては、Tom の回答で詳しく説明されています。彼がコメントしたように、エラーの API 呼び出しを確認すると、将来のエラーに役立ちます。

于 2012-09-13T09:03:10.687 に答える
3

コンピューティング機能 2.0 以上のデバイスには、SM ごとに 64KB のオンチップ メモリがあります。これは、16KB L1 および 48KB smem、または 48KB L1 および 16KB smem (コンピューティング機能 3.x では 32/32) として構成可能です。

あなたのプログラムは別の理由でクラッシュしています。すべての API 呼び出しでエラーをチェックしていますか? cuda-memcheck は試しましたか?

共有メモリの使用量が多すぎると、カーネルの起動時にリソースが不十分であるというエラーが表示されます。

于 2012-09-13T08:48:37.807 に答える
-1

また、ホストから GPU にパラメーターを渡すには共有メモリ (最大 256 バイト) が使用されるため、実際の 48KB を取得することはありません。

于 2012-09-20T14:53:41.127 に答える