Garbage-collectors for multi-core llvm?
我已经将LLVM作为我目前正在实现的语言的一个新后端考虑了相当长的时间。它似乎具有良好的性能,而不是高级的代API,足够的低级支持来优化异域优化。此外,尽管我自己没有检查过,苹果似乎已经成功地演示了将LLVM用于垃圾收集的多核程序。
到目前为止,一切都很好。由于我对垃圾收集和多核都感兴趣,下一步将选择一个LLVM多核垃圾收集器。这就引出了一个问题:什么是可用的?我知道乔恩·哈洛普的HLVM作品,但这就是它。
注意我需要跨平台,所以苹果的GC可能不是我想要的(除非有跨平台版本)。还要注意的是,我没有什么反对停止世界垃圾收集者。
事先谢谢,约里克
LLVM文档说它还不支持多线程收集器。
As the matrix indicates, LLVM's
garbage collection infrastructure is
already suitable for a wide variety of
collectors, but does not currently
extend to multithreaded programs. This
will be added in the future as there
is interest.
号
文档确实指出,要进行多线程垃圾收集,您需要停止这个世界,这是不可移植的:
Threaded
Denotes a multithreaded mutator; the collector must still stop the
mutator ("stop the world") before
beginning reachability analysis.
Stopping a multithreaded mutator is a
complicated problem. It generally
requires highly platform specific code
in the runtime, and the production of
carefully designed machine code at
safe points.
号
然而,线程之间的共享状态是一个严重的扩展问题。如果您的语言仅通过"任务"之间的消息传递进行通信,因此工作线程之间没有共享状态,那么您可以为每个线程堆使用每个线程收集器?
给出的引文是关于LLVM对GC的内在支持,其中用C++代码扩充LLVM,告诉它如何走栈、解释堆栈帧、注入读写障碍等。我的HLVM项目的主要目标是以最小的努力和风险变得有用,所以我选择将阴影堆栈用于"不合作的环境",以避免对LLVM不成熟的内部进行黑客攻击。因此,关于LLVM对GC的内在支持的那些语句不适用于HLVM的垃圾收集器,因为它根本不使用该基础结构。我的结果非常令人信服:您可以用最少的努力(串行性能和并行性能)实现出色的性能。
我相信HLVM已经在包括MacOSX在内的Unix中运行,因为它只需要POSIX线程。我强烈反对这样一种说法:写一个停止世界GC是困难的:我花了5天时间写了一个100行多核垃圾收集器,我对计算机几乎一无所知。我不敢相信移植到Windows也会很困难。