基於CPU訪存區域性性原理下的矩陣乘法實現

2022-01-26 04:09:03 字數 778 閱讀 9666

1

for(i=0;ii)

2for(j=0;jj)

3

1

for(i=0;ii)

2for(k=0;kk)

3

細看一番就會發現這兩種實現語義是等價的,但是後者的實際執行效率卻比前者高。

那為什麼會如此呢?

那是因為cpu讀資料時,並不是直接訪問記憶體,而是先檢視快取中是否有資料,有的話直接從快取讀取。而從快取讀取資料比從記憶體讀資料快很多。

當資料不在快取中時,cpu會將包含資料在內的乙個資料塊讀到快取,如果程式具有良好空間區域性性,那麼第一次cache miss後,之後的幾次資料訪問就可以直接在快取中完成。除了空間區域性性(程式傾向於引用與當前資料鄰近的資料)之外,還有時間區域性性(程式傾向於引用最近被引用過的資料)。

回到矩陣乘法。(我們只考慮內迴圈)

前者對矩陣a,有良好的空間區域性性,假設一次能快取四個元素,則每次迭代對於a只有0.25次miss,但是對於b,則不然,因此b是按列訪問的,每次訪問都會miss,因此每次迭代總的miss數是1.25。後者對於矩陣c和矩陣b都有良好的區域性性,每次迭代都只有0.25詞miss,因此總的miss數是0.5。後者每次迭代多了一次儲存(對c[i][j]寫入),但是即便如此,後者的執行效率也比前者高。 

總而言之,要想程式跑得快,就要在程式中多利用區域性性,讓快取hold住你的資料,減少訪存次數。要知道cpu可以在3個時鐘週期內訪問到l1 cache,10個時鐘週期左右的時間訪問到l2 cache。訪問記憶體卻要上百個時鐘週期,孰快孰慢,很清楚了吧?

程式訪問的區域性性原理

程式訪問的區域性性原理包括時間區域性性和空間區域性性。時間區域性性是指在最近的未來要用到的資訊,很可能是現在正在使用的資訊,因為程式中存在迴圈。空間區域性性是指在最近的未來要用到的資訊,很可能與現在正在使用的資訊在儲存空間上是連續的,因為指令通常是順序存放 順序執行的,資料一般也是以向量 陣列等形式...

什麼是快取的區域性性原理?

了解計算機的儲存結構,對我們編寫優秀的程式很有幫助,雖然計算機的內部對我們來說是透明的,但是如果我們能多了解一些計算機的執行機制,對我們編寫高效的程式大有好處。我們來看一下計算機的儲存結構 越接近cup的儲存器速度越快容量越小,越遠離cup的儲存器速度越慢容量越大。最高層的l0暫存器,cpu可以在1...

作業系統的區域性性原理

區域性性原理 乙個良好的電腦程式 常常具有良好的區域性性,也就是說,它們傾向於引用鄰近於其他最近引用過的資料項的資料項,或者最近引用過的資料項本身。區域性性的兩種不同的形式 時間區域性性和空間區域性性 時間區域性性是指如果程式中的某條指令一旦執行,則不久之後該指令可能再次被執行 如果某資料被訪問,則...