4.7.循环展开

循环展开是一种提高性能的技术。小循环被展开,使得循环的迭代在循环体中被复制一定的次数。重复迭代的次数被称为展开因子。

4.7.1.优势

  • 减少分支开销这对于小循环尤其重要。例如,列表 4.10 中的循环展开了 4 倍。从列表 4.11 中可以明显看出,分支开销减少了 4 倍(一个 BANZ 完成 4 次迭代,未展开时为 1 次)。

支持 FPU 的 C28x CPU 还有其他优势:

  • 为小循环生成 RPTB - 循环展开增加了循环体中的指令数量,并使编译器能够满足 RPTB 指令的最小块大小要求。
  • 改进了浮点性能 - 循环展开可以为编译器提供更多指令来调度展开的迭代,从而提高性能。这减少了生成的 NOP 的数量,还为编译器提供了更大的机会来生成并行指令。

注释

循环展开将使代码大小增加,因为编译器会复制循环体。#pragmaUNROLL(1) 可用于防止编译器展开循环。

4.7.2.执行展开

可以通过两种方式执行循环展开:

  1. 编译器可以自动展开循环。列表 4.12 是一个由编译器展开 4 次的循环示例。
  2. UNROLL pragma 可用于向编译器指示循环是展开的候选对象。 有关详细信息,请参阅展开