首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C66 多核DSP 代码优化基本介绍

C66 多核DSP 代码优化基本介绍

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<i> = input1<i> + input2<i>;
    }</i></i></i>
复制代码
打开汇编文件并查看此循环的软件流水信息:

    ;*   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 编译时,该信息还包含单个已调度循环体的副本。C6000 Programmer's Guide(C6000 程序员指南)的第 4 章详细介绍了 -mw 注释块。尽管此信息不是最新的,但是在编写本文时它是可以获得的最好信息。
           启动间隔 (ii) 为 7。这意味着在稳定状态,每 7 个 CPU 周期计算出一次结果(相当于原始循环)。因此,基准 CPU 性能为 7 个指令周期/结果。
           通过分析该软件流水信息我们就可以找到影响ii大小的瓶颈所在此处为Loop Carried Dependency Bound(^) : 7,即循环体的相关性限制为7;
继承事业,薪火相传
返回列表