Autotools+Singularity+Slurm场景:如何仅构建代码与单元测试不运行?
解决方案
一、分步骤构建测试程序与单独执行测试
你的思路方向正确,只需调整细节确保测试程序在容器内构建,Slurm的srun在主机环境执行:
配置项目(指定主机端MPI启动器)
让MPI_LAUNCHER指向主机的srun,并通过它启动容器内的环境脚本和测试程序:./configure MPI_LAUNCHER="srun --mpi=pmi2 singularity exec -B ${PWD} container.sif envscript.sh"仅构建测试程序(不运行)
Autotools中check_PROGRAMS是所有测试程序的构建目标,执行以下命令在容器内完成编译:singularity exec -B ${PWD} container.sif envscript.sh "make check_PROGRAMS"若项目未定义
check_PROGRAMS,可改用make all构建所有目标(包含测试程序),或用make check -k --just-print预览命令后提取编译测试的部分单独执行。单独执行测试
直接运行make check,此时MPI_LAUNCHER会调用主机的srun启动容器内的测试,避免srun在容器内执行导致的挂起:make check
二、mpirun转srun的参数位置问题
mpirun -n test_cores ./test.sh替换为srun时,资源参数(如-n)需放在命令最前端,再指定容器执行命令和测试脚本:
直接运行测试脚本的正确写法:
srun --mpi=pmi2 -n test_cores singularity exec -B ${PWD} container.sif envscript.sh ./test.sh
若测试脚本内部包含MPI程序启动逻辑,建议将脚本内的mpirun替换为srun --mpi=pmi2,并确保资源参数(如-n)放在srun之后、目标程序之前。
如果测试框架通过make check自动传递核心数,可在configure时同步设置相关变量:
./configure MPI_LAUNCHER="srun --mpi=pmi2 singularity exec -B ${PWD} container.sif envscript.sh" TEST_CORES=4
随后在测试脚本中用$TEST_CORES变量对应srun -n $TEST_CORES。
内容的提问来源于stack exchange,提问作者byrdman1982
相关产品推荐
相关产品推荐

