【问题标题】:Locality of function功能的局部性
【发布时间】:2019-07-27 17:41:05
【问题描述】:

这个函数相对于数组 a 是否具有良好的局部性?如果数组大小比缓存大 10 倍,则通过计算平均未命中率和命中率来证明您的答案。

int sum_array_cols(int a[M][N])
{
    int i, j, sum = 0;
    for (j = 0; j < N; j++)
        for (i = 0; i < M; i++)
            sum += a[i][j];
    return sum;
}

【问题讨论】:

    标签: caching optimization memory


    【解决方案1】:

    可能不会。

    在内部循环中,您递增i 会导致访问由N*sizeof(int) 字节分隔的内存位置。缓存未命中率取决于常量 N 和缓存大小。大小(理解为sizeof a)可能对缓存有效性没有影响。

    此外,CPU 经常通过跟踪程序的内存访问模式来推测性地预取内存。因此,即使实际使用了一小部分缓存,也可能很少有缓存未命中。确切的答案必须涉及特定架构的基准测试。

    为了让事情更“有趣”,现在编译器会重新排序循环并自动改进局部性。因此,我认为没有足够的数据来为您的问题提供可靠的答案。

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多