1. 並列化には天井がある — アムダールの法則
プログラムには並列にできる部分と、どうしても順番にやるしかない部分(直列部分)があります。コアをいくら増やしても、直列部分は縮みません。だから全体の速度向上には上限がある — これがアムダールの法則です。
下のスライダーで並列化できる割合 p とコア数 N を動かしてください。p が 1 に近いほど伸びますが、少しでも直列部分が残ると、コアを増やしても曲線が寝てしまうのが見えます。
高速化の曲線 — コアを増やしても頭打ちになる
青=実際の高速化 S(N)、灰の点線=理想(S=N、コア数どおりに速くなる夢)、橙の点線=上限 1/(1−p)。青い点が今のコア数。理想線からどんどん離れ、上限の水平線に張り付いていくのが並列化の頭打ちです。
S = 1 / ((1 − p) + p / N)
p=並列化できる割合、N=コア数。N→∞ でも S → 1/(1−p) が上限。p=0.9 なら最大でも10倍、p=0.95 でも20倍。残り5%の直列部分が全体の足を引っ張る。
POINT — 直列部分が全てを支配する
たとえコアが無限にあっても、高速化は 1/(1−p) で頭打ち。p=0.95(95%を並列化)でも上限は20倍で、そこから先はコアを何千個積んでも意味がない。だから並列化では「残った直列部分をいかに削るか」が本質になる。
2. 仕事を分けて同時に走らせる — マルチコア
アムダールの法則を、実際の時間の帯(スケジュール)で見てみましょう。仕事は「直列部分(1コアしか働けない)」+「並列部分(コア数で山分けできる)」に分かれます。コアを増やすと並列部分だけが縮み、直列部分はそのまま残る。だから全体の時間はゼロには近づきません。
N を動かすと、並列部分が薄く分割されて全体が短くなる様子と、それでも橙の直列部分が壁として残るのが見えます。
実行スケジュール — 並列部分だけが縮み、直列部分は残る
一番上=1コアの基準時間(=1.0)。下の各行=N個のコアの働き。橙=直列部分(コア0だけが実行)、緑=各コアに山分けした並列部分。白い縦線が現在時刻。N個目の帯の右端が基準より手前で終わるほど高速化。
注意 — 理想どおりには縮まない
現実の並列化にはおまけのコストがつく。仕事の分割・結果の集約・コア間の通信・同期の待ち合わせ、そして負荷の偏り(一番遅いコアに全体が引きずられる)。これらが積もると、実測はアムダールの理想線よりさらに下に来る。だから「コアを増やすほど得」は、ある点を超えると逆転しうる。
3. 1つの命令で複数のデータを — SIMD
並列はコアを増やすだけではありません。1個のコアの中でも、1つの命令で複数のデータをまとめて処理できます。これがSIMD(Single Instruction, Multiple Data)。ベクトルの足し算のように、8個の要素を8本のレーンで同時に加算します。ふつうの1個ずつ(スカラ)に比べ、命令数もサイクル数もまとめて減ります。
下でレーンの幅を変えてみてください。幅が広いほど、同じ配列を処理するのに必要なサイクル数が減っていきます。
スカラ vs SIMD — 1命令で何要素を同時に足せるか
上=スカラ(1命令で1要素ずつ、16サイクル)、下=SIMD(1命令で幅ぶんの要素を同時に)。処理中のレーンが光ります。同じ16要素でも、幅8なら2サイクルで終わる — 命令が1回で運ぶデータ量が増えるほど速いのが分かります。
必要サイクル数 ≈ ⌈ 要素数 / レーン幅 ⌉
幅が2倍になるとサイクルはおよそ半分。CPU の SSE/AVX、GPU の warp、これらはみな「1命令・多データ」でスループットを稼ぐ。ただし全要素が同じ処理のときに限る(データ並列)。
POINT — データ並列という別軸
マルチコアが「別々の仕事を別のコアで(タスク並列)」なら、SIMD は「同じ処理を大量のデータに一斉に(データ並列)」。画像・音声・行列・ニューラルネットの計算は、まさにこの「同じ演算を膨大な要素へ」の形。だから SIMD と、その極端形である GPU が桁違いに効く。
4. メニーコアへ — GPU の物量作戦
CPU は数個〜数十個の賢くて大きなコアを持ちます。対して GPU は、小さくて単純なコアを数千個並べ、同じ処理を大量のデータに一斉にぶつける(SIMT)。1個1個は非力でも、数の暴力でデータ並列な仕事を一瞬で片づけます。
下で GPU のコア数を動かしてください。同じデータ量を塗りつぶすのに、CPU が何十サイクルもかける横で、GPU は数サイクルで走り抜けます。
CPU 8コア vs GPU メニーコア — 同じ仕事を何サイクルで終えるか
左=CPU(8コア)、右=GPU(多数コア)。同じマス(データ)を上から順に処理します。1サイクルで塗れるマス数=コア数。GPU は1サイクルで一気に何行も塗り、CPU が延々とサイクルを重ねる間に走り抜けます。下のサイクル数が桁違いになるのがメニーコアの威力です。
一歩先へ — スケールさせ続けるための工夫
アムダールは「問題サイズは固定」という前提。実際はコアが増えたら問題も大きくすることが多く、その視点では高速化の上限が消える(グスタフソンの法則)。現代の最前線は、CPU・GPU・専用チップ(TPU/NPU)を適材適所で組み合わせるヘテロジニアス計算、そして計算そのものよりメモリ帯域と電力が壁になる時代。並列化の腕の見せ所は、コアを増やすことより「データの動きを減らす」ことへ移っている。