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

时间:2009-01-05 22:21:05

标签: c++ compiler-construction makefile g++ multicore

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

非常感谢。

8 个答案:

答案 0 :(得分:222)

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

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

make -j 4

您还可以使用

在管道中运行gcc
gcc -pipe

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

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

答案 1 :(得分:39)

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

make -j4

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

答案 2 :(得分:11)

人们提到makebjam也支持类似的概念。使用bjam -jx指示bjam构建最多x个并发命令。

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

答案 3 :(得分:8)

make会为您完成此操作。调查手册页中的-j-l开关。我认为g++不可并行化。

答案 4 :(得分:5)

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

答案 5 :(得分:3)

如果使用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函数{{1 }}:

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

像这样:

cpu_count()

如果你问为什么make -j $(python3 -c 'import multiprocessing as mp; print(int(mp.cpu_count() * 1.5))') 我会在上面的评论中引用用户无艺术噪音:

  

1.5号是因为注意到的I / O限制问题。这是一个经验法则。大约1/3的作业将等待I / O,因此剩余的作业将使用可用的核心。比核心更大的数字更好,你甚至可以高达2倍。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

GNU并行

我在制作a synthetic compilation benchmark时,不怕写一个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

在以下位置询问了并联链接:Can gcc use multiple cores when linking?

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

在Ubuntu 18.10中进行了测试。