FLOPSとは何か — 定義、測定、限界、実践的最適化の全体像
はじめに:FLOPSが意味するもの
FLOPS(フロップス)は、"Floating Point Operations Per Second" の略で、1秒あたりに実行できる浮動小数点演算の回数を示す性能指標です。主に高性能計算(HPC)、科学技術計算、機械学習などの分野で計算性能を表す際に用いられます。現代のプロセッサやアクセラレータ(GPU、ASICなど)は大量の並列浮動小数点演算を同時に実行できるため、FLOPSは理論性能やベンチマーク結果を比較する基本指標になっています。
単位と表記
FLOPSは頻繁にSI接頭辞と組み合わせて表されます。代表的な単位には次のものがあります。
- kFLOPS(キロ) = 10^3 FLOPS
- MFLOPS(メガ) = 10^6 FLOPS
- GFLOPS(ギガ) = 10^9 FLOPS
- TFLOPS(テラ) = 10^12 FLOPS
- PFLOPS(ペタ) = 10^15 FLOPS
- EFLOPS(エクサ) = 10^18 FLOPS
スーパーコンピュータのランキング(Top500)ではPFLOPSやEFLOPS単位で表現されます。単位は10^3の十進接頭辞が使われるのが通例です。
理論ピーク性能と持続性能
ハードウェアには理論的に可能な最高のFLOPS(ピーク性能)と、実際のプログラムが達成できる持続性能(実効性能)があります。ピーク性能はCPUやGPUの演算ユニット数、クロック周波数、命令あたりの演算数(例えばFMA: Fused Multiply-Addが1命令で乗算と加算を行う場合の扱い)から単純に計算できますが、実際の性能はメモリ帯域、キャッシュ効率、命令発行の制約、並列化の品質など多くの要因で制限されます。
ベンチマークには理論性能に近い数値を測るためのHPL(High-Performance LINPACK)や、よりメモリや通信の挙動を反映するHPCG、機械学習に特化したMLPerfなどがあります。HPLは行列の高密度線形方程式を解く際の性能を測定し、Top500のランキングで使われますが、実業務のワークロードとは異なる性質を持つため、HPLの結果だけで汎用的な性能評価をするのは危険です。
FMAとFLOPカウントの慣習
浮動小数点演算のカウント方法には慣習があります。特にFMA(乗算と加算を1命令で行う命令)を1回で何FLOPと数えるかは議論があります。一般的なベンチマーク(例えばHPL)ではFMAを"2つの浮動小数点演算"(1乗算 + 1加算)としてカウントすることが多く、これによりピークFLOPSの算出やベンチマークの報告に一貫性がもたらされます。ただし、厳密には命令としては1命令であるため、どの定義を採るかは測定時に注意が必要です。
アルゴリズムにおけるFLOPの見積もり
アルゴリズムが必要とする演算回数(FLOP数)を見積もることは、理論的な計算量解析に似ています。例えば、密行列の乗算 C = A × B(サイズ n × n)の標準的なアルゴリズムは概ね 2n^3 の浮動小数点演算が必要とされます(n^3 回の乗算とおおよそ n^3 回の加算)。このような見積もりは、理論上どれくらいの時間がかかるかを想定する際に有効です。
一方で畳み込み演算(CNNなど)はカーネルサイズやチャネル数、ストライド、パディングによってFLOP数が異なり、実装(im2col+行列乗算、直接畳み込み、FFTベースなど)により演算数は変化します。また、精度(FP32、FP16、bfloat16、INT8など)によっても利用可能な演算ユニットや同時演算数が異なるため、同じアーキテクチャでもワークロードごとのFLOPS達成率は大きく変わります。
FLOPSが示さないこと — 限界と誤解
FLOPSは単に浮動小数点演算の量を示すにすぎず、実ワークロードの性能やユーザ体験を完全には表しません。主な限界は次のとおりです。
- メモリ帯域やレイテンシの影響:計算よりデータ移動がボトルネックになる場合、FLOPSは高くても実行時間は遅い。
- アルゴリズムの性質:条件分岐や不規則アクセスの多い処理はFLOPSだけでは評価できない。
- 精度の違い:半精度(FP16)や混合精度で高いFLOPSを出せても、精度要求によっては利用不可。
- エネルギー効率やコスト:FLOPS/WやFLOPS/ドルといった観点も重要。
このためHPLだけで比較するのではなく、HPCGや実アプリケーション、プロファイル結果を組み合わせて総合的に評価することが推奨されます。
FLOPSの測定と実装最適化の手法
実際にどのようにして高いFLOPSを引き出すかについて、主要なポイントと手法を挙げます。
- ベクトル化(SIMD)と命令セットの活用:AVX、SVE、NEONといったSIMD命令で同時に複数データを処理する。
- FMAの活用:FMA命令を使うことで同一サイクル内で乗算と加算を行い、理論上の演算密度を高める(ベンチマーク定義に注意)。
- ブロッキング・タイル化:メモリ階層を意識してデータの局所性を高め、キャッシュミスを減らす。
- 並列化:スレッド並列(OpenMPなど)や分散並列(MPI)で計算を分割する。
- 高性能数値ライブラリの利用:BLAS(OpenBLAS、Intel MKL)、cuBLAS、oneAPIなど、最適化済みライブラリを使うと短期間で高いFLOPSを得られる。
- プロファイリングとパフォーマンスカウンタ:PAPI、perf、Intel VTune、NVIDIA Nsightなどで命令数、メモリアクセス、キャッシュヒット率を計測してボトルネックを特定する。
ベンチマークと公平な比較
ハードウェア間で公平に比較する場合、ベンチマーク選定と設定が極めて重要です。HPLはピーク性能に近い値を出しやすく、Top500で標準化された設定がありますが、通信帯域や実アプリとの類似性が低い点が問題視されています。そのため、HPCG(High Performance Conjugate Gradients)は低い演算密度でメモリ・通信の影響をより反映するよう設計されています。機械学習用途ではMLPerfがワークロードに即したスイートを提供しており、推論・学習それぞれの負荷を評価できます。
エコシステムと今後のトレンド
近年のトレンドとしては、単にピークFLOPSを伸ばすだけでなく、ワークロードに応じた混合精度演算、テンソルコア/マトリクス演算ユニット、近接メモリやHBM(High Bandwidth Memory)、さらにはオンチップAIアクセラレータや特化型ASICの採用が進んでいます。これにより、同じアプリケーションでも従来のFP32中心のアーキテクチャより遥かに高い実効FLOPSを実現できる場面が増えています。
また、エネルギー制約下での性能(FLOPS/W)が重要になっており、持続可能性や運用コストを考慮した評価が広く行われるようになっています。
開発者への実践的アドバイス
FLOPSを意識してアプリを高速化する際のチェックリストです。
- まずプロファイルして本当に計算がボトルネックか確認する(I/Oや待機時間が原因でないか)。
- 数値ライブラリを試してみる:自前実装より最初はライブラリの利用で効果を確認。
- データレイアウトを見直す:連続メモリアクセスを促す配置にすることで帯域効率が上がる。
- ブロックサイズやスレッド数をチューニングする。最適は環境と入力サイズで変わる。
- 必要なら混合精度を検討するが、数値安定性を必ず検証する。
- 最終的にベンチマーク(HPL/HPCG/MLPerf)やプロファイル結果を使って効果を定量化する。
まとめ
FLOPSは計算性能を表す重要な指標ですが、単独では実運用性能や有用性を完全に示すものではありません。理論ピークと実効性能の差を理解し、適切なベンチマークとプロファイリングを組み合わせることが重要です。開発者はメモリ帯域やデータ局所性、並列化の質などを同時に改善することで、より現実的な高いFLOPS(=高い実効性能)を引き出せます。最後に、FLOPSはハードウェア比較の一側面に過ぎないことを念頭に置き、用途に最適な評価指標を採用してください。
参考文献
HPL (High-Performance LINPACK) — Netlib
投稿者プロフィール
最新の投稿
ビジネス2025.12.29版権料とは何か|種類・算定・契約の実務と税務リスクまで徹底解説
ビジネス2025.12.29使用料(ロイヤリティ)完全ガイド:種類・算定・契約・税務まで実務で使えるポイント
ビジネス2025.12.29ライセンス料の仕組みと実務ガイド:計算・交渉・契約・税務まで
ビジネス2025.12.29著作隣接権管理団体とは — 企業が知るべき仕組みと実務ポイント

