2011/04/04

アムダールの法則の紹介

はじめに

ソフトウェア開発において、性能測定を行うことがあります。
特にエンタープライズ(大企業)向けアプリケーションは、コア(CPU)数が多いマシン上で動作させることがよくあります。そこでコア数が1のときの処理性能を100としたとき、コア数2なら処理性能は2倍の200、コア数4なら処理性能は4倍の400となることを期待したいところですが、実際はそうなることはまずありません。たとえアプリケーションがマルチスレッドプログラミングを適切に実装していても、です。その主な理由を、次に列挙します。
  1. OS(オペレーティングシステム)や他のソフトウェアによる割り込み処理
  2. ハードウェア構造による排他処理(ファイルI/O、ネットワークI/Oなど)
  3. ソフトウェアによる排他処理(グローバル変数あるいはデータベースに対する排他処理など)
マシンではOSを含むさまざまなソフトウェアが動作し、これらのソフトウェアの処理にもコアを割り当てられます。つまり、該当アプリケーションの処理にコアが100%消費されるわけではありません。これが1です。

次に、たとえばハードディスクは同時に複数のデータを読み書きすることはできません。あるソフトウェアがハードディスクにアクセスしている間は、他のソフトウェアがハードディスクにアクセスしたくても待たされることになります。これが2です。

最後に、多くのソフトウェアはメモリ上あるいはデータベース上にデータを保持していて、必要に応じて更新したり参照したりします。そのとき、あるスレッド上でデータを更新している間は、他のスレッドはそのデータへのアクセスを待たなければなりません。さもないとデータに矛盾が起きるからです。これが3です。

ここでは、1~3の処理をひっくるめて「排他処理」とします。これらの排他処理のために、コア数を2倍、4倍に増やしても処理性能が2倍、4倍にならないわけです。これを計算式で示したものとして、アムダールの法則があります。

アムダールの法則

 アムダールの法則の詳細は、Wikipedia(英語/日本語)を参照してください。


十分なコア数を備えたマシン上で、排他処理の割合が20%のアプリケーションをスレッド多重度4で動作させた場合、スレッド多重度1の(並列処理がない)場合と比べて何倍の処理性能の向上が見込めるでしょうか?上のアムダールの法則の計算式を使って、次のように計算します。

= 1÷(0.2 + (1-0.2)÷4)
= 1÷(0.2 + 0.2)
= 1÷0.4
= 2.5
スレッド多重度を4倍にしても、処理性能が2.5倍しか向上しないことが判ります。Windows上で動作するアプリケーションの場合、マシンおよびアプリケーションの状況によりますが、タスクマネージャのCPU使用率が100%近くにならず、80%前後になっているかもしれません(Unix系マシンならiostatコマンドなどでCPU使用率を確認できる)。

アムダールの法則の「逆関数」を活用すれば、アプリケーションの排他率(並列処理ができない割合)を求めることができ、さらに、任意のスレッド多重度におけるアプリケーションの処理性能を予測することができるようになります。

2 件のコメント:

  1. CPU速度が10倍以上にならないアムダールの法則、勉強になります。

    返信削除
  2. CPU速度が10倍以上にならないアムダールの法則、勉強になります。

    返信削除