并行编译

大多数编译器都不是并行的,这是一个提高编译器性能的机会。

截止 2021 年 1 月,用于显式并行化编译器的工作已停止。有很多设计和正确性的工作需要完成。

可以在 config.toml 中启用它来尝试当前的并行编译器工作。

这项工作有一些基本思路:

  • 编译器中有很多循环,它们只是迭代一个 crate 中的所有项,。这些都可能可以并行化。
  • 我们可以使用(一个自定义分支) rayon 并行运行任务。自定义分支允许执行 DAG 任务,而不仅仅是树。
  • 目前有许多全局数据结构需要设置为线程安全的。这里的一个关键策略是将内部可变的数据结构(如: Cell) 转换为与它们同级的线程安全结构(如: Mutex)。

截至 2021 年 2 月,由于人力不足,大部分这方面的努力被搁置。我们有一个可以正常工作的原型,在许多情况下都有很好的性能收益。然而,有两个障碍:

  • 目前尚不清楚哪些并发需要保持不变的不变性。审核工作正在进行中,但似乎已停滞不前。

  • 有很多锁竞争,随着线程数增加到 4 以上,实际上会降低性能。

这里有一些可以用来学习更多的资源(注意其中一些有点过时了):