Appearance
底层 / SIMD / 硬件视角(Low-level)专题
HPC/AI Infra 最“硬核”的一块:SIMD 向量化、cache/storage、CPU 流水线、NUMA、硬件内存序。这些能把“会用”的候选人筛出去。
问题清单(含答案)
1. SIMD 是什么 / SSE/AVX 指令族?为什么加速?
答案
单指令多数据,一条指令同时算多个元素。SSE 128 位(4×float)、AVX 256 位(8×float)、AVX-512 512 位。详见 simd.md。
2. 自动向量化 vs intrinsic vs 手写?
答案
自动向量化写简单循环让编译器识别(省事、先试);intrinsic 用 _mm* 内置函数精确控制(不够再用);手写汇编只在极端/特殊指令时。一般自动 → 不够再 intrinsic。
3. SGEMM/点积怎么向量化 + FMA + 展开?
答案
向量化一次算多个乘加,用 FMA(乘加融合)减少指令数,循环展开隐藏访存延迟、提升 ILP。详见 simd.md。
4. 硬件内存序:为什么 release/acquire 够用?
答案
CPU 有 store buffer 和 invalidate queue 导致可见乱序;release/acquire 通过必要的屏障只限制需要的顺序(成对建立 happens-before),比 seq_cst 全序省开销。见 atomic-memoryorder.md。
5. NUMA / cache-coherent 多核:跨 NUMA 代价 / 亲和性?
答案
多 socket 各带本地内存,跨 NUMA 访问延迟高。本地分配 + 绑核(pinning)保持亲和性。详见 numa-coherence.md。
6. CPU 流水线:分支预测、乱序、ILP、依赖链?
答案
分支预测错误代价大(冲刷流水线);乱序执行靠 ILP 并行执行不相关指令;依赖链限制 ILP。代码上减少分支、打破依赖链。详见 cpu-hardware.md。
7. RDTSC / steady_clock 测时精度与陷阱?
答案
RDTSC 读时间戳计数器、极快但可能漂移/跨核不准;steady_clock 单调、适合测时间间隔。详见 measure-timing.md。
8. 什么时候超线程能帮?
答案
一个线程访存停顿时另一线程可执行,利于隐藏访存延迟;但两线程会争执行单元,纯计算密集时反而受限。
9. 内联 asm 何时必要?
答案
需要编译器无法生成的指令时(cpuid、特殊 SIMD、原子定序、系统调用等)才用。
10. 现代 CPU uarch 差异对 code 的影响?
答案
不同厂商/代际的乱序深度、SIMD 宽度、缓存大小、分支预测能力不同,影响优化策略(说常见差异即可,不必背死型号)。
子文档
| 文件 | 内容 |
|---|---|
index.md | 本总览 |
simd.md | SIMD/向量化/intrinsic |
cpu-hardware.md | 乱序/分支/依赖链/ILP/超线程 |
numa-coherence.md | 缓存一致性、NUMA、亲和性 |
measure-timing.md | 测时、RDTSC、clock 精度 |