1 ポイント 投稿者 GN⁺ 2024-07-05 | 1件のコメント | WhatsAppで共有

要約

紹介

  • 行列積は現代のニューラルネットワークに不可欠な要素
  • NumPyは外部のBLASライブラリを使用して高性能を実現している
  • この記事では、シンプルで移植性があり、拡張可能な高性能行列積を実装する方法を説明する

NumPyの性能

  • NumPyはAMD CPUでOpenBLASを使用する
  • 性能測定はFLOP/sで計算される
  • Ryzen 7 7700 CPUでNumPyのシングルスレッドおよびマルチスレッド性能を測定する

理論的限界

  • CPUのメモリ階層構造とSIMD拡張について説明する
  • 理論上、シングルスレッドで163 GFLOPS、マルチスレッドで1203 GFLOPSを達成できる

単純実装

  • 基本的な行列積アルゴリズムを説明し、単純実装の性能を測定する
  • 単純実装は2.7 GFLOPSを達成する

カーネル

  • 行列積を小さな部分問題に分割して解く方法を説明する
  • SIMD命令を使ってカーネルを最適化する
  • 16x6カーネルを使用して147 GFLOPSを達成する

マスキングとパッキング

  • 任意の行列サイズを処理するために境界ケースを扱う方法を説明する
  • マスキングとパッキングを使って性能を最適化する
  • 新しい実装は56 GFLOPSを達成する

キャッシュ

  • CPUキャッシュのメモリシステムについて説明する
  • キャッシュを活用してデータ再利用とキャッシュ管理を最適化する

GN⁺の見解

  • この記事は高性能な行列積を実装する方法を段階的に説明しており、非常に教育的
  • SIMD命令とCPUキャッシュを活用した最適化手法を学べる
  • NumPyのようなライブラリの内部動作を理解するのに役立つ
  • 類似機能を持つ他のプロジェクトとしては、Intel MKL、OpenBLASなどがある
  • 新しい技術やオープンソースを採用する際は、性能と移植性を考慮する必要がある

1件のコメント

 
GN⁺ 2024-07-05
Hacker Newsの意見
  • ほとんどのソフトウェアは最適化されておらず、性能向上の余地が大きい

    • アルゴリズム選択が最も重要
    • カーネル呼び出しのような重い処理を減らせるか確認する必要がある
    • ベクトル化によって性能向上が可能
    • キャッシュ効率を最適化できるか確認する必要がある
    • ハードウェアに特化した最適化の可能性を検討する必要がある
  • BLISリポジトリで参照されている論文は、この主題を理解するうえで権威ある資料

    • 最適化されたBLASの性能が良くないと考える理由が理解できない
    • NumPyの代わりにAMDのBLASを使うべき
    • BLISはOpenBLASより並列化がうまくできている
  • SIMD命令はマイクロカーネルのベクトル化に必須ではない

    • 適切なブロックサイズを使えば、BLISの純粋なCマイクロカーネルは手作業で最適化された実装の80%以上の性能を発揮する
  • ほとんどのコーディングパターンはハードウェアに完全には特化しておらず、多くの性能を取りこぼしている

    • 「There's plenty of room at the top」というCSの古典的論文を参照する価値がある
  • ベンチマークを簡単に再現できるようにした点は評価に値する

    • 16コアXeon CPUで、matmul.cはgcc -O3でコンパイルすると1.41秒、clang -O2でコンパイルすると1.47秒、NumPyは1.07秒かかる
    • avx512カーネルのほうがより速いはずだと考えている
    • ompの代わりにpthreadsを使ってスレッドプールを明示的に管理すれば、オーバーヘッドを減らせる
  • NumPyの実装が実際にマルチスレッドを使っているのか疑問

  • OpenBLASより性能が良い理由が気になる

    • キャッシュなどの詳細を扱っている
    • 特定のプロセッサ向けにさらに最適化されているのか気になる
  • 一方がPython、もう一方がCという比較は公平ではない

    • 両方ともCで書いて比較したほうがよい
  • マスク生成の非効率さが気になる

    • より効率的な方法として、グローバル定数配列を生成する、あるいは定数ベクトルと比較する方法がある
    • ただしこれは些細な問題で、実際には大きな差にはならないはず
  • 行列積そのものをマルチスレッド化する実用性に疑問がある

    • マルチスレッド化は、行列積を使うアルゴリズムのほうでより有用だろう
  • jartのtinyBLASへの言及

    • 関連リンクを提供