6

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

然而,我担心当从垃圾收集的 Haskell 管理对象时它可能不再那么顺利了,我可能需要提出启发式方法将很少使用的对象迁移回主机内存(这往往很慢) . 这种担心是合理的,还是 GHC 垃圾收集如此有效,以至于大多数对象几乎会像在 C++ 中一样迅速消失,即使 Haskell 运行时不认为它需要在内存上经济?是否有任何技巧可以提供帮助,或者有什么方法可以表明某些对象占用了过多的 GPU 内存并且应该尽快删除?

4

1 回答 1

5

即使 Haskell 运行时不认为它需要在内存上经济?

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

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

于 2012-05-24T11:42:21.960 回答