教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 建筑文档 >

DSP 图像处理算法的实现-III(3)

来源:网络收集 时间:2026-08-19
导读: 这里列举三个方法: 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]

这里列举三个方法:

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;lheight-2;l++) {///中间滤波

for (i = 0; i width-2; 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;lheight-2;l++)

{///中间滤波

for (i = 0; i width-2; i++)

20

…… 此处隐藏:1297字,全部文档内容请下载后查看。喜欢就下载吧 ……
DSP 图像处理算法的实现-III(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/681300.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)