写真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秒 になります。台数と追加時間を変え、どの部分が短くなるか比べてください。
1枚1秒。共通の準備と仕上げは合わせて2秒。すべて説明用の仮定です。
1台の基準は、準備・仕上げ2秒+写真の処理8秒=10秒。複数台では8枚を均等に分けます。1台を選んだときは分担の追加時間を0秒として計算します。
1台の基準:10秒
選んだ条件:6秒
共通の仕事写真の処理分担の追加時間
| 時間の内訳 | 選んだ条件 |
|---|---|
| 共通の準備・仕上げ | 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
自分の言葉で説明してみよう
「同時実行、依存関係、直列部分、分担に増える時間から、並列処理の速さを説明できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。




