一种不透明的FFI对象被移除前,垃圾回收需要多长时间?有没有可能加快速度?

6
我考虑编写Haskell绑定到一个用C++(我将编写一个普通的C包装器)和CUDA编写的量子力学库。 CUDA部分使用的GPU内存始终是一个主要瓶颈。在C++中,这种情况可以有效处理,因为所有对象都具有自动内存管理,即一旦它们离开范围就会被删除。此外,我使用C++11移动语义来避免复制,无论如何在Haskell中都不需要这些复制。

然而,我担心当对象从垃圾收集的Haskell中管理时,它可能不再像以前那样工作顺畅,我可能需要想出启发式方法将很少使用的对象迁移到主机内存(这往往非常缓慢)。这种担忧是否合理? GHC垃圾收集是否如此有效,以至于大多数对象将几乎与C++中一样快地消失,即使Haskell运行时不认为它需要节约内存?有什么技巧可以帮助,或者有没有办法表明某些对象占据了太多的GPU内存,应尽快删除?

1个回答

5

即使Haskell运行时不认为它需要在内存上节约,也是如此吗?

这是个问题:GHC GC不知道你的外部对象有多大,因此它们不会对堆施加任何压力,因此不能尽快收集。

您可以通过手动调用performGC来强制进行主要GC来缓解此问题。


1
我本来希望有更加精细的选择,但是仔细考虑过后,这样完全可以。"major"是否意味着它应该删除几乎所有无法访问的对象? - leftaroundabout
1
主要的垃圾回收将删除所有不可访问的对象,因为它收集旧的代(请记住,GHC是一种分代垃圾收集器)。 - Don Stewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接