build - Thinlto 的并发性在并行构建系统中有用吗?
问题描述
-flto
我有一个构建系统,它通过标志在 clang 中使用长期存在的 LTO 支持。
添加到 LLVM ( https://clang.llvm.org/docs/ThinLTO.html )的 ThinLTO 支持看起来很有趣,但我对在std::thread::hardware_concurrency
已经构建系统的上下文中启动并行处理线程的决定感到有些困惑运行并发作业。
如果您的构建系统已经为每个内核启动一个线程并运行编译和链接作业的混合,那么链接器假设它应该使用所有内核甚至多个内核是否仍然有意义?
或者使用https://clang.llvm.org/docs/ThinLTO.html#controlling-backend-parallelism中记录的标志将 ThinLTO 后台并发减少到 1 是否有意义?删除并行性后,ThinLTO 与普通的普通旧 LTO 相比有什么优势吗?
解决方案
除了其他好处之外,ThinLTO 实际上可以大大缩短大型项目的构建时间。缓存不仅是为增量构建而设计的——它是多线程链接阶段如何工作的重要组成部分,旨在加速符号查找。ThinLTO 在缩短构建时间方面对您有多大帮助取决于您的项目和构建系统。
我找到了一个非常好的视频,其中介绍了 ThinLTO 设计的一些细节、它的用例以及一些成功实施的方法:
https://www.youtube.com/watch?v=p9nH2vZ2mNo&list=WL&index=51&t=2812s
相应的谷歌研究论文也是一个非常有趣(如果很重)的阅读:
https://research.google/pubs/pub47584/
对于更轻松、更随意的拍摄,这篇博文也很有帮助:
http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html
推荐阅读
- google-maps - 如何配置 Google Maps api 以显示白色 Google 徽标而不是默认版本?
- java - 使用参数作为接口项
- f# - 如何在 F# Saturn 框架中自定义日志记录?
- linux - 在 Docker 中挂载 cgroup 以进行资源管理
- java - 如何从 Kotlin lambda 创建 Java SerializedLambda?
- image - 出现在所有浏览器中的图像,但 Firefox
- mysql - 在很长一段时间内汇总分类帐。(和解、快照、滚动总和?)
- node.js - npm 包从 URL 查询构建 mongo 查询
- c - 试图了解 Interlocked* 功能
- javascript - 将搜索结果附加到各自的父 div?