我們在編寫程序時,尤其是C語言的編程,都會考慮到程序的性能問題,我們知道CPU的頻率已經比較快了,比內存快的多,所以cpu從寄存器讀取數據的速度,要遠高於從內存讀取的速度,那麼今天,給大家分享一下,數組的讀取的方法。
我們知道,如果讀取的數據是一段連續的內存,那麼cpu緩存的命中率會比較高,如果讀取的數據分散在內存的各個地方,這時cpu的緩存的利用就不太好,就會發生緩存未命中的情況,下面舉個例子,來觀察一下,我們上學時,都學過矩陣的乘積,如下:
這個公式用C語言實現的話,比較簡單,如下圖所示:
如上圖所示,程序在訪問e[k][j]的數據時,其實是在訪問不連續的內存,這樣會大概率上導致緩存未命中的情況,訪問e[k][j]的方式如下所示:
為了充分的利用cpu的緩存,也就是能夠儘量訪問連續的內存來完成矩陣的乘積,所以必須得調整訪問數組的順序,能夠按照行來進行訪問,調整如下:
通過調整訪問數組的順序後,程序在訪問數組e的時候,就是訪問的是連續的內存,訪問如下圖所示:
有人會問,為什麼連續的內存,cpu的緩存的命中率會高,這是因為cpu的局部性原理決定的,當訪問內存中的數據時,如果發生了cpu的緩存未命中時,這時cpu就會去內存讀取數據,而此時,cpu為了高效的利用緩存,會將數據的鄰近的數據也會一起讀進緩存,這就是我為什麼強調,訪問數組時,儘量做到訪問連續的內存。
今天,就寫到這裡,謝謝。
閱讀更多 防火牆達人 的文章