a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C中實現矩陣乘法的一種高效的方法

2020-01-26 16:18:01
字體:
來源:轉載
供稿:網友

如何計算矩陣乘法,這個大家都知道。通常情況下,我們都是用以下代碼實現的

復制代碼 代碼如下:

for(i=0;i<n;++i)
    for(j=0;j<n;++j){
        sum=0;
        for(k=0;k<n;++k)
            sum+=A[i][k]*B[k][j];
        C[i][j]+=sum;
}

但是考慮了高速緩存的問題后,其實有一種更好的實現方式:
復制代碼 代碼如下:


for(i=0;i<n;++i)
    for(k=0;k<n;++k){
        r=A[i][k];
        for(j=0;j<n;++j)
            C[i][j]+=r*B[k][j];
}



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

那為什么會如此呢?

那是因為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。訪問內存卻要上百個時鐘周期,孰快孰慢,很清楚了吧?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 欧美一区在线观看视频 | 国产日韩精品在线观看 | 在线观看免费视频91 | 亚洲嫩草 | 青青草欧美 | 国产精品久久久av | 午夜精品久久久久久久蜜桃app | 久久精品欧美 | www.亚洲一区二区 | 欧美精品在线观看免费 | 色哟哟在线观看 | 久久久久久国产 | 国产综合精品一区二区三区 | 久久精品美女视频 | 天天操天天插 | 久久国产精品成人免费观看的软件 | 久久中文视频 | 欧美高清一区二区 | 国产一区二区三区在线视频 | 成人av网站免费观看 | 精品一区免费 | 天堂在线精品视频 | 精品国产乱码久久久久久1区2区 | 欧美日韩高清在线观看 | 国产视频一区二区 | 日韩大尺度电影在线观看 | 蜜桃久久久久久久 | 免费黄色小片 | 黄色网址网站 | 欧美精品在线免费观看 | 日本a视频 | 91九色视频在线 | 亚洲一区在线播放 | 日韩一区二区三区在线 | 久久久久久久国产精品 | 精品在线一区二区三区 | 久久久久久久久久97 | 草草网址 | gogo熟少妇大胆尺寸 | 黄色一级免费看 | 极品美女av在线 |