64×64整数矩阵转置的缓存友好性优化问询(基于32直接映射组缓存)
64×64整数矩阵转置的缓存友好性优化问询(基于32直接映射组缓存)
我目前正在做计算机组成的实验,目标是让64×64整数数组的矩阵转置操作更高效。当前使用的缓存配置是32个直接映射组,每个缓存行大小为32字节(对应参数s=5,E=1,b=5)。
我采用了分块(Blocking)优化方法,并且特意把对角线元素的转置延迟到循环结束时处理,以此避免不必要的缓存驱逐。通过分析代码的内存访问模式,我发现选择块大小为4比一开始认为更合理的8能带来更好的缓存表现。目前我还没发现代码中存在会导致64×64数组出现过度缓存驱逐的明显问题,而且实验要求代码里只能定义整数类型的变量。
我的转置实现代码如下:
int BS = 4; int ii, jj, i, j; for (ii = 0; ii < N; ii += BS) { for (jj = 0; jj < M; jj += BS) { int ii_max = (ii + BS < N ? ii + BS : N); int jj_max = (jj + BS < M ? jj + BS : M); if (ii != jj) { for (i = ii; i < ii_max; i++) { for (j = jj; j < jj_max; j++) { B[j][i] = A[i][j]; } } } else { for (i = ii; i < ii_max; i++) { int tmp; for (j = jj; j < jj_max; j++) { if (i == j) { tmp = A[i][j]; } else { B[j][i] = A[i][j]; } } B[i][i] = tmp; } } } }
为了更深入分析缓存行为,我还记录了每次内存访问时,地址映射到的缓存组索引,以及对应的驱逐情况(每条记录格式为:i值, j值, 组索引):
- 0,0,0(对角线替换)
- 0,1,0
- 1,0,8
- 0,2,0
- 2,0,16
- 0,3,0
- 3,0,24
- 0,4,0
- 4,0,0
- 0,5,0
- 5,0,8
- 0,6,0
- 6,0,16
- 0,7,0
- 7,0,24
- 0,8,1
- 8,0,0
- 0,9,1
- 9,0,8
- 0,10,1
- 10,0,16
- 0,11,1
- 11,0,24
- 0,12,1
- 12,0,0
- 0,13,1
- 13,0,8
- 0,14,1
- 14,0,16
- 0,15,1
- 15,0,24
内容来源于stack exchange
相关产品推荐
相关产品推荐

