1. Situation
1.a. この記事について
並列や並行といった言葉を使う際に少し悩むことがあったので整理します。
(本記事では、Task-Level Parallelを扱い、Data-Level Parallelについては触れません。)
1.b. 誤った解釈
以下の解釈は誤りを含んでいます
「マルチスレッドは並行処理であり、並列処理ではない」
1.c. CPUの基本的な話
並列や並行の話をする際の用語を抑えておきます。
| 用語 | 種類 | 説明 | 参考 |
|---|---|---|---|
| CPU | ハードウェア | トランジスタなどで構成される、計算処理や制御処理の装置 | Wikipedia, 富士通 |
| Core | ハードウェア | CPUの中の演算単位。複数あると物理的に同時実行可能 | Supermicro |
| OS | ソフトウェア | CPUを操作してプロセスやスレッドを管理する | Wikipedia |
| Process | ソフトウェア | OSで管理される、実行中のプログラムの単位。独立したメモリ空間やリソースを持つ | Wikipedia |
| Thread | ソフトウェア | プロセス内で命令を順に実行する単位。 | Wikipedia |
| Runtime System | ソフトウェア | アプリケーションコードを実行するための仕組み。スレッドやメモリなどを管理 | Wikipedia |
| 用語 | 説明 | 参考 |
|---|---|---|
| 並行処理(concurrent) | 複数の処理を同時に進めているように見える状態。必ずしも物理的に同時に動くわけではない。 | Concurrent computing - Wikipedia |
| 並列処理(parallel) | 複数の処理が物理的に同時に実行されている状態。複数コアや演算ユニットが必要。 | Parallel computing - Wikipedia |
2. Complication
2.a. マルチスレッドは並行処理なのか?
必ずしも並行処理というわけではありません。
マルチスレッドが並列処理になる必要十分条件は、複数のスレッドが同時に実行される物理的リソース(CPUコアや演算ユニット)が存在し、それぞれのスレッドがそのリソース上で同時に命令を実行できることです。
具体例を次に示します。
- CPUが2コア以上あり、2つのスレッドが同時に実行される場合 → 並列処理にすることができる
- スレッド数がCPUコア数以下で順次実行される場合 → 並行処理(一部並列を含むこともある)
ただ、少なくとも、シングルコアで動いている場合は、マルチスレッドは並行処理といえます。
2.b. 各言語のライブラリについて
各言語のランタイムによって、並行処理や並列処理の仕組みは変わってきます。
適当にライブラリや言語仕様を把握しておくと理解が早いです。本ページでは深く触れませんが、軽くまとめます。
| 言語 | 並行処理有名ライブラリ | 並列処理有名ライブラリ | 備考 |
|---|---|---|---|
| C++ | std::thread、std::async、OpenMP | Open MPI | 高速化としてSIMDなどもある(Data-Level Parallelのため本記事では扱わない) |
| Python | threading、asyncio、concurrent.futures | multiprocessing、concurrent.futures | GILの影響でCPUバウンドのPythonコードは並列化できない場合があったが、3.13で改善されつつある(Exploring Python 3.13: Hands-On with the GIL Disablement)。また、concurrent.futuresは並列処理でも平行処理でも使えるため両方に配置をした。 加えて、asyncioはスレッドとしては一つで動くが、スケジューリングなどを考えると並行のように考えることができるため、そちらに配置をした。 |
| Go | goroutine | goroutine | GoのRuntimeが勝手に解釈し必要に応じて並列化てくれる。Container-aware GOMAXPROCS - The Go Programming Language, Goroutine はなぜ軽量スレッドと称されるのか; Orenge Diary |
| Rust | std::thread、async/await、Tokio、rayon-rs/rayon | rsmpi | rayonのドキュメントを見るとParallelという説明を多くされていますが、スレッドについて制御をしている文脈を感じ取ったため並行として分類した。 |