ZHCU881D May 2020 – May 2024
如果折叠 或合并 嵌套循环合法而且可提高性能,那么编译器会尝试这么做。嵌套循环 是两个循环的集合,其中一个循环位于另一个封闭循环的内部。折叠和合并都涉及到将嵌套循环转换为单个循环。当外循环中没有代码时,就会发生折叠。当外循环中有代码时,就会发生合并。
两个嵌套循环组合成一个循环之后,必须转换外循环主体中的代码,从而仅在必要时有条件地执行该代码。折叠和合并都有利于性能,因为在执行循环嵌套时只执行一次 pipe-up (加速)和pipe-down(减速),若不执行循环合并/折叠,则每次执行外循环时都要执行内循环的pipe-up (加速)和 pipe-down(减速)。
要执行循环折叠或循环合并,合成的循环必须能够进行软件流水线作业。这意味着循环嵌套不能包含函数调用。每个循环必须有一个带符号的计数迭代器,每次迭代固定的次数。也就是说,内循环的迭代次数不能取决于外循环迭代的情况。此外,外循环不能包含太多代码,否则转换无法提高性能。如果外循环具有存储器依赖性,则可能不会执行循环合并和循环折叠。
当发生循环折叠或循环合并时,软件流水线循环会在软件信息注释块的顶部附近指示起始循环源代码行(“Loop source line
”)。当此源代码行号引用一个外循环时,这表示内循环已经完全展开,或者编译器已经执行循环合并或折叠。在循环合并的情况下,编译器使用特殊指令,例如 NLCINIT、TICK、GETP 和 BNL。这些硬件特性的说明(包括所谓的“NLC”)不在本文档的范围内。有关 NLC 的更多详细信息,可参阅 C71x DSP CPU、指令集和矩阵乘法加速器技术参考手册 (SPRUIP0)。