bso*_*man 166 c++ compiler-construction multicore makefile g++
快速提问:什么是编译器标志,允许g ++生成自身的多个实例,以便更快地编译大型项目(例如,一次为多核CPU提供4个源文件)?
非常感谢.
fra*_*yer 230
你可以用make做 - 用gnu make它是-j标志(这对单处理器机器也有帮助).
例如,如果您想要make中的4个并行作业:
make -j 4
Run Code Online (Sandbox Code Playgroud)
您也可以在管道中运行gcc
gcc -pipe
Run Code Online (Sandbox Code Playgroud)
这将管理编译阶段,这也将有助于保持核心繁忙.
如果您还有其他可用的计算机,您可以查看distcc,这也将为这些计算机编译.
Mih*_*șan 41
没有这样的标志,并且有一个针对Unix的哲学,即每个工具只执行一个功能并且执行得很好.产生编译器进程在概念上是构建系统的工作.您可能正在寻找的是GNU make的一个-j(作业)标志,一个la
make -j4
或者您可以使用pmake或类似的并行制作系统.
我不确定 g++,但如果你使用 GNU Make,那么“make -j N”(其中 N 是 make 可以创建的线程数)将允许 make 同时运行多个 g++ 作业(只要因为这些文件不相互依赖)。
如果使用make,请发出-j。来自man make:
Run Code Online (Sandbox Code Playgroud)-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))')
Run Code Online (Sandbox Code Playgroud)
如果您问为什么1.5我会在上面的评论中引用用户虚假噪声:
1.5的数字是由于指出的I / O绑定问题。这是一个经验法则。大约1/3的作业将等待I / O,因此其余的作业将使用可用的内核。大于核心的数字更好,甚至可以高达2倍。
小智 5
您可以使用make -j$(nproc)。此命令用于使用 make 构建系统构建一个项目,并并行运行多个作业。
例如,如果您的系统有 4 个 CPU 核心,则运行make -j$(nproc)将指示 make 同时运行 4 个作业,每个 CPU 核心一个,从而加快构建过程。
您还可以通过运行此命令查看您有多少个核心;
echo $(nproc)
| 归档时间: |
|
| 查看次数: |
136720 次 |
| 最近记录: |