gcc可以在链接时使用多个内核吗?

vs91vp4v  于 2023-10-19  发布在  其他
关注(0)|答案(6)|浏览(139)

因此,当使用GCC编译大量源文件时,可以使用-j来使用所有可用的核心。但是链接器呢?是否有类似的选项来加速链接,或者GCC不支持多线程?在一些大型项目中,它可能需要一段时间...(我讨厌等待!)

**编辑:**感谢您指出-j是make的选项,而不是gcc/g++。但这并没有回答我的问题!我想知道如果gcc可以使用多线程,而 * 链接 * 一个程序!

rhfm7lfc

rhfm7lfc1#

试试gold,它是由Ian Lance Taylor等人开发的。并作为GNU binutils包的一部分发布。
维基百科:
编写gold的动机是制作一个比GNU链接器更快的链接器,特别是对于用C++编写的大型应用程序
我必须承认,我还没有尝试过,但它的WebKitGTK project网页上提到。
欲了解更多信息,请参阅黄金作者写的一篇文章:A New ELF Linker
更重要的是,请参阅Sander Mathijs货车Veen在增量/并行/并发链接方面的工作,标题为Concurrent Linking with the GNU Gold Linker,以及其中的参考书目。

lvjbypge

lvjbypge2#

lld是LLVM项目开发的链接器,默认情况下将使用多个内核。我还发现它比多线程运行的gold快2倍(-Wl,--threads -Wl,--thread-count,xxx

wko9yo5t

wko9yo5t3#

在2022年,mold linker是另一个很好的选择。
它是可用于ELF目标的最快链接器,并具有最积极的并行性。

8nuwlpux

8nuwlpux4#

您提到的-j选项由make处理,而不是gcc
使用make -j n要求makeMakefile中运行多个并行进程的操作(将n替换为一个数字。在make -j 2的情况下,它是2进程)。
在进行并行构建时,Make可以很好地处理大多数同步任务。

8nuwlpux

8nuwlpux5#

以金换银-有经验吗?我在一个最小的合成基准上对LD vs gold vs LLVM LLD进行了基准测试,时间结果清楚地表明,gold和LLVM LLD都能够根据time进行并行连接,例如:

nogold:  wall=4.35s user=3.45s system=0.88s 876820kB
gold:    wall=1.35s user=1.72s system=0.46s 739760kB
lld:     wall=0.73s user=1.20s system=0.24s 625208kB

我们知道使用了并行链路,因为在这两个CPU中,wall时间小于user时间
这些基准测试也重现了Martin Richtarsky的2倍更快的LLVM LLD链接时间。

rkkpypqq

rkkpypqq6#

以下是CMake上的两个选项(在3.16.3上测试):

  • 切换到gold链接器,启用多线程(设置为系统内核数):
find_program(GNU_GOLD_PROGRAM gold)
if (GNU_GOLD_PROGRAM)
    include(ProcessorCount)
    ProcessorCount(HOST_PROC_COUNT)
    add_link_options("-fuse-ld=gold;LINKER:--threads,--thread-count=${HOST_PROC_COUNT}")
endif(GNU_GOLD_PROGRAM)
  • 切换到lld链接器(默认工作在多线程模式下):
find_program(LLD_PROGRAM lld)
if(LLD_PROGRAM)
    add_link_options("-fuse-ld=lld")
endif(LLD_PROGRAM)

更完整的例子:here
注意:如果您收到错误消息“ld.lld:error:unable to find library.”您可能需要在link_directories调用中添加库目录列表,如下所示:

find_program(LLD_PROGRAM lld)
if(LLD_PROGRAM)
    add_link_options("-fuse-ld=lld")
    link_directories(/usr/lib64 /usr/local/lib64)
endif(LLD_PROGRAM)

相关问题