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