6

私は、C++ で書かれた量子力学ライブラリ (プレーンな C ラッパーを書きます) と CUDA への Haskell バインディングを書くことを検討しています。主なボトルネックは常に、CUDA パーツで使用される GPU メモリです。C++ では、すべてのオブジェクトに自動メモリ管理があるため、これは非常に効率的に処理されます。つまり、スコープを離れるとすぐに消去されます。また、C++11 の移動セマンティクスを使用してコピーを回避していますが、Haskell ではコピーは明らかに必要ありません。

しかし、オブジェクトがガベージ コレクションされた Haskell から管理されている場合、これ以上スムーズに動作しないのではないかと心配しており、めったに使用されないオブジェクトをホスト メモリに移行するためのヒューリスティックを考え出す必要があるかもしれません (これは非常に遅くなる傾向があります)。 . この懸念は理にかなっているでしょうか、それとも GHC ガベージ コレクションが非常に効果的であり、Haskell ランタイムがメモリを節約する必要があると認識していない場合でも、ほとんどのオブジェクトが C++ とほぼ同じ速さで消滅するのでしょうか? 一部のオブジェクトがあまりにも多くの GPU メモリを占有しているため、できるだけ早く削除する必要があることを知らせるためのトリックや方法はありますか?

4

1 に答える 1

5

Haskell ランタイムがメモリを節約する必要があると認識していない場合でも?

これが問題です。GHC GC は外部オブジェクトの大きさを認識していないため、外部オブジェクトはヒープ プレッシャを加えず、可能な限りすぐに収集されません。

これを軽減するには、performGC手動で呼び出してメジャー GC を強制します。

于 2012-05-24T11:42:21.960 に答える