2011-01-18 6 views
1

OpenGL頻繁に使用されるバッファが孤立するのが一般的です。理想的にはドライバは同じサイズのバッファが要求されたことに気づき、可能であれば古いバッファを返します。バッファは、古いバッファがまだ使用中で再利用できない場合にのみ新しいメモリを割り当てます。OpenCLバッファを孤立させるべきですか?

OpenCL(最新の開発者用ドライバを使用しているNVIDIAハードウェア上)この技術についてはよくわかりません。私は頻繁に再割り当てするC++ラッパーrefcountingによって処理される256kBのバッファを持っています。ほとんどの場合、これはうまくいきますが、新しいバッファを割り当てるときにOpenCLがCL_OUT_OF_MEMORYエラーをスローします。

私は自分のアプローチ(例えば、一定数のバッファを使用する)を切り替えるべきだと思いますか?または、私はこの問題の他の考えられる原因を調査すべきですか?

種類について、

フロリアン

答えて

1

のOpenCLは、メモリの割り当てと割り当て解除のためのCのセマンティクスを使用します。そのため、バッファを自動的に再利用することはありません。 にはがあり、明示的にバッファを解放し、後で新しいバッファを割り当てることができます。あるいは、手動でバッファを再利用することは良い方法です。割り当ては非常に高価な操作になります。

+0

私はそれについては分かりません。 OpenCLはCのセマンティクスを使用しますが、OpenGLの属性と技術を継承しています。 cppラッパー・ライブラリー(cl.hpp)の割り振りと再割り振りは、次のようになります:// init cl :: Buffer b = cl :: Buffer(attribs); // reinit b = cl :: Buffer(他の属性)...今、ラッパーは再配置作業をしています...しかし、OpenCLの実装では独自のメモリ管理が必要です。そして、それは同じサイズのバッファを再利用することができます。 – fho

+0

そのようなバッファを「再初期化」すると、メモリリークが発生します。それは再初期化されませんが、別のバッファを作成し、以前のバッファへの参照を失います。参照が失われても、解放されたり再利用されたりするわけではありません!これをしないでください。 – dietr

+0

あなたに同意しないと申し訳ありませんが、C++ OpenCLラッパーは、C++オブジェクトが破棄されたときにOpenCLリソースを解放する参照カウントされたシステムを実装しています。 – fho

関連する問題