我一直在试图理解如何编写cache-friendly代码。因此,作为第一步,我尝试了解数组行主要访问和列主要访问之间的性能差异。
于是我创建了一个大小为512×512的整数数组,总大小为1MB。我的L1缓存为32KB,L2缓存为256KB,L3缓存为3MB。所以我的数组适合放在L3缓存中。
我简单地计算了按行和按列访问数组元素的总和,并比较了它们的速度。所有时间里,按列访问速度略快。我原本期望按行访问比另一个(可能快几倍)更快。
我认为问题可能是由于数组大小太小,因此我创建了另一个大小为8192×8192(256 MB)的数组。但结果仍然相同。
以下是我使用的代码片段:
#include "time.h"
#include <stdio.h>
#define S 512
#define M S
#define N S
int main() {
// Summing in the row major order
int x = 0;
int iter = 25000;
int i, j;
int k[M][N];
int sum = 0;
clock_t start, end;
start = clock();
while(x < iter) {
for (i = 0; i < M; i++) {
for(j = 0; j < N; j++) {
sum += k[i][j];
}
}
x++;
}
end = clock();
printf("%i\n", end-start);
// Summing in the column major order
x = 0;
sum = 0;
int h[M][N];
start = clock();
while(x < iter) {
for (j = 0; j < N; j++) {
for(i = 0; i < M; i++){
sum += k[i][j];
}
}
x++;
}
end = clock();
printf("%i\n", end-start);
}
问题:有人能告诉我我的错误是什么以及为什么会得到这个结果吗?
printf
语句来确保编译器不会优化未使用的部分。由于您的“矩阵”未初始化、被汇总且未使用,它们可能被优化掉了? - nonsensickle