マルチプロセッシング

マルチプロセッシング（multiprocessing）とは、（本来は）ひとつのプロセスだけではなく複数の並行プロセスを同一システム内で使用することを意味する。
マルチタスクと同様ひとつのCPUを複数のプロセスが共有することも示すが、ひとつのシステム内の複数のCPUが複数のスレッドを動作させることも意味する。マルチプロセッサと言う場合は一般に後者のみを指す。

**マルチプロセッシングの種類**

**プロセッサの対称性**
マルチプロセッシングシステムでは、全CPUが等価の場合といくつかのCPUが特別な用途に使われる場合がある。ハードウェアとオペレーティングシステムの設計によって、システムの対称性の度合いが決定される。例えば、ハードウェアまたはソフトウェアの制限によって1つのCPUだけがすべてのハードウェア割り込みに反応し、他のすべての作業が等しく全CPUに分配される場合もある。また、カーネルモードの実行がひとつのプロセッサに限定される場合もある（指定された特定のプロセッサの場合と、同時に複数のプロセッサでカーネルを実行できない場合がある）。このような制限がある場合、マルチプロセッシングシステムの設計は容易になるが、全CPUが対称に扱われるシステムよりも性能が低下する。
全CPUを等価に扱うシステムは対称型マルチプロセッシング(SMP)システムと呼ばれる。全CPUが等価ではないシステムには、内部資源の分割方式によっていくつかの種類がある。「Asymmetric multiprocessing」(ASMP)、「NUMA」マルチプロセッシング、「コンピュータ・クラスター」などである。非対称型マルチプロセッシングの例としては、IBMのOS/360やDECのVMSがある。

**命令とデータの流れ**
マルチプロセッシングにおいて、単一システム内の複数のプロセッサ上で、独立した複数の命令列をそれぞれ別の複数のコンテキストに対して実行する場合がある。これをMIMDと呼ぶ。また、同一の命令列を複数のコンテキスト上で並行して実行する場合もある。これをSIMDまたはベクトル計算機と呼ぶ。また、複数の命令列を一つのコンテキストに対して実行するものをMISDと呼ぶ。MISDは一般に冗長化されたフォールトトレラントシステムを意味するが、パイプライン処理やハイパースレッディングを指すこともある。ちなみに、SISDは一般のマルチプロセッシングでないシステムを指す。

**プロセッサ結合方式**
 密結合 (tightly coupled)
 密結合マルチプロセッサシステムはバスレベルで結合された複数のCPUを持つ。そのプロセッサ群は共通の共有メモリにアクセスする(SMP)。あるいはメモリにローカルと共有の二階層を設ける(NUMA)。IBM p690 RegattaはハイエンドのSMPシステムの一例である。チップ上のマルチプロセッサであるマルチコア処理では、ひとつのチップ上に複数のプロセッサが実装されており、最も進んだ形式の密結合マルチプロセッシングと言う事ができる。メインフレームのマルチプロセッサシステムは密結合であることが多い。
 疎結合 (loosely coupled)
 疎結合マルチプロセッサシステム(コンピュータ・クラスターとも呼ばれる)は複数の独立したコンピュータを高速な通信システム(たとえばギガビット・イーサネットなど)で結合したものである。LinuxのBeowulfやSCoreによるクラスターは疎結合システムの例である。
歴史的には、密結合システムの方が高性能で物理的にも小さかったが、高価だった。最近では普通のコンピュータが非常に小型化されてきたため、疎結合システムを安価に構築できるようになった。さらにマルチコア化によって普通のパソコンでも密結合システムが一般的になり、プロセッサ結合方式は密結合と疎結合が同時に存在するより複雑な系へと発展しメモリ局在性の管理とメッセージパッシングシステムの最適化はより重大な課題となっている。

**ソフトウェア実装上の問題**

