アムダールの法則とグスタフソンの法則の違い:前提・式・スケーリング・例を比較

どちらも、プロセッサを増やしたときにどれだけ速くなるかを見積もる法則ですが、前提が違います。アムダールの法則は、問題の大きさを固定して、同じ仕事を速く終わらせることを考えるので、並列にできない部分が速度向上の上限を決めます。グスタフソンの法則は、実行時間を固定して、プロセッサを増やした分だけ大きな問題を解くことを考えるので、速度向上はプロセッサの数にほぼ比例して増えます。2つは矛盾するのではなく、違う問いに答えています。

項目アムダールの法則グスタフソンの法則
固定するもの問題の大きさ(全体の仕事量)実行時間(プロセッサ1つあたりの仕事量)
問い同じ問題を、どれだけ速く解けるか同じ時間で、どれだけ大きな問題を解けるか
式(Nはプロセッサ数)S = 1 / ((1 − p) + p / N)S = s + (1 − s) × N = N − s × (N − 1)
割合の測り方pは、1台で実行したときに並列化できる部分が占める時間の割合sは、N台で並列に実行したときに逐次部分が占める時間の割合
Nを増やしたとき1 / (1 − p) で頭打ちになるNにほぼ比例して増え続ける
計算例p = 0.95 なら、N = 100 で約17倍、Nを無限大にしても20倍が上限s = 0.05 なら、N = 100 で約95倍
対応するスケーリング強いスケーリング弱いスケーリング
見え方悲観的。わずかな逐次部分が上限を決める楽観的。問題を大きくすれば並列化が報われる
当てはまる例決まった大きさの入力をすぐ処理したいとき。1枚の画像の処理、対話的な応答など格子を細かくしたシミュレーション、より大きなデータやモデルを同じ時間で処理したいとき
共通して入っていないもの通信・同期のオーバーヘッド、負荷の偏り、メモリ帯域の不足通信・同期のオーバーヘッド、負荷の偏り、メモリ帯域の不足

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

アムダールの法則
問題の大きさが決まっていて、応答時間を短くしたいとき。並列化の上限を見積もり、逐次部分を減らすべきかを判断するのに使います。
グスタフソンの法則
プロセッサを増やした分だけ問題を大きくできるとき。大規模なシミュレーションやデータ処理で、より細かく、より大きく解く価値を見積もるのに使います。
評価の示し方
並列性能を報告するときは、強いスケーリングと弱いスケーリングのどちらで測ったかを明記します。条件が違うと、同じプログラムでも速度向上率は大きく変わります。

よくある質問

2つの法則は矛盾しませんか?

矛盾しません。アムダールの法則は問題の大きさを固定し、グスタフソンの法則は実行時間を固定しているので、答えている問いが違います。また、逐次部分の割合も、アムダールの法則では1台で実行したとき、グスタフソンの法則ではN台で実行したときの時間で測るので、同じ数値を代入して比べることはできません。

90%を並列化できるのに、最大10倍にしかならないのはなぜですか?

残りの10%は、プロセッサをいくら増やしても短くならないからです。並列部分の時間がゼロに近づいても、全体の時間は元の10%より短くならないので、速度向上は 1 / 0.1 = 10倍で頭打ちになります。

実際の速度向上が、これらの法則の予測より小さくなるのはなぜですか?

どちらの法則も、プロセッサ間の通信や同期、負荷の偏り、共有するメモリ帯域の不足などを含んでいないからです。プロセッサが増えるほどこれらの影響が大きくなり、並列効率が下がります。

自分のプログラムには、どちらを当てはめればよいですか?

入力の大きさが決まっていて、結果を早く得たいならアムダールの法則です。プロセッサが増えたら、より細かい格子や大きなデータを扱いたいならグスタフソンの法則です。同じプログラムでも、使い方によって当てはまる法則が変わります。

理解度チェック

処理全体の90%を並列化できるプログラムを、プロセッサの数を限りなく増やして実行したとき、理論上の最大の高速化率はどれか。

  1. A10倍
  2. B90倍
  3. C無限大
答えと解説を見る

正解:A. 10倍

アムダールの法則では、並列化できる割合をp、プロセッサ数をNとすると、高速化率は 1/((1 − p) + p/N) です。p = 0.9 なら、Nを無限大にしても 1/0.1 = 10倍が上限で、N = 10でも約5.3倍にとどまります。並列化できない部分がわずかでも上限を決めるため、逐次部分を減らすことが重要です。問題の規模を大きくして並列部分を増やす考え方はグスタフソンの法則です。

処理全体の50%を占める部分を4倍速くした。全体の速度向上率はいくらか(アムダールの法則)。

  1. A2倍
  2. B1.6倍
  3. C4倍
答えと解説を見る

正解:B. 1.6倍

改善後の時間は、速くしない残りの50%(0.5)と、4倍速くした50%(0.5÷4=0.125)の合計で0.625になります。速度向上率は1÷0.625=1.6倍です。速くした部分をどれだけ速くしても、残りの50%はそのまま残るので、全体は最大でも2倍にしかなりません。全体を大きく速くするには、時間を多く占める部分を見つけて改善する必要があります。

アムダールの法則から得られる、性能の改善の進め方についての教訓として最も適切なものはどれか。

  1. A時間を多く使っている部分(よくある場合)を速くすることを優先する
  2. Bめったに実行されない部分から先に速くする
  3. Cどの部分を速くしても、全体への効果は同じである
答えと解説を見る

正解:A. 時間を多く使っている部分(よくある場合)を速くすることを優先する

全体の1%しか使っていない部分を無限に速くしても、全体は約1%しか速くなりません。一方、80%を使っている部分を2倍速くすれば、全体は約1.7倍になります。そのため、まずプロファイラなどで時間を多く使っている部分を見つけ、そこから改善するのが基本です。「よくある場合を速くせよ」は、コンピュータの設計でも繰り返し使われる原則です。

  1. グスタフソンの法則が示す考え方として正しいものはどれか。
  2. 並列計算の評価でいう「強いスケーリング」と「弱いスケーリング」の違いとして正しいものはどれか。
  3. 性能の改善を表す「速度向上率(スピードアップ)」の求め方として正しいものはどれか。

性能評価・プロファイリングの練習問題へ

関連する用語の解説

アムダールの法則
プログラムの一部だけを並列化したとき、全体の高速化は並列化できない部分によって制限されるという法則。例えば90%を並列化しても、最大で10倍までしか速くならない。
グスタフソンの法則
プロセッサの数を増やすとき、扱う問題も大きくすれば並列にできる部分の割合が増え、プロセッサの数にほぼ比例した効果が得られるという考え方。
強いスケーリング
問題の大きさを固定してプロセッサを増やし、どれだけ時間が短くなるかを見る並列の性能の評価。
弱いスケーリング
プロセッサあたりの問題の大きさを固定して全体を大きくし、時間が一定に保たれるかを見る並列の性能の評価。
並列効率
並列化による速度向上率をプロセッサの数で割った値。コアがどれだけ有効に使われているかを表す。

関連する比較