5

Nvidia 290.10 64 ビット ドライバーを使用して、Linux ベースの c++ OpenGL アプリケーションに取り組んでいます。非常に多くのライブデータを使用するため、メモリフットプリントを削減しようとしています。

私は valgrind/massif を使用してヒープの使用状況を分析してきました。さまざまなことを最適化するのに役立ちましたが、現在使用されているヒープ メモリの最大のチャンクは libGL によって割り当てられています。どのようにしきい値を設定しても、massif では、それらの割り当てがどこから来たのかを詳細に確認することはできません。それが libGL であるということだけです。ピーク時には、libGL によって約 250MB が割り当てられます (総ヒープ使用量 900MB のうち)。グラフィック カードには、VBO とテクスチャ (ほとんどが 1 つの大きな 4096*4096 テクスチャ) と同様の量のメモリを保持しています。

そのため、GPU メモリにアップロードするのと同じ量のメモリが libGL によってヒープに割り当てられているように見えます。VBO の量がピークに達すると、libGL の割り当てもピークに達します。それは正常ですか?多くの GPU メモリを持つことの利点の 1 つは、RAM を解放できることだと思いましたか?

4

1 に答える 1

7

OpenGL の実装では、さまざまな理由からデータのコピーをシステム メモリに保持する必要があるため、これはまったく正常な動作です。

OpenGL では、GPU への排他的アクセスがないため、その用途によっては、データをスワップアウトする (または GPU メモリからいくつかのオブジェクトを解放する) ことが必要になる場合があります。また、GPU がクラッシュする可能性があり、ドライバーはユーザーが気付かないうちに静かにリセットします。これにも、すべてのバッファ データの完全なコピーが必要です。

また、アドレス空間の割り当て(Valgrind によって報告される値) と実際のメモリ使用量には大きな違いがあることを忘れないでください。

于 2012-05-22T09:49:15.260 に答える