<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.snu.edu.in/index.php?action=history&amp;feed=atom&amp;title=Magus02%2FBatch_Scheduler</id>
	<title>Magus02/Batch Scheduler - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.snu.edu.in/index.php?action=history&amp;feed=atom&amp;title=Magus02%2FBatch_Scheduler"/>
	<link rel="alternate" type="text/html" href="https://wiki.snu.edu.in/index.php?title=Magus02/Batch_Scheduler&amp;action=history"/>
	<updated>2026-11-04T19:44:44Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.9</generator>
	<entry>
		<id>https://wiki.snu.edu.in/index.php?title=Magus02/Batch_Scheduler&amp;diff=1184&amp;oldid=prev</id>
		<title>Deepak: new</title>
		<link rel="alternate" type="text/html" href="https://wiki.snu.edu.in/index.php?title=Magus02/Batch_Scheduler&amp;diff=1184&amp;oldid=prev"/>
		<updated>2026-04-20T06:41:21Z</updated>

		<summary type="html">&lt;p&gt;new&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Batch Scheduler — Magus02 HPC}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#0d1b2a;border:1px solid #1e3a5a;border-radius:8px;padding:12px 18px;margin-bottom:20px;font-size:13px;font-family:monospace;color:#5ba3d9;&amp;quot;&amp;gt;&lt;br /&gt;
