2

特定のシーンをオフスクリーンフレームバッファー(FBO)にレンダリングしglReadPixels()てから、CPUでの処理に使用してレンダリングされた画像を読み取っています。処理には、いくつかの非常に単純なスキャンルーチンとデータの抽出が含まれます。

プロファイリングを行った後、私のアプリケーションが行うことのほとんどはglReadPixels()、時間の50%以上に時間を費やしていることに気付きました。したがって、自然な手順は、データをコピーする必要がないように、処理をGPUに移動することです。

だから私の質問は-GPUにそのようなものをプログラムするための最良の方法は何でしょうか?
GLSL?
CUDA?
私が現在気付いていない他の何か?
主な要件は、レンダリングされたオフスクリーンフレームバッファ(またはテクスチャにレンダリングできるため、テクスチャデータ)にアクセスでき、CPUに情報を出力できることです(たとえば、1の順序で)。 -フレームあたり2Kb。

4

3 に答える 3

3

GPU プログラミングの概要」の質問の回答が役立つ場合があります。

-アダム

于 2008-12-15T19:23:25.050 に答える
1

他の質問には、GPU プログラミングを開始するためのヒントがいくつかありますが、OpenGL を使用して既に構築されているアプリケーションがある場合、おそらくあなたの質問は、「どれが OpenGL と相互運用するか」ということです。

結局のところ、glReadPixels() を使用して GPU から CPU に FBO を読み戻すオーバーヘッドを回避することが重要です。たとえば、とにかくそれを読み戻さなければならなかった場合、データを CUDA バッファーにコピーしてから、CUDA API を使用して GPU に転送し直しても、あまり意味がありません。

そのため、OpenGL FBO オブジェクトを追加のコピーなしで直接入力として受け取る GPGPU パッケージが必要です。

それはおそらくGLSL以外のすべてを除外するでしょう.

CUDA に OpenGL バッファ オブジェクトを直接操作する方法があるかどうかは 100% わかりませんが、その機能があるとは思いません。

ATI の Stream SDK がそれを行わないことは確かです。(ただし、DirectX と相互運用します。)

計算シェーダーを備えた DirectX 11 の「テクノロジー プレビュー」にも、その機能があるとは思えません。

編集: フォローアップ: 少なくとも最新バージョンの CUDA は、OpenGL の相互運用性をある程度サポートしているようです。もしそうなら、それはおそらくあなたの最善の策です。

于 2008-12-27T20:19:38.030 に答える