This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DSP反馈信息理解



;*----------------------------------------------------------------------------*
;* SOFTWARE PIPELINE INFORMATION
;*
;* Loop source line : 30
;* Loop opening brace source line : 31
;* Loop closing brace source line : 145
;* Known Minimum Trip Count : 1
;* Known Max Trip Count Factor : 1
;* Loop Carried Dependency Bound(^) : 39
;* Unpartitioned Resource Bound : 33
;* Partitioned Resource Bound(*) : 36
;* Resource Partition:
;* A-side B-side
;* .L units 12 12
;* .S units 21 22
;* .D units 13 5
;* .M units 20 20
;* .X cross paths 14 36*
;* .T address paths 9 9
;* Long read paths 0 0
;* Long write paths 0 0
;* Logical ops (.LS) 3 6 (.L or .S unit)
;* Addition ops (.LSD) 53 51 (.L or .S or .D unit)
;* Bound(.L .S .LS) 18 20
;* Bound(.L .S .D .LS .LSD) 34 32
;*
;* Searching for software pipeline schedule at ...
;* ii = 39 Did not find schedule
;* ii = 40 Did not find schedule
;* ii = 41 Did not find schedule
;* ii = 42 Did not find schedule
;* ii = 43 Did not find schedule
;* ii = 45 Did not find schedule
;* ii = 47 Did not find schedule
;* ii = 50 Did not find schedule
;* ii = 53 Schedule found with 1 iterations in parallel
;*
;* Register Usage Table:
;* +-----------------------------------------------------------------+
;* |AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB|
;* |00000000001111111111222222222233|00000000001111111111222222222233|
;* |01234567890123456789012345678901|01234567890123456789012345678901|
;* |--------------------------------+--------------------------------|
;* 0: | ***** ************ | * ** ********* |
;* 1: | ***** ************ | * ** ********* |
;* 2: | ***** ************ | * ** ********* |
;* 3: | ***** ************ | * ** ********* |
;* 4: | ***** ************ | * ** ********* |
;* 5: | * ***** ************ | * *** ********* |
;* 6: | * ***** ************ | * **** ********* |
;* 7: | ******* ************ | * **** * ********* |
;* 8: | ******* ************ *| * ****** ********* |
;* 9: | ** ***** ************ *| * *** ** ********* * |
;* 10: | ******** ************ *| * ****** ********* * |
;* 11: | ******** * ************ *| * *** ** *********** |
;* 12: | ******** ****************| * *** ** ************ |
;* 13: |**** ****** * **************| * ****** *********** * |
;* 14: |** ******** * **************| * ** *** ************ * |
;* 15: |** ******** ****************| * ****** ************ * |
;* 16: |** ******** ****************| * ****** ************** |
;* 17: |**** ****** *************** | * ****** ********** *** |
;* 18: |* ******** ************** | * **** * ********** *** |
;* 19: |* ******** * ************* | * **** * ************* |
;* 20: |********** * **************| * ****** ************ |
;* 21: |*********** ****************| * ****** ************* |
;* 22: |*********** ***************| * ****** ************* |
;* 23: | * ******* ****************| * ****** ************** |
;* 24: | ********* ****************| * ****** ************* |
;* 25: | ********** ****************| * ****** ********** ** |
;* 26: |*********** ****************| * ***** ********** ** |
;* 27: |* ********** ****************| * *** ** ************** |
;* 28: |************** ****************| * **** * ************** |
;* 29: |* ************ ****************|* * ****** *************** |
;* 30: |* ************ ****************|* * ****** ************ * |
;* 31: |************** ****************| * **** * ********** * * |
;* 32: |************** ***************| * ****** ********** * * |
;* 33: |* ** ******* * ***************| * ****** *********** * * |
;* 34: | ********** * ****************| * ****** ********** * |
;* 35: |************ * ****************| * *** ** *********** |
;* 36: |* ******** * * *************** | ** ****** ************ |
;* 37: |* ******* * * ****************|*** ****** ************ |
;* 38: | ******* * ****************| ** ****** *********** |
;* 39: | * ******* * ****************| * ****** ************ |
;* 40: | * ******* ***************|* * ****** *********** |
;* 41: | ** ****** ***************|* * ****** ********** |
;* 42: | ********* *************** |* * ****** ************ |
;* 43: |********** *************** |* * **** * ********** |
;* 44: | ********* *************** |*** **** * *********** |
;* 45: | ********* * ************* | ** ****** *********** |
;* 46: | ******** * ************ | * ****** ************ |
;* 47: | ***** ************ | * ****** ********** |
;* 48: | * ***** ************ | * ***** ********* |
;* 49: | * ***** ************* | * *** ********* |
;* 50: | ******* ************** | * **** ********* |
;* 51: | ******* ************ | * **** ********* |
;* 52: | ******* ************ | * ** ********* |
;* +-----------------------------------------------------------------+
;*
;* Done
;*
;* Collapsed epilog stages : 0
;* Collapsed prolog stages : 0
;*
;* Minimum safe trip count : 1
;*
;*
;* Mem bank conflicts/iter(est.) : { min 0.000, est 0.375, max 3.000 }
;* Mem bank perf. penalty (est.) : 0.7%
;*
;* Effective ii : { min 53.00, est 53.38, max 56.00 }
;*
;*
;* Total cycles (est.) : 0 + trip_cnt * 53
;*----------------------------------------------------------------------------*

