You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 09:29:34