国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C中實(shí)現(xiàn)矩陣乘法的一種高效的方法

2020-01-26 16:18:01
字體:
供稿:網(wǎng)友

如何計(jì)算矩陣乘法,這個(gè)大家都知道。通常情況下,我們都是用以下代碼實(shí)現(xiàn)的

復(fù)制代碼 代碼如下:

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;
}

但是考慮了高速緩存的問題后,其實(shí)有一種更好的實(shí)現(xiàn)方式:
復(fù)制代碼 代碼如下:


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];
}



細(xì)看一番就會(huì)發(fā)現(xiàn)這兩種實(shí)現(xiàn)語義是等價(jià)的,但是后者的實(shí)際運(yùn)行效率卻比前者高。

那為什么會(huì)如此呢?

那是因?yàn)镃PU讀數(shù)據(jù)時(shí),并不是直接訪問內(nèi)存,而是先查看緩存中是否有數(shù)據(jù),有的話直接從緩存讀取。而從緩存讀取數(shù)據(jù)比從內(nèi)存讀數(shù)據(jù)快很多。

當(dāng)數(shù)據(jù)不在緩存中時(shí),CPU會(huì)將包含數(shù)據(jù)在內(nèi)的一個(gè)數(shù)據(jù)塊讀到緩存,如果程序具有良好空間局部性,那么第一次cache miss后,之后的幾次數(shù)據(jù)訪問就可以直接在緩存中完成。除了空間局部性(程序傾向于引用與當(dāng)前數(shù)據(jù)鄰近的數(shù)據(jù))之外,還有時(shí)間局部性(程序傾向于引用最近被引用過的數(shù)據(jù))。

回到矩陣乘法。(我們只考慮內(nèi)循環(huán))

前者對(duì)矩陣A,有良好的空間局部性,假設(shè)一次能緩存四個(gè)元素,則每次迭代對(duì)于A只有0.25次miss,但是對(duì)于B,則不然,因此B是按列訪問的,每次訪問都會(huì)miss,因此每次迭代總的miss數(shù)是1.25。

后者對(duì)于矩陣C和矩陣B都有良好的局部性,每次迭代都只有0.25詞miss,因此總的miss數(shù)是0.5。后者每次迭代多了一次存儲(chǔ)(對(duì)C[i][j]寫入),但是即便如此,后者的運(yùn)行效率也比前者高。

總而言之,要想程序跑得快,就要在程序中多利用局部性,讓緩存hold住你的數(shù)據(jù),減少訪存次數(shù)。要知道CPU可以在3個(gè)時(shí)鐘周期內(nèi)訪問到L1 cache,10個(gè)時(shí)鐘周期左右的時(shí)間訪問到L2 cache。訪問內(nèi)存卻要上百個(gè)時(shí)鐘周期,孰快孰慢,很清楚了吧?

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 柳州市| 卢龙县| 于田县| 鹤庆县| 五峰| 商洛市| 舞钢市| 双鸭山市| 莱州市| 修水县| 余姚市| 南江县| 高要市| 安庆市| 交口县| 尉氏县| 老河口市| 垫江县| 镇巴县| 永春县| 盐津县| 修水县| 长沙县| 新龙县| 普兰店市| 墨脱县| 玉溪市| 社会| 麻栗坡县| 同仁县| 汤阴县| 仙桃市| 绥宁县| 互助| 阿拉善盟| 天祝| 昌吉市| 邯郸市| 海淀区| 汽车| 耿马|