如何取消 Ninja 对并行 link 作业的限制?
How to remove Ninja's limit on parallel link jobs?
我在 Debian 9 上使用 Ninja 1.8.2 来使用 llvm-5.0 构建 llvm-6.0。
当我检查我系统的 CPU 使用情况时,我发现 CPU 没有被 100% 使用,还有很多内存剩余。
检查 cmake 的输出后,我发现它将并行链接作业限制为 2,因为我机器上的 llvm 运行 也是并行运行的。
我想试试解除这个限制是否能让我的构建速度更快,但是几乎没有关于这方面的文档。
编辑:
我检查了构建目录中 rules.ninja 文件的内容,发现了这些:
#############################################
# Pools defined by global property JOB_POOLS
pool link_job_pool
depth = 2
我也查看了build.ninja的内容,发现了这个:
build lib/libLLVMDemangle.a: CXX_STATIC_LIBRARY_LINKER__LLVMDemangle lib/Demangle/CMakeFiles/LLVMDemangle.dir/ItaniumDemangle.cpp.o
LANGUAGE_COMPILE_FLAGS = -Ofast -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -std=c++1y -Wal l -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -W non-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fcolor-diagnostics -ffunction-sections -fdata-sections -flto=thin -O3 -D NDEBUG
OBJECT_DIR = lib/Demangle/CMakeFiles/LLVMDemangle.dir
POST_BUILD = :
PRE_LINK = :
TARGET_FILE = lib/libLLVMDemangle.a
TARGET_PDB = LLVMDemangle.a.dbg
pool = link_job_pool
其他链接命令好像都有pool
.
将我的评论变成答案
从ninja by default. But ninja
allows to define pools到"allocate one or more rules or edges a finite number of concurrent jobs which is more tightly restricted than the default parallelism."
没有链接阶段限制
作为llvm uses cmake to generate the build environment, I've checked the CMake code there:
if(NOT LLVM_PARALLEL_LINK_JOBS AND uppercase_LLVM_ENABLE_LTO STREQUAL "THIN")
message(STATUS "ThinLTO provides its own parallel linking - limiting parallel link jobs to 2.")
set(LLVM_PARALLEL_LINK_JOBS "2")
endif()
所以你可以overwrite/preset LLVM_PARALLEL_LINK_JOBS
从命令行缓存变量:
> cmake -DLLVM_PARALLEL_LINK_JOBS=<your number of parallel link jobs here> ..
参考
我在 Debian 9 上使用 Ninja 1.8.2 来使用 llvm-5.0 构建 llvm-6.0。
当我检查我系统的 CPU 使用情况时,我发现 CPU 没有被 100% 使用,还有很多内存剩余。
检查 cmake 的输出后,我发现它将并行链接作业限制为 2,因为我机器上的 llvm 运行 也是并行运行的。
我想试试解除这个限制是否能让我的构建速度更快,但是几乎没有关于这方面的文档。
编辑:
我检查了构建目录中 rules.ninja 文件的内容,发现了这些:
#############################################
# Pools defined by global property JOB_POOLS
pool link_job_pool
depth = 2
我也查看了build.ninja的内容,发现了这个:
build lib/libLLVMDemangle.a: CXX_STATIC_LIBRARY_LINKER__LLVMDemangle lib/Demangle/CMakeFiles/LLVMDemangle.dir/ItaniumDemangle.cpp.o
LANGUAGE_COMPILE_FLAGS = -Ofast -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -std=c++1y -Wal l -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -W non-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fcolor-diagnostics -ffunction-sections -fdata-sections -flto=thin -O3 -D NDEBUG
OBJECT_DIR = lib/Demangle/CMakeFiles/LLVMDemangle.dir
POST_BUILD = :
PRE_LINK = :
TARGET_FILE = lib/libLLVMDemangle.a
TARGET_PDB = LLVMDemangle.a.dbg
pool = link_job_pool
其他链接命令好像都有pool
.
将我的评论变成答案
从ninja by default. But ninja
allows to define pools到"allocate one or more rules or edges a finite number of concurrent jobs which is more tightly restricted than the default parallelism."
作为llvm uses cmake to generate the build environment, I've checked the CMake code there:
if(NOT LLVM_PARALLEL_LINK_JOBS AND uppercase_LLVM_ENABLE_LTO STREQUAL "THIN") message(STATUS "ThinLTO provides its own parallel linking - limiting parallel link jobs to 2.") set(LLVM_PARALLEL_LINK_JOBS "2") endif()
所以你可以overwrite/preset LLVM_PARALLEL_LINK_JOBS
从命令行缓存变量:
> cmake -DLLVM_PARALLEL_LINK_JOBS=<your number of parallel link jobs here> ..
参考