Roofline性能モデル
コードがメモリ律速か演算律速かを見誤ると最適化は空振りします。Rooflineモデルで到達可能性能の天井を事前に見積もれます。
- 1.演算強度(FLOP/転送バイト数)を横軸、実測性能を縦軸に取ると、メモリ帯域による斜めの天井と演算器のピーク性能による水平の天井が交わるRooflineが描けます。
- 2.交点の演算強度より低い処理はメモリバウンド、高い処理は演算バウンドで、最適化すべき対象が根本的に異なります。
- 3.キャッシュ階層ごとに帯域と演算強度が変わるため、単一の屋根ではなくL1/L2/DRAMそれぞれの天井を重ねた階層Rooflineで見積もる必要があります。
Rooflineモデルが解く問題
科学技術計算のカーネル(行列積、ステンシル計算、疎行列ベクトル積など)を高速化しようとしたとき、最初に立てるべき問いは「このカーネルの性能は何によって頭打ちになっているか」です。演算器を使い切れていないのか、それともメモリからデータを運ぶ帯域が足りていないのか。この診断を誤ると、演算器を増やしても速くならない処理にSIMD幅を広げたり、逆にメモリアクセスがボトルネックの処理をループ展開で演算器最適化してしまい、労力が報われません。
Rooflineモデルは、この診断を1枚の対数グラフで可視化する性能上限モデルです。横軸に演算強度(arithmetic intensity、AI)、縦軸に到達可能な演算性能(FLOP/s)を取ります。演算強度は、そのカーネルがメインメモリから1バイト運ぶごとに何FLOP計算するかを表す比率です。
演算強度 AI = 総演算量[FLOP] / 総メモリ転送量[Byte]
この比率が低い(データ1バイトあたりの計算が少ない)カーネルほど、メモリからデータを運ぶ速度に性能が縛られます。比率が高いカーネルほど、演算器そのものの処理速度に縛られます。Rooflineモデルはこの2種類の縛りを、2本の直線(実際には片方は水平線)として同じグラフ上に描きます。
2本の屋根線の導出
到達可能な性能は、メモリ帯域による制約と演算器ピーク性能による制約のうち、小さいほうで決まります。これがRooflineという名前の由来で、2本の線が作る折れ屋根の下側が「到達可能な性能」の上限になります。
到達可能性能 P_attainable = min( π, β × AI )
π : 演算器のピーク性能 [FLOP/s](水平の屋根)
β : メインメモリの帯域 [Byte/s](斜めの屋根、傾き β)
AI : そのカーネルの演算強度 [FLOP/Byte]
β × AI は「単位時間に運べるバイト数 × バイトあたりの演算数」なので、そのまま単位時間あたりの演算数(FLOP/s)になります。演算強度 AI が小さいうちは β × AI が π より小さく、この斜めの線が上限を決めます。AI が大きくなるにつれて β × AI は増え続けますが、演算器が処理できる速度には物理的な上限 π があるため、ある点から水平線 π が上限になります。この2本の線が交わる点の演算強度を**臨界演算強度(machine balance point)**と呼びます。
臨界演算強度 AI_crit = π / β
| 領域 | 条件 | 支配要因 | 典型的な処理 |
|---|---|---|---|
| メモリバウンド | AI が AI_crit 未満 | メモリ帯域 β | 疎行列ベクトル積、ステンシル計算、AXPY型ベクトル演算 |
| 演算バウンド | AI が AI_crit を超える | 演算器ピーク性能 π | 密行列同士の積(GEMM)、FFT(実装次第) |
カーネルの実行は「メモリからデータを運ぶ」作業と「運ばれたデータを演算する」作業の両方が必要です。理想的に両者が完全に重なって並行実行されると仮定しても、遅いほうの作業がボトルネックになり、全体の速度はその遅いほうに律速されます。Rooflineのminはこの「並行実行できても律速するのは遅いほうだ」という単純だが強力な仮定を表しています。
演算強度の見積もり方
演算強度はアルゴリズムの構造から見積もれます。例として密行列積(N次正方行列同士)とステンシル計算(1次元3点ステンシル)を比較します。
密行列積 C = A×B(N×N行列、キャッシュに乗らない素朴な実装)
演算量 ≈ 2×N³ FLOP(積和それぞれ1回ずつ)
メモリ転送量 ≈ 3×N² × 8Byte(A, B, Cを1回ずつ読み書きすると仮定した下限)
AI ≈ (2N³) / (24N²) = N/12 → Nが増えるほど演算強度が上がる
3点ステンシル(1次元, y[i] = a×x[i-1] + b×x[i] + c×x[i+1])
演算量 ≈ 5 FLOP/要素(乗算3 + 加算2)
メモリ転送量 ≈ 8Byte読み込み + 8Byte書き込み = 16Byte/要素(再利用を考えない下限)
AI ≈ 5/16 ≈ 0.3 → 要素数に依存せず一定
密行列積は問題サイズ N を大きくするほど演算強度が上がり、演算バウンド側へ移っていきます。一方ステンシル計算やスパース行列ベクトル積は、問題サイズを変えても演算強度がほぼ一定のまま低く留まり、恒常的にメモリバウンドです。この違いが、同じ「科学技術計算カーネル」でも最適化戦略を根本から分けます。
ステンシル計算やスパース演算では、タイリング(キャッシュブロッキング)でデータをキャッシュに乗せたまま複数回再利用し、メインメモリへの実転送量を減らすことでAIを右方向へシフトさせるのが定石です。これは演算量を変えずに分母(メモリ転送量)だけを削るため、同じ屋根グラフ上で点が右へ動き、より高い天井(場合によっては演算バウンド側)に届くようになります。
キャッシュ階層を考慮した階層Rooflineモデル
単純なRooflineモデルは帯域 β を「メインメモリ(DRAM)帯域」の1本に固定しますが、実際のプロセッサはL1/L2/L3キャッシュとDRAMという多段の記憶階層を持ち、それぞれ帯域も演算強度の基準も異なります。データがどの階層からどれだけ供給されたかによって、実効的な β は変わります。
階層ごとの屋根(傾きが階層ごとに異なる)
P_attainable = min( π,
β_L1 × AI_L1,
β_L2 × AI_L2,
β_DRAM × AI_DRAM )
一般に β_L1 > β_L2 > β_DRAM(下位階層ほど帯域は狭い)
AI_L1, AI_L2, AI_DRAM はそれぞれの階層から見た
「その階層からの転送バイトあたりの演算量」で、
同じカーネルでも階層ごとに異なる値になる
この**階層Roofline(cache-aware roofline model, CARM)**では、同じカーネルでも「DRAM基準で見ればメモリバウンド」だが「L2基準で見れば演算バウンドに近い」という状態がありえます。実測性能をどの階層の屋根と比較するかを取り違えると、最適化の当たりをつけ間違えます。たとえばタイリングによってワーキングセットをL2に収めた場合、評価すべきはDRAM帯域の屋根ではなくL2帯域の屋根であり、そこに対してどれだけ余地があるかを見る必要があります。
| 記憶階層 | 帯域の傾向 | 実効演算強度の傾向 | 見るべき場面 |
|---|---|---|---|
| L1キャッシュ | 最も広い | 最も高くなりやすい | レジスタブロッキング後の内側ループ |
| L2/L3キャッシュ | 中間 | タイリングで引き上げ可能 | キャッシュブロッキングの効果測定 |
| メインメモリ(DRAM) | 最も狭い | アルゴリズム本来の値に近い | ブロッキング前の素朴な実装 |
さらに、実運用では演算器のピーク性能 π も一枚岩ではありません。SIMD(ベクトル化)が効いているか、FMA(積和融合)命令を使えているかで到達できる水平線の高さ自体が変わります。したがって精密な診断では、πを「スカラー・非FMA」「SIMD・非FMA」「SIMD・FMA」の複数段に分け、実測点がどの段まで届いているかも合わせて確認します。これにより「メモリ帯域は使い切っているがベクトル化が効いていないため演算器の天井にはまだ届いていない」といった、単純な二分法では見えない中間状態も診断できます。
まとめ
- Rooflineモデルは、演算強度(FLOP/Byte)を横軸、到達可能性能を縦軸に取り、メモリ帯域による斜めの屋根と演算器ピーク性能による水平の屋根の
minで性能上限を可視化する。 - 屋根の交点(臨界演算強度 = π/β)より演算強度が低いカーネルはメモリバウンド、高いカーネルは演算バウンドで、最適化すべき対象(メモリアクセスパターンか演算器利用率か)が根本的に異なる。
- 密行列積は問題サイズとともに演算強度が上がるが、ステンシル計算や疎行列演算は演算強度がほぼ一定でメモリバウンドに留まりやすい。タイリングによるキャッシュ再利用は演算強度を右方向へシフトさせる代表的な対策。
- 実際のプロセッサは多段の記憶階層を持つため、単一のDRAM帯域だけでなくL1/L2/L3それぞれの帯域と演算強度を重ねた階層Roofline(CARM)で見積もることで、どの階層がボトルネックかをより正確に診断できる。
HPC・科学技術計算 Article
Roofline性能モデルを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
HPC
比較で見る軸
難易度: advanced / カテゴリ: HPC・科学技術計算 / タグ数: 5
導入後に効く点
交点の演算強度より低い処理はメモリバウンド、高い処理は演算バウンドで、最適化すべき対象が根本的に異なります。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- HPC・科学技術計算
- タグ数
- 5
判断チェックリスト
- 自社の用途が「HPC / 性能モデル」に近いか確認する。
- 強みである「演算強度(FLOP/転送バイト数)を横軸、実測性能を縦軸に取ると、メモリ帯域による斜めの天井と演算器のピーク性能による水平の天井が交わるRooflineが描けます。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。