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;