私は一連の数学関数を設計し、CPUとGPU(CUDA付き)バージョンの両方で実装しています。ルックアップテーブルのCUDAメモリ
これらの機能のいくつかはルックアップテーブルに基づいています。ほとんどのテーブルは4KBをとりますが、そのうちいくつかはもう少しです。ルックアップテーブルに基づく関数は、入力を受け取り、ルックアップテーブルの1つまたは2つのエントリを選択し、次に補間または類似の手法を適用して結果を計算する。
私の質問は今どこですか:これらのルックアップテーブルはどこに保存する必要がありますか? CUDAデバイスには、値(グローバルメモリ、定数メモリ、テクスチャメモリなど)を格納する場所が多数あります。各テーブルは多くのスレッドで同時に読み取ることができ、入力値、したがってルックアップインデックスはすべてのワープのスレッド間で完全に無相関であり(無相関メモリアクセスにつながります)、メモリが最も高速なアクセスを提供します。
これらのテーブルの内容はあらかじめ計算され、完全に一定であると付け加えます。ただ、明確にする
EDIT
:私は約10の異なる4KBのルックアップテーブルを格納する必要があります。とにかく、この場合の解決策が、例えば次のような場合について同じであることを知ることは素晴らしいことであろう。 100個の4KBテーブルまたは10 16KBルックアップテーブル
定数キャッシュはブロードキャストの場合を想定しています。つまり、ワープ間のアクセスは一様です。ワープ内のすべてのスレッドが異なる場所にアクセスしてもパフォーマンスが低下する場合には、これが機能します。共有メモリは高速で48KBですが、他の目的のために必要となるかもしれません。また、コードがうまく動作しないライブラリの一部です。共有メモリを使用できない場合は、テクスチャをお勧めします。 FLOPSがGPU世代全体のメモリ帯域幅よりも高速に増加しているため、GPU上のテーブルをまったく使用しないことをお勧めします(CUDA数学ライブラリも参照してください)。 – njuffa
ありがとう、njuffa、明確な説明のため。私の唯一の疑問は共有メモリに関することです。私が正しく覚えていれば、このメモリは同じワープのスレッド間で共有されます。だから、私はすべてのワープにテーブルを複製するべきですか?カーネルの終了後もテーブルは永続的になりますか? – Spiros
共有メモリは、スレッドブロック内のすべてのスレッド間で共有されます。ですから、合計40KBのテーブルストレージを使用すると、コードはSMごとに1つのスレッドブロックに制限されることになります。ほとんどの状況では少なくとも2つのスレッドブロックを実行する方がよいので、いくつかのテーブルが共有メモリ(最もアクセスの多いもの)とテクスチャメモリのものに格納されている混合スキームを使用することを検討してください。テクスチャメモリには、(低精度の)線形補間を自由に得ることができるという利点もあります。大きなテーブルを必要とするどのような数学関数を実装していますか? – njuffa