第16章 · SIMD 与 GPU 编程 · 阶段测试题答案¶
一 · 单选 (8 题)¶
1.1 B - SIMD 单指令多数据, AVX-512 是 512-bit SIMD。
1.2 A - Memory Coalescing: 连续线程访问连续内存。
1.3 C - Tensor Core 用于矩阵乘。
1.4 B - Triton 是 OpenAI 的 Pythonic GPU 语言。
1.5 A - SM = Streaming Multiprocessor, GPU 核心单元。
1.6 C - TPU 是 Google 自研 AI 芯片。
1.7 B - HBM 高带宽内存是 GPU 标配。
1.8 A - ARM + NEON 是移动主流。
二 · 多选 (4 题)¶
2.1 ACD - 都是 x86 SIMD。
2.2 ABD - 都是 GPU 编程框架。
2.3 ABD - 都是内存优化技术。
2.4 ABC - 都是 GPU 厂商。
三 · 简答 (5 题)¶
3.1 SIMD vs SIMT¶
SIMD: 单指令多数据, 1 个指令操作多个数据 (CPU AVX) SIMT: 单指令多线程, 32 个线程 (warp) 同步执行 (GPU)
3.2 Memory Coalescing¶
核心: 连续线程访问连续内存 → 1 次 transaction
3.3 Shared Memory Bank Conflict¶
Shared memory 分 32 bank
- 同 bank 不同地址 → conflict (串行)
- 不同 bank → 并行
例子: sm[tid][0] for tid 0..31 → 全 bank 0 → 31 个 conflict
解决: padding / 重新布局
3.4 Tensor Core 加速¶
矩阵乘硬件加速:
- A100 TF32: 156 TFLOPS
- H100 FP8: 3.3 PFLOPS
API: mma.sync / WMMA / CUTLASS
3.5 Triton vs CUDA¶
| 维度 | Triton | CUDA |
|---|---|---|
| 语言 | Python | C++ |
| 学习 | 低 | 高 |
| 性能 | 80-95% SOTA | 100% |
| 适用 | 算子 | 极致优化 |
四 · 编程 (2 题)¶
4.1 AVX-512 向量加法¶
#include <immintrin.h>
void vec_add_avx512(const float *a, const float *b, float *c, int n) {
for (int i = 0; i < n; i += 16) {
__m512 va = _mm512_loadu_ps(a + i);
__m512 vb = _mm512_loadu_ps(b + i);
_mm512_storeu_ps(c + i, _mm512_add_ps(va, vb));
}
}
4.2 Triton Softmax¶
import triton
import triton.language as tl
@triton.jit
def softmax_kernel(out_ptr, in_ptr, n_cols, BLOCK: tl.constexpr):
row = tl.program_id(0)
offsets = tl.arange(0, BLOCK)
mask = offsets < n_cols
x = tl.load(in_ptr + row * n_cols + offsets, mask=mask, other=-float('inf'))
x = x - tl.max(x, axis=0)
e = tl.exp(x)
tl.store(out_ptr + row * n_cols + offsets, e / tl.sum(e, axis=0), mask=mask)