アムダールの法則による高速化と限界の計算
アムダールの法則は、プログラムの一部を並列実行でき、残りを直列実行する必要がある場合の理論上最大の高速化率を見積もる方法です。並列化可能な割合とプロセッサ数をご入力いただくと、予測される高速化率、プロセッサ効率、短縮後の実行時間に占める直列処理の割合を確認できます。また、直列部分が定める漸近的な上限も表示しますので、プロセッサを追加すべきか、先に逐次コードを最適化すべきかをご判断いただけます。
無料で実行
アムダールの法則で分かること
アムダールの法則では、元の実行時間を並列化可能な部分と直列部分に分けます。p を並列化でき、N 個のプロセッサがその処理を完全に均等分担する場合、正規化実行時間は (1 − p) + p/N となります。理論上最大の高速化率は、この実行時間の逆数です。本計算では、並列処理が均等に配分され、プロセッサ間の通信コストがなく、プロセッサを追加しても直列部分は速くならないという理想的なスケジューリングを仮定しています。したがって、結果はベンチマークの予測値ではなく上限値です。実システムでは、同期、メモリ競合、タスク起動、負荷の偏り、データ転送などにより、得られる高速化率が低くなる場合があります。それでも上限値は、測定結果が妥当か、改善の余地がどの程度あるかを判断する基準になります。並列割合は小数でご入力ください。たとえば 95 パーセントは 0.95 です。
ボトルネックと拡張限界の読み方
直列割合は 1 から並列割合を引いた値で、長期的な高速化の上限を決めます。並列処理が 95 パーセントなら直列処理は 5 パーセント残るため、プロセッサを無制限に増やしても高速化率は 20 倍を超えません。直列部分がある場合、漸近高速化率の項目にこの上限を表示します。直列ボトルネック比率は別の観点を示します。選択したプロセッサ数で短縮された実行時間のうち、直列実行が占める割合です。この比率は、プロセッサを増やすほど大きくなることがあります。元は実行時間の 5 パーセントだけだった部分でも、並列部分を多数のプロセッサに分配した後は支配的になり得ます。並列効率は高速化率をプロセッサ数で割った値です。効率の低下は、追加する各プロセッサの効果が小さくなることを示します。これらの結果から、強スケーリングの収穫逓減と、本質的な直列制約を把握できます。
性能計画での結果の活用方法
楽観的な推測ではなく、代表的な負荷を測定したプロファイルから始めてください。本番設計で実際に同時実行できる処理だけを、並列化可能な時間として分類します。次に複数のプロセッサ数で計算し、追加の高速化とインフラ費用を比較してください。プロセッサを倍増しても結果がほとんど変わらない場合は、直列部分への対処が優先です。逐次経路の最適化、アルゴリズムの変更、調整処理の削減、または実行ごとの独立した作業量の増加をご検討ください。この計算は、コア、ワーカー、GPU、分散ノードを増設する前に、線形な拡張を誤って仮定しないために役立ちます。回帰レポートでは、実測高速化率を理論上限と比較し、差の原因を調べる基準にもできます。アムダールの法則は固定サイズの負荷を扱います。資源とともに負荷を増やす場合は、グスタフソンの法則が別の計画上の問いに適しています。
活用例
マルチコア最適化の計画
固定負荷の並列化に開発工数を投じる前に、予定するプロセッサ数で得られる最大の改善をご確認いただけます。
効果が逓減する理由の説明
クエリ、調整役、その他の直列段階が変わらない場合に、ワーカー追加の効果が次第に小さくなる理由を示します。
理論値とベンチマークの比較
理論上限を実測高速化率の基準にし、スケジューリング、通信、競合による差を調査できます。
よくある質問
並列割合とは何ですか?
元の実行時間のうち、複数のプロセッサに分配できる割合です。0 から 1 までの小数でご入力ください。
なぜ理論上最大の高速化率なのですか?
処理の完全な分割を仮定し、通信、同期、起動、競合、スケジューリングの負担を含めないためです。実際の改善は通常これを下回ります。
漸近高速化率とは何ですか?
プロセッサ数が無限に近づくときの高速化の上限です。0 でない直列割合を s とすると、上限は 1/s です。
直列ボトルネック比率は何を示しますか?
選択したプロセッサ数で短縮された時間のうち、直列処理が占める割合と、逐次実行が支配的になる状況を示します。
プロセッサが 1 個なら高速化率は常に 1 ですか?
はい。アムダールの理想モデルでは、1 個のプロセッサが両方の部分を元の正規化時間で実行するため、高速化率と効率はともに 1 です。
API による計算の料金はいくらですか?
API リクエスト 1 回につき $0.002 です。同じ決定論的な計算をブラウザー画面でもご利用いただけます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev/amdahl \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"parallel_fraction":0.95,"processors":16}'const res = await fetch("https://api.kit.forhosting.com/dev/amdahl", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"parallel_fraction": 0.95,
"processors": 16
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/amdahl",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"parallel_fraction": 0.95,
"processors": 16
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/amdahl", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"parallel_fraction":0.95,"processors":16}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"parallel_fraction":0.95,"processors":16}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/amdahl", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"parallel_fraction": 0.95,
"processors": 16
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.amdahl",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |