在信号处理和科学计算的应用中,转置矩阵的行和列是一个很重要的问题。从局部性的角度来看,它也很有趣,因为它的引用模式既是以行为主(row-wise)的,也是以列为主(column-wise)的。例如,考虑下面的转置函数:
typedef int array[2][2];
void transpose1 (array dst, array src)
{
typedef int array[2][2];
void transpose1 (array dst, array src)
{
int i,j;
for(i =0; i< 2; i++) {
for(j =0;j< 2; j++) {
dst[j][i] = src[1][j];
for(i =0; i< 2; i++) {
for(j =0;j< 2; j++) {
dst[j][i] = src[1][j];
}
}
}
假设在一台具有如下属性的机器,上运行这段代码;
假设在一台具有如下属性的机器,上运行这段代码;
●sizeof (int)==4。
●src数组从地址0开始,dst数组从地址16(十进制)开始。
●只有一个L1数据高速缓存,它是直接映射的、直写和写分配的,块大小为8个字节。。这个高速缓存总的大小为16个数据字节,一开始是空的。
●src数组从地址0开始,dst数组从地址16(十进制)开始。
●只有一个L1数据高速缓存,它是直接映射的、直写和写分配的,块大小为8个字节。。这个高速缓存总的大小为16个数据字节,一开始是空的。
●对src和dst数组的访问分别是读和写不命中的唯一来源。
A.对每个row和col,指明对src [row] [col]和dst [row][col]的访问是命中(h) 还是不命中(m)。例如,读src[0][0]会不命中,写dst[0][0]也不命中。
A.对每个row和col,指明对src [row] [col]和dst [row][col]的访问是命中(h) 还是不命中(m)。例如,读src[0][0]会不命中,写dst[0][0]也不命中。
B.对于一个大小为32字节的高速缓存重复这个练习。