c6748中,如下算法该如何优化
in_n 为28332
float x[70000];
float y[70000];
float I[70000];
float Q[70000];
float x_temp[70000];
float y_temp[70000];
void DSP_Dot_Mut(float * p1 , float *p2 , float *result , int number) { int i; for(i=0;i<number;i++) { result[i] = p1[i]*p2[i]; } }DSP_Dot_Mut(I, I+99, x, in_n-99);DSP_Dot_Mut(Q, Q+99, y, in_n-99);for(i=0;i<in_n-99;i++){x_temp[i]=x[i]+y[i];}DSP_Dot_Mut(I, Q+len3, x, in_n-len3);DSP_Dot_Mut(Q, I+len3, y, in_n-len3);for(i=0;i<in_n-len3;i++){y_temp[i]=x[i]-y[i];}
Tony Tang:
看一下这个文档:
http://www.ti.com/lit/ug/spru198k/spru198k.pdf
以及这人贴子。
http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/19044.aspx
第一步把编译器优化选项设为-03,你上面这个代码结构简单,-03估计就差不多了。
Victorsunhao:
回复 Tony Tang:
您好,需要把整个project的编译都设成-03吗,还是部分封装成函数,然后生成.lib然后调用?谢谢
Tony Tang:
回复 Victorsunhao:
都行,如果不想对工程中的初始化部分代码优化,可以将算法生成库,或者直接在工程里对文件单独设置优化选项(方法:选中文件,右键选择文件优化选项)
Victorsunhao:
回复 Tony Tang:
您好,按照您的说法做了。快了将近一倍。但是有个问题:
我给你贴出的代码,用软件仿真,就是点击绿色的小虫,然后载入数据,计算贴出来的代码,查了下这一块的计算cycle数,是338933,而连接仿真器,用硬件仿真,还是计算这边cycle数是3254007。也就是硬件仿真几乎是软件仿真的10倍。我知道需要使用缓存。但我的程序中对缓存使用很笼统,就在main函数开始的地方用了
CacheEnableMAR((unsigned int)0xC0000000, (unsigned int)0x01000000);
CacheEnable(L1DCFG_L1DMODE_32K | L1PCFG_L1PMODE_32K | L2CFG_L2MODE_256K);
当然CACHEINV CACHEWB我是有使用并且注意的。但是程序中in_n的值是30000,len3的值是99 是不是一下子数据量太大,导致缓存的命中率不高,从而导致计算速度如此之慢呢?我能不能在调用这部分之前,使用如下的步骤:
step1:CacheWBAll()函数将所有缓存数据写回去
step2:使用CacheDisableMAR() 将缓存禁止掉
step3:使用
CacheEnableMAR((unsigned int)0xC0600000, (unsigned int)0x00400000);
CacheEnable(L1DCFG_L1DMODE_32K | L1PCFG_L1PMODE_32K | L2CFG_L2MODE_256K);
用硬件调试发现数组I 的首地址为0xC06A4A18 Q的首地址为0xC06E8FD8 x的首地址为0xC061BE98
缩短缓存作用长度。您看看有什么问题,恳请指导,感谢!
Tony Tang:
回复 Victorsunhao:
估计用处不大。因为从段代码看也没有别的数据会用到Cache,除了代码可能会用到一点点。
从上面代码的特点来看,x, y用的次数多,I,Q也用的多,而temp_x, temp_y只用了一次,你的配置是L2都用做了CACHE,目的就是想把它都用来Cache这些数组,那何不把L2配成RAM,直接把这些数组尽量放在L2上呢?
前面那个*p1, *P2又是多大?
Victorsunhao:
回复 Tony Tang:
您好,p1 p2 最大分别为70000个float,正常使用估计在30000个float。
Victorsunhao:
回复 Tony Tang:
您好,再补充一下:
因为I Q x y的数组大小最大均为70000个float 这4个数组就已经1093KByte了,放在L2RAM里面肯定是不够了。。
那么我想就是将这个函数,70000个float与70000个float相乘,将其改成300个与300个相乘,然后再循环几十次,您说这样会计算的快一点吗?恳请指导,谢谢!
Victorsunhao:
回复 Tony Tang:
您好,我后来补充信息给您了,可否请您再指导一下,谢谢