別の言い方をすれば、GPGPU(CUDA、OpenCL)を使用してOpenGLまたはDirectX(またはアナログ)を再実装しようとすると、NVIDIAおよびAMDカードのストック実装よりも遅くなるのはなぜですか?
GPGPUを使用して、頂点/フラグメント/ジオメトリ/テッセレーションシェーダーをどのように高速に作成できるかはわかりますが、レンダリングするフラグメントのリストの生成、クリッピング、テクスチャサンプリングなどについてはどうでしょうか。
私は純粋に学術的な興味を求めています。
別の言い方をすれば、GPGPU(CUDA、OpenCL)を使用してOpenGLまたはDirectX(またはアナログ)を再実装しようとすると、NVIDIAおよびAMDカードのストック実装よりも遅くなるのはなぜですか?
GPGPUを使用して、頂点/フラグメント/ジオメトリ/テッセレーションシェーダーをどのように高速に作成できるかはわかりますが、レンダリングするフラグメントのリストの生成、クリッピング、テクスチャサンプリングなどについてはどうでしょうか。
私は純粋に学術的な興味を求めています。
最新のGPUには、コンピューティングAPIから隠されている多くの固定機能ハードウェアがまだあります。これには、ブレンディングステージ、三角形のラスタライズ、および多くのオンチップキューが含まれます。もちろん、シェーダーはすべてCUDA / OpenCLに適切にマッピングされます。結局のところ、シェーダーと計算言語はすべて、GPUの同じ部分である汎用シェーダーコアを使用します。これらのユニットは、非常に幅の広いSIMD CPUの集まりと考えてください(たとえば、GTX 580には16個のコアと32個の幅のSIMDユニットがあります)。
ただし、シェーダーを介してテクスチャユニットにアクセスできるため、「コンピューティング」で実装する必要はありません。そうした場合、空間レイアウト用に最適化されたテクスチャキャッシュにアクセスできないため、パフォーマンスが低下する可能性があります。
ラスタライズに必要な作業量を過小評価しないでください。これは大きな問題であり、すべてのGPUを投入すると、ラスターハードウェアパフォーマンスの約25%が得られます( GPUでの高性能ソフトウェアラスタライズを参照)。これには、固定によって行われるブレンドコストも含まれます。 -通常、機能ユニット。
テッセレーションには、入力を1:4096まで増幅するため、効率的にエミュレートするのが難しい固定機能部分もあります。前もってそれほど多くのメモリを予約したくないことは確かです。
次に、フレームバッファ圧縮にアクセスできないため、パフォーマンスが大幅に低下します。これは、コンピューティング専用モードの場合は「非表示」になる専用のハードウェアがあるためです。最後に、オンチップキューがないため、「グラフィックスパイプライン」が取得するのと同じユーティリティ比に到達することは困難です(たとえば、シェーダーの負荷に応じて頂点シェーダーからの出力を簡単にバッファリングできます。柔軟にシェーダーを切り替えないでください。)
興味深いソースコードリンク: http ://code.google.com/p/cudaraster/
および対応する研究論文: http ://research.nvidia.com/sites/default/files/publications/laine2011hpg_paper.pdf
Nvidiaの一部の研究者は、この投稿で尋ねられたものを正確に実装してベンチマークしようとしました:「「GPUでの高性能ソフトウェアラスタライズ」のオープンソース実装」...
そして、それは「純粋に学術的な関心」のためのオープンソースです。これは、主に三角形のラスタライズのベンチマークを行うための、Openglの限定されたサブセットです。
別の言い方をすれば、GPGPU(CUDA、OpenCL)を使用してOpenGLまたはDirectX(またはアナログ)を再実装しようとした場合
CUDAとOpenCLが存在する前は、GPGPUはDirectXまたはOpenGLを介してアクセスされるシェーダーによって実行されていたことをご存知ですか?
OpenCLまたはCUDAの上にOpenGLを再実装すると、不必要な複雑さが生じます。OpenCLまたはCUDAをサポートするシステムでは、OpenGLおよびDirectXドライバーは、同じハードウェアにアクセスするため、OpenCLおよび/またはCUDAドライバーと多くのコードを共有します。
最新のGPUでは、すべてのパイプラインがHWで実行されます。それがGPU全体の目的です。CPUで行われるのは、簿記とデータ管理です。ブックキーピングは、変換行列のセットアップ全体(つまり、変換行列を決定し、GPUの適切なレジスタに割り当てる)、ジオメトリデータのアップロード(ジオメトリと画像データをGPUメモリに転送する)、シェーダーのコンパイル、そして最後になりますが、「トリガーを引く」、つまり、準備されたプログラムを実行して素敵なものを描画するコマンドをGPUに送信します。次に、GPUはそれ自体でメモリからジオメトリと画像データをフェッチし、レジスタ(=ユニフォーム)のシェーダーとパラメーターに従って処理します。