【发布时间】: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