GPUでルックアップテーブルを使用する場合の最適なメモリアクセス


9

私は学士号プロジェクトのGPUの等値面アルゴリズムを調査しています(具体的には、実数値のフィールドではなく、バイナリの入出力ボクセルデータのみに集中しています)。したがって、OpenFrameworksで古き良きマーチングキューブのCPU実装があり、それをGLSLコンピューティングシェーダーに移植しようとしている段階で、潜入する前に落とし穴を考慮しています。vertシェーダーとfragシェーダーのみを記述しました以前はそれは私にとってすべて新しいものです。

私の最初の問題は、ワークグループ内の数十または数百のスレッドにわたってルックアップテーブルを効率的に使用する方法です。GPUにはさまざまなタスク用にさまざまな種類のメモリがあることを理解していますが、それぞれがどのように動作するか、どのタイプを使用するかは完全にはわかりません。

Paul Bourkeの古典的なcopypastaテーブルは256 * 16配列なので、スカラーバイトタイプを使用する場合、これはおそらく4kbテクスチャまたはSSBOにパックできます。

問題は、異なるスレッドが互いにつまずくのを防ぐ方法ですか?各ワークグループの多くのキューブは、同じ構成を持つ可能性があるため、バッファ内の同じ場所に同時にアクセスしようとします。これに対処するための回避策または最適化はありますか?


読み取り専用のルックアップテーブルの場合は、バッファ/テクスチャを使用できます。通常のテクスチャ形式の1つにパックするか、DX11 / OpenGLの新しい機能のいくつかを使用してカスタム形式にすることができます。DX11ランドのUAV、またはOpenGLランドのテクスチャ/ shader_image_load_store。
RichieSams 2015年

さらに、このプレゼンテーションを見てください:cvg.ethz.ch/teaching/2011spring/gpgpu/cuda_memory.pdfこれはCUDA向けですが、基盤となるハードウェアで何が起こっているかについてより良いアイデアを提供するはずです
RichieSams

完全な答えではありませんが、キャッシュに収まりやすく、キャッシュミスが少なくなるため、使用するメモリの量は少ないほど良いです。カーブ上のポイントをテクスチャに焼き付けるように、補間可能な値がある場合は、これをチェックアウトして、より少ないメモリでより高品質のカーブルック
アランウルフ

回答:


6

GPUコンピューティングシェーダーのルックアップテーブルを配置するのに最適な場所は、ルックアップテーブルのサイズとアクセスの頻度/コヒーレンシーによって異なります。あなたの場合(あなたが4kbについて述べた)、共有ローカルメモリがおそらく最良でしょう(同じカーネル内の他の目的のためにこのメモリを必要としないと仮定すると)。このメモリは、APIによって名前が異なりますが、アーキテクチャは同じであり、同じパフォーマンスガイドラインに従います。

  • CUDA:スレッドグループ共有メモリ
  • DirectCompute:グループ共有メモリ
  • OpenCL:ローカルメモリ
  • メタル:スレッドグループメモリ
  • OpenGL:共有メモリ

実行中の特定のGPUのキャッシュサイズによっては、ルックアップテーブルを読み取り専用バッファーとしてグローバルメモリに保存することもできます。

これは読み取り専用のルックアップテーブルであると想定しています。読み書き可能なルックアップテーブルは完全に異なる獣であり、そこに良いオプションはありません。


また、読み取り専用バッファが4kbの読み取り専用データを共有ローカルメモリに格納するよりも優れている場合もあります。たとえば、ローカルメモリに保存すると、スレッドグループごとにデータの一意のコピーが存在する可能性があります。バッファがキャッシュに収まる場合、読み取り専用アクセスパターンの場合、キャッシュがローカルメモリよりもパフォーマンスが高い可能性があります。
John Calsbeek、2016年

フィードバックの人たちに感謝します。私はこれを今使用していたプロジェクトを終了し、r8ui読み取り専用バッファーテクスチャを使用して仕上げました。これはかなりうまくいきました:)
russ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.