6678DSP多核处理和优化

本文旨在纪录6678多核处理的调试过程

1、测试数据

手头有一份雷达测试数据,128脉冲积累,PRT 580个距离单元,数据量128*580*8 byte

仿真图如下:

2、单核处理

主要算法MTD+CFAR,数据放在DDR,为了演示关闭了编译器优化

连接仿真器,加载core0.out

2.1 导入测试数据

View->Memory Browser,右键Load Memory

Next,填入程序处理数据的地址

查看加载的数据地址

运行:统计耗时34.5ms,相参处理间隔128*70us=8.96ms,需要优化处理耗时

2.2 编译器优化

可以优化大部分,选择-o3

运行:耗时16.6ms,直接优化了一倍

2.3 存储空间优化

将处理数据放在共享内存

运行:耗时15.5ms,好像没啥优化。这块还需要再研究

2.4 针对部分耗时和执行频次高的代码优化

		#define TH_S(th, len, coef)  (((th/len)*(coef+1)))

        for(i = 0; i < len; i++)
		{
 			if(data[i] > (thres + TH_S(th[i+1], len, coef)))
 			{
				result[i] = data[i];
				result_th[i] = th[i+1];
			}
		}

采用DSP的内联函数,一次循环处理多组数据降低循环次数,如下将循环次数降低为原来的1/4

    temp3 = _ftod(coef+1,coef+1);
    temp4 = _ftod(1.0/len,1.0/len);
    temp7 = _ftod(thres,thres);

    	for(i = 0; i < len-4; i+=4)
		{
			th1_0 = th[i+1];
			th1_1 = th[i+1+1];
			th1_2 = th[i+2+1];
			th1_3 = th[i+3+1];

			temp1 = _ftod(th1_0,th1_1);
			temp2 = _ftod(th1_2,th1_3);

		    temp5 = _daddsp(_dmpysp(_dmpysp(temp1,temp3),temp4),temp7);
		    temp6 = _daddsp(_dmpysp(_dmpysp(temp2,temp3),temp4),temp7);

		    if(data[i]>_hif(temp5))
		    {
		    	result[i] = data[i];
		    	result_th[i] = _hif(temp5);
		    }
			if(data[i+1]>_lof(temp5))
			{
				 result[i+1] = data[i+1];
				 result_th[i+1] = _lof(temp5);
			}
			if(data[i+2]>_hif(temp6))
			{
				result[i+2] = data[i+2];
				result_th[i+2] = _hif(temp6);
			}
			if(data[i+3]>_lof(temp6))
			{
				result[i+3] = data[i+3];
				result_th[i+3] = _lof(temp6);
			}
		}
		for(; i < len; i++)
		{
			temp = thres + TH_S(th[i+1], len, coef);
 			if(data[i]>(temp)){
				result[i] = data[i];
				result_th[i] = temp;
			}
		}

运行:耗时8.2ms,优化了一倍。耗时在一个CPI(8.96ms)内了

3、多核处理

主从方式,核0主核,其余从核,主核负责接受数据分发任务,汇总结果上报

3.1 2核处理

将数据一分为二,core0和core1分别处理一半。

MTD:2核处理,分别delayNum/2,CFAR:2核处理,分别fftNum/2。

连接仿真器,cfg配置的是8核同步,懒得改了,group 8核,加载8核.out。

加载8核.out有个小技巧,因为分别选择8个.out路径挺费劲的,只要选择过一遍,就可以选择Reload Program,会自动加载8核上一次选择的路径。重点mark下,刚开始不知道这个操作,每次调试选择8个.out一度怀疑人生

Reload Program

选中Group运行:耗时5ms,以core0时间为准。ps:core1耗时是统计某一个处理过程的耗时,如下应该是CFAR处理耗时

3.2 4核处理

MTD:2核处理,分别delayNum/2,CFAR:4核处理,分别fftNum/4

因为MTD相对于CFAR不那么耗时,所以MTD只用了2核

选中Group运行:耗时3.7ms

3.3 8核处理

MTD:2核处理,分别delayNum/2,CFAR:8核处理,分别fftNum/8

选中Group运行:耗时3ms

全速运行,MTD:8核处理,分别delayNum/8,CFAR:8核处理,分别fftNum/8

运行:耗时2.7ms

4、mark

L2设置256K cache,低256K(从0x00800000)开始为sram,高256k为cache


