【问题标题】:Improving cache hit rate [closed]提高缓存命中率[关闭]
【发布时间】:2017-09-15 01:57:47
【问题描述】:

嘿,我有一个用c 编写的函数,我必须改进它的缓存性能。统计数据由cachegrind 提供。但是我完全被卡住了,性能提升不能超过 10%。我真的需要这方面的帮助。

函数如下:

#define LARGER  50000

typedef struct { 
    char c1;
    double f1;
    int n1; 
    char c2;
    int n2;
    double f2; 
} data; 

char* func()
{
    data* B = (data*) calloc(LARGER, sizeof(data));
    if (!B) return 0;

    double sum_f = 0.0;
    double sum_n = 0;
    char* sum_c = (char*) malloc(( 2 * LARGER + 1) * sizeof(char));

    sum_c[2 * LARGER] = '\0';

    int i;
    for(i = 0; i < LARGER; i++)
    {
        sum_f += B[i].f1 + B[i].f2;
        sum_n += B[i].n1 + B[i].n2;
        sum_c[2 * i] = B[i].c1;
        sum_c[2 * i + 1] = B[i].c2;
    }

    free(B);
    return sum_c;
}

我注意到的第一件事是struct data 的定义对缓存不是很友好,因为它有大量的填充。

所以,我根据对齐要求将定义更改为 -

typedef struct {
    int n1;
    int n2;
    double f1;
    double f2;
    char c1;
    char c2;
} data_new;

但这仅使我的缓存性能提高了 10% 左右。我不知道如何修改 for 循环以进一步提高空间局部性。

谁能指导我如何编写更好的缓存友好循环。

附:作为我自学计算机体系结构书籍的一部分,我正在做这些问题,我没有寻求帮助的导师。

【问题讨论】:

  • 我们不是代码审查网站。 阅读代码审查的常见问题解答如果您的代码是正确的,它可能是他们的候选者。但是您应该明确提供更多信息,市场上有很多非常不同的 CPU。
  • @Olaf 会帮助 /proc/cpuinfo 吗?此外,我不期待 cpu 特定的答案。只是关于如何提高此类循环的缓存性能的一般指南。
  • 不在这里也不够。抱歉,还是太宽泛了。请理解。
  • 好的。将在 codereview 上重新发布。
  • 我投票决定将此问题作为题外话结束,因为功能代码的审查对于 Stack Overflow 来说是题外话。您的问题可能是Code Review 的主题。

标签: c caching cpu-architecture


【解决方案1】:

对于发布的代码; CPU 将按升序读取高速缓存行,并按升序写入高速缓存行。没有比这更好(对缓存更友好)的访问模式了(部分原因在于 CPU 的“硬件预取器”)。

您唯一能做的其他事情就是减小数据的大小(但我不知道如何)。

还有一些改进代码的方法(clflush,SIMD)不会对缓存未命中率产生任何影响。

【讨论】:

    猜你喜欢
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2015-02-24
    • 2013-03-27
    相关资源
    最近更新 更多