ループ内で、一種のクリッピングを実装する必要があります
if ( isLast )
{
val = ( val < 0 ) ? 0 : val;
val = ( val > 255 ) ? 255 : val;
}
ただし、この「クリッピング」は、 Neon でのループの実行時間のほぼ半分を占めます。これは、ループ全体がどのように見えるかです-
for (row = 0; row < height; row++)
{
for (col = 0; col < width; col++)
{
Int sum;
//...Calculate the sum
Short val = ( sum + offset ) >> shift;
if ( isLast )
{
val = ( val < 0 ) ? 0 : val;
val = ( val > 255 ) ? 255 : val;
}
dst[col] = val;
}
}
これは、クリッピングがNeonでどのように実装されているかです。
cmp %10,#1 //if(isLast)
bne 3f
vmov.i32 %4, d4[0] //put val in %4
cmp %4,#0 //if( val < 0 )
blt 4f
b 5f
4:
mov %4,#0
vmov.i32 d4[0],%4
5:
cmp %4,%11 //if( val > maxVal )
bgt 6f
b 3f
6:
mov %4,%11
vmov.i32 d4[0],%4
3:
これは、レジスタへの変数のマッピングです-
isLast- %10
maxVal- %11
より速くするための提案はありますか?ありがとう
編集-
クリッピングは次のようになります-
"cmp %10,#1 \n\t"//if(isLast)
"bne 3f \n\t"
"vmin.s32 d4,d4,d13 \n\t"
"vmax.s32 d4,d4,d12 \n\t"
"3: \n\t"
//d13 contains maxVal(255)
//d12 contains 0
コードのこの部分の消費時間は 223 ミリ秒から18 ミリ秒に短縮されました