每天花一分鐘,學習編程的基本知識點

我們在編寫程序時,尤其是C語言的編程,都會考慮到程序的性能問題,我們知道CPU的頻率已經比較快了,比內存快的多,所以cpu從寄存器讀取數據的速度,要遠高於從內存讀取的速度,那麼今天,給大家分享一下,數組的讀取的方法。

我們知道,如果讀取的數據是一段連續的內存,那麼cpu緩存的命中率會比較高,如果讀取的數據分散在內存的各個地方,這時cpu的緩存的利用就不太好,就會發生緩存未命中的情況,下面舉個例子,來觀察一下,我們上學時,都學過矩陣的乘積,如下:

每天花一分鐘,學習編程的基本知識點

圖1

這個公式用C語言實現的話,比較簡單,如下圖所示:

每天花一分鐘,學習編程的基本知識點

圖2

如上圖所示,程序在訪問e[k][j]的數據時,其實是在訪問不連續的內存,這樣會大概率上導致緩存未命中的情況,訪問e[k][j]的方式如下所示:

每天花一分鐘,學習編程的基本知識點

圖3

為了充分的利用cpu的緩存,也就是能夠儘量訪問連續的內存來完成矩陣的乘積,所以必須得調整訪問數組的順序,能夠按照行來進行訪問,調整如下:

每天花一分鐘,學習編程的基本知識點

圖4

通過調整訪問數組的順序後,程序在訪問數組e的時候,就是訪問的是連續的內存,訪問如下圖所示:

每天花一分鐘,學習編程的基本知識點

圖5

有人會問,為什麼連續的內存,cpu的緩存的命中率會高,這是因為cpu的局部性原理決定的,當訪問內存中的數據時,如果發生了cpu的緩存未命中時,這時cpu就會去內存讀取數據,而此時,cpu為了高效的利用緩存,會將數據的鄰近的數據也會一起讀進緩存,這就是我為什麼強調,訪問數組時,儘量做到訪問連續的內存。

今天,就寫到這裡,謝謝。


分享到:


相關文章: