【问题标题】:Lots of cache miss, Sparse matrix multiplication大量缓存未命中,稀疏矩阵乘法
【发布时间】:2015-06-16 08:56:21
【问题描述】:

问候亲爱的地球人!

这是概述:

我正在做一个稀疏矩阵乘法,其中有两个密集矩阵,但我只对输出的某些元素感兴趣。我有两个矩阵和一个二维索引数组:

float * A:[M*K]
float * B:[N*K]
int [][] idx: [M][nSelection] (that is there are nselection rows in B, per row in matrix A that I want to multiply)

我想计算:

out=A*B' // but of course only for the indices i,j where idx[i][k]=j for some k.

这是问题的关键: 我想在乘法时将这些东西保留在 cpu 缓存中,一次乘以 16 个浮点数:

for (int kk = 0; kk < K; kk+=KK){
    int begin = 0;
    int end = M;
        for (int i = begin; i < end; i++){
            for (int j = 0; j < numberToAccept; j++){
                int theid = idx[i * numberToAccept + j];
                tempOut[i*numberToAccept+j] += blas_function_for_dotProduct(KK, A+i*K + kk, 1, B+theid*K + kk, 1);
            }
        }
    }

我正在处理的数字是:

M = 2048; N=10240; K=4096; nSelection=100;

所以我的想法是,如果我一点一点地解析矩阵(在 KK 的方向上,以 16 个浮点数 = 1 个缓存线的块),我将只能加载两个矩阵一次。也就是说,矩阵 A 是按顺序加载的,因此除了每行的第一次加载之外,所有其他加载都应该是命中的。矩阵 B 以随机顺序加载,但是因为我以 64 字节(16 个浮点数)的块来处理它,所以它应该需要 640KB。我有 6 MB L1,所以如果 CPU 使用 LRU,它应该留在那里。

我使用 valgrind 查看缓存未命中,这就是我得到的结果:

==3264== D   refs:      2,383,524,642  (2,272,927,073 rd   + 110,597,569 wr)
==3264== D1  misses:      114,096,428  (  113,982,278 rd   +     114,150 wr)
==3264== LLd misses:       95,822,173  (   95,736,938 rd   +      85,235 wr)
==3264== D1  miss rate:           4.7% (          5.0%     +         0.1%  )
==3264== LLd miss rate:           4.0% (          4.2%     +         0.0%  )

如果访问是可预测的(计数),我也会得到相同的结果。

我得到与 N=512 相同的结果。但在 N=256 时,我突然获得缓存命中(随机访问):

==16546== D   refs:      2,383,525,914  (2,272,928,002 rd   + 110,597,912 wr)
==16546== D1  misses:      114,096,557  (  113,982,392 rd   +     114,165 wr)
==16546== LLd misses:        1,372,862  (    1,287,624 rd   +      85,238 wr)
==16546== D1  miss rate:           4.7% (          5.0%     +         0.1%  )
==16546== LLd miss rate:           0.0% (          0.0%     +         0.0%  )

问题是我的移动核心 i7 上有 6MB 缓存。而 512 * 16 * 大小的浮点数为 23 KB。那么为什么我会错过这么多呢? (我昨晚写了大部分,今天我找到了答案。

【问题讨论】:

    标签: caching matrix cpu multiplication sparse-matrix


    【解决方案1】:

    它是缓存的关联性。我的 l3 是 12 路关联的,我还没有计算过,但是将 K 更改为 4*1024+16 让我一路命中!

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2011-08-23
      • 2017-12-03
      相关资源
      最近更新 更多