libsmm_acc
is a library for small matrix-matrix multiplication on a GPU-accelerator. Stacks of matrix-matrix multiplication indices are passed from DBCSR to libsmm_acc
which performs the multiplications on the GPU.
For a description of the library (some details are outdated, but this nevertheless provides a very good introduction), see Chapter 8.4 of:
WALKER, R. C., & GOETZ, A. W. (2016). Electronic structure calculations on graphics processing units: from quantum chemistry to condensed matter physics.
libsmm_acc
is compiled from within DBCSR, there is no separate compilation.
kernels/
: GPU kernels (CUDA- and HIP-compatible) for matrix-matrix multiplication and Python interface to autotuning code.generate_*.py
: utility scripts for libsmm_acc
compilationlibsmm_acc*
: libsmm_acc C++ and CUDA / HIP codeparameters/
: contains parameters_GPU.json
files. These are sets of matrix-matrix multiplication parameters for different (m, n, k)-triplets optimized for a given GPU card.tune/
: scripts for autotuning of optimal parameter sets, see autotuning of kernel parametersFor a given matrix-matrix multiplication triplet characterized by dimensions
libsmm_acc
can run 5 different matrix-matrix multiplication kernels:
which take between 3 - 7 parameters (see figure at the top):
grouping
is bigger, less blocks are launched)tile_m
* tile_n
= dimensions of the result block T
P_A
and P_B
)P_C
)The performance of the matrix-matrix multiplication kernels is highly dependent on the choice of algorithm and parameters. For this reason, libsmm_acc
provides lists of optimal parameters for different GPU cards and different (m, n, k)-triplets.
We expect users to contribute to the library by providing new optimized kernels and support for new GPUs.
Follow the autotuning procedure
Choose a kernel name
Add the kernel's code (must be able to compile by both nvcc
and hip
) in file kernels/smm_acc_dnt_name.h
Add Python kernel class inheriting from base class kernels/smm_acc_dnt_name.py
Add the GPU's compute architecture properties to kernels/gpu_properties.json
. For more information on where to find these properties, please refer to the "info" field of kernels/gpu_properties.json
.
Add the GPU to the gpu_architectures
data structure in kernels/smm_acc.py
.
Add the necessary code for setting ARCH_NUMBER
correctly in the CMakeLists
. Also add this GPU to the list of SUPPORTED_CUDA_ARCHITECTURES
or SUPPORTED_HIP_ARCHITECTURES
in the CMakeLists
.
Add a minimal JSON file parameters_GPU.json
, containing:
{
}
then add matrix-matrix multiplication parameters for this GPU using autotuning.