**MIMD**
MIMDマルチプロセッシング・アーキテクチャは、個々に独立した様々なタスクを実行するのに適しており、それぞれが異なるデータセットに対して異なる命令を並行して実行する。このような用途はニーズがあり、実装も比較的容易なので、MIMD はマルチプロセッサの大半を占めている。
処理は複数のスレッドに分割され、それぞれがハード的なプロセッサ状態を持つ。これらスレッドはひとつのプロセス内に存在する場合もあるし、別々のプロセスに属していることもある。複数のスレッドがディスパッチされるのを待っている状態となるため、このアーキテクチャはハード資源の利用効率が高い。
MIMD ではデッドロック問題や資源の競合が発生する。しかしスレッドが資源にアクセスするかどうかは予測できないため、競合を効率的に管理するのは難しい。MIMD ではオペレーティングシステムに特別なコーディングを必要とする。アプリケーションはマルチスレッド化されない限りそのような配慮は必要としない。MIMD用のオペレーティングシステムは、シングルスレッドのアプリケーションにとっては透過的であることが多い(アプリケーション側が複数プロセスのスケジューリングなどを独自に行ったりする場合はその限りではない)。システムソフトウェアもユーザーソフトウェアも「セマフォ」(または「ロック」あるいは「ゲート」とも呼ばれる)のようなソフトウェアの排他制御機構を使って、他のスレッドが同じデータにアクセスしないように防止する。このようなロック処理はコードの複雑性を増し、性能を低下させ、評価の必要性を増すが、マルチプロセッシングの利点を否定するほどの問題ではない。
同様な競合は、CPU間でハードレベルでも発生し(例えば、キャッシュの競合と破損など)、それらはハードレベルまたはハードとソフトの共同で解決しなければならない(例えば、キャッシュ・クリア命令)。マルチプロセッシングを実装する場合、性能向上のためにキャッシュという高速メモリを僅かに各プロセッサ毎に持ち、より低速なメモリ本体へのアクセスを擬似的に高速化している。各プロセッサは個別に情報を持つ事になり、この情報をプロセッサ単位で書き換え、使用する事になる。本来、メモリ上の情報を共有しているはずなのに、あるプロセッサのキャッシュ上の変更(メモリ書き込み)を他のプロセッサのキャッシュに通知しないとデータを共有できなくなってしまう。
この問題はプログラミング技法で何とかなる話ではなく、ハードウェアで何らかのキャッシュ同期機構を設けなければならない。キャッシュ同期を可能とする解決法はいくつかあって非常に複雑である。以下に例を挙げる。- メモリへの書き込みの際にキャッシュに書き込むと同時にバスにそれをブロードキャストする。ただし、アドレスだけでありメモリには書き込まない。- 書き込みを行ったプロセッサ以外は、通知されたアドレスに対応したキャッシュラインを自分が持っていたら、それを消す。- メモリリードでキャッシュミスが発生したとき、メモリを読みに行くが、それにメモリではなく最新の内容を持っているプロセッサのキャッシュが自動的に応答する。
より簡単な方式として、他のプロセッサが読みに来たキャッシュラインをメモリに書き戻し(シュートダウン)し、使用する際にメモリから読ませる手法があるが、性能は劣化する。いずれにしても、キャッシュを同期させようとするとシングルプロセッサよりもバスを使用する頻度が多くなるため、バスの高性能化がシステム性能の向上に必要となる。つまり、単一バスに多数のプロセッサを接続するとバスがボトルネックとなって性能が頭打ちとなる。

**SIMD**
SIMDマルチプロセッシングは並列またはベクトル処理に適している。非常に大きなデータセットを部分に分割し、それぞれに同一だが独立な操作を施す。単一命令ストリームが複数の処理ユニットに与えられ、それらの処理ユニットが大量のデータに同時並行的に同じ処理を行うのである。
ある種の計算アプリケーションにとっては、このタイプのアーキテクチャは多大な性能向上をもたらす。特に与えられたタスクを完了するまでの経過時間が問題となるような場合に有効である。しかし、このアーキテクチャの問題は、アプリケーションやシステムタスクが並列に実行可能な部分に分割できないような場合にシステムの大部分がアイドル状態になってしまうことである。
さらに、アプリケーションはアーキテクチャの利点を最大限に利用するために慎重かつ特殊なコーディングを必要とし、そのような環境向けのコードを生成するよう設計された特殊な最適化コンパイラを使わなければならない。そのようなコンパイラでは、明示的に並列実行すべき箇所を指定するための拡張構文などが用意されることがある（例えばSIMD型スーパーコンピュータであるILLIAC IV用のFORTRANにある DO FOR ALL 文など）。
SIMDマルチプロセッシングはコンピュータによるシミュレーションなどの一定の分野で広く使われるが、汎用デスクトップや商用コンピュータ環境ではあまり使われていない。
SIMD実行ユニットは1990後半から汎用プロセッサで採用されている。スーパースケーラ実行ユニットが同時にすべてリザーブ/リタイヤされるようマイクロコードをスケジュールするよう専用の命令を設け、プロセッサ内部の全実行ユニットを使って複数データを一斉処理する方式が一般化した。現在ではSIMDと言った場合、この設計の事を指す。基礎技術はVLIWを大いに参考にし、またSIMD実行ユニットの発展系としてEPICアーキテクチャなどが開発された。

**MISD**
MISDマルチプロセッシングは主に冗長性を与えるのに便利である。複数の処理ユニットが同じタスクを同じデータに対して実行し、ひとつの処理ユニットで故障が発生しても処理を続行できるのである。そのようなMISDアーキテクチャでは、障害を検出するために処理ユニット間で処理結果を比較する必要がある。それ以外の用法では利点は無く、コストパフォーマンスが悪い。MISDによって性能が向上することはない。ソフトウェアからはMISDであることを意識しないで済むように実装することもできる。
宇宙開発における探査機や深海での作業ロボット、水中探査船の制御など、極限の環境での信頼性確保などに利用される事が多い。小惑星探査で有名な『はやぶさ』では、3重に冗長化され、多数決制御による処理を行うコンピュータが搭載されていた。
またプロセッサの異常が致命的な事態を招くシステムではMISDは必須となっている。例えば航空機のアビオニクスや、絶対の信頼性が原則である原子力発電などでは、法的にMISDかそれに等しい信頼性を持っている事を証明しなければならない。

**関連項目**
対称型マルチプロセッシング
*並列コンピューティング
*マルチコア
*マルチタスク
*フリンの分類