版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C6000软件优化实例1.定点点积通过软件流水等技术,N点点积的时间
N/2。循环展开。一次迭代出两次结果。但是,必须保证循环次数为偶数次。
如果不是循环偶数次,程序员自己补充memorypad.定点点积的相关图(.sa)Almostperfect!L1:;PIPEDLOOPPROLOGLDW.D2T2*B5++,B6;|16|(P)<0,0>loadai&ai+1frommemory||[A0]BDEC.S1LOOP,A0;|23|(P)<0,2>branchtoloop||LDW.D1T1*A5++,A4;|17|(P)<0,0>loadbi&bi+1frommemoryLDW.D2T2*B5++,B6;|16|(P)<1,0>loadai&ai+1frommemory||[A0]BDEC.S1LOOP,A0;|23|(P)<1,2>branchtoloop||LDW.D1T1*A5++,A4;|17|(P)<1,0>loadbi&bi+1frommemoryLDW.D2T2*B5++,B6;|16|(P)<2,0>loadai&ai+1frommemory||[A0]BDEC.S1LOOP,A0;|23|(P)<2,2>branchtoloop||LDW.D1T1*A5++,A4;|17|(P)<2,0>loadbi&bi+1frommemoryLDW.D2T2*B5++,B6;|16|(P)<3,0>loadai&ai+1frommemory||[A0]BDEC.S1LOOP,A0;|23|(P)<3,2>branchtoloop||LDW.D1T1*A5++,A4;|17|(P)<3,0>loadbi&bi+1frommemoryMV.S2XA6,B4||MVK.L20x2,B0 ;initprologcollapsepredicate||LDW.D2T2*B5++,B6;|16|(P)<4,0>loadai&ai+1frommemory||[A0]BDEC.S1LOOP,A0;|23|(P)<4,2>branchtoloop||LDW.D1T1*A5++,A4;|17|(P)<4,0>loadbi&bi+1frommemory;**--------------------------------------------------------------------------*LOOP:;PIPEDLOOPKERNEL[B0]SUB.S2B0,1,B0;<0,7>||[!B0]ADD.L2B7,B4,B4;|20|<0,7>sum0+=(ai*bi)||[!B0]ADD.L1A6,A3,A3;|21|<0,7>sum1+=(ai+1*bi+1)||MPY.M2XB6,A4,B7;|18|<2,5>ai*bi||MPYH.M1XB6,A4,A6;|19|<2,5>ai+1*bi+1||[A0]BDEC.S1LOOP,A0;|23|<5,2>branchtoloop||LDW.D2T2*B5++,B6;|16|<7,0>loadai&ai+1frommemory||LDW.D1T1*A5++,A4;|17|<7,0>loadbi&bi+1frommemoryC64定点点积线性汇编程序生成的汇编代码:collapsprolog技术,缩小代码尺寸2.浮点复数数组求模难点:开方运算解决方法:用C67xx的特殊指令
rcpsp,rsqrsp循环展开提高速度学习重点:特殊指令,no_mdep(关于循环传递路径问题)存在问题:精度,3bit有效位C67xx求模的C代码voidfloat_abs_asm(float*sadd,float*dadd,intabslong){ inti; floatans1,ans2; _nassert(abslong>64); for(i=0;i<abslong;i++) { ans1 =sadd[2*i]*sadd[2*i]+sadd[2*i+1]*sadd[2*i+1]; ans2 =_rcpsp(ans1); dadd[i]=_rsqrsp(ans2); } }观察指针声明restrict的区别.求模的线性汇编代码求模的线性汇编程序生成的
汇编代码的循环核LOOP:;PIPEDLOOPKERNEL
STW.D2T2B8,*B7++(8);|75|<0,16>||[A1]B.S1LOOP;|78|<1,13>||ADDSP.L2B5,B4,B8;|67|<2,10>||MPYSP.M1A4,A4,A4;|64|<3,7>||[A2]LDDW.D1T1*A7++(16),A5:A4;|60|<5,1>[A2]SUB.D1A2,1,A2;<0,17>||RCPSP.S1A0,A0;|71|<0,17>||RSQRSP.S2B8,B8;|70|<1,14>||ADDSP.L1A3,A4,A3;|66|<2,11>||MPYSP.M2B5,B5,B5;|63|<4,5>[B0]SUB.L2B0,1,B0;<0,18>||STW.D1T1A0,*A6++(8);|74|<0,18>||RSQRSP.S1A3,A0;|69|<1,15>||RCPSP.S2B8,B8;|72|<1,15>||[A1]ADD.L10xffffffff,A1,A1;|77|<2,12>||MPYSP.M1A5,A5,A3;|62|<4,6>||MPYSP.M2B4,B4,B4;|65|<4,6>||[B0]LDDW.D2T2*B6++(16),B5:B4;|61|<6,0>3.循环中的If-Then-Else在C代码中有If-Then-Else语句,这个语句是当条件为真时执行某条指令,当条件为假时执行另一条指令。C6000的所有指令都可以根据C62x和C67x的五个通用寄存器中的一个和C64x的六个通用寄存器中的一个来条件执行,因此在线性汇编中,可通过条件指令来实现这一功能。条件指令可以处理If-Then-Else语句的真假两种情况。(多种情况不能仅用条件指令处理)显然,跳转是执行If-Then-Else语句的一种方法,即条件为真时转向ADD,否则转向SUB。然而由于每个跳转都有5个延迟间隙,这种方法需要额外的延迟周期。另外,在循环内跳转也使软件流水几乎不可能实现。
If语句的例子:short复数求模,并求最大模值和位置//declareanddefinetheCfunctionbelowvoidPlur_Arr_ABS_c(PlurData*restrictpPlurA,unsignedint*restrictpAbsResult,intn,int*restrictpMaxAbsVal,int*restrictpMaxAbsLoct){ inti,real,imag;// *pMaxAbsVal=0;//initialitherewaste1cpucycle #pragmaMUST_ITERATE(40,,2); for(i=n-1;i>=0;i--){ real=(pPlurA+i)->Real;//gettherealpartofPlurData imag=(pPlurA+i)->Imag;//gettheimagpartofPlurData //getthesqareroot *(pAbsResult+i)=_rcpsp(_rsqrsp(imag*imag+real*real)); if(*(pAbsResult+i)>*pMaxAbsVal){ *pMaxAbsVal=*(pAbsResult+i); *pMaxAbsLoct=i; } }}typedefstruct{ shortReal; shortImag;}PlurData; .global _plursa ;beginlinearasm_plursa:.cproc pPlurA,pAbsResult,n,pMaxAbsVal,pMaxAbsLoct .reg cntr,maxval,flag,maxloct,k .reg real,imag,sum0,sum1,sum2,sum3,sum4 .no_mdep ;nomemorydependencesoccurwithinthisfunction ZERO maxval ;maxval=0 ZERO k ;k=0,kindicatethelooptimesLOOP:.trip 40 ;iterate40timesatleast LDW *pPlurA++,real ;loadthearrayfrommemory MV real,imag ;copythe32bitsdatatoimag MPYH imag,imag,imag ;imag*imag MPY real,real,real ;real*real ADD real,imag,sum0 ;real*real+imag*imag INTSP sum0,sum1 ;int->single-precision RSQRSP sum1,sum2 ;getthesingle-precisionfloating-pointsquare-rootreciprocalapproximationvalue RCPSP sum2,sum3 ;sum3=1/sum2 SPTRUNC sum3,sum4 ;single-precision->int STW sum4,*pAbsResult++ ;storetheresult CMPGTU sum4,maxval,flag ;if(sum4>maxval)flag=1;elseflag=0[flag]MV sum4,maxval ;if(flag)maxval=sum4[flag]MV k,maxloct ;if(flag)maxloct=k[n] sub n,1,n ;decreasetheloopcountern add k,1,k ;increasethelooptimescounterk[n] B LOOP ;gotoloopifn!=0 STW maxloct,*pMaxAbsLoct;storethemaxlocttothememory STW maxval,*pMaxAbsVal ;storethemaxvaltothememory .endproc ;linearasmendsC生成的代码和
线性汇编生成的代码比较C生成的代码尺寸:604Byte线性汇编生成的代码尺寸:365ByteC生成的代码的执行时间: 154CLK线性汇编生成的代码的执行时间: 155CLK4.生命太长问题(Live-Too-Long)
定义:
当要求父指令结果存活时间比循环的最小迭代间隔长(从资源的角度看,得到的循环的最小迭代间隔),这时就产生一个生命太长问题。产生问题的原因:
因为每条指令每隔一个迭代间隔周期执行一次,当要求父指令结果存活时间大于迭代间隔时,在子指令读父指令结果之前,这条父指令的下次迭代用新的值覆盖了这个寄存器的值。生命周期太长的例子生命周期太长的例子两个分开的路径从a0到a3和从b0到b3产生了生命太长问题。因为ADDa3指令必须在SHRa1和MPYa2指令完成后才能执行,所以a0必须存活至少4周期。
解决生命周期太长的办法1.循环展开
在每次迭代中所做的工作将是原先的两倍。展开循环后,基于资源和路径数据相关的最小迭代间隔上升为4。尽管这种方法可获得尽可能高的循环吞吐量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度版权许可合同:某音乐公司与音乐版权方之间的许可协议
- 2024年度版权发行与分销合同3篇
- 2024年度企业销售员工劳动合同业务目标
- 2024年度安徽省珠宝买卖合同
- 2024年度数据服务合同:大数据分析与咨询服务协议
- 2024年度知识产权许可合同标的及许可条件
- 2024年度广告发布及媒体代理合同3篇
- 2024年度东莞市垃圾焚烧发电项目特许经营合同
- 二零二四年度酒店厨房设施安全评估与改进合同
- 恶性综合征治疗
- 2024年中国船级社质量认证公司招聘笔试参考题库含答案解析
- 《法律效力层级》课件
- GB 42295-2022电动自行车电气安全要求
- 焊接材料的质量控制和追溯规范
- 居民自建桩安装告知书回执
- 2022年教育部教育管理信息中心招聘考试真题
- 新能源及多能互补互补技术
- 荷载与结构设计方法《期末考试复习题》
- 《行香子》(树绕村庄)(课件)-九年级语文上册
- 违纪学生撤销(降级)处分申请表
- 高职院校师资建设五年规划
评论
0/150
提交评论