在删除不透明FFI对象之前,我希望垃圾收集需要多长时间?有没有可能加快速度? 我认为编写哈斯克尔绑定到C++编写的量子力学库(我会写一个简单的C包装器)和CUDA。一个主要的瓶颈始终是CUDA部件使用的GPU内存。在C++中,这是非常有效的,因为所有对象都有自动内存管理,即一旦它们离开范围就被擦除。我还使用C++11移动语义来避免复制,这些显然在Haskell中是不必要的

在删除不透明FFI对象之前,我希望垃圾收集需要多长时间?有没有可能加快速度? 我认为编写哈斯克尔绑定到C++编写的量子力学库(我会写一个简单的C包装器)和CUDA。一个主要的瓶颈始终是CUDA部件使用的GPU内存。在C++中,这是非常有效的,因为所有对象都有自动内存管理,即一旦它们离开范围就被擦除。我还使用C++11移动语义来避免复制,这些显然在Haskell中是不必要的,haskell,garbage-collection,ghc,ffi,Haskell,Garbage Collection,Ghc,Ffi,然而,我担心,当从垃圾收集的Haskell管理对象时,它可能不再顺利工作,我可能需要想出一些启发式方法,将很少使用的对象迁移回主机内存(这往往非常缓慢)。这种恐惧是合理的还是GHC垃圾收集如此有效以至于大多数对象几乎消失在与C++一样快的地方,即使当Haskell运行时没有看到它需要在内存上是经济的吗?有没有什么技巧可以帮助你,或者有什么方法可以表明某些对象占用了太多的GPU内存,应该尽快删除 即使Haskell运行时没有看到它需要节省内存 这就是问题所在:GHC GC不知道外来对象有多大,因此

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

即使Haskell运行时没有看到它需要节省内存

这就是问题所在:GHC GC不知道外来对象有多大,因此它们不会施加任何堆压力,因此不会尽快收集它们


您可以通过手动调用
performGC
强制执行一个主要GC来缓解这种情况。

我希望有更具选择性的功能,但仔细考虑一下应该完全可以。“主要”是否意味着它应该删除几乎所有不可访问的对象?主要GC将删除所有不可访问的对象,因为它收集较老的几代对象(回想一下,GHC是一个分代的garabge收集器)。