lef*_*out 6 garbage-collection haskell ffi ghc
我考虑将Haskell绑定编写为用C++编写的量子力学库(我编写一个普通的C包装器)和CUDA.一个主要的瓶颈始终是CUDA部件使用的GPU内存.在C++中,这是非常有效地处理的,因为所有对象都具有自动内存管理,即一旦它们离开范围就被擦除.此外,我使用C++ 11移动语义来避免复制,无论如何这些在Haskell中显然不是必需的.
然而,我担心当从垃圾收集的Haskell管理对象时,它可能不会顺利运行,我可能需要提出启发式方法将很少使用的对象迁移回主机内存(这往往很慢) .这种恐惧是否合理,或者GHC垃圾收集是如此有效,以至于大多数对象几乎与C++一样快速消失,即使Haskell运行时没有看到它需要在内存上经济?是否有任何技巧可以帮助,或者发出信号表明某些对象占用过多GPU内存并应尽快删除的方法?
即使Haskell运行时没有看到它需要在内存上经济吗?
这就是问题:GHC GC不知道你的异物有多大,所以它们不会施加任何堆压力,因此不会尽快收集.
您可以通过performGC
手动调用强制主要GC 来缓解此问题.