2 ポイント 投稿者 GN⁺ 2025-02-23 | 1件のコメント | WhatsAppで共有

紹介

  • 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 関数の例を通じて、各行の意味を説明する。
  • movupaddb のような命令を使ってベクトル演算を行う。
  • 関数は引数のデータを変更し、値は返さない。

1件のコメント

 
GN⁺ 2025-02-23
Hacker Newsの意見
  • 同じ話題に関する別の資料として、FFmpeg と dav1d の事例がある

    • FFmpeg は頻繁に使われるため、明確なユースケースと見なせる
    • dav1d は主要ブラウザや Android オペレーティングシステムで使われており、その成功の大きな要因は手書きの SIMD にある
    • dav1d のコードの一部は1日に数兆回実行されるため、可能な限り高速に動作する必要がある
    • 手書きの SIMD とコンパイラ生成の SIMD の性能差は最大 50% に達することがある
    • こうした技術を維持するために、FFmpeg アセンブリ言語学校のようなリソースが重要である
  • アセンブリを書くよりも組み込み関数を使うほうが価値が高いと思うが、読むのはとても有益だった

    • Compiler Explorer を使って、コンパイラが性能最適化のために行う最適化を理解した
  • このガイドは非常に優れていると思う

    • 低レベルに興味を持っていた頃にこのガイドがあればよかった
  • アセンブリを学んだり実装したりすることに「楽しさ」があるのか気になる

    • LISP や RISC-V のような楽しさがあるのか、それとも COBOL のように特定のシステムや作業のために学ぶものなのか気になる
    • 日常業務でアセンブリを使う理由はないが、趣味として時間を投じる価値があるのか気になる
  • q 接尾辞はポインタサイズを表し、64ビットシステムでは 8 である

    • 文がわかりにくく感じられる
    • i.ei.e., であるべきで、*(* は開き括弧になっているべきである
    • sizeof はポインタを返さない
  • K&R への言及を称賛

    • C とプログラミングを学ぶために最初に買った本だった
    • 最初は C++ を学んだが、抽象的すぎて理解しにくかった
  • アセンブリを使う欠点は、コードがアーキテクチャ依存になることだ

    • x86、arm、x86_64 それぞれに別のコードを書く必要がある
    • SIMD 向けの移植可能なコードを書く良い方法はない
    • Rust は移植可能な SIMD API の安定化を進めており、Zig は SIMD サポートを提供しているが、FFmpeg は依然として速度に不満を持つかもしれない
  • インラインアセンブリへの反対が混乱する

    • インラインアセンブリは、アセンブリ関数呼び出しより効率的に思える
  • この資料は完璧だ

    • 386 時代の x86 アセンブリは知っていたが、より高度なプロセッサは複雑すぎた
    • 最近の CPU の SIMD についてもっと学びたい
  • アセンブリが C より 10 倍速いというのが今でも事実なのか気になる

    • コンパイラが手書きアセンブリに迫れないほど停滞しているのか気になる