结束)。
1.2.3.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次(因为每两个周期只用了两个乘法),浪费了2个M单元。还有,两个周期内左边用了2个D单元,右边用了1个D单元,浪费了1个D单元。注意的是:D单元用来读取和存储数据,M单元用来进行乘法运算(对于62系列和64系列每个单元进行的运算不同,具体要看手册,例如64系列的cpu的M单元可以一次进行双16位x16位乘法运算)。
再看一个资源充分利用的情况下,仍然可以改善的情况。
第一个信息:
;* 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个周期。这三个周期使用了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 in parallel 第三个信息:
Loop Unroll Multiple : 2x
我们从第二个信息和第三个信息得知优化的速度达到了极限:经过软件流水的
循环执行每个循环体只有一个周期。我们可以看到每2个周期用了4个D单元(两次读取:LDW和两次存储:STH),每2个周期用了4个M单元(每个周期都有两次乘法运算)。
相关推荐: