マルチメディアライブラリ「FFmpeg」がアセンブリ言語の手書きで爆速になったという報告
“やじうまの杜”では、ニュース・レビューにこだわらない幅広い話題をお伝えします。 ビデオ・オーディオを扱うアプリの多くで採用されているオープンソースライブラリ「FFmpeg」で、驚くべきパフォーマンス向上が達成されました。アセンブリ言語(assembly)を手書きすることで、94倍も処理速度が向上したとのこと。 この試みが行われたのはAV1デコーダー「dav1d」においてですが、もともと約8%がアセンブリなのだそうです。そのほかはC/C++言語のソースコードとして記述され、CPUが直接理解できる機械語にコンパイル(変換)された上で実行されています。 しかし、コンパイラーによる変換に頼らず、人の手でアセンブリを記述し、最新CPUに搭載されている「SSSE3」「AVX2」「AVX-512」といった拡張命令を積極的に活用することで、思った以上の効率化が実現できたのだとか。 コンパイラーもそうした最新のCPU拡張命令を活用するオプションがあり、人手を介さなくてもかなりの最適化を行ってくれるはずですが、細部には改善の余地が多く残されているのかもしれません。もしかすると、将来バージョンの「FFmpeg」はかなり速くなる……のかも。そうなれば、「FFmpeg」を採用するアプリにも恩恵は大きいでしょう。 「FFmpeg」の開発チームは、近いうちにこのアプローチに関するチュートリアルを提供するとしています。筆者の手には負えそうにありませんが、興味ある方はウォッチしてみるとよいでしょう。 なお、今回手書きアセンブリで94倍の速度向上を達成したのはx86プラットフォームでの話です。コンパイラーにはCPUアーキテクチャーの差異を吸収するという役割があります(「FFmpeg」はx86以外にも多くのCPUアーキテクチャーをサポートしています)。今後新しいCPU命令が登場したときの対応も、すべてアセンブリ手書きでは相当困難となるでしょう。つまり、コンパイルすることにも移植性や保守性、生産性などの点で利があるわけで、常に手書きアセンブリが優れているわけではない点には留意しましょう。
窓の杜,樽井 秀人