「Everyone Should Know SIMD」:ミッチェル・ハシモトによる、今でも重要な唯一の最適化についてのリマインダー

Dev & Code 1 h agoブックマークに追加

Dev & Code

ミッチェル・ハシモト(HashiCorp創設者)が、シンプルな命題を提示するエッセイにサイン。広いCPU時代において、SIMDを知らないことは、テーブル上に4倍から16倍のパフォーマンスを残すことだ。

具体例

Mitchell Hashimoto - HashiCorpの共同創業者で、現在は個人として積極的に貢献している(現在はZigで作られた端末エミュレータGhosttyに取り組んでいる) - は、単にEveryone Should Know SIMDというタイトルの長い記事を公開した。論点は一行で要約できる:CPUの周波数が停滞し、ベクトルレジスタが拡大する世界において、SIMDを無視することは、パフォーマンスの桁違いの向上を逃すことになる。

SIMD(Single Instruction, Multiple Data)は、CPUの命令で、同じ操作を複数の値に同時に適用するものを指す - 例えば、1サイクルで8つのfloatを加算したり、16バイトを一気に比較したりする。現代のx86-64 CPUでは、これはSSE / AVX / AVX2 / AVX-512の命令セットである。ARM(Apple Silicon、Neoverseサーバー)では、NEONSVEである。

背景:なぜこの話題が再浮上したのか

この議論は新しいものではない - SIMDはMMX(1996年)から存在している。変わった点は以下の通りである:

  1. レジスタの幅:128ビット(SSE、NEON)→ 256ビット(AVX2)→ 512ビット(AVX-512)。AVX-512レジスタは16個のfloat32または64個のint8を保持できる。
  2. 利用可能性:AVX2は、Haswell(2013年)以降の全てのx86一般用CPUに存在する。NEONは、ARMv8(iPhone 5S以降、全てのARMサーバー)の標準である。
  3. CPU周波数の頭打ち:世代間の「無料」なパフォーマンス向上は減少している。一方、ベクトル化は依然として効果を発揮する。
  4. 自動ベクトル化の限界:コンパイラ(LLVM、GCC)は単純なループをベクトル化できるが、分岐、ポインタチェイシング、特定の積算などがあると失敗することが多い。プログラマーは手動で行う必要がある。

Hashimotoの主張

中心的なメッセージ:SIMDはグラフィックスエンジンやビデオコーデックのコーダーだけのものではない。大量のデータ操作 - JSONパーサ、フルテキスト検索エンジン、文字列比較、統計計算、画像フィルタリング、ハッシュ - は、ベクトル化によって大幅にパフォーマンスが向上する。

具体的な事例:

  • simdjsonは、最新のCPUで3-5GB/sの速度でJSONを解析し、その大部分はSIMDのおかげである。
  • ソートエンジンVqSort(Google)とips4oは、整数配列でstd::sortを3-5倍上回るパフォーマンスをSIMDによって実現している。
  • 列指向DB(ClickHouse、DuckDB)は、SIMDカーネルを中心に構築されている。
  • ProtobufUTF-8のパースは、類似のベクトル化によってパフォーマンスが向上できる。

要するに、これはもはやニッチな技術ではなく、大規模なデータ処理に関わる基本的なスキルである。

どのように始めるか

SIMDは手動で行うと難しいとされており、x86とARM間で移植性が低い。現在、3つの実用的なアプローチがある:

  1. Highway(Google):SSE/AVX/NEON/SVEを共通のAPIの後ろに抽象化するC++ライブラリで、CPUに応じてランタイムディスパッチを行う。
  2. std::simd(C++26提案):STLに含まれ、移植性があるが、まだ実験的である。
  3. Rust / ZigのポータブルSIMD:両方の言語は、ポータブルなベクトルAPIを提供している(Rust nightlyのcore::simd、Zigの@Vector組み込み)。

「標準的な」アプリケーション開発者にとって、ポータブルライブラリ(Highway、std::simd、Zigの@Vector)からのアプローチは、低レベルのイントラシックスに深入りすることなく、主要な利益を得るための入口となる。

私たちの見解

Hashimotoの指摘は正しい:マネージドランタイム(JavaScript、Python、Go)で育った開発者の世代は、CPUが10年間、彼らのコードで決して使用されていない計算手段を提供していることをよく知らない。これは非難ではなく、事実である。そして、これらの手段をクリティカルパスに接続したときの投資対効果は驚異的である。

覚えておくべきこと

  • SIMDはもはやエキゾチックな最適化ではなく、CPUの残存パフォーマンス向上の主要な源である。
  • ポータブルライブラリ(Highway、std::simd、Zigの@Vector)は、入門を容易にする。
  • 大量のデータを扱うもの(パーサ、DB、画像、ハッシュ)は、この観点から問い直す必要がある。
リソース

本記事は人工知能により作成され、人間の編集管理のもとで校閲されています。

編集部について
この記事は役に立ちましたか?

19 人がこの記事を評価しました

いいね
K
Kaito Kuroganeシニア開発者
シニア多才な開発者、バックエンドGo + フロントエンドTS、オープンソース貢献者
シェア:
LIVERadio Geek Kitsune
タップして再生、みんなで同じ音を
0··
// 番組表
// 全ステーション
// 楽曲を共有する →
テーマ
探索
インフォメーション