并行累积
概念
并行累积使用多个独立的累积变量来打破单条关键路径的限制,充分利用处理器的能力。
2×2 展开
2 路展开 × 2 路并行 = 2×2 展开:
data_t acc0 = IDENT, acc1 = IDENT;
for (i = 0; i < limit; i += 2) {
acc0 = acc0 OP data[i];
acc1 = acc1 OP data[i+1];
}
// 合并 acc0 和 acc1性能突破
- 2×2 展开有两条独立的关键路径
- 每条路径长度是原来的 1/2
- 理论上 CPE 可降低 50%
- 配合 进一步提升
L×K 展开
L×K 展开 = L 路循环展开 + K 路并行累积:
- K 个累积变量打破延迟界限
- 展开因子 L 提升空间局部性、减少循环开销
- 理想情况下的 CPE → 吞吐量界限
注意事项
- 需要足够多的寄存器来存放累积变量
- 寄存器溢出会降低性能
- 展开因子需平衡代码膨胀