GEMM: From Pure C to SSE Optimized Micro Kernels (2014)
apfel.mathematik.uni-ulm.de
apfel.mathematik.uni-ulm.de
You wouldn't want to use this code, but it shows you the sorts of things to start paying attention to in this performance-critical sections. I was most surprised by the fact that reordering operations to spread the same instructions apart made a significant difference.
(As an aside, your best bet in practical tools is using a metaprogramming library [Blaze seems to be the best], wrapping core operations in a fast BLAS implementation. I personally choose to use Blaze on top of OpenBLAS.)
Note that OpenBLAS doesn't have avx512 kernels, and the fallback to avx2 (unreleased) is a factor of three slower than MKL dgemm on Knights Landing. It looks as if the next release of BLIS will remedy the lack of free BLAS avx512 support with micro-architecture dynamic dispatch which includes fairly competitive avx512 (>80% of MKL dgemm on KNL).
I don't know about the competition on non-x86 architectures, but BLIS currently has more limited support than OpenBLAS.
All BLAS libraries currently only care about float32 and float64, I wanted very fast routines for integer matrix multiplication and use this as a fallback for integers while using OpenBLAS/MKL/CLBlast (OpenCL)/CuBLAS (CUDA) for floats.
Thanks to this I achieved 10x speed compared to Julia and 22x speed compared to Numpy on a 1500x1500 int64 matrix multiplication on CPU: https://github.com/mratsim/Arraymancer#micro-benchmark-int64...
Do you know what libxsmm means by "small", there is nothing in their README/wiki. However it does say that libxsmm doesn't support 32-bit OS. My library is used in IoT devices.
* Big(ger) Matrix Multiplication: https://github.com/hfp/libxsmm/wiki/Q&A#what-about-medium-si...
There is indeed no support for 32-bit. Regarding integers, LIBXSMM supports lower-precision GEMM. However, we haven't fully represented this in our usual sample code (samples/xgemm, samples/bgemm).
Put aside a tiling scheme for big matrices - the code generation for low-precision GEMM kernels is here:
* https://github.com/hfp/libxsmm/blob/master/src/template/libx...
* https://github.com/hfp/libxsmm/blob/master/src/template/libx...
* Generic: https://github.com/hfp/libxsmm/blob/master/src/template/libx... with https://github.com/hfp/libxsmm/blob/master/include/libxsmm_g...
* C++: https://github.com/hfp/libxsmm/blob/master/src/template/libx...