使用多核使用 g++ 进行编译
-
03-07-2019 - |
题
快速提问:允许 g++ 生成自身的多个实例以便更快地编译大型项目的编译器标志是什么(例如,对于多核 CPU 一次 4 个源文件)?
解决方案
你可以用make做 - 用gnu make它是-j标志(这对单处理器机器也有帮助)。
例如,如果您想要make中的4个并行作业:
make -j 4
您还可以使用
在管道中运行gccgcc -pipe
这将管理编译阶段,这也将有助于保持核心繁忙。
如果您还有其他可用的计算机,您可以查看 distcc ,这将会编译到那些同样。
其他提示
没有这样的标志,并且有一个运行符合Unix的理念,即每个工具只执行一个功能并且执行得很好。产生编译器进程在概念上是构建系统的工作。您可能正在寻找的是GNU make的-j(作业)标志,la
make -j4
或者您可以使用pmake或类似的并行制作系统。
人们已经提到 make
但 bjam
也支持类似的概念。使用 bjam -jx
指示bjam构建 x
并发命令。
我们在Windows和Linux上使用相同的构建脚本,并且使用此选项将我们在两个平台上的构建时间减半。好的。
make
将为您做这件事。调查 -j
和 -l
在手册页中进行切换。我不认为 g++
是可并行的。
distcc也可用于不仅在当前计算机上分发编译,还可以在安装了distcc的服务器场中的其他计算机上分发编译。
如果使用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倍。
我不确定g ++,但是如果你使用GNU Make那么“make -j N” (其中N是make可以创建的线程数)将允许make同时运行多个g ++作业(只要文件不相互依赖)。
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 链接时可以使用多核吗?
去做:我想我在某处读到编译可以简化为矩阵乘法,所以也许也可以加快大文件的单个文件编译速度。但我现在找不到参考。
在 Ubuntu 18.10 中测试。