矩阵乘法的性能优化

for (i=0; i<n; i++)  {
  for (j=0; j<n; j++) {
    sum = 0.0;
    for (k=0; k<n; k++) 
      sum += a[i][k] * b[k][j];
    c[i][j] = sum;
  }
} 

N x N 矩阵相乘

矩阵元素类型是 doubles (8 字节)

总共 O(N3) 个操作

每个元素都要读 N次

每个目标中都要对 N 个值求和

但也可以保存在寄存器中

不命中率分析

假设:

块大小 = 32 B (足够大 4 倍)

矩阵的维数 (N)是非常大的

大约 1/N 为 0.0 (这个意思是,按列读的时候,下一行一定不在当前行的 cache 中,会重新覆盖,不存在空间局部性可以相邻读取)

缓存不是大到足够容纳多行

分析方法:

看内循环的的访问模式

注意听这段分析,冷不命中后如何加载数据的,保证后续读取的便利性

安行访问才能更好地利用局部性