
2026 年 1 月 13 日,2025 冬季 InfiniTensor 大模型与人工智能系统训练营 CPU 并行编程系列第一课《CPU 性能优化导论》正式开讲。
本节课从 CPU 性能瓶颈出发,系统介绍缓存优化、并行计算、量化技术等核心优化策略,为大模型的 CPU 端部署提供实用指导。
为什么需要 CPU 推理?
1. 硬件资源限制
- GPU 部署成本高:不仅硬件价格昂贵,功耗也很大
- 基础设施现状:大量现有服务器集群仍以 CPU 架构为主
- 资源利旧需求:不能因 AI 应用而废弃现有 CPU 基础设施
2. 应用场景需求
- 私有化部署:政企单位对数据安全和保密要求高
- 边缘计算:端侧 AI 设备往往没有专用 GPU
- 成本敏感场景:个人用户和中小企业难以承担 GPU 成本
💡CPU 推理不是要替代 GPU ,而是作为重要的补充方案,特别适用于对延迟要求不高但对私有化定制要求较高的场景。
CPU 性能瓶颈:计算密集 vs I/O密集
理解性能瓶颈是优化的前提。CPU 任务通常分为两类:
1. 计算密集型
- 瓶颈:计算单元的最大计算能力
- 影响因素:CPU 频率、核心数量、指令集支持
- 典型任务:大规模矩阵乘法
2. I/O 密集型
- 瓶颈:内存系统的理论最大带宽
- 影响因素:内存类型 (DDR 4/DDR 5)、通道数 (单/双通道)
- 典型表现:内存带宽成为性能天花板
CPU架构特性:速度差异的巨大鸿沟
1. 速度层级
- CPU 执行速度:极快(纳秒级)
- 内存访问速度:相对较慢
2. 缓存架构
为弥合速度差距,现代 CPU 采用多级缓存架构:
- L1 缓存:最快,容量最小(几十 KB)
- L2 缓存:中等速度,中等容量(几百 KB 到几 MB)
- L3 缓存:相对较慢,容量最大(几十 MB)
💡CPU 很快,内存很慢。优化的关键在于减少内存直接访问,充分利用缓存。
缓存优化:局部性原理的应用
1. 局部性原理
CPU 在读取数据时,会预取相邻的数据块到缓存中。这意味着:
- 时间局部性:刚访问的数据很可能再次被访问
- 空间局部性:相邻的数据很可能被连续访问
2. 内存存储格式
矩阵在内存中的存储方式直接影响缓存命中率:
- 行主序 (Row-major):同一行的元素在内存中连续存储
- 列主序 (Column-major):同一列的元素在内存中连续存储
3. 循环优化示例
通过简单的循环顺序调整,可获得数倍的性能提升。考虑矩阵乘法 C = A × B 的三层循环:
缓存不友好版本:
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < K; k++) {
C[i][j] += A[i][k] * B[k][j]; // B[k][j]访问不连续
}
}
}
缓存友好版本:
for (int i = 0; i < M; i++) {
for (int k = 0; k < K; k++) {
for (int j = 0; j < N; j++) {
C[i][j] += A[i][k] * B[k][j]; // B[k][j]和C[i][j]访问连续
}
}
}
并行计算:从 SISD 到 SIMD
1. Flynn 分类法
根据指令和数据维度,计算架构可分为四类:
- SISD:单指令单数据(传统串行)
- SIMD:单指令多数据(向量化)
- MIMD:多指令多数据(多线程)
- MISD:多指令单数据(很少使用)
2. SIMD向量化
现代 CPU 支持 SIMD 指令集,可同时处理多个数据:
- x86 架构:AVX 2(256位)、AVX-512(512位)
- ARM 架构:Neon 指令集
向量化示例:
// 传统串行:4次加法指令
for (int i = 0; i < 4; i++) {
c[i] = a[i] + b[i];
}
// SIMD向量化:1次加法指令
__m128 va = _mm_load_ps(a);
__m128 vb = _mm_load_ps(b);
__m128 vc = _mm_add_ps(va, vb);
_mm_store_ps(c, vc);
3. 多线程并行
利用 CPU 多核特性,将任务分配给多个线程:
- 任务划分:矩阵乘法可按行/列划分
- 线程数量:通常设置为物理核心数
同步与锁:并行编程的挑战
1. 互斥锁机制
当多个线程访问共享数据时,需要同步机制:
std::mutex mtx;
mtx.lock();
// 访问共享数据
mtx.unlock();
2. 性能开销
- 锁操作开销:加锁/解锁本身消耗 CPU 周期
- 线程阻塞:等待锁的线程处于空转状态
- 适用场景:仅适用于大块数据保护,不适合细粒度操作
3.优化策略:异步线程池
- 预创建线程:避免频繁创建/销毁线程的开销
- 任务队列:将计算任务放入队列,线程从队列取任务
- 无锁设计:通过任务划分避免共享数据竞争
分块优化
(Blocked Matrix Multiplication)
针对大矩阵乘法,采用分块策略充分利用多级缓存:
1. 分块原理
- 将大矩阵划分为小块
- 每个小块的大小匹配 L1/L2/L3 缓存容量
- 按层次逐级加载数据到各级缓存
2. 执行流程
- 将大块数据加载到 L3 缓存
- 将中等块数据加载到 L2 缓存
- 将小块数据加载到 L1 缓存
- 在 L1 缓存中完成内层循环计算
- 逐级向上更新结果
💡大幅减少内存访问次数,提高缓存命中率。
模型量化:精度与效率的平衡
1. 量化原理
用低精度数值表示高精度权重,减少存储和计算开销:
- FP32 → INT8:存储空间减少 75%
- 精度损失可控:大模型对中间精度要求不高
2. 常见量化格式
- FP16/BF16:16位浮点数
- INT8/INT4:8位/4位整数
- 混合精度:权重和激活值采用不同精度
3. 静态量化 vs 动态量化
- 静态量化:推理前预先量化权重
- 动态量化:推理时实时量化(增加计算开销)
系统级优化:NUMA 与内存对齐
1. NUMA 优化
在多 CPU 插槽的服务器上:
- 问题:跨 CPU 访问内存延迟高
- 解决方案:将数据和计算任务绑定到同一 CPU 核心
2. 内存对齐
- 原理:CPU 按固定大小块读取内存
- 问题:未对齐的数据跨越内存块边界,需要多次读取
- 解决方案:确保数据结构按内存块边界对齐
工程实践建议
1. 使用优化库
不要重复造轮子,优先使用成熟的优化库:
- Intel oneDNN:针对 Intel CPU 优化的深度学习库
- OpenBLAS:高性能 BLAS 库
- TVM:端到端深度学习编译器
2. 性能分析工具
- perf:Linux 性能分析工具
- VTune:Intel 性能分析工具
- 自定义计时:精确测量各阶段耗时
总结
CPU 性能优化是一个系统工程,需要从算法、数据结构、并行策略、硬件特性等多个维度综合考虑。本节课系统介绍了缓存优化、并行计算、量化技术等核心优化策略,为后续 CPU 并行编程课程奠定理论基础。

💡 学习贴士
更多细节及完整课程内容,请观看直播或查看课程回放。
链接:https://www.infinitensor.com/camp/winter2025
📚 训练营报名持续进行中
扫码报名与加入群聊,或点击 「阅读原文」 直达官网报名

