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

问题描述 投票:0回答:9

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

c++ makefile g++ multicore
9个回答
269
投票

您可以使用 make 来完成此操作 - 使用 gnu make 时,它是 -j 标志(这对单处理器机器也有帮助)。

例如,如果您希望 make 执行 4 个并行作业:

make -j 4

您还可以使用

在管道中运行 gcc
gcc -pipe

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

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


47
投票

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

制作-j4

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


14
投票

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


12
投票

make
将为您做到这一点。 研究手册页中的
-j
-l
开关。 我不认为
g++
是可并行的。


12
投票

人们提到了

make
,但
bjam
也支持类似的概念。 使用
bjam -jx
指示 bjam 构建最多
x
个并发命令。

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


7
投票

distcc 不仅可以用于在当前计算机上分发编译,还可以在场中安装了 distcc 的其他计算机上分发编译。


6
投票

您可以使用

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

例如,如果您的系统有 4 个 CPU 核心,运行

make -j$(nproc)
将指示 make 同时运行 4 个作业,每个 CPU 核心一个,从而加快构建过程。

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

echo $(nproc)


5
投票

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


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
也可以并行运行作业,但使用它进行扩展操作或运行多个命令有点不太方便:通过xargs调用多个命令

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

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

在 Ubuntu 18.10 中测试。

© www.soinside.com 2019 - 2024. All rights reserved.