问题1:
ii = 53 Schedule found with 1 iterations in parallel
据我所知,ii=53是启动间隔,但是1 iterations这个就不知道什么意思了?而且这两个参数
与循环的次数之间的关系是什么?

问题2:
Total cycles (est.) : 0 + trip_cnt * 53
这里的cycle 是实际耗时么?就是用CLK_getltime测试出来的时间么?另外,trip_cnt是循环
次数?

问题3:

从上面反馈给出的信息看,代码还有哪些优化空间?

谢谢!

  • 你好,

    1.  ii 指的是你的循环核流水的最小迭代周期,i指的是迭代次数。

    2. cycle指的是指令理论运行需要消耗的时间,而CLK_getltime测试出来的时间及包括也指令理论运行时间也包含了指令阻塞以及数据等待还有cache不命中的时间,可以使用CLK_gethtime来获取更高精度的时间。

    3.根据下面的信息:

    ;* A-side B-side
    ;* .L units 12 12
    ;* .S units 21 22
    ;* .D units 13 5
    ;* .M units 20 20
    ;* .X cross paths 14 36*

       你的AB交叉通道使用过多,尤其是B侧的单元,另外你的S以为单元和M乘法单元也使用过多,可以考虑将一些移位和乘法运算使用加法来替代。另外你的源码是.C 还是线性汇编?如果是c源码且该循环核调用次数会很多,建议直接写线性汇编或并行汇编。

  • thx,Louis:

          为什么TI的编译器不在反馈信息的最后,给出一个结论,来表示当前的代码的cycle时钟数,

    离最好性能代码的cycle时钟数差距有多少?

         既然,DSP编译器的反馈信息中,给出了各种资源分配,寄存器分配还有相关限分配等。

    为什么不在最后给一个总结呢?给优化一个指导呢?比如给出一个比率R或者百分比。

    R = 当前代码Cycles/ 最好性能代码Cycles    (不考虑DMA cache等)

    这样,就知道,还有多少优化空间呢?上面那些信息,告诉我还有多少优化空间了么?

  • ;* Loop source line : 30
    ;* Loop opening brace source line : 31
    ;* Loop closing brace source line : 145
    ;* Known Minimum Trip Count : 1
    ;* Known Max Trip Count Factor : 1
    ;* Loop Carried Dependency Bound(^) : 39
    ;* Unpartitioned Resource Bound : 33
    ;* Partitioned Resource Bound(*) : 36

    从信息上看,有下面几点需要关注:

    1. 你的循环最小次数是1,这个循环次数是否有特定的范围?如有,可以考虑在循环前面加入#pragma MUST_ITERATE来将你的信息告诉编译器,提高优化效率。

    2. 你的循环行数只有30行,而你的ii值却有53,虽然不清楚你里面具体进行的是什么算法,但是这个并行度明显偏低,还是有优化的空间,你这个里面乘法单元使用过多,而一个乘法需要等待4 cycle才能生效,可以考虑使用移位运算或者将需要计算的数值先pack再使用_MPY2等效率较高的指令进行计算。

    3. 如果这个循环调用次数较少,也没有必要优化,如果是调用次数较多,则考虑优化。

  • 谢谢! 非常感谢!

  • 大师您好!

            方便留QQ 号码给我。我是江西省利思比实业有限公司法人.现公司重点发展战略网络摄像,想与你共同合作开发网络摄像,有兴趣共论发展或帮助我实现目标。我非常感谢。目前网络摄机用量非常大,利润可观。我创业非常想得到你的帮助,内心想得到你的帮助。实现安防行业的发展。为安防行业做贡献。谢谢你看此文件。             联系人:叶晶晶   TEL:13870944722

  • 你好!

       TI拥有成熟的网络摄像机解决方案,以及第三方参考设计,涵盖720P/1080P以及智能算法。如需合作,请联系当地的代理商或者TI sales。

  • 请问Louis:

    ;* .X cross paths 14 36*

    如何降低这个交叉通道?让AB两边平衡? B端太大了36。

  • Louis 说:

    你好,

    1.  ii 指的是你的循环核流水的最小迭代周期,i指的是迭代次数。

    2. cycle指的是指令理论运行需要消耗的时间,而CLK_getltime测试出来的时间及包括也指令理论运行时间也包含了指令阻塞以及数据等待还有cache不命中的时间,可以使用CLK_gethtime来获取更高精度的时间。

    3.根据下面的信息:

    ;* A-side B-side
    ;* .L units 12 12
    ;* .S units 21 22
    ;* .D units 13 5
    ;* .M units 20 20
    ;* .X cross paths 14 36*

       你的AB交叉通道使用过多,尤其是B侧的单元,

    请问Louis:

    ;* .X cross paths 14 36*

    如何降低这个交叉通道?让AB两边平衡? B端太大了36。

  • 你写的是C代码还是线性汇编.sa的?如果c代码,调起来会很麻烦,建议直接写线性汇编,这样能更好更深入的理解DSP优化。

  • Louis 说:

    你写的是C代码还是线性汇编.sa的?如果c代码,调起来会很麻烦,建议直接写线性汇编,这样能更好更深入的理解DSP优化。

    我现在写的还是C代码,你的意思是C代码不好调整吧。

    但是如果写成线性汇编代码的话,循环中调用线性汇编,不会不能生成流水吧,如果调用函数的话

    ,编译器会不让生成流水了.

  • 你可以将该循环单独用线性汇编写一个函数,这样在调用处不会优化,而用线性汇编写的函数,就可以通过编译器优化。

  • Louis 说:

    你可以将该循环单独用线性汇编写一个函数,这样在调用处不会优化,而用线性汇编写的函数,就可以通过编译器优化。

    什么叫调用处不会优化?

    因为我的代码是双层循环,因为现在只能在最内层循环里面产生流水。我现在的瓶颈是X交叉通道

    分配不均衡,我如果要调整不均衡那么就要写线性汇编,但是以我的经验,如果在循环中调用

    函数,编译器一般会被认为不能流水的。这是我担心的。如下所示:

    for(i=0;i<100;i++)

    {

          func();  //线性汇编

    }

  • 你的外部循环固定100次, 其实可以考虑将内外循环调换一下。

  • Louis 说:

    你的外部循环固定100次, 其实可以考虑将内外循环调换一下。

    不可以的,没那么简单的,我的循环次数是外面传进来的。我这里只是为了让你

    好理解才写成固定100的。我尝试了一下,如果func写成线性汇编,调用的话,编译器

    就会反馈说“loop contains calls”  您怎么看?

  • Louis:

    Louis 说:

    1.  ii 指的是你的循环核流水的最小迭代周期,i指的是迭代次数。

    关于II,我还听说一种说法是,II叫启动间隔,指的是不同次迭代之间的时间间隔。而你这里

    所说的是最小迭代周期,不知道究竟是哪一种说法?

    Louis,我问你这话的意思是,其实是想知道这两个参数,II和I的本质含义,而不是字面

    的解释,我想知道这两个参数对于软件流水意味着什么?因为,我在测试中发现,II越小,

    I越大,那么耗时就越少。性能就越好。反之,耗时就比较多。但是,究竟深层次的原理

    我还说不清楚。为什么会这样?

    Louis 说:

    2. cycle指的是指令理论运行需要消耗的时间,而CLK_getltime测试出来的时间及包括也指令理论运行时间也包含了指令阻塞以及数据等待还有cache不命中的时间,可以使用CLK_gethtime来获取更高精度的时间。

    我想问你的问题是,

    编译器反馈信息中的Total Cycles  给出的值,是不是能代表函数除了数据存取的

    时间消耗以外,主要是指令执行消耗时间?Cycle / 时钟频率 (DM648 900mhz)就

    可以计算出具体多少ms?而其中的tricp_cnt就是循环loop的循环次数?