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).
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.
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.
IPPL is a CMake Project and can be configured by passing options in CMake syntax:
cmake <src_dir> -D<option>=<value>
The relevant options of IPPL are
SERIAL, OPENMP, CUDA, "OPENMP;CUDA"
, default SERIAL
Kokkos_VERSION
, default 4.1.00
Heffte_VERSION
, default MASTER
MASTER
, an additional flag Heffte_COMMIT_HASH
can be set, default 9eab7c0eb18e86acaccc2b5699b30e85a9e7bdda
ENABLE_SOLVERS
, default OFF
ENABLE_FFT
, default OFF
ENABLE_FFT
is set, Heffte_ENABLE_CUDA
will default to ON
if IPPL_PLATFORMS
contains cuda
Heffte_ENABLE_AVX2
is enabled. FFTW has to be enabled explicitly.Heffte_ENABLE_FFTW
, default OFF
ENABLE_TESTS
, default OFF
ENABLE_UNIT_TESTS
, default OFF
ENABLE_ALPINE
, default OFF
USE_ALTERNATIVE_VARIANT
, default OFF
. 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
Release
for optimized buildsRelWithDebInfo
for optimized builds with debug info (default)Debug
for debug builds (with Sanitizers enabled)Download and setup a build directory:
https://github.com/IPPL-framework/ippl
cd ippl
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_STANDARD=20 -DENABLE_TESTS=True -DKokkos_VERSION=4.2.00
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
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
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.
PASCAL60
PASCAL61
VOLTA70
VOLTA72
TURING75
AMPERE80
AMPERE86
AMD_GFX90A
(LUMI)