void PrintSpStatus()
{
    SP_STATUS *pSpStatus = &pCoreStatus->spStatus;
    UINT i = 0;

    PRT("------------------------------ spBuf Info --------------------------------------- \n");
    PRT("recvData  recvData  recvData  recvData   recv    ram    fftout cfarData  cfarIn \n");
    PRT("  Buf[0]   Buf[1]    Buf[2]   Buf[3]     Buf     Buf     Buf     Buf      Buf   \n");
    PRT("%6x %6x %6x %6x %6x %6x %6x %6x %6x \n",
        pSpStatus->recvDataBuf[0], pSpStatus->recvDataBuf[1], pSpStatus->recvDataBuf[2],
        pSpStatus->recvDataBuf[3], pSpStatus->recvBuf, pSpStatus->ramBuf,
        pSpStatus->fftOutBuf, pSpStatus->cfarDataBuf, pSpStatus->cfarInBuf);

    PRT("------------------------------ sp Info ------------------------------------------ \n");
    PRT("tar overflow core0 core1 core2 core3  core4  core5  core6  core7    fft   delay   sp \n");
    PRT("Num   Cnt    Time  Time  Time  Time   Time   Time   Time   Time     num    num    cnt \n");
    PRT("%d %6d %6d %6d %6d %6d %6d %6d %6d %6d %6d %6d %6d \n",
        pSpStatus->tarNumOut, pSpStatus->overflowCnt,
        pSpStatus->spTime[0], pSpStatus->spTime[1], pSpStatus->spTime[2], pSpStatus->spTime[3],
        pSpStatus->spTime[4], pSpStatus->spTime[5], pSpStatus->spTime[6], pSpStatus->spTime[7],
        pSpStatus->fftNumAll, pSpStatus->delayNumAll, pSpStatus->spCnt);

	PRT("------------------------------ fft Info ------------------------------------------ \n");
	PRT("core0  core1  core2  core3  core4  core5  core6  core7 \n");
	PRT("delay  delay  delay  delay  delay  delay  delay  delay \n");
	PRT("%d %6d %6d %6d %6d %6d %6d %6d \n",
		pSpStatus->fftDelayNum[0], pSpStatus->fftDelayNum[1], pSpStatus->fftDelayNum[2], pSpStatus->fftDelayNum[3],
		pSpStatus->fftDelayNum[4], pSpStatus->fftDelayNum[5], pSpStatus->fftDelayNum[6], pSpStatus->fftDelayNum[7]);

	PRT("------------------------------ cfar Info ------------------------------------------ \n");
	PRT("core0  core1  core2  core3  core4  core5  core6  core7 \n");
	PRT("fftNum fftNum fftNum fftNum fftNum fftNum fftNum fftNum  \n");
	PRT("%d %6d %6d %6d %6d %6d %6d %6d \n",
		pSpStatus->cfarFftNum[0], pSpStatus->cfarFftNum[1], pSpStatus->cfarFftNum[2], pSpStatus->cfarFftNum[3],
		pSpStatus->cfarFftNum[4], pSpStatus->cfarFftNum[5], pSpStatus->cfarFftNum[6], pSpStatus->cfarFftNum[7]);

    PRT("------------------------------ spTarget Info ----------------------------------- \n");
    PRT("tar   r   range   fre    angle   mag \n");
    PRT("Idx  Idx   Out    Out     Out    Out \n");
    for (i = 0; i < pSpStatus->tarNumOut; i++)
    {
        PRT("%d %6d %6d %6d %6d %6d \n",
            pSpStatus->spInfo[i].tarIndexOut, pSpStatus->spInfo[i].r_index, pSpStatus->spInfo[i].rangeOut,
            pSpStatus->spInfo[i].freOut, pSpStatus->spInfo[i].angleOut, pSpStatus->spInfo[i].magSumOut);
    }
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: tms320c66x keystone架构多dsp入门与实例精解.pdf 是一本介绍基于TMS320C66x Keystone架构的多DSP编程的实践性指南。本书分为四章,每一章都包含了多个实例,逐步深入讲解多DSP编程的基本概念和实践技巧。 第一章主要介绍Keystone架构的基本特点、硬件资源和多编程的优势。第二章从单到多的转变上做了深入讲解,并且结合实例从基本的多并行编程开始介绍了TMS320C66x Keystone架构下的Event Manager、Message Manager、Mailbox和RM的使用方法。 第三章介绍了DSP封装的基本操作和解封装方法,同时讲解了运用RTDX技术实现多DSP互相通讯的方法。第四章讲解了多DSP异构计算的优越性和实践技巧。通过实例,讲解了提升DSP并行度的四种方法:分割、工作流分配、部署和确定性和非确定性计算。 总体来说,该书是一本聚焦于TMS320C66x Keystone架构下多DSP编程实践的入门指南和工具手册。需要注意的是,该书对读者在DSP编程方面的基础知识要求较高,建议具备一定的DSP编程经验再进行阅读。 ### 回答2: 《TMS320C66x Keystone架构多DSP入门与实例精解》是一本介绍Keystone架构多DSP的入门教材,主要涵盖了Keystone架构、TMS320C66x、多处理DSP算法开发、实时系统开发等内容。 Keystone架构是一种高性能、低功耗、灵活可扩展的DSP架构,在嵌入式应用领域得到广泛应用。TMS320C66x是Keystone架构的一种实现,具有高达1.2Tops的处理能力和丰富的片上外设资源。多处理是Keystone架构的重要特性之一,可以有效提高系统的性能和可靠性。 本书以DSP算法开发为主线,详细介绍了TMS320C66x的架构、资源配置、多编程、DSP算法开发等方面的内容。同时,还介绍了实时系统开发和性能优化等关键问题,为读者提供了一系列实践案例和经验总结。 本书适合从事嵌入式系统开发、DSP算法开发和实时系统开发等领域的工程师、学生和研究人员阅读。无论是初学者还是有一定经验的开发者,都可以从本书中获得有用的知识和实践经验,提高开发效率和系统性能。 ### 回答3: 《TMS320C66x Keystone架构多DSP入门与实例精解》是一本介绍Texas Instruments公司TMS320C66x系列多数字信号处理器的入门教材和实例精解。本书深入浅出地介绍了DSP的体系结构、系统架构、并行编程方法和实现技术等方面的知识,实例详尽而丰富,既全面系统地介绍了该系列DSP的基本概念和特性,又能够从实践出发,提供丰富的应用案例和技术经验。 全书分为十二章,从DSP基础知识讲起,逐渐深入介绍了Keystone系列多DSP的设计、接口和编程方法等方面的内容。每一章的末尾都有实验项目,让读者听取学到的知识进行实践,深入了解多DSP的特点和应用。 该书的优点在于深入浅出,易于理解。同时,该书的实例很丰富,从任务调度、矩阵乘法、FFT算法、卷积编码等实例都贴近实际,体现了多DSP的应用价值。该书对于学习多DSP的学生、工程师、技术人员都是很好的参考材料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值