ZHCU881D May 2020 – May 2024
当编译器知道循环将执行多少次时,通常可以生成更快的代码。通过 MUST_ITERATE 和 PROB_ITERATE pragma以及 TI_must_iterate 和 TI_prob_iterate C++ 属性添加此信息可帮助编译器:
在对循环进行矢量化之前,编译器试图确定这种改变是否会提高性能。如果编译器掌握关于循环迭代计数的信息,那么有助于编译器更好地预测矢量化的获利。同样,编译器还试图确定某些循环优化和循环嵌套优化是否有益,因此关于循环迭代计数的信息对编译器很有帮助。
冗余循环:在某些情况下,如果编译器不知道循环将执行多少次,那么编译器会生成两个不同版本的循环。软件流水线循环通常必须执行一定的最少迭代次数才能合法执行。如果循环迭代计数小于此最小安全迭代计数,那么编译器会生成运行时迭代计数检查,以及软件流水线版本的循环或重复循环 的分支。也就是说,编译器生成了“常规”版本的循环(执行速度慢很多)。
最小安全迭代计数取决于并行调度的迭代次数,以及编译器能够执行阶段折叠 优化的效率。有关更多 信息,请参阅节 5.2.6。
汇编文件注释块中的软件流水线信息指定循环的最小安全迭代计数(迭代计数),并说明编译器是否生成了重复循环。
因为编译器有时必须生成冗余循环和在两个循环之间选择所必需的控制代码,所以在已知循环的最小迭代计数时,使用 MUST_ITERATE pragma 告知编译器是有帮助的,因为冗余循环可能不是必需的。这样可以提高性能,特别是当循环封闭在外循环中而且编译器可以对外循环和内循环执行循环折叠或其他循环优化的时候。
下述示例显示了汇编注释块的软件流水线信息部分中的冗余循环生成信息。
;* Redundant loop generated
;* Collapsed epilog stages : 5
;* Prolog not removed
;* Collapsed prolog stages : 0