並列計算とベクトル化
複数の演算資源を用いて計算を高速化する手法群。スケーラビリティの法則、並列化モデル、データ並列(SIMD/ベクトル化)を含む。
スケーラビリティの法則
- アムダールの法則: 逐次部分(オーバーヘッド)があるため並列化の速度向上は飽和する。1コアで100秒(逐次1秒+並列99秒)の処理は1000コアでも約1.1秒で、上限は逐次部分に支配される。
- グスタフソンの法則: 「十分に大きな規模の問題は効率的に並列化できる」。問題規模を増やす立場。
- ストロングスケール: 問題サイズを固定してコア数を増やす(アムダール的)。
- ウィークスケーリング: プロセッサあたりの問題サイズを固定。スパコンでは95%以上が望ましい。
フリンの分類
命令ストリームとデータストリームの組で計算機を分類する。
- SISD: 単純な逐次。
- SIMD: 1命令で複数データ。ベクトル演算、GPUの行列演算。
- MISD: 冗長化・信頼性(原発・航空機・衛星など)。
- MIMD: 命令もデータも完全独立。
並列化モデル
- MPI: プロセス並列フレームワーク(SPMD)。各プロセスがランクを持ち、コミュニケータ(
MPI_COMM_WORLD)単位で集団通信(Bcast/Gather/Scatter/Alltoall/Reduce)や1対1通信(ブロッキング/ノンブロッキング)、片方向通信(Get/Put)を行う。1つ落ちると全部落ちる。 - OpenMP: スレッド並列。
#pragmaでfork-joinし、共有変数/プライベート変数、reduction節、criticalによる排他制御を扱う。OpenACCはそのGPU版。 - ハイブリッドモデル: 1コア1プロセス(MPI)+プロセス内スレッド並列(OpenMP)。一般にオーバーヘッドが少なく効率的。
- ファーストタッチ: NUMA環境で、データを実際に使うスレッドが初期化することで近接メモリに物理配置する最適化。
- グリーンスレッド: OSのネイティブスレッドではなく言語/VM上の軽量スレッド。
ベクトル化(SIMD)
- AVX-512: x86_64 の512bit SIMD ISA拡張(double×8 / float×16)。masked load 等。
- インターリーブされたデータ(一定ストライド)のベクトル化、不規則な間接アクセス(グラフ・粒子シミュレーション・ハッシュ集約)の競合フリーベクトル化(in-vector reduction)など、データ再編成を避ける研究が盛ん。
- データ依存性: write→read(フロー依存)、read→write(反依存)、write→write(出力依存)。リダクションで解消できる場合がある。
- ループ並列化の自動化(TornadoVM + Soot + z3 による静的解析)も研究されている。
関連: _moc-systems / cuda / cpu-architecture-isa
Roofline モデル(性能上限解析)
計算カーネルの実行時間の理論下限を、メモリ転送時間と演算時間の max で見積もるモデル。「演算律速 (compute-bound)」か「帯域律速 (bandwidth-bound)」かを切り分け、実装がどこまで最適に近いかを定量化する。realtime-vla-v2 / realtime-vla の推論最適化で「あとどれだけ縮められるか」を示す根拠として使われた。
GEMM 1 演算の下限
次元 N×K×M の BF16 行列積について、下限は
t_roofline = max( 2KM / T_bandwidth , NKM / T_compute )
- 第1項: 重み行列(K×M)の HBM ロード時間。活性化(N×K)と結果(N×M)はネットワークでは L2 キャッシュに載るため、メモリ項は重み2列ぶんのみを数える。
- 第2項: テンソルコアでの MAC 演算時間。
- RTX 4090 では帯域 1.01 TB/s、ブースト後 91.4 TMAC/s を使用。
ネットワーク全体への適用
pi0 の推論を 24 個の GEMM に分解し、各演算の roofline を和で合算する(sum-of-parts)。連続する2つの matmul は理論上オーバーラップ可能だが、Vision Encoder と LLM は演算律速、Action Expert は帯域律速とはっきり分かれるため、重なりは無視してよい。
| 1 view | 2 views | 3 views | |
|---|---|---|---|
| Roofline (GEMM のみ) | 12.8 ms | 19.7 ms | 26.7 ms |
| + 同期オーバーヘッド | 13.7 ms | 20.6 ms | 27.6 ms |
| 実装値 | 20.0 ms | 27.3 ms | 36.8 ms |
実装は下限まで約 30% の余地。すなわち「もう最適に近い」ことの証明になる。
同期オーバーヘッドの推定
1378 個のカーネルを連続起動する実験で、純計算(fused, no-sync)を基準に同期コストを測定:
- PyTorch 逐次起動: +12.92 ms(CPU オーバーヘッド込み)
- CUDA Graph: +1.72 ms
- ソフトウェアバリア(Triton の
atomic_add/atomic_orで全ブロック同期): +0.86 ms - fused no-sync: 0 ms(基準)
ソフトウェアバリアは CUDA Graph より速いが、グリッドサイズ整合やレジスタ増の副作用があり実用ではなく「下限の指標」として用いた。
ロボット実行への類推(V2)
vla-inference-optimization では、計算の roofline に倣い、ロボット動作の実行速度の上限を「motion bounded(加速度・速度・ジャークがハード限界)」と「control bounded(制御遅延で成功率が崩れる)」の2領域に分解する upperbound 解析を提案している。
関連: vla-inference-optimization / triton-language / parallel-computing