第16章 §03 · x86 与 AVX · 讲解稿¶
篇幅: ~4000 字 / 阅读 10 分钟
一 · 一句话总览¶
x86 + AVX = 服务器 / PC 的 SIMD 主力。AVX-512 单指令 64 FP32, 是高性能计算 (HPC) + LLM 推理服务器的核心。
二 · x86 SIMD 演进¶
2.1 指令集时间线¶
| 年份 | 指令集 | 宽度 | 主要厂商 |
|---|---|---|---|
| 1999 | SSE | 128-bit | Intel |
| 2008 | AVX | 256-bit | Intel/AMD |
| 2013 | AVX-512 | 512-bit | Intel Xeon/Phi |
| 2017 | AVX-512 VNNI | 512-bit | 深度学习 |
| 2023 | AVX-VNNI4 | 256-bit | 主流 |
| 2024 | AMX (Tile) | 矩阵 | Sapphire Rapids |
2.2 关键能力¶
- AVX-512: 16 × FP32, 32 × FP16, 64 × INT8 (per instruction)
- VNNI: INT8 dot product (类似 Tensor Core)
- AMX: 16 × 16 矩阵 tile, BF16/INT8
三 · AVX-512 编程¶
3.1 Intrinsics 示例¶
#include <immintrin.h>
// 16 路 FP32 加法
__m512 a = _mm512_load_ps(p1); // 加载 16 个 float
__m512 b = _mm512_load_ps(p2);
__m512 c = _mm512_add_ps(a, b);
_mm512_store_ps(out, c);
// 32 路 INT8 加法
__m512i ai = _mm512_load_si512(p1);
__m512i bi = _mm512_load_si512(p2);
__m512i ci = _mm512_add_epi8(ai, bi);
3.2 AVX-512 实战: 矩阵乘 (8x16)¶
void matmul_avx512(const float *A, const float *B, float *C, int M, int N, int K) {
for (int i = 0; i < M; i += 8) {
for (int j = 0; j < N; j += 16) {
__m512 c[8];
for (int ii = 0; ii < 8; ii++) c[ii] = _mm512_setzero_ps();
for (int k = 0; k < K; k++) {
__m512 b = _mm512_loadu_ps(&B[k * N + j]);
for (int ii = 0; ii < 8; ii++) {
__m512 a = _mm512_set1_ps(A[i * K + ii * K + k]);
c[ii] = _mm512_fmadd_ps(a, b, c[ii]); // FMA
}
}
for (int ii = 0; ii < 8; ii++)
_mm512_storeu_ps(&C[(i + ii) * N + j], c[ii]);
}
}
}
3.3 VNNI: INT8 dot product¶
// INT8 dot product (4 路 32 元素)
__m512i a = _mm512_load_si512(a_ptr); // 64 INT8
__m512i b = _mm512_load_si512(b_ptr); // 64 INT8
__m512i acc = _mm512_setzero_si512();
__m512i result = _mm512_dpbusd_epi32(acc, a, b); // 4 路 dot + add
四 · AMX (Advanced Matrix Extensions)¶
4.1 AMX 概览¶
AMX = Intel Sapphire Rapids+ 的矩阵扩展:
- 8 个 tile 寄存器 (每个 1KB)
- BF16 / INT8 矩阵乘
- 指令: tdpbf16ps / tdpbssd
4.2 AMX 编程¶
#include <immintrin.h>
void matmul_amx(int M, int N, int K, const __bf16 *A, const __bf16 *B, float *C) {
__tile1024i a_tile, b_tile, c_tile;
_tile_loadd(&c_tile, C, N * sizeof(float));
for (int k = 0; k < K; k += 16) {
_tile_loadd(&a_tile, A + k, K * sizeof(__bf16));
_tile_loadd(&b_tile, B + k, N * sizeof(__bf16));
_tile_dpbf16ps(&c_tile, a_tile, b_tile); // BF16 dot product
}
_tile_stored(&c_tile, C, N * sizeof(float));
}
4.3 AMX 性能¶
- Sapphire Rapids: 2.4 PFLOPS BF16 (per socket)
- Granite Rapids (2024): 提升 30%
- vs NVIDIA H100: 单 socket 略慢, 但功耗低
五 · LLM 推理中的 AVX/AMX¶
5.1 Intel OpenVINO¶
- 自动 AVX-512 / VNNI / AMX 优化
- INT4 / INT8 / FP16 量化
- Llama 2 7B INT4: Xeon 8480+ 单 socket 30+ tokens/s
5.2 llama.cpp + AVX¶
- llama.cpp: 跨平台 CPU 推理
- 自动检测 AVX2 / AVX-512 / AMX
- 7B 模型 Q4_K_M: 桌面 CPU 10-30 tokens/s
5.3 oneAPI / SYCL¶
- Intel 跨厂商异构编程
- CPU + GPU + FPGA 统一
- 与 CUDA 类似 API
六 · x86 vs ARM vs GPU 矩阵乘性能¶
| 平台 | FP16 TFLOPS | INT8 TOPS | 功耗 |
|---|---|---|---|
| NVIDIA H100 | 1979 | 3958 | 700W |
| Apple M5 | 60 (ANE) | 120 (ANE) | 25W |
| Intel Xeon w9-3595X | 60 (AMX BF16) | 120 (AMX INT8) | 350W |
| AMD EPYC 9654 | 50 (AVX-512) | 100 (VNNI) | 360W |
结论: 桌面端 M5 性价比最高, 服务器端 H100 绝对性能最高, AMD/Intel 在中间。
七 · 一句话总结¶
x86 AVX/AMX = 服务器 + 工作站 SIMD 主力。AVX-512 (16 FP32) + VNNI (INT8) + AMX (BF16 矩阵) 三件套, 让 CPU 也能高效跑 LLM。桌面端 ARM 崛起, 服务器端仍是 x86 + GPU。