7

GPUに「反機能」ルーチンを効率的に計算させるための最良のパターンは何ですか?これは通常、読み取りではなく配置されたメモリ書き込みに依存しますか?例えば。ヒストグラムの計算、並べ替え、数値のパーセンテージによる除算、サイズの異なるデータのリストへのマージなど。

4

2 に答える 2

7

確立された用語は、読み取りの収集書き込みの分散です。

読み取りを収集

これは、プログラムが固定位置(フラグメントシェーダーのターゲットフラグメント位置など)に書き込みますが、任意のデータソース(テクスチャ、ユニフォームなど)に高速にアクセスできることを意味します。

スキャッター書き込み

これは、プログラムが任意にアドレス指定できない入力データのストリームを受信するが、任意のメモリ位置への高速書き込みを実行できることを意味します。

明らかに、OpenGLのシェーダーアーキテクチャはギャザーシステムです。最新のOpenGL-4では、フラグメントシェーダーでのスキャッター書き込みも可能ですが、速度が遅くなります。

それで、最近、OpenGLで「散乱」をエミュレートするための最も効率的な方法は何ですか。これまでのところ、これはピクセルサイズのポイントで動作する頂点シェーダーを使用しています。データポイントと同じ数のポイントを送信して、それらの位置を適切に設定することにより、それらを処理してターゲットメモリに分散させます。ジオメトリシェーダーとテッセレーションシェーダーを使用して、頂点ユニットで処理されたポイントを生成できます。アドレス指定に頂点/ポイントインデックスを使用して、データ入力にテクスチャバッファとUBOを使用できます。

于 2012-02-25T10:48:52.237 に答える
1

GPUは複数のメモリタイプで構築されています。1つのタイプは、ホストCPUとGPUにアクセス可能なDDRxRAMです。OpenCLとCUDAでは、これは「グローバル」メモリと呼ばれていました。GPUの場合、グローバルメモリ内のデータをGPUとホスト間で転送する必要があります。通常、パイプライン化されたメモリアクセスを可能にするためにバンクに配置されます。したがって、「グローバル」メモリへのランダムな読み取り/書き込みは比較的低速です。「グローバル」メモリにアクセスする最良の方法は、順次です。
サイズの範囲は、デバイスあたり1G〜6Bです。

次のタイプのメモリは、GPU上にあります。これは、コンピューティングユニット/マルチプロセッサ内の多数のスレッド/ワープで使用できる共有メモリです。これはグローバルメモリより高速ですが、ホストから直接アクセスすることはできません。CUDAはこの共有メモリを呼び出します。OpenCLはこのローカルメモリを呼び出します。これは、アレイへのランダムアクセスに使用するのに最適なメモリです。CUDAの場合は48K、OpenCLの場合は32Kです。

3番目の種類のメモリはGPUレジスタであり、OpenCLではプライベートまたはCUDAではローカルと呼ばれます。プライベートメモリは最速ですが、ローカル/共有メモリよりも利用可能性が低くなります。

メモリへのランダムアクセスを最適化するための最良の戦略は、グローバルメモリとローカル/共有メモリ間でデータをコピーすることです。したがって、GPUアプリケーションは、グローバルメモリの一部をローカル/共有にコピーし、ローカル/共有を使用して作業を行い、結果をグローバルにコピーして戻します。

ローカルへのコピー、ローカルを使用したプロセス、グローバルへのコピーバックのパターンは、GPUで適切にプログラミングすることを理解し、学ぶための重要なパターンです。

于 2012-03-03T03:18:11.447 に答える