CでのARMネオンコンパイラの利点を利用して、画像のフィルタの畳み込みを最適化するガイドがありますか?私はすでにこれを従来のC言語で実装していますが、NEONをサポートしてARM上でより高速な画像処理を行うためにコードを時間最適化する必要があります。インターネットで利用可能なリソースは、CでNEONを使用してARMでアルゴリズムを実装する場合、非常に制限されます。NEONを使用してARMの畳み込み演算を最適化する
3x3フィルタに画像をコンボリューションする必要があります。私が推測する主な問題は、ループ制約が画像の3x3マトリックスにアクセスすることです。 NEON組み込み関数は、8バイトのデータを一度にロードするのに役立ちますが、3x3マトリックスにアクセスするには、これをどのように活用するのですか?上記のコメントでは、今、私はこのような3×3の画像行列にアクセスしてるために
、
for(i=1;i<width;i++) // i = rows
{
if(i!=1)
fseek(fp, 1078+(width*(i-1)), SEEK_SET);
for(j=1;j<height-1;j++) // j = columns
{
if(j!=1)
fseek(fp, 1077 + (i*width) + j , SEEK_SET);
for(k=0;k<9;k+=3)
{
data[k] = getc(fp);
data[k+1] = getc(fp);
data[k+2] = getc(fp);
//fread(buf, sizeof(char), width - 3, fp);
fseek(fp, width - 3, SEEK_CUR);
}
pixel = vld1_u8(&data);
pixel_last = data[8];
result = vmul_u8(kernel,pixel);
for(k=0;k<8;k++)
sum += result[k];
sum += pixel_last * kernel_last;
sum = sum/9;
sum = sum > 255 ? 255 : sum;
imageData[i*width + j]= sum;
}
}
、私がやったことです:https://codereview.stackexchange.com – Vagish
まず、あなたのフィルタリングコードからファイルI/Oを分離します。 1つの関数を使用して画像データをメモリ内のソースバッファに読み込み、フィルタリングルーチンを適用してソースバッファから読み込み、その出力を2番目のバッファに書き込むようにします。これにより、フィルタリングを実装するのがはるかに簡単になります。また、(より遅い)ファイルI/Oとは別に、最適化されたフィルタリングコードをベンチマークすることもできます。 –
'intrinsics'で読書を止めました。 –