Independent Parallel Particle Layer (IPPL)
IPPL is a C++ library to develop performance portable code for fully Eulerian, Lagrangian or hybrid Eulerian-Lagrangian methods. IPPL supports simulations in one to six dimensions, mixed precision, and asynchronous execution in different execution spaces (e.g. CPUs and GPUs).
Cite this software
Description
Independent Parallel Particle Layer (IPPL)
Independent Parallel Particle Layer (IPPL) is a performance portable C++ library for Particle-Mesh methods. IPPL makes use of Kokkos (https://github.com/kokkos/kokkos), HeFFTe (https://github.com/icl-utk-edu/heffte), and MPI (Message Passing Interface) to deliver a portable, massively parallel toolkit for particle-mesh methods. IPPL supports simulations in one to six dimensions, mixed precision, and asynchronous execution in different execution spaces (e.g. CPUs and GPUs).
All IPPL releases (< 3.2.0) are available under the BSD 3-clause license. Since version 3.2.0, this repository includes a modified version of the variant header by GNU, created to support compilation under CUDA 12.2 with GCC 12.3.0. This header file is available under the same terms as the GNU Standard Library; note the GNU runtime library exception. As long as this file is not removed, IPPL is available under GNU GPL version 3.
Installing IPPL and its dependencies
All the new developments of IPPL are merged into the master branch which can make it potentially unstable from time to time. So if you want a stable and more tested version
please checkout the tagged branch correspodning to the latest release (e.g. git checkout tags/IPPL-x.x.x). Otherwise if you want the latest developments go with the master with the above caveat in mind.
Requirements
- CMake
- A C++ compilation toolchain (GPU-capable for GPU builds, e.g. nvcc, clang or rocmcc)
- MPI (GPU-aware if building for GPUs)
Optional requirements
- FFTW
- CuFFT
Compilation
IPPL is a CMake Project and can be configured by passing options in CMake syntax:
cmake <src_dir> -D<option>=<value>
None of the options have to be set explicitly, all have a default.
The relevant options of IPPL are
- IPPL_PLATFORMS, can be one of
SERIAL, OPENMP, CUDA, "OPENMP;CUDA", defaultSERIAL Kokkos_VERSION, default4.1.00Heffte_VERSION, defaultMASTER- If set to
MASTER, an additional flagHeffte_COMMIT_HASHcan be set, default9eab7c0eb18e86acaccc2b5699b30e85a9e7bdda - Currently, this is the only compatible commit of Heffte
- If set to
ENABLE_SOLVERS, defaultOFFENABLE_FFT, defaultOFF- If
ENABLE_FFTis set,Heffte_ENABLE_CUDAwill default toONifIPPL_PLATFORMScontainscuda - Otherwise,
Heffte_ENABLE_AVX2is enabled. FFTW has to be enabled explicitly.
- If
Heffte_ENABLE_FFTW, defaultOFFENABLE_TESTS, defaultOFFENABLE_UNIT_TESTS, defaultOFFENABLE_ALPINE, defaultOFFUSE_ALTERNATIVE_VARIANT, defaultOFF. Can turned on for GPU builds where the use of the system-provided variant doesn't work.
Furthermore, be aware of CMAKE_BUILD_TYPE, which can be either
Releasefor optimized buildsRelWithDebInfofor optimized builds with debug info (default)Debugfor debug builds (with Sanitizers enabled)
Examples
Download and setup a build directory:
https://github.com/IPPL-framework/ippl
cd ippl
mkdir build
cd build
Serial debug build with tests and newest Kokkos
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_STANDARD=20 -DENABLE_TESTS=True -DKokkos_VERSION=4.2.00
OpenMP release build with alpine and FFTW
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=20 -DENABLE_FFT=ON -DENABLE_SOLVERS=ON -DENABLE_ALPINE=True -DENABLE_TESTS=ON -DIPPL_PLATFORMS=openmp -DHeffte_ENABLE_FFTW=True
Cuda alpine release build
cmake .. -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_[architecture]=ON -DCMAKE_CXX_STANDARD=20 -DENABLE_FFT=ON -DENABLE_TESTS=ON -DUSE_ALTERNATIVE_VARIANT=ON -DENABLE_SOLVERS=ON -DENABLE_ALPINE=True -DIPPL_PLATFORMS=cuda
HIP release build (LUMI)
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=20 \
-DCMAKE_CXX_COMPILER=hipcc \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_HIP_ARCHITECTURES=gfx90a \
-DCMAKE_HIP_FLAGS=--offload-arch=gfx90a \
-DKokkos_ENABLE_DEBUG_BOUNDS_CHECK=ON \
-DKokkos_ENABLE_DEBUG=OFF \
-DKokkos_ARCH_ZEN3=ON \
-DKokkos_ARCH_AMD_GFX90A=ON \
-DKokkos_ENABLE_HIP=ON \
-DIPPL_PLATFORMS="HIP;OPENMP" \
-DENABLE_TESTS=ON \
-DENABLE_FFT=ON \
-DENABLE_SOLVERS=ON \
-DENABLE_ALPINE=OFF \
-DHeffte_ENABLE_ROCM=ON\
-DHeffte_ENABLE_GPU_AWARE_MPI=ON \
-DCMAKE_EXE_LINKER_FLAGS="-L/opt/cray/pe/mpich/8.1.28/ofi/amd/5.0/lib -L/opt/cray/pe/mpich/8.1.28/gtl/lib -L/opt/cray/pe/libsci/24.03.0/AMD/5.0/x86_64/lib -L/opt/cray/pe/dsmml/0.3.0/dsmml
/lib -L/opt/cray/xpmem/2.8.2-1.0_5.1__g84a27a5.shasta/lib64 -lsci_amd_mpi -lsci_amd -ldl -lmpi_amd -lmpi_gtl_hsa -ldsmml -lxpmem -L/opt/rocm-6.0.3/lib/lib -L/opt/rocm-6.0.3/lib/lib64 -L/opt/roc
m-6.0.3/lib/llvm/lib"
[architecture] should be the target architecture, e.g.
PASCAL60PASCAL61VOLTA70VOLTA72TURING75AMPERE80AMPERE86AMD_GFX90A(LUMI)