1

ビデオオーバーレイに移動する出力オプションが必要な作業を行っています。rgb565 をサポートしているものもあります。よろしければ、データをコピーしてください。

そうでない場合は、変換を使用してデータをコピーする必要があり、一度にフレーム バッファーになります。いくつかのことを試してみますが、これはオプティマイザーがちょっとした挑戦に熱心に取り組むことの 1 つかもしれないと思いました.

一般的に最も簡単にサポートされるさまざまな YUV 形式があります。Y の平面と、それに続く UV のインターリーブまたは個別の平面です。

Linux / xvを使用していますが、私が扱っているレベルでは、バイトとx86だけです。

品質を犠牲にして速度を重視しますが、何百もの異なる方法を試すことができる可能性があります。どこかバランスが取れている。

mmx を見ましたが、そこに役立つものがあるかどうかはわかりません。このタスクに特に適していると思われるものは何もなく、レジスターの適切な場所に物事を入れるには多くのシャッフルが必要です。

Y = Green*0.5 + R*0.25 + Blue*notmore の粗いバージョンを試してみます。U と V は、品質に関してはそれほど重要ではありません。それらのチャネルで殺人を免れることができます。

単純なループの場合。

loop:
movzx eax,[esi]
add esi,2
shr eax,3
shr al,1
add ah,ah
add al,ah
mov [edi],al
add edi,1
dec count
jnz loop

もちろん、すべての命令は前の命令に依存しており、単語の読み取りは最適ではないため、2 つをインターリーブすると少し得られる可能性があります。

loop: 
mov eax,[esi]
add esi,4
mov ebx,eax
shr eax,3
shr ebx,19
add ah,ah
add bh,bh
add al,ah
add bl,bh
mov ah,bl
mov [edi],ax
add edi,2
dec count
jnz loop

おそらく利益のために、一度に4つでそれを行うのは非常に簡単です.

誰もがより速く、より良いものを思いつくことができますか?

これに対する興味深い点は、適切なコンパイラが同様のコードを生成できるかどうかです。

4

2 に答える 2

1

あなたが本当に見たいのは、MMXまたは整数SSE命令を使用していると思います。これにより、一度に数ピクセルで作業できます。特にコードが十分にうまく書かれている場合、正しいスイッチを指定すれば、コンパイラはそのようなコードを生成できると思います。

既存のコードに関しては、パフォーマンスを向上させるために異なる反復の命令をインターリーブすることは気にしません。すべての x86 プロセッサ (Atom を除く) のアウトオブオーダー エンジンとキャッシュは、それをうまく処理するはずです。

編集: 水平方向の追加を行う必要がある場合は、PHADDDとのPHADDW指示を使用することをお勧めします。実際、Intel Software Designer's Manual をお持ちの場合は、手順を探す必要がありますPH*。彼らはあなたが必要とするものを持っているかもしれません。

于 2010-01-13T21:11:37.883 に答える
1

最も関心のある CPU バリアントに合わせて調整するための適切なスイッチが与えられたまともなコンパイラは、ほぼ間違いなく、単なる人間よりも優れた x86 命令の選択とスケジューリングについて多くのことを知っています!

インテル(R) 64 および IA-32 アーキテクチャー最適化リファレンス・マニュアルを参照してください...

コードを手作業で最適化したい場合は、コンパイラーに開始点としてアセンブリー・ソースを生成させてから、それを微調整するのが良い戦略かもしれません。すべての変更の前後にプロファイルを作成して、実際に改善していることを確認してください。

于 2010-01-14T01:52:40.613 に答える