이미지 픽셀에 액세스하는 데 최적화 된 코드를 작성하려고 시도 중이므로 어셈블리 수준으로 내려 가지 않고 for 루프를 빠르게 처리해야합니다. 더 나아가 인덱싱은 행을 따라 수행되어 캐시 누락을 최소화합니다. 은 "dostuff는"같은 행에이 arent 요소를 액세스 포함되어 있기 때문에C에서 절대적으로 가장 빠른 for 루프는 무엇입니까?
가for (indr=0;indr<(height-1)*width;indr+=width) {
for (indc=0;indc<width;indc++){
I[indr+indc]= dostuff ;
}
}
나는 그것을 하나의 루프를 만들 캔트 :
이 내가 가진 것입니다.
더 빠른 방법이 있나요?
편집 내 이전 게시물이 약간 불분명하기 때문에 여기에 전체 코드를 추가하십시오. 꽤 읽을 수는 없지만 일반적인 아이디어는 Im이 완전한 이미지를 사용하여 간단한 상자로 컨볼 루션을 수행한다는 것입니다. 이미지의 왼쪽과 아래쪽에 ws + 1이 채워지고 오른쪽과 상단에는 ws가 0으로 채워집니다. 그런 다음 그것은 적분 영상 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