我正在尝试编写优化的代码以访问图像像素,并且需要使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"部分。循环运行缓慢。