
対称型マルチプロセッシングまたは共有メモリ型マルチプロセッシング[ 1 ] ( SMP )は、2つ以上の同一のプロセッサが単一の共有メインメモリに接続され、すべての入出力デバイスに完全にアクセスでき、すべてのプロセッサを平等に扱い、特別な目的のために予約しない単一のオペレーティングシステムインスタンスによって制御されるマルチプロセッサコンピュータのハードウェアおよびソフトウェアアーキテクチャです。今日のほとんどのマルチプロセッサシステムはSMPアーキテクチャを使用しています。マルチコアプロセッサの場合、SMPアーキテクチャはコアに適用され、それらを個別のプロセッサとして扱います。
ジョン・D・クビアトウィッツ教授は、従来SMPシステムはキャッシュのないプロセッサを含むものと考えていました。[ 2 ]キュラーとパル・シンは、1998年の著書「並列コンピュータアーキテクチャ:ハードウェア/ソフトウェアアプローチ」の中で次のように述べています。「SMPという用語は広く使われていますが、少し混乱を招きます。[...] SMPが意図するもののより正確な説明は、メモリ位置へのアクセスコストがすべてのプロセッサで同じである共有メモリマルチプロセッサです。つまり、実際にメモリにアクセスする場合、アクセスコストは均一です。位置がキャッシュされている場合はアクセスが速くなりますが、キャッシュアクセス時間とメモリアクセス時間はすべてのプロセッサで同じです。」[ 3 ]
SMPシステムは、互いに独立して動作する同種のプロセッサ群からなる、密接に結合されたマルチプロセッサシステムです。各プロセッサは、異なるプログラムを実行し、異なるデータセットを処理しますが、システムバスまたはクロスバーを使用して接続された共通リソース(メモリ、I/Oデバイス、割り込みシステムなど)を共有する機能を備えています。
SMPシステムは、メインメモリ(MM)と呼ばれる集中型共有メモリを備え、単一のオペレーティングシステム上で2つ以上の同種プロセッサによって動作します。通常、各プロセッサには、メインメモリへのデータアクセスを高速化し、システムバスのトラフィックを削減するために、キャッシュメモリ(またはキャッシュ)と呼ばれる専用の高速メモリが関連付けられています。
プロセッサは、バス、クロスバースイッチ、またはオンチップメッシュネットワークを使用して相互接続できます。バスまたはクロスバースイッチを使用したSMPのスケーラビリティにおけるボトルネックは、各種プロセッサ、メモリ、およびディスクアレイ間の相互接続の帯域幅と消費電力です。メッシュアーキテクチャはこれらのボトルネックを回避し、プログラマビリティを犠牲にする代わりに、はるかに多くのプロセッサ数に対してほぼ線形のスケーラビリティを提供します。
この種のアーキテクチャでは、CPU自体とCPU間の相互接続という2つの異なるプログラミングモードが必要となるため、深刻なプログラミング上の課題が残ります。単一のプログラミング言語は、ワークロードを分割するだけでなく、メッシュベースのアーキテクチャで深刻な問題となるメモリ局所性も理解できなければなりません。[ 4 ]
SMPシステムでは、システム内の各タスクが同時に2つ以上のプロセッサで実行されていない限り、メモリ上のどこにタスクのデータが保存されていても、どのプロセッサでも任意のタスクを実行できます。適切なオペレーティングシステムのサポートがあれば、SMPシステムはタスクをプロセッサ間で容易に移動させ、ワークロードを効率的に分散させることができます。
複数の同一プロセッサを搭載した最初期の生産システムは、1961年頃に稼働したBurroughs B5000でした。しかし、実行時には非対称で、一方のプロセッサはアプリケーションプログラムのみを処理し、もう一方のプロセッサは主にオペレーティングシステムとハードウェア割り込みを処理していました。Burroughs D825は1962年に初めてSMPを実装しました。[ 5 ] [ 6 ]
IBMは、System/360モデル65と、それと密接に関連するモデル67 [ 7 ]および67-2 [ 8 ]をベースとしたデュアルプロセッサコンピュータシステムを提供していました。 これらのマシンで動作するオペレーティングシステムは、OS/360 M65MP [ 9 ]とTSS/360でした。大学で開発された他のソフトウェア、特にミシガン端末システム(MTS)は、両方のCPUを使用していました。両方のプロセッサはデータチャネルにアクセスしてI/Oを開始できました。OS/360 M65MPでは、オペレーティングシステムカーネルが両方のプロセッサで実行されるため(ただし、I/Oハンドラの周りに「大きなロック」がかかっていました)、周辺機器は一般的にどちらのプロセッサにも接続できました。[ 10 ] MTSスーパーバイザ(UMMPS)は、IBM System/360モデル67-2の両方のCPUで実行できます。スーパーバイザロックは小さく、どちらのCPUからも同時にアクセスされる可能性のある個々の共通データ構造を保護するために使用されました。[ 11 ]
SMPをサポートした他のメインフレームには、1965年にリリースされ最大3つのCPUをサポートしたUNIVAC 1108 II 、 GE-635およびGE-645などがあった[ 12 ] [ 13 ]。ただし、マルチプロセッサGE-635システムのGECOSはマスタースレーブ非対称方式で動作したが、マルチプロセッサGE-645システムのMulticsは対称方式で動作した[ 14 ] 。
Digital Equipment CorporationのオペレーティングシステムTOPS-10は、バージョン7.0(1972年)からSMP機能を実装し、SMPを実行した最初のシステムはDECSystem 1077デュアルKI10プロセッサシステムでした。[ 15 ]後期のKL10システムは、最大8つのCPUをSMP方式で集約することができました。対照的に、DECの最初のマルチプロセッサVAXシステムであるVAX-11/782は非対称でしたが[ 16 ]、後期のVAXマルチプロセッサシステムはSMPでした。[ 17 ]
初期の商用 Unix SMP 実装には、Sequent Computer Systems Balance 8000 (1984 年リリース) と Balance 21000 (1986 年リリース) がありました。[ 18 ] どちらのモデルも、10 MHz National Semiconductor NS32032プロセッサをベースとしており、それぞれに小さなライトスルー キャッシュが共通メモリに接続され、共有メモリシステムを形成していました。もう 1 つの初期の商用 Unix SMP 実装は、1985 年に VAST Corporation の Dan Gielan によって設計された NUMA ベースの Honeywell Information Systems Italy XPS-100 でした。その設計は最大 14 個のプロセッサをサポートしていましたが、電気的な制限により、販売された最大のバージョンはデュアル プロセッサ システムでした。オペレーティングシステムは、VAST Corporation が AT&T 内部で使用されていた AT&T 3B20 Unix SysVr3 コードから派生し、移植したものです。
以前にも非商用のマルチプロセッシングUNIXポートが存在しており、1975年までに海軍大学院で作成されたMUNIXというポートもその一つである。 [ 19 ]
タイムシェアリングシステムやサーバーシステムは、複数のプロセスを並列実行できるため、アプリケーションに変更を加えることなくSMPを利用できる場合が多く、また、複数のプロセスが実行されるシステムでは、異なるプロセスを異なるプロセッサで実行できる。
パーソナルコンピュータでは、SMPは変更されていないアプリケーションにはあまり有効ではありません。システムが一度に複数のプロセスを実行することがほとんどない場合、SMPはマルチスレッド(マルチタスク)処理用に修正されたアプリケーションにのみ有効です。カスタムプログラムされたソフトウェアは、複数のスレッドを使用するように記述または修正することで、複数のプロセッサを活用できます。
マルチスレッドプログラムは、マルチスレッドをサポートするタイムシェアリングシステムやサーバーシステムでも使用でき、複数のプロセッサをより有効に活用することが可能になります。
現在のSMPシステムでは、すべてのプロセッサがバスまたはスイッチを介して同じ筐体内に密接に結合されています。以前のSMPシステムでは、単一のCPUが筐体全体を占めていました。共有されるコンポーネントには、グローバルメモリ、ディスク、I/Oデバイスなどがあります。すべてのプロセッサ上で実行されるOSのコピーは1つだけであり、OSはこのアーキテクチャを活用するように設計する必要があります。基本的な利点のいくつかには、スループットを向上させるための費用対効果の高い方法が含まれます。さまざまな問題やタスクを解決するために、SMPは複数のプロセッサを1つの問題に適用します。これは並列プログラミングとして知られています。
しかし、SMPの拡張性には、キャッシュの一貫性や共有オブジェクトといった制約がいくつか存在する。
単一プロセッサシステムとSMPシステムでは、最高のパフォーマンスを実現するために異なるプログラミング手法が必要です。SMPシステムで実行されるプログラムは、単一プロセッサシステム向けに記述されたプログラムであっても、パフォーマンスが向上する場合があります。これは、ハードウェア割り込みが発生すると、通常はプログラムの実行が中断され、その間に割り込みを処理するカーネルがアイドル状態のプロセッサで実行できるためです。ほとんどのアプリケーション(ゲームなど)では、パフォーマンスの向上というよりも、プログラムがよりスムーズに動作しているように見えるという効果があります。一部のアプリケーション、特にソフトウェア開発や分散コンピューティングプロジェクトでは、追加プロセッサ数にほぼ比例して高速化されます。(コンパイラ自体はシングルスレッドですが、複数のコンパイルユニットを持つソフトウェアプロジェクトを構築する場合、各コンパイルユニットを独立して処理することで、プロジェクト全体で並列処理が容易に実現され、コンパイル時間をほぼ線形にスケーリングできます。分散コンピューティングプロジェクトは、設計上、本質的に並列処理が可能です。)
システムプログラマは、オペレーティングシステムにSMPのサポートを組み込む必要があります。そうしないと、追加のプロセッサはアイドル状態になり、システムは単一プロセッサシステムとして機能します。
SMPシステムは、命令セットに関してより複雑な問題を引き起こす可能性もあります。均一なプロセッサシステムでは、通常、SIMD(MMX、SSEなど)といった「特殊命令」のために追加のレジスタが必要となりますが、異種混在システムでは、異なる命令や用途に応じて異なる種類のハードウェアを実装できます。
複数のプログラムが同時に実行される場合、SMPシステムは単一プロセッサシステムよりも大幅に優れたパフォーマンスを発揮します。これは、異なるプログラムを異なるCPU上で同時に実行できるためです。一方、非対称マルチプロセッシング(AMP)では、通常、1つのプロセッサのみがプログラムまたはタスクを実行できます。例えば、AMPは、タスクの優先度や完了の重要度に基づいて、特定のタスクをCPUに割り当てる際に使用できます。AMPは、複数のCPUを扱うという点ではSMPよりもかなり前に開発されたため、上記の例に基づくパフォーマンスの低さは、SMPの登場以前に開発されたものです。
SMP環境で多数のジョブを処理する場合、管理者はハードウェア効率の低下を経験することがよくあります。プロセッサの利用率を最大限に高めるために、ジョブやその他のコンピュータ機能をスケジュールするソフトウェアプログラムが開発されています。優れたソフトウェアパッケージは、各CPUを個別にスケジュールするだけでなく、複数のSMPマシンやクラスタを統合することで、この最大限の可能性を実現できます。
RAMへのアクセスは直列化されるため、キャッシュの一貫性の問題と相まって、システム内のプロセッサ数の増加にパフォーマンスが若干遅れる原因となります。

