私はCUDAに似たものを作成していますが、RAMからVRAMへのメモリのコピーは、RAMからそれ自体へのコピーと同じように非常に高速であることがわかりました。ただし、VRAMからRAMへのコピーは、RAMからVRAMへのコピーよりもはるかに低速です。
ちなみに私はRAMからVRAMへのコピーglTexSubImage2D
とVRAMからRAMへのコピーに使用しglGetTexImage
ています。
なんで?RAMをVRAMにコピーするなど、パフォーマンスを向上させる方法はありますか?
GPUからCPUへのデータ転送は、常に非常に遅い操作でした。
GPU-> CPUリードバックは、CPUがGPUが計算を完了するのを待たなければならない「同期点」を導入します。この間、CPUはGPUへのデータの供給を停止し、GPUをストールさせます。
ここで、最新のGPUは高度に並列化された方法で設計されており、常に数千のスレッドが実行されていることを思い出してください。同期ポイントは、計算結果をリードバックする前に、これらすべてのスレッドが処理を終了するのを待つ必要があります。リードバックが完了すると、これらのスレッドはすべてゼロから実行を再開する必要があります...悪いです!
結果を非同期で(数フレーム後に)読み戻すことで、GPUはスレッドが不足することなく実行を継続できます(上記で概説した停止と再開の問題)。これにより、パフォーマンスが大幅に向上します。GPUが並列になるほど、パフォーマンスが向上します。
グラフィカルチップとドライバーによっては、PBOを使用することでパフォーマンスが向上する場合があります。
ちなみに、私はglTexSubImage2Dを使用してRAMからVRAMにコピーし、glGetTexImageを使用してVRAMからRAMにコピーしています。
次に、データをコピーしていません。ピクセル転送操作を実行していますが、画像の内部形式、ピクセル転送形式、およびピクセル転送タイプのパラメーターによっては、CPUの変更が必要になる場合があります。
実際のコードを提供しなかったため、不適切なパラメーターを選択したかどうかを知る方法はありません。
直接コピーのパフォーマンスをテストする場合は、バッファオブジェクトを使用します。