マルチコアでどれだけ性能が向上できるのか

前記のように、並列に実行できるプロセス群に処理を分割すれば、マルチコアのそれぞれのコアが並列に仕事ができるので性能が上がる。しかし、コア数に比例して性能が上がるとは限らない。

人間の場合で考えると、複数の作業者がいても、管理者がそれぞれの作業者に仕事の割り振りを考えている時間は、管理者だけが働いており、作業者は指示待ちということになる。このように、1人の人しか働けない仕事と、複数の人が分担して働ける仕事がある。

コンピュータの処理も同様で、仕事のおぜん立てや割り振り、並列に実行した仕事の結果の集計などは、1個のプロセサコアで実行せざるを得ない。一方、分割された仕事は複数のコアで並列に処理を行うことができる。

図2.2 1コア実行と4コアでの並列実行の様子

1個のコアでしか実行できない処理の量をWs、複数のコアで並列に実行できる処理の量をWpとし、両方を1個のコアで実行した場合の処理時間をそれぞれTs(図2.2ではTs1とTs2の和)とTpとする。これをN個のコアを持つシステムで実行すると、1個のコアでしか実行できないTs時間は変わらず、N個のコアで並列に処理できる部分の時間はTp/Nに短縮される。従って、全体の実行時間は、Ts+Tp/Nとなる。これをAmdahlの法則という。

なお、この法則を述べたGene Amdahl氏はIBMでSystem 360を開発したアーキテクトで、それまで、事務用と科学技術計算用と分かれていたコンピュータに360度全方位の処理ができる汎用コンピュータという考え方を導入し、また、同一の命令セットを実行するシリーズのコンピュータというバイナリ互換の考え方を確立した人物である。

1個のコアで両方の仕事を実行した場合にはTs+Tpの時間が掛っていたので、Nコアを使うことによる性能向上は

となる。ここで全体の処理量の中のTsの部分の比率をsと書くと

となる。すべての処理が1コアでしか実行できずsが1の場合は、P(N)=1でNコアを使っても性能は向上しない。一方、s=0の場合はP(N)=Nでコア数倍の性能が得られる。一般的にはsは0ではないので、並列に実行できるプロセス群に処理を分割したとしても、Nコアのマルチコアプロセサで常にN倍の性能が得られるわけではない。1コアでしか実行できないsの比率が大きくなると多くコアが遊んでしまい性能向上の度合いが減少するので、マルチコアプロセサを有効に利用するにはsを小さくするプログラミングが重要になる。

図2.2では、並列に実行できる部分は同じ実行時間であるとしたが、この部分のコードに条件分岐が含まれており、データに応じて処理の内容が変わるというプログラムも多い。また、まったく同じコードが実行される場合でも、割り算などの実行時間がデータ値に依存する命令が含まれていたり、メモリアクセスのキャッシュミスの有無などがあるとそれぞれのプロセサの実行時間はバラついてくる。

図2.3 ロードインバランスがある場合の実行状況

このように並列化した各プロセサの実行時間にバラつきがある状況をロードインバランス(Load Imbalance)があるという。図2.3のように4つのプロセサコアの合計の実行時間はTpでも、ロードインバランスがあると終了時間が一番遅いコアで並列部の実行時間がきまり、Tp/4よりも長い時間が掛ってしまう。このため、マルチプロセサを有効に利用するためには、ロードインバランスが小さくなるようにプログラムを作ることが重要である。

図2.3に見られるように、最後の順次処理の部分は、すべての並列処理が終わったことを確認してから、開始する必要があるという場合が多い。しかし、各プロセサが、他のすべての並列処理が終わったことを確認するためは、ある程度の時間が必要である。この時間を同期時間という。結果として、並列処理の実行状況は図2.4のようになる。

図2.4 他のプロセサの処理の終了を知るには、同期時間が必要

すべてのプロセサの処理が終了したことを知るには、例えば並列処理の前に、メモリのどこかの番地に0に初期化したカウンタを作っておき、並列処理を行う各プロセサは処理を終わると、そのカウンタを読み、+1してカウンタに書き戻すというような処理を行う。そして、処理の終わったプロセサはこのカウンタを読むループを実行し、カウントがプロセサの数に達したら、すべての並列処理が終わったと判定する。

しかし、この処理ではカウンタの読み込みから+1して書き戻しを行う間は他のプロセサがカウンタをアクセスしないように排他処理をする必要がある。また、1つのカウンタに多くのプロセサがアクセスするので、メモリアクセス時間が長くなるという問題もあり、同期時間は無視できないこのため、並列処理の効率を高めるためには同期時間を短くすることも重要になる。