1

インターレース Web カメラ YUYV をグレーに変換する次の C コードがあります。

void convert_yuyv_to_y(const void *src, char *dest) {
    int x, y;
    char *Y, *gray;
    //get only Y component for grayscale from (Y1)(U1,2)(Y2)(V1,2)
    for (y = 0; y < CAM_HEIGHT; y++) {
        Y = src + (CAM_WIDTH * 2 * y);
        gray = dest + (CAM_WIDTH * y);
        for (x=0; x < CAM_WIDTH; x += 2) {
            gray[x] = *Y;
            Y += 2;
            gray[x + 1] = *Y;
            Y += 2;
        }
    }
}

いくつかのネオン命令でそのような機能を最適化する方法はありますか?

4

2 に答える 2

1

(私のコメントを回答に昇格させる)

NEON アーキテクチャでデータのインターリーブを解除するための命令の最小量は、次のシーケンスで実現できます。

vld2.8 { d0, d1 }, [r0]!
vst1.8 { d0 }, [r1]!

r0これはソース ポインターで、毎回 16 ずつ進み、デスティネーション ポインターは 8 ずつ進みますr1

ループのアンローリング、最大 4 つのレジスターを取得し、レジスターを 2 つオフセットする機能により、最大スループットをわずかに大きくすることができます。16 バイトのアラインメントと組み合わせると、次のようになります。

start:
vld4.8 { d0, d1, d2, d3 }, [r0:256]
subs r3, r3, #1
vld4.8 { d4, d5, d6, d7 }, [r1:256]
add r0, r0, #64
add r1, r0, #64
vst2.8 { d0, d2 }, [r2:256]!
vst2.8 { d4, d6 }, [r2:128]!
bgt start

(フォーマットが存在するかどうか思い出せませんvstx.y {regs}, [rx, ro]-- ここで ro はオフセット レジスタであり、rx をポストインクリメントします)

メモリ転送の最適化は便利ですが、すべてをスキップしたり、何らかの計算とマージしたりできるかどうかを検討することをお勧めします。また、これは、コピー タスクを完全に回避できる平面ピクセル形式を検討する場所になる可能性があります。

于 2013-10-29T05:09:34.893 に答える