====== SPECFEM3D_GLOBE ======
==== Running SPECFEM3D_GLOBE on the Strasbourg HPC cluster with gnu 4.8 and cuda 7.5 ====
=== Setup the environment ===
Load modules and declare environment variables as follows:
module purge
module load batch/slurm
module load compilers/cuda-7.5
export CUDA_INC=/usr/local/cuda/cuda-7.5/include
export CUDA_LIB=/usr/local/cuda/cuda-7.5/lib64
export PATH=/rpriv/ipgs/zac/openmpi-1.10.7/bin:$PATH
export LD_LIBRARY_PATH=/rpriv/ipgs/zac/openmpi-1.10.7/lib:$LD_LIBRARY_PATH
Notice that we use default gnu compiler of the operating system:
$ gfortran --version
GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
=== Compilation ===
Before compilation, make sure that required modules are loaded and CUDA_LIB, CUDA_INC environment variables are declared (see previous section). Create a run directory including directories ''DATABASE_MPI'', ''OUTPUT_FILES'', ''bin'' and ''DATA''.
In the directory ''DATA'', create ''CMTSOLUTION'', ''Par_file'' and ''STATIONS'' file (cf., SPECFEM3D_GLOBE documentation).
Change directory to the main specfem3D_globe directory. Copy the ''Par_file'' of the run directory into ''DATA'' of the main specfem3D_globe directory. You can then run configure:
./configure -with-cuda=cuda5
(the cuda5 option will enable more recent GPU compute capabilities).
Then compile the code:
make clean
make all
Copy binaries to the run directory and backup setup files:
cp bin/xmeshfem3D $rundir/bin
cp bin/xspecfem3D $rundir/bin
cp setup/* $rundir/OUTPUT_FILES/
cp DATA/Par_file $rundir/OUTPUT_FILES/
Link model directories. For example with s362ani:
ln -s DATA/crust2.0 $rundir/DATA/crust2.0
ln -s DATA/s362ani $rundir/DATA/s362ani
ln -s DATA/QRFSI12 $rundir/DATA/QRFSI12
ln -s DATA/topo_bathy $rundir/DATA/topo_bathy
Below is a script doing all the configuration and compilation:
#!/bin/bash
# Load modules
module purge
module load batch/slurm
module load compilers/cuda-7.5
module load mpi/openmpi-basic
export CUDA_LIB=/usr/local/cuda/cuda-7.5/lib64
export CUDA_INC=/usr/local/cuda/cuda-7.5/include
# source directory
rootdir=/b/home/ipgs/cmorales/specfem3d_globe
# setting up run directory
currentdir=`pwd`
mkdir -p DATABASES_MPI
mkdir -p OUTPUT_FILES
rm -rf DATABASES_MPI/*
rm -rf OUTPUT_FILES/*
# configure and compile in the source directory
cd $rootdir
# configure
./configure -with-cuda=cuda5
# compiles for a forward simulation
cp $currentdir/DATA/Par_file DATA/Par_file
make clean
make all
# backup of constants setup
cp setup/* $currentdir/OUTPUT_FILES/
cp DATA/Par_file $currentdir/OUTPUT_FILES/
# Copy executables/Model in the current directory
cd $currentdir
# copy executables
mkdir -p bin
cp $rootdir/bin/xmeshfem3D ./bin/
cp $rootdir/bin/xspecfem3D ./bin/
# Links data necessary directories
# The example below is for s362ani... this part should be changed if another model is used
cd DATA/
ln -s $rootdir/DATA/crust2.0
ln -s $rootdir/DATA/s362ani
ln -s $rootdir/DATA/QRFSI12
ln -s $rootdir/DATA/topo_bathy
cd ../
=== Run with CPU ===
Example of slurm script (number of CPU cores should be adapted to NPROC_XI and NPROC_ETA:
#!/bin/bash
#SBATCH -p grant -A g2016a68 # Partition / Account
#SBATCH -n 96 # Number of CPU cores
#SBATCH --job-name=SPECFEM
#SBATCH -t 23:00:00 # Wall time
# Load modules
module purge
module load batch/slurm
module load mpi/openmpi-basic
#
echo Master on host `hostname`
echo Time is `date`
# Start time
begin=`date +"%s"`
# Run
BASEMPIDIR=`grep LOCAL_PATH DATA/Par_file | cut -d = -f 2 `
NPROC_XI=`grep NPROC_XI DATA/Par_file | cut -d = -f 2 `
NPROC_ETA=`grep NPROC_ETA DATA/Par_file | cut -d = -f 2`
NCHUNKS=`grep NCHUNKS DATA/Par_file | cut -d = -f 2 `
numcpus=$(( $NCHUNKS * $NPROC_XI * $NPROC_ETA ))
# numcpus should be consistent with the -n option
mkdir -p OUTPUT_FILES
# backup files used for this simulation
cp DATA/Par_file OUTPUT_FILES/
cp DATA/STATIONS OUTPUT_FILES/
cp DATA/CMTSOLUTION OUTPUT_FILES/
##
## mesh generation
##
sleep 2
echo
echo `date`
echo "starting MPI mesher on $numcpus processors"
echo
mpirun -np $numcpus bin/xmeshfem3D
echo " mesher done: `date`"
echo
# backup important files addressing.txt and list*.txt
cp OUTPUT_FILES/*.txt $BASEMPIDIR/
##
## forward simulation
##
# set up addressing
#cp $BASEMPIDIR/addr*.txt OUTPUT_FILES/
#cp $BASEMPIDIR/list*.txt OUTPUT_FILES/
sleep 2
echo
echo `date`
echo starting run in current directory $PWD
echo
mpirun -np $numcpus bin/xspecfem3D
/bin/rm -rf DATABASES_MPI
echo "finished successfully"
echo `date`
# Print time after running
echo Time is `date`
echo Walltime : $(expr `date +"%s"` - $begin) # Seconds
echo CPUtime : $(squeue -j $SLURM_JOBID -o "%M" -h) # HH:MM:SS
=== Run with GPU ===
Example of slurm script (number of nodes should be adapted to the number of GPU per nodes and to NPROC_XI and NPROC_ETA:
#!/bin/bash
#SBATCH -p pri2015gpu -A eost
#SBATCH -N 3-3 # Will use 3 nodes
#SBATCH --tasks-per-node 8 # 8 tasks per node
#SBATCH --gres=gpu:8 # We only want nodes with 8 GPUs
#SBATCH --job-name=SPECFEM
#SBATCH -t 12:00:00 # Wall time
#SBATCH --cpu_bind=verbose
# Load modules
module purge
module load batch/slurm
module load compilers/cuda-7.5
module load mpi/openmpi-basic
# ID of each GPU (should be adapted if using a different number of GPUs)
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
echo Master on host `hostname`
echo Time is `date`
# Start time
begin=`date +"%s"`
# Run
BASEMPIDIR=`grep LOCAL_PATH DATA/Par_file | cut -d = -f 2 `
NPROC_XI=`grep NPROC_XI DATA/Par_file | cut -d = -f 2 `
NPROC_ETA=`grep NPROC_ETA DATA/Par_file | cut -d = -f 2`
NCHUNKS=`grep NCHUNKS DATA/Par_file | cut -d = -f 2 `
numgpus=$(( $NCHUNKS * $NPROC_XI * $NPROC_ETA ))
mkdir -p OUTPUT_FILES
# backup files used for this simulation
cp -pf DATA/Par_file OUTPUT_FILES/
cp -pf DATA/STATIONS OUTPUT_FILES/
cp -pf DATA/CMTSOLUTION OUTPUT_FILES/
##
## mesh generation
##
sleep 2
echo
echo `date`
echo "starting MPI mesher on $numgpus processors"
echo
mpirun -np $numgpus bin/xmeshfem3D
echo " mesher done: `date`"
echo
# backup important files addressing.txt and list*.txt
cp OUTPUT_FILES/*.txt $BASEMPIDIR/
##
## forward simulation
##
# set up addressing
#cp $BASEMPIDIR/addr*.txt OUTPUT_FILES/
#cp $BASEMPIDIR/list*.txt OUTPUT_FILES/
sleep 2
echo
echo `date`
echo starting run in current directory $PWD
echo
mpirun -np $numgpus bin/xspecfem3D
/bin/rm -rf DATABASES_MPI
echo "finished successfully"
echo `date`
# Print time after running
echo Time is `date`
echo Walltime : $(expr `date +"%s"` - $begin) # Seconds
echo CPUtime : $(squeue -j $SLURM_JOBID -o "%M" -h) # HH:MM:SS
==== Running SEM simulations in parallel ====
Some instructions to use custom scripts enabling parallel SEM simulations on the HPC cluster
=== Preparing the input files ===
First, create an event list "Events.txt" with 3 collumns:
* 1st column: event_id (will also be the name of the run directory)
* 2nd column: path to ''CMTSOLUTION'' file for this event
* 3nd column: path to ''STATION'' file for this event (can be the same for all events)
Then you must setup a ''Par_file'' (be careful to use a version of ''Par_file'' that is compatible with your SEM version)
Finally, you must setup hostfiles named ''nodelistN'' files where N=0,...,Np-1 (Np, the number of parallel SEM simulations). These files must specify host names and number of slots per node. Here is an example:
$ cat nodelist0
hpc-n443 slots=8
hpc-n444 slots=8
hpc-n445 slots=8
(see ''/b/home/eost/zac/jobs/specfem/parallelSEM/nodelist0'')
=== Running the simulations in parallel ===
Parallel SEM simulations are handled using 3 scripts:
* ''parallelSEM.sh'': is the main script, that compiles the code and run the simulations
* ''run_gpu_nodelist.sh'' is the script used to run the mesher and solver
* ''sleep.slurm'' is a script to reserve the GPU nodes
All these scripts are available in ''/b/home/eost/zac/jobs/specfem/parallelSEM''
Before running your job, make sure that the input parameters in ''parallelSEM.sh'' are consistent with the input parameters stated above (see ''INPUT PARAMS'' in the main script). Specifically:
* ''SPECFEMDIR'': path to SPECFEM3D_GLOBE directory
* ''Par_file'': path to the Par_file used in simulations
* ''Nparallel'': Number of SEM simulations in parallel (make sure enough GPUs are available)
* ''event_list'': List of events with the format given above
Then run your simulations:
./parallelSEM.sh
The script will make sure that the GPU nodes are available before launching SPECFEM3D_GLOBE.