85.3 GFlops:単一のAMD Zen 3 コアにおけるFP32行列乗算の最適化

2026/07/17 23:24

85.3 GFlops:単一のAMD Zen 3 コアにおけるFP32行列乗算の最適化

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

まとめ:

本研究では、AMD Zen 3 CPU 上で OpenBLAS のような主要ライブラリと同等のパフォーマンスを実現する、AVX2/FMA インプリシティブ(インtrinsic)を用いた C++ 実装による行列乗算(GEMM)を提示する。この実装は最高で 85.30 GFLOPS の性能を発揮し、理論上のピーク性能(134.4 GFLOPS)の 63.5% に達した。キャッシュおよびレジスタブロッキング戦略を組み合わせた 28 つの構成を検証した結果、K および B に対してブロックサイズを 256 とする最適なモデルが得られ、この設定により L2 キャッシュ内でのデータ再利用を最大化しつつ、L3 ポリューションや TLB ミスを招く完全な転置手法と比較して回避できる。主要な最適化には、命令のレイテンシを効果的に隠すために FMA チェインリング(chain4)を用いること、適切な 32 バイトのメモリアラインメントによる約 5% のパフォーマンス向上、および壊的な非時間的ストア(destructive non-temporal stores)を避けることで、劇的な性能低下を防ぐことが含まれる。一方、積極的なソフトウェアによるプリフェッチは、効率的なネイティブハードウェアプリフェッチにより約 8% パフォーマンスが阻害されるため行われない。Ryzen 5 5500 で 2048×2048 の行列を用いてテストされ、この最適化されたコードは、GCC 12.2 以降および特定のフラグを必要とし、MIT ライセンスによる軽量な代替手段を提供し、参照実装とビット単位で同一の結果を得る。UFRN に所属する Lucas Lima Freitag によって 2025 年に発表されたこの研究は、最新の AMD プロセッサにおいてピーク効率を達成するには、ターゲット指向の低レベル調整が不可欠であることを示している。

本文

AMD Zen 3 アーキテクチャ向けの GEMM 最適化:理論ピークの 63.5% を達成

📖 概要

本リポジトリは、AMD Ryzen 5 5500(Zen 3 アーキテクチャ)における単一コア・単精度浮動小数点演算(FP32)の行列乗算(GEMM)最適化に関する体系的な調査成果です。キャッシュブロッキング、レジスタブロッキング、FMA 連結などの**28 の異なる設定(モデル MX01 〜 MX28)**が評価されました。

  • 主要な最適化技術
    • Cache blocking (tiling): L1/L2/L3 キャッシュの範囲内にブロックを収めるための BI, BJ, BK 調整
    • Register blocking: YMM レジスタ(最大 16 つ)に C の蓄積子を保持(2〜8 ラインの実験)
    • FMA chaining: chain1 から chain6 までの命令連結
    • Packing strategies: パッキングなし、転置(Transpose)、B-pak on-the-fly など
    • Memory alignment: 32 バイトアラインメント
    • Software prefetching:
      _mm_prefetch
      を使用した手法
    • Non-temporal stores: Stream store の採用

最高のモデルである MX2485.30 GFLOPS という性能を発揮し、単純な実装より 56.5 倍も高速化されました。AMD AOCL や OpenBLAS などの最適化ライブラリと同等の結果を達成しています。


🏆 主要な結果

モデル構成要素GFLOPSピーク理論値 (%)
MX244 ライン + chain4 + B-pack (BK=256)85.3063.5%
MX224 ライン + chain4 + B-pack (BK=128)84.1062.6%
MX234 ライン + chain4 + B-pack (BK=64)82.9361.7%
MX164 ライン + chain4 + アラインメント(パッキングなし)72.5854.0%
MX204 ライン + chain4 + Bᵀ(転置)79.2158.9%
MX184 ライン + chain4 + プリフェッチ79.7559.3%

💡 ピーク理論値の計算式

$$ \text{ピーク性能} = \text{FMA コア} \times 2 \times \text{float 数} \times 8 \times \text{演算回数} \times 2 \times \text{周波数} $$

  • 計算結果:$134.4 \text{ GFLOPS}$(AMD Ryzen 5 5500 の定格動作時)

🔬 研究方法論と技術詳細

