我試圖爲訪問圖像像素編寫優化的代碼,並且需要爲超級快速創建一個for循環,而不必進入彙編級。更進一步索引是沿着行進行的,以最小化緩存未命中。什麼是c中最快的循環?
這是我有:
for (indr=0;indr<(height-1)*width;indr+=width) {
for (indc=0;indc<width;indc++){
I[indr+indc]= dostuff ;
}
}
我不能讓一個循環,因爲「dostuff」包括訪問在同一行的arent元素。
有沒有更快的方法來做到這一點?
編輯 好了,因爲我以前的帖子稍微不清楚我在這裏加入了完整的代碼。它的相當不可讀,但總的想法是,我用一個完整的圖像與一個簡單的盒子進行卷積。圖像首先在左側和底部用ws + 1個零填充,右側和頂部用ws零填充。然後將它製成一個完整的圖像Ii。以下函數採用積分圖像,並提取結果Ic與原始圖像大小相同的卷積。
void convI(float *Ic,float *Ii,int ws, int width, int height)
{
int W=width+ws*2+1,indR;
int H=height+ws*2+1,indC;
int w=width, indr;
int h=height, indc;
int jmpA=W*(ws+1),jmpC=W*ws,jmpB=ws+1,jmpD=ws;
for (indR=W*(ws+1),indr=0;indr<width*(height-1);indR+=W,indr+=width) {
for (indC=ws+1,indc=0;indc<width;indC++,indc++){
//Performs I[indA]+I[indD]-I[indB]-I[indC];
Ic[indr+indc]=
Ii[indR-jmpA+indC-jmpB]+
Ii[indR+jmpC+indC+jmpD]-
Ii[indR+jmpC+indC-jmpB]-
Ii[indR-jmpA+indC+jmpD];
}
}
}
這就是「dostuff」部分。循環緩慢。
循環總是比訪問內存快。顯示你的「dostuff」代碼,或告訴我們它讀取的是什麼內存。 – BatchyX 2011-01-21 13:41:22