我考虑将 Haskell 绑定(bind)编写到用 C++(我会编写一个普通的 C 包装器)和 CUDA 编写的量子力学库。主要瓶颈始终是 CUDA 部分使用的 GPU 内存。在 C++ 中,处理起来非常高效,因为所有对象都有自动内存管理,即一旦离开作用域就会被删除。另外,我使用 C++11 移动语义来避免复制,无论如何,这些在 Haskell 中显然是不必要的。
然而,我担心当对象是从垃圾收集的 Haskell 管理时,它可能不再顺利工作,并且我可能需要想出启发法将很少使用的对象迁移回主机内存(这往往是相当慢)。这种担心是否合理,或者 GHC 垃圾收集是否如此有效,以至于大多数对象几乎会像 C++ 中一样快地消失,即使 Haskell 运行时认为它不需要节省内存?是否有任何技巧可以提供帮助,或者有什么方法可以表明某些对象占用了过多的 GPU 内存并应尽快删除?
最佳答案
even when the Haskell runtime doesn't see it needs to be economic on memory?
这就是问题所在:GHC GC 不知道您的异物有多大,因此它们不会施加任何堆压力,因此不会尽快收集。
您可以通过手动调用 performGC
强制执行主要 GC 来缓解此问题。
关于haskell - 在删除不透明的 FFI 对象之前,垃圾回收需要多长时间?有可能以某种方式加快速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10736780/