我是SLURM的新手,并将其与OpenMP一起使用。我创建了一个C程序main.c
:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
void wait(int s)
{
int waittime = time(0) + s;
while(time(0) < waittime);
}
int main(void)
{
int id=-1;
int nthreads = 0;
#pragma omp parallel \
private(id)
{
nthreads = omp_get_num_threads();
id = omp_get_thread_num();
printf("Hello from thread = %i\n",id);
if(id == 0)
printf("nthreads = %i\n", nthreads);
//Let's wait
wait(60);
}
return 0;
}
和一个slurm批处理脚本slurm.sh
:
#!/bin/bash
#SBATCH --cpus-per-task=10
#SBATCH --job-name=OpenMP
#SBATCH --output output.txt
echo "Hello"
#SBATCH --mem-per-cpu=100
export OMP_NUM_THREADS=10
./a.out
如果我提交(即sbatch slurm.sh
),这个SLURM很乐意为我的工作分配10个cpus。如果我将echo "Hello"
放在#SBATCH --cpus-per-task=10
之前,我只会分配1个CPU。这里发生了什么?我不明白为什么,我的批处理脚本中shell命令的位置会改变分配的cpus数量。
::编辑:: 进一步检查后,似乎任何 shell命令(例如date
,echo
,set
)似乎导致sbatch忽略所有后续#SBATCH
命令。例如,在我的批处理脚本中,我可以设置#SBATCH --mem-per-cpu=1000000
,它将很乐意在128GB机器上运行。如果我将#SBATCH --mem-per-cpu=1000000
移到echo
之前的一行,SLURM会给我一个错误。
答案 0 :(得分:2)
您无法在#SBATCH
指令之间添加任何命令。
来自sbatch
手册页:
批处理脚本可能包含前面的选项 脚本中任何可执行命令之前的“#SBATCH”。