如何根据源文件类型指定不同数量的并行编译任务?
按文件类型限制Make并行编译任务数
当然可以实现,核心思路是把不同类型文件的编译任务拆分为独立目标,通过递归调用Make分别指定不同的并行任务上限。以下是具体实现方案:
实现步骤
- 在Makefile中拆分.cpp和.cu的编译目标,分别控制并行数
- 定义各自的目标文件列表,编写对应编译规则
示例Makefile
# 总入口目标 all: cpp_build cu_build # 编译所有.cpp文件,最多8个并行任务 cpp_build: $(MAKE) -j8 cpp_objects # 编译所有.cu文件,最多2个并行任务 cu_build: $(MAKE) -j2 cu_objects # 生成.cpp对应的目标文件集合 cpp_objects := $(patsubst %.cpp,%.o,$(wildcard *.cpp)) # 生成.cu对应的目标文件集合 cu_objects := $(patsubst %.cu,%.o,$(wildcard *.cu)) # .cpp文件的编译规则 %.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ # .cu文件的编译规则(假设用NVCC编译) %.o: %.cu $(NVCC) $(NVCCFLAGS) -c $< -o $@
原理说明
- 递归调用
$(MAKE)时,每个子Make进程独立管理自身的并行任务:cpp_build子进程最多同时跑8个编译任务,cu_build子进程最多跑2个 - 主Make进程会同时启动这两个子进程,整体并行任务数最多为8+2=10,但严格保证.cu文件的并发数不超过2,避免内存溢出或崩溃问题
注意事项
- 该方案基于GNU Make实现,其他Make变种可能需要调整语法
- 如果需要传递额外参数(如编译选项),可以通过
$(MAKEFLAGS)传递给子进程
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

