Amdahlの法則 並列加速と効率計算

Amdahlの法則を使って、マルチプロセッサ環境の並列加速比、理論上の最大加速比、実行時間、並列効率を計算します。

プログラムの逐次部分、プロセッサ数、元の実行時間を入力すると、加速比と効率を算出できます。

Amdahlの法則 並列加速と効率計算
Amdahlの法則を使って、マルチプロセッサ環境の並列加速比、理論上の最大加速比、実行時間、並列効率を計算します。

Amdahlの法則について

Amdahlの法則は、計算機アーキテクトの Gene Amdahl が 1967 年に提唱したもので、計算を複数のプロセッサに分散したときに得られる理論上の高速化を表します。これは並列計算において最も重要かつ広く引用される原則の一つであり、プロセッサをいくら増やしても得られる性能向上には厳しい上限があることを示します。 この法則は、実世界のプログラムが 2 つの部分から成るという単純な観察から始まります。1 つは本質的に逐次的で、各ステップが前の結果に依存するため順番に実行しなければなりません。もう 1 つは並列化可能で、独立したタスクに分割して複数プロセッサで同時に実行できます。Amdahlの法則は、この 2 つの関係を数式化したものです。 式は S(n) = 1 / (p + (1 − p) / n) です。S は加速比、p は逐次実行しなければならない割合(0〜1)、n はプロセッサ数、(1 − p) は並列化可能な割合を表します。n が無限大に近づくと、(1 − p) / n は 0 に近づき、加速比は 1/p に近づきます。これが理論上の最大加速比です。この上限は逐次割合だけで決まり、どれだけプロセッサを使っても超えられません。 影響は大きいです。プログラムの 10% が逐次的なら(p = 0.1)、どれだけプロセッサを増やしても最大加速比は 1/0.1 = 10× です。逐次部分が 20% なら最大は 5×、50% なら最大は 2× です。ある点を超えると、プロセッサを増やしても逓減効果しか得られません。逐次部分がボトルネックになるからです。これは「Amdahlの壁」と呼ばれることもあります。 具体例を見てみましょう。単一コアで 3,600 秒かかるプログラムがあり、そのうち 80% は並列化可能だとします(p = 0.2)。8 個のプロセッサを使うと、加速比は S(8) = 1 / (0.2 + 0.8/8) = 1 / (0.2 + 0.1) = 1 / 0.3 = 3.33× です。並列実行時間は 3600 / 3.33 = 1080 秒です。16 個のプロセッサなら S(16) = 1 / (0.2 + 0.8/16) = 1 / (0.2 + 0.05) = 4× で、時間は 900 秒になります。8 から 16 に倍増しても性能向上は 20% にとどまります。逐次 20% が全体を支配するためです。 並列効率は、加速比をプロセッサ数で割り、百分率で表したものです。E = S(n)/n × 100% で表されます。これは各プロセッサがどれだけ有効に使われているかを示します。100% の効率は、各プロセッサが完全に活用されている理想状態です。実際には、逐次部分のためにプロセッサ時間が無駄になるので、プロセッサ数が増えるほど効率は下がります。効率が 50% を下回ると、追加のプロセッサにかかるハードウェアコストのほうが、節約できる時間より大きくなります。 Amdahlの法則は、逐次割合 p が問題サイズに依存せず一定だと仮定します。これに対して Gustafson の法則(1988)は補完的な視点を与えます。問題サイズが大きくなると、より多くの作業が並列化可能になり、プロセッサ数が増えても効率は高く保たれます。2 つの法則を合わせると、並列スケーリングの全体像が見えてきます。Amdahlの法則は悲観的ですが固定サイズの問題を正確に表し、Gustafson の法則は楽観的で、問題サイズがプロセッサ数とともに増える場合に適用されます。 Amdahlの法則の実用例には、CPU/GPU アーキテクチャ設計、クラウド資源の割り当て、高性能計算のアルゴリズム分析、既存システムにプロセッサを追加したときの投資対効果の見積もりなどがあります。計算の逐次割合を見つけて減らすこと——より良いアルゴリズム、同期オーバーヘッドの削減、データ構造の再設計など——が、Amdahlの壁を押し上げる最も効果的な方法です。

Amdahlの法則の例

さまざまな並列化シナリオで、逐次割合が到達可能な最大加速比をどう制約するかを示します。

