DSP 图像处理算法的实现-III(3)
这里列举三个方法:
1) 联合 Union
,把要访问的 16 位 short 类型定为 union 位类型定义为类型, 方法如下
Typedef union {
Short a[4]; Int w[2]; } data_union; Data_union x={1,2,3,4}; Short y;
Int z; Y=x.s[2];//访问十六位数
据 Z=x.w[1];//访问三十二位数据
2) 强制类型转换
Short x[4]={1,2,3,4}; Short y,*xp=x; Int z; Y=*xp; Z=*(int*)xp;
//访问 16 位数据 //访问 32 位数据
3)把数据直接定义为 32 位字
Int x[2]={0x0002000};
Int z*xp=x;
下面具体举例说明字处理与内联函数结合在一起的应用
short DP(short *m, short *n, short count)
{
short i ; int pro_h, pro_l ; int sum_h = 0 ; int sum_l = 0 ; int sum = 0 ;
int *data_a = ( int *) m ;/这里用来实现强制类型转换,现在的指针一次
16
取就可以取出十六位,即原来数组中两个元素,一个放在高八位,一个放在低八位
int *data_x = ( int *) n ;
count = count >> 1 ;/COUNT 变为原来的一半 for(i=0;i pro_l = _mpy( data_a[i], data_x[i]) ;/_mpy 是内联函数,它的功能 是把寄存器低八位的两个数相乘,结果给 pro_l pro_h = _mpyh( data_a[i], data_x[i]) ;/_mpyh 也是内联函数,它是 把高八位的两个数相乘,结果给 pro_h sum_l += pro_l ; sum_h += pro_h ; } sum = sum_l + sum_h ; return( sum) ; } 4 软件流水线技术的使用 软件流水线技术用来对一个循环结构的指令进行调度安排,使之成为多重迭 代循环并行执行。必须指出的是,只有当循环计数器大于一定值的时候才能进行 以上优化,在编译时使用-o2 和-o3 选项,编译器可对循环代码实现软件流水。 软件流水线的循环结构图如下图 所示。在图中用 A、B、C、D、E 表示循环的 各次迭代,其实的数字表示各次迭代的第几条指令,同一行的指令是同一周期内 并行执行的指令。同一周期内最多可执行 5 次迭代的不同指令(阴影部分)又称 为循环核,核前部分叫做循环填充,核后部分叫做循环排空。 A1 B1 C1 D1 E1 A2 B2 C2 D2 E2 A3 B3 C3 D3 E3 A4 B4 C4 D4 E4 A5 B5 C5 D5 E5 流水线填充 循环内核 流水线排空 5 循环结构中的代码展开 改进性能的另一种方法就是展开循环,这种优化方法可增加并行执行的指令 数,当单次迭代操作没有充分利用 C6x 结构的所有资源时,可使用循环展开提 17 高性能,展开循环结构的代码对于编译器利用软件流水线技术也有很大的好处, 因为汇编优化器只针对最内层的循环进行优化,因此,为了提高性能可创造一个 比较大的内循环。创造大的内循环的一个方法就是完全展开执行周期很少的内循 环。同时,因为展开循环会增加代码尺寸,所以我们必须在代码大小与运算时间 之间做出取舍。 第三节 第三个阶段代码优化 如果经过前两步的优化,代码还不能达到要求的话,我们可以进入第三阶段 的优化。由于汇编语言具有高效性,所以可以利用代码剖析工具从 C 代码中抽 出效率低的部分,然后用汇编语言改写它。,这里有两种方法可以进行汇编优化。 一种是使用线性汇编重新改写,然后用 CCS 提供的汇编优化器对改写的线性汇 编进行优化得到最终优化的汇编代码;另一种方法是直接对这部分代码进行手工 改写,得到优化的汇编代码[]。第二种方法需要程序员对 C6000 系列芯片的内 部结构非常了解,所以我们一般用第一种办法,采用线性汇编改写 C 代码。 线性汇编与普通的 C6x 汇编很相似,都使用汇编指令书写代码。不同的是, 线性汇编不需要书写普通汇编时必须提供的所有信息(如指令是否并行执行、指 令的标号、流水线的延迟、寄存器的使用和功能单元的使用等) 。汇编优化器从 输入的线性汇编代码中,完成以下功能:(1) 寻找哪些 CPU 指令可以并行执行; (2) 在软件流水线期间,处理流水线标号;(3) 分配寄存器的用法;(4) 定义使用 哪个功能单元。 1 线性汇编优化技术 下面用定点点积来具体举例说明用线性汇编优化代码的过程。 例 2 定点点积的 C 代码 short dotp(short a[], short b[]) { int sum, i; sum = 0; for(i=0; i<40; i++) sum += a[i] * b[i]; return(sum); } 把 C 代码改编成线性汇编指令 loop: ADD .L1 A4,A5,A5; 18 || MPY .M1X B4,A3,A4; || [B0] B .S2 loop; || [B0] SUB .L2 B0,0x1,B0; || LDH .D2T2 *B5++,B4; || LDH .D1T1 *A0++,A3; 上述定点点积的 C 代码没有经过优化的时候需要 1787 个指令周期,经过 线性汇编的优化以后只需要 120 个周期,效率得到提高。在实际的开发过程中 常常用这种方法对 C 代码进行汇编优化 2 手工汇编优化技术 所谓手工汇编优化,就是对 C 代码编译产生的汇编代码进行手工优化改写。 在某些性能要求比较苛刻的开发中,有时需要程序员对程序进行手工的汇编优 化,以发挥 DSP 性能的极致。手工汇编优化方法是首先写出要优化的 C 程序 代码段的一般汇编形式,然后对应一般汇编形式画相关图并分配资源,然后写出 与相关图对应的汇编代码。通常的优化策略包括:1 写并行代码 2 有对短数据(16 bit) 使用字(32 bit) 访问、3 软件流水线技术、4 多周期循环的模编排、5 循环展 开等[4],这里不再具体介绍。 19 第四章 对所编的 C 代码进行优化处理 第一节 小循环的打开 (1)for(l=0;l for (i = 0; i sum = 0; for (j = 0; j < 3; j++) { for (k = 0; k < 3; k++) { sum += p[(l+j)*in_data->width + i + k] *mask[j*3 + k]; } } sum = (sum >> shift); sum = (sum > 32767)? 32767 : (sum < -32768 ? -32768 : sum); OUT[(l+1)*in_data->width+i+1]=(short)sum; } } 在这里,由于 j k i 都不是很大,于是我们可以把里面的几层循环都打开,程序可 以改为, for(l=0;l {///中间滤波 for (i = 0; i 20
相关推荐:
- [建筑文档]2018年公需课:专业技术人员创新能力与
- [建筑文档]2013年福建教师招考小学数学历年真题
- [建筑文档]高中信息技术课flash知识点总结 - 图文
- [建筑文档]电工实训 - 图文
- [建筑文档]最高院公告案例分析100篇(民商篇)
- [建筑文档]南开中学高2017级14-15学年(上)期末
- [建筑文档]五粮液集团战略分析
- [建筑文档]鲁教版(2012秋季版)九年级化学 酸碱
- [建筑文档]超星尔雅2017中国哲学概论自整理题库答
- [建筑文档]关于成为海口金盘饮料公司材料独家供货
- [建筑文档]LNG学习资料第一册 基础知识 - 图文
- [建筑文档]四年级品社下册《好大一个家》复习资料
- [建筑文档]现阶段领导权力腐败的特点及发展趋势
- [建筑文档]魏晋南北朝诗歌鉴赏—嵇康
- [建筑文档]坚持追求真爱是理智的行为 正方一辩稿
- [建筑文档]湘西州刑释解教人员帮教安置工作存在的
- [建筑文档]园林工程试题库及答案
- [建筑文档]计算机长期没有向WSUS报告状态
- [建筑文档]日语最新流行语
- [建筑文档]B62-016 景观进场交底专题会议
- 2018年中考语文课内外古诗词鉴赏专题复
- 高考试题研究心得体会
- C语言基础题及答案
- 电气控制及PLC习题及答案
- 都昌小学家长学校汇报材料
- GMAT作文模板正确使用方法
- 俄军办坦克大赛:中国99式有望与豹2A6
- 成本会计练习题
- 酒店餐饮业最流行的5S管理方法
- 2014-2015学年山东省菏泽市高二(下)
- 《黄鹤楼送孟浩然之广陵》教案、说课、
- 2013年结构化学自测题 有答案版
- 2011西安世界园艺博览会游览解说词(附
- 窗口文明单位示范单位创建活动总结
- 2018满分超星尔雅就业课后练习期末答案
- 韶山市城市总体规划-基础资料
- 苏教版第三单元知识点归纳
- 第4章 曲轴模态分析
- 加大查办案件力度的思考
- 武汉CPC导轨介绍




