並列処理とは?仕事を分ける仕組みと、速くならない理由

30秒でわかる答え

並列処理は、複数の計算を同時に進める仕組みです。一つの仕事を分担するときは、同時に進められる部分へ分けて結果を合わせます。順番が必要な部分や分担の追加時間が残るため、台数に比例して速くなるとは限りません。

写真8枚を、一枚ずつ処理する。同じ速さの作業場が四つあれば、待つ時間も4分の1になりそうです。でも、写真を配る準備や、全部そろえて一覧にする仕事は、どこへ行くのでしょうか。

並列処理とは、複数の計算を同時に進めること

並列処理は、複数の計算を同時に進める仕組みです。 一つの仕事を分担して解く場合は、同時に進められる部分へ分け、複数の計算資源で処理し、必要な結果を合わせます。「並列計算」とも呼ばれます。

たとえば、別々の写真へ同じ明るさ調整を適用する仕事なら、それぞれの処理を分担できる場合があります。ただし、前の結果を待つ部分や、データを配って集める時間は残ります。処理装置を二倍にしただけで、全体が必ず二倍速くなるわけではありません。

計算資源には、CPUのコアやGPUの演算器などがあります。装置ごとの役割はCPU・GPU・NPUの違いで扱い、この記事では仕事の分け方と時間の関係を追います。

逐次処理・並行処理・並列処理は何が違う?

似た名前でも、見ている点が違います。AとBという二つの仕事を例にすると、次のように区別できます。

用語この例での進め方
逐次処理Aを終えてからBへ進む
並行処理AとBを、どちらも進行中の仕事として扱う。途中で切り替えて進める方法も含む
並列処理AとBの計算を、実際に同じ時刻に進める

一つの処理担当が「Aの途中→Bの途中→Aの続き」と切り替えるだけでも、複数の仕事を進行させられます。この切り替えだけなら、その瞬間に二つを計算しているわけではありません。

別々の計算資源でAとBを同時に動かせば、並列になります。並行処理が必ず一つのコアだけで動く、という意味でもありません。複数の仕事をどう進行させるかと、実際に同時実行するかを分けて考えると、用語が混ざりにくくなります。

同時に動かせる場所があれば、次は仕事をどう配るかです。

写真8枚を、分割・処理・合流の順で追う

ラボの模型で、花の写真8枚に同じ明るさ調整をかけ、最後に一覧へ並べます。ここでは各写真の処理が、他の写真の処理結果を待たずに進められるとします。

工程四つの処理台を使う場合
分割して渡す8枚を2枚ずつに分け、各台へ渡す
同時に処理する各台が、自分の担当する2枚を順に処理する
結果を合わせる完成した写真を集め、元の順番で一覧へ並べる

「並列」は、八つの結果の順番を勝手に変えてよいという意味ではありません。担当を分けても、どの写真の結果かが分かるようにし、必要な順番へ戻します。

また、全枚数が必要な一覧なら、先に二枚が終わっただけでは完成しません。最後の担当が終わるまで待つ必要があります。分ける前と、合流するときにも仕事があるのです。

ユイ

写真を処理する時間だけなら短くできても、一覧ができるまでの時間は別なんですね

ピコ

そう。台数で減る時間と、減らない時間を分けて足してみよう

台数を増やすと、何秒短くなる?

1枚の処理に1秒かかり、台数に関係なく必要な準備と仕上げに合計2秒かかる、と仮定します。1台なら 2 + 8 = 10秒。4台で均等に分ければ、写真の処理は一台あたり2枚なので2秒です。

でも、ここへ分担するための追加時間が2秒かかるなら、全体は 2 + 2 + 2 = 6秒 になります。台数と追加時間を変え、どの部分が短くなるか比べてください。

同じ8枚を処理する時間を比べる
1枚1秒。共通の準備と仕上げは合わせて2秒。すべて説明用の仮定です。

1台の基準は、準備・仕上げ2秒+写真の処理8秒=10秒。複数台では8枚を均等に分けます。1台を選んだときは分担の追加時間を0秒として計算します。

共通の仕事写真の処理分担の追加時間

時間の内訳選んだ条件
共通の準備・仕上げ2秒
写真の処理8枚 ÷ 4台 × 1秒 = 2秒
分担の追加時間2秒

4台では、2 + 2 + 2 = 6秒。1台の10秒より4秒短くなります。

