Parallelism とは?多くのことを同時に行う
parallelism は、通常は複数の CPU コアやマシンに作業を分散させることで、複数の計算を同じ瞬間に実行することです。
parallelism は、文字どおり多くのことを同時に行う行為です。並行性が重なり合うタスクを構成することであるのに対し、parallelism はそれらを実際のハードウェア上で同時に実行することです。複数のコア、複数のマシン、あるいはその両方です。作業を worker 間で分割することで、大きな計算をより速く終わらせる方法です。
parallelism が必要とするもの
真の parallelism は、複数の命令ストリームを一度に実行できるハードウェアを必要とします。複数の CPU コア、複数のマシン、あるいは GPU です。それがなければ、タスクは並行(交錯)になれるだけで、真に同時にはなれません。
parallelism と並行性
並行性は構造(多くのタスクをさばく)についてです。parallelism は実行(それらを同時に動かす)についてです。並行のコードは十分なコアがあれば並列に動けますが、そうする必要はありません。parallelism は並行の作業を速く実行する 1 つの方法です。
parallelism の種類
- Data parallelism: 同じ操作を多くのデータ項目に一度に適用する。
- Task parallelism: 異なる独立したタスクを同時に実行する。
- 1 台のマシン内でのマルチコア parallelism。
- 多数のマシンにまたがる分散 parallelism。
並列化の限界
worker を増やしても永遠にはスケールしません。調整のオーバーヘッド、共有リソースの奪い合い、問題の本質的に逐次な部分(アムダールの法則)が高速化に上限を課します。ある点を過ぎると、parallelism を増やしても得られる効果は逓減します。
簡単な例
テスト suite を 4 つのコアで動く 4 つのシャードに分割すると、シャードが均衡していて同じリソースを奪い合わない限り、およそ 4 分の 1 の時間で終わりえます。
CI における parallelism
build やテストシャードの並列化はより速い pipeline のための主要なレバーですが、コアが必要です。小さな runner では、並列の作業は同じ少数のコアを奪い合うだけでほとんど速くなりません。より大きな runner(Latchkey)は本物のコアを提供するため、並列の job が実際に同時に動きます。
重要なポイント
- parallelism は複数の計算を同じ瞬間に実行し、本物のマルチコアハードウェアを必要とします。
- これは実行であり、並行性は構造です。両者は関連しますが別物です。
- 高速化は、調整のオーバーヘッドと作業の逐次部分によって上限が決まります。