前回、コア数を増やしてもコア数ほどには性能があがらないという話をして、その理由の一つとしてオーバーヘッドの話をしました。
例えば、一つのプロセッサで計算量が100の処理を2つのプロセッサで実行させようとしたとき、相手のプロセッサに処理依頼をする、結果を受け取るといった処理がオーバーヘッドになります。その処理の計算量がそれぞれ20とすると、全体で処理量が140になってしまい、処理を理想的に2分割できたとしても各プロセッサの計算量は70になり、性能が2倍になることはありません(下図左)。もとの処理量が10倍の1000であれば、オーバーヘッドの計算量は変わらないため、状況はよくなります(下図右)
オーバーヘッドには、処理管理のオーバーヘッドや同期・通信のオーバーヘッドなどがあります。まず処理管理について説明します。シングルプロセッサにおいても、マルチプロセス(マルチタスク)OSがプロセスやタスクを管理して処理のディスパッチやスケジューリングを実行するオーバーヘッドがありますが、それと同様のオーバーヘッドがあります。すなわち、並列処理単位(タスクやスレッド)を管理するデータ(ID、プログラム先頭番地、レジスタの値など)をスケジューラ(例えばスレッドスケジューラ)によって扱うオーバーヘッドがあります。これが処理管理のオーバーヘッドです。
同期・通信のオーバーヘッドについても、マルチプロセス(マルチタスク)OSがプロセス間やタスク間で同期・通信処理を実行するときとほぼ同様のオーバーヘッドがあります。例えば通信処理では、データ送信処理とデータ受信処理が、どのようなタイミングや順序で実行開始したとしても、正しく、デッドロックせずにデータを受け渡しできるよう、バッファや排他制御を適切に使用して送受信を行うため、単なる代入ではない処理量を必要とします。
オーバーヘッドは、基本ソフトウェア開発者の方々が減らす努力をしておりますが、ゼロになることはありません。システムのオーバーヘッドを考慮した並列処理分割を考えることが重要です。
コメントをお書きください