Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 提高缓存命中率_C_Caching_Cpu Architecture - Fatal编程技术网

C 提高缓存命中率

C 提高缓存命中率,c,caching,cpu-architecture,C,Caching,Cpu Architecture,嘿,我有一个用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 = (d

嘿,我有一个用
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;
}
但这只使缓存性能提高了10%左右。我不知道如何修改for循环以进一步改进空间局部性

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


另外,我做这些问题是我自学一本计算机体系结构书的一部分,我没有老师可以寻求帮助。

关于发布的代码;CPU将以升序读取缓存线,并以升序写入缓存线。没有比这更好(更方便缓存)的访问模式了(部分原因是CPU的“硬件预取器”)

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


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

我们不是代码审查站点。阅读代码审查的常见问题,如果您的代码是正确的,它可能是他们的候选者。但是你应该提供更多的信息,市场上有很多不同的CPU。@Olaf will/proc/cpuinfo帮助吗?此外,我并不期待cpu特定的答案。只是关于如何提高此类循环的缓存性能的一般指导原则。这还不够。对不起,还是太宽了。请理解,好的。将在codereview上重新发布。我投票以离题方式结束此问题,因为函数代码的评审因堆栈溢出而离题。你的问题可能是关于你的主题。
typedef struct {
    int n1;
    int n2;
    double f1;
    double f2;
    char c1;
    char c2;
} data_new;