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