循环展开

概念

循环展开(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 展开的主要收益来自减少循环开销,但不会突破延迟界限。要突破延迟界限,需要结合使用多个累积变量。

展开因子

展开因子越大,循环开销减少越多,但代码体积增大,可能引发指令缓存不命中。


相关笔记:

链接到