Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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+;+;)_C++ - Fatal编程技术网

C++ 哪个有更好的内存访问?(C+;+;)

C++ 哪个有更好的内存访问?(C+;+;),c++,C++,哪个版本更高效,为什么? 似乎两者的计算方法相同。我能想到的唯一一件事是,如果编译器认识到(a)j中的值不会改变,并且不必反复计算它。 任何输入都将是伟大的 #define M /* some mildly large number */ double a[M*M], x[M], c[M]; int i, j; (a) First version for (j = 0; j < M; j++) for (i = 0; i < M; i++) c[j] +=

哪个版本更高效,为什么? 似乎两者的计算方法相同。我能想到的唯一一件事是,如果编译器认识到(a)
j
中的值不会改变,并且不必反复计算它。 任何输入都将是伟大的

#define M /* some mildly large number */
double a[M*M], x[M], c[M];
int i, j;

(a) First version
for (j = 0; j < M; j++)
    for (i = 0; i < M; i++)
        c[j] += a[i+j*M]*x[i];

(b) Second version
for (i = 0; i < M; i++)
    for (j = 0; j < M; j++)
        c[j] += a[i+j*M]*x[i];
#定义M/*一些稍大的数字*/
双a[M*M],x[M],c[M];
int i,j;
(a) 第一版
对于(j=0;j
这是关于内存访问模式,而不是计算效率。一般来说,(a)的速度更快,因为它以单位步长访问内存,这比(b)的缓存效率要高得多,后者的步长为
M
。在(a)的情况下,每个缓存线都被充分利用,而在(b)的情况下,在逐出之前,每个缓存线可能只使用一个数组元素


尽管如此,一些编译器可以执行循环重新排序优化,因此在实践中,如果发生这种情况,您可能看不到任何差异。一如既往,您应该对代码进行基准测试/评测,而不仅仅是猜测。

这是关于内存访问模式,而不是计算效率。一般来说,(a)的速度更快,因为它以单位步长访问内存,这比(b)的缓存效率要高得多,后者的步长为
M
。在(a)的情况下,每个缓存线都被充分利用,而在(b)的情况下,在逐出之前,每个缓存线可能只使用一个数组元素


尽管如此,一些编译器可以执行循环重新排序优化,因此在实践中,如果发生这种情况,您可能看不到任何差异。和往常一样,您应该对代码进行基准测试/评测,而不仅仅是猜测。

通过在目标计算机上测量代码来找出答案。@PaulR:好的,那么我建议测量代码是有意义的:)@Samu:如果您不知道原因,那你就不知道这是真的了。@PaulR:下一盘好棋怎么样?另外:在目标计算机上测量一下就知道了。@PaulR:好吧-我的建议很有道理:)@Samu:如果你不知道为什么,那你就不知道这是真的。@PaulR:下一盘好棋怎么样?还有:我从来没有单位步幅的头。我现在正在维基百科上读到这方面的信息。谢谢你的回答:)“单位步幅”在这个上下文中实际上只是“顺序”或“连续”的意思。@Samu:字面意思是“一次一步”。这就像你在超市过道上按顺序拣东西,而不是从货架1上拿东西,然后走下去从货架10上拿东西,然后走回货架2,然后走到货架11。。。在这个类比中,你的计算机实际上从货架1-10上拣起了所有东西,这是基于这样一个假设,即你可以在不走任何路的情况下拣任何你想要的东西!现在它必须从1-10架上取下所有的东西,然后从11-20架上取下所有的东西,然后再从1-10架上取下所有的东西……我从来没当过单位负责人。我现在正在维基百科上读到这方面的信息。谢谢你的回答:)“单位步幅”在这个上下文中实际上只是“顺序”或“连续”的意思。@Samu:字面意思是“一次一步”。这就像你在超市过道上按顺序拣东西,而不是从货架1上拿东西,然后走下去从货架10上拿东西,然后走回货架2,然后走到货架11。。。在这个类比中,你的计算机实际上从货架1-10上拣起了所有东西,这是基于这样一个假设,即你可以在不走任何路的情况下拣任何你想要的东西!现在它必须从1-10架上取货,然后从11-20架上取货,然后再从1-10架上取货。。。