Quick Start: 3D Blast Wave - hyschive/gamer-fork GitHub Wiki
This demo will illustrate the following features:
- Hybrid MPI/OpenMP/GPU
- HDF5 output
- yt analysis
It is recommended to first check Quick Start: 1D Shock Tube.
1. Install the external packages required for this demo.
2. Generate Makefile
by configure.py.
cp ../example/test_problem/Hydro/BlastWave/generate_make.sh ./
sh generate_make.sh --openmp=true --gpu=true --mpi=true --hdf5=true
Execution results
... ... ======================================== Makefile is created. ========================================
3. Compile the code.
make clean
make -j
Execution results
... ... Compiling GAMER --> Successful!
4. Create a working directory and copy the GAMER executable and example files of the test problem.
cd ../bin
mkdir blastwave
cd blastwave
cp -r ../../example/test_problem/Hydro/BlastWave/* .
cp ../gamer .
ls
Execution results
Input__Flag_Lohner Input__Parameter Input__TestProb README clean.sh gamer plot_profile.gpt plot_slice.py
5. Edit the input file Input__Parameter to set the total number of OpenMP threads per MPI process. The following example will launch 10 threads per process.
OMP_NTHREAD 10 # number of OpenMP threads (<=0=auto) [-1]
Important
See Hybrid MPI/OpenMP/GPU for the recommended configuration of the number of MPI processes and OpenMP threads.
6. Run the code with MPI (e.g., mpirun, mpiexec, aprun
).
Important
Please consult the documentation of your system, especially about how to compile and launch "hybrid MPI/OpenMP" jobs.
The following example uses OpenMPI 1.8.4 to launch 2 MPI processes and 10 threads per process, assuming that there are two 10-core CPUs.
mpirun -np 2 -map-by ppr:1:socket:pe=10 ./gamer
Execution results
... ... Time: 4.8438672e-03 -> 4.8932853e-03, Step: 114 -> 115, dt_base: 4.9418079e-05 Time: 4.8932853e-03 -> 4.9427910e-03, Step: 115 -> 116, dt_base: 4.9505779e-05 Time: 4.9427910e-03 -> 4.9923843e-03, Step: 116 -> 117, dt_base: 4.9593262e-05 Time: 4.9923843e-03 -> 5.0000000e-03, Step: 117 -> 118, dt_base: 7.6156993e-06 Output_DumpData_Total_HDF5 (DumpID = 10) ... Output_DumpData_Total_HDF5 (DumpID = 10) ... done Output_DumpData_Part (DumpID = 10) ... Output_DumpData_Part (DumpID = 10) ... done End_GAMER ... End_MemFree ... done End_GAMER ... done ~ GAME OVER ~
7. The code should have generated several log files
Record__*
, a series of 1D text data files Diag_*
, and a series of
HDF5 snapshots Data_*
.
ls
Execution results
Data_000000 Data_000005 Data_000010 Diag_000004 Diag_000009 README Record__Note clean.sh Data_000001 Data_000006 Diag_000000 Diag_000005 Diag_000010 Record__Dump Record__PatchCount gamer Data_000002 Data_000007 Diag_000001 Diag_000006 Input__Flag_Lohner Record__LoadBalance Record__Performance plot_profile.gpt Data_000003 Data_000008 Diag_000002 Diag_000007 Input__Parameter Record__MemInfo Record__TimeStep plot_slice.py Data_000004 Data_000009 Diag_000003 Diag_000008 Input__TestProb Record__NCorrUnphy Record__Timing
h5ls -r Data_000010
Execution results
/ Group /GridData Group /GridData/Dens Dataset {6016, 8, 8, 8} /GridData/Engy Dataset {6016, 8, 8, 8} /GridData/MomX Dataset {6016, 8, 8, 8} /GridData/MomY Dataset {6016, 8, 8, 8} /GridData/MomZ Dataset {6016, 8, 8, 8} /Info Group /Info/InputPara Dataset {SCALAR} /Info/KeyInfo Dataset {SCALAR} /Info/Makefile Dataset {SCALAR} /Info/SymConst Dataset {SCALAR} /Tree Group /Tree/Corner Dataset {6016, 3} /Tree/Father Dataset {6016} /Tree/LBIdx Dataset {6016} /Tree/Sibling Dataset {6016, 26} /Tree/Son Dataset {6016}
8. Validate the OpenMP configuration by following step 5 in Quick Start: 1D Shock Tube -- CPU-only with OpenMP. The example setup given above leads to something like
OpenMP Diagnosis *********************************************************************************** OMP__SCHEDULE DYNAMIC OMP__SCHEDULE_CHUNK_SIZE 1 OMP__NESTED OFF CPU core IDs of all OpenMP threads (tid == thread ID): ------------------------------------------------------------------------ Rank Host NThread tid-00 tid-01 tid-02 tid-03 tid-04 tid-05 tid-06 tid-07 tid-08 tid-09 0 golub121 10 2 0 4 8 10 12 14 16 18 6 1 golub121 10 1 3 5 7 9 11 13 15 17 19 ***********************************************************************************
Note
Here the two MPI processes run on the same node golub121
and all OpenMP threads use different CPU cores.
9. Validate the GPU configuration by following step 3 in
Quick Start: 1D Shock Tube -- Hybrid OpenMP/GPU.
Especially, make sure that the MPI processes running on the
same node access different GPU ID
(unless that is what you want).
10. Plot a HDF5 snapshot with yt. You can use the sample script plot_script/plot_slice.py
.
cd plot_script
python plot_slice_gas.py -h
Execution results
usage: plot_slice_gas.py [-h] -s IDX_START -e IDX_END [-d DIDX] [-i PREFIX] Plot gas density slices for the blast wave test optional arguments: -h, --help show this help message and exit -s IDX_START first data index -e IDX_END last data index -d DIDX delta data index [1] -i PREFIX data path prefix [../]
Let's plot Data_000010
.
python plot_slice_gas.py -s 10 -e 10
Execution results
Command-line arguments: ------------------------------------------------------------------- plot_slice_gas.py -s 10 -e 10 ------------------------------------------------------------------- yt : [WARNING ] 2017-12-11 20:34:09,787 Cannot determine code units ==> Use units_override to specify the units yt : [WARNING ] 2017-12-11 20:34:09,788 Assuming length unit = 1.0 cm yt : [WARNING ] 2017-12-11 20:34:09,789 Assuming time unit = 1.0 s yt : [WARNING ] 2017-12-11 20:34:09,789 Assuming mass unit = 1.0 g yt : [INFO ] 2017-12-11 20:34:09,842 Parameters: current_time = 0.005 yt : [INFO ] 2017-12-11 20:34:09,842 Parameters: domain_dimensions = [32 32 32] yt : [INFO ] 2017-12-11 20:34:09,843 Parameters: domain_left_edge = [ 0. 0. 0.] yt : [INFO ] 2017-12-11 20:34:09,844 Parameters: domain_right_edge = [ 1. 1. 1.] yt : [INFO ] 2017-12-11 20:34:09,845 Parameters: cosmological_simulation = 0 yt : [INFO ] 2017-12-11 20:34:14,783 xlim = 0.000000 1.000000 yt : [INFO ] 2017-12-11 20:34:14,784 ylim = 0.000000 1.000000 yt : [INFO ] 2017-12-11 20:34:14,786 xlim = 0.000000 1.000000 yt : [INFO ] 2017-12-11 20:34:14,787 ylim = 0.000000 1.000000 yt : [INFO ] 2017-12-11 20:34:14,810 Making a fixed resolution buffer of (('gas', 'density')) 800 by 800 yt : [INFO ] 2017-12-11 20:34:18,923 Saving plot Data_000010_Slice_z_density.png
display Data_000010_Slice_z_density.png