並列処理は、複数の演算資源を使って処理を同時に進める考え方です。複数CPUだけでなく、マルチコアCPUや一つのコア内のベクトル演算などにも関係します。資源を増やしても、処理時間が同じ割合で短くなるとは限りません。
並行と並列を分ける
並行は複数の仕事を進行させる構成を表し、一つのCPUで切り替えて進める場合も含みます。並列は複数の仕事・演算を同時に実行することに着目します。
フリンの分類を比較する
命令の流れとデータの流れが、それぞれ単一(Single)か複数(Multiple)かで分類します。「命令の流れ」は一つの命令だけ、という意味ではなく、実行する命令列の流れです。
| 分類 | 命令ストリーム | データストリーム | 捉え方 |
|---|---|---|---|
| SISD | 単一 | 単一 | 逐次処理の基本モデル |
| SIMD | 単一 | 複数 | 同じ演算を複数のデータ要素に適用する |
| MISD | 複数 | 単一 | 同一の入力データの流れに異なる処理を適用する分類。一般的な実機の例は少ない |
| MIMD | 複数 | 複数 | 複数の処理要素が異なる命令列で異なるデータを処理する |
SIMD:同じ計算をまとめる
例として、配列AとBの各要素を足し合わせる処理を考えます。A[0]+B[0]、A[1]+B[1]などへ同じ加算を適用するイメージです。ベクトル命令で一つのCPU内にある複数の演算レーンを使う場合もあり、「MがあればCPUパッケージが必ず複数」とは言えません。
MIMD:異なる仕事を同時に進める
マルチコアや複数ノードのシステムなどで、各処理要素が別々の命令列とデータを扱うモデルです。共有メモリか分散メモリかは別の分類軸です。実際の構成では、MIMDの各コアがSIMD命令を使うなど、複数の特徴を組み合わせます。
SISD・MISDを覚えるポイント
SISDは単一の命令ストリームとデータストリームを扱うモデルで、「プログラムに命令が一個だけ」という意味ではありません。MISDは分類の定義を押さえ、一般的なCPUやGPUを無条件に当てはめないようにします。
並列化で速くならない場合
分割できない処理、処理同士の依存関係、同期や通信、メモリ帯域の競合、負荷の偏りなどが制約になります。4コアなら常に4倍速い、とは限りません。まず独立して進められる部分と、順番を守る必要がある部分を区別します。
確認問題:同じ加算を複数データへ適用する分類は?
SIMDです。SISDは単一命令・単一データの流れ、MIMDは複数命令・複数データの流れです。分類はCPUパッケージの個数だけで決まりません。
noteでCPU性能の計算へ進む
分類を整理したら、CPU・メモリ計算教材でクロック周波数・CPIなどの性能指標を復習しましょう。並列プログラミングやフリンの分類だけを詳しく解説する専門教材ではなく、試験の計算学習へ進むための案内です。

コメント