評価された最適化技術の詳細

  • Cache Blocking (Tiling)
    • BI, BJ, BK を調整し、ブロックを L1(32 KB)、L2(512 KB)、L3(16 MB)キャッシュ内に維持します。
    • 最適な結果:
      BK=256
      で達成され、L2 キャッシュを超えずにリユースを最大化しました。
  • Register Blocking
    • C の蓄積子を YMM レジスタ(最大 16 つ使用可能)に保持します。
    • 最適な結果:
      4 ライン
      が最良のバランスを示し、追加のスパイル(spill)が発生しますが、A の再利用率のコストを上回る性能をもたらしました。
  • FMA Chaining
    • Zen 3 における FMA 命令のラテンシーは 4 サイクルです。
    • chain4
      (4 つの独立した蓄積子)がこのラテンシーを隠蔽し、2 つの FMA コアを最大限活用します。
  • Packing (パッキング)
    • 「on-the-fly B-pack」: B のブロック(BK×BJ)を連続バッファにコピーし、不連続アクセスを順次アクセスに変換します。
    • 完全な転置(L3 キャッシュ汚染)や直接アクセス(TLB ミスの影響受けやすさ)よりも優れています。
  • Alignment (アラインメント)
    • _mm_malloc(..., 32)
      でアラインメントされたメモリを使用し、
      vmovaps
      指令を適用することで約 5% の性能向上が見られました。
  • Prefetching (プリフェッチ)
    • Zen 3 はストリーミングパターンに対してハードウェアプリフェッチが効率的であるため、ソフトウェアによる
      _mm_prefetch
      を使用するとパフォーマンスが約 8% 低下しました。
  • Non-temporal Stores (非時限ストア)
    • _mm256_stream_ps
      を採用した場合の結果は壊滅的(1.24 GFLOPS)でした。
    • 原因: C が「読み込み・修正・書き込み」されるため、各書き込みでキャッシュラインが無効化され、DRAM の再ロードが頻発するためです。

📂 リポジトリの構成

zen3-gemm/
├── README.md
├── src/
│   └── mx85.c                  # 28 モデルを含む完全なソースコードとベンチマーク
├── docs/
│   ├── artigo_en.tex           # 学術論文(LaTeX 形式)
│   └── resultados/             # ベンチマーク出力ログ
│       ├── mx85_benchmark.txt
│       └── mx85_output8.txt
└── build/
    └── Makefile                # コンパイルオプション(任意)

⚙️ コンパイルと実行方法

前提条件

  • プロセッサ: AVX2 と FMA をサポートする CPU(AMD Zen、Intel Haswell 以降など)
  • OS: Windows (10/11) または Linux
  • コンパイラ: GCC 12.2+(Windows では MinGW-w64 推奨)または対応コンパイラ
  • メモリ: 行列サイズ 2048×2048 の演算に必要な約 48 MB(3 つの行列分)

コンパイルコマンド (GCC)

src/
ディレクトリに移動し、以下のコマンドを実行してください。

gcc -O3 -mavx2 -mfma -march=native -funroll-loops -frename-registers -o mx85.exe mx85.c

重要なフラグ解説:

  • -mavx2 -mfma -march=native
    : SIMD 指令を有効にし、現在の CPU に最適化します。
  • -funroll-loops
    : 内部ループの展開を行います(パフォーマンス向上)。
  • -frename-registers
    : レジスタ割り当てを改善し、スパイル(spill)の削減に寄与します。

実行と出力

プログラムは以下の動作を行います:

  1. Windows においてはスレッドアフィニティをコア 0 に適用し、優先度を高設定にします。
  2. 各モデルについてウォームアップ 3 回、測定 15 回の合計で計測を実行します。
  3. 以下のファイルを生成します:
    • mx85_benchmark.txt
      : 完全なランキングと検証データ
    • mx85_validate.txt
      : 参照実装との最大誤差

カスタマイズ方法:

  • 特定のモデルのみテスト:
    main()
    関数を修正して、対象となる関数(例:
    mx24(A, B, C, N)
    )を直接呼び出します。
  • 行列サイズ変更: 行数に関する定数
    N
    (ソースコード約 230 行目)を変更してください。

📊 完全結果表(全体ランキング)

以下に評価されたすべての 28 モデルの測定 GFLOPS と理論ピーク値に対する百分比を示します。

