10月
22
そろそろ x64 版のアセンブラ化に着手しようと考えていますが、着手する前に、処理負荷の傾向がどうなっているかを比較しておこうと思います。
まず測定環境。
- CPU
- Core 2 Quad Q6600 (3.00GHz OC)
- RAM
- DDR2-800 (5-5-5-15) 6GB
- マザー
- ASUS P5K (Intel P35)
- コーデック
- Ut Video Codec Suite 8.4.0
- コーデック設定
- Predict left, フレーム分割数 1
エンコード対象にする映像は、アイマスのステージ映像(全部AUTOカメラ)を通しでキャプチャしたもの(8000フレーム)を、VirtualDub で各フォーマットに変換したものを使います。全体的な傾向をざっくり掴むための計測なので、この程度のいい加減さで問題ない(他人が厳密な追試ができなくてもいい)でしょう。
で、結果。数字は ms/frame
FourCC | 入出力 フォーマット |
x86 | x64 | ||
---|---|---|---|---|---|
enc | dec | enc | dec | ||
ULRA | RGBA | 14.847 | 15.048 | 31.577 | 22.948 |
ULRG | RGB24 | 10.738 | 10.819 | 23.254 | 16.738 |
RGB32 | 10.789 | 11.505 | 23.518 | 17.099 | |
ULY2 | YUY2 | 06.764 | 07.021 | 15.175 | 10.786 |
RGB24 | 09.493 | 10.991 | 27.077 | 24.531 | |
RGB32 | 09.311 | 10.506 | 27.148 | 24.518 | |
ULY0 | YV12 | 04.736 | 05.471 | 11.122 | 08.159 |
YUY2 | 05.866 | 07.270 | 12.033 | 09.488 | |
RGB24 | 39.147 | 25.660 | 36.374 | 21.925 | |
RGB32 | 39.487 | 26.012 | 36.464 | 21.911 |
Predict left と Predict median の比較は以下のようになります。
FourCC | 入出力 フォーマット |
フレーム内予測 | x86 | x64 | ||
---|---|---|---|---|---|---|
enc | dec | enc | dec | |||
ULY0 | YV12 | left | 04.736 | 05.471 | 11.122 | 08.159 |
median | 04.808 | 11.198 | 19.008 | 18.075 |
- ほとんどの場合、x64版の方が遅い。x86版は主要なルーチンはおおよそアセンブラ化されているが、x64版は全てC++で書かれているため。
- ネイティブなフォーマットでの入出力の場合、x64版はx86版に対して、エンコードで2.2倍程度、デコードで1.5倍程度の処理時間がかかる。
- ULY2でRGBでの入出力の場合、色空間の変換は、x86版ではSSE命令を使ったint演算であるのに対し、x64版ではC++で書いたfp演算になっているので、x64版はかなり遅い。
- ULY0でRGBでの入出力の場合、色空間の変換は、x86版もx64版もC++で書いたfp演算なので、処理時間はそれほど変わらない。x64版だとxmmレジスタを使ったfp演算にコンパイルされるためか、ハフマン符号化等の速度差を逆転するほどfp演算の効率が良いらしく、結果として x64版の方が有意に速くなっている。
- predict median は、エンコード時はx86版ではSSE命令を使って16ピクセル分まとめて処理しているのに対し、x64版では1ピクセルずつ処理しているのでとても遅い。デコード時は原理的に1ピクセルずつしか処理できないため、エンコード時ほど速度差はない。
これをアセンブラ化して高速化するわけですが、事前の予想では最終的に以下のレベルまで高速化できると思っています。
- ネイティブなフォーマットからのエンコードはx86版と同程度
- ネイティブでないフォーマットからのエンコードはx86版より速い
- デコードもx86版より速い
x86版より速いところまでいけると思っているのは、x86版のハフマンデコードや色空間変換ルーチンではレジスタが足りないために仕方なくメモリアクセスを繰り返している部分が多く、x64に移行してレジスタが増えることで余計なメモリアクセスを抑制できるからです。ハフマンエンコードやフレーム内予測では元々レジスタは足りているので、x64版になっても高速化はしないでしょうし、命令バイト数が増えるために遅くなる可能性もあります。
え、ULY0ですか? 愛が無いのでちょっと…
x64版のアセンブラ化、とっっても楽しみにしています。
お忙しいでしょうが、がんばってください。