ソフトウェア開発において、性能測定を行うことがあります。
特にエンタープライズ(大企業)向けアプリケーションは、コア(CPU)数が多いマシン上で動作させることがよくあります。そこでコア数が1のときの処理性能を100としたとき、コア数2なら処理性能は2倍の200、コア数4なら処理性能は4倍の400となることを期待したいところですが、実際はそうなることはまずありません。たとえアプリケーションがマルチスレッドプログラミングを適切に実装していても、です。その主な理由を、次に列挙します。
- OS(オペレーティングシステム)や他のソフトウェアによる割り込み処理
- ハードウェア構造による排他処理(ファイルI/O、ネットワークI/Oなど)
- ソフトウェアによる排他処理(グローバル変数あるいはデータベースに対する排他処理など)
次に、たとえばハードディスクは同時に複数のデータを読み書きすることはできません。あるソフトウェアがハードディスクにアクセスしている間は、他のソフトウェアがハードディスクにアクセスしたくても待たされることになります。これが2です。
最後に、多くのソフトウェアはメモリ上あるいはデータベース上にデータを保持していて、必要に応じて更新したり参照したりします。そのとき、あるスレッド上でデータを更新している間は、他のスレッドはそのデータへのアクセスを待たなければなりません。さもないとデータに矛盾が起きるからです。これが3です。
ここでは、1~3の処理をひっくるめて「排他処理」とします。これらの排他処理のために、コア数を2倍、4倍に増やしても処理性能が2倍、4倍にならないわけです。これを計算式で示したものとして、アムダールの法則があります。
アムダールの法則
アムダールの法則の詳細は、Wikipedia(英語/日本語)を参照してください。
十分なコア数を備えたマシン上で、排他処理の割合が20%のアプリケーションをスレッド多重度4で動作させた場合、スレッド多重度1の(並列処理がない)場合と比べて何倍の処理性能の向上が見込めるでしょうか?上のアムダールの法則の計算式を使って、次のように計算します。
= 1÷(0.2 + (1-0.2)÷4)スレッド多重度を4倍にしても、処理性能が2.5倍しか向上しないことが判ります。Windows上で動作するアプリケーションの場合、マシンおよびアプリケーションの状況によりますが、タスクマネージャのCPU使用率が100%近くにならず、80%前後になっているかもしれません(Unix系マシンならiostatコマンドなどでCPU使用率を確認できる)。
= 1÷(0.2 + 0.2)
= 1÷0.4
= 2.5
アムダールの法則の「逆関数」を活用すれば、アプリケーションの排他率(並列処理ができない割合)を求めることができ、さらに、任意のスレッド多重度におけるアプリケーションの処理性能を予測することができるようになります。
CPU速度が10倍以上にならないアムダールの法則、勉強になります。
返信削除CPU速度が10倍以上にならないアムダールの法則、勉強になります。
返信削除