# 1. SIMD 的工作原理,单指令多数据如何在寄存器宽度内并行计算? A 多条指令同时执行 B 多个核并行 C 多个线程并行 D 一条指令对寄存器内多个数据 lane 同时执行同一运算 ✓ 正确答案
# 2. AoS(Array of Structs)与 SoA(Struct of Arrays)两种数据布局对 SIMD 向量化的影响,为什么 SoA 更易被编译器向量化? A SoA 使同一字段元素连续存放,可直接向量加载,AoS 需 gather 重组 ✓ 正确答案 B SoA 占用更少内存 C SoA 结构更小 D AoS 更连续
# 5. 解释 ARM SVE(Scalable Vector Extension)与 NEON 的核心差异,可伸缩性体现在哪? A SVE 向量长度可伸缩(由硬件 VL 决定),NEON 固定 128 位 ✓ 正确答案 B NEON 支持谓词 C NEON 更宽 D 两者相同
# 9. 解释为何 x86 从 SSE 升级到 AVX 而非直接上 AVX-512? A 无法实现 512 位 B 512 位更快 C 兼容性、功耗/降频与产品定位的权衡,AVX 与 SSE 兼容、普及广 ✓ 正确答案 D 编译器不支持
# 10. 解释为何编译器自动向量化(如 -O3 -ftree-vectorize)经常失败? A 循环太短 B 编译器 bug C 数据依赖、指针别名(无法证明无重叠)、控制流复杂等 ✓ 正确答案 D 内存不足
# 11. 解释 ARM SME(Scalable Matrix Extension)与 SVE 的层级差异? A SME 无寄存器 B SME 更慢 C 两者相同 D SME 是二维矩阵扩展(可伸缩 ZA 寄存器),SVE 是一维向量 ✓ 正确答案
# 12. 解释 SIMD intrinsics 编程模型与汇编指令的关系? A 完全无关 B 每个 intrinsic 通常映射到对应的 SIMD 汇编指令,代码由编译器生成汇编 ✓ 正确答案 C intrinsics 是解释型 D intrinsics 无法编译
# 13. SSE/AVX/NEON 的指令集演进,寄存器宽度(128/256/512)与 AVX-512 的降频问题如何? A 寄存器太少 B 512 位执行单元功耗大,长时间高负载可能触发降频 ✓ 正确答案 C 无法编译 D 指令太少
# 14. SVE/RVV 的可变向量长度,为何适合 ARM/RISC-V 的异构核心? A 长度无关无法运行 B 固定宽度更高效 C 让代码长度无关,一份代码在不同宽度的核上按各自宽度运行 ✓ 正确答案 D 只适合单核
# 15. 对齐加载 movaps 与未对齐 movups 的性能差异何时显著,__builtin_assume_aligned 如何帮助编译器生成对齐访存? A 强制对齐数据 B 告诉编译器指针已对齐,使其生成对齐访存指令(如 movaps) ✓ 正确答案 C 关闭对齐 D 检查对齐
# 16. 横向归约(horizontal reduction),为什么 SSE 求 4 个 float 之和需要 shuffle+add 多步,相对标量求和的开销有多大? A SSE 没有纵向加法 B 编译器不支持 C 寄存器太小 D 横向归约需把不同 lane 相加,需 shuffle 重排 lane 后逐步 add ✓ 正确答案
# 17. 解释 RISC-V Vector Extension(RVV)vlen 与 vtype 寄存器? A 向量最大长度 B 缓存 C 分支预测 D SEW(元素宽度)、LMUL(向量长度倍数)等执行参数 ✓ 正确答案
# 18. SIMD 在代码中的应用,编译器自动向量化 vs 手写 intrinsics 如何选择? A 自动向量化总是更好 B 手写 intrinsics 总是更好 C 两者不可用 D 优先自动向量化,对热点/失败处用手写 intrinsics 补充 ✓ 正确答案
# 19. 图像处理中的饱和运算,paddusb(无符号饱和加)相比普通加法再 clamp 的优势是什么,溢出行为有何不同? A 更快但结果错误 B 无法向量化 C 结果环绕 D 单条指令完成饱和加,无分支、可向量化;溢出时钳制而非环绕 ✓ 正确答案