パラメータ加速比備考
p=0.05, n=8, T=1000 s5.93×逐次割合が低い(5%)。S(8) = 1/(0.05+0.95/8) = 1/0.1688 = 5.93×。最大加速比 = 1/0.05 = 20×。8 プロセッサではほぼ線形にスケールします。
p=0.2, n=16, T=3600 s逐次割合 20%。S(16) = 1/(0.2+0.8/16) = 1/0.25 = 4×。並列実行時間 = 900 s。最大加速比は 5× に制限されます。
p=0.5, n=8, T=1000 s1.6×逐次割合が高い(50%)。8 個のプロセッサがあっても加速比は 1.6× に過ぎません。プロセッサ数に関係なく最大加速比は 2× です。
p=0.1, n=32, T=7200 s7.8×逐次割合 10%、32 プロセッサ。S(32) = 1/(0.1+0.9/32) ≈ 7.8×。最大加速比 = 10×。16 前後を超えると、さらにプロセッサを増やしても効果は小さくなります。

Amdahlの法則計算機の使い方

  1. 逐次割合 p を入力します。これはプログラムのうち順番に実行しなければならない部分の割合です。値は 0(完全並列)から 1(完全逐次)までです。たとえば、15% が逐次なら 0.15 を入力します。
  2. プロセッサ数 n を入力します。これは、現在使っている、または使う予定の並列処理単位(コア、スレッド、ノードなど)の数です。
  3. 単一プロセッサでの元の実行時間(秒)を入力します。これは実際の並列実行時間を計算するために使われます。
  4. 「加速比を計算」をクリックすると、加速比 S(n)、理論上の最大加速比(1/p)、並列実行時間、並列効率が表示されます。
  5. プロセッサ数を調整して逓減効果を確認してください。n を 2 倍にして、ハードウェアコストの増加に対して加速比がどう変わるかを見てみましょう。

Amdahlの法則 FAQ

逐次割合は実際には何を表しますか?
逐次割合 p には、並列化できないプログラムのすべての部分が含まれます。順次の初期化と終了処理、ディスクからのデータ読み込み、並列段階間の同期バリア、プロセス間通信のオーバーヘッド、そしてステップ N が終わるまでステップ N+1 を始められないようなデータ依存のある箇所です。5〜10% のような小さな逐次割合でも、到達可能な最大加速比を大きく制限します。
Amdahlの法則と Gustafson の法則の違いは何ですか?
Amdahlの法則は、問題サイズが固定されていることを前提にします。つまり、同じ問題をより速く解きたい場合です。Gustafson の法則は、追加のプロセッサを使って同じ時間でより大きな問題を解くことを前提にします。Amdahlの法則は固定ワークロードに対する悲観的な上限を示し、Gustafson の法則は問題サイズが大きくなると並列効率が高く保たれることを示します。どちらもそれぞれの文脈では正しいです。
実際に加速比が 1/p を超えることはありますか?
スーパーリニア加速——つまり加速比が n を超える現象——は、キャッシュ効果によって時折観測されます。問題を複数のプロセッサに分割すると、それぞれのプロセッサのデータが専用キャッシュに収まり、遅い主記憶アクセスを回避できるためです。ただし、漸近的な意味ではスーパーリニア加速は Amdahl の上限 1/p を超えられず、理論モデルで捉えきれないハードウェア要因で説明されます。
並列効率とは何で、なぜ重要ですか?
並列効率 E = S(n)/n × 100% は、各プロセッサ能力のうちどれだけが生産的に使われているかを示します。効率 100% は、追加されたプロセッサがすべて比例的に加速に寄与する理想状態です。50% 未満の効率は、調整コストと逐次ボトルネックが追加容量の半分以上を食っていることを意味し、プロセッサ追加の投資価値が低いことを示します。
プログラムの逐次割合をどう減らせますか?
一般的な方法には、ロックフリーなデータ構造で同期バリアを減らす、ステップ間のデータ依存をなくすようアルゴリズムを再設計する、順次初期化を並列計算とパイプライン化する、非同期 I/O でデータ読み込みと処理を重ねる、そして推測ではなくプロファイリングで真のボトルネックを見つける、などがあります。逐次割合を半分にできれば、到達可能な最大加速比は 2 倍になります。
Amdahlの法則は GPU 計算にも適用できますか?
はい。GPU には何千ものシェーダコアがありますが、kernel 起動、CPU と GPU メモリ間のデータ転送、順次のセットアップコードには大きな逐次オーバーヘッドがあります。データ転送とセットアップが総時間の 20% を占める GPU プログラムは、GPU の計算性能がどれだけ高くても CPU 比で 5× を超える加速は得られません。CPU-GPU 間のデータ転送を減らし、kernel の占有率を高めることが、GPU における逐次割合削減に相当します。