每天花一分钟,学习编程的基本知识点

我们在编写程序时,尤其是C语言的编程,都会考虑到程序的性能问题,我们知道CPU的频率已经比较快了,比内存快的多,所以cpu从寄存器读取数据的速度,要远高于从内存读取的速度,那么今天,给大家分享一下,数组的读取的方法。

我们知道,如果读取的数据是一段连续的内存,那么cpu缓存的命中率会比较高,如果读取的数据分散在内存的各个地方,这时cpu的缓存的利用就不太好,就会发生缓存未命中的情况,下面举个例子,来观察一下,我们上学时,都学过矩阵的乘积,如下:

每天花一分钟,学习编程的基本知识点

图1

这个公式用C语言实现的话,比较简单,如下图所示:

每天花一分钟,学习编程的基本知识点

图2

如上图所示,程序在访问e[k][j]的数据时,其实是在访问不连续的内存,这样会大概率上导致缓存未命中的情况,访问e[k][j]的方式如下所示:

每天花一分钟,学习编程的基本知识点

图3

为了充分的利用cpu的缓存,也就是能够尽量访问连续的内存来完成矩阵的乘积,所以必须得调整访问数组的顺序,能够按照行来进行访问,调整如下:

每天花一分钟,学习编程的基本知识点

图4

通过调整访问数组的顺序后,程序在访问数组e的时候,就是访问的是连续的内存,访问如下图所示:

每天花一分钟,学习编程的基本知识点

图5

有人会问,为什么连续的内存,cpu的缓存的命中率会高,这是因为cpu的局部性原理决定的,当访问内存中的数据时,如果发生了cpu的缓存未命中时,这时cpu就会去内存读取数据,而此时,cpu为了高效的利用缓存,会将数据的邻近的数据也会一起读进缓存,这就是我为什么强调,访问数组时,尽量做到访问连续的内存。

今天,就写到这里,谢谢。


分享到:


相關文章: