我遇到了this个很棒的youtube教程,在其中一张幻灯片中,我看到了一些我不了解的内容。为什么会这样呢?这个编译器有关系吗?
版本1看起来像这样:
const int N = 5000;
float a [N*N];
for (int x=0; x<n; ++x)
for(int y=0; y<N; ++y)
sum+=a[x+y*N];
大约需要239.4毫秒才能执行。
版本2看起来像这样:
const int N = 5000;
float a [N*N];
for (int y=0; y<n; ++y)
for(int x=0; x<N; ++x)
sum+=a[x+y*N];
大约需要79.5毫秒来执行。 为什么会这样?
答案 0 :(得分:5)
第二个示例展示了更好的数据局部性,因为它访问同一行中的元素。基本上,它执行顺序的内存读取,而第一个示例在每次迭代时都跳过sizeof(float) * N
个字节,这给CPU缓存/内存带来了更多压力。