マルチプロセッサ(multi-processor)システムの分類

ここでいうプロセッサは一般語としてのMPUやCPUのみを指すものではなく、処理装置一般を指す広い意味になります。その意味で行くと現在のコンピュータシステムはシングルプロセッサであることはまずありませんが、通常はシステム全体ではなく作成するプログラムの処理に使えるプロセッサだけを見てシステムを表現します。
まず最初にシステム上にプロセッサが一つしかない狭義のシングルプロセッサシステムとマルチプロセッサシステムが分かれ、そこからさらに二つに分かれます。

マルチプロセッサ 対称型マルチプロセッサ(SMP*1 )
  非対称型マルチプロセッサ(ASMP*2 )

並列処理のインターフェースとの関係ですが、TLPが使えるのはSMPだけです。ASMPは必然的にPLPになりますが、PLPはSMP上にも実装できます。
どのようなプログラムで利用されるかですが、PC上での話をするとSMPはmulti-core CPUにおけるマルチスレッド(対応)プログラムがTLPの例として一番わかりやすいでしょうか。マルチメディア関係のエンコーダーデコーダー(プレイヤー)が最も日常的に触れられていると思います。ユーザープログラムのバックグラウンドで動作するOSのサービスは常にPLP的に動作しています。ASMPはプログラマーが色々がんばる方向だと3DグラフィックスのレンダリングにおけるCPUとGPUへの処理の分散が好例です。特別何もしなくても恩恵を被れる例はTCP/IPオフロードエンジン付のNICを搭載したシステム上でのネットワークを利用するプログラムです。

組み込み系のハードウェアだと一番身近なのはゲーム機になるでしょうか。基本的にハードウェアが固定的であると仮定できるので、PS2のブロックダイアグラムを見た時にCPU、CPU内蔵コプロセッサのVU、GSをプログラムが用いるレンダリングアルゴリズムの内部処理に対応させたASMPのハードウェアパイプラインとして協調動作させます。これはPLPになります。

これだけ聞くと「ふ〜ん(’’ 」という感じしかしないと思います。CPUの内部構造の解説などを見ている方ならスーパーパイプラインで20ステージぐらいのパイプラインが機能するという説明を見ているので、3個のプロセッサを用いるパイプラインぐらいでは感銘を受けないのではないでしょうか。SMP上のソフトウェアパイプラインだと並列度がCPU数以上に確保されていればあまり各ステージの処理時間は気にしなくてもいいですし*3なのです(ノ_<。)
また、最新のゲーム機だとマルチコアだったりするのでSMPとして動作する部分もありますが、それはPCの場合と同じになります。

*1:Symmetric Multiple Processor

*2:ASymmetric Multiple Processor

*3:スループットだけを考えるなら全てのプロセッサ使用率が100%を維持できさえすればいいです。レイテンシを考慮すると話は違ってきますが))、処理の受け渡しも適当にキューかスタックに積んで「ここに置いとくのでおねがいヾ(’’ 」ぐらいで済みます。 しかしパイプラインの設計の目標は本質的には各ステージの負荷を等しく100%にしつつ全体のパフォーマンスを上げることです。それを各プロセッサ上のコードの最適化を行い、それによってパイプラインのステージ間に不均衡が生まれたらパイプライン全体の再設計を行うということを繰り返すことで実現します。ASMPの場合は異なる処理を異なるプロセッサで分担しつつ、それを厳密に追求しなければいけないのでなかなか難しいのです。パイプラインの各ステージの処理の受け渡しもバスやプロセッサ、バッファの状態を監視しながら「いまだ(-_-)」という感じで行います。フルプログラマブルなASMPは恐怖の世界((人によっては自分がシステムを支配しているのを実感できる至福の世界のようなのですが(’’