国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表

圖片精選

主站蜘蛛池模板: 东山县| 铜山县| 格尔木市| 兴隆县| 尤溪县| 铜山县| 汕尾市| 台东县| 京山县| 柞水县| 嘉义县| 大丰市| 广东省| 中阳县| 新竹市| 呼图壁县| 迁西县| 许昌市| 紫云| 北流市| 蚌埠市| 正宁县| 苏州市| 黄陵县| 桂东县| 玛多县| 清苑县| 集安市| 正蓝旗| 云林县| 隆尧县| 澜沧| 张家界市| 陆良县| 资溪县| 且末县| 泰兴市| 淄博市| 奉新县| 布拖县| 潮安县|