循环展开
概念
循环展开(Loop Unrolling)通过减少循环迭代次数来降低循环控制开销(条件测试、分支、计数器更新)。
2×1 展开
每次循环处理 2 个元素:
void combine_unroll(vec_ptr v, data_t *dest) {
long length = vec_length(v);
long limit = length - 1;
data_t *data = get_vec_start(v);
data_t acc = IDENT;
long i;
for (i = 0; i < limit; i += 2) {
acc = acc OP data[i] OP data[i+1];
}
for (; i < length; i++)
acc = acc OP data[i];
*dest = acc;
}效果
- 减少循环控制操作(减少约 50% 的条件分支和自增操作)
- 但不改变关键路径——数据依赖链仍然存在
- 仍然受约束
局限性
2×1 展开的主要收益来自减少循环开销,但不会突破延迟界限。要突破延迟界限,需要结合使用多个累积变量。
展开因子
展开因子越大,循环开销减少越多,但代码体积增大,可能引发指令缓存不命中。
相关笔记:
链接到
- 上一个知识点:5.12 延迟界限与吞吐量界限
- 下一个知识点:5.14 并行累积