在我看来,评论就是评论。他们永远不应该改变程序状态。可悲的是,人们在斯鲁姆不同意。
SLURM 要求 .sh 文件前面存在以下语法(或类似的语法):
#!/bin/bash
#SBATCH --time=5:00:00
#SBATCH --ntasks=8
#SBATCH --mem-per-cpu=1024M
MyProgram.exe
上面将提交一个请求,MyProgram.exe
在我学校的超级计算机上使用 8 个处理器运行该程序。我目前正在对我的代码进行基准测试,并希望使用命令行参数来更改处理器的数量。实际上,我想做以下事情
#!/bin/bash
#SBATCH --time=5:00:00
#SBATCH --ntasks=%1
#SBATCH --mem-per-cpu=1024M
MyProgram.exe
其中%1
是命令行参数。然后我将其称为“sbatch myShScript.sh 123
使用 123 个处理器”。当然,这是行不通的,因为 bash 将该#SBATCH --ntasks=%1
行解释为注释(确实如此),并且从不在我的命令行参数中使用 subs。
有没有办法欺骗 SLURM 或 BASH 在我的命令行参数中进行替换?
答案1
所有处理均由 SLURM 完成(通过sbatch
具体而言)是在调用 bash 之前完成的,因此 bash 在这里不会为您提供帮助。该脚本可以使用任何语言,这并不重要:这些#SBATCH
只是巧合的 bash 注释,重要的是它们是sbatch
指令。
可以在文件中指定选项,以便提供一种始终对特定脚本使用相同参数的便捷方法。如果您想使用不同的选项,请在 的命令行上传递它们sbatch
。sbatch
如果您想从某些特定参数构建选项,您可以编写一个运行的包装器脚本。您可以将作业脚本作为标准输入传递(a这里的文档很方便),而不是根据您的喜好将其保存在单独的文件中。
#!/bin/sh
sbatch --time=5:00:00 --ntasks="$1" --mem-per-cpu=1024M <<'EOF'
#!/bin/sh
MyProgram.exe
EOF