20135223何伟钦—第六章家庭作业
2015-11-10 20:05
369 查看
第六章作业
一、家庭作业6.36(20135203&&20135223)
(由于题6.36与6.35基本题型一样,只是高速缓存的数据字节不一样,我直接把6.35题目修改后作为6.36题目)考虑下面的矩阵转置函数:
typedef int array[4][4]; void transpose2(array dst,array src) { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { dst[i][j]=src[j][i]; } } }
假设这段代码运行在一台具有如下属性的机器上:
sizeof(int)==4。
数组src从地址0开始,而数组dst从地址64开始(十进制)。
只有一个L1数据高速缓存,它是直接映射、直写、写分配的,块大小为16字节。
对于一个总大小为128数据字节的高速缓存,初始为空。
对src和dst数组的访问分别是读和写不命中的唯一来源。
对于每个row和col,指明对src[row][col]和dst[row][col]的访问是命中(h)还是不命中(m)。
分析:
(1)对于写分配的高速缓存,每次写不命中时,需要读取数据到高速缓存中。该高速缓存只有 2 个组,src[0] src[2] 对应组 0,src[1] src[3] 对应组 1。
同理,dst[0] dst[2] 对应组 0,dst[1] dst[3] 对应组 1。
(2)缓存能完全容得下两个数组,所以只会出现冷不命中。
解答:
二、家庭作业6.46(20135223(2)&&20135215(2))
解答:
void transpose(int *dst,int *src,int dim){
int i,j;
int im,jm;
for(i=0;i<dim-3;i+=4)
{
im = i*dim;
for(j=0;j<dim-3;j+=4)
{
jm = j*dim;
dst[jm+i]=src[im+j];
dst[jm+i+1]=src[im+dim+j];
dst[jm+i+2]=src[im+2*dim+j];
dst[jm+i+3]=src[im+3*dim+j];
dst[jm+dim+i]=src[im+j+1];
dst[jm+dim+i+1]=src[im+dim+j+1];
dst[jm+dim+i+2] =src[im+2*dim+j+1];
dst[jm+dim+i+3]=src[im+3*dim+j+1];
dst[jm+2*dim+i]=src[im+j+2];
dst[jm+2*dim+i+1]=src[im+dim+j+2];
dst[jm+2*dim+i+2]=src[im+2*dim+j+2];
dst[jm+2*dim+i+3]=src[im+3*dim+j+2];
dst[jm+3*dim+i]=src[im+dim+j+3];
dst[jm+3*dim+i+1]=src[im+dim+j+3];
dst[jm+3*dim+i+2]=src[im+2*dim+j+3];
dst[jm+3*dim+i+3]=src[im+3*dim+j+3];
}
}
for(;i<dim;i++)
for(;j<dim;j++)
dst[j*dim+i]=src[i*dim+j];
}
用10000*10000的数组测试(linux下需要取消stack的大小限制才运行这么大的数组)
书上的程序平均需要 9.301s
优化后评价需要 3.830秒
相关文章推荐
- 阿里云服务器远程mysql连不上
- Rational Rose 2003 下载、破解及安装方法(图文)
- HDU 1276 士兵队列训练问题 标记
- 插入排序
- sicily 14550 Interesting Integers
- python表达式操作符与数学函数
- LeetCode Add Two Numbers(用链表模拟加法)
- Odd-even sort: Sorting by Exchanging
- Java web eclipse 配置-workset tab转空格
- git删除文件所有历史版本
- leetcode 48:Rotate Image
- MySQL 源码编译安装报错 Googlemock was not found
- opencv笔记 1.利用摄像头进行视频文件写入
- c++primer第五版第十二章12.20习题用一个StrBlobPtr打印出StrBlob中的元素
- 【jdbcTemplate】使用jdbcTemplate查询的三种回调
- 驱动模块和桩模块的概念和区别
- [2033 ] :人见人爱A+B
- sicily 10625 TRENER
- 深入浅出Android Support Annotation(什么是android.support.annotation.NonNull的拓展)【转】
- Android快速SDK(10)地址库Location【傻瓜模式】