アンアライン メモリ アクセスをサポートしない組み込みデバイスを使用しています。
ビデオ デコーダーの場合、8x8 ピクセル ブロックでピクセル (1 ピクセルあたり 1 バイト) を処理する必要があります。このデバイスには、4 バイトを並行して処理できる SIMD 処理機能がいくつかあります。
問題は、8x8 ピクセル ブロックがアラインされたアドレスで始まることが保証されておらず、関数がこれらの 8x8 ブロックのうち最大 3 つを読み書きする必要があることです。
非常に優れたパフォーマンスが必要な場合、これにどのようにアプローチしますか? いろいろ考えた結果、以下の3つが思い浮かびました。
すべてのメモリ アクセスをバイトとして実行します。これは最も簡単な方法ですが、速度が遅く、SIMD 機能ではうまく機能しません (参照用の C コードで現在行っている方法です)。
2 つの 32 ビット読み取りを介してピクセル データをロードし、ビットを正しい位置にシフトし、スクラッチ メモリの整列されたチャンクにデータを書き込む 4 つのコピー関数 (アライメント ケースごとに 1 つ) を記述します。ビデオ処理関数は、32 ビット アクセスと SIMD を使用できます。欠点: CPU は、処理の背後にあるメモリ レイテンシを隠すことができません。
上記と同じ考え方ですが、ピクセルをスクラッチ メモリに書き込む代わりに、その場でビデオ処理を行います。これは最速の方法かもしれませんが、このアプローチのために作成する必要がある関数の数は多くなります (約 60 と推測されます)。
ところで: SIMD 拡張に関しては、コンパイラーが恐ろしいコードを生成するため、すべての関数をアセンブラーで作成する必要があります。
あなたはどちらの道を選びますか、それとも別のアプローチ方法がありますか?