各台は同じ速さで、担当枚数も均等。共通の仕事と写真処理は重ねず、指定した追加時間を合計に足す模型です。実機の性能予測ではありません。

台数と追加時間の組合せを表で読む
台数追加0秒追加2秒追加8秒
1台10秒10秒10秒
2台6秒8秒14秒
4台4秒6秒12秒
8台3秒5秒11秒

追加0秒でも、4台なら全体は4秒。10秒の4分の1にはなりません。追加8秒の条件では、2・4・8台のどれも1台より長くかかります。

追加時間を0秒にしても、4台の合計は4秒です。共通の2秒が残るため、10秒の4分の1である2.5秒にはなりません。8台に増やしても、合計は3秒。写真の処理はさらに短くなりますが、共通の仕事はそのままです。

逆に追加時間を8秒にすると、4台では12秒となり、1台の10秒より長くなります。分担で短縮した時間より、分担のために増える時間が大きければ、並列化しても遅くなります。

この模型では仕事量と処理台の速さを固定しています。固定量の仕事に順番が必要な部分が残ると、高速化にも限界がある。この関係を考えるのがアムダールの法則です。仕事の量や手順自体を変える場合まで、この模型の秒数で予測することはできません。

台数だけでは決まらないことが見えました。実際の計算では、どこに待ち時間が生まれるのでしょうか。

並列処理が速くならない、三つの理由

前の結果が必要で、先へ進めない

3 + 2を計算し、その答えを4倍するなら、後半は答えの5を待ちます。この手順のまま二つを別の台へ渡しても、同時には始められません。こうした関係をデータ依存と呼びます。

一つの計算の流れを細かく見たいときは、CPUが命令を処理する仕組みで、値が変わる順番を追えます。別のアルゴリズムで依存を減らせる場合はありますが、台数を増やすだけで順序の条件が消えるわけではありません。

分担が偏り、最後の担当を待つ

同じ2枚ずつでも、写真ごとの処理時間が違えば、同時には終わりません。ある台だけ大きな画像を担当すると、ほかの台が終わってからも、その結果を待つ場合があります。

枚数だけでなく仕事の重さも考えて割り当てる工夫を、負荷分散と呼びます。先ほどの教材は各写真が同じ1秒という条件だったので、この偏りを省いていました。

配る・運ぶ・そろえる時間が増える

計算を始める準備、データの転送、各担当の進み具合を合わせる同期にも時間がかかります。短い計算を細かく分けすぎると、計算そのものよりこの負担が目立ちます。

必要なデータをメモリから運ぶ速さにも限りがあります。計算する場所が空いていても、材料が届くまでは進めません。実際に速くなるかは、分割前後で同じ仕事を測って確かめます。

パイプラインや分散処理も、同じ意味?

パイプラインは、処理を段階に分け、別々の仕事の段階を重ねる方法です。写真Aの書き出し中に、写真Bの調整を進める、といった形を考えると分かりやすくなります。一枚が全段階を通る時間と、次々に完成する枚数は、別の見方です。

並列性を生かす方法の一つですが、先ほどの「同じ仕事を別々の処理台へ配る」形と、まったく同じ配置ではありません。CPU内部のパイプラインも、複数コアそのものとは区別します。

分散処理は、ネットワークでつながった複数のコンピューターなどへ仕事を分ける構成を指します。その上で計算を同時に進めることもあるので、並列処理と重なる場合があります。「同時に実行するか」と「どこへ配置するか」の違いです。分散した装置間では、データを送る通信も考える必要があります。

一台の中でも複数の機械でも、分けられる仕事と待つ仕事を見ることが出発点になります。

GPUは、AIのどんな計算を並べている?

並列処理の速さを見るときは、計算する場所の数に加えて、仕事を分けられるか、何を待つか、分担で何秒増えるかを考えます。四つの台があっても、完成までの時間が必ず4分の1になるわけではないと説明できるようになりました。

では、AIには、多数の場所へ分けやすい計算がどこにあるのでしょうか。GPUの記事の「行列演算を並べるとはどういうこと?」では、数値を掛けて足す仕事の形と、計算へデータを届けるメモリの役割を続けて読めます。

この記事について

LAB WHITEBOARD

自分の言葉で説明してみよう

「同時実行、依存関係、直列部分、分担に増える時間から、並列処理の速さを説明できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。