並列計算のFlynn分類 ─ SISD/SIMD/MISD/MIMDの系統
GPUもベクトルもマルチコアも、命令流とデータ流の組合せで整理できます。SISD/SIMD/MISD/MIMDの4分類とSPMD/SIMTの派生を原理から押さえ、現実のアーキテクチャの位置づけを地図化できます。
- 1.Flynn分類は命令流(1か多)とデータ流(1か多)の2軸×2値でSISD/SIMD/MISD/MIMDの4種に整理する、1966年提唱の分類法。
- 2.現実のCPUベクトル拡張はSIMD、マルチコアやクラスタはMIMD、GPUは多数コアのMIMD上で各コアがSIMTで動く複合構造として位置づく。
- 3.実務ではMIMDの実装としてSPMD(同一プログラムを多数で実行)、SIMDの緩和としてSIMT(スレッド単位の分岐を許す)という派生が主流。
2つの軸で並列性を切る
並列計算機は種類が多く、ベクトルプロセッサ・マルチコア・GPU・クラスタが一見ばらばらに見えます。これらを統一的に整理するのが、マイケル・フリンが1966年に提唱した Flynn分類(Flynn's taxonomy) です。発想は単純で、計算機を次の2つの軸だけで切ります。
- 命令流(Instruction Stream):同時に走る命令の系列が1本か、複数本か。
- データ流(Data Stream):その命令が処理するデータの系列が1本か、複数本か。
各軸が「Single(単一)/Multiple(複数)」の2値を取るので、組合せは2×2で4種類になります。頭文字を並べて SISD/SIMD/MISD/MIMD と呼びます。重要なのは、これが論理的な分類であって特定の製品ではない点です。1つの実装が階層ごとに別の分類を取ることもあります(後述のGPUが典型)。
データ流 → Single Multiple
命令流 ↓
Single SISD SIMD
Multiple MISD MIMD
4分類それぞれの中身
順に、何が「1」で何が「多」なのかを正確に押さえます。
SISD(Single Instruction, Single Data) は古典的な逐次計算機です。1つの命令流が1つのデータに作用します。教科書的な単一コアのデータパスと制御がこれにあたります。ただし現代のスカラCPUはパイプラインやアウトオブオーダ実行で命令を重ねるため、純粋なSISDではなく「論理的にはSISDだが内部で命令レベル並列を持つ」と理解するのが正確です。
SIMD(Single Instruction, Multiple Data) は1つの命令を複数データへ一斉に適用します。1本の命令流が、多数のデータ要素を同時に処理する。CPUのベクトル拡張(SSE/AVX/NEON)や旧来のベクトルプロセッサがこれです。制御(フェッチ・デコード)が1系統で済むため、演算器に資源を集中できます。詳細はSIMDとベクトル演算の原理を参照してください。
MISD(Multiple Instruction, Single Data) は複数の命令流が同一のデータに作用する形で、4分類で最も実例が乏しいものです。冗長系の多重化(同じ入力を異なる方式で計算し結果を照合する高信頼システム)や、データを段階的に加工するシストリックアレイ/パイプラインを「1つのデータが複数の処理段を通る」と見なしてMISDに分類する立場もありますが、解釈には議論があります。
MIMD(Multiple Instruction, Multiple Data) は複数の命令流がそれぞれ別のデータを処理する、最も一般的な並列形態です。マルチコアCPU、対称型マルチプロセッサ、分散クラスタがすべてここに入ります。各コア(各ノード)が独立したプログラムカウンタを持ち、自律的に進みます。
| 分類 | 命令流 | データ流 | 代表例 |
|---|---|---|---|
| SISD | 単一 | 単一 | 古典的な単一コア・スカラCPU |
| SIMD | 単一 | 複数 | ベクトル拡張(AVX/NEON)・ベクトル機 |
| MISD | 複数 | 単一 | 冗長多重系・シストリックアレイ(諸説あり) |
| MIMD | 複数 | 複数 | マルチコア・SMP・分散クラスタ |
「流(stream)」は実行中の系列の本数です。SIMDが命令流1本なのは、たとえ8要素を処理しても発行される命令は1つだからです。MIMDが命令流複数なのは、各コアが独立にフェッチ・デコードするからです。SIMDは命令を共有し、MIMDは共有しない――この一点が両者を分けます。
なぜMISDだけ実例が乏しいか
4分類のうちMISDが浮くのは偶然ではありません。並列化の目的はスループット向上、すなわち「同じ時間で多くのデータを捌く」ことにあります。SIMDはデータを増やし、MIMDはデータと命令の両方を増やすことでこれを達成します。一方MISDはデータを1つに固定したまま命令だけ増やすため、スループット向上に直結しません。用途は性能ではなく信頼性(多重照合)や特殊なストリーム処理に偏り、結果として商用の主流にはなりませんでした。Flynn分類が「4象限のうち1つが事実上空席」という非対称を抱えるのは、この目的の偏りに由来します。
系統と派生 ─ 年代で追う
Flynn分類は骨格にすぎず、実機はその上に派生を重ねてきました。命令流・データ流の枠は保ったまま、実装上の緩和や具体化が加わります。年代と分岐を整理します。
- 1966年:Flynn分類の提唱。 4象限の骨格が定義される。
- 1970年代:SIMDの実体化(ベクトル機)。 Cray-1(1976年)に代表されるベクトルプロセッサが、1命令で配列を流すSIMDを商用化する。
- 1980年代:MIMDの分岐。 メモリの共有形態で2系統に割れる。共有メモリ型(全コアが同一アドレス空間を見る、SMP)と分散メモリ型(各ノードが独自メモリを持ちメッセージ交換で協調する、クラスタ)。
- 1980年代後半:SPMDの定式化。 MIMDの実装パターンとして、全プロセッサに同一プログラムを配り、各自が自分のID(ランク)で担当データを切り分ける SPMD(Single Program, Multiple Data) が広まる。命令流は論理的に複数(各自が独立に分岐できる)だが、コードは1本という運用上の工夫。
- 2000年代:マルチコアの一般化。 1チップ複数コアがMIMDを身近にする。
- 2000年代後半:SIMTの登場(GPU)。 NVIDIAがGPGPU向けに SIMT(Single Instruction, Multiple Threads) を定式化。SIMDを緩めて、各レーンを「分岐できるスレッド」として見せる。
Flynn 4分類(1966)
├─ SISD ── スカラCPU(内部はILPで命令を重ねる)
├─ SIMD ── ベクトル機 / CPUのSSE・AVX・NEON
│ └─ SIMT(GPUのワープ実行:SIMDをスレッド単位に緩和)
├─ MISD ── 冗長多重系 / シストリックアレイ(解釈に議論あり)
└─ MIMD ── マルチコア / SMP / クラスタ
├─ 共有メモリ型(SMP・NUMA)
├─ 分散メモリ型(クラスタ・MPI)
└─ SPMD(同一プログラムを多数で実行=実装パターン)
SPMDとSIMTという2つの派生
実務で頻出する2つの派生を、本家との違いとして正確に押さえます。
SPMD はMIMDのプログラミングモデルです。Flynn分類上はあくまでMIMD(各プロセスが独立した命令流を持ち、自分の分岐を取れる)ですが、書くコードは1本で、if (rank == 0) のように自分の役割で処理を分けます。MPIによるクラスタ計算や、マルチスレッドプログラムの多くがこの形を取ります。SPMDは分類ではなく運用スタイルである点が要点で、ここを混同しないことが上級の分かれ目です。
SIMT はSIMDの緩和です。SIMDが「1命令で固定長ベクトルの全要素を必ず処理する」のに対し、SIMTは多数のスレッドをワープ(32本など)に束ね、1命令を全レーンへ流しつつ、各レーンに独立した分岐結果とアドレスを持たせます。レーンごとに行き先が割れると、ハードウェアが実行マスクで経路を直列に通す(分岐ダイバージェンス)。つまりプログラマにはMIMD的に見え、実行はSIMD的という二面性を持ちます。詳細はGPUアーキテクチャの原理を参照してください。
| 観点 | SIMD | SIMT | SPMD(MIMD実装) |
|---|---|---|---|
| 命令の共有 | 全要素で1命令を共有 | ワープ内で1命令を共有 | 各プロセスが独立に発行 |
| レーン/スレッドの分岐 | 不可(述語で代替) | 可(直列化のコスト) | 完全に独立 |
| プログラマの視点 | ベクトル1本を操作 | スレッド1本ぶんを記述 | プロセス1本ぶんを記述 |
| Flynn上の位置 | SIMD | SIMDの緩和 | MIMD |
GPUは1つに収まらない ─ 階層で見る
最も誤解されやすいのがGPUの位置づけです。GPUは「SIMD」「MIMD」のどちらか一方ではなく、階層ごとに異なる分類を取る複合構造です。
GPU全体 ── 多数のSM(演算ユニット)が独立に動く → MIMD
└ 各SM内 ── ワープ単位で1命令を全レーンへ流す → SIMT(SIMDの緩和)
GPUは数十個の演算ユニット(NVIDIAのSM)を並べ、各ユニットが独立して別の命令流を進めます。この粒度ではMIMDです。一方、各ユニットの内部ではワープを束ねてSIMTで動くため、この粒度ではSIMD系です。「GPUはSIMDかMIMDか」という問いが噛み合わないのは、観察する階層を指定していないからです。同じ理由で、AVXを持つマルチコアCPUも「コア間はMIMD、コア内はSIMD」の複合と見なせます。
Flynn分類を単一のラベルとして実機に貼ろうとすると破綻します。現代のプロセッサは階層ごとに並列性の種類が異なるためです。「どの粒度で命令流とデータ流を数えているか」を明示してはじめて分類が定まります。試験でも実務でも、まず階層を切り分けるのが正解への近道です。
「Flynn分類は命令流(1か多)×データ流(1か多)の2軸でSISD/SIMD/MISD/MIMDの4種」「SIMDは1命令を複数データへ、MIMDは複数命令が複数データへ」「MISDは実例が乏しい」「SPMDはMIMDの実装パターンで分類そのものではない」「SIMTはSIMDを緩和してスレッド単位の分岐を許す」「GPUはMIMD上でSIMTが動く複合」の6点が頻出です。SIMD(1命令で複数データ)とSIMT(複数スレッドで1命令)の混同に注意。
まとめ
- Flynn分類は命令流とデータ流の各2値の組合せでSISD/SIMD/MISD/MIMDの4種に整理する論理分類で、1966年提唱。
- SIMDは命令を共有して複数データを捌き、MIMDは命令もデータも独立。MISDはデータを増やさないため実例が乏しく、4象限が非対称になる。
- 派生として、MIMDの運用パターンがSPMD(同一プログラムを多数で実行)、SIMDの緩和がSIMT(スレッド単位の分岐を許す)で、後者はGPUのワープ実行を支える。
- GPUは階層ごとに分類が変わる複合構造(ユニット間MIMD・ユニット内SIMT)であり、分類は観察粒度に依存する。
並列性をどの軸・どの粒度で取り出すかが設計の出発点です。複数プロセッサがメモリをどう見せ合うかという次の論点はメモリ一貫性モデルへ続きます。
CPU/メモリ/ディスク Article
並列計算のFlynn分類 ─ SISD/SIMD/MISD/MIMDの系統を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
Flynn分類
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
現実のCPUベクトル拡張はSIMD、マルチコアやクラスタはMIMD、GPUは多数コアのMIMD上で各コアがSIMTで動く複合構造として位置づく。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「Flynn分類 / 並列処理」に近いか確認する。
- 強みである「Flynn分類は命令流(1か多)とデータ流(1か多)の2軸×2値でSISD/SIMD/MISD/MIMDの4種に整理する、1966年提唱の分類法。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。