1. 查看编译器生成的汇编文件
(1)内存依赖路径
在asm文件中搜索“SOFTWARE PILELINE INFORMATION”,然后再看“Loop Carried Dependency Bound()”,后面的值,如果很大的话,那就是有依赖路径,就在被调用函数的参数列表的指针前面加上限制词:restrict,如:void lesson1_c(short * restrict xptr,short *restrictyptr,short *zptr,short *w_sum,int N).
(2)观察每次循环执行的时间
首先搜索“SOFTWARE PILELINE INFORMATION”,再搜索“Searching for software pipeline schedule at…”,如果ii =3 Schedule found with 5 iterations inparallel, 再搜索“Loop Unroll multiple”,如果后面的参数为2X, 就说明循环被展开了一倍,而且在软件被流水之后有5个循环体同时进入软件流水。这里说明有两个循环体被同时执行。2个循环体需要3个时钟周期,即软件流水之后每个每个循环体执行需要1.5个周期。
再看一个例子:
Loop Unrol Multiple
Ii=2 Schedule found with 6 iterations in parallel
说明每个循环体执行需要2个周期,即经过软件流水之后的每个循环体执行需要1个周期。l
(3) 观察资源平衡决定是否展开循环
搜索“Resource Partition:”,看看L,S,D,M共8个单元使用是否平衡,即是否在每个时钟周期内充分使用了资源。
先看一个资源使用不充分的例子:
第一个信息(最关键的D单元和M单元):
Resource Partition A-side B-side
.L units 0 0
.S units 1 1
.D units 2* 1
.M units 1 1
这个信息和下面这两个信息一起分析。
第二个信息:
ii =2 Schedule found with 6 iterations in parallel
第三个信息:没有循环展开。
结合这三个信息发现,循环体没有展开。每个循环体执行需要2个周期。结合第一个信息知道,M单元两个周期只用了2次(因为每个周期i只用了来年改革乘法器),浪费了2个M单元。还有,两个周期内左边用了2个D单元,右边用了 1个D单元,浪费了1个 D单元。
再看一个资源充分利用的情况下,仍然可以改善的情况。
第一个信息:
Resource Partition A-side B-side
.L units 0 0
.S units 2 1
.D units 3* 3*
.M units 2 2
第二个信息:
Ii=3 Schedule found with 5 iterations in parallel
第三个信息:
Loop Unroll Multiple : 2x
说明循环展开一次,每两个周期需要3个周期。这3个周期使用了6个D单元,使用了4个M单元,说明每3个周期都有4次乘法运算。
当D单元充分使用的情况下,我们在看看带宽使用,如果使用了LDH读取数据,就改成LDW读取数据。
我们再看看速度达到极限的情况下,资源的利用情况。
第一个信息:
Resource Partition A-side B-side
.L units 0 0
.S units 2* 1
.D units 2* 2*
.M units 2* 2*
第二个信息:
Ii = 2 Schedule found with 6 iterations inparallel
第三个信息:
Loop Unroll Multiple : 2x
从第二个信息和第三个信息得知优化的速度达到了极限:经过软件流水的循环执行每个循环体只有一个周期。