我们在编写程序时,尤其是C语言的编程,都会考虑到程序的性能问题,我们知道CPU的频率已经比较快了,比内存快的多,所以cpu从寄存器读取数据的速度,要远高于从内存读取的速度,那么今天,给大家分享一下,数组的读取的方法。
我们知道,如果读取的数据是一段连续的内存,那么cpu缓存的命中率会比较高,如果读取的数据分散在内存的各个地方,这时cpu的缓存的利用就不太好,就会发生缓存未命中的情况,下面举个例子,来观察一下,我们上学时,都学过矩阵的乘积,如下:
图1
这个公式用C语言实现的话,比较简单,如下图所示:
图2
如上图所示,程序在访问e[k][j]的数据时,其实是在访问不连续的内存,这样会大概率上导致缓存未命中的情况,访问e[k][j]的方式如下所示:
图3
为了充分的利用cpu的缓存,也就是能够尽量访问连续的内存来完成矩阵的乘积,所以必须得调整访问数组的顺序,能够按照行来进行访问,调整如下:
图4
通过调整访问数组的顺序后,程序在访问数组e的时候,就是访问的是连续的内存,访问如下图所示:
图5
有人会问,为什么连续的内存,cpu的缓存的命中率会高,这是因为cpu的局部性原理决定的,当访问内存中的数据时,如果发生了cpu的缓存未命中时,这时cpu就会去内存读取数据,而此时,cpu为了高效的利用缓存,会将数据的邻近的数据也会一起读进缓存,这就是我为什么强调,访问数组时,尽量做到访问连续的内存。
今天,就写到这里,谢谢。
留言与评论(共有 0 条评论) |