0

画像ブロックからデータの垂直線を読み取りたい、つまり、すべての行の最初のデータを取得したい (行の長さがブロックの幅に等しい)。

次のコードは良くないと思います。より良い実装はありますか?(r5にデータアドレス、r1にライン長)

vld1.u8     d3[0],  [r5],   r1
vld1.u8     d3[1],  [r5],   r1
vld1.u8     d3[2],  [r5],   r1
vld1.u8     d3[3],  [r5],   r1
vld1.u8     d3[4],  [r5],   r1
vld1.u8     d3[5],  [r5],   r1
vld1.u8     d3[6],  [r5],   r1
vld1.u8     d3[7],  [r5],   r1
vld1.u8     d4[0],  [r5],   r1
vld1.u8     d5[0],  [r5],   r1
vld1.u8     d5[1],  [r5],   r1    
vld1.u8     d5[2],  [r5],   r1
vld1.u8     d5[3],  [r5],   r1   
vld1.u8     d5[4],  [r5],   r1
vld1.u8     d5[5],  [r5],   r1    
vld1.u8     d5[6],  [r5],   r1
vld1.u8     d5[7],  [r5],   r1 
4

1 に答える 1

1

NEON は、最大 4 ストライドの非連続ロードのみを直接サポートします (n はストライド サイズである VLDn 命令を介して)。行の長さはおそらくそれよりもはるかに大きいため、コードコードのように各要素を個別にロードする以外に、必要なことを行う方法がわかりません。

ただし、この後処理ステップを最初の列だけでなくすべての列に適用する必要がある場合は個別に処理するのではなく、一度に 8 (または Q レジスタを使用する場合は 16) 列を処理できます。もちろん、それがどれほど実現可能かは、アルゴリズムによって異なります。

理想的には、チャンク サイズをさらに大きくして、1 つのキャッシュ ラインに収まるように多数の列を一度に処理します (要素サイズが 8 ビットの場合、ほとんどの ARM では 64)。そうしないと、イメージに多数の行がある場合、最初の行を含むキャッシュ ラインは、最後の行を処理するまでにキャッシュから削除され、次のチャンクを処理するために再フェッチする必要があります。列の。

于 2012-09-27T10:55:57.193 に答える