順位モデル構成要素GFLOPSピーク理論値 (%)
1MX244 ライン + chain4 + B-pack BK=25685.3063.5%
2MX224 ライン + chain4 + B-pack BK=12884.1062.6%
3MX234 ライン + chain4 + B-pack BK=6482.9361.7%
4MX254 ライン + chain4 + B-pack + プリフェッチ83.1561.9%
5MX204 ライン + chain4 + Bᵀ(転置)79.2158.9%
6MX184 ライン + chain4 + プリフェッチ79.7559.3%
7MX174 ライン + chain4 + パッキングなし78.8058.6%
8MX164 ライン + chain4 + アラインメント72.5854.0%
9MX154 ライン + chain3 + B-pack62.3446.4%
10MX144 ライン + chain2 + B-pack55.7641.5%
11MX132 ライン + chain4 + B-pack53.5839.9%
12MX122 ライン + chain3 + B-pack50.5637.6%
13MX114 ライン + chain2 + アラインメント47.1535.1%
14MX082 ライン + chain4 + BK=12845.0433.5%
15MX072 ライン + chain3 + Bt なし43.5232.4%
16MX052 ライン + chain2 + Bt41.9331.2%
17MX194 ライン + chain5 + アラインメント42.0731.3%
18MX062 ライン + chain1 + プリフェッチ42.5431.7%
19MX044 ライン + chain1 + Bt40.0429.8%
20MX032 ライン + chain1 + Bt39.3429.3%
21MX022 ライン + chain1 + j-block37.6028.0%
22MX01Bt + 2Dtile + 8acc (ベースライン)35.1626.2%
23MX104 ライン + chain6 + Bt14.2610.6%
24MX268 ライン + chain4 + B-pack12.249.1%
25MX284 ライン + chain4 + dual1613.7510.2%
26MX274 ライン + chain4 + C-in-regs9.136.8%
27MX09BI=128, BK=256 + chain48.386.2%
28MX214 ライン + chain4 + stream stores1.240.9%

🔍 失敗要因の分析

以下の構成は期待通りの性能を発揮せず、その原因は以下の通りです。

モデルテクニックGFLOPS主な原因
MX21非時限ストア (Stream Stores)1.24C が読み込み・修正・書き込みされるため、各ストアでキャッシュラインが無効化され、DRAM リロードが頻発します。
MX26レジスタに 8 ライン保持12.24YMM レジスタ 64 個が必要であり、そのうち 48 個がスパイル(ディスク)されるため、実行時間に支配的です。
MX27k-block を通じて C-in-regs9.13蓄積子を多数の反復にわたって生かし続け、レジスタ圧力が高まります。
MX09BI=128, BK=2568.38ワーキングセット(128×256×4 = 128 KB)が L1 を超え、多くのキャッシュミスが発生します。
MX10Chain6 (長い連結)14.26チェーンが長すぎるため、レジスタ不足によって過剰なスパイルが発生します。

🧪 検証結果

すべてのモデルを参照実装(従来の ijk ループ)と比較して検証しました。

  • 上位 3 つのモデル(MX24, MX22, MX23)は絶対最大誤差が 0.0 で、ビット単位で同一の結果となりました(加算順序が保持されたため)。
  • その他のモデルも浮動小数点算術に固有の範囲内(約 1e-6 オーダー)の誤差のみを示し、妥当性を確認しました。

📚 引用表記

本研究成果の研究にご利用の場合は、以下の論文を引用してください。

@article{housl2025gemm,
  title={85.30 GFLOPS Single-Core FP32 Matrix Multiplication on AMD Zen 3},
  author={Housl},
  journal={arXiv preprint},
  year={2025}
}

🤝 コントリビューションとライセンス

  • コントリビューション: 改善案、新しいモデル、あるいは他のアーキテクチャへの適応などのご提案をお歓迎いたします。Issue または PR でお送りください。
  • ライセンス: MIT ライセンスの下で提供されています。著作権表示と許可を維持する限り、複製・変更・配布が可能です。詳細は
    LICENSE
    ファイルをご確認ください。

📧 著者情報

  • 著者: Lucas Lima Freitag
  • 所属: フォルネリョ大連邦大学 (Universidade Federal do Rio Grande do Norte - UFRN)
  • E メール: freitag.lima@academico.ifrn.edu.br
  • ORCID: 0009-0006-8849-5619

