2009年12月17日星期四

关于DSP程序编译优化选项o3的问题

今天我在优化代码的时候。出现了问题。如下:
//----------------PERIPH.C---------------------
/* 读寄存器,参数 地址 返回内容*/
unsigned int ReadCMD(unsigned char addr)
{
unsigned int temp;
XCS_L();
WriteByte(0x03);
WriteByte(addr);
temp = ReadByte();
temp <<= 8;
temp += ReadByte();
XCS_H();
return temp;
}

//------------------MAIN.C-----------------
#define ReadHDAT0() ReadCMD(SPI_HDAT0)

hdat0=ReadHDAT0();//读文件帧头信息

假如我不用o3优化项。我读出的数据是正确的。但用的话,每次读出来的数据都错。而且都不相同(数值和正确的数值相差不大,可以说在正确数值下波动)。
然后我就查了对应o3的资料,书本有如下一段:
"-o3:表示最大可能优化级别。各种循环优化都执行了,并且各种文件级性质也用来改善性能。"

请问:
1、假如我要选用o3优化的话,我该怎样做才不出错?
2、o3的说明中,"各种循环优化都执行了",各种循环优化,具体怎么优化?在什么条件下?优化了些什么?
3、"各种文件级性质也用来改善性能",文件级性质指的是什么?它何以改善性能?

O3是最大的优化级别,特别对循环试图进行软件流水。优化后一些不常用的中间变量将被释放掉,优化前中间变量被定义在L2缓存里,优化后直接分配在了CPU内部寄存器里,所以这些变量将不能被看到。建议买一本DSP优化方面的书,一般讲得很清楚

很正常,采用O3优化后,少些代码会不正常,我也遇见过好几次,把C代码的方法改一下,再采用FULLL-DEBUG模式回过去看看(MIX模式)汇编确认一下。

我跑的是一个视频采集和压缩的程序,压缩用的是JPEG压缩算法, 程序在 不选-O2
或者-o3选项优化的时候,可以正常工作,而且比较稳定,但使用-o2或者-o3选项后,程序工作不稳定,会出错。而且程序在使用-o2或者-o3选项后,很多变量被优化掉了,有些语句的顺序也被调整了,调试起来也不是很方便,还需要继续研究。

程序中还使用了CSL支持库中
DAT_COPY,用于从外部SRAM中搬移数据到内部L2RAM中,没有使用-o2或者-o3选项时,DAT_COPY工作正常,
在使用-o2或者-o3选项后,DAT_COPY函数工作不正常了, 还得继续整。

肯定要使用-O3,不然全用手工优化,得把人累死。
至于错误的原因,不能怪-O3,只能说程序不严谨!
03出错,有时是用指针读写内存的错误,可以把程序分成比较小的文件,一个文件一个文件的O3,每次-O3一个文件,缩小错误的范围。
不会使用-O3的工程师,不算合格的DSP工程师。

没有评论: