upstream: add GEMM kernel references from 4 repos for BI-V100 porting
Sources (all CUDA 10.2 compatible, no CUTLASS/Triton dependency): - leimao/CUDA-GEMM-Optimization: v00-v07, fp16 WMMA variant, double buffered - siboehm/SGEMM_CUDA: kernel 1-12, warp tiling + double buffering - wangzyon/NVIDIA_SGEMM_PRACTICE: kernel 1-7 - edtallison/sgemm-cuda: kernel 1-12 (reimplementation with notes) Key porting issue: ALL kernels hardcode WARPSIZE=32. BI-V100 has warp_size=64. Need to: 1. Replace all 32U / WARPSIZE constants with 64 2. Adjust warp subtile decomposition (WMITER, WNITER, WSUBM, WSUBN) 3. Adjust shared memory bank conflict avoidance (may have different bank count) 4. Test __shfl_down_sync with mask=0xFFFFFFFFFFFFFFFF (64-bit)
This commit is contained in:
98
upstream_ref/cuda_gemm_optimization/cuda_gemm.hpp
Normal file
98
upstream_ref/cuda_gemm_optimization/cuda_gemm.hpp
Normal file
@@ -0,0 +1,98 @@
|
||||
#ifndef CUDA_GEMM_HPP
|
||||
#define CUDA_GEMM_HPP
|
||||
|
||||
#include <cuda_runtime.h>
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v00(size_t m, size_t n, size_t k, T const* alpha,
|
||||
T const* A, size_t lda, T const* B, size_t ldb,
|
||||
T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v01(size_t m, size_t n, size_t k, T const* alpha,
|
||||
T const* A, size_t lda, T const* B, size_t ldb,
|
||||
T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v02(size_t m, size_t n, size_t k, T const* alpha,
|
||||
T const* A, size_t lda, T const* B, size_t ldb,
|
||||
T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v02_vectorized(size_t m, size_t n, size_t k,
|
||||
T const* alpha, T const* A, size_t lda,
|
||||
T const* B, size_t ldb, T const* beta,
|
||||
T* C, size_t ldc, cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v03(size_t m, size_t n, size_t k, T const* alpha,
|
||||
T const* A, size_t lda, T const* B, size_t ldb,
|
||||
T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v03_vectorized(size_t m, size_t n, size_t k,
|
||||
T const* alpha, T const* A, size_t lda,
|
||||
T const* B, size_t ldb, T const* beta,
|
||||
T* C, size_t ldc, cudaStream_t stream);
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v04(size_t m, size_t n, size_t k, T const* alpha,
|
||||
T const* A, size_t lda, T const* B, size_t ldb,
|
||||
T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v04_vectorized(size_t m, size_t n, size_t k,
|
||||
T const* alpha, T const* A, size_t lda,
|
||||
T const* B, size_t ldb, T const* beta,
|
||||
T* C, size_t ldc, cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v05(size_t m, size_t n, size_t k, T const* alpha,
|
||||
T const* A, size_t lda, T const* B, size_t ldb,
|
||||
T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v05_vectorized(size_t m, size_t n, size_t k,
|
||||
T const* alpha, T const* A, size_t lda,
|
||||
T const* B, size_t ldb, T const* beta,
|
||||
T* C, size_t ldc, cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v06(size_t m, size_t n, size_t k, T const* alpha,
|
||||
T const* A, size_t lda, T const* B, size_t ldb,
|
||||
T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v06_vectorized(size_t m, size_t n, size_t k,
|
||||
T const* alpha, T const* A, size_t lda,
|
||||
T const* B, size_t ldb, T const* beta,
|
||||
T* C, size_t ldc, cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v06_vectorized_double_buffered(
|
||||
size_t m, size_t n, size_t k, T const* alpha, T const* A, size_t lda,
|
||||
T const* B, size_t ldb, T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v07(size_t m, size_t n, size_t k, T const* alpha,
|
||||
T const* A, size_t lda, T const* B, size_t ldb,
|
||||
T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v07_vectorized(size_t m, size_t n, size_t k,
|
||||
T const* alpha, T const* A, size_t lda,
|
||||
T const* B, size_t ldb, T const* beta,
|
||||
T* C, size_t ldc, cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void launch_gemm_kernel_v07_vectorized_double_buffered(
|
||||
size_t m, size_t n, size_t k, T const* alpha, T const* A, size_t lda,
|
||||
T const* B, size_t ldb, T const* beta, T* C, size_t ldc,
|
||||
cudaStream_t stream);
|
||||
#endif
|
||||
Reference in New Issue
Block a user