📍 [[Magus02/Knowledge_Base|Magus02 Knowledge Base]] → HPC User → Batch Scheduler&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This page explains how to write and submit jobs to the Slurm batch scheduler on Magus02. For the theory behind scheduling, see [[Magus02/Scheduling_Basics|Scheduling Basics]].&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
All compute work on Magus02 must go through the '''Slurm''' batch scheduler. You write a '''jobscript''' — a shell script that declares resource requirements and the commands to execute — and submit it with &amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;. Slurm queues the job, waits for resources, and runs it on compute nodes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#2a1a00;border-left:4px solid #f0c040;border-radius:6px;padding:14px 18px;margin:16px 0;font-size:14px;color:#d4b870;&amp;quot;&amp;gt;&lt;br /&gt;
⚠️ &amp;lt;strong&amp;gt;Common pitfalls to avoid:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
• Requesting more memory than available → job stays in queue forever&amp;lt;br&amp;gt;&lt;br /&gt;
• Requesting less time than needed → job is killed before it finishes&amp;lt;br&amp;gt;&lt;br /&gt;
• Forgetting to load modules in jobscript → job fails silently&amp;lt;br&amp;gt;&lt;br /&gt;
• Running heavy computations on login nodes → impacts all users&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Essential Slurm Commands ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Command&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sbatch jobscript.sh&amp;lt;/code&amp;gt; || Submit a jobscript to the queue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;squeue&amp;lt;/code&amp;gt; || List all jobs currently in the queue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;squeue -u $USER&amp;lt;/code&amp;gt; || List only your jobs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;squeue -p medium&amp;lt;/code&amp;gt; || List jobs in a specific partition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;scancel JOB_ID&amp;lt;/code&amp;gt; || Cancel a specific job&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;scancel -u $USER&amp;lt;/code&amp;gt; || Cancel all your jobs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;scontrol show job JOB_ID&amp;lt;/code&amp;gt; || Show detailed info about a job&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sinfo&amp;lt;/code&amp;gt; || Show partition and node status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sinfo -p medium&amp;lt;/code&amp;gt; || Show status of a specific partition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sacct -j JOB_ID&amp;lt;/code&amp;gt; || Show accounting info for a completed job&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common #SBATCH Directives ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Directive&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --job-name=myjob&amp;lt;/code&amp;gt; || Set a name for your job (visible in squeue)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --partition=medium&amp;lt;/code&amp;gt; || Choose the queue/partition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --nodes=2&amp;lt;/code&amp;gt; || Number of compute nodes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --ntasks=128&amp;lt;/code&amp;gt; || Total number of MPI tasks (processes)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --ntasks-per-node=64&amp;lt;/code&amp;gt; || MPI tasks per node&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --cpus-per-task=2&amp;lt;/code&amp;gt; || CPU cores per task (for hybrid OpenMP+MPI)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --mem=256G&amp;lt;/code&amp;gt; || Total RAM per node&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --mem-per-cpu=4G&amp;lt;/code&amp;gt; || RAM per CPU core&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --time=2-00:00:00&amp;lt;/code&amp;gt; || Wall time limit (D-HH:MM:SS)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --output=slurm-%j.out&amp;lt;/code&amp;gt; || STDOUT file (%j = job ID)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --error=slurm-%j.err&amp;lt;/code&amp;gt; || STDERR file&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --mail-type=END,FAIL&amp;lt;/code&amp;gt; || Send email when job ends or fails&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#SBATCH --mail-user=you@snu.edu.in&amp;lt;/code&amp;gt; || Email address for notifications&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Job Types ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Serial Job (single core) ===&lt;br /&gt;
&lt;br /&gt;
For programs that use only one CPU core. Use the &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; partition.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=serial_test&lt;br /&gt;
#SBATCH --partition=small&lt;br /&gt;
#SBATCH --nodes=1&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --mem=8G&lt;br /&gt;
#SBATCH --time=02:00:00&lt;br /&gt;
#SBATCH --output=serial_%j.out&lt;br /&gt;
#SBATCH --error=serial_%j.err&lt;br /&gt;
&lt;br /&gt;
module purge&lt;br /&gt;
module load intel/oneapi&lt;br /&gt;
&lt;br /&gt;
./my_serial_program input.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Shared Memory Job (OpenMP) ===&lt;br /&gt;
&lt;br /&gt;
For programs parallelized with OpenMP — multiple threads on a single node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=openmp_job&lt;br /&gt;
#SBATCH --partition=medium&lt;br /&gt;
#SBATCH --nodes=1&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=64&lt;br /&gt;
#SBATCH --mem=256G&lt;br /&gt;
#SBATCH --time=12:00:00&lt;br /&gt;
#SBATCH --output=omp_%j.out&lt;br /&gt;
#SBATCH --error=omp_%j.err&lt;br /&gt;
&lt;br /&gt;
module purge&lt;br /&gt;
module load intel/oneapi&lt;br /&gt;
&lt;br /&gt;
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK&lt;br /&gt;
export OMP_PLACES=cores&lt;br /&gt;
export OMP_PROC_BIND=close&lt;br /&gt;
&lt;br /&gt;
./my_openmp_program&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Distributed Memory Job (MPI) ===&lt;br /&gt;
&lt;br /&gt;
For programs parallelized with MPI — multiple processes across one or more nodes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=mpi_job&lt;br /&gt;
#SBATCH --partition=medium&lt;br /&gt;
#SBATCH --nodes=4&lt;br /&gt;
#SBATCH --ntasks-per-node=64&lt;br /&gt;
#SBATCH --mem=256G&lt;br /&gt;
#SBATCH --time=7-00:00:00&lt;br /&gt;
#SBATCH --output=mpi_%j.out&lt;br /&gt;
#SBATCH --error=mpi_%j.err&lt;br /&gt;
&lt;br /&gt;
module purge&lt;br /&gt;
module load intel/oneapi&lt;br /&gt;
module load mpi/intelmpi&lt;br /&gt;
&lt;br /&gt;
mpirun -n $SLURM_NTASKS ./my_mpi_program input.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Hybrid Job (MPI + OpenMP) ===&lt;br /&gt;
&lt;br /&gt;
For programs that use both MPI (across nodes) and OpenMP (within each node). Requires careful configuration of both thread counts and MPI binding.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=hybrid_job&lt;br /&gt;
#SBATCH --partition=large&lt;br /&gt;
#SBATCH --nodes=4&lt;br /&gt;
#SBATCH --ntasks-per-node=8&lt;br /&gt;
#SBATCH --cpus-per-task=16&lt;br /&gt;
#SBATCH --mem=256G&lt;br /&gt;
#SBATCH --time=14-00:00:00&lt;br /&gt;
#SBATCH --output=hybrid_%j.out&lt;br /&gt;
#SBATCH --error=hybrid_%j.err&lt;br /&gt;
&lt;br /&gt;
module purge&lt;br /&gt;
module load intel/oneapi&lt;br /&gt;
module load mpi/intelmpi&lt;br /&gt;
&lt;br /&gt;
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK&lt;br /&gt;
&lt;br /&gt;
mpirun -n $SLURM_NTASKS ./my_hybrid_program&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. GPU Job ===&lt;br /&gt;
&lt;br /&gt;
For CUDA or GPU-accelerated programs. Always use the &amp;lt;code&amp;gt;GPU&amp;lt;/code&amp;gt; partition.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=gpu_job&lt;br /&gt;
#SBATCH --partition=GPU&lt;br /&gt;
#SBATCH --nodes=1&lt;br /&gt;
#SBATCH --ntasks=16&lt;br /&gt;
#SBATCH --gres=gpu:4&lt;br /&gt;
#SBATCH --mem=256G&lt;br /&gt;
#SBATCH --time=7-00:00:00&lt;br /&gt;
#SBATCH --output=gpu_%j.out&lt;br /&gt;
#SBATCH --error=gpu_%j.err&lt;br /&gt;
&lt;br /&gt;
module purge&lt;br /&gt;
module load cuda&lt;br /&gt;
module load intel/oneapi&lt;br /&gt;
&lt;br /&gt;
./my_cuda_program&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. Array Job ===&lt;br /&gt;
&lt;br /&gt;
Run the same program multiple times with different inputs or parameters, all submitted as one job.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=array_job&lt;br /&gt;
#SBATCH --partition=small&lt;br /&gt;
#SBATCH --nodes=1&lt;br /&gt;
#SBATCH --ntasks=8&lt;br /&gt;
#SBATCH --mem=32G&lt;br /&gt;
#SBATCH --time=04:00:00&lt;br /&gt;
#SBATCH --array=1-10&lt;br /&gt;
#SBATCH --output=array_%A_%a.out&lt;br /&gt;
#SBATCH --error=array_%A_%a.err&lt;br /&gt;
&lt;br /&gt;
# $SLURM_ARRAY_TASK_ID is set to the array index (1..10)&lt;br /&gt;
module purge&lt;br /&gt;
module load intel/oneapi&lt;br /&gt;
&lt;br /&gt;
./my_program input_${SLURM_ARRAY_TASK_ID}.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#0d1a2a;border-left:4px solid #00c9ff;border-radius:6px;padding:14px 18px;margin:16px 0;font-size:14px;color:#94a8be;&amp;quot;&amp;gt;&lt;br /&gt;
💡 &amp;lt;strong&amp;gt;Array job tip:&amp;lt;/strong&amp;gt; Use array jobs instead of submitting hundreds of individual &amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt; calls. They are tracked as a single entity and are more scheduler-friendly. Each task sees a unique &amp;lt;code&amp;gt;$SLURM_ARRAY_TASK_ID&amp;lt;/code&amp;gt; so you can differentiate inputs.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. Interactive Session ===&lt;br /&gt;
&lt;br /&gt;
For testing and debugging interactively on a compute node (not the login node):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ srun --pty --partition=small --nodes=1 --ntasks=8 --mem=32G --time=01:00:00 /bin/bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This gives you a shell on a compute node. Exit with &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; when done.&lt;br /&gt;
&lt;br /&gt;
== Monitoring Jobs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Check the status of your jobs:&lt;br /&gt;
$ squeue -u $USER&lt;br /&gt;
&lt;br /&gt;
# Output columns explained:&lt;br /&gt;
# JOBID    PARTITION  NAME    USER   ST  TIME  NODES  NODELIST&lt;br /&gt;
# 12345    medium     myjob   deepak  R  0:23    2    node[01-02]&lt;br /&gt;
# Status: R=Running, PD=Pending, CG=Completing, F=Failed&lt;br /&gt;
&lt;br /&gt;
# Get detailed info on a specific job:&lt;br /&gt;
$ scontrol show job 12345&lt;br /&gt;
&lt;br /&gt;
# Check completed job stats (CPU time, memory used):&lt;br /&gt;
$ sacct -j 12345 --format=JobID,Elapsed,MaxRSS,State&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* [[Magus02/Scheduling_Basics|Scheduling Basics — Theory]]&lt;br /&gt;
* [[Magus02/FAQ_Batch_Jobs|FAQ: Batch Jobs — Troubleshooting]]&lt;br /&gt;
* [[Magus02/MPI_Usage|MPI Usage]]&lt;br /&gt;
* [[Magus02/OpenMP_Usage|OpenMP Usage]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family:monospace;font-size:11px;color:#484f58;text-align:right;&amp;quot;&amp;gt;&lt;br /&gt;
[[Magus02/Knowledge_Base|↑ Back to Knowledge Base]] · Maintained by HPC Administration · wiki.snu.edu.in&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Deepak</name></author>
	</entry>
</feed>