跳转至

第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。