そろそろ 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ですか? 愛が無いのでちょっと…

Trackback

only 1 comment untill now

  1. x64版のアセンブラ化、とっっても楽しみにしています。
    お忙しいでしょうが、がんばってください。

Add your comment now