Я пытаюсь написать оптимизированный код для доступа к пикселям изображения, и мне нужно сделать цикл for очень быстрым, не опускаясь до уровня сборки.Более того, индексация выполняется по строкам, чтобы минимизировать потери в кеше.
Вот что у меня есть:
for (indr=0;indr<(height-1)*width;indr+=width) {
for (indc=0;indc<width;indc++){
I[indr+indc]= dostuff ;
}
}
Я не могу сделать это одним циклом, потому что "dostuff" включает в себя элементы доступакоторые не находятся в одной строке.
Есть ли более быстрый способ сделать это?
EDIT Хорошо, потому что мой предыдущий пост был немного неясным, я добавляю сюда полный код,Это довольно нечитаемо, но общая идея заключается в том, что я выполняю свертку с простой коробкой, используя целостное изображение.Изображение сначала дополняется нулями 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".Петля вялая.