第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的程序在完全循環(huán)8192個元素時會變慢?

為什么我的程序在完全循環(huán)8192個元素時會變慢?

胡說叔叔 2019-08-05 16:45:49
為什么我的程序在完全循環(huán)8192個元素時會變慢?以下是相關(guān)程序的摘錄。矩陣img[][]的大小為SIZE×SIZE,并在以下位置初始化:img[j][i] = 2 * j + i然后,你創(chuàng)建一個矩陣res[][],這里的每個字段都是img矩陣中它周圍9個字段的平均值。為簡單起見,邊框保留為0。for(i=1;i<SIZE-1;i++)      for(j=1;j<SIZE-1;j++) {         res[j][i]=0;         for(k=-1;k<2;k++)              for(l=-1;l<2;l++)                  res[j][i] += img[j+l][i+k];         res[j][i] /= 9;}這就是該計劃的全部內(nèi)容。為了完整起見,以下是之前的內(nèi)容。沒有代碼。如您所見,它只是初始化。#define SIZE 8192float img[SIZE][SIZE]; // input imagefloat res[SIZE][SIZE]; //result of mean filterint i,j,k,l;for(i=0;i<SIZE;i++)      for(j=0;j<SIZE;j++)          img[j][i] = (2*j+i)%8196;基本上,當(dāng)SIZE是2048的倍數(shù)時,此程序很慢,例如執(zhí)行時間:SIZE = 8191: 3.44 secs SIZE = 8192: 7.20 secs SIZE = 8193: 3.18 secs編譯器是GCC。據(jù)我所知,這是因為內(nèi)存管理,但我對這個主題并不太了解,這就是我在這里問的原因。另外如何解決這個問題會很好,但如果有人能解釋這些執(zhí)行時間,我已經(jīng)足夠開心了。我已經(jīng)知道m(xù)alloc / free了,但問題不在于使用的內(nèi)存量,它只是執(zhí)行時間,所以我不知道這會有多大幫助。
查看完整描述

2 回答

?
開心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗 獲得超13個贊

差異是由以下相關(guān)問題引起的相同超對齊問題引起的:

但那只是因為代碼還有另外一個問題。

從原始循環(huán)開始:

for(i=1;i<SIZE-1;i++) 
    for(j=1;j<SIZE-1;j++) {
        res[j][i]=0;
        for(k=-1;k<2;k++) 
            for(l=-1;l<2;l++) 
                res[j][i] += img[j+l][i+k];
        res[j][i] /= 9;}

首先注意兩個內(nèi)環(huán)是微不足道的。它們可以按如下方式展開:

for(i=1;i<SIZE-1;i++) {
    for(j=1;j<SIZE-1;j++) {
        res[j][i]=0;
        res[j][i] += img[j-1][i-1];
        res[j][i] += img[j  ][i-1];
        res[j][i] += img[j+1][i-1];
        res[j][i] += img[j-1][i  ];
        res[j][i] += img[j  ][i  ];
        res[j][i] += img[j+1][i  ];
        res[j][i] += img[j-1][i+1];
        res[j][i] += img[j  ][i+1];
        res[j][i] += img[j+1][i+1];
        res[j][i] /= 9;
    }}

這樣就留下了我們感興趣的兩個外環(huán)。

現(xiàn)在我們可以看到問題在這個問題中是一樣的:為什么在迭代2D數(shù)組時,循環(huán)的順序會影響性能?

您是按列而不是按行迭代矩陣。


要解決此問題,您應(yīng)該交換兩個循環(huán)。

for(j=1;j<SIZE-1;j++) {
    for(i=1;i<SIZE-1;i++) {
        res[j][i]=0;
        res[j][i] += img[j-1][i-1];
        res[j][i] += img[j  ][i-1];
        res[j][i] += img[j+1][i-1];
        res[j][i] += img[j-1][i  ];
        res[j][i] += img[j  ][i  ];
        res[j][i] += img[j+1][i  ];
        res[j][i] += img[j-1][i+1];
        res[j][i] += img[j  ][i+1];
        res[j][i] += img[j+1][i+1];
        res[j][i] /= 9;
    }}

這完全消除了所有非順序訪問,因此您不再在大功率二次上獲得隨機減速。


酷睿i7 920 @ 3.5 GHz

原始代碼:

8191: 1.499 seconds8192: 2.122 seconds8193: 1.582 seconds

互換的外循環(huán):

8191: 0.376 seconds8192: 0.357 seconds8193: 0.351 seconds


查看完整回答
反對 回復(fù) 2019-08-05
  • 2 回答
  • 0 關(guān)注
  • 776 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號