TI中文支持网
TI专业的中文技术问题搜集分享网站

C6748算法优化

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:

您好,我后来补充信息给您了,可否请您再指导一下,谢谢

赞(0)
未经允许不得转载:TI中文支持网 » C6748算法优化
分享到: 更多 (0)