loop tiling、loop unrolling、vectorization在编译器优化中的作用解释loop tiling、loop unrolling、vectorization在编译器优化中的作用
Tiling 把大循环 按块划分:外层遍历「块」,内层遍历「块内」。例如 for i in 0..N 变成「for bi 遍历块,for i 遍历块内」。作用:提高局部性——块内数据可放进 cache 或 register,重复使用后再换下一块,减少主存/全局内存访问;同时便于 并行(不同块可不同 thread/block)。在矩阵乘、卷积等里 tiling 是基础优化,对应 CUTLASS/TVM 的 threadblock tile、warp tile。
Unrolling 把循环体 复制多份,减少循环判断与分支、增加指令级并行与寄存器复用。例如 for (i=0;i<4;i++) a[i]=... 展开成 4 条赋值。编译器可自动做(#pragma unroll 或 -O3),也可手写。注意:展开过多会 代码膨胀、register 压力大;要结合 tiling 与后端限制(如 GPU 每 block register 数)权衡展开因子。
向量化 让一条指令处理 多个数据(SIMD):用向量 load/store、向量运算代替标量循环。例如标量 for i: c[i]=a[i]+b[i] 变成向量 c[0:4]=a[0:4]+b[0:4]。作用:提高吞吐、更好利用 带宽与算力。在 CPU 上对应 SSE/AVX/NEON;在 GPU 上对应 warp 内线程协作、或 tensor core。编译器通过 循环向量化 pass 或显式向量类型实现;需 连续/对齐访问、无循环依赖等条件。
| 返回模块 | 返回总览 |