https://github.com/stfc/PSycloneBench
Various benchmarks used to inform PSyclone optimisations
https://github.com/stfc/PSycloneBench
benchmark fortran gpu-acceleration kokkos mpi openacc opencl openmp optimization
Last synced: about 2 months ago
JSON representation
Various benchmarks used to inform PSyclone optimisations
- Host: GitHub
- URL: https://github.com/stfc/PSycloneBench
- Owner: stfc
- License: bsd-3-clause
- Created: 2018-01-31T12:05:01.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2024-02-22T18:19:25.000Z (about 1 year ago)
- Last Synced: 2024-07-29T19:07:45.093Z (9 months ago)
- Topics: benchmark, fortran, gpu-acceleration, kokkos, mpi, openacc, opencl, openmp, optimization
- Language: Fortran
- Homepage:
- Size: 18.7 MB
- Stars: 6
- Watchers: 6
- Forks: 5
- Open Issues: 27
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# PSycloneBench
Various small benchmarks used to inform the development of the
[PSyclone](https://github.com/stfc/psyclone) Domain-Specific Compiler.## Obtaining the Code ##
The benchmark codes contained in this project use the
[dl_timer](https://bitbucket.org/apeg/dl_timer) library for execution
timing and the [dl_esm_inf](https://github.com/stfc/dl_esm_inf)
infrastructure. Some implementation also have
[PSyclone](https://github.com/stfc/PSyclone),
[FortCL](https://github.com/stfc/FortCL) or
[Kokkos](https://github.com/kokkos/kokkos) as dependencies.
All these packages are included within the PSycloneBench
repository as git submodules. As such, when cloning the repository
you need to use the `--recursive` flag in order to get the source code
of that submodule, e.g.:git clone --recursive https://github.com/stfc/PSycloneBench
If you forget to do this then your cloned repository will contain empty
`PSycloneBench/shared/dl_timer`, `dl_esm_inf`, `kokkos`, `FortCL` and
`PSyclone` directories. To populate them you can do:cd PSycloneBench
git submodule init
git submodule update## Benchmarks ##
Are contained in directories beneath the `benchmarks` directory.
### NEMOLite2D ###
`benchmarks/nemo/nemolite2d` contains various versions of the NEMOLite2D
benchmark which is based upon the free-surface component of the NEMO
ocean model (www.nemo-ocean.eu). This was originally constructed
by Hedong Liu of the National Oceanography Centre, Liverpool, UK.#### Manual implementations ####
The `manual_versions` directory contains various implementations of
NEMOLite2D where the application has been split-up into Algorithm PSy
and Kernel layers but the PSy layer has been written manually.
See the [README.md](benchmarks/nemo/nemolite2d/manual_versions/README.md)
file in the NemoLite2D manual_versions directory for more information.(Note that the OpenACC versions are based upon work by Jeremy
Appleyard of NVIDIA).#### PSyclone code generation ####
The `psykal` directory contains the version of NEMOLite2D that uses
PSyclone to generate the PSy layer. Currently serial and OpenMP
versions may be generated.### NEMO Tracer Advection ###
The `benchmarks/nemo/tracer_advection` directory contains various versions
of a benchmark based on one of the tracer-advection routines in the NEMO
code base. The version in the `original` directory was supplied by Silvia
Mocavero of [CMCC](https://www.cmcc.it/).### Shallow ###
`benchmarks/shallow` contains various versions of the Shallow benchmark,
originally developed by Paul Swarztrauber of NCAR. In summary these are:* SEQ/original - original single-file serial version in Fortran.
* SEQ - PSyKAl version of Shallow including option to build with PSyclone.
* OMP - manual OpenMP implementation in C.Please see the README.md files in the individual directories for more
information.## Building ##
The Makefiles for all of the various benchmarks pick-up which compiler
to use (and associated flags) from environment variables. Bash scripts to
set these variables for a variety of compilers are in the compiler_setup
directory. When benchmarking you will need to edit the relevant file
and ensure that the compiler flags are set appropriately. The flags that
give the best performance for a particular compiler can vary from benchmark
to benchmark and even by problem size.In order to use the settings for a particular compiler, you must source
the appropriate Bash script. e.g. for the Intel compiler (assuming you are
running a Bash shell):> . compiler_setup/intel.sh
Again, see the README.md file included with each benchmark.
A top-level Makefile is provided that has targets to build all of the
various NEMOLite2D and Shallow benchmarks for CPU:* all - build all targets that do not require PSyclone
* all_gen - build all targets that use PSyclone code generation
* shallow_cpu - build all CPU versions of Shallow that do not require
PSyclone
* shallow_gen - build Shallow using PSyclone for code generation
* nemolite_cpu - build all CPU versions of NEMOLite2D that do not require
PSyclone
* nemolite_gen - build NEMOLite2D using PSyclone for code generationSince the set-up for OpenACC and OpenCL is more involved, it does not
attempt to compile the benchmarks using those languages. See the Makefiles
in the individual benchmark folders for those cases.### LFRic Small Matrix Vector Multiplication ###
`benchmarks/smallmatvec` contains multiple implementations of the
matrix-vector multiplication operation done in the LFRic application.Currently it only contains one manual implementation:
* openmp - Configurable implementation using OpenMP that test the
vectorization and threading capabilities of multiple versions
of the kernel and multiple parallel traversing strategies.Note that this benchmark does not use the `compiler_setup` settings yet.