【发布时间】:2011-01-21 13:16:46
【问题描述】:
我正在尝试编写用于访问图像像素的优化代码,并且需要在不下降到汇编级别的情况下超快地创建一个 for 循环。此外,索引是沿行完成的,以最大限度地减少缓存未命中。
这就是我所拥有的:
for (indr=0;indr<(height-1)*width;indr+=width) {
for (indc=0;indc<width;indc++){
I[indr+indc]= dostuff ;
}
}
我不能让它成为一个循环,因为“dostuff”包括访问不在同一行上的元素。
有更快的方法吗?
编辑 好的,因为我之前的帖子有点不清楚,我在这里添加了完整的代码。它非常难以理解,但总体思路是我使用积分图像对一个简单的框进行卷积。图像首先在左侧和底部填充 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”代码,或告诉我们它读取的内存。