直接在其源程序基础上做出循环优化(代码外提、强度消弱等).doc

直接在其源程序基础上做出循环优化(代码外提、强度消弱等).doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

您可能关注的文档

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档