2013-06-13 17 views
7

私は一連の数学関数を設計し、CPUとGPU(CUDA付き)バージョンの両方で実装しています。ルックアップテーブルのCUDAメモリ

これらの機能のいくつかはルックアップテーブルに基づいています。ほとんどのテーブルは4KBをとりますが、そのうちいくつかはもう少しです。ルックアップテーブルに基づく関数は、入力を受け取り、ルックアップテーブルの1つまたは2つのエントリを選択し、次に補間または類似の手法を適用して結果を計算する。

私の質問は今どこですか:これらのルックアップテーブルはどこに保存する必要がありますか? CUDAデバイスには、値(グローバルメモリ、定数メモリ、テクスチャメモリなど)を格納する場所が多数あります。各テーブルは多くのスレッドで同時に読み取ることができ、入力値、したがってルックアップインデックスはすべてのワープのスレッド間で完全に無相関であり(無相関メモリアクセスにつながります)、メモリが最も高速なアクセスを提供します。

これらのテーブルの内容はあらかじめ計算され、完全に一定であると付け加えます。ただ、明確にする

EDIT

:私は約10の異なる4KBのルックアップテーブルを格納する必要があります。とにかく、この場合の解決策が、例えば次のような場合について同じであることを知ることは素晴らしいことであろう。 100個の4KBテーブルまたは10 16KBルックアップテーブル

+4

定数キャッシュはブロードキャストの場合を想定しています。つまり、ワープ間のアクセスは一様です。ワープ内のすべてのスレッドが異なる場所にアクセスしてもパフォーマンスが低下する場合には、これが機能します。共有メモリは高速で48KBですが、他の目的のために必要となるかもしれません。また、コードがうまく動作しないライブラリの一部です。共有メモリを使用できない場合は、テクスチャをお勧めします。 FLOPSがGPU世代全体のメモリ帯域幅よりも高速に増加しているため、GPU上のテーブルをまったく使用しないことをお勧めします(CUDA数学ライブラリも参照してください)。 – njuffa

+0

ありがとう、njuffa、明確な説明のため。私の唯一の疑問は共有メモリに関することです。私が正しく覚えていれば、このメモリは同じワープのスレッド間で共有されます。だから、私はすべてのワープにテーブルを複製するべきですか?カーネルの終了後もテーブルは永続的になりますか? – Spiros

+2

共有メモリは、スレッドブロック内のすべてのスレッド間で共有されます。ですから、合計40KBのテーブルストレージを使用すると、コードはSMごとに1つのスレッドブロックに制限されることになります。ほとんどの状況では少なくとも2つのスレッドブロックを実行する方がよいので、いくつかのテーブルが共有メモリ(最もアクセスの多いもの)とテクスチャメモリのものに格納されている混合スキームを使用することを検討してください。テクスチャメモリには、(低精度の)線形補間を自由に得ることができるという利点もあります。大きなテーブルを必要とするどのような数学関数を実装していますか? – njuffa

答えて

2

テクスチャメモリ(現在は読み取り専用データキャッシュと呼ばれています)は、補間の利点ではありませんが、おそらく探索の価値のある選択肢になります。これは、この量を超えて読み取ることなく32ビットの読み取りをサポートします。ただし合計で48Kに制限されています。ケプラー(計算3.x)の場合、これは今プログラムするのが非常に簡単です。

グローバルメモリは、32ビットモードで構成しない限り、スレッドごとに128バイトのデータをドラッグすることが多いため、実際にメモリから必要なデータが何倍になるかはメモリアクセスを合体できません。したがって、48K(40Kと書かれています)以上を使用したい場合は、おそらく32ビットモードが必要です。

合併を考えて、これらのテーブルから一連の値を連続してアクセスする場合、スレッドごとに64ビットまたは128ビットの読み込みとしてグループ化して読み取ることができるように、テーブルをインターリーブすることができます。これは、グローバルメモリからの128バイトの読み取りが有用であることを意味する。

問題は、ルックアップテーブルを使用してソリューションのメモリ帯域幅を制限していることです。 L1キャッシュサイズ(Fermi/compute 2.x上)を48Kに変更すると、特に他の32K共有メモリを使用していない場合には、大きな違いが生じる可能性があります。テクスチャメモリを試してから、グローバルメモリを32ビットモードで試して、あなたのアルゴリズムに最適なものを見てください。最後に、ハードウェアの選択肢がある場合は、メモリ帯域幅の良いカードを選択します。

関連する問題