紹介
- FFmpeg のアセンブリ言語講座へようこそ。この講座では、FFmpeg でアセンブリ言語がどのように書かれているかについての基礎を提供する。
必要な知識
- C 言語、特にポインタに関する知識が必要。
- 高校レベルの数学知識(スカラーとベクトル、加算、乗算など)が必要。
アセンブリ言語とは?
- アセンブリ言語は、CPU が処理する命令に直接対応するコードを書くためのプログラミング言語。
- FFmpeg のアセンブリコードの大半は SIMD(Single Instruction Multiple Data)で、これはベクトルプログラミングとも呼ばれる。
- SIMD は、画像、動画、音声のようにメモリへ連続して保存された大量のデータを処理するのに適している。
なぜアセンブリ言語で書くのか?
- マルチメディア処理を高速化するため。アセンブリコードで書くと、10 倍以上の速度向上が得られることがある。
- FFmpeg ではイントリンシックを使わず、直接アセンブリコードを書く。イントリンシックは通常、手書きのアセンブリより 10〜15% 遅い。
アセンブリ言語の種類
- この講座は x86 64 ビットアセンブリ言語に重点を置いている。これは amd64 としても知られ、Intel CPU でも動作する。
- x86 アセンブリ構文には AT&T と Intel の 2 種類があり、ここでは Intel 構文を使用する。
補助資料
- FFmpeg のアセンブリプログラミングは高性能な画像処理に重点を置いており、独特のアプローチを取っている。
- 『The Art of 64-bit assembly』の図解が役に立つかもしれない。
レジスタ
- レジスタは CPU がデータを処理する領域。CPU はメモリを直接操作せず、データをレジスタにロードして処理した後、再びメモリに書き戻す。
汎用レジスタ
- 汎用レジスタ(GPR)はデータやメモリアドレスを保持できる。FFmpeg のアセンブリコードでは、GPR は主に足場の役割を果たす。
ベクトルレジスタ
- ベクトル(SIMD)レジスタは複数のデータ要素を含む。さまざまな種類のベクトルレジスタが存在する。
- ほとんどの動画圧縮および伸張の計算は整数ベースである。
x86inc.asm のインクルード
- x86inc.asm は、FFmpeg、x264、dav1d でアセンブリプログラマの作業を容易にするために使われる軽量な抽象化レイヤー。
簡単なスカラーアセンブリコード
- 例示コードを通じて、スカラーアセンブリコードがどのように動作するかを説明する。
基本的なベクトル関数を理解する
- 最初の SIMD 関数の例を通じて、各行の意味を説明する。
movu、paddb のような命令を使ってベクトル演算を行う。
- 関数は引数のデータを変更し、値は返さない。
1件のコメント
Hacker Newsの意見
同じ話題に関する別の資料として、FFmpeg と dav1d の事例がある
アセンブリを書くよりも組み込み関数を使うほうが価値が高いと思うが、読むのはとても有益だった
このガイドは非常に優れていると思う
アセンブリを学んだり実装したりすることに「楽しさ」があるのか気になる
q接尾辞はポインタサイズを表し、64ビットシステムでは 8 であるi.eはi.e.,であるべきで、*(*は開き括弧になっているべきであるsizeofはポインタを返さないK&R への言及を称賛
アセンブリを使う欠点は、コードがアーキテクチャ依存になることだ
インラインアセンブリへの反対が混乱する
この資料は完璧だ
アセンブリが C より 10 倍速いというのが今でも事実なのか気になる