イメージピクセルにアクセスするための最適化されたコードを書き込もうとしています。アセンブリレベルまで下がることなく、forループを超高速にする必要があります。さらに、索引付けは行に沿って行われ、キャッシュミスを最小限に抑えます。cの中で絶対に最速のforループは何ですか?
これは私が持っているものです。
for (indr=0;indr<(height-1)*width;indr+=width) {
for (indc=0;indc<width;indc++){
I[indr+indc]= dostuff ;
}
}
「dostuffは」同じ行にアレントの要素にアクセスすることを含むので、私はそれ単一のループにするカント。
これを行うより速い方法がありますか?
EDIT 私の前の投稿がここでは完全なコードを追加しています。それはかなり読めませんが、一般的な考え方は、Imが積分画像を使って単純なボックスで畳み込みを実行することです。画像は、左と下に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