為什么我的程序在完全循環(huán)8192個(gè)元素時(shí)會(huì)變慢?以下是相關(guān)程序的摘錄。矩陣img[][]的大小為SIZE×SIZE,并在以下位置初始化:img[j][i] = 2 * j + i然后,你創(chuàng)建一個(gè)矩陣res[][],這里的每個(gè)字段都是img矩陣中它周圍9個(gè)字段的平均值。為簡單起見,邊框保留為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;}這就是該計(jì)劃的全部內(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ù)時(shí),此程序很慢,例如執(zhí)行時(shí)間:SIZE = 8191: 3.44 secs
SIZE = 8192: 7.20 secs
SIZE = 8193: 3.18 secs編譯器是GCC。據(jù)我所知,這是因?yàn)閮?nèi)存管理,但我對(duì)這個(gè)主題并不太了解,這就是我在這里問的原因。另外如何解決這個(gè)問題會(huì)很好,但如果有人能解釋這些執(zhí)行時(shí)間,我已經(jīng)足夠開心了。我已經(jīng)知道m(xù)alloc / free了,但問題不在于使用的內(nèi)存量,它只是執(zhí)行時(shí)間,所以我不知道這會(huì)有多大幫助。
2 回答

開心每一天1111
TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
差異是由以下相關(guān)問題引起的相同超對(duì)齊問題引起的:
但那只是因?yàn)榇a還有另外一個(gè)問題。
從原始循環(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;}
首先注意兩個(gè)內(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; }}
這樣就留下了我們感興趣的兩個(gè)外環(huán)。
現(xiàn)在我們可以看到問題在這個(gè)問題中是一樣的:為什么在迭代2D數(shù)組時(shí),循環(huán)的順序會(huì)影響性能?
您是按列而不是按行迭代矩陣。
要解決此問題,您應(yīng)該交換兩個(gè)循環(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; }}
這完全消除了所有非順序訪問,因此您不再在大功率二次上獲得隨機(jī)減速。
酷睿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
- 2 回答
- 0 關(guān)注
- 787 瀏覽
添加回答
舉報(bào)
0/150
提交
取消