麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

圖片精選

主站蜘蛛池模板: 国产精品爆操 | 美女很黄很黄免费的 | 日本aaaa片毛片免费观蜜桃 | 国内精品伊人久久久久网站 | 99在线免费观看视频 | 欧美日韩免费一区 | 成人在线视频网 | 国产一级毛片高清视频完整版 | 黄色大片网 | 视频久久免费 | 在线成人免费观看www | 99re久久最新地址获取 | 亚洲福利视 | 一区二区三区日韩 | 国产精品视频一区二区三区四区国 | 亚洲精品 在线播放 | 中文有码一区二区 | 中文字幕在线观看1 | 欧美成人黄色小视频 | 中文字幕视频在线播放 | 欧美福利视频一区二区 | 黑人操穴 | 欧美大电影免费观看 | 在线91视频 | 国产一区毛片 | 毛片在线免费观看完整版 | 成人午夜视频免费在线观看 | 免费在线观看毛片视频 | 国产高潮好爽受不了了夜色 | 免费黄色欧美视频 | 在线成人精品视频 | 久久久一区二区三区精品 | 免费播放欧美毛片 | 女人裸体让男人桶全过程 | h视频在线免费看 | 福利在线小视频 | 精品一区二区在线播放 | 草碰人人 | 九草在线 | 成人午夜免费在线视频 | 国产成人精品一区二区仙踪林 |