186

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

4

8 回答 8

256

您可以使用 make 执行此操作 - 使用 gnu make 它是 -j 标志(这也有助于单处理器机器)。

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

make -j 4

您还可以在管道中运行 gcc

gcc -pipe

这将流水线化编译阶段,这也将有助于保持内核忙碌。

如果您还有其他可用的机器,您可以查看distcc,它也会将农场编译到这些机器上。

于 2009-01-05T22:26:05.730 回答
45

没有这样的标志,并且有一个违背 Unix 的哲学,即让每个工具只执行一个功能并很好地执行它。生成编译器进程在概念上是构建系统的工作。您可能正在寻找的是 GNU make 的 -j (jobs) 标志,a la

使-j4

或者您可以使用 pmake 或类似的并行 make 系统。

于 2009-01-05T22:25:57.557 回答
12

人们已经提到makebjam也支持类似的概念。Usingbjam -jx指示 bjam 建立x并发命令。

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

于 2009-01-06T11:27:49.723 回答
10

make会为你做这件事。研究手册页中的-j-l开关。我不认为g++是可并行的。

于 2009-01-05T22:24:56.670 回答
10

如果使用 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.

最值得注意的是,如果您想编写脚本或确定可用的内核数量(取决于您的环境,并且如果您在许多环境中运行,这可能会发生很大变化),您可以使用无处不在的 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))')

如果你问为什么1.5我会在上面的评论中引用用户 artless-noise:

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

于 2018-05-29T22:56:42.113 回答
7

distcc 也可用于分发编译,不仅在当前机器上,而且在农场中安装了 distcc 的其他机器上。

于 2011-08-21T15:58:17.973 回答
4

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

于 2009-01-05T22:25:31.940 回答
2

GNU 并行

我正在做一个综合编译基准测试,懒得写一个 Makefile,所以我使用了:

sudo apt-get install parallel
ls | grep -E '\.c$' | parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"

解释:

  • {.}接受输入参数并删除其扩展名
  • -t打印出正在运行的命令,让我们了解进度
  • --will-cite如果您使用它发布结果,则删除引用该软件的请求...

parallel非常方便,我什至可以自己做一个时间戳检查:

ls | grep -E '\.c$' | parallel -t --will-cite "\
  if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then
    gcc -c -o '{.}.o' '{}'
  fi
"

xargs -P也可以并行运行作业,但是使用它进行扩展操作或运行多个命令不太方便:Calling multiple commands through xargs

并行链接被问到:链接时gcc 可以使用多个内核吗?

TODO:我想我在某处读到编译可以简化为矩阵乘法,所以也许也可以加快大文件的单文件编译。但我现在找不到参考。

在 Ubuntu 18.10 中测试。

于 2018-12-25T10:35:36.920 回答