(57)【要約】【課題】ユーザプログラムの複製コピーの実行ポイントをアラインメントする方法及びシステムを提供する。【解決手段】本発明にかかるプロセッサベースの方法は、ユーザプログラムの複製コピーを第１のプロセッサ及び第２のプロセッサで動作させること、命令の少なくともいくつかを復号して、復号された各命令の入力を求めることであって、復号することは、各プロセッサにおける実行とほぼ同時である、復号された各命令の入力を求めること、プロセッサ間で、復号された命令のアドレス及び復号された命令の入力を示す値を交換すること、少なくとも復号された命令のアドレスを使用して、第１のプロセッサにおけるユーザプログラムの実行ポイントが、第２のプロセッサのユーザプログラムの実行ポイントより遅れていると判断すること、及び各ユーザプログラム内の実行ポイントがほぼアラインメントされるまで、第１のプロセッサを進めることを含む。【選択図】図３
2006209769.tif 000002
【特許請求の範囲】
【請求項１】
ユーザプログラムの複製コピーを第１のプロセッサ及び第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）で動作させること、
前記命令の少なくともいくつかを復号するとともに、復号された各命令の入力を求めることであって、前記復号することは、各プロセッサ（ＰＡ、ＰＢ、ＰＣ）における実行とほぼ同時である、前記命令の少なくともいくつかを復号するとともに、復号された各命令の入力を求めること、
前記プロセッサ（ＰＡ、ＰＢ、ＰＣ）間で、復号された命令のアドレス及び前記復号された命令の入力を示す値を交換すること、
少なくとも前記復号された命令の前記アドレスを使用して、前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）における前記ユーザプログラムの実行ポイントが、前記第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）の前記ユーザプログラムの実行ポイントに対して遅れていると判断すること、及び
各ユーザプログラム内の前記実行ポイントがほぼアラインメントされるまで、前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）を進めること
を含むプロセッサベースの方法。
【請求項２】
前記判断することは、
前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）内において、
前記交換された、前記復号された命令のアドレス及び前記復号された命令の入力を示す値をパターンマッチングすること、及び
前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）が実行ポイントにおいて遅れている量を、パターンマッチングのロケーションに基づいて求めること
をさらに含む請求項１に記載のプロセッサベースの方法。
【請求項３】
前記復号することの前に、
各プロセッサ（ＰＡ、ＰＢ、ＰＣ）のリタイヤ命令カウンタの値がほぼ同じになるまで、前記ユーザプログラムの少なくとも１つが実行することを許可すること、及び次に、
各ユーザプログラムのいくつかの命令を実行すること
をさらに含む請求項２に記載のプロセッサベースの方法。
【請求項４】
前記実行することは、
前記リタイヤ命令カウンタの値の最大誤差の少なくとも３倍を実行すること
をさらに含み、
前記交換することは、
前記実行することの後に交換すること
をさらに含み、
前記パターンマッチングすることは、
前記リタイヤ命令カウンタの値の前記最大誤差の少なくとも２倍の長さの一致パターンを見つけること
をさらに含む
請求項３に記載のプロセッサベースの方法。
【請求項５】
前記いくつかの命令を前記実行することの前に、
前記方法は、
前記プロセッサ（ＰＡ、ＰＢ、ＰＣ）の１つにおいて、前記リタイヤ命令カウンタの値の最大誤差を前に進めて実行すること
をさらに含み、
前記いくつかの命令を実行することは、
前記リタイヤ命令カウンタの値の前記最大誤差の少なくとも２倍を各プロセッサ（ＰＡ、ＰＢ、ＰＣ）において実行すること
をさらに含み、
前記交換することは、
前記実行することの後に交換すること
をさらに含み、
前記パターンマッチングすることは、
一致するパターンの１つを見つけること、又は、一致するパターンを見つけないこと
をさらに含む
請求項３に記載のプロセッサベースの方法。
【請求項６】
前記実行することは、
前記リタイヤ命令カウンタの値の前記最大誤差と、前記リタイヤ命令カウンタの値の前記最大誤差の３倍とを含めて、その両者の間で実行すること
をさらに含み、
前記交換することは、
各命令を実行した後に交換すること
をさらに含み、
前記パターンマッチングすることは、
復号された命令の少なくともいくつかのアドレスを交換した後に、各交換後の一致するパターンのテストを行うこと、及び単一の一致するものが見つかった場合にさらに実行することを抑制すること又は複数の一致するものが見つかった場合に実行を継続することの一方、
をさらに含む
請求項３に記載のプロセッサベースの方法。
【請求項７】
リタイヤ命令カウンタの値の正確度の証拠を収集すること、及び
前記収集した証拠に基づいて前記所定の個数を調整すること、
をさらに含む
請求項１に記載のプロセッサベースの方法。
【請求項８】
ユーザプログラムを実行するように動作できる第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）であって、
第１のメモリ（４６）に連結された、第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）と、
前記ユーザプログラムの複製コピーをほぼ同時に実行するように動作できる第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）であって、第２のメモリ（４６）に連結された、第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）と、
を備え、
前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）は、
自身のユーザプログラムの実行された複数の命令を、前記第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）の前記ユーザプログラムの実行された複数の命令と照合して、前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）が遅れている命令数を求めるように動作でき、
前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）は、
前記ユーザプログラムの前記複製コピーの実行ポイントがほぼ同じになるまで、前に進めて実行するように動作できる
システム。
【請求項９】
前記第１のプロセッサが前記実行された複数の命令を照合する前に、
前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）は、
自身の各ユーザプログラムの所定の個数の命令を実行するように動作でき、且つ、前記実行とほぼ同時に、少なくともいくつかの命令を復号して、前記復号した命令の入力を求め、そして、前記復号した命令のアドレス及び前記入力を示す値を第１のリストに置くように動作でき、
前記第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）は、
自身の各ユーザプログラムの所定の個数の命令を実行するように動作でき、且つ、前記実行とほぼ同時に、少なくともいくつかの命令を復号して、前記復号した命令の入力を求め、そして、前記復号した命令のアドレス及び前記入力を示す値を第２のリストに置くように動作でき、
前記第１のプロセッサ及び前記第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）は、
リストを交換する
請求項８に記載のシステム。
【請求項１０】
前記第１のプロセッサが前記実行された複数の命令を照合する前に、
前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）は、
自身の各ユーザプログラムのいくつかの命令を実行するように動作でき、且つ、前記実行とほぼ同時に、少なくともいくつかの命令を復号して、前記復号した命令の入力を求めるように動作でき、且つ、前記実行とほぼ同時に、前記復号した命令のアドレス及び入力を前記第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）と交換するように動作でき、
前記第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）は、
自身の各ユーザプログラムのいくつかの命令を実行するように動作でき、且つ、前記実行とほぼ同時に、少なくともいくつかの命令を復号して、前記復号した命令の入力を求めるように動作でき、且つ、前記実行とほぼ同時に、前記復号した命令のアドレス及び入力を前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）と交換するように動作できる
請求項８に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ユーザプログラムにおける実行ポイントのアラインメントに関する。
【０００２】
［関連出願の相互参照］
本出願は、「Method and System of Determining Whether An Application Program Has Made A System Level Call」と題する同時係属中の米国特許出願第１１／０４２，９８１号（ＣＲ参照番号２１６２−３０６００））に関連する。また、本出願は、「Method and System of Aligning Execution Point of Duplicate Copies of a User Program by Copying Memory Stores」と題する同時係属中の米国特許出願第１１／０４２，４２７号（ＣＲ参照番号２１６２−３５０００））にも関連する。
【背景技術】
【０００３】
緩やかなロックステッププロセッサ（loosely lock-stepped processor）は、ユーザプログラムの複製コピーを実行するプロセッサであるが、これらのプロセッサは、ユーザプログラムの自身の各コピーを同じ歩調で実行する必要もなければ、同じウォールクロック時刻に実行する必要もない。緩やかなロックステッププロセッサは、宇宙線によって引き起こされるような計算誤りを検出して訂正するのに使用することができ、また、ユーザプログラムがハードウェア障害にもかかわらず動作し続けることを確実にするのに使用することもできる。
【０００４】
クロック周波数のわずかな相違のため、又は、或るプロセッサでは遭遇したが、他のプロセッサでは遭遇していない訂正可能なソフトエラーのため、或るプロセッサは、ユーザプログラム内の自身の実行ポイントにおいて進む（lead）ことがあり、プロセッサにおいてユーザプログラムが進んでいるのか、それとも遅れているのかを判断することは難しい。プログラムカウンタ又は命令ポインタの比較は、ユーザプログラムの実行ポイントを十分に特定することができない。その理由は、すべてのユーザプログラムは、同じソフトウェアループにあるが、ループの異なる繰り返しに存在することがあり、命令ポインタが同じ場合もあるからである。さらに、いくつかのプロセッサは、自身の性能監視ユニットに、各リタイヤ命令（retired instruction）でインクリメントを試みるリタイヤ命令カウンタ（retired instruction counter）を実施する。リタイヤ命令カウンタは性能監視目的で含まれ、必ずしも、ありとあらゆるリタイヤ命令を正しくカウントするとは限らないことから、リタイヤ命令カウンタの値の比較は十分でない場合がある。例えば、リタイヤ命令カウンタが特定の値に達すると、プロセッサによっては、新たな命令のロードを中止する機能を有するものもある。しかしながら、パイプラインプロセッサは、スライディングストップ（sliding stop）として知られている、完了する命令、及び、リタイヤ命令カウンタによってカウントされない命令をパイプラインに依然としていくつか有することがある。その上、プロセッサ製造業者は、自身のリタイヤ命令カウンタが１００パーセント正確であることを保証しない。
【発明の開示】
【課題を解決するための手段】
【０００５】
本発明の一実施形態は、ユーザプログラムの複製コピーを第１のプロセッサ及び第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）で動作させること、前記命令の少なくともいくつかを復号するとともに、復号された各命令の入力を求めることであって、前記復号することは、各プロセッサ（ＰＡ、ＰＢ、ＰＣ）における実行とほぼ同時である、前記命令の少なくともいくつかを復号するとともに、復号された各命令の入力を求めること、前記プロセッサ（ＰＡ、ＰＢ、ＰＣ）間で、復号された命令のアドレス及び前記復号された命令の入力を示す値を交換すること、少なくとも前記復号された命令の前記アドレスを使用して、前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）における前記ユーザプログラムの実行ポイントが、前記第２のプロセッサ（ＰＡ、ＰＢ、ＰＣ）の前記ユーザプログラムの実行ポイントに対して遅れていると判断すること、及び各ユーザプログラム内の前記実行ポイントがほぼアラインメントされるまで、前記第１のプロセッサ（ＰＡ、ＰＢ、ＰＣ）を進めること、を含むプロセッサベースの方法である。
【０００６】
次に、本発明の例示の実施の形態の詳細な説明について、添付図面が参照される。
【発明を実施するための最良の形態】
【０００７】
［表記及び専門用語］
以下の説明及び特許請求の範囲の全体を通じて、特定のシステムコンポーネントを参照するために、一定の用語が使用される。当業者には分かるように、コンピュータ企業は、或るコンポーネントを異なる名前で参照することがある。この文書は、名前は異なるが機能は異ならないコンポーネントを区別するつもりはない。以下の考察及び特許請求の範囲では、用語「含む」及び「備える」は、オープンエンドな形式で使用され、したがって、「含むが、これらに限定されるものではない」との意味に解釈されるべきである。また、用語「連結する」は、間接的な接続又は直接的な接続のいずれかを意味するように意図されている。したがって、第１のデバイスが第２のデバイスに連結する場合、その接続は、直接的な接続を通じている場合もあるし、他のデバイス又は接続を介して間接的な接続を通じている場合もある。
【０００８】
［詳細な説明］
以下の考察は、本発明のさまざまな実施の形態を対象にする。これらの実施の形態の１つ又は複数は好ましいものとすることができるが、開示した実施の形態は、開示の範囲を限定するものとして解釈されるべきでなく、それ以外に使用されるべきでない。これに加えて、以下の説明は幅広い用途を有すること、及び、どの実施の形態の考察も、その実施の形態の例示にすぎないことが意図されており、開示の範囲がその実施の形態に限定されることを暗示するようには意図されていないことが当業者には理解されよう。
【０００９】
図１は、本発明の実施の形態によるコンピューティングシステム１０００を示している。詳細には、コンピューティングシステム１０００は、複数のマルチプロセッサコンピュータシステム１０を備える。いくつかの実施の形態では、２つのマルチプロセッサコンピュータシステム１０のみを使用することができ、したがって、コンピューティングシステム１０００は、二重化冗長（ＤＭＲ；dual-modular redundant）システムを実施することができる。図１に示すように、コンピューティングシステム１０００は、３つのマルチプロセッサコンピュータシステム１０を備え、したがって、三重化冗長（ＴＭＲ；tri-modular redundant）システムを実施する。コンピュータシステムが二重化冗長であるのか、それとも三重化冗長であるのかにかかわらず、コンピューティングシステム１０００は、マルチプロセッサコンピュータシステム全体にわたってユーザプログラムを冗長に実行することにより、フォールトトレランスを実施する。
【００１０】
本発明の実施の形態によれば、各マルチプロセッサコンピュータシステム１０は、好ましくは、１つ又は複数のプロセッサを備え、図１に示すように、４つのプロセッサを備える。図１の各プロセッサは、プロセッサを示す頭文字「Ｐ」を有する。さらに、各プロセッサには、マルチプロセッサコンピュータシステム１０Ａ、１０Ｂ、及び１０Ｃの１つの内部におけるプロセッサの物理ロケーションをそれぞれ示す「Ａ」、「Ｂ」、又は「Ｃ」の文字名称も与えられる。最後に、各プロセッサには、各マルチプロセッサコンピュータシステム内のそのプロセッサのロケーションを示す数字名称が与えられる。したがって、例えば、マルチプロセッサコンピュータシステム１０Ａのプロセッサは、名称「ＰＡ１」、「ＰＡ２」、「ＰＡ３」、及び「ＰＡ４」を有する。
【００１１】
本発明の実施の形態によれば、各マルチプロセッサコンピュータシステム１０からの少なくとも１つのプロセッサは、論理的にグループ化されて、論理プロセッサ１２を形成することができる。図１に示す例示の実施の形態では、プロセッサＰＡ３、ＰＢ３、及びＰＣ３がグループ化されて、論理プロセッサ１２を形成することができる。本発明の実施の形態によれば、論理プロセッサ内の各プロセッサは、ユーザプログラムの複製コピーをほぼ同時に実行し、したがって、フォールトトレランスを実施する。より詳細には、論理プロセッサ内の各プロセッサは、ユーザプログラムの同じ命令ストリームの提供を受けて、同じ結果を計算する（誤差がないと仮定して）が、論理プロセッサ内のプロセッサは、厳密なロックステップではなく、サイクルごとのロックステップでもない。これらのプロセッサは、緩やかなロックステップであり、割り込みのハンドリングは、システムコール（後述）に基づいて行われる。いくつかの実施の形態によれば、プロセッサは非決定的な実行を有する場合があり、したがって、厳密なロックステップは実行可能でない場合がある。プロセッサの１つが故障した場合、１つ又は複数の残りのプロセッサは、全体のシステム性能に影響を与えることなく続行することができる。
【００１２】
論理プロセッサ内に同じユーザプログラムを実行する２つ又は３つ以上のプロセッサが存在しうるため、入出力（Ｉ／Ｏ）デバイス１４及び１６に対する読み出しや書き込み等の二重（duplicate）読み出し及び二重書き込みが発生する場合がある。Ｉ／Ｏデバイス１４及び１６は、任意の適切なＩ／Ｏデバイスとすることができ、例えば、ネットワークインターフェースカード、フロッピー(登録商標)ドライブ、ハードディスクドライブ、ＣＤ  −ＲＯＭドライブ、及び／又はキーボードとすることができる。障害検出の目的で読み出し及び書き込みを比較するために、各論理プロセッサは、自身を同期ロジックに関連付けている。例えば、プロセッサＰＡ１、ＰＢ１、及びＰＣ１は、同期ロジック１８に関連付けられた論理プロセッサを形成する。同様に、プロセッサＰＡ２、ＰＢ２、及びＰＣ２は、同期ロジック２０に関連付けられた論理プロセッサを形成する。論理プロセッサ１２は、同期ロジック２２に関連付けられている。最後に、プロセッサＰＡ４、ＰＢ４、及びＰＣ４は、同期ロジック２４に関連付けられた論理プロセッサを形成する。このように、各マルチプロセッサコンピュータシステム１０は、それぞれを、相互接続２６を経由して同期ロジック１８、２０、２２、及び２４のそれぞれに連結する。相互接続２６は、周辺機器相互接続（ＰＣＩ）バスであり、詳細には、直列化ＰＣＩ（serialized PCI）バスである。ただし、他のバス通信方式も同等に使用することができる。
【００１３】
各同期ロジック１８、２０、２２、及び２４は、投票者ロジックユニットを備え、例えば、同期ロジック２２の投票者ロジック２８を備える。以下の考察は、同期ロジック２２の投票者ロジック２８を対象にしているが、同期ロジック１８、２０、２２、及び２４のそれぞれの各投票者ロジックユニットにも等しく適用することができる。投票者ロジック２８は、プロセッサからの読み出し要求及び書き込み要求を集約するように動作し、場合によっては、論理プロセッサの同期のために、プロセッサ間の情報交換の役割を果たす。説明のために、論理プロセッサ１２の各プロセッサがユーザプログラムの自身のコピーを実行することについて考察し、各プロセッサがネットワークインターフェース３４に対する読み出し要求を生成することについて考察する。論理プロセッサ１２の各プロセッサは、自身の読み出し要求を投票者ロジック２８に送信する。投票者ロジック２８は、各読み出し要求を受信し、それら読み出し要求を比較し、（読み出し要求が一致すると仮定して）ネットワークインターフェース３４に単一の読み出し要求を発行する。
【００１４】
同期ロジックによって発行された単一読み出し要求に応答して、例示のネットワークインターフェース３４は、要求された情報を投票者ロジック２８に返信する。次に、投票者ロジックは、要求された情報を複製して、論理プロセッサ内のプロセッサのそれぞれに渡す。同様に、パケットメッセージの書き込みや他のプログラム（他の論理プロセッサ上で実行されることがある）へのパケットメッセージの転送等の他の入出力機能についても、同期ロジックは、それらの要求が一致することを確認し、次いで、単一の要求を適切なロケーションに転送する。論理プロセッサのいずれか１つのプロセッサが適切に機能しない場合（例えば、要求を生成できない場合、指定された時間内に要求を生成できない場合、一致しない要求を生成する場合、又は、完全に故障している場合）、全体のユーザプログラムは、論理プロセッサの残りの１つ又は複数のプロセッサの要求に基づいて続行する。
【００１５】
外部インターフェース（ネットワークインターフェース３４等）に対する読み出し及び書き込みの集約、及び、それら外部インターフェースから返信されたデータの複製に加えて、同期ロジックは、日時情報の要求が行われた時に各プロセッサに同じ日時が確実に提供されるようにする役割も果たす。詳細には、ユーザプログラムは、それらユーザプログラムの実行における一定のポイントで、日時情報を要求するシステムコールを行うことがある。システムコールは、オペレーティングシステムプログラム等の（ユーザモードよりも高い特権モードで実行される）特権プログラムに対するあらゆるコールである。日時情報を得るためのシステムコールは、システムコールのカテゴリーに分類されるプログラムファミリーの単なる一例にすぎず、割り込みをハンドリングする際のシステムコールの役割は、以下でより十分に考察する。ユーザプログラムにおける同じ実行ポイントにおいて（それらの実行ポイントに到達した時のウォールクロック時刻が異なるにもかかわらず）同じ日時を各ユーザプログラムに提供するために、論理プロセッサ内の各プロセッサが内部的に時刻を導き出すのではなく、本発明の実施の形態による同期ロジックが論理プロセッサ内の各プロセッサに日時情報を提供する。
【００１６】
図２は、マルチプロセッサコンピュータシステム１０をより詳細に示している。詳細には、図２は、本発明の実施の形態によるマルチプロセッサコンピュータシステム１０が、複数のプロセッサを有することができ、図２の例示の事例では４つのこのようなプロセッサ３４、３６、３８、及び４０を有することができることを示している。４つのプロセッサのみが示されているが、本発明の範囲及び精神から逸脱することなく、任意の個数のプロセッサを使用することができる。プロセッサ３４〜４０は、個別にパッケージングされたプロセッサとすることができ、プロセッサのパッケージは、単一のパッケージ内に２つ又は３つ以上のプロセッサダイを備えるか、又は、単一のダイ上に複数のプロセッサを備える。プロセッサのそれぞれは、プロセッサバス４４を経由してＩ／Ｏブリッジ及びメモリコントローラ４２（以下、Ｉ／Ｏブリッジ４２という）に連結することができる。Ｉ／Ｏブリッジ４２は、メモリバス４５を経由してプロセッサ３４〜４０を１つ又は複数のメモリモジュール４６に連結する。したがって、Ｉ／Ｏブリッジ４２は、１つ又は複数のメモリモジュール４６によって画定されたメモリ領域に対する読み出し及び書き込みを制御することができる。また、Ｉ／Ｏブリッジ４２は、バスライン４３によって示すように、プロセッサ３４〜４０のそれぞれが同期ロジック（図２に図示せず）に連結することも可能にすることができる。
【００１７】
図２をさらに参照して、１つ又は複数のメモリモジュール４６によって画定されたメモリを、各プロセッサにつき１つのパーティションに区画することができる。したがって、プロセッサのそれぞれは、独立に動作することが可能になる。代替的な実施の形態では、各プロセッサは、それ自身の一体化されたメモリコントローラを有することができ、したがって、各プロセッサは、それ自身の専用メモリを有することができ、これも本発明の考慮の範囲内にある。プロセッサ３４〜４０は、厳密なロックステップ実行に適していない非決定的プロセッサとすることもできる。
【００１８】
図２は、各マルチプロセッサコンピュータシステム１０が、Ｉ／Ｏブリッジ４２とメモリモジュール４６との間に連結された再統合ロジック４８を備えることもさらに示している。図１の例示の実施の形態は、再統合ロジックの相互接続（ライン５０）をリング形式で示しているが、任意のネットワークトポロジを同等に使用することができる（例えば、リング、ツリー、二重リング、完全接続）。動作時において、再統合論理ロジック４８は、Ｉ／Ｏブリッジ４２に対してトランスペアレントであり、１つ又は複数のメモリモジュール４６に対する読み出し及び書き込みを妨げない。しかしながら、論理プロセッサ内の或るプロセッサが障害に遭遇し、再起動する必要がある場合に、再統合ロジック４８は、以前故障したプロセッサが、論理プロセッサの故障していないプロセッサと同じポイントで開始できるように、別のプロセッサから少なくともユーザプログラムメモリのコピーを可能にする。
【００１９】
緩やかなロックステップシステムでは、或るプロセッサが進んだり遅れたりすることがある理由は多く存在し得る。例えば、各プロセッサはほぼ同じクロック周波数で命令を実行することができるが、実際のクロック周波数の差は小さくても、時間の経過によってかなりの差になることがある。その上、本発明の少なくともいくつかの実施の形態に従って実施されたプロセッサは、非決定的な実行を有し、したがって、たとえ正確に同じユーザプログラムが提供されても、プロセッサは、ユーザプログラムの同じ実行ポイントに到達するのに実行ステップ数が大きく異なる場合がある。さらにまた、いくつかのプロセッサは、データアクセス遅延及び／又はエラーに遭遇する可能性もある。いくつかの例として、或るプロセッサが、他のプロセッサが遭遇することができないキャッシュミスに遭遇することがある、或るプロセッサが訂正可能なメモリエラーに遭遇することがあり、したがって、残りのプロセッサには必要とされない回復ルーチンの実行を必要とすることがある、及び、或るプロセッサがトランスレーション・ルックアサイド・バッファ（Translation Look-aside Buffer）のミスに遭遇することがあり、それによって、ユーザプログラムの最終結果に影響を与えないが付加的処理が行われる、といったものがある。これらの場合も、プロセッサは、最終的に、ユーザプログラムの同じ実行ポイントに到達するが、実行される命令数、及び、それらの命令を実行するのに必要な時間は、同じでないことがある。
【００２０】
論理プロセッサのプロセッサが同じ命令ストリームを実行しているが、その命令ストリームの同じポイントに存在しないことがあるという考えに留意して、このような環境における割り込みのハンドリングに考察を移す。たとえ、同じ割り込みが、正確に同じウォールクロック時刻で各プロセッサにアサートされても、それら各プロセッサの緩やかなロックステップ実行により、割り込みは、ユーザプログラムの同じ実行ポイントでアサートされないことがある。この問題は、割り込みアサート自体が非同期であることによってさらに悪化する。適切なオペレーションを確保するために、論理プロセッサ内の各プロセッサは、ユーザプログラムの命令ストリームの同じ実行ポイントで、割り込みにサービスを提供する必要がある。本発明の実施の形態によれば、割り込みが命令ストリームの同じ実行ポイントでサービスを受けることを確保することは、割り込みにサービスを提供するためのランデブーポイントについて合意するメカニズムとして同期ロジックを利用することによって行われる。
【００２１】
本発明の実施の形態によれば、論理プロセッサ内のプロセッサは、特定の割り込みがアサートされたこと、及び、実行を一時停止して割り込みにサービスを提供するためのユーザプログラムの提案されたポイント、を互いに通信する。換言すると、論理プロセッサ内のプロセッサは、どの割り込みにサービスを提供すべきか（又は最初にサービスを提供すべきか）について合意し、また、割り込みにサービスを提供するためのユーザプログラムのポイントについても合意する。図３は、協力して割り込みのサービス提供を調整するさまざまなコンポーネントのオペレーションを説明するために、部分的なコンピューティングシステム１０００を示している。図３は、論理プロセッサ５０が、この場合、２つのプロセッサＰＡ１及びＰＢ１のみを備えるという意味で、図１のシステムを簡略化したものである。また、図３は、別の意味では、各プロセッサのメモリパーティション５２を示し、プロセッサがＩ／Ｏブリッジ４２を通じてメモリパーティション及び投票者ロジックにどのように連結するかを示しているので、図１よりも詳細化されている。このように、図３の論理プロセッサ５０は、マルチプロセッサコンピュータシステム１０Ａ及び１０Ｂからのそれぞれ１つのプロセッサを備える。プロセッサＰＡ１は、Ｉ／Ｏブリッジ４２Ａに連結し、Ｉ／Ｏブリッジ４２Ａは、同期ロジック１８及びＰＡ１プロセッサのメモリパーティション５２Ａの双方に連結する。プロセッサＰＢ１は、その各Ｉ／Ｏブリッジ４２Ｂに連結し、Ｉ／Ｏブリッジ４２Ｂは、同期ロジック１８及びＰＢ１プロセッサのメモリパーティション５２Ｂに連結する。
【００２２】
少なくともいくつかの実施の形態によれば、論理プロセッサのプロセッサに、割り込みにサービスを提供するためのランデブーポイントを確立するための情報を交換させるには、各プロセッサが同期ロジック１８の投票者論理回路５６における同期レジスタ５４に情報を書き込むことが必要とされる。本発明の実施の形態によれば、ランデブーポイントは、任意の適切な位置とすることができ、オペレーティングシステムのディスパッチャ機能が実行され、他のタスクを実行に設定する各時刻、トラップ及び障害ハンドラ、ユーザプログラムによって行われたシステムコール等とすることができる。しかしながら、用語「システムコール」は、本明細書では、一般的に、任意の可能なランデブーポイントを指すために使用されることが理解されよう。システムコール番号は、システムコールが任意の開始点（starting point）から行われた回数を示す番号とすることができる。例えば、図３のロケーション７２は、システムコール番号が存在するメモリパーティション５２のロケーションを示している。代替的な実施の形態では、システムコール番号は、メモリパーティション５２以外に位置するレジスタにも同等に記憶することができる。図３に示す実施の形態では、同期レジスタ５４は、事前に指定されたメモリロケーションであるが、データを書き込むことができるロケーションならばどのロケーションでも十分である。プロセッサの一部又はすべてが自身の各情報を書き込んだ後、投票者ロジック５６は、同期レジスタ５４の情報を、メモリパーティション５２のそれぞれにおける対応する１組のメモリロケーション５７にライトバックする。同期ロジックへ情報を書き込むことによって、残りのプロセッサが割り込みを調べるのを待っている間、ユーザプログラムの処理を続けることが可能になる。情報を交換することによって、論理プロセッサ内のプロセッサは、ユーザプログラムのどのポイントで割り込みにサービスを提供するかを調整する。
【００２３】
任意の時刻にプロセッサに割り込みをアサートすることは、割り込み情報を含んだパケットベースのメッセージを介して行うこともできるし、専用割り込み信号ラインを介して行うこともできる。また、割り込みは、或るプロセッサクロックサイクル数の後に満了するように設定されたタイマ等の内部信号源からプロセッサにアサートすることもできる。このようなパケット又は内部割込みがプロセッサによって受信され検出されると、ユーザプログラムは一時停止され、割り込みハンドラルーチンが起動される。割り込みハンドラルーチンの目的は、ランデブーポイントを特定するプロセスを開始することである。割り込みによって要求されたサービスに関する動作は、割り込みハンドラルーチンによっては行われない。システムコールは、ランデブーポイントをスケジューリングしたプロセスが完了したポイントであり、また、割り込みにサービスを提供するプログラムのスケジューリングが行われたポイントでもある。システムコールに基づく割り込みのスケジューリングに関するより多くの情報については、「Method and System of Loosely Lock-Stepped Non-Deterministic Processors」と題する同時係属中の米国特許出願第１１／０４２，５４８号（ＣＲ参照番号２１６２−２２１００））を参照することができる。
【００２４】
このように、割り込みのサービス提供の調整は、システムコールにおいて行われる。しかしながら、長期間の間、システムコールを行わないユーザプログラムが存在し得る。したがって、論理プロセッサ内のプロセッサが、実行しているユーザプログラムの部分について大幅に異なる可能性があり、且つ／又は、さらに、割り込みにサービスを提供する十分な機会がない可能性がある。十分な頻度でシステムコールを行わないユーザプログラムは、「非協調プロセス（uncooperative process）」と呼ばれる。
【００２５】
本発明の実施の形態による非協調プロセスのハンドリングは、いくつかの段階を有する。第１段階は、ユーザプログラムが確かに非協調的なものであることを特定することである。第２段階は、どのプロセッサ（複数可）がユーザプログラムの実行ポイントにおいて遅れているかを特定し、その遅れているプロセッサを進めることである。最後に、最終段階は、元非協調プロセスを変更することとすることができる。これらの段階のそれぞれについて次に取り扱うことにする。
【００２６】
いくつかの実施の形態では、ユーザプログラムがあまりにも稀にしかシステムコールを行わず、したがって、非協調的であるとみなされることを特定することには、タイマの使用を必要とする。ユーザプログラムがタイマの満了前にシステムコールを行わないと、そのユーザプログラムは非協調プロセスである。また、本発明のいくつかの実施の形態によれば、プロセッサのディスパッチャ（最も高い特権状態であるカーネルモードで動作する）が、ユーザプログラムを実行にセットするごとに、ディスパッチャは、プロセッサのリタイヤ命令カウンタをリセットし、ユーザ（最低レベル特権）命令のみをカウントするようにそのリタイヤ命令カウンタを設定し、非協調プロセスタイマを始動し、現在のシステムコール番号の表示を記憶する。リタイヤ命令カウンタは、例えば、ほとんどの市販のプロセッサの性能監視ユニットで実施されるカウンタである。リタイヤ命令カウンタの値は、プロセッサによる各ユーザレベル命令の実行完了時にインクリメントされる。非協調プロセスタイマに関して、インターバルタイムカウンタ（ＩＴＣ；Interval Time Counter）レジスタ及びインターバルタイムマッチ（ＩＴＭ；Interval Time Match）レジスタを装備することによって、Ｉｎｔｅｌ（登録商標）により製造されたＩｔａｎｉｕｍ（登録商標）プロセッサを、非協調プロセスを検出するのに使用することができる。ＩＴＣは、プロセッサの電源投入時にカウントを開始するフリーランニングカウンタ（free running counter）である。「フリーランニング」ということは、ＩＴＣが、実行される命令の個数及び／又はタイプにかかわらずカウントし、どの命令（特権にかかわらず）によってもＩＴＣを停止させることができず、どのユーザ命令によってもＩＴＣの値を変更できないことを意味する。これらの実施の形態で非協調プロセスタイマを始動することは、したがって、ＩＴＣの値を読み出すこと、及び、所望の時間が経過した時にＩＴＣの値を表す値をＩＴＭに置くことを意味する。ＩＴＣレジスタ及びＩＴＭレジスタの値が等しい場合、インターバルタイマ割り込みがアサートされる。これらの例示の実施の形態の非協調プロセスタイマは真に「満了」していないが、ここから先では、非協調プロセスタイマとして使用されるどのタイマのタイプのシステムにも一般に当てはまるように、ＩＴＭと一致するＩＴＣの値の考察を「タイマの満了」と呼ぶことにする。Ｉｔａｎｉｕｍ（登録商標）プロセッサが使用される場合、コンパイラが挿入した、例えばｌｏａｄ．ｓ及びｌｏａｄ．ｃｈｋの対といった投機的命令（speculative instruction）は、リタイヤ命令カウント値に大きな影響を与える可能性があるので、ユーザプログラムで許可されないことに留意されたい。ＩＴＣ／ＩＴＭタイプのタイミング機能を実施しないプロセッサの場合、周期的タイマ割り込みを、レジスタと組み合わせて使用し、割り込みの回数を追跡することができ、所定の個数の周期的タイマ割り込みが発生した後に非協調プロセスに関連したタスクを実行することができる。再び、非協調プロセスタイマの一般論に移って、タイマの満了時に、非協調プロセスハンドラルーチンを起動する割り込みがアサートされる。非協調プロセスハンドラルーチンは、タイマによっ���規定された期間中に少なくとも１つのシステムコールがあったかどうかをチェックする。このタイマによって規定された期間は、いくつかの実施の形態では、およそ１００マイクロ秒程度とすることができる。非協調タイマの満了によって引き起こされた割り込みは、各プロセッサで直ちにサービスの提供を受けるという点で、ユーザプログラムの実行中にアサートされた他の割り込みとは異なるクラスの割り込みとみなすことができる。それに対して、ユーザプログラムの実行中にアサートされた他の割り込みは、ランデブーポイントでサービスの提供を受けるようにスケジューリングされる。代替的な実施の形態では、システムコールは、タイマをリセットして、非協調プロセスハンドラルーチンのトリガを回避することができるが、これらのリセットは、多大なコストを要するカーネルモードプロセスコールを必要とすることがある。非協調プロセッサタイマに関連した割り込みは、各プロセッサの内部でハンドリングされ（確かに、ユーザプロセスが協調的である場合、非協調プロセスタイマが満了したことは、他のプロセスに通信されない）、したがって、論理プロセッサのさまざまなプロセッサにわたって調整されたサービス提供を必要とする、入出力要求等の割り込みとは異なるタイプの割り込みとみなすことができる。
【００２７】
図４は、本発明の実施の形態による非協調プロセスハンドラのフロー図を示している。詳細には、非協調プロセスハンドラは、非協調プロセスタイマの満了後に割り込みをアサートすることによって開始する（ブロック４００）。割り込みを無効にした（ブロック４０２）後、非協調プロセスハンドラは、現在のシステムコール番号（例えば、図３のロケーション７２から）、及び、開始時にディスパッチャにより記憶されたシステムコール番号を読み出す（ブロック４０４）。割り込みの無効は、明示的なステップで行うこともできるし、割り込みハンドラに入った時に自動的に行うこともできる。現在のシステムコール番号がディスパッチャによって開始時に記憶されたシステムコール番号と同じである（ブロック４０６）ことは、ユーザプログラムが、非協調プロセスタイマによって規定された期間中にシステムコールを行わなかったことを示し、したがって、ユーザプログラムが非協調プロセスであることを示す。他方、現在のシステムコール番号が、記憶されたシステムコール番号と同じでない場合には（再びブロック４０６）、そのプロセスは協調的であり、したがって、例示の方法は、非協調プロセスタイマをリセットし（ブロック４１７）、現在のシステムコール番号を保存し（ブロック４１９）、割り込みを有効にし（ブロック４１８）、そしてリターンする（ブロック４２０）。
【００２８】
本発明の実施の形態によれば、ユーザプログラムが論理プロセッサの少なくとも１つのプロセッサ内で非協調的になることによって、他のプロセッサとのデータの交換が起動され、論理プロセッサの他のプロセッサがその非協調性に同意するかどうかが判断される。引き続き図４を参照して、現在のシステムコール番号が、ディスパッチャによって記憶されたシステムコール番号と同じである場合（ブロック４０６）、次のステップは、未確認のランデブーオペレーションがあるかどうかの判断である（ブロック４０８）（以下でより十分に考察する）。未確認のランデブーがない場合、次のステップは、ユーザプログラムの非協調性の表示を、現在のリタイヤ命令カウンタ（ＲＩＣ）の値と共に、投票者ロジック５６の同期レジスタ５４に書き込むことである（ブロック４１０）。その後、非協調プロセスハンドラルーチンは、同期データの返信を投票者ロジックのソフトウェアループで待機する（ブロック４１２）。
【００２９】
いくつかの実施の形態では、どの時点においても、データの交換は１つしか進行できないので、非協調プロセスタイマの満了時にまだ完了していないランデブーポイントである未確認のランデブーをスケジューリングしようとする試みが行われている場合（再びブロック４０８）、次のステップは、投票者ロジックが同期データを書き込むまでソフトウェアループで待機することである（ブロック４２２）。ライトバックされた同期データは、前の割り込み（非協調プロセスハンドラルーチンの現在の実行をトリガした非協調プロセスタイマ満了割り込みではない）についてのものであることに留意して、返信されたデータは、ランデブーポイントのスケジューリングに使用される（ブロック４２４）。ランデブーポイントのスケジューリングに関するより多くの情報については、「Method and System of Loosely Lock-Stepped Non-Deterministic Processors」と題する米国特許出願第１１／０４２，５４８号（ＣＲ参照番号２１６２−２２１００））を参照することができる。ランデブーポイントのスケジューリング（ブロック４２４）の後、プロセスは、ユーザプログラムの非協調性の表示を、現在のリタイヤ命令カウンタの値と共に、投票者ロジック５６の同期レジスタ５４に書き込むことに進み（ブロック４１０）、データの返信をソフトウェアループで待機する（ブロック４１２）。
【００３０】
ユーザプログラムが非協調的であることにプロセッサが合意しない場合には（ブロック４１４）、返信されたデータの解析が行われて、ユーザプログラムが他のプロセッサにおいて協調的であるかどうかが判断される（ブロック４１６）。例えば、一方のプロセッサの非協調プロセスタイマは、ユーザプログラムによるシステムコールの直前に満了することがある一方、論理プロセッサの第２のプロセッサのユーザプログラムは、満了直前にシステムコールを行うことがある。したがって、一方のプロセッサは、プロセスが非協調的であることを示し、第２のプロセッサは、提案したランデブーポイントの書き込みを含めて、次の割り込みをハンドリングするためのランデブーポイントのスケジューリングを試みる。この解析によって、ユーザプログラムがまもなくシステムコールを行うことが明らかになると（ブロック４１６）、非協調プロセスタイマがリセットされ（ブロック４１７）、現在のシステムコール番号が保存され（ブロック４１９）、割り込みが有効にされ（ブロック４１８）、そして、ユーザプログラムが実行を継続でき、まもなく再び協調的となるように、プロセスはリターンする（ブロック４２０）。
【００３１】
さらに図４を参照して、ユーザプログラムが非協調的であることに論理プロセッサのすべてのプロセッサが合意した場合（ブロック４１４）、ユーザプログラムのリタイヤ命令カウンタがプロセッサの最も高いリタイヤ命令カウンタと同じになるまで、プロセッサがユーザプログラムを先に進めて実行することによって、ユーザプログラムのさまざまなコピーをアラインメントするプロセスは開始する（ブロック４２６）（リタイヤ命令カウンタの値は、ブロック４１０において、各プログラムの非協調性の表示と共に交換されるので、各プロセッサはその情報を知っている）。場合によっては、図４の例示の非協調プロセスハンドラが動作しているプロセッサは、最も高いリタイヤ命令カウンタを有し、したがって、ユーザプログラムは、適切なポイントにいる。最も高いリタイヤ命令カウンタの値に向けて先に実行することは、多くの形態を取ることができる。現在のプロセッサのリタイヤ命令カウンタの値が、最も高いリタイヤ命令カウンタの値よりもかなり遅れている場合、タイマを始動することができ、タイマの活動時間の期間中、ユーザプログラムの実行を可能にすることができる。或いは、タイマ期間の間、ユーザプログラムが実行することを可能にするために、又は、最も高いリタイヤ命令カウンタの値に近いリタイヤ命令カウンタを得るのにタイマが使用された後のいずれかで、プロセッサを単一命令モード（single instruction mode）に置くことができる。この単一命令モードでは、リタイヤ命令カウンタが最も高いリタイヤ命令カウンタの値と一致するまで、ユーザプログラムは単一ステップで実行される。
【００３２】
例示の図４のブロック４２６の完了後、論理プロセッサのすべてのプロセッサは、同じリタイヤ命令カウンタの値にあるが、背景技術の項で考察した理由から、ユーザプログラムが実際に命令ストリームの同じ実行ポイントにあるという保証はない。したがって、次のステップは、複数の命令を実行すること、それら命令の少なくともいくつかを復号すること、及び、復号された命令の入力を求めることである（ブロック４３０）。図４について言及する（並びに、図５、図７、及び図９のより具体的なインプリメンテーションにおける）復号は、プログラムベースの復号であり、命令の実行に備えてプロセッサにより実行されるハードウェアベースの復号と混同されるべきでない。代替的な実施の形態では、プロセッサは、緩やかなロックステップのオペレーション用に特に設計することができ、したがって、復号された情報を、プロセッサのレジスタを経由してソフトウェアへ渡すこともできるし、命令を復号して復号した情報をソフトウェアへ渡す第２のハードウェアベースの復号ユニットを有することもできる。例えば、ユーザプログラムの命令がＯＲ演算であるとみなす。復号を行うこと（ソフトウェアであろうと、特別に設計されたハードウェアであろうと）によって、マシン語命令が復号されて、その命令が、実行されたＯＲ演算であったと判断され、さらに、その命令がその機能を実行するのに使用した入力レジスタの値が求められる。これらの実行及び復号は、任意の順序で行うこともできるし、ほぼ同時に行うこともできる。復号された命令の少なくともいくつかのアドレス、及び、復号された命令の少なくともいくつかの入力を示す値は、プロセッサ間で交換される（ブロック４３２）。本発明の少なくともいくつかの実施の形態によれば、復号された命令のアドレス及び復号された命令の入力を示す値の交換は、その情報を同期レジスタ５４に書き込むことによって行われ、投票者ロジック５６は、非協調プロセスの表示及びリタイヤ命令カウンタの値の交換と同様の方法で、その情報を返信する。
【００３３】
プロセッサが、復号された命令のアドレス及び命令の入力を示す値を他のプロセッサから取得するとすぐに、図４の例示の方法が実施されるプロセッサは、交換された命令のアドレスのパターンマッチングを行う（ブロック４３４）。アドレス（したがって、アドレス及び命令）及び入力を示す値の一致するパターンを見つけることによって、各プロセッサは、論理プロセッサ内の他のプロセッサを基準とした自身の相対的な実行ポイントを求める。次のステップは、図４の例示の方法が実施されるプロセッサが、ユーザプログラムの実行ポイントにおいて遅れているかどうかを判断することである（ブロック４３６）。プロセッサは、自身が遅れている場合、実行ポイントが、論理プロセッサのプロセッサにおける、ユーザプログラムの最も進んだ実行ポイントと一致するまで、ユーザプログラムを先に進めて実行する（ブロック４３８）。
【００３４】
少なくともいくつかの実施の形態によれば、各プロセッサがユーザプログラムの非協調性に合意した時にアラインメントを強制するだけで、ユーザプログラムの非協調性にかかわらず、適切なオペレーションを確保するのに十分な場合がある。さらに別の実施の形態では、各プロセッサは、ユーザプログラムにシステムコールを仕掛けて（ブロック４４０）、ユーザプログラムの少なくとも非協調プロセスの指定を引き起こした部分が再びそのようにならないことを確実にすることができる。いくつかの実施の形態では、ユーザプログラムの好ましくない部分（ほとんどはソフトウェアループ）が、システムコールを含むように変更される。これは、例えば、ノーオペレーション命令（ＮＯＰ）をシステムコール（例えば、日時コール）と置換することによって行われる。ユーザプログラム命令ストリームが単なる置換を許容していない場合には、命令は、その置換される命令を指し示す分岐命令、システムコール、及びリターン分岐命令と置換される。これらの変更は、ユーザプログラムがメインメモリに存在するときにユーザプログラムに対して行うことができ、且つ／又は、ユーザプログラムがディスクドライブ等の長期記憶デバイスに存在するときにユーザプログラムに対して行うことができる。さらに別の代替的な実施の形態では、プロセッサハードウェアは、命令ストリームの特定のポイントに割り込みを挿入するメカニズムをサポートすることができ、その割り込みは、割り込みスケジューリングのためのシステムコールをトリガする。例えば、Ｉｔａｎｉｕｍ（登録商標）プロセッサファミリは、「命令ブレークポイントレジスタ」として知られている、プロセッサ内のレジスタをサポートする。このブレークポイントレジスタには、命令ポインタ値をロードすることができる。実際の命令ポインタがブレークポイントレジスタの値と一致すると、割り込みがトリガされる。この例示のメカニズムは、割り込みをトリガするのに使用され、この割り込みは、次に、同期目的でシステムコールをトリガする。このハードウェアベースのメカニズムは、すべてのアーキテクチャで利用可能でない場合があるが、ユーザプログラムを変更する実施の形態は、汎用的な適用を有することができる。その後、非協調プロセスタイマはリセットされ（ブロック４１７）、現在のシステムコール番号は保存され（ブロック４１９）、割り込みが有効にされ（ブロック４１８）、そして割り込みハンドラはリターンする（ブロック４２０）。
【００３５】
さらに図４を参照して、破線４２８内の一群のステップは、復号（ブロック４３０）、復号された命令のアドレスの交換（ブロック４３２）、及びパターンマッチング（ブロック４３４）であり、論理プロセッサ内の他のプロセッサの実行ポイントを基準とした相対的な実行ポイントを求めるのに使用できるいくつかの代替的な実施の形態の高レベルの概要である。本明細書は、プロセッサが自身の相対的な実行ポイントを求めるのに使用できる３つの代替的な実施の形態を提示する。これらの代替的な実施の形態のそれぞれについて次に考察することにする。
【００３６】
図５は、プロセッサが自身の相対的な実行ポイントを求めるのに使用できる代替的な実施の形態の第１のものを示している。図５の例示の方法のステップは、図４の破線４２８内の３つの高レベルの記述に取って代わるものである。このプロセスは、カウントパラメータをゼロにすることによって開始する（ブロック５００）。次のステップは、単一のユーザプログラム命令を実行することである（ブロック５０２）。単一のユーザプログラム命令を実行することは、図５の例示の方法が実施されるプロセッサを単一ステップモードにすること、及び、単一の命令を実行することによって行うことができる。この命令は（プロセッサによる実行の前又は後のいずれかで）復号され、命令の入力が求められる（ブロック５０４）。ブロック５０４の例示のステップは、ソフトウェア復号プロセスであり、プロセッサによって実行されて（ブロック５０２の）例示の実行を実施するユーザ命令の復号と混同されるべきではない。例えば、実行されたユーザプログラムが論理ＡＮＤ演算である場合、図５の例示の方法は、マシン語命令を復号して、その命令がＡＮＤ演算であったと判断し、その命令がその機能を実行するのに使用した入力レジスタの値をさらに求める。その後、復号された命令のアドレス及び入力を示す値は、リストに書き込まれ（ブロック５０６）、カウントパラメータがインクリメントされる（ブロック５０８）。命令を復号する例示のステップ（ブロック５０４）及び復号された各命令のアドレス（及び関連情報）をリストに書き込む例示のステップ（ブロック５０６）は、所定の繰り返し回数だけ繰り返される（ブロック５１０）。これらの実施の形態のこの所定の繰り返し回数は、図では「３Ｎ」として示されている。Ｎの値は、特定のブランド及びモデルのプロセッサでテストを行うことによって求めることができ、同じ命令ストリームを提供されて、同じ時間の間その命令ストリームを実行するプロセッサ間のリタイヤ命令カウンタの値の少なくとも最大誤差を表すものである。換言すると、Ｎの値は、プロセッサのリタイヤ命令カウンタ（ユーザプログラムがディスパッチされた時にゼロにされる）が等しい時のプロセッサの実行ポイント間の命令数の最大差である。いくつかの実施の形態では、誤差の幅（margin）を有するために、Ｎの値は、最大誤差の複数倍にすることができ、場合によっては、Ｎの値は、最大誤差が例えば１，０００未満であっても、１，０００となるように選択される。図５の例示の場合、及び、誤差の幅を含むＮではなくＮの正確な値が使用される場合には、一致するものが、命令の先頭と、その先頭が進んでいる命令の個数とを正確に特定することを確実にするために、少なくとも３Ｎ個の命令の復号された値が交換されるべきである。３Ｎ個よりも多くの命令の復号された値を交換すること（又は、Ｎが、意図的に真のＮよりも大きくなるように選択された場合）も、本発明の範囲及び精神の範囲内にある。
【００３７】
さらに図５を参照して、判定ブロック５１０によって示すように、実行、復号、及び復号された値のリストへの書き込みは、リタイヤ命令カウンタの値の最大誤差の少なくとも３倍で完了する。次のステップは、作成されたリストを投票者ロジックに書き込むこと（ブロック５１２）、及び、投票者ロジックが論理プロセッサにおける他のプロセッサからの同様の情報をメモリにライトバックするまでソフトウェアループで待機すること（ブロック５１４）である。このメモリは、例えば、図５の例示の方法が実施されるプロセッサのロケーション５７である。プロセッサは、論理プロセッサにおける他のプロセッサからのリストを有するとすぐに、リストのパターンマッチングを実行し、リタイヤ命令カウンタの値の最大誤差の少なくとも２倍の長さを有するパターンを探索する（seek）（ブロック５１６）。一致するものが見つかるとすぐに、プロセッサは、次に、論理プロセッサにおける他のプロセッサを基準とした相対的な、ユーザプログラムにおける自身の実行ポイントを求める（ブロック５１８）。その後、プロセスは、例示の方法が実施されたプロセッサが遅れているかどうかの例示の判断で再開する（図４のブロック４３６）。
【００３８】
図６は、図４及び図５の概念をさらに示すために、２つのプロセッサＰＡ１及びＰＢ１の複数の命令｛Ａ，Ｂ，…Ｐ｝を示している。この説明は、３つのプロセッサにも等しく適用することができるが、この説明を過度に複雑にしないように２つが使用されている。詳細には、各ユーザプログラムが非協調的であると判断されており、プロセッサの１つが、それらプロセッサのリタイヤ命令カウンタの値が等しくなる（「ＲＩＣ＝」）まで、先に進めて実行されたものとみなす。リタイヤ命令をカウントする際の不正確さのために、プロセッサＰＡ１のユーザプログラムで実行される次の命令は命令Ｃである一方、プロセッサＰＢ１で実行される次の命令は命令Ａである。このように、プロセッサＰＡ１が、実行ポイントにおいて、２つのユーザプログラム命令分だけプロセッサＰＢ１の先頭に立っている。換言すると、この状況のスキューは２である。さらに、ユーザプログラムの平均的なタイムスライスの期間中に遭遇する命令数にわたるリタイヤ命令カウンタの値の最大誤差は、場合によっては経験的なテストを通じて、４であると判断されるものとみなす。
【００３９】
この例示の場合に、Ｎの値は、４以上とすることができ、この例の場合、Ｎは正確に４である。したがって、各ユーザプログラムは、この例示の場合に、１２個のユーザプログラム命令を先に進めてステップすることが許可されると同時に、各プロセッサは、復号された命令のアドレス及び復号された命令への入力を示す値のリストを作成する（図５のブロック５００〜５１０）。一旦完了すると、プロセッサＰＡ１は、１２個のエントリ｛Ｃ，Ｄ，…Ｎ｝を含むリスト６００を有する。同様に、プロセッサＰＢ１は、｛Ａ，Ｂ，…Ｌ｝を含むリスト６０２を有する。その後、これらのリストは、プロセッサ間で交換され（図５のブロック５１２及びブロック５１４）、各プロセッサは、自身が作成したリストと、他のプロセッサから取得した１つ又は複数のリストとのパターンマッチングを実行して、相対的な実行ポイントを求める（図５のブロック５１６及びブロック５１８）。図６の例示の場合、各プロセッサは、｛Ｃ，Ｄ，…Ｌ｝を含むパターンの一致を見つける。したがって、１０個の命令が、一致するものとして見つけられ、これは、リタイヤ命令カウンタの値の最大誤差の２倍（２Ｎ）の最小パターン一致長を超えている。この例では、プロセッサＰＡ１は、自身が先頭に立ち、プロセッサ間の実行ポイントのスキューは２（Ｓ＝２）であると判断する（図５のブロック５１８）。同様に、プロセッサＰＢ１は、自身が遅れており、この例示の場合のスキューは２であると判断する（図５のブロック５１８）。したがって、次のステップは、遅れているプロセッサ、この場合、ＰＢ１が、スキューの量だけ先に進めて実行することであり（図４のブロック４３８）、このステップの後、ライン６０４によって示すように、各ユーザプログラムで実行される次の命令がＯの状態で、プロセッサのそれぞれはアラインメントされる。このようにして、例示の２つのプロセッサのアラインメントが完了し、その後、追加プログラムが、重複しないメモリを探索する可能性もなく、且つ、プロセッサ間でメモリページデータをコピーする必要もなく、ユーザプログラムとメモリを共有できる他のプログラムをディスパッチすることが安全となる。
【００４０】
図５を再び手短に参照して、復号された命令（のアドレス）及び入力を示す値をリストに書き込む例示のステップ（ブロック５０６）は、多くの形態を取ることができる。いくつかの実施の形態では、復号された命令及び実際の入力自体をリストに書き込むことができる。プロセッサ間で交換されるデータ量を削減するために、代替的な実施の形態は、入力の値のシグネチャ又は縮小表現を送信する。例えば、各プロセッサは、入力の巡回冗長検査合計を計算することができ、この検査合計をリストに書き込まれる値として、他のプロセッサと交換することができる。巡回冗長検査符号や６４ビット修正フレッチャー検査合計（modified Fletcher check sum）等のあらゆる強い検査合計発生器を使用することができる。
【００４１】
さらに図５を参照して、さらに別の代替的な実施の形態は、実行された３Ｎ個の命令の全命令よりも少なく符号化して交換することによって、プロセッサ間で交換されるデータ量を削減する。より詳細には、本発明のいくつかの実施の形態は、ユーザプログラム内の所定の一致ポイントの命令のアドレスのみを交換する。これらの実施の形態では、すべての入力の値が交換されるか、又は、すべての命令の入力の値を使用して計算された巡回冗長検査の値を交換することによって、そのデータセットをさらに削減することができる。例えば、いくつかの実施の形態では、一致ポイントは、実質的に、実行された３Ｎ個の命令の最初の命令及び最後の命令のアドレスと共に、分岐命令のアドレスのみとすることができる。分岐命令が一致ポイントとなる例示の実施の形態では、各プロセッサは、少なくとも２Ｎの長さを有する一致するものを探索するが、一致する分岐命令間の命令がカウントされ、同じであると仮定される。しかしながら、それらの命令への入力は、巡回冗長検査の値を計算する時は含まれる。さらに別の代替的な実施の形態では、一致ポイントは、周期的な命令ポインタの値を有する命令であり、例えば、命令ポインタ（ＩＰ）＝０  ｍｏｄ  Ｍを有する命令である（ここで、Ｍは、あらゆる任意の数であり、例えば、１０、２０、３０である）。
【００４２】
図５及び図６によって示す実施の形態では、パターンマッチング段階まで、どのプロセッサが進み、どのプロセッサ（複数可）が遅れているかは分からない。したがって、先頭の適切な特定を確保するには、リタイヤ命令カウンタの値の最大誤差の３倍を実行することが必要とされることがある。しかしながら、プロセッサ間で交換されるデータ量を削減することが望ましく、リタイヤ命令カウンタの値のアラインメント（図４のブロック４２６）後に、どのプロセッサがユーザプログラムの実行ポイントにおいて先頭に立っているかが分かる場合には、実行、復号、及び交換される命令の個数だけでなく、パターンマッチングの長さも削減することができる。
【００４３】
図７は、図４の破線２８内で実施することができるステップの代替的な実施の形態を示している。この代替的な実施の形態では、実行されるユーザプログラム命令の個数、復号されるユーザプログラム命令の個数、及び交換されるアドレスの個数が削減される。詳細には、リタイヤ命令カウンタの値をアラインメントすると（図４のブロック４２６）、論理プロセッサのさまざまなプロセッサは、どのプロセッサが実行ポイントにおいて進んでいるかに気付かない。しかしながら、リタイヤ命令カウント値に起こり得る最大誤差は判明している（又は、実際の起こり得る最大誤差を含むように十分大きいと仮定される）ので、Ｎ個の命令を先に進めて実行する或るプロセッサを選択することによって、先頭を強制することができる。したがって、図７の例示の方法の最初のステップは、強制される先頭プロセッサを選択することである（ブロック７００）。強制された先頭として選択されたプロセッサは、必ずしも、実行ポイントにおいて、実際に先行するプロセッサである必要はなく、実際には、強制された先頭の選択は、任意のものとすることができる。強制された先頭を選択することは、例えば、（プロセッサがブートされる時に割り当てられる）最下位プロセッサ識別番号及び最上位プロセッサ識別番号でプロセッサを選択することを含むことができる。他の実施の形態では、強制された先頭を選択することは、レジスタ５４への書き込み等、投票者ロジックを通じた情報の交換を含み、投票者ロジックは、各プロセッサから供給されたデータをすべてのプロセッサへ返信する。例えば、一選択方法は、各プロセッサに乱数を発生させ、最も高い乱数を有するプロセッサ（数の交換後に判断される）が、強制された先頭となる。他の方法も等しく使用することができる。
【００４４】
次のステップは、図７の例示の方法が実行されているプロセッサが、強制された先頭であるかどうかを判断することである（ブロック７０２）。例示の方法が実行されているプロセッサが、強制された先頭である場合、そのプロセッサは、ユーザプログラムにおいて、リタイヤ命令カウンタの値の最大誤差に少なくとも等しい命令数を先に進めて実行する（ブロック７０４）。この特定のステップの命令のいずれも復号及び／又は記録を行う必要はない。強制された先頭が、実行ポイントにおいて、実際に進んでいたのか、それとも遅れていたのかにかかわらず、リタイヤ命令カウンタの値の最大誤差を先に進めて実行した後は、このステップを実行したプロセッサが、ユーザプログラムの実行ポイントにおいて先頭になる（又は先頭に並ぶ（tied for））。
【００４５】
さらに図７を参照して、各プロセッサの次のステップは、カウントパラメータをゼロにすること（ブロック７０６）、及び、単一のユーザプログラム命令を実行すること（ブロック７０７）である。その後、プロセッサによって実行された命令は復号され、その命令の入力が求められる（ステップ７０８）。代替的に、この復号は、実行の前に行うこともできるし、ほぼ同時に行うこともできる。復号された命令のアドレス及び入力を示す値は、リストに書き込まれ（ブロック７１０）、カウントパラメータがインクリメントされる（ブロック７１２）。図５の例示の方法と酷似して、命令を復号する例示のステップ（ブロック７０８）、及び、復号された各命令のアドレス（及び関連情報）をリストに書き込む例示のステップ（ブロック７１０）は、所定の繰り返し回数繰り返される（ブロック７１４）。一方、図５の例示の方法と異なり、図７の方法では、所定の繰り返し回数は、リタイヤ命令カウンタの最大誤差の２倍であり、図では「２Ｎ」として示されている。図７の例示の場合、及び、誤差の幅を含むＮではなくＮの正確な値が使用される場合には、一致するものが、先頭と、その先頭が進んでいる命令の個数とを正確に特定することを確保するために、少なくとも２Ｎ個の命令の復号された値が交換されるべきである。しかしながら、２Ｎ個よりも多くの命令の復号された値を交換すること（又は、Ｎが、意図的に真のＮよりも大きくなるように選択された場合）も、本発明の範囲及び精神の範囲内にある。
【００４６】
さらに図７を参照して、次のステップは、作成されたリストを投票者ロジックに書き込むこと（ブロック７１６）、及び、投票者ロジックが論理プロセッサにおける他のプロセッサからの同様の情報をメモリにライトバックするまでソフトウェアループで待機すること（ブロック７１８）である。このメモリは、例えば、図７の例示の方法が実施されるプロセッサのロケーション５７である。プロセッサは、論理プロセッサにおける他のプロセッサからのリストを有するとすぐに、リストのパターンマッチングを実行し、少なくとも１つの一致するアドレスを有するパターン（１つの一致する命令）を探索するか、又は、場合によっては、一致するものが全くないこともある（ブロック７２０）。少なくとも１つの命令の一致するものが見つかるか、又は、一致するものが見つからないとすぐに、プロセッサは、次に、強制された先頭を基準とした相対的な、ユーザプログラムにおける自身の実行ポイントを求める（ブロック７２２）。その後、プロセスは、この方法が実施されたプロセッサが遅れているかどうかの判断で再開する（図４のブロック４３６）。図７のオペレーションでは、進んでいるか又は遅れているかのプロセッサのラベルに関して気付くべき違いがある。プロセッサの実行ポイントは、リタイヤ命令カウンタの値が強制的に等しくされた（図４のブロック４２６）時に遅れていることがあるが、当初遅れているプロセッサが、強制された先頭として選択され、Ｎ個の命令を進められた場合（ブロック７００〜７０４）、パターンマッチング後には、その強制された先頭は、実行ポイントにおいて先頭に立ち、他のプロセッサ（複数可）は前進することになる（図４のブロック４３６及び４３８）。対照的に、リタイヤ命令カウンタの値を強制的に等しくした後に、プロセッサの実行ポイントが遅れており、そのプロセッサが、強制された先頭として選択されない場合、２Ｎ個の命令の実行、復号、交換、及びパターンマッチングが一旦完了すると、プロセッサはさらに遅れることになる。
【００４７】
図８Ａは、図４及び図７の概念をさらに示すために、２つのプロセッサＰＡ１及びＰＢ１の複数の命令｛Ａ，Ｂ，…Ｍ｝を示している。この説明は、３つのプロセッサにも等しく適用することができるが、この説明を過度に複雑にしないように２つが使用されている。詳細には、各ユーザプログラムが非協調的であると判断されており、プロセッサの１つが、それらプロセッサのリタイヤ命令カウンタの値が等しくなる（「ＲＩＣ＝」）まで、先に進めて実行されたものとみなす。リタイヤ命令をカウントする際の不正確さのために、プロセッサＰＡ１のユーザプログラムで実行される次の命令は命令Ｃである一方、プロセッサＰＢ１で実行される次の命令は命令Ａである。このように、プロセッサＰＡ１が、実行ポイントにおいて、２つのユーザプログラム命令分だけプロセッサＰＢ１の先頭に立っている。さらに、ユーザプログラムの平均的なタイムスライスの期間中に遭遇する命令数にわたるリタイヤ命令カウンタの値の最大誤差は、場合によっては経験的なテストを通じて、４であると判断されるものとみなす。
【００４８】
図８Ａの例示の場合に、Ｎの値は、４以上とすることができ、この例の場合、Ｎは正確に４である。プロセッサＰＢ１は、強制された先頭として任意に選ばれ（図７のブロック７００）、したがって、ユーザプログラムのＮ個の命令を先に進めてステップする（図７のブロック７０４）。その後、各ユーザプログラムは、この例示の場合には、８つのユーザプログラム命令（２Ｎ）を先に進めてステップすることが許可されると同時に、各プロセッサは、復号された命令のアドレス及び復号された命令への入力を示す値のリストを作成する（図７のブロック７０６〜７１４）。一旦完了すると、プロセッサＰＡ１は、８つのエントリ｛Ｃ，Ｄ，…Ｊ｝を含むリスト８０４を有する。同様に、プロセッサＰＢ１は、エントリ｛Ｅ，Ｆ，…Ｌ｝を含むリスト８０４を有する。その後、これらのリストは、プロセッサ間で交換され（図７のブロック７１６及び７１８）、各プロセッサは、自身が作成したリストと、他のプロセッサから取得した１つ又は複数のリストとのパターンマッチングを実行して、相対的な実行ポイントを求める（図７のブロック７２０及び７２２）。図８Ａでは、各プロセッサは、｛Ｅ，Ｆ，…Ｊ｝を含むパターンの一致を見つける。この例では、プロセッサＰＡ１は、自身が現在遅れており、プロセッサ間の実行ポイントのスキューは２（Ｓ＝２）であると判断する（図７のブロック７２２）。同様に、プロセッサＰＢ１は、自身が現在進んでおり、この例示の場合のスキューは２であると判断する（再び図７のブロック７２２）（図８Ａは、プロセッサＰＡ１は、最初、２つだけ進んでいることに言及している）。したがって、次のステップは、遅れているプロセッサ、この場合、ＰＡ１（リタイヤ命令カウンタの値を強制的に等しくした後に、ＰＡ１が進んでいたことにかかわらず）が、２つの命令だけ先に進めて実行することであり（図４のブロック４３８）、このステップの後、ライン８０６によって示すように、各ユーザプログラムで実行される次の命令がＭの状態で、プロセッサのそれぞれはアラインメントされる。このようにして、例示の２つのプロセッサのアラインメントが完了し、その後、追加プログラムが、重複しないメモリを探索する可能性なく、ユーザプログラムとメモリを共有できる他のプログラムをディスパッチすることが安全となる。
【００４９】
図８Ｂは、リタイヤ命令カウンタを強制的に等しくした後の先頭のプロセッサＰＡ１が、強制された先頭として選択されることを除いて、図８Ａと同じ状況を示している。したがって、プロセッサＰＡ１が、ユーザプログラムのＮ個の命令を先に進めてステップし（図７のブロック７０４）、ＰＡ１の最初の復号された命令（図７のステップ７０８）を命令Ｇとする。その後、各ユーザプログラムは、８つのユーザプログラム命令（２Ｎ）を先に進めてステップすることが許可されると同時に、各プロセッサは、復号された命令のアドレス及び復号された命令への入力を示す値のリストを作成する（図７のブロック７０６〜７１４）。一旦完了すると、プロセッサＰＡ１は、８つのエントリ｛Ｇ，Ｈ，…Ｎ｝を含むリスト８１０を有する。同様に、プロセッサＰＢ１は、エントリ｛Ａ，Ｂ，…Ｈ｝を含むリスト８１２を有する。その後、これらのリストは、プロセッサ間で交換され（図７のブロック７１６及び７１８）、各プロセッサは、自身が作成したリストと、他のプロセッサから取得した１つ又は複数のリストとのパターンマッチングを実行して、相対的な実行ポイントを求める（図７のブロック７２０及び７２２）。図８Ｂでは、各プロセッサは、｛Ｇ，Ｈ｝を含むパターンの一致を見つける。この例では、プロセッサＰＢ１は、自身が遅れており（６つの命令分）、プロセッサ間の実行ポイントのスキューは２（Ｓ＝２）であると判断する（図７のブロック７２２）。換言すると、プロセッサ間の元のスキューは２であったが、強制された先頭を、Ｎ個の命令を先に進めて実行した後、スキューは６つの命令となる。同様に、プロセッサＰＡ１は、自身が進んでおり（６つの命令分）、この例示の場合のスキューは２であると判断する（再び図７のブロック７２２）。この場合も、プロセッサ間の元のスキューは２であったが、強制された先頭を、Ｎ個の命令を先に進めて実行した後、スキューは６つの命令となる。したがって、次のステップは、遅れているプロセッサ、この場合、ＰＢ１が、６つの命令だけ先に進めて実行することであり（図４のブロック４３８）、このステップの後、プロセッサのそれぞれはアラインメントされる。
【００５０】
図７の例示の方法を使用して解析された状況では、プロセッサ間のスキューがＮに等しく、且つ、真の先頭が、強制された先頭として偶然に選ばれた場合、この強制された先頭は、２Ｎ個分先頭に立つ。各プロセッサが２Ｎ個の命令分前進すると、先頭のプロセッサは依然として２Ｎ個の命令分先行しており、したがって、パターンマッチングにおいて一致は見つからないことになる（図７のブロック７２０）。この場合、図７の例示の方法が動作するプロセッサは、元のスキューがＮであったが、遅れているプロセッサは、現在、２Ｎ個の命令分遅れていることを知っている。図７の方法をさらに参照して、スキューが１（Ｓ＝１）の状況では、交換されたリスト間には、単一の一致する命令しかないことになる。しかしながら、強制された先頭が確かに先頭であるという知識を与えると、プロセッサ間の実行ポイントを特定するには、単一の命令で十分である。さらに、この評価に対する確信は、一致する命令が、強制された先頭のリストのまさに始点にあり、強制されていない先頭（複数可）のリストのまさに終点にあることから得ることができる。
【００５１】
図９は、図４の破線２８内で実施できるステップのさらに別の代替的な実施の形態を示している。この実施の形態では、実行されるユーザプログラム命令の個数、復号されるユーザプログラム命令の個数、及び交換されるアドレスの個数が削減される。詳細には、リタイヤ命令カウンタの値をアラインメントすると（図４のブロック４２６）、各プロセッサの次のステップは、カウントパラメータをゼロにすること（ブロック９００）、及び、単一のユーザプログラム命令を実行すること（ブロック９０２）である。その後、プロセッサによって実行された命令は復号され、その命令の入力が求められる（ステップ９０４）。ブロック９０４の復号は、実行の後に示されているが、実行の前に行うこともできるし、実行とほぼ同時に行うこともできる。復号された命令のアドレス及び復号された命令の入力を示す値は、リストに書き込まれ（ブロック９０６）、投票者ロジックにも書き込まれる（再びブロック９０６）。したがって、命令は、復号された後直ちに交換される。次に、この例示の方法は、他のプロセッサからの復号された命令のアドレス及び復号された命令の入力を示す値の返信をソフトウェアループで待つ（ブロック９０８）。このデータが投票者ロジックからライトバックされた後、アドレス及び入力の値は、第２のリストに記憶され（ブロック９１０）、カウントパラメータがインクリメントされる（ブロック９１２）。命令を復号する例示のステップ（ブロック９０４）、及び、復号された各命令のアドレス（及び関連情報）をリスト及び投票者ロジックに書き込む例示のステップ（ブロック９０６）は、所定の繰り返し回数繰り返される（ブロック９１４）。図５及び図７の例示の方法とは異なり、この所定の繰り返し回数は、リタイヤ命令カウンタの値の少なくとも最大誤差のみであり、図では「Ｎ」として示されている。図９の例示の場合、及び、誤差の幅を含むＮではなくＮの正確な値が使用される場合には、一致するものが、先頭と、その先頭が先頭が進んでいる命令の個数とを正確に特定することを確保するために、少なくともＮ個の命令の復号された値が交換されるべきである。しかしながら、Ｎ個よりも多くの命令の復号された値を交換すること（又は、Ｎが、意図的に真のＮよりも大きくなるように選択された場合）も、本発明の範囲及び精神の範囲内にある。
【００５２】
さらに図９を参照して、ユーザプログラムのＮ個の命令の実行及び復号の後、例示の方法は、復号された命令のアドレス（及び入力を示す値）の、内部で生成されたリストからの命令と、論理プロセッサにおける他のプロセッサによって提供された復号された命令のアドレス（及び入力を示す値）のリストからの命令とに対してパターンマッチングを実行する（ブロック９１６）。２つ又は３つ以上の一致するものが見つかり（ブロック９１８）、且つ、例示のプロセスが、ユーザプログラムの３Ｎ個の命令よりも少ない個数しか実行されていない場合（ブロック９２４）、プロセスは、さらにユーザプログラム命令を実行する。２つ又は３つ以上の一致するパターンが見つかると、プロセス間の先頭を決定することはできず、したがって、比較するための命令がさらに必要とされる。他方、一致するものが１つだけ見つかると（長さは任意であり、単一の命令（及び入力）の一致するものを含む）（ブロック９１８及び９１９）、次のステップは、実行ポイントを求めることである（ブロック９２０）。その後、プロセスは、この例示の方法が実施されたプロセッサが遅れているかどうかの例示の判断で再開する（図４のブロック４３６）。一致するものが見つからない場合（ブロック９１９）、これは、Ｎの値が正しくなかったことを示すエラーがある場合である（ブロック９２１）。２つ又は３つ以上の一致するものが見つかったが（ブロック９１８）、３Ｎ個の命令が実行されている場合、復号された命令は、冪等ループ（idempotent loop、ループの繰り返しが、命令及び命令への入力に基づいて区別できないループ）を含み、１つの一致するものが任意に選択され（ブロック９２６）、実行ポイントが、その選択された一致するものを基準として求められる（ブロック９２０）。換言すると、３Ｎ個の命令が実行され、依然として２つ又は３つ以上の一致するものがある場合には、それら一致するもののいずれか１つが選択されて、実行ポイントが強制的に等しくされる。
【００５３】
したがって、図９の例示の方法は、Ｎ個の命令のみ（スキューＳ＝０の場合）のアドレスの復号及び交換で相対的な実行ポイントを確認できる場合がある。図９の例示の方法を実施する一般的な場合には、各プロセッサは、それらプロセッサの各ユーザプログラムの実行ポイントを確認するのに、多くともＮ＋２Ｓ個の命令しか実行する必要がない。したがって、図９の方法は、スキューが小さい場合に図５及び図７の例示の方法を上回る利点を有する。スキューがＮに近づく極限においては、図９の方法は、図５の方法と同じ３Ｎ個の復号された命令の交換に低下する。
【００５４】
図１０Ａは、図４及び図９の概念をさらに示すために、２つのプロセッサＰＡ１及びＰＢ１の複数の命令｛Ａ，Ｂ，…Ｅ｝を示している。この場合、例示の命令が、ループの２つの繰り返しをどのように表すかに注目されたい。詳細には、ユーザプログラムの各コピー（又はプロセッサ）が非協調的であると判断されており、プロセッサの１つが、それらプロセッサのリタイヤ命令カウンタの値が等しくなる（「ＲＩＣ＝」）まで、先に進めて実行されたものとみなす。リタイヤ命令をカウントする際の不正確さのために、プロセッサＰＡ１のユーザプログラムで実行される次の命令は命令Ｃである一方、プロセッサＰＢ１で実行される次の命令は命令Ａである。このように、プロセッサＰＡ１が、実行ポイントにおいて、２つのユーザプログラム命令分だけプロセッサＰＢ１の先頭に立っている。さらに、リタイヤ命令カウンタの値の最大誤差は、この場合、４であるとみなす。
【００５５】
図１０Ａの例示の場合に、Ｎの値は、４以上とすることができ、この例の場合、Ｎは正確に４である。各ユーザプログラムは、少なくとも４つのユーザプログラム命令を先に進めてステップすることが許可されると同時に、各プロセッサは、復号された命令のアドレス（及び復号された命令への入力を示す値）のリストを作成してリストを交換する（図９のブロック９００〜９１４）。Ｎ個の命令の復号が一旦完了すると、プロセッサＰＡ１は、４つのエントリ｛Ｃ，Ｄ，Ａ，Ｂ｝を含むリスト１００２を有する。同様に、プロセッサＰＢ１は、エントリ｛Ａ，Ｂ，Ｃ，Ｄ｝を含むリスト１００４を有する。これらの実施の形態では、復号された命令のアドレス（及び復号された命令の入力を示す値）は、各復号の後に交換され（図９のブロック９０６及び９０８）、また、各プロセッサは、論理プロセッサにおける他のプロセッサからのリストも有する。したがって、各プロセッサは、自身が作成したリストと、他のプロセッサから取得した１つ又は複数のリストとのパターンマッチングを実行する（図９のブロック９１６）。一方、図１０Ａの例示の場合には、各プロセッサは、｛Ｃ，Ｄ｝及び｛Ａ，Ｂ｝である２つの一致するパターンを見つける（ブロック９１８）。したがって、これら２つのプロセッサ間の実行ポイントは求めることができず、この例では、Ｎ個の命令のみが実行され復号されているので、プロセスは、ユーザプログラム命令を追加して実行及び復号することに戻る。
【００５６】
図１０Ｂは、（１つのユーザプログラム命令のみを追加し、先に進めてステップすると、依然として、等しい長さの２つの一致するパターンが残るので）２つのユーザプログラム命令を追加して実行及び復号した後の図１０Ａの状況を示している。詳細には、２つのユーザプログラム命令を追加して実行した後、プロセッサＰＡ１は、６つのエントリ｛Ｃ，Ｄ，Ａ，Ｂ，Ｃ，Ｅ｝を含むリスト１００６を有する。同様に、プロセッサＰＢ１は、エントリ｛Ａ，Ｂ，Ｃ，Ｄ，Ａ，Ｂ｝を含むリスト１００８を有する。この例示の場合のパターンマッチングは、４つの命令｛Ｃ，Ｄ，Ａ，Ｂ｝の長さを有する１つの一致するパターンを明らかにする。長さ４の一致するパターンが１つしか見つからないので（図９のブロック９１８）、ユーザプログラムの相対的な実行ポイントを求めることができる（ブロック９２０）。したがって、次のステップは、遅れているプロセッサ、この場合、ＰＢ１が、２つの命令分を先に進めて実行することであり（図４のブロック４３８）、このステップの後、プロセッサのそれぞれはアラインメントされる。
【００５７】
この時点までに説明した実施の形態は、Ｎの値が静的であり、事前に決定されていると仮定している。代替的な実施の形態では、Ｎの値が順応して（adaptively）変更される。図１１は、Ｎの値に対する順応変更を実施するアルゴリズムのフロー図を示している。図１１の例示の方法は、スタンドアロンプロセスとして実施することもできるし、図４の方法内に組み込むこともできる。このプロセスは開始して（ブロック１１００）、リタイヤ命令カウンタの正確度の証拠の収集に移る（ブロック１１０２）。いくつかの実施の形態では、リタイヤ命令カウンタの値が等しい場合、プロセッサ間の命令ポインタの値が比較される。例えば、リタイヤ命令カウンタの値が等しい場合において、命令ポインタが同じであるとき、これは、リタイヤ命令カウンタに誤差がないことの間接的な証拠となる。したがって、これらの実施の形態は、最も高いリタイヤ命令カウンタの値に向けて先に進めてステップした後、同期ロジックを使用して命令ポインタを交換すること等により、命令ポインタを交換することを必要とする。いくつかの実施の形態では、Ｎの正確度の直接的な証拠を求めることができる。例えば、図７によって示す実施の形態では、パターンマッチングの後、一致するものが見つからない場合、これは、Ｎの値がスキューに正確に等しかったことの直接的な証拠となる。図９では、一致するものが見つからない場合（ブロック９１９），これは、Ｎの値が正しくない（小さすぎる）ことの直接的な証拠となる。
【００５８】
リタイヤ命令カウンタの正確度の直接的な証拠又は間接的な証拠を収集する正確なメカニズムにかかわらず、次のステップは、リタイヤ命令の誤差がＮの値以上であることをその証拠が示すかどうかを判断することである（ブロック１１０４）。リタイヤ命令の誤差がＮの値以上であることをその証拠が示す場合、Ｎの値は調整されるべきであり（ブロック１１０６）、証拠のログはリセットされる（ブロック１１１６）（以下でさらに考察する）。Ｎの値の増加又は減少は、他のプロセッサの協議なしに、各プロセッサが完了することもできるし、Ｎの値を増加させる判断は、それらプロセッサによるデータの交換を起動して、変更の正確な値について合意することもできる。
【００５９】
リタイヤ命令カウンタの正確度がＮよりも大きいことを証拠が示唆していない場合、次のステップは、収集された証拠をログ記録することである（ブロック１１０８）。したがって、たとえ、リタイヤ命令カウンタの誤差がＮよりも大きい可能性があることを、収集された証拠の１つの事例が示していたとしても、（この場合、ユーザプログラムの複製コピーが正しくアラインメントされていない可能性があるので）Ｎの値の増加を行うべきである（ブロック１１０４及び１１０６）一方、Ｎの値を低くすることは、大きな証拠の集合に基づいて行われる。この証拠の集合のサイズが十分に大きくない場合（ブロック１１１０）、プロセスは終了する（ブロック１１１８）。他方、証拠の集合のサイズが十分に大きい場合（ブロック１１１０）、例えば、１週間のデータ又は１カ月のデータである場合、リタイヤ命令カウンタの値に起こり得る誤差が、Ｎの現在の値よりもはるかに小さいかどうかについての判断が行われる（ブロック１１１２）。例えば、プロセッサ間のリタイヤ命令カウンタの値の正確度が１０カウント以下であるが、Ｎがおよそ１０００程度である場合、Ｎの値を削減することができる（ブロック１１１４）。他方、プロセッサ間のリタイヤ命令カウンタの値の正確度が１００カウントであり、Ｎがおよそ２００程度である場合、Ｎの値は変更されるべきである。次のステップでは、証拠のログ記録がリセットされ（ブロック１１１６）、プロセスは終了する（ブロック１１１８）。
【００６０】
上記考察は、本発明の原理及びさまざまな実施の形態の例示であるように意図されている。当業者には、上記開示を十分に理解することによって、多数の変形及び変更が明らかになる。例えば、Ｉｔａｎｉｕｍ（登録商標）プロセッサが使用される場合に、そのコンパイラベースの投機的命令を使用できることを述べたが、プロセッサベースの投機は、リタイヤ命令カウンタに悪影響を与えるおそれがないので、上述した例示の方法及びシステムは、プロセッサベースの投機（例えば、分岐予測投機及び命令リオーダ（reorder））と共に機能する。例示の実施の形態は、プロセッサのリタイヤ命令カウンタの値が一致するまで、各プロセッサが前に進めて実行することを説明している。しかしながら、Ｎ個の命令を実行した時のリタイヤ命令カウンタの値の差を、Ｎの値のサイズにおいて考慮することができる。例えば、プロセッサが１００命令のリタイヤ命令カウント値の差を有する場合、Ｎの値は、１００に、少なくともリタイヤ命令カウンタについて予測できる誤差の最大量を加えたものとすることができる。添付の特許請求の範囲は、このようなすべての変形及び変更を包含するように解釈されることが意図されている。
【図面の簡単な説明】
【００６１】
【図１】本発明の実施の形態によるコンピューティングシステムを示す図である。
【図２】本発明の実施の形態によるコンピューティングシステムをより詳細に示す図である。
【図３】本発明の実施の形態による部分的なコンピューティングシステムを示す図である。
【図４】本発明の実施の形態による非協調プロセスハンドラを示す図である。
【図５】実行ポイントを判断する第１の代替的な方法を示す図である。
【図６】図５の方法を示す図である。
【図７】実行ポイントを判断する代替的な実施の形態を示す図である。
【図８Ａ】図７の方法を示す図である。
【図８Ｂ】図７の方法を示す図である。
【図９】実行ポイントを判断するさらに別の代替的な実施の形態を示す図である。
【図１０Ａ】図９の方法を示す図である。
【図１０Ｂ】図９の方法を示す図である。
【図１１】本発明の実施の形態に従って使用されるＮの値を順応して調整する例示のフロー図である。
【符号の説明】
【００６２】
１０Ａ，１０Ｂ，１０Ｃ・・・マルチコンピュータシステム
１２・・・論理プロセッサ
１４，１６  Ｉ／Ｏデバイス
１８，２０，２２，２４・・・同期ロジック
２６・・・相互接続
２８・・・投票者ロジック
３４・・・ネットワークインターフェース
４２，４２Ａ，４２Ｂ・・・Ｉ／Ｏブリッジメモリコントローラ
４４・・・プロセッサバス
４５・・・メモリバス
４６・・・メモリモジュール
４８・・・再統合ロジック
５２Ａ，５２Ｂ・・・メモリパーティション
５４・・・同期レジスタ
５６・・・投票者ロジック
【図１】
2006209769.tif 000003
【図２】
2006209769.tif 000004
【図３】
2006209769.tif 000005
【図４】
2006209769.tif 000006
【図５】
2006209769.tif 000007
【図６】
2006209769.tif 000008
【図７】
2006209769.tif 000009
【図８Ａ】
2006209769.tif 000010
【図８Ｂ】
2006209769.tif 000011
【図９】
2006209769.tif 000012
【図１０Ａ】
2006209769.tif 000013
【図１０Ｂ】
2006209769.tif 000014
【図１１】
2006209769.tif 000015