というわけで、自前動画処理のプログラムを作った後での改良です。
DCTは一応AP-922のアルゴリズム(確か正しい名前があったはず・・・)を元にしてVisualStudioの組み込みSIMD命令で実装し直してみました。
もちろん、整数演算、浮動小数演算とも実装しています。・・・で、これをやった後でもほとんど早くならなかった・・・orz
で、第二弾としてYUV=>RGBのアルゴリズムを変更して、早くしたつもりがやっぱりほとんど効果がない・・・
というわけで、適当にいろいろと試行錯誤を繰り返し行って、見つけたポイントが以下のポイント。
ちなみに、ベースとなっているのはMPEG1の「考え方」ですのでそれを念頭に置くと意味がとれるかも。
- YUV411からYUV444へ一度変換が入るタイミングで念のために線形補間を行っていたポイントが時間を使いすぎ(実はこれをやめただけで全体の10%くらい無くなった・・・)
- ハフマン圧縮部を一度平面展開=>インタリーブ=>IDCTの手順でメモリコピーが無駄に発生していたのでそれを削除
- ジグザグスキャンでハフマンコードを元に戻すときにキャッシュが効かないのか、時間がかかっていたので、あらかじめ0クリアしておいて、0の書き込みを停止した
・・・確かに組んだときにはある種保険として入れておいたコードがあるのですが、それがとんでもないほど悪さをしていることが発覚・・・。DCTの高速化とかそんなレベルじゃなかった・・・
ま、初期の時に組んだコードを見直してみると、だいたいの場合、速度が遅いときはいらないメモリコピーが頻発していて、それで時間をとられる、ということが多いです。
特に画像を扱い始めると、bltの作業が無駄に発生すると速度が落ちるのはよくわかる話だと思います。
もうちょっと最適化を行えば次のシステムで使えるかな~。