MCPで接続 →

計算を入力してください

公式

広告

結果

全体の高速化率
3.077×
倍の高速化(元の処理との比)
Theoretical maximum speedup (s → ∞) 10×
並列効率 76.92%

アムダールの法則とは?

アムダールの法則は、コンピュータアーキテクトのジーン・アムダールが1967年に提唱した法則で、処理の一部しか並列化できない場合に得られる理論上の最大高速化率を予測します。並列コンピューティングの基礎となる考え方であり、プロセッサ・コア・スレッドを増強する前に、現実的な性能向上の見込みを把握するうえでエンジニアにとって欠かせない指針です。

タスクが逐次部分と複数プロセッサで処理される並列部分に分割される様子を示す図
アムダールの法則は、プログラムを逐次部分と、複数のプロセッサに分散できる並列部分に分けます。

この計算ツールの使い方

入力するのは2つの値です。1つは並列化可能な割合(p)——プログラム全体のうち並列実行できる部分の比率で、0〜1の値で指定します。もう1つは高速化係数(s)——並列化した部分に投入するプロセッサ数やコア数を表すのが一般的です。これらを入力すると、全体の高速化率、理論上の最大高速化率、並列効率が算出されます。

計算式の解説

計算式は次のとおりです。

$$\text{Speedup} = \dfrac{1}{(1 - p) + \dfrac{p}{s}}$$

\((1 - p)\) の項は、まったく高速化できない逐次処理の割合を表します。\(s\) が非常に大きくなると \(p/s\) は 0 に近づくため、高速化率は \(1/(1 - p)\) で頭打ちになります。これが、90%並列化されたプログラムでも、どれだけプロセッサを追加しても10倍を超えて速くなることはない理由です。

プロセッサ数に対する高速化の曲線が上限で平坦になる様子
高速化はプロセッサ数とともに上がりますが、逐次部分が決める上限に向けて頭打ちになります。

計算例

たとえば、プログラムの90%が並列化可能(\(p = 0.9\))で、プロセッサを4台使う(\(s = 4\))とします。すると分母は

$$(1 - 0.9) + \dfrac{0.9}{4} = 0.1 + 0.225 = 0.325$$

となります。高速化率は

$$\dfrac{1}{0.325} \approx 3.08 \text{倍}$$

です。理論上の最大高速化率は \(1 / 0.1 = 10\) 倍、並列効率は \(3.08 / 4 \approx 76.9\%\) となります。

結果の解釈

総合スピードアップは、入力したプロセッサ数 \(s\) で実際に得られるもので、例えば4.71×という結果は、並列化されたプログラムが単一プロセッサ版より約4.71倍高速になることを意味します。最大スピードアップ \(1/(1-p)\) は、無限に多くのプロセッサがある場合に漸近する絶対的な上限です。この両者のギャップは、どのくらい改善の余地があるかを示しています。総合スピードアップが既に最大に近い場合、ハードウェアを追加してもほぼ役立ちません。

効率は「使用しているプロセッサがどの程度に活用されているか」という問いに答えます。効率が100%に近いことは、各プロセッサがほぼ完全な1ユニット分のスピードアップを寄与していることを意味し、リソースの優れた利用です。低い効率(例えば30%未満)は、ほとんどのプロセッサが遊休状態であるか、シリアル部分で待機状態にあることを意味するため、ほとんど役に立たないハードウェアに対してお金を支払っていることになります。

シリアル分数 \(1-p\) が決定的な制限要因です。小さなシリアル分数でさえパフォーマンスを厳しく制限します。\(p=0.95\) では上限はわずか20×にすぎないため、16~32プロセッサを超えると、新しいプロセッサを追加してもほぼ何も得られません。実践的な経験則として、効率がコスト重視の作業で一般的な50~70%の許容閾値を下回ったら、プロセッサの追加を中止してください。その時点を過ぎるとお金を費やして得られる改善は消えてしまいます。上限をさらに高くするには、シリアル分数そのものを削減する必要があります。\(p\) を増加させるアルゴリズムの変更は、通常、単にコアを追加するだけよりはるかに大きな効果をもたらします。

重要用語と変数

  • 並列分数(\(p\))——プログラムの作業のうち、並列実行できる割合。0から1の間の小数で表されます。0.9という値は、ワークロードの90%がプロセッサ間で分割できることを意味します。
  • シリアル分数(\(1-p\))——単一プロセッサで順序実行する必要があり、並列化によってスピードアップできない部分。この分数は、総合スピードアップの厳しい上限を決定します。
  • 並列部分のスピードアップ(\(s\))——並列化可能な部分が加速される倍率。通常はその部分に適用されるプロセッサまたはコアの数と等しくなります。
  • 総合スピードアップ——単一プロセッサ実行時間と並列実行時間の比、\(1/\big((1-p)+p/s\big)\)。これは実世界のパフォーマンス改善です。
  • 最大スピードアップ——\(s\) が無限に増加するにつれて到達する理論的上限 \(1/(1-p)\)。シリアル分数によってのみ決定されます。
  • 並列効率——総合スピードアップをプロセッサ数で割ったもの、\(\text{スピードアップ}/s\)。パーセンテージで表され、各プロセッサがどの程度有効に活用されているかを測定します。

よくある質問

プロセッサを増やしても効果が頭打ちになるのはなぜ? 逐次処理の部分がボトルネックになるためです。逐次処理が支配的になると、プロセッサを追加してもほとんど効果が得られません。

並列効率とは何ですか? 高速化率をプロセッサ数で割り、パーセンテージで表した値です。各プロセッサがどれだけ効率よく使われているかを示します。

グスタフソンの法則との違いは? アムダールの法則は問題の規模が固定であると仮定します。一方、グスタフソンの法則は問題の規模がプロセッサ数に応じて拡大すると仮定するため、より楽観的な結果が得られます。

最終更新: