当前位置:  开发笔记 > 编程语言 > 正文

为什么逐列复制2D数组比C中的逐行复制?

如何解决《为什么逐列复制2D数组比C中的逐行复制?》经验,为你挑选了1个好方法。

它几乎归结为这个图像(来源):

在此输入图像描述

访问数据时,CPU不仅会加载单个值,还会将相邻数据加载到CPU的L1缓存中.在逐行迭代数组时,自动加载到缓存中的项实际上是接下来处理的项.但是,当您按列进行迭代时,每次加载整个"缓存行"数据(每个CPU的大小不同)时,只使用一个项目,然后必须加载下一行,从而有效地使缓存无意义.

在维基百科的条目和,作为一个高层次的概述,这PDF应该帮助你了解CPU的缓存是如何工作的.

编辑:评论中的chqrlie当然是正确的.这里的一个相关因素是,只有极少数列同时适合L1缓存.如果您的行要小得多(比如,二维数组的总大小只有几千字节),那么您可能看不到迭代每列的性能影响.



1> fresskoma..:

它几乎归结为这个图像(来源):

在此输入图像描述

访问数据时,CPU不仅会加载单个值,还会将相邻数据加载到CPU的L1缓存中.在逐行迭代数组时,自动加载到缓存中的项实际上是接下来处理的项.但是,当您按列进行迭代时,每次加载整个"缓存行"数据(每个CPU的大小不同)时,只使用一个项目,然后必须加载下一行,从而有效地使缓存无意义.

在维基百科的条目和,作为一个高层次的概述,这PDF应该帮助你了解CPU的缓存是如何工作的.

编辑:评论中的chqrlie当然是正确的.这里的一个相关因素是,只有极少数列同时适合L1缓存.如果您的行要小得多(比如,二维数组的总大小只有几千字节),那么您可能看不到迭代每列的性能影响.


这是正确的解释,但您需要解释为什么数据重新加载多次,因为行数和列数使得数据不适合L1高速缓存.
@ user3711976,因为缓存对齐问题 - http://stackoverflow.com/questions/11413855/why-is-transposing-a-matrix-of-512x512-much-slower-than-transposing-a-matrix-of
推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有