# metaprograming_in_hpc **Repository Path**: zhengankun/metaprograming_in_hpc ## Basic Information - **Project Name**: metaprograming_in_hpc - **Description**: No description available - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-02 - **Last Updated**: 2025-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 介绍 在HPC(高性能计算)中,我们经常能看到模板元编程或者宏,通过模板参数调用函数,或者通过宏参数。最著名的是cutlass(几乎完全使用模板),以及openblas(很多地方使用了宏)。其实宏和模板都是元编程技术,它们发生在具体的编译之前,通过codegen技术将代码在编译期或者预处理期展开,避免了运行时动态的判断,从而得到更高的性能。 # 模板实现分块矩阵乘法和Activation融合 ## 模板实现的kernel源码 1. 激活函数模板 ```c++ #include // 激活函数模板基类 template struct Activation { static T apply(T x) = delete; // 禁止直接实例化基类 }; // ReLU 特化 template struct ReLU : Activation { static T apply(T x) { return x > T(0) ? x : T(0); } }; // Sigmoid 特化 template struct Sigmoid : Activation { static T apply(T x) { return T(1) / (T(1) + std::exp(-x)); } }; // AVX2 特化 ReLU template <> struct ReLU : Activation { static float apply(float x) { __m128 vec = _mm_set_ss(x); vec = _mm_max_ss(vec, _mm_setzero_ps()); return _mm_cvtss_f32(vec); } }; enum class ActType { relu, sigmoid }; ``` 2. 分块矩阵乘法和主体计算模板 ```c++ #include #include #include "activation.h" // 基础内层kernel模板(需特化) template class ActivationFunc> struct BlockGEMM { static void compute(const T *A, const T *B, T *C, int M, int N, int K, int m_start, int n_start, int k_start) { { // 手动展开的SIMD优化计算逻辑 for (int i = 0; i < BLOCK_M; ++i) { for (int j = 0; j < BLOCK_N; ++j) { T sum = C[(m_start + i) * N + (n_start + j)]; for (int k = 0; k < BLOCK_N; ++k) { sum += A[(m_start + i) * K + (k_start + k)] * B[(k_start + k) * N + (n_start + j)]; } C[(m_start + i) * N + (n_start + j)] = ActivationFunc::apply(sum); } } } } }; // 特化16x16x4分块 template class ActivationFunc> struct BlockGEMM<16, 16, 4, T, ActivationFunc> { static void compute(const T *A, const T *B, T *C, int M, int N, int K, int m_start, int n_start, int k_start) { // 手动展开的SIMD优化计算逻辑 for (int i = 0; i < 16; ++i) { for (int j = 0; j < 16; ++j) { T sum = C[(m_start + i) * N + (n_start + j)]; for (int k = 0; k < 4; ++k) { sum += A[(m_start + i) * K + (k_start + k)] * B[(k_start + k) * N + (n_start + j)]; } C[(m_start + i) * N + (n_start + j)] = ActivationFunc::apply(sum); } } } }; // 特化32x32x8分块(AVX512优化版本) template class ActivationFunc> struct BlockGEMM<32, 32, 8, T, ActivationFunc> { static void compute(const T *A, const T *B, T *C, int M, int N, int K, int m_start, int n_start, int k_start) { // 使用AVX512指令的展开实现 // ...(具体向量化实现逻辑) } }; // 特化64x64x16分块,数据类型为double(AVX512优化版本) template