学习资料
2026 夏季 InfiniTensor 训练营 CPU 并行编程 2:《CPU 指令集加速实战》

7 月 27 日,2026 夏季 InfiniTensor 训练营 CPU 并行编程方向第二课《CPU 指令集加速实战》开讲。
前置课程《CPU 性能优化导论》讲了 CPU 性能优化核心方法,涵盖 CPU 多级缓存、局部性原理、SIMD 向量指令、多线程并行等优化手段。

本节课我们将进入实战环节。通过搭建测试框架、手写矩阵乘法(GEMM)、多线程并行、SIMD 指令集优化以及调用厂商库(MKL),感知不同优化技术带来的真实性能提升。

测试框架介绍

  1. 语言与构建:基于 C++ 开发,使用 xmake 作为构建工具(相比 CMake 语法更简洁,工具链支持更丰富)。
  2. 代码组织结构
    • src/:主程序与通用源码。
    • kernels/核心关注目录,存放具体的矩阵乘实现代码。
  3. 接口标准:框架基于 BLAS 接口标准设计,只需实现核心 Kernel 即可直接接入测试。

BLAS 接口与 Leading Dimension 详解

GEMM 接口核心参数解析

  1. 数据存储方式:需显式指定行主序(Row-major)或列主序(Column-major),保证 A、B、C 三个矩阵存储方式一致。
  2. 转置选项:定义 A 和 B 是否转置,利用转置定律避免外部显式转置带来的额外内存拷贝开销。
  3. 维度参数 (M, N, K):对应 $C(M imes N) = A(M imes K) imes B(K imes N)$
  4. 缩放系数 ($alpha, eta$):支持线性变换操作;纯矩阵乘时通常设为 $alpha=1, eta=0$。
  5. Const 限定符:A、B 指针通常为 const,确保输入数据不被修改,符合安全开发规范。

Leading Dimension (LD)

  1. 定义:内存中相邻行(行主序)或相邻列(列主序)元素之间的跨度。
  2. 存在意义
    • 兼容分块矩阵运算(子矩阵在大矩阵中的索引)。
    • 兼容硬件底层的内存对齐 Padding,例如矩阵每行可能扩展额外空间,使 Leading Dimension 大于逻辑矩阵维度,以满足 SIMD 加载和缓存访问要求。
  3. 避坑指南:LD 不一定等于矩阵物理维度,设置错误会导致读取数据错位;建议通过画图或编写验证代码加深理解。

实战演示

Ref GEMM (Baseline) 的问题

  • 实现:三层 for 循环,最内层为 K 循环。
  • 瓶颈:访问 B 矩阵时跨列读取(stride = LDB),导致严重的 Cache Miss,性能极低。

Naive GEMM 的改进

  • 循环变换:将 K 循环提至外层,J 循环置于最内层。
  • 访存优化
    • A 矩阵按行遍历,B 矩阵按行遍历,C 矩阵按行写入。
    • 保证内存连续访问,大幅提升 Cache 命中率。
  • 效果:性能提升 10~20 倍。

多线程实现思路

  • 任务划分 (GEMMTask):定义 beginend 参数,按行范围切分 A 和 C 矩阵的计算任务。
  • Worker 机制:每个线程执行一个 Job,处理指定行范围内的 GEMM 计算。
  • 线程管理
    • 获取硬件最大线程数(设定最小值保底,如 4 线程)。
    • 预创建线程池,避免重复创建销毁开销。
    • 使用 join 同步原语等待所有任务完成。

SIMD 指令集加速

  1. 核心操作流

    • Broadcast:将 A 的元素广播填满寄存器。
    • Load:批量加载 B 和 C 的数据到 256 位寄存器。
    • FMA:执行乘加融合运算 ($A imes B + C$),单次处理 8 个双精度浮点数。
    • Store:将结果写回内存。
  2. 边界处理:非对齐尾部元素使用标量循环处理。

  3. 性能观察:相比多线程有进一步提升,但现代编译器自动向量化能力较强,手动优化边际收益递减。

OpenMP 并行加速

  • 优势:通过预编译指令(Pragma)自动实现循环并行,代码侵入性低。
  • 集成:仅需 include 头文件并在 xmake 中添加编译 flag。
  • 性能表现:优于简单的手写多线程实现(底层包含更多调度优化),且具备良好的可复现性。

厂商数学库 (Intel MKL)

  • 特点:系统级底层优化,针对特定硬件架构极致调优。
  • 使用:完全兼容 BLAS 接口,零迁移成本,仅需传入正确参数。
  • 性能对比
    • 相比 OpenMP 性能翻倍。
    • 相比手写优化版本提升 5~6 倍。
  • 工程启示:通用算法优先使用官方成熟库,避免重复造轮子,将精力聚焦于业务特有逻辑的优化。

加入训练营

📺完整课程内容,请观看直播或查看课程回放:

InfiniTensor 官网https://www.infinitensor.com

B站直播: InfiniTensor 官方直播间

视频号直播: InfiniTensor 视频号预约

答疑交流: 训练营官方社群⬇️

关注与交流