跳转至

第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

线程 0-31 访问 addr[0..127] → 1 个 128B 事务 ✓
线程 0-31 访问 addr[0, 32, 64, ...] → 32 个事务 ✗

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)