Gromacs¶
Gromacs is a molecular dynamics package mainly designed for simulations of proteins, lipids and nucleic acids.
Gromacs is available as a module on Apocrita.
Use Spack for additional variants
A few of the most commonly used variants of Gromacs have been installed by the Apocrita ITSR Apps Team. Advanced users may want to self-install their own additional variants via Spack.
Versions¶
Gromacs on Apocrita is available with three different installation types:
Gromacs modules for GPU are installed with Open MPI libraries.
Usage¶
A typical Gromacs workload consists of two stages:
Firstly grompp
is used to prepare a file that contains the parameters for
the simulation. The second stage is to use mdrun
to take this file as input
and run the simulation.
To run the required version of Gromacs, simply load the gromacs-<type>
module, substituting type
with the actual type desired.
Core Usage
To ensure that Gromacs uses the correct number of cores, the
-ntomp=${NSLOTS}
option should be used to spawn one OpenMP
thread per core. (Serial jobs)
For parallel jobs use mpirun -np ${NSLOTS}
(see Parallel example)
For more information see
Parallelisation schemes.
Open MPI¶
This build of Gromacs is installed with Open MPI parallelisation to run parallel simulations.
To run the required version of Gromacs with Open MPI support, simply load the
gromacs-mpi
module:
module load gromacs-mpi
gmx_mpi -h
Example jobs can be found below
Serial¶
This the basic serial build of Gromacs, intended to run jobs that require a single node.
To run the serial version of Gromacs, simply load the gromacs
module:
module load gromacs
gmx -h
An example of a serial Gromacs job can be found here.
GPU¶
This build of Gromacs provides GPU support; simulation performances with a high calculation intensity on a GPU node.
GPU job submission is required
Gromacs with GPU support requires a GPU node. Information on how to submit to GPU nodes is available here.
To run the required version of Gromacs with GPU support, simply load the
gromacs-gpu
module:
module load gromacs-gpu
An example Gromacs job script requesting a GPU node can be found here.
Example jobs¶
Gromacs job submission examples of each type:
Serial job¶
Here is an example job running on 4 cores and 4GB of memory:
#!/bin/bash
#$ -cwd
#$ -pe smp 4
#$ -l h_rt=1:0:0
#$ -l h_vmem=1G
module load gromacs
gmx grompp -f example.mdp -c example.gro -p example.top -o example.tpr
gmx mdrun -ntomp ${NSLOTS} -v -s example.tpr -deffnm example
Parallel job¶
Here is an example job running on 96 cores across 2 ddy nodes with MPI:
#!/bin/bash
#$ -cwd
#$ -j y
#$ -pe parallel 96
#$ -l infiniband=ddy-i
#$ -l h_rt=240:0:0
module load gromacs-mpi
gmx_mpi grompp -f example.mdp -c example.gro -p example.top -o example.tpr
mpirun -np ${NSLOTS} gmx_mpi mdrun -v -deffnm example -s example.tpr
GPU job¶
Here is an example job running on 1 GPU:
#!/bin/bash
#$ -cwd
#$ -j y
#$ -pe smp 8
#$ -l h_rt=240:0:0
#$ -l h_vmem=11G
#$ -l gpu=1
module load gromacs-gpu
gmx_mpi grompp -f example.mdp -c example.gro -p example.top -o example.tpr
gmx_mpi mdrun -s example.tpr -nb gpu -pme gpu -update gpu -bonded gpu
Parallelisation schemes¶
Gromacs provides considerable flexibility with respect to how it can be
configured. A command of the form: mpirun -np M gmx mdrun -ntomp N...
will launch M MPI processes with N OpenMP threads each.
However you can omit -ntomp N
in this case and Gromacs will
spawn 1 thread per MPI process.
To make this command work well with the scheduler, we suggest:
mpirun -np ${NSLOTS} gmx mdrun...`
In this case ${NSLOTS}
will expand to the number of cores you have
requested in your job script. That way you won't waste resources by requesting
more cores than Gromacs will actually use.
By default, Gromacs carries out particle-particle (PP) and particle mesh Ewald (PME) calculations one after another within the same process. However this can slow things down a lot since PME calculations depend on global communication and they may spend time waiting for other nodes to become available.
If a job uses more than 8 processes, then mdrun
will attempt to designate
dedicated nodes for PME estimating the optimal amount. However, you can
override this behaviour:
mpirun -np NP_tot mdrun_mpi -npme NP_pme -ntomp NT`
This will launch NP_tot
processes, with NP_pme
dedicated to PME and
NT
threads for each MPI process. Note that for the moment we recommend
ensuring that you use the environment variable ${NSLOTS}
to provide
NP_tot
as this will ensure that your job distributes the workload
properly across all cores when using multiple nodes.