ZHCUAU3J January 2018 – March 2024
在循环终止之前,循环会迭代一定的次数。迭代次数称为迭代计数。用于计算迭代次数的变量是迭代计数器。当迭代计数器达到等于迭代计数的限制时,循环终止。代码生成工具使用迭代计数来确定循环是否可以流水线化。软件流水线循环的结构只需执行最少数量的循环迭代(最小迭代计数)即可装填流水线。
软件流水线循环的最小迭代计数由并行执行的迭代数量设置。在图 4-1 中,最小迭代计数为 5。在以下示例中,A、B 和 C 是软件流水线中的指令,因此该单周期软件流水线循环的最小迭代计数为 3。
A | ||||
B | A | |||
C | B | A | ←三个并行迭代 = 最小迭代计数 | |
C | B | |||
C |
当代码生成工具无法确定循环的迭代计数时,默认情况下会生成两个循环和控制逻辑。第一个循环不是流水线循环,如果运行时迭代计数小于循环的最小安全迭代计数,则会执行该循环。第二个循环是软件流水线循环,如果运行时迭代计数大于或等于最小迭代计数,则会执行该循环。在任意给定时间,其中一个循环是冗余循环。例如:
foo(N) /* N is the iteration count */
{
for (I=0; I < N; I++) /* I is the iteration counter */
}
找到循环的软件流水线后,编译器会对 foo() 进行以下转换,并假定循环的最小迭代计数为 3。随后将生成两个版本的循环,并使用以下比较来确定应执行哪个版本:
foo(N)
{
if (N < 3)
{
for (I=0; I < N; I++) /* Unpipelined version */
}
else
}
for (I=0; I < N; I++) /* Pipelined version */
}
}
foo(50); /* Execute software pipelined loop */
foo(2); /* Execute loop (unpipelined)*/
可以使用 --program_level_compile --opt_level=3(请参阅节 4.4)或使用 MUST_ITERATE pragma(请参阅节 5.8.23)来帮助编译器避免产生冗余循环。