最適化を楽しんでください!🚀

同じ日のほかのニュース

一覧に戻る →

2026/07/20 23:21

中国のオープンウェイトAI戦略が勝利を収めている

## 日本語訳: 中国は、強力な GPU など高性能チップへの輸出規制から生じるハードウェアの制約を克服するために、「オープンウェイト」戦略を活用して米国との格差を急速に縮めつつあります。このアプローチでは、モデルの核心となるコードが公開されカスタマイズ可能であり、閉じたシステムに依存するわけではありません。その結果、中国のモデルは OpenAI などの米国の巨頭と同等の性能を達成しながらも、費用はごくわずかです。企業がこれらのポータブルな技術を簡単に切り替えることができるため、作業プロセスへの影響なく外国製の代替品を採用するリスクは低く、企業にとっては大きな不安要因ではありません。専門家は、スタートアップが間もなく中国製モデルを使用することをデフォルトとする可能性が 80% あると予測しており、これはグローバルな AI 覇権の潜在的な転換を示しています。最終的に、この移行は、ロックされた独占的な手法が開放的で協力的な枠組みに対して敗退しつつあることを示しています。これら安価でありながら高性能なツールが国家安全保障や科学的研究の中心になるにつれ、米国はますます開かれたグローバル環境に適応しなければ重要な分配優位を失う危険に直面します。

2026/07/21 2:13

Kimi Work

## Japanese Translation: ## Summary: Kimi Work は、Mac および Windows の双方で複雑な知識作業の自動化を可能にし、知的でシステムレベルのデジタル従業員として機能することで、個人コンピューティングに革命的な転換をもたらします。迅速な回答に焦点を当てた標準的な Web チャットアプリとは異なり、このデスクトップアプリケーションは堅牢なスケジューリングとマルチエージェント協力機能を統合し、あなたのローカルなワークフローを深く変革します。自律的なインターネットナビゲーションを行う「WebBridge」という独自技術や、手動介入なしで日常の要約から時次データ確認までのタスクを実行する内蔵 Cron エンジンなどを使用しています。「動作前に許可を求める」という重要なセキュリティ機能により、ローカルファイルの変更に対して明示的なユーザー承認が必要となり、ユーザーには完全なコントロールを保ちつつ、システムはコンピューターを 24 時間 7 日稼働させるように設定されています。「エージェント・スワーム」内の専門化されたエージェントを調整することで、Kimi Work は生データからの洞察を PowerPoint デッキや Excel シートなどのプロフェッショナルな形式に瞬時に変換します。さらに、複雑な API セットアップが不要で A 株や米国株式などグローバル市場データへのアクセスを簡素化します。結局のところ、このプラットフォームは高度な AI 知能をあなたのデスクトップ環境に直接持ち込み、報告書の作成やコードの実行などの反復タスクをシームレスかつovernight(通夜中)に処理する専用のデジタル労働力を創出します。

2026/07/21 2:07

Jelly UI: ネイティブ HTML フォーム要素用のソフトボディ物理演算

## 日本語翻訳: Jelly UI は、依存関係を持たず、セットアップを最小限にした軽量な Web Components ライブラリであり、複雑な動作(例:ソフトボディ物理学)を外部パッケージやビルドステップなしに単一の script タグでプロジェクトに統合し、柔らかく触覚的な製品インタフェースを作成することを目的としています。このライブラリの主な利点は、外部パッケージまたはビルドステップを必要とせず、単一の script タグだけで複雑な挙動(例:ソフトボディ物理学)をプロジェクトに直接統合できることです。ライブラリには、`<jelly-button>` などの即用可能な 40 つの Custom Elements が用意されており、リアルなフォームコントロール、ダークモード、RTL 対応、WCAG AA レベルの色トークンによる高いアクセシビリティなどを標準機能として備えています。物理的なインタラクションのメタファーを厳格な準拠ルールと組み合わせることで、Jelly UI は開発者がコードオーバーヘッドなしでアクセシブルな物理学ベースのインタフェースを素早くプロトタイプ化することを可能にします。この簡素化されたアプローチにより、統合時間が短縮されながら、現代の Web 開発における堅牢なパフォーマンスとユーザー体験の標準を維持することができます。

85.3 GFlops:単一のAMD Zen 3 コアにおけるFP32行列乗算の最適化 | そっか~ニュース