本节书摘来自华章计算机《高性能科学与工程计算》一书中的第3章,第3.2节,作者:(德)Georg Hager Gerhard Wellein 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.2 存储顺序
多维数组、矩阵或者类矩阵结构(最重要),在科学计算中无处不在。数据访问是一个关键的问题:标准计算机所固有的一维、基于cache行的内存布局和任何多维数据结构间的映射必须与数据读取与存储的顺序相匹配,这样才能充分利用空间和时间局部性。一维数组的非连续访存会减少空间局部性,从而导致访存带宽利用率的低效(见习题3.1)。当处理多维数组时,这些访存模式可以很自然地产生。
https://yqfile.alicdn.com/deee056f0c677b77e33166ab7f05e0460cd801a4.png" >
上面的Fortran和C代码示例执行相同的任务,数组的二维索引也都位于内层循环,但是两者的数据访存模式完全不同:Fortran代码的内存地址的访问跨度为N*sizeof(double),C代码的内存地址的访问跨度是最优的(访存跨度为1)。这是因为对于多维矩阵在C语言中是按行存储(见图3-3),而在Fortran语言中是按列存储(见图3-4)。这在进行数据访问优化时必须要牢记:当内层循环变量作为多维数组索引时,应该保证跨度为1的数据访问模式。3.4节将详细讨论如何实现。
https://yqfile.alicdn.com/b20eec88d0654cd708637ead524b8df712d70cd6.png" >