使用多个核心使用g ++进行编译

bso*_*man 166 c++ compiler-construction multicore makefile g++

快速提问:什么是编译器标志,允许g ++生成自身的多个实例,以便更快地编译大型项目(例如,一次为多核CPU提供4个源文件)?

非常感谢.

fra*_*yer 230

你可以用make做 - 用gnu make它是-j标志(这对单处理器机器也有帮助).

例如,如果您想要make中的4个并行作业:

make -j 4
Run Code Online (Sandbox Code Playgroud)

您也可以在管道中运行gcc

gcc -pipe
Run Code Online (Sandbox Code Playgroud)

这将管理编译阶段,这也将有助于保持核心繁忙.

如果您还有其他可用的计算机,您可以查看distcc,这也将为这些计算机编译.

  • 你的-j数应该是你拥有的核心数的1.5倍. (34认同)
  • 为什么GNU Make的*-j*选项需要是CPU内核数量的1.5倍? (32认同)
  • *1.5*数是因为注意到的*I/O绑定*问题.这是一个经验法则.大约1/3的作业将等待I/O,因此剩余的作业将使用可用的核心.比核心更大的数字更好,你甚至可以高达*2x*.另见:[Gnu make`-j`参数](http://stackoverflow.com/questions/2499070/gnu-make-should-j-equal-number-the-number-of-cpu-cores-in-a -系统) (25认同)
  • @JimMichaels这可能是因为依赖项在您的项目中被严重设置,(即使目标尚未准备好,目标也会开始构建),这样只有顺序构建才能成功. (4认同)
  • 谢谢。我一直试图通过 CFLAGS/CPPFLAGS/CXXFLAGS 将“-j#”传递给 gcc。我完全忘记了“-j#”是 GNU make(而不是 GCC)的参数。 (2认同)
  • 好吧,距离最初的讨论已经过去了很长一段时间,但是:使用 Fedora 27 在 16 核 AMD Threadripper 1950x 上编译 Emacs git master 完全打破了这个“1.5x”的经验法则。有 32 个可用线程和 16 个物理核心,但 `make -j 12` 大约是最快的,大约有 `1m15` 到 `1m20` 用户时间。将 arg 增加到“-j”只会增加构建时间。因此,实际上它更像是“3/4 x”或“3/8 x”,具体取决于您是否要计算 SMT“核心”。当然,TR 完全有可能快速地破坏可并行部分...... (2认同)

Mih*_*șan 41

没有这样的标志,并且有一个针对Unix的哲学,即每个工具只执行一个功能并且执行得很好.产生编译器进程在概念上是构建系统的工作.您可能正在寻找的是GNU make的一个-j(作业)标志,一个la

make -j4

或者您可以使用pmake或类似的并行制作系统.

  • _"Unix的迂腐没有帮助"_好东西不是迂腐当时,匿名编辑.回滚.评论者请更多关注你正在做的事情. (3认同)

Mat*_*tyT 11

人们已经提到makebjam也支持类似的概念.使用bjam -jx指令bjam构建x并发命令.

我们在Windows和Linux上使用相同的构建脚本,使用此选项可在两个平台上将构建时间减半.尼斯.


rme*_*dor 8

make会为你做这件事.调查-j-l切换手册页.我认为不可g++并行化.


小智 6

distcc还可用于不仅在当前计算机上分发编译,还可以在已安装distcc的服务器场中的其他计算机上分发编译.


And*_*ndy 5

我不确定 g++,但如果你使用 GNU Make,那么“make -j N”(其中 N 是 make 可以创建的线程数)将允许 make 同时运行多个 g++ 作业(只要因为这些文件不相互依赖)。

  • no N 不是线程数!许多人误解了这一点,但“-j N”告诉 make 应该一次生成多少个进程,而不是线程。这就是为什么它不如 MS `cl -MT`(真正的多线程)性能的原因。 (2认同)

Hav*_*vok 5

如果使用make,请发出-j。来自man make

  -j [jobs], --jobs[=jobs]
       Specifies the number of jobs (commands) to run simultaneously.  
       If there is more than one -j option, the last one is effective.
       If the -j option is given without an argument, make will not limit the
       number of jobs that can run simultaneously.
Run Code Online (Sandbox Code Playgroud)

最值得注意的是,如果您要编写脚本或确定可用内核的数量(取决于您的环境,并且如果您在许多环境中运行,则可能会发生很大变化),则可以使用无处不在的Python函数cpu_count()

https://docs.python.org/3/library/multiprocessing.html#multiprocessing.cpu_count

像这样:

make -j $(python3 -c 'import multiprocessing as mp; print(int(mp.cpu_count() * 1.5))')
Run Code Online (Sandbox Code Playgroud)

如果您问为什么1.5我会在上面的评论中引用用户虚假噪声:

1.5的数字是由于指出的I / O绑定问题。这是一个经验法则。大约1/3的作业将等待I / O,因此其余的作业将使用可用的内核。大于核心的数字更好,甚至可以高达2倍。

  • 大多数Linux用户可能会更喜欢较短的代码:GNU Coreutils中的`make -j`nproc`和`nproc`。 (4认同)

小智 5

您可以使用make -j$(nproc)。此命令用于使用 make 构建系统构建一个项目,并并行运行多个作业。

例如,如果您的系统有 4 个 CPU 核心,则运行make -j$(nproc)将指示 make 同时运行 4 个作业,每个 CPU 核心一个,从而加快构建过程。

您还可以通过运行此命令查看您有多少个核心; echo $(nproc)