快速问题:允许g++生成多个实例以便更快地编译大型项目的编译器标志是什么(例如,对于具有多核CPU的情况,每次编译4个源文件)?
快速问题:允许g++生成多个实例以便更快地编译大型项目的编译器标志是什么(例如,对于具有多核CPU的情况,每次编译4个源文件)?
make -j 4
你也可以通过管道运行gcc:
gcc -pipe
这将使编译阶段进行流水线处理,也有助于保持核心的繁忙程度。
如果您还有其他可用的机器,也可以尝试使用distcc,它可以将编译任务分发给其他机器来处理。
-j
arguments。 - artless noise并没有这样的标志,拥有这样的标志违背了Unix哲学,即每个工具只执行一个功能并且表现良好。生成编译器进程在概念上是构建系统的任务。你可能正在寻找的是GNU make的-j(作业)标志,例如:
make -j4
或者你可以使用pmake或类似的并行构建系统。
如果使用make,-j
存在问题。来自man make
:
而且,特别值得注意的是,如果你想编写脚本或者查看可用的处理器核数(这取决于你的环境和运行的不同环境,可能会有所变化),你可以使用Python函数
-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.
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限制问题。这只是一个经验法则。大约有三分之一的作业会等待I/O,所以其余作业将使用可用的内核。大于内核数量的数字更好,你甚至可以使用高达2倍。
make -j `nproc`
,其中的nproc
来自于GNU Coreutils。 - Ciro Santilli OurBigBook.commake -j $(( $(nproc) + 1 ))
(请确保将空格放在我标记的位置)。 - Ed Knproc
的系统上,例如manylinux1
容器中,通过避免运行yum update
/yum install
来节省额外的时间。 - hoefling有人提到了 make
,但是 bjam
也支持类似的概念。 使用 bjam -jx
命令指示 bjam 构建最多 x
个并发命令。
我们在 Windows 和 Linux 上使用相同的构建脚本,并使用此选项可以将构建时间减少一半。不错。
make
命令可以帮你完成这个任务。请查阅 man 手册中的 -j
和 -l
参数。我认为 g++
不能进行并行计算。
-l
选项(除非所有先前的作业都终止,否则不会启动新作业),则加1分。否则,似乎链接器作业始于并非所有对象文件都已构建(因为某些编译仍在进行中),因此链接器作业失败。 - NGIdistcc还可以用于在农场中安装了distcc的其他计算机上分发编译,而不仅仅是在当前计算机上分发编译。
我不确定 g++ 是否适用,但如果你使用 GNU Make,那么 "make -j N"(其中 N 是 make 可以创建的线程数)将允许 make 同时运行多个 g++ 作业(只要文件彼此不依赖)。
-j N
告诉 make 同时应该生成多少个进程,而不是线程。这就是为什么它不像 MS 的 cl -MT
(真正的多线程)那样高效的原因。 - Sebi2020N
太大会发生什么呢?例如 -j 100
可能会破坏系统,还是 N
只是一个上界,不一定需要实现? - mercury0114make -j$(nproc)
命令来构建一个项目,多个作业会并行运行。这个命令用于使用make构建系统构建一个项目。make -j$(nproc)
将指示 make 并发地运行 4 个任务,每个任务在一个 CPU 核心上运行,从而加快构建过程。echo $(nproc)
nproc
并不总是能够提供最佳性能。我的机器有四个核心,但是使用 -j2
参数编译速度更快。 - undefinedGNU并行处理
我正在进行一个合成编译基准测试,但不想编写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中测试。
make -j
几乎总会带来一些改善。 - Flexo