- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
直接在其源程序基础上做出循环优化(代码外提、强度消弱等).doc
针对以下矩阵相乘的C循环语句,直接在其源程序基础上做出循环优化(代码外提、强度消弱等)
设矩阵如下:
int a[20][20],b[20][20],c[20][20];//width of an integer is 4
// a = b * c;
for(i=0;i20;i++)
for(j=0;j20;j++)
for(k=0;k20;k++)
a[i][j] = a[i][j] + b[i][k]*c[k][j];
首先考虑代码外提。
对于k-循环而言,a[i][j]和b[i]为循环不变式,可以外提至k-循环外(j-循环内),程序变换如下:
for(i=0;i20;i++) {
for(j=0;j20;j++) {
t1 = addr(a[i][j]);
t2 = addr(b[i]);
for(k=0;k20;k++) {
*t1 = *t1 + t2[k]*c[k][j];
} // k-loop
} // j-loop
} // i-loop
考虑a[i]和b[i]在中间层循环j-loop中仍然是循环不变式,可以进一步外提出j-loop(提到i-loop中),程序变换为:
for(i=0;i20;i++) {
t3 = addr(a[i]);
t4 = addr(b[i]);
for(j=0;j20;j++) {
t1 = addr(t3[j]);
t2 = t4;
for(k=0;k20;k++) {
*t1 = *t1 + t2[k]*c[k][j];
} // k-loop
} // j-loop
} // i-loop
考虑复写传播,可以删除变量t2。程序变换如下:
for(i=0;i20;i++) {
t3 = addr(a[i]);
t4 = addr(b[i]);
for(j=0;j20;j++) {
t1 = addr(t3[j]);
for(k=0;k20;k++) {
*t1 = *t1 + t4[k]*c[k][j];
} // k-loop
} // j-loop
} // i-loop
然后考虑数组下标的情况(设数组元素按行优先排列),即将其变换为指针形式,即地址计算的展开形式。
t3 = addr(a[i]);
其地址表述为:i*20*4+A-0 = i*80+A
//A 为数组a的起始地址;
//C语言数组下标从0开始。这是一个基本归纳变量i族的归纳表达式
t4 = addr(b[i]);
其地址表述为:i*20*4+B-0 = i*80+B
//B 为数组b的起始地址;
//C语言数组下标从0开始。这是一个基本归纳变量i族的归纳表达式
t1 = addr(t3[j]);
其地址表述为:j*4+t3-0 = j*4+t3
//C语言数组下标从0开始。这是一个基本归纳变量j族的归纳表达式
t4[k]的地址表述为:
k*4+t4-0 = k*4+t4
//C语言数组下标从0开始。这是一个基本归纳变量k族的归纳表达式
c[k][j]的地址表述为:
k*20*4+j*4+C-0=k*80+j*4+C
//C 为数组c的起始地址;
//C语言数组下标从0开始。这是一个基本归纳变量k族的归纳表达式
//因为上面式子中的j*4+C在k-loop中不变
现在进行强度消弱。注意每次的强度消弱分三个步骤完成,即,
引入新的变量s,并将原归纳表达式替换为变量s;
在循环中基本归纳变量增值语句后,添加变量s的增值语句;
在循环外基本归纳变量的初值后(一般在前置块末尾)添加变量s的初值计算语句;
t4[k]: 针对上面的归纳表达式k*4+t4引入变量t5
c[k][j]: 针对上面的归纳表达式k*80+j*4+C引入变量t6;
addr(t3[j]): 针对上面的归纳表达式j*4+t3引入变量t7;
addr(b[i]): 针对上面的归纳表达式i*80+B引入变量t8;
addr(a[i]): 针对上面的归纳表达式i*80+A引入变量t9;
程序继续变换为:
t8 = B;// addr(b[i])的初值
t9 = A; // addr(a[i])的初值
for(i=0;i20;i++) {
t3 = t9;
t4 = t8;
t7 = t3; // addr(t3[j])的初值;
for(j=0;j20;j++) {
t1 = t7;
t5 = t4; //t4[k]的初值
t6 = j * 4
您可能关注的文档
- 现代汉语名词槽关系系统中横类型的研究和设计-COLIPS.doc
- 现代遗传学题目.doc
- 珠海市门诊统筹定点医疗机构个人选定申请表-珠海市社会保险基金管理.doc
- 理解要点-仪器信息网.ppt
- 瓶颈-大连理工大学远程与继续教育学院.doc
- 瓷砖造型算法设计外包.doc-CSTO.doc
- 生产管理子目标.ppt
- 生活与交通安全.ppt
- 生物多样性人才培育先导型计画申请须知.doc
- 生物安全关键技术研发重点专项2017年度定向项目申报指南.doc
- 2024工程硕士通关考试题库附参考答案详解(夺分金卷).docx
- 2025中国航天科工所属中国华腾工业有限公司招聘笔试模拟试题及一套参考答案详解.docx
- 2025上海交通大学南通先进技术研究院招聘5人笔试模拟试题及答案详解(各地真题).docx
- 计算机二级高频难、易错点题及答案详解【夺冠系列】.docx
- 2025内蒙古鄂尔多斯市人才发展集团有限公司招聘5人笔试模拟试题及一套完整答案详解.docx
- 2025上海大学(浙江嘉兴)新兴产业研究院招聘2人笔试备考试题精选答案详解.docx
- 2025上海大学(浙江嘉兴)新兴产业研究院招聘2人笔试备考试题及答案详解(历年真题).docx
- 2024-2025学年度广播电视编辑记者题库附参考答案详解(轻巧夺冠).docx
- 2025北京东城区交道口社区卫生服务中心招聘5人笔试模拟试题及一套完整答案详解.docx
- 2024-2025学年广播电视编辑记者考前冲刺试卷【巩固】附答案详解.docx
文档评论(0)