1336|0

6593

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

TI C6000 导致软件流水编排失败的因素 [复制链接]

在CCS开发环境中,开启-O2/-O3优化选项,编译器将自动为合适的代码进行软件流水编排,因此编程者需要注意的是使设计的循环体符合软件流水编排的条件。



下列一些因素将可能引起软件流水编排失败:

汇编语句嵌入到C/C++代码中

出现复杂的流控制语句如goto、break等

循环中包含一个调用(内嵌函数除外)

需进行软件流水编排的指令太多

没有初始化循环计数器

循环变量在循环过程中被修改

软件流水被关闭:没有使用-O2或-O3选项;使用了-ms2或-ms3选项;使用-mu关闭了软件流水





理解编译器反馈信息
1. 编译器优化循环的几个步骤

循环的运算性能主要取决于编译器能否编排出恰当的软件流水,编译器优化一个循环的过程大致分为三个步骤:



获取循环次数信息。这些信息能帮助编译器判断是否要对循环做自动展开等操作。有时编译器无法从代码中获得完整的这些信息,编译器将会对循环采取保守的优化策略。因此,若要获得最佳的优化性能,编程者应尽可能地提供这些信息给编译器,可通过 MUST_ITERATE 、UNROLL 等 pragma语句。

几个关键参数如下:

最小可能循环次数(Minimum Trip Count)

最大可能循环次数(Maximum Trip Count)

循环倍数系数(Max Trip Count Factor)



收集循环资源和相关图信息。CPU完成一次循环迭代所需的cycle数称为迭代间隔(iteration interval,ii),编译器的优化目标就是最小化ii。

几个关键参数如下:

循环执行相关限(Loop Carried Dependency Bound),指循环体中最大的一条依赖路径的距离,而所谓依赖是指当前指令的开始依赖于前面指令的结束。

以下面一段代码为例:

void simple_sum(short *sum, short *in1, unsigned int N)

{

int i;

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

{

sum[i] = in1[i] + 1;

}

}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表