C66 代码优化基本介绍
C6000系列处理器的闪光之处就是它可以通过循环提高运行速度。这在以循环为中心的数字信号处理、图像处理和其他数学程序方面有着非常明显的优势。“软件流水”的技术对提高循环代码的性能做出的贡献最大。软件流水只有在使用-o2 或 -o3 编译选项时,才会被启用。
如下图示,如果不使用软件流水,循环就会在循环体 i 完成后再开始循环体 i+1。软件流水技术允许循环体出现重叠。因此,只要能够保持正确性,即可在循环体 i 完成之前开始循环体 i+1。在通常情况下,使用软件流水调度技术与不使用软件流水调度技术相比,使用时计算机资源利用率会高很多。
在软件流水循环中,即便一个循环体可能需要 s 个周期才能完成,但每隔 ii 个指令周期会启动一个新的循环。在一个高效的软件流水循环中,其中 ii<s,ii 被称为“启动间隔”;它是启动循环体 i 和启动循环体 i+1 之间的指令周期数。ii 等于软件流水循环体的指令周期数。s 是第一个循环体完成所需要的指令周期数,也是软件流水循环的“单个已调度的循环体”的长度。
如下图所示,即为进行了 software pipeline 和没有进行 software pipeline 软件流水的对比
所以我们进行循环优化的目的就是减少ii,进而降低整体循环执行时间。
我们使用建议的选项进行编译:-k-s -mw 。得到汇编文件和软件流水信息
假定有以下函数 BasicLoop() ...
- void BasicLoop(int *output, int *input1, int *input2, int n)
- {
- int i;
- for (i=0; i<n; i++)
- output = input1 + input2;
- }
复制代码
打开汇编文件并查看此循环的软件流水信息:
- ;* SOFTWARE PIPELINE INFORMATION
- ;*
- ;* Loop source line : 5
- ;* Loop opening brace source line : 5
- ;* Loop closing brace source line : 6
- ;* Known Minimum Trip Count : 1
- ;* Known Max Trip Count Factor : 1
- ;* Loop Carried Dependency Bound(^) : 7
- ;* Unpartitioned Resource Bound : 2
- ;* Partitioned Resource Bound(*) : 2
- ;* Resource Partition:
- ;* A-side B-side
- ;* .L units 0 0
- ;* .S units 0 1
- ;* .D units 2* 1
- ;* .M units 0 0
- ;* .X cross paths 1 0
- ;* .T address paths 2* 1
- ;* Long read paths 0 0
- ;* Long write paths 0 0
- ;* Logical ops (.LS) 0 0 (.L or .S unit)
- ;* Addition ops (.LSD) 1 0 (.L or .S or .D unit)
- ;* Bound(.L .S .LS) 0 1
- ;* Bound(.L .S .D .LS .LSD) 1 1
- ;*
- ;* Searching for software pipeline schedule at ...
- ;* ii = 7 Schedule found with 1 iterations in parallel
- ...
- ;* SINGLE SCHEDULED ITERATION
- ;*
- ;* C25:
- ;* 0 LDW .D1T1 *A4++,A3 ; |6| ^
- ;* || LDW .D2T2 *B4++,B5 ; |6| ^
- ;* 1 [ B0] BDEC .S2 C24,B0 ; |5|
- ;* 2 NOP 3
- ;* 5 ADD .L1X B5,A3,A3 ; |6| ^
- ;* 6 STW .D1T1 A3,*A5++ ; |6| ^
- ;* 7 ; BRANCHCC OCCURS {C25} ; |5|
- ;*----------------------------------------------------------------------------*
- L1: ; PD LOOP PROLOG
- ;** --------------------------------------------------------------------------*
- L2: ; PIPED LOOP KERNEL
- LDW .D1T1 *A4++,A3 ; |6| <0,0> ^
- || LDW .D2T2 *B4++,B5 ; |6| <0,0> ^
- [ B0] BDEC .S2 L2,B0 ; |5| <0,1>
- NOP 3
- ADD .L1X B5,A3,A3 ; |6| <0,5> ^
- STW .D1T1 A3,*A5++ ; |6| <0,6> ^
- ;** --------------------------------------------------------------------------*
- L3: ; PIPED LOOP EPILOG
- ;** --------------------------------------------------------------------------*
复制代码
软件流水循环信息包括循环开始的源代码行、对循环资源和延迟要求的描述以及循环是否已展开(还有其他信息)。使用 -mw 编译时,该信息还包含单个已调度循环体的副本。
|