- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
针对以下矩阵相乘的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)