SMPは、単一の共有システムバスを使用する方式で、マルチプロセッサマシンアーキテクチャの最も初期のスタイルの1つであり、通常は最大8個のプロセッサを搭載した小型コンピュータの構築に使用されます。
大規模なコンピュータシステムでは、 NUMA (非均一メモリアクセス)などの新しいアーキテクチャが採用されることがあります。NUMAでは、異なるプロセッサにそれぞれ異なるメモリバンクが割り当てられます。NUMAアーキテクチャでは、プロセッサはローカルメモリに高速に、リモートメモリには低速でアクセスできます。データが特定のプロセス(つまりプロセッサ)に局在している限り、これによりメモリのスループットが劇的に向上します。一方、NUMAでは、ワークロードバランシングのように、あるプロセッサから別のプロセッサへデータを移動するコストが高くなります。NUMAの利点は、特定のワークロード、特にデータが特定のタスクやユーザーに強く関連付けられているサーバー環境に限定されます。
最後に、コンピュータクラスタ型マルチプロセッシング( Beowulfなど)があり、この場合、すべてのプロセッサがすべてのメモリを利用できるわけではありません。クラスタリング技術は、非常に大規模なスーパーコンピュータを構築するために広く用いられています。
可変対称マルチプロセッシング(vSMP)は、NVIDIAが開発したモバイル用途に特化した技術です。この技術では、クアッドコアデバイスにコンパニオンコアと呼ばれる5つ目のコアが追加され、モバイル端末のアクティブスタンバイモード、ビデオ再生、音楽再生時などに、より低い周波数でタスクを実行するために特別に設計されています。
NVIDIAが特許を取得したProject Kal-El(Tegra 3)[ 20 ]は、この新しいvSMPテクノロジーを実装した最初のSoC(システムオンチップ)でした。このテクノロジーは、アクティブスタンバイ状態時のモバイル機器の消費電力を削減し、負荷の高いモバイルアプリケーションでのアクティブ使用時にはクアッドコアのパフォーマンスを最大化します。全体として、このテクノロジーはモバイルプロセッサの消費電力を削減することで、アクティブ使用時とスタンバイ使用時のバッテリー寿命の向上というニーズに対応します。