去年,LLVM开始落地其分布式ThinLTO(简称"DTLTO")支持,作为对其用于链接时优化的ThinLTO方法的增强。本周合并到LLVM的一项改进解决了在向链接添加文件时发现的性能瓶颈。
Ben Dunbobbin针对使用DTLTO向链接添加文件时的性能进行了改进。在Windows系统上,使用AMD Ryzen 16核处理器的极端情况下,向链接添加一个文件原本耗时约2799毫秒,而采用现已合并的代码后,时间降至仅157毫秒。在Linux系统下,该补丁将时间从约255毫秒减少到仅约41毫秒。
Ben解释了该补丁如何提升性能:
"进程内的ThinLTO后端通常在内存中生成目标文件,并直接将其添加到链接中,除非正在使用ThinLTO缓存。DTLTO的特殊之处在于,它在所有情况下都从磁盘向链接添加文件。
当未使用ThinLTO缓存时,ThinLTO通过链接器提供的AddStreamFn回调添加文件,这最终会追加到LLD中的SmallVector。当使用缓存时,链接器提供AddBufferFn回调,以更高效的方式添加文件(通过转移MemoryBuffer的所有权)。
此补丁允许客户端可选地向DTLTO ThinLTO后端提供AddBufferFn。当可用时,后端使用此函数更高效地将文件添加到链接。
对于使用优化工具链(PGO非LTO,llvmorg-22.1.0)的Clang链接(带有消毒器和插桩的Debug构建),测量向链接添加DTLTO文件的平均时间跟踪范围持续时间:
- 在Windows上(Windows 11 Pro Build 26200,AMD Family 25 @ ~4.5 GHz,16核/32线程,64 GB RAM),此补丁将平均时间从2799.148毫秒减少到157.972毫秒。
- 在Linux上(Ubuntu 24.04.3 LTS Kernel 6.14,Ryzen 9 5950X,16核/32线程,加速最高至5.09 GHz,64 GB RAM),此补丁将平均时间从255.291毫秒减少到41.630毫秒。"
对于LLVM/Clang 23中的这一变更,仅通过重写几十行代码就实现了相当显著的相对改进。