3

アンアライン メモリ アクセスをサポートしない組み込みデバイスを使用しています。

ビデオ デコーダーの場合、8x8 ピクセル ブロックでピクセル (1 ピクセルあたり 1 バイト) を処理する必要があります。このデバイスには、4 バイトを並行して処理できる SIMD 処理機能がいくつかあります。

問題は、8x8 ピクセル ブロックがアラインされたアドレスで始まることが保証されておらず、関数がこれらの 8x8 ブロックのうち最大 3 つを読み書きする必要があることです。

非常に優れたパフォーマンスが必要な場合、これにどのようにアプローチしますか? いろいろ考えた結果、以下の3つが思い浮かびました。

  1. すべてのメモリ アクセスをバイトとして実行します。これは最も簡単な方法ですが、速度が遅く、SIMD 機能ではうまく機能しません (参照用の C コードで現在行っている方法です)。

  2. 2 つの 32 ビット読み取りを介してピクセル データをロードし、ビットを正しい位置にシフトし、スクラッチ メモリの整列されたチャンクにデータを書き込む 4 つのコピー関数 (アライメント ケースごとに 1 つ) を記述します。ビデオ処理関数は、32 ビット アクセスと SIMD を使用できます。欠点: CPU は、処理の背後にあるメモリ レイテンシを隠すことができません。

  3. 上記と同じ考え方ですが、ピクセルをスクラッチ メモリに書き込む代わりに、その場でビデオ処理を行います。これは最速の方法かもしれませんが、このアプローチのために作成する必要がある関数の数は多くなります (約 60 と推測されます)。

ところで: SIMD 拡張に関しては、コンパイラーが恐ろしいコードを生成するため、すべての関数をアセンブラーで作成する必要があります。

あなたはどちらの道を選びますか、それとも別のアプローチ方法がありますか?

4

5 に答える 5

4

memcpy(可能であればワードコピーを実行するように最適化できることを思い出すと)を使用して、整列されたデータ構造(たとえば、スタックまたはから割り当てられたもの)にコピーできますmalloc。次に、その整列されたデータ構造に対して処理を実行します。

ただし、ほとんどの場合、メモリ内ではなく、プロセッサのレジスタ内で処理する必要があります。タスクにどのようにアプローチするかは、ハードウェアの機能によって異なります (たとえば、32 ビット レジスタを 4 つの 8 ビット レジスタに分割できますか? SIMD 演算はどのレジスタで動作しますか?) 単純なルートを使用する場合は、アラインされていない読み取りを実行する小さなローダー関数を呼び出すことができます。

于 2008-12-17T19:16:39.073 に答える
3

最初にデータを整列させてから、整列されたSIMDアプローチを採用します。

これはオプション3よりも作業が少なく、運が良ければ、コードは25%の確率で最高速度になります(つまり、すでに調整されている場合)。入力が適切に調整されることがわかっている状況では、将来、コードを喜んで再利用できます。

これが満足のいくように機能しない場合にのみ、4つのアライメントの可能性すべてを関数にハードコーディングすることを検討する必要があります。

于 2008-12-30T05:55:51.140 に答える
3

最初にコードをフェッチ/処理セクションに分割する必要があります。

フェッチ コードは作業バッファーにコピーする必要があり、整列されたメモリ (SIMD レジスタを使用してコピーできるはず) と、バイトごとにコピーする必要がある整列されていないメモリ (プラットフォームができる場合) の場合があります。アライメントされていないアクセスを行い、ソース/宛先のアライメントが異なる場合は、これが最善の方法です)。

処理コードは、整列されたデータでの作業を保証する SIMD にすることができます。実際の処理の程度に関係なく、コピー + プロセスを実行することは、アライメントされていないデータに対する非 SIMD 操作よりも確実に高速になります。

ソースと宛先が同じであると仮定すると、さらに最適化するには、ソースがアライメントされていない場合は作業バッファーのみを使用し、メモリがアライメントされている場合はその場で処理を行います。この利点は、データの特性によって異なります。

アーキテクチャによっては、処理前にデータをプリフェッチすることでさらにメリットが得られる場合があります。ここで、必要になる前にメモリ領域をキャッシュにフェッチする命令を発行できるため、現在のブロックを処理する前に次のブロックのフェッチを発行できます。

于 2008-12-30T06:21:07.347 に答える
2

遅すぎることがわかるまで、オプション1)を使用します(遅すぎても問題ありませんが、遅すぎても問題ありません)。

于 2008-12-17T19:07:08.263 に答える
2

一般的なアドバイス: 合理的に聞こえるもの (#2 など) を使用して、パフォーマンスを測定してみませんか? 受け入れられない場合は、設計図に戻ることができます。

確かに、測定前にアセンブラーで 60 の関数を手作りすることは、「時期尚早の最適化」のようにカウントされます。:)

于 2008-12-30T06:28:15.770 に答える