(57)【要約】【課題】プログラムを実行するデジタルプロセッサの計算エラーを検出するための方法を提供する。【解決手段】このプログラムは、複数の計算セクション２０７に分割され、これらの計算セクション２０７の１つについて、１次セグメント２１０及び２次セグメント２１５を含む２つの機能的に同一のコードセグメントがそれぞれ生成される。１次セグメント２１０が実行され、その後、時間的ダイバーシティタイマ２０８が始動される。次に、タイマ２０８の満了時に、２次セグメント２１５が実行される。２次セグメントの実行の完了後に、１次セグメント２１０及び２次セグメント２１５の各実行結果が比較（３１０）され、それら各結果が同一でない場合に、エラー表示が提供される。【選択図】図２
2006252548.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行するデジタルプロセッサの計算エラーを検出するための方法であって、
前記プログラムを複数の計算セクション（２０７）に分割するステップと、
前記計算セクション（２０７）の１つについて、１次セグメント（２１０）及び２次セグメント（２１５）を含む２つの機能的に同一のコードセグメントをそれぞれ生成するステップと、
前記１次セグメント（２１０）の実行を開始するステップと、
前記１次セグメント（２１０）が実行を完了した後に、時間的ダイバーシティタイマ（２０８）を始動するステップと、
前記タイマ（２０８）の満了時に前記２次セグメント（２１５）の実行を開始するステップと、
前記２次セグメントの実行の完了後に、前記１次セグメント（２１０）及び前記２次セグメント（２１５）の各実行結果を比較するステップ（３１０）と、
前記各結果が同一でない場合に、エラー表示を提供するステップ（２３０）と
を含む
方法。
【請求項２】
前記１次セグメント（２１０）及び前記２次セグメント（２１５）の実行によって生成された各結果を比較するための比較コード（３０４）を生成するステップと、
前記比較コード（３０４）を使用して前記各結果を比較するステップ（３１０）と
を含む
請求項１に記載の方法。
【請求項３】
前記計算セクション（２０７）のそれぞれは、一組の入力を取り込み、該入力に対して計算を実行し、その後の計算に対する一組の出力を公開する
請求項１に記載の方法。
【請求項４】
前記１次セグメント（２１０）及び前記２次セグメント（２１５）は、同じプロセッサ上で実行される
請求項１に記載の方法。
【請求項５】
前記２つの機能的に同一のコードセグメント（２１０／２１５）は、コンパイラ２０２によって生成される
請求項１に記載の方法。
【請求項６】
前記計算セクション（２０７）の前記１つは、プログラム全体を構成する
請求項１に記載の方法。
【請求項７】
前記時間的ダイバーシティタイマ（２０８）は、ソフトウェアを介して実施される
請求項１に記載の方法。
【請求項８】
前記時間的ダイバーシティタイマ（２０８）の前記満了は、Ｄｍａｘに等しい期間の経過を示し、該Ｄｍａｘは、前記プログラムの実行に混乱を起こさせる可能性のある一定の外部事象の平均継続時間にほぼ等しい所定の値である
請求項１に記載の方法。
【請求項９】
前記一定の外部事象は、アルファ粒子によって引き起こされた混乱を含む
請求項８に記載の方法。
【請求項１０】
前記一定の外部事象は、宇宙線によって引き起こされた混乱を含む
請求項８に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、時間的冗長性を実施するための可変遅延命令に関する。
【０００２】
［関連出願］
この出願は、２００３年１２月３日に出願された「FAULT-DETECTING COMPUTER SYSTEM」と題する米国特許出願第１０／７２６，９７６号の部分継続出願である。
【背景技術】
【０００３】
計算システムで発生すると考えられる、ハードウェアに関連したエラーの２つの部類は、ハードエラー及びソフトウェアエラーである。ハードエラーは、コンピュータシステムのオペレーションの不適切な振る舞いとして示される。このハードエラーは、持続するものであり、最初のエラーが起こった後、かなりの期間の間、継続してシステムに不適当な挙動及び結果を発生させる。ソフトエラーは、コンピュータハードウェアデバイスの一時的な異常によって生成される非再発性のエラーである。ソフトエラーは、一定の期間を超えて持続することはないコンピュータシステムの不適切な振る舞いを伴う。この期間が経過した後、システムのその後のオペレーションは正常に進行する。
【０００４】
コンピュータシステムを構成する物理デバイスが、より小さく、且つ、より多くなったことに伴い、今や、多くの再発性の物理現象が、これらデバイスのオペレーションに一時的な障害を引き起こす可能性がより高くなっている。この一時的な障害は、コンピュータシステムを構成するデジタル論理回路のオペレーション及び状態の混乱を招き、多くの場合、ソフトエラーを招く。ソフトエラーは、一般にハードエラーよりも検出するのが困難である。ソフトエラーは、ハードエラーよりも頻度が高いと考えられる。また、それらの影響がコンピュータシステムの設計において考慮されるべきであるほど十分多く発生するとも考えられる。ソフトエラーが検出されないことによって、誤った結果が計算結果として報告される可能性があったり、破損したデータがディスク若しくは他の永続的な媒体に記憶されるか、又は、ネットワーク接続を介して送信される可能性があったり、プログラム又はコンピュータシステム全体の振る舞いが異常になる可能性がある。ソフトエラーの検出及びオプションとしてのハードエラーの検出を提供する技法を使用して、最も高いエラー率を有するコンピュータシステムアーキテクチャのサブシステム用のエラー検出カバレッジ（error detection coverage）を提供することが望ましい。これらのサブシステムは、通常、システムメインメモリ、さまざまなレベルのプロセッサキャッシュ、並びにシステムＴＬＢ（変換索引バッファ）、Ｉ／Ｏ及び相互接続「ファブリック」を含む。エラーが検出されると、計算が継続して正しい結果を生成できるように、多くの場合、そのエラーを訂正する方法を提供することが望ましい。エラーがこれらのサブシステムの１つに発生すると、そのエラーは、他のサブシステムに配信される前に、検出されて訂正される。それによって、他のサブシステムは、エラーに対処する必要がなくなる。これには、保護されていない（uncovered）サブシステムに取り組むことが残されている。多くのコンピュータシステム設計では、中央処理装置の大部分が、エラー検出によってもエラー訂正によっても保護されていない。
【０００５】
ＶＬＳＩプロセッサの継続した発展によるコンポーネント密度のさらなる増加に伴い、これらのプロセッサが、宇宙線やアルファ粒子等のソースによって引き起こされる「ソフト」エラーの影響を受けやすいということが、計算システムの設計において問題になってきている。エラー検出コード及びエラー訂正コードは、コンピュータシステムメモリ、キャッシュ、及び相互接続ファブリックの設計に広く適用されて、正しいオペレーションを検証し、ソフトエラー又はハードエラーのいずれかが発生した場合には、データの表現の訂正を提供する。プロセッサは、コンピュータメモリデバイスよりも複雑で多様性のあるさらに多くの構造を有するので、プロセッサ電子機器を保護することは、より困難な作業である。プロセッサ電子機器を保護する既存のハードウェア技法は、プロセッサを構成するコア構造に発生し得るエラーのチェック、封じ込め（contain）、及び回復を行う大幅な論理構造の設計及び組み込みを必要とする。
【０００６】
他のプロセッサ指向のエラー検出技法は、「ロックステップ」で同じ命令を実行する複数のプロセッサ及び関連したセルフチェックハードウェアを設けて、各プロセッサから外部に見ることができるすべての結果が、その仲間のそれぞれ（又は過半数）の結果と一致することを検証し、正しいオペレーションを保証することを含んでいる。これらの技法の実施においては、比較が一致しない場合、誤った状態の伝播を制限するために、さらなる複雑さが必要とされる。これに加えて、特別な手順を実行して、計算結果を無効として規制するか、又は、計算の状態を回復しなければならない。このすべてが、システム設計のコスト及び複雑さを増大させる。
【０００７】
また、計算エラーに対処するソフトウェア技法も提案されてきた。これらの技法のいくつかは、結果が一致するまで、プログラムを複数回完全に実行し、その結果を比較し、次いで、計算を再実行することを含む。上記技法のすべては、計算が完了するのに必要な計算資源及び時間を増大させる。さらに、これらの技法のいくつかは、一定の部類のハードエラーを検出しない。他のソフトウェアフォールトトレランス技法は、計算が停止するか、若しくは、「フェイルファスト」になるように機能しなくなるとみなすか、又は、エラーが、プロセッサ設計に標準的に組み込まれたエラー例外チェックロジックによって検出されるとみなす。これらの技法は、多くの場合、ソフトエラーの不十分なカバレッジを提供する。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
上記から、コンピュータシステムの不適切なオペレーションを検出する方法は、多くの場合、不適切なオペレーションの検出をサポートし、不適切なオペレーションによる誤った結果に起因する損傷を最小にし、また、検出された障害にかかわらず処理を回復して継続するのに必要な特別の動作の個数及び程度も最小にするための大規模なハードウェア及びソフトウェアを必要とすることがわかる。このようなシステムは、多くの場合、基本的な計算環境自体に対する要求を超えて、２倍又は３倍の冗長なハードウェア並びに大規模なチェック及び訂正のロジックを使用していた。代替的なソフトウェアフォールトトレランス技法は、通常、特殊化されたプログラミング技法を採用する必要がある。この特殊化されたプログラミング技法は、システム及びアプリケーションソフトウェアの設計に影響を与える可能性があるか、又は、プログラムを複数回実行し、その後、２つ以上のプログラムの実行結果を比較することを必要とする。
【０００９】
コンピュータシステムの冗長性を実施するための既知の方法は、通常、プログラムをさらに実行する前に、「投票」方式を使用して、２つ以上の冗長な計算結果のいずれを使用又はコミットするかを決定する。しかしながら、これら既存の方法のいずれも、冗長な計算のそれぞれにおける対応する命令の実行間の相対的な時間を制御するためのメカニズムを提供しない。さらに、これら従来の方法は、一般に、ハードウェアベースであり、特別に設計されたプロセッサを必要とする。
【００１０】
このように、ソフトエラーを検出する既存の技法の実施は、ハードウェアベース又はソフトウェアベースのいずれであっても、大幅に追加したハードウェア、ソフトウェア、及び／又は他の資源を必要とする。
【課題を解決するための手段】
【００１１】
プログラムを実行するデジタルプロセッサの計算エラーを検出するための方法が説明される。一実施の形態では、このプログラムは、複数の計算セクションに分割され、これらの計算セクションの１つについて、１次セグメント及び２次セグメントを含む２つの機能的に同一のコードセグメントがそれぞれ生成される。１次セグメントが実行され、その後、時間的ダイバーシティタイマが始動される。次に、タイマの満了時に、２次セグメントが実行される。２次セグメントの実行の完了後に、１次セグメント及び２次セグメントの各実行結果が比較され、それら各結果が同一でない場合に、エラー表示が提供される。
【発明を実施するための最良の形態】
【００１２】
本明細書では、デジタルプロセッサに関係したエラーを検出するためのソフトウェア技法に関係のあるシステムを説明する。これらのシステムは、既存のコンピュータアーキテクチャと組み合わされた場合に、プロセッサの有効な障害検出カバレッジを提供する。用語「プロセッサ」は、この文書では、中央処理装置（「ＣＰＵ」）に加えて、他のタイプの機能を提供するデジタルプロセッサを指すためにも使用される。本明細書で説明する障害検出技法は、検出された障害状況からの効率的な回復を提供するのに使用することもできる。例示の実施の形態では、これらの技法は、アプリケーションプログラムのアーキテクチャ、構造、又はソースコードの変更を必要とすることなく使用することができる。
【００１３】
図１は、本システムでの使用に適したＩｎｔｅｌ  Ｉｔａｎｉｕｍ  ＩＩ等の例示のＶＬＩＷ（Very Long [or Large] Instruction Word；超長命令語）プロセッサ１０１の関連部分のブロック図である。ＶＬＩＷは、コンパイラが、複数の基本的な相互依存しないオペレーションを同じ命令語の中に詰め込む命令セットの思想を表す。これらの固定長の語（命令）は、キャッシュ又はメモリからプロセッサにフェッチされると、数個の短い長さの命令に分割される。これらの短い長さの命令は、独立した機能ユニット（「実行ユニット」としても知られている）にディスパッチされ、機能ユニットにおいて並列に実行される。図１に示すプロセッサでは、以下で説明するように、命令キャッシュ１１０の命令が命令キュー１０９に入れられ、発行ポート１０８を介して発行され、関連したレジスタ１０６Ａ／１０６Ｂを使用して機能ユニット１０２〜１０５を介して実行される。
【００１４】
プロセッサ１０１は、２つの分岐／比較ユニット１０２Ａ／１０２Ｂと、２つの整数ユニット１０３Ａ／１０３Ｂと、２つのロード／記憶ユニット１０４Ａ／１０４Ｂと、２つの浮動小数点ユニット１０５Ａ／１０５Ｂとを含む。これらの機能ユニットのそれぞれは、対応するレジスタ又はレジスタセットを有する。このレジスタ又はレジスタセットは、パーティション１０６Ａ及び１０６Ｂによって示されるように、対応するが別々である２つの部分に区画される。レジスタ１０６Ａ／１０６Ｂの２つのグループは、「レジスタファイル」１０７と総称される。本システムは、並列な分岐／比較ユニット１０２Ｂがなくても機能することができるが、本明細書に示す例は、２つの比較ユニット１０２Ａ／Ｂがプロセッサ１０１上で利用可能であることを前提とする。区画されたレジスタを使用することによって、レジスタファイル１０７のエラー又はレジスタファイルへの経路若しくはレジスタファイルからの経路のエラーの検出及び修復が可能になる。本システムは、異なるレジスタ名を冗長な命令（たとえば、ロード、記憶、比較）に符号化して、これらの区画されたレジスタを利用することを含む。
【００１５】
［時間的複製（temporal replication）］
プロセッサに影響を与えるソフトエラーは、主として、物理現象（たとえば、アルファ粒子及び宇宙線）の結果である。これらの物理現象は、ランダムに発生するように観測されるが、或る平均発生率を有し、システムが誤って振る舞う事象継続時間の確率分布又はシステムの状態が変更されている事象継続時間の確率分布を有する。さらに、この混乱は、一般に、ＶＬＳＩチップ上の単一のアクティブデバイス又は一群の物理的に隣接したデバイスに限定される。これらの事象の発生間の平均時間は、混乱の最大継続時間よりもはるかに大きいという観測がなされる可能性がある。さらに、同じ回路が、第１の事象の影響が終了した後に第２の事象によって同様に混乱を受ける確率も極めて小さい。その結果、２つの独立した同一の連続したエラーが、同じ計算ユニットにおいて、ほぼ同時に発生する確率は無視することができる。したがって、時間的複製の技法を使用すると、計算がソフトエラーによって大幅に混乱していなかったことを検証するのに使用できる複数の計算領域を作り出すことができる。
【００１６】
事象継続時間の確率分布から、最大混乱期間Ｄｍａｘを特定することができる。この最大混乱期間Ｄｍａｘの特定は、Ｄｍａｘよりも長い継続時間を考慮する必要がないほど、事象継続時間がＤｍａｘよりも長くなる確率が十分小さくなるように行われる。宇宙線、アルファ粒子、及び他のランダムに発生する混乱現象に起因する混乱事象の平均最大継続時間は、Ｄｍａｘの値が或る事前に決定可能なプロセッサクロックサイクル数又は他の所定の期間と等しくなることを必要とする。これらの混乱事象の継続時間は、半導体プロセスの特性及びプロセッサチップ上のデバイスの設計の特性と共に、粒子のタイプ及びエネルギーの関数である。したがって、Ｄｍａｘの実際の値は、あらゆる現実のプロセッサ設計に対して決定することができる。特定のプロセッサのＤｍａｘに適用可能な値は、設計プロセスの一部として、ソフトエラーの原因の詳細なシミュレーションによって決定することもできるし、プロセッサを構成する実際のデバイスの集団を測定することによって決定することもできるし、高速エラーレート測定技法（accelerated error rate measurement technique）を通じて決定することもできる。たとえば、約１ギガヘルツのクロック周波数を有するプロセッサの場合、Ｄｍａｘは、数個のＣＰＵクロックサイクルの値を有することができる。
【００１７】
図２は、時間的複製障害検出システム２００の例示のコンポーネント及びプロセスフローを示す図である。図２に示すように、対象となるプログラムのソースコード２０１は、モデルに基づいてコンパイラ２０２により計算セクション２０７に分割される。このモデルでは、各セグメントは、一組の入力を取り込み、その入力値に対して計算を実行し、その後の計算に対する一組の出力を公開する。各計算セクション２０７はコンパイラ２０２によって処理され、その結果生成されたコード２０３はオプティマイザ２０５に渡される。オプティマイザ２０５は、特定のプロセッサの利用可能な資源を最良に利用するように、オペレーションの実行をスケジューリングする。
【００１８】
本方法は、コード生成段階前に、通常のコンパイラにおいて大幅な変更を実施することを必要としない。１つのあり得る変更には、エラーチェックをオン又はオフにするコンパイラフラグの処理が含まれる。（ソースコード構文解析段階に続く）コード生成段階では、コンパイラ２０２は、プログラムセマンティクスの中間コード化されたもの（intermediate encoding）を読み出し、標準的なオペレーションを実行する。この標準的なオペレーションは、識別子及び一時変数にアドレスを割り当てる等、対象コンピュータ上の空間及び資源を割り当てることを含む。コンパイラ２０２は、通常のコンパイラによって実行されるこれらのオペレーションに加えて、一時的な値を保持する資源（レジスタ等）の割り当て及び再割り当てを行うオペレーションのコードも生成する。
【００１９】
コンパイラ２０２のコード生成段階は、エラーハンドリングコード２０４を生成するように変更される。このエラーハンドリングコード２０４は、実行されると、プログラムの各セグメントの正しいオペレーションを検証する。プロセッサ１０１の資源は、冗長なチェック計算が、初期計算を実行する領域とは異なる計算領域でそれぞれ実行されるように使用される。コンパイラ２０２によって生成されたエラーハンドリングコード２０４は、さらに、エラー封じ込めに適した動作が行われるように構成され、代替的な一実施の形態では、エラーの検出時に回復動作が開始されるように構成される。
【００２０】
本プロセッサでは、通常、これらのプロセッサの設計に複数の実行ユニットが組み込まれて、プロセッサの性能が改善される。複数の、すなわち冗長な実行ユニットは、通常、ＨＰＰＡ（「Hewlett-Packard Precision Architecture（ヒューレットパッカード精密アーキテクチャ）」）やＳＰＡＲＣ等の複数命令同時発行アーキテクチャ（multiple issue architecture）に存在するし、また、ＥＰＩＣ  ＩＰＦ（「Explicitly Parallel Instruction Computer Itanium Processor Family（明示的並列命令コンピュータＩｔａｎｉｕｍプロセッサファミリ）」）等のＶＬＩＷアーキテクチャにも存在する。Ｉ／Ｏオペレーション及びメモリオペレーションに伴うシリアル化により、実行ユニットが十分に利用されないことが頻繁に発生する。その結果、多くの場合、プログラム実行時間に大きな影響を与えることなく、冗長なチェック計算の実行をスケジューリングすることができる。これらの資源のスケジューリングの制御は、通常、複数命令同時発行アーキテクチャには設けられず、いくつかのＶＬＩＷ設計の場合には明白でない場合がある。したがって、資源スケジューリングは、オプティマイザ２０５によって行われる。オプティマイザ２０５は、機能ユニット、タイミング、待ち時間等のプロセッサの利用可能な資源を最良に利用するように、コードを並べ替え、オペレーションの実行をスケジューリングする。
【００２１】
本時間的複製方法では、コンパイルされたソースコードの特定のセクション２０７の１次コピー２１０（以下、１次「コードセグメント」と呼ぶ）の実行と２次コピー２１５（以下、２次「コードセグメント」と呼ぶ）の実行との間で経過するクロックサイクル数が最少（すなわち、時間量が最少）となるように、オプティマイザ２０５は、冗長なコードセグメント２１０／２１５の実行をスケジューリングする。１次／２次の対のコードセグメント２１０／２１５による同じハードウェア資源２０６の利用の間の時間が、或るデルタ、たとえばＤｍａｘよりも大きい限り、これらのセグメントの実行順序は重要ではない。プログラムが一定のプロセッサ上で実行されるようにコンパイルされている時に、Ｄｍａｘが判明しているとすると、本システム２００のコンパイラ２０２は、冗長な計算及びチェックを実行する各コードセグメント２１５が、初期計算／チェックを実行するコードセグメント２１０から独立して、少なくともＤｍａｘのプロセッササイクルで確実に実行されるようにする。オプティマイザ２０５は、２つのコードセグメント２１０／２１５の間に、ノーオペレーション（「Ｎｏｐ」）を挿入するか、又は、他のオペレーションをスケジューリングして、適切な実行時間間隔を確保することができる。代替的に、以下で詳述するように、１つ又は複数の時間ダイバーシティタイマ（temporal diversity timer）２０８を使用して、第１のコードセクションが実行される前に十分な時間が経過することを確保することができる。
【００２２】
代替的な一実施の形態では、Ｄｍａｘに対応する時間の長さを組み込むためのメカニズムが、プロセッサ１０１上で実行されるプログラムがインターロゲートできる方法で設けられる。たとえば、これらのプログラム（コンパイラ２０２以外）は、Ｄｍａｘの値を使用して、冗長なスレッドの実行をタイムスキューし、それに応じて、Ｄｍａｘにほぼ等しい待ち時間量を考慮に入れることができる。
【００２３】
以下の表１に示すコンパイルされたコードは、オペレーションＡ＋Ｂ＝Ｃをプロセッサ１０１等の例示のＶＬＩＷプロセッサ上でどのように実行できるかを示す一例である。表１に示す例では、このＶＬＩＷプロセッサは、そのプロセッサの命令語に、１サイクルあたり５つのオペレーションを許可している。１つの分岐／比較ユニットのみが示されている。プロセッサがストールしてオペランドを待機していない限り、表１の各行に示される命令は、クロックサイクルごとに発行される。以下の例において、「ＢＲＵｎｉｔ」は分岐／比較ユニット（１０２Ａ／１０２Ｂ）であり、「ＡＬＵ／ｃｍｐＵ」は整数ユニット（１０３Ａ／１０３Ｂ）であり、「Ｌｏａｄ／ｓｔｏｒｅＵ」はロード／記憶ユニット（１０４Ａ／１０４Ｂ）であり、Ｒ１〜Ｒ３はレジスタ（１０６Ａ／１０６Ｂ）である。上記に示したＶＬＩＷプロセッサの特徴は、以下に述べるその後のすべての例にも適用可能である。
【００２４】
【表１】
2006252548.tif 000003
【００２５】
上記プロセッサは並列実行可能であるが、上記に示すコンパイルされたコードには、まだいくつかのＮｏｐが存在する。コンパイラ２０２は、１サイクルあたりより多くのオペレーションをスケジューリングすること及び待ち時間を短縮することによって性能を向上させるために、利用可能なスロットに命令をスケジューリングするコード、プリフェッチを発行するコード等を含むことができる。
【００２６】
以下の表２に示す、コンパイルされ且つ最適化されたコードは、表１に示すＡ＋Ｂ＝Ｃのオペレーションを実行する本時間的複製方法の一例である。表２に示すように、レジスタＲ１及びＲ２に値Ａ及びＢをそれぞれロードするオペレーションは、最初にクロックサイクル１で実行され、その後、クロックサイクル４で同じレジスタを使用して繰り返される。最初の加算オペレーションの結果は、サイクル２でレジスタＲ３に保存され、ステップ２２０において、検証コード２０４により、第２の加算オペレーションの結果（サイクル５でレジスタＲ４に記憶される）と比較される。レジスタＲ３及びＲ４に記憶された値が等しくない場合、エラーハンドリングルーチン２３０への分岐が行われる。そうでない場合、処理は、ステップ２２５における次のコードセクションに続く。これら２つのオペレーションの結果が「公開」される前、又は、当該結果を使用してプログラムのその後の実行フローが変更される前に、当該２つのオペレーションの結果のチェックが行われるように、コンパイラ２０２はプログラムをセクション２０７に分割する。
【００２７】
結果の公開は、Ｉ／Ｏデバイスに当該結果を書き込むことによって行うこともできるし、或いは、条件分岐の実行時に別のプロセス又はプロセッサが見ることができるメモリ領域に当該結果を書き込むことによって行うこともできる。この条件分岐は、プログラムの制御フローを変更することもあるし、変更しないこともあるものである。エラー回復が実施される場合、チェックが成功して完了するまで、セグメントはその入力を破棄しないという制約が、コードセクション２０７に対して追加される。
【００２８】
オプティマイザ２０５によって、他のプログラム命令文を実行するための、隣接した計算セクションからのコードは、表２に示すようなセグメントの実行／チェックコードに重なることが可能になる。ただし、これは、各命令文の時間的冗長性が個別に維持され、且つ、結果がプログラムの順序で公開されるように順序付けが維持されているという条件の下で、各命令文のチェックシーケンスの実行が成功した後にのみ可能になる。
【００２９】
エラーハンドリングルーチン２３０は、エラーのあるオペレーションを所定の回数、再試行することもできるし、或いは、オペレーションを再試行する代わりに、障害を引き起こすか又は他の動作を取ることもできる。
【００３０】
表２に示す例では、Ｎｏｐが、コンパイラ２０２によってクロックサイクル３に挿入されている。コンパイルされたコードセクションの１次コピー２１０の実行と２次コピー２１５の実行との間に置かれるクロックサイクル数は、上述したように、特定のプロセッサのＤｍａｘの値の関数である。表２の例において、レジスタＲ１〜Ｒ４は、図１のレジスタファイル１０６Ａ／１０６Ｂのレジスタに対応し、「Ｅｒｒｏｒ」は、エラーハンドリングルーチン２３０のラベルである。表２に示すコードは、３サイクルのＤｍａｘについてコンパイル／最適化されている。すなわち、冗長コードセグメントの実行と実行との間に、３つのクロックサイクルが存在する。たとえば、最初の「Ｌｏａｄ  Ｒ１＝Ａ」オペレーションは、クロックサイクル（１）の期間中に実行されるようにコンパイルされており、この同じオペレーションの冗長な実行は、３サイクル後のクロックサイクル（４）の期間中に実行されるようにコンパイルされている。
【００３１】
【表２】
2006252548.tif 000004
【００３２】
［エラーハンドリング］
本システムは、図２の判定ブロック２２０（及び図３のブロック３２０）によって示されるように、１つ又は複数のチェックを実行し、２つの独立した計算領域（すなわち、時間領域又は空間領域）でコードセクションについて実行された計算結果が、その後の計算にそのコードを公開する前、又は、その結果を使用して分岐オペレーションを指令する前に、同一であることを確実にする。これは、オプティマイザ２０５による最適化の機会を提供するために、分岐が実際に行われる前及び後の双方で行うことができる。
【００３３】
不一致が冗長な計算間に検出された場合、プログラムは、エラーハンドリングコード２３０に分岐する。回復は、エラーの表示及びプログラム実行の終了（「フェイルファスト」）と同程度に単純なものであってもよい。この技法は、他の回復のレベルがシステムによって提供される場合にも適合することができる。或いは、プログラムをその開始から再起動することもできる。ただし、この手順は、いくつかの種類の対話型アプリケーションには受け入れられない場合がある。
【００３４】
より包括的な回復手順では、最後のプログラムセグメントが再実行される。すべての計算がチェックされるまで、計算された値は公開されないので、エラーのある結果を生成するプログラムステージ、すなわちセグメントをその開始から安全に再実行して、エラーからの回復を行うことができる。代替的な一実施の形態では、エラー回復オペレーションが進行中であることを示すフラグがセットされる。このフラグは、その計算ステージが成功して完了すると、クリアされる。このプログラムステージの実行を試みる際に、第２のエラーが発生すると、ハードエラーが発生したという表示が与えられる。
【００３５】
さらに別の代替的なエラーハンドリング技法は、結果が、異なる領域で３回以上計算されるようにプログラムを構成することを含む。この場合、プログラムコードは、過半数の計算領域によって配信された計算結果がそのコードの特定のセグメントの実行結果として公開されるように構成される。この保護レベルを必要とするコードにおいてのみ、これらの方法のいずれかを選択的に使用できることに留意されたい。
【００３６】
［空間的複製（spatial replication）］
図３は、空間的複製障害検出システム３００の例示のコンポーネント及びプロセスフローを示す図である。この空間的複製方法では、特定のプログラムのコードを２回以上実行することができ、各実行パスでは、機能ユニット及びレジスタを含む別々のプロセッサ資源が使用される。
【００３７】
図３に示すように、対象となるプログラムのソースコード２０１は、最初に、コンパイラ２０２によりモデルに基づいて計算セクション２０７に分割される。このモデルでは、各セグメントが一組の入力を取り込み、その入力値に対して計算を実行し、その後の計算に対する一組の出力を公開する。次に、各計算セクション２０７は、コンパイラ２０２によってコンパイルされ、１次コンパイル済みコードセグメント３０３、２次コンパイル済みコードセグメント３０５、及び検証コード３０４が生成される。これらは、オプティマイザ２０５に入力される。
【００３８】
次に、オプティマイザ２０５は、コードセグメント３０３及び３０５に対応するコードの１次セグメント（コピー）３０６及び２次セグメント（コピー）３０７を生成し、これらの１次セグメント及び２次セグメントが、異なるレジスタ及び機能ユニット２０６（１）／２０６（２）（並びにプログラムによって利用される他のあらゆる実行資源）をそれぞれ使用して、確実に実行されるようにする。検証コード３０４の最適化されたコピー３０８も、オプティマイザ２０５によって生成される。オプティマイザ２０５は、次の場合に限り、セグメント３０６／３０７のオペレーションを並べ替えることができる。すなわち、オプティマイザ２０５が、セグメント対に関して１次オペレーション又は２次オペレーションを削除しない限り、又は、それらオペレーションを同じ資源上で実行するようにしない限り、若しくは、結果が同一であることをチェックコードが検証するまで結果を公開しない限り、オペレーションを並べ替えることができる。時間的複製の場合のように、コンパイラは、チェックがあらゆる結果の公開前又は制御の転送前に実行されるように、コードをセクションに分割する。
【００３９】
代替的な一実施の形態では、タグ等の「ヒント」が提供されて、それによって、計算領域を他の計算領域に使用される資源と交わらない一組の実行資源及びデータ資源に関連付けることが可能にされる。異なる計算領域の実行が重なり合うことを許容することができる。コンパイラ２０２は、プログラム実行の各ステージ（計算セクション）の実行用の第１のコードセグメントを、冗長計算及び結果のチェック用の第２のコードセグメントと共に生成して、各セグメントに異なる計算領域を指定する。
【００４０】
たとえば、プログラムの実行ステージにおいて、ｓ＝ｓｉｎ（ａ）の割り当てが必要な場合、コンパイラ２０２は、以下のようなコードを生成することができる。
ｔｓ＝ｓｉｎ（ａ）；第１の計算領域
ｒｓ＝ｓｉｎ（ａ）；第２の計算領域
ｉｆ（ｔｓ＜＞ｒｓ）  ｇｏ  ｔｏ  回復ルーチン；
［この時点で、ｓをその後の計算に公開することができる］
ｓ＝ｔｓ；
【００４１】
次に、後続のプログラムステージのコードが生成される。本実施の形態では、一方の計算領域が、第１の組の実行ユニット、たとえば機能ユニット１０２Ａ〜１０５Ａ及びレジスタグループ１０６Ａのレジスタを使用し、他方の計算領域が、第２の組の実行ユニット、たとえば機能ユニット１０２Ｂ〜１０５Ｂ及びレジスタグループ１０６Ｂのレジスタを使用する。
【００４２】
命令の各グループが関連付けられる計算領域を指定する情報で命令のグループにタグを付けることによって、「ヒント」をプロセッサの実行ユニットスケジューリングロジックに与えることができる。また、ヒントがコンパイルされたコードに含まれることによって、オプティマイザ又はハードウェアが、複製されたオペレーションを廃棄しないことを確実にすることができる。
【００４３】
計算結果が公開される前又はその後の計算に使用される前に、冗長な結果のチェックが実行される。コンパイラ２０２によって生成された検証コード３０４が実行され、判定ブロック３１０によって示されるように、１次コードセグメント３０６及び２次コードセグメント３０７の実行結果が比較される。また、このチェックは、現在の計算に使用されている計算領域とは異なる計算領域においても実行することができる。結果が一致しない場合には、上記セクションの時間的複製において、図２に関して説明した回復動作と同様の回復動作を試みることができる。コンパイル２０２は、多くのＶＬＩＷプロセッサの命令セットで利用可能な明示的なスケジューリングを利用して、冗長なコード対が同じ機能ユニットによって実行されないことを確実にすることができる。結果の不一致が検出されると、適切な回復動作が、エラーハンドリングルーチン３２０によって行われる。この回復動作には、再実行、停止、又は、ソフトウェア若しくはオペレーティングシステムハンドラへのトラップが含まれ得る。
【００４４】
以下の表３に示すコンパイルされるコードは、表１に示すＡ＋Ｂ＝Ｃのオペレーションを実行するための本空間的複製方法の一例である。表３に示すように、クロックサイクル１において、レジスタＲ１及びＲ１１に値Ａがロードされ、クロックサイクル２において、レジスタＲ２及びＲ１２に値Ｂがロードされる。レジスタＲ１及びＲ２は、たとえば、レジスタグループ１０６Ａの一部であり、レジスタＲ１１及びＲ１２はレジスタグループ１０６Ｂの一部である。クロックサイクル３の期間中に、レジスタＲ３及びＲ１３が使用されて、レジスタＲ１／Ｒ２の内容とＲ１１／Ｒ１２の内容とがそれぞれ合計される。
【００４５】
次に、記憶された値「Ｃ」がレジスタＲ４にロードされ、次いで、クロックサイクル４（図３のステップ３１０）において、第１の加算オペレーションの結果が、コピー３０４／３０８の検証によって、第２の加算オペレーションの結果と比較される。レジスタＲ３及びＲ１３に記憶された値が等しくない場合には、サイクル５において、エラーハンドリングルーチン３２０への分岐が行われる。クロックサイクル６の期間中に、レジスタＲ１３に記憶された合計値は、プロセッサメモリに「Ｃ」として記憶される。レジスタＲ３及びＲ１３に記憶された値が一致する場合には、クロックサイクル７において、レジスタ３及び４に記憶された値が比較される。この際、メモリに記憶されたオペランドの値が再ロードされ、そのフェッチされた値が、記憶されるはずであった値と比較される。これが行われて、レジスタからメモリへの経路のエラー又はメモリコントローラのエラーがないことが確認される。レジスタＲ３及びＲ４に記憶された値が等しくない場合には、サイクル８において、エラーハンドリングルーチン３２０への分岐が行われ、等しい場合には、ステップ３１５において、処理は次のコードセクションに続く。
【００４６】
２つのオペレーションの結果は、「公開」される前又はプログラムのその後の実行フローの変更に使用される前にチェックされる。エラーハンドリングルーチン３２０は、以下の動作の任意の組み合わせを提供することができる。すなわち、エラーのあるオペレーションを所定の回数再試行すること；オペレーションを再試行する代わりに、停止させるか又は他の動作を行うこと；エラー報告を行うこと；及び統計値を収集すること、の任意の組み合わせを提供することができる。
【００４７】
表３の各列の命令は、プロセッサ１０１の特定の機能ユニット、及び、レジスタファイル１０７のグループ１０６Ａ又は１０６Ｂのいずれかの特定のレジスタグループによって実行される。レジスタファイル１０７は、同じレジスタ資源が１次コードセグメント３０６及び２次コードセグメント３０７によって使用されないように区画される。
【００４８】
【表３】
2006252548.tif 000005
【００４９】
オプティマイザ２０５は、上記に示したコードのＮｏｐの箇所のいくつかに、後続のオペレーションをスケジューリングできることに留意されたい。表３の例に示すように、複製されたコードが、異なる結果レジスタを使用することによって、機能ユニット、レジスタ、又はそれらの間のパスにエラーが存在するかどうかの判断が、結果の比較により可能になる。同じことは、オペレーションの比較にも同様に当てはまる。
【００５０】
代替的な一実施の形態では、分岐のターゲットアドレス又はラベル（又は制御オペレーションの他の変更）がレジスタにロードされ、その結果、レジスタに記憶された値を、分岐が行われたラベルに関連付けられたアドレスのリテラル値と比較することにより、制御の変更が正しく実行されたかどうかについての判断を行うことができる。記憶されて比較された値は、アドレスでなくてもよいが、同一に符号化されたラベル又はエントリポイントによって誤った分岐制御が行われる可能性がないように、ラベル又はエントリポイントに十分一意の値である必要がある。
【００５１】
さらに別の代替的な一実施の形態では、プロシージャコール及びシステムコールのパラメータを複製することができる。この複製には、冗長な戻りアドレス又はコマンドコードを渡すことが含まれる。同様に、複製された結果を戻すこともできる。これらの技法は、呼び出されたルーチンへのパラメータ及び呼び出されたルーチンからの結果が正しいことを確実にするのに役立つ。
【００５２】
ホストシステムが、メモリの十分なエラー検出及び訂正、並びに、メモリへのパス及びメモリからのパスの十分なエラー検出及び訂正を有しない場合には、１次コードセグメント３０６及び２次コードセグメント３０７によって表されるような２つの別々のデータ領域を保持することもできる。データは、冗長な領域からフェッチされて比較され、データの忠実性が保証される。
【００５３】
代替的な一実施の形態では、２つの空間的に異なる計算の結果を比較して、エラーハンドリングルーチンに分岐するか又はコードを再実行するのではなく、特定のプログラムのコードを３つ以上の空間領域で実行し、その結果を採決して、どの結果（すなわち、過半数又は一致した結果）を実行するかを決定することもできる。
【００５４】
図４は、図２及び図３に示すシステムのオペレーション中に実行される例示のステップを示すフローチャートである。図４に示すように、ステップ４０５において、プログラムのソースコードは、まず、ステップ４０６で、計算セクションにセグメント化され、次いで、２つの形態のうちの１つでコンパイルされて最適化される。いずれの形態でも、その結果であるコンパイルされたオブジェクトコードは、最初の計算を実行する領域とは異なる計算領域で冗長な計算を実行する。
【００５５】
結果であるコンパイルされたコードが、（図２について上述したように）タイムスキューされた方法で実行される場合には、ステップ４０７において、コンパイラ２０２及びオプティマイザ２０５は、２つの冗長なコードセグメントを生成し、最少のクロックサイクル数が、コンパイルされたソースコードの特定のセクションの１次コピー２１０の実行と２次コピー２１５の実行との間で経過するように、それら２つの冗長なコードセグメントの実行をスケジューリングする。
【００５６】
コンパイルされたコードが、異なるハードウェアエンティティを介して実行される場合には、ステップ４０８において、コンパイラ２０２／オプティマイザ２０５は、特定のコードセクションの本質的に冗長な１次コピー３０６及び２次コピー３０７を生成して、それら１次コピー及び２次コピーが、異なるレジスタ及び機能ユニット２０６（１）／２０６（２）を使用することを保証する。これらの２つのコピー、すなわちコードセグメントが本質的に冗長であると言われる理由は次の通りである。すなわち、これらの２つのセグメントは、機能的に同一であり、同じ計算（複数可）を実行するが、各セグメントの実行では、異なるレジスタ及び機能ユニットが使用されるので、厳密には同一でないからである。（ステップ４０７及び４０８で説明した）上記の場合のいずれにおいても、本明細書で説明したように、オプティマイザ２０５の追加された機能を実行するようにコンパイラ２０２を構成できることに留意すべきである。
【００５７】
対応するコードセクションのコンパイル中、ステップ４１０において、検証コードがコンパイラ２０２によって生成される。ステップ４２０において、コンパイルされたコードセクションの冗長な１次セグメント（コピー）及び２次セグメント（コピー）がプロセッサ１０１によって実行される。ステップ４０７で生成された検証コードは、ステップ４２５で実行されて、１次セグメント３０６及び２次セグメント３０７の各実行結果が比較される。判定ブロック４３０において、結果に不一致が検出されると、適切なエラーハンドリングルーチン２３０／３２０によって適切な動作が行われる。このエラー回復動作には、再実行（Ｎ１−ステップ４３３）、又は、停止、若しくは、ソフトウェア若しくはオペレーティングシステムハンドラへのトラップ（Ｎ２−ステップ４３２）が含まれ得る。１次セグメント３０６及び２次セグメント３０７の各実行結果が同一である場合には、ステップ４３４において、それらの結果がコミットされ、次のコードセクションの冗長なコピーがステップ４２０で実行される。
【００５８】
代替的な一実施の形態では、コンパイラによって生成された検証コード自体を、検証が複数の計算領域で冗長に実行されるように構成することができる。
【００５９】
上述したオペレーションは、標準的なコンパイラで実施することもできるし、「ジャストインタイム」（ＪＩＴ）コンパイラで行われるような、ネイティブマシンコード又はオブジェクトフォーマットにコードを動的に変換するツールで実施することもできる。別のインプリメンテーション又はツールでは、本方法に従い、静的又は動的なコードの再編成又は最適化を行うソフトウェアを使用して、レガシーコードを冗長な形態に動的に変換することもできるし、既存のコードを徐々に変換することもできる。本システムに準拠した設計は、上記技法のすべて又は一部を使用することができる。すべてにするかそれとも一部にするかは、保護を行いたい量及びコードの性能要件によって決まり、且つ、エラー検出メカニズムが何に組み込まれようとも関連ハードウェアを増強するのに適切なものにされる。
【００６０】
［可変遅延命令］
代替的な一実施の形態では、プロセッサ命令セットは、コンパイラによって実施される可変遅延命令を含む。この可変遅延命令の有効な遅延値は、Ｄｍａｘの特徴付けられた値に基づいている。この実施の形態は、コンパイラによって実施される一対の命令又は命令述語を提供する。この一対の命令又は命令述語の第１のもの（「タイマ始動」命令）は、待機間隔が開始される開始時点を指定し、第２のもの（「タイマチェック」命令又は「待機」命令）は、開始点指定（「タイマ始動」）命令と条件付き待機（「タイマチェック」）命令との間で少なくともＤｍａｘの時間分が経過するまで、後続の命令の実行を遅延させる。Ｄｍａｘに等しい期間がすでに経過している場合には、実行フローは、直ちに次の命令に進む。
【００６１】
タイマ始動命令及びタイマチェック命令は、本明細書で前述したような時間的ダイバーシティの条件を満たすのに十分な時間を確保するためのメカニズムを提供するために共に使用することができる。このメカニズムは、ソフトエラーによって引き起こされたあらゆる影響が、２次計算及び結果の比較／検証を試みる前に終了していることを保証する。簡単な最適化においては、結合された単一の「チェックアンド始動」命令又は述語が、Ｄｍａｘ時間が最後の結合されたチェックアンド始動命令から経過したかどうかを判断し、この条件が満たされるまで、後続の実行を一時停止する。次に、後続の結合された待機命令についての新たな時点の範囲が定められる。この結合された命令、命令対、又は述語対によって、プロセッサ又はシステムのＤｍａｘの値の特徴付けを、コンパイルされたコードから効率的な方法で切り離すことが可能になる。
【００６２】
いくつかのオペレーションは、インターバルタイマ２０８を読み出す等、フォールスアラームを生成する可能性があるために、結果の検証から省くことができる。１次コードセグメント及び２次コードセグメントは、異なる時刻に実行されるので、それらセグメントの実行は、異なる結果を合法的に生み出す場合がある。これに加えて、外因性の事象の動作によって変更されるおそれのある実時間データに対して処理を行うコードもある。このタイプの実時間データを読み出すのに使用される命令も、冗長実行にとって良い候補ではない。しかしながら、これらの命令が、実行されるコードに占める割合は、通常、非常に少量（わずかな割合）であり、それら命令を省いても、本明細書で開示した方法の障害検出の有効性に対する影響はごくわずかである。
【００６３】
図５は、ソフトウェアによって実施される例示の時間的ダイバーシティタイマ２０８の状態図を示している。図５に示すように、ブロック５０１において、システムの初期化時に、時間的ダイバーシティタイマは満了状態にセットされる。ステップ５０２において、「タイマ始動」命令が実行されると、ステップ５０３において、タイマリセット命令が実行され、タイマ２０８は、少なくともＤｍａｘ単位時間の間、ブロック５０４に示す待機状態に遷移する。Ｄｍａｘ単位時間の経過時点（ステップ５０６）で、タイマはブロック５０１の満了状態に入る。
【００６４】
時間的ダイバーシティタイマ２０８が待機状態にある間、ステップ５０５において、「タイマチェック」命令を実行して、タイマが満了したかどうかを判断することができる。「タイマチェック」命令によって、コードセグメントの実行は、タイマ満了時に再開することが可能になる。
【００６５】
図６は、例示の「タイマ始動」命令のオペレーション６００を示す図である。この「タイマ始動」命令の実行は、ステップ６０１において、時間的ダイバーシティタイマ２０８をトリガし、ステップ６０２において、Ｄｍａｘ単位時間の間待機状態に入る。実行は、ステップ６０３において、タイマを待つことなく順に次の命令に進む。
【００６６】
図７は、例示の「タイマチェック」命令のオペレーション７００を示す図である。この例示の「タイマチェック」命令は、ステップ７０１において実行されると、時間的ダイバーシティタイマが満了するまで、後続の命令の実行を一時中止する。ステップ７０２において、時間的ダイバーシティタイマ２０８がすでに満了状態にある場合、コードセグメントの実行は、ステップ７０４において、次の命令に直ちに進む。そうでない場合、命令の実行は、時間的ダイバーシティタイマ２０８が満了するまで、ステップ７０３において一次停止される。
【００６７】
さらに改良することによって、「タイマ始動」命令６００及び「タイマチェック」命令７００は、関係しない計算領域からの計算と重なることを可能にする各計算領域に対応した一意のタグを指定することが可能になる。
【００６８】
図８は、他の命令及び他のタイマ状態に関する「タイマ始動」命令及び「タイマチェック」命令の例示の使用を示す図である。図２について上記で示したように、対象となるプログラムのソースコード２０１は、最初に、好ましくはコンパイラ２０２により、モデルに基づいて複数の計算セクション２０７に分割される。このモデルでは、各セクションは、一組の入力を取り込み、入力値に対して計算を実行し、その後の計算に対する一組の出力を公開する。いくつかの例では、対象となるプログラム全体が計算セクション２０７を構成する場合があり、したがって、複数の計算セクションの残りのものは、実質上、空値のエンティティにされる。コンパイルされるソースコードの特定のセクション２０７の１次コピー２１０及び２次コピー２１５（以下、１次コードセグメント及び２次コードセグメントとそれぞれ呼ぶ）はコンパイラ２０２によって処理され、その結果生成されたコードは、オプションとして、オプティマイザ２０５に渡される。オプティマイザ２０５は、特定のプロセッサの利用可能な資源を最良に利用するように、オペレーションの実行をスケジューリングする。図９〜図１２について以下でさらに提示する例も、同じプロセッサ上で実行されるこれらの１次コードセグメント２１０及び２次コードセグメント２１５を使用して、それらの図に示す各方法を実施する。
【００６９】
図８に示すように、１次コードセグメント２１０の実行は、ブロック８００において開始される。１次セグメントの実行が完了した後、時間的ダイバーシティタイマ２０８が、ブロック８０１において、「タイマ始動」命令の実行によりトリガされる。それによって、Ｄｍａｘの値に等しい待機期間８１０が開始される。２次コードセグメント２１５の後続の命令の実行は、「タイマ始動」命令が実行された時からＤｍａｘ時間が経過するまで、遅延される。２つのセグメントにおける対応する命令が少なくともＤｍａｘに等しい期間によって分離される限り、２次コードセグメントは、１次セグメント全体の実行が完了するのを待機する必要はないことに留意すべきである。コードセグメント２１０／２１５の実行を「重ねる」この方法は、図９について後述する。
【００７０】
通常のシステムキャッシュの影響のため、第２のコードセグメント、すなわち２次コードセグメント２１５は、第１の（１次）コードセグメント２１０よりも高速に実行される傾向がある。実行される第１のコードセグメントは、より高いキャッシュ率を受け取り、ＴＬＢ（変換索引バッファ）が不足し、したがって、実行はより遅くなる。実行される第２のコードセグメントは、第１のコードセグメントが自身のデータを「プリフェッチ」していることから利益を享受し、ストレージの階層による遅延をそれほど受けない。本明細書で説明したメカニズムは、１次コードセグメントの実行と２次コードセグメントの実行との間に安全な間隔を維持するのに役立つ。
【００７１】
例示の一実施の形態では、冗長なコードセグメントが同じ一時的な障害による影響を受けない可能性が十分高い場合に、Ｄｍａｘの値を最適なレベルに設定することができる。実際には、いくつかの一時的な事象は、他の事象よりも長く持続し、その障害の影響がほとんどなくなるまで、セグメントの１つの実行は、障害を受けた機能ユニットを使用できないことがある。特定のＣＰＵアーキテクチャのＤｍａｘの値は、そのＣＰＵのハードウェア特性について調整できるだけでなく、特定の「時間的分離（temporal separation）」（タイマ配置）ストラテジーを考慮して調整することもできる。このストラテジーは、１００パーセントよりも幾分小さなソフトエラー検出率を有する実際のフォールトトレラントソリューションを達成するのに必要とされるが、比較的高速な実行を提供するものである。この実施の形態のタイマ２０８の相対的な時間間隔は、特定の用途に許容可能な、検出されない一時的な（ソフト）エラー率を許容するように調整することができる。
【００７２】
Ｄｍａｘに設定された値は、環境の放射フラックス、システムの高度、及びシステムのシールドの予測された変化を考慮することができ、ローカルに測定されたこれらの変化及びそれ以外の因子に従って動的に変更することができる。
【００７３】
１次コードセグメント２１０及び２次コードセグメント２１５は、任意のサイズとすることができ、たとえば、単一の命令と同程度に小さくすることもできるし、所望なだけ大きくすることもできることに留意されたい。代替的な一実施の形態では、タイマリセット機能及びブロック機能（タイマ満了を待機する）が結合されて、特定のプロセッサによって実行される命令のそれぞれに含められる。したがって、この技法は、実質上、１つの命令（１次コードセグメント及び２次コードセグメント）対あたり１つのタイマを使用する。
【００７４】
待機期間８１０の間、ブロック８０２に示すように、他の命令（対象となるコードセグメントの一部ではない）をオプションとして実行することができ、ブロック８０３に示すように、「タイマチェック」命令を使用して時間的ダイバーシティタイマ２０８がチェックされて、待機期間が満了したかどうかが判断される。
【００７５】
矢印８１１によって示される時点において、時間的ダイバーシティタイマが始動してからＤｍａｘに等しい期間が経過し、したがって、タイマは満了する。次に、ブロック８０４の展開図に示すように、ブロック８００で開始された１次セグメントに対応する２次コードセグメント２１５（サブブロック８０４Ａ）の実行、並びに、検証コード（サブブロック８０４Ｂ）及び次の１次コードセグメント（サブブロック８０４Ｃ）の実行を行うことができる。次の１次コードセグメントの実行前に、ブロック８０５において、時間的ダイバーシティタイマ２０８が、「タイマ始動」命令の実行によって再び始動され、したがって、待機期間８１２が開始される。この待機期間８１２は、この場合も、Ｄｍａｘの値に等しい。待機期間８１２の間、ブロック８０６に示すように、時間的ダイバーシティタイマ２０８が、「タイマチェック」命令を介してチェックされて、待機期間が満了したかどうかが判断される。対象となる本コードセグメントの一部ではない命令は、待機期間８１２の間に実行できることに留意されたい。
【００７６】
矢印８１３によって示される時点において、時間的ダイバーシティタイマ２０８が最後に始動されてからＤｍａｘ時間が経過し、タイマは満了する。タイマ２０８が満了したことを「タイマチェック」命令が検出すると、次の２次コードセグメントの実行がブロック８０７において開始される。
【００７７】
［マルチスレッド化されたコードセグメントの実行］
代替的な一実施の形態では、１次コードセグメント及び２次コードセグメントが別々のＣＰＵ又はＯ／Ｓ（オペレーティングシステム）のスレッドで実行される。これらのスレッドは、同じアドレス空間及び時間的ダイバーシティタイマ（複数可）２０８を共有する。本実施の形態では、１次コードセグメント２１０は或るスレッドで実行され、２次セグメント及び検証コードは別のスレッドで実行される。図９について後述するが、この方法によって、スレッドは、別々のレジスタセットを使用して計算を実行することが可能になるが、検証コードしか、メモリに対する変更をコミットすることができない。代替的な一実施の形態では、検証コードを第３のスレッドで実行することができる。
【００７８】
図９は、同じコードセクションの２つのコードセグメント、すなわちスレッドの使用を示す例示の図である。ここでは、使用されるプロセッサセットが、命令の重なった実行を、たとえばハードウェアマルチスレッドを介して可能にするか、又は、単にマルチスレッド化されたＯ／Ｓを使用することによって、２つのコードセグメントの重なった実行が可能にされる。図９の実施の形態では、必ずしも、１次コードスレッド全体の実行が完了するのを待ってから、２次コードスレッドの実行が開始されるわけではない。図９に示す方法は、２次コードスレッドの実行が、通常は、１次コードスレッドの実行に追いつかないものと仮定する。
【００７９】
図９に示す実施の形態では、時間的ダイバーシティタイマ２０８が、１次コードスレッドの最初の命令の実行直後に始動され、このタイマは、始動された直後にチェックされ、２次コードスレッドのコードの実行が、タイマの満了が起こるまで遅延される。２次コードは、必ずしも１次コードと正確に同じハードウェアデバイス上で実行されていないので、図９に示す方法は、実質的には、幾分ハイブリッドな時間／空間方式である。
【００８０】
図９に示すように、１次コードセグメント、すなわちスレッド２１０の最初の命令の実行は、ブロック９０１において、スレッドＡで開始される。その後、ブロック９０２における「タイマ始動」命令の実行が続く。それによって、時間的ダイバーシティタイマ２０８が始動され、１次スレッドの残りのコードについて、Ｄｍａｘの値に等しい待機期間が開始される。
【００８１】
タイマが始動された直後、ブロック９０３（時刻ｔ＝１に示す）において、第２のスレッドであるスレッドＢが開始される。次に、ブロック９０５において、時間的ダイバーシティタイマ２０８がスレッドＢでチェックされ、タイマがタイムアウトするまで、２次コードの実行開始が遅延される。本実施の形態では、２次コードスレッドは、１次スレッド全体の実行が完了するのを待機する必要はない。１次スレッド及び２次スレッドにおける対応する命令が、少なくともＤｍａｘに等しい期間によって分離されている限り、時間的ダイバーシティタイマが満了するとすぐに２次コードスレッドを実行することができる。
【００８２】
スレッドＡでは、ブロック９０４において、１次スレッドの残りの命令が、ブロック９０６における２次コードスレッドの実行と準同時に実行される。この２次コードスレッドは、タイマ２０８がタイムアウトした時に開始される。スレッドＢでは、１次コードスレッドの実行が２次コードスレッドの実行終了時刻よりも前に完了したものと仮定して、検証コードがブロック９０７において実行される。スレッドＢは、オプションとして、スレッドＡによりセットされたスレッド完了フラグをチェックすることにより、１次コードスレッドが実行を完了したかどうかを判断することができる。
【００８３】
［複数のタイマの使用］
図１０〜図１２は、複数の指名されたタイマ２０８が使用されてプログラムセグメント２１０／２１５の重なった実行を可能にする例示の一実施の形態における複数のプログラムセグメントの実行を示す図である。２つの異なるコードセグメントの命令の実行に重なりがないものが、図１０〜図１２に示されているが、たとえば、マルチプロセシング又はマルチスレッドが使用される場合に、一定のプロセッサセットはプログラムコードの複数のセグメントの同時実行を可能にすることができることに留意すべきである。図１０〜図１２に示す方法では、複数の指名されたタイマ（たとえば、各タイマはタグを使用して、対応する計算領域を指定する）２０８が設けられる。これらのタイマ２０８の始動及び待機は、独立に行うことができる。たとえば、以下の命令対等のように、指名されたタイマの始動及び待機を行うための別々の命令が実施される。
ｓｔａｒｔｔｉｍｅｒ＜ｔｉｍｅｒ＿ｎａｍｅ＞
ｗａｉｔｆｏｒｔｉｍｅｒ＜ｔｉｍｅ＿ｎａｍｅ＞
【００８４】
代替的に、たとえば、以下のように、上記機能の双方を実行する、結合された命令が提供される。
ｗａｉｔｆｏｒａｎｄｓｔａｒｔ＜ｗａｉｔｆｏｒｔｉｍｅｒｎａｍｅ＞，＜ｓｔａｒｔｔｉｍｅｒｎａｍｅ＞
【００８５】
複数のタイマを提供することによって、時間的ダイバーシティをコードセグメントごとに維持することを可能にしつつ、異なるプログラムセグメントが重なることが可能になる。したがって、より効率的な命令の実行が可能になる。設けられるタイマの個数は、重なる可能性のある時間的領域又は計算プログラムのセクションの個数の関数である。いずれの場合にも、タイマ２０８及び対応する「タイマチェック」命令を使用することによって、指定されたタイマが始動してから十分な時間が経過し、時間的ダイバーシティの要件が維持されることが確実に行われる。
【００８６】
本実施の形態では、遅延命令によって消費される実際のクロックサイクル数は、プログラム可能にされるか、又は、ファームウェア若しくはオペレーティングシステムによって調整可能にされる。これによって、プロセッサのＤｍａｘ値の特徴付けをプロセッサの設計から切り離すことが可能になる。また、これによって、このような特徴付けは、プロセッサの設計、開発、及び製造と時間的に重複するか、又は、時間的にこれらの後に続いて行うことが可能になり、それによって、製造プロセスの変化に対応することが可能になり、且つ、プロセッサの集団の長期の観察に基づくＤｍａｘの特徴付けの改良にも対応することが可能になる。Ｄｍａｘの値は、特定のプロセッサ又はシステムに対応する物理パラメータの関数として計算することもできるし、物理環境、たとえば、高度又は測定された背景放射の関数に基づいて計算することもできる。
【００８７】
これに加えて、本実施の形態の上述した命令タイプのそれぞれは、本明細書で説明した時間的ダイバーシティ技法の全オペレーションが必要とされる場合にのみ遅延が課されるような形態にすることもできる。
【００８８】
図１０は、例示の一組のステップを示す図である。ここでは、複数の時間的ダイバーシティタイマ２０８が使用されて、プログラムセグメント２１０／２１５の重なった実行が可能になる。図１０に示す実施の形態では、時間的ダイバーシティタイマ２０８は、１次コードの各セグメント２１０が実行される前に始動される。複数のタイマを使用することによって、図１０に示すように、１次コードセグメントの実行と２次コードセグメントの実行との間のより良好な時間的分離が可能になる。図１０では、特定の計算セクション２０７の１次コードセグメント２１０の実行と、同じセクション２０７の２次（冗長）コードセグメント２１５の実行との間の時間的ダイバーシティを維持しつつ、プログラムコードの３つの分離した計算セクション２０７が実行される。各タイマ２０８は、レジスタ、又は、当該技術分野において既知の他の方法を介して実施することができる。代替的な一実施の形態では、システムハードウェアは、実行される命令ごとにタイマを自動的にセットすることができる。すなわち、タイマ２０８は、実質的に各命令に統合される。図１０の例では、タイマ１及びタイマ２の２つのタイマ２０８が使用され、図１０の例は、第１のタイマ（タイマ１）の再利用を示している。
【００８９】
図１０に示すように、ブロック１００１において、指名された「タイマ始動」命令（たとえば、「ｓｔａｒｔｔｉｍｅｒ  タイマ１」）を実行することにより、タイマ１が始動される。それによって、計算セクションＡのコードについて、時間的ダイバーシティタイマ２０８が始動され、Ｄｍａｘの値に等しい待機期間が開始される。次に、計算セクションＡの１次コードセグメントが、ブロック１００２の期間中に実行される。計算セクションＡの１次コードセグメントの実行の完了後、次に、指名された第２のタイマであるタイマ２が、ブロック１００３において始動され、コード計算セクションＢの１次コードセグメントが、ブロック１００４の期間中に実行される。ブロック１００５において、「タイマチェック」命令（たとえば、「ｗａｉｔｆｏｒｔｉｍｅｒ  タイマ１」）を使用して、タイマ１がチェックされる。タイマが満了すると、タイマはリセット（再始動）される。タイマ１は、今度は、計算セクションＣに再利用される。
【００９０】
ブロック１００６において、計算セクションＣの実行が開始される。タイマ１は、セクションＡの１次コードセグメントについて満了しているので、ブロック１００７において、セクションＡの２次コードセグメントが実行される。その後、計算セクションＡの検証又はコードのチェックが実行されて、そのセクションの１次コードセグメントの実行中にソフトエラーが発生したかどうかが判断される。
【００９１】
ブロック１００８では、タイマ２がチェックされ、タイマが満了すると、タイマはリセットされる。その後、計算セクションＢの１次コードセグメントが、ブロック１００９の期間中に実行される。ブロック１０１０において、タイマ１が満了した後、ブロック１０１１において、計算セクションＣの２次コードセグメントが実行され、その後、そのセグメントの検証コードの実行が続く。以下の表４は、図１０について上述したプロセスに対応する命令シーケンスを示している。
【００９２】
【表４】
2006252548.tif 000006
【００９３】
図１１は、時間的ダイバーシティタイマ２０８が１次コードセグメントの実行と２次コードセグメントの実行との間に配置されて、１次実行ストリームと２次実行ストリームとの間のより良好な分離が得られる例示の一組のステップを示す図である。図１１に示すように、ブロック１１０１において、計算セクションＡの１次コードセグメントが実行される。次に、ブロック１１０２において、タイマ１が始動される。次に、ブロック１１０３において、計算セクションＢの１次コードセグメントが実行され、その後、ブロック１１０４において、タイマ２が始動される。
【００９４】
ブロック１１０５において、「タイマチェック」命令を使用して、タイマ１がチェックされる。タイマが満了すると、タイマは再始動される。次に、ブロック１１０６において、計算セクションＡの２次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。次に、ブロック１１０７において、タイマ３が再始動され、ブロック１１０８において、計算セクションＣの１次コードセグメントが実行される。
【００９５】
ブロック１１０９において、タイマ２がチェックされ、タイマが満了すると、タイマは再始動される。次に、ブロック１１１０において、計算セクションＢの２次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。次に、ブロック１１１１において、タイマ３がチェックされ、タイマが満了すると、タイマは再始動される。次に、ブロック１１１２において、計算セクションＣの２次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。以下の表５は、図１１について上述したプロセスに対応する命令シーケンスを示している。
【００９６】
【表５】
2006252548.tif 000007
【００９７】
図１２は、１次コードセグメントと２次コードセグメントとの間に配置された時間的ダイバーシティタイマ２０８が再利用される例示の一組のステップを示す図である。図１２に示すように、ブロック１２０１において、計算セクションＡの１次コードセグメントが実行される。次に、ブロック１２０２において、時間的ダイバーシティタイマ１が始動される。次に、ブロック１２０３において、計算セクションＢの１次コードセグメントが実行され、その後、ブロック１２０４において、時間的ダイバーシティタイマ２が始動される。
【００９８】
ブロック１２０５Ａにおいて、「タイマチェック」命令を使用して、タイマ１がチェックされる。タイマが満了すると、タイマは、ブロック１２０５Ｂにおいて再始動される。図１１について説明した方法とは異なり、タイマ１は、次に、別の計算セクション、すなわち、この例ではセクションＣに再利用される。ブロック１２０６における計算セクションＣの１次コードセグメントの実行後、ブロック１２０７において、計算セクションＡの２次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。図１２に示す方法は、１次コードセグメントの最初の実行と、対応する２次コードセグメントの実行／検証との間に、図１１の方法よりも大きな遅延を課すことに留意されたい。
【００９９】
ブロック１２０８において、タイマ２がチェックされ、タイマが満了すると、タイマは再始動される。次に、ブロック１２０９において、計算セクションＢの２次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。次に、ブロック１２１０において、タイマ１がチェックされ、タイマが満了すると、タイマは再始動される。次に、ブロック１２１１において、計算セクションＣの２次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。以下の表６は、図１２について上述したプロセスに対応する命令シーケンスを示している。
【０１００】
【表６】
2006252548.tif 000008
【０１０１】
本システムの範囲から逸脱することなく、上記方法及び上記システムに一定の変更を行うことができる。上記説明に含まれるか、又は、添付図面に示されるすべての事項は、例示として解釈されるべきであり、限定する意味に解釈されるべきではないことに留意すべきである。たとえば、図１に示すプロセッサを、図１に示すコンポーネント以外のコンポーネントを含むように構成することができ、これらのコンポーネントは、他の構成で配置することができる。図２〜図１２に示す要素及びステップも、上記のように説明したシステムの精神から逸脱することなく、本明細書で説明した方法に従って変更することができ、それらの図に示したステップは、他の構成で配列することができる。
【図面の簡単な説明】
【０１０２】
【図１】例示のＶＬＩＷプロセッサ（従来技術）の一定のコンポーネントを示す図である。
【図２】時間的複製障害検出システムの例示のコンポーネント及びプロセスフローを示す図である。
【図３】空間的複製障害検出システムの例示のコンポーネント及びプロセスフローを示す図である。
【図４】図２及び図３に示すシステムのオペレーション中に実行される例示のステップを示すフローチャートである。
【図５】例示の、ソフトウェアによって実施される時間的ダイバーシティタイマの状態図である。
【図６】例示の「タイマ始動」命令のオペレーションを示す図である。
【図７】例示の「タイマチェック」命令のオペレーションを示す図である。
【図８】他の命令及び他のタイマ状態に関する「タイマ始動」命令及び「タイマチェック」命令の例示の使用を示す図である。
【図９】プロセッサセットが命令の重なった実行を可能にする場合における、同じコードセクションの２つのコードセグメントの使用を示す例示の図である。
【図１０】複数の時間的ダイバーシティタイマが使用されてプログラムセグメントの重なった実行を可能にする例示の一組のステップを示す図である。
【図１１】時間的ダイバーシティタイマが１次コードセグメントの実行と２次コードセグメントの実行との間に配置される例示の一組のステップを示す図である。
【図１２】１次コードセグメントと２次コードセグメントとの間に配置された時間的ダイバーシティタイマが再利用される例示の一組のステップを示す図である。
【符号の説明】
【０１０３】
１０１・・・プロセッサ
１０２・・・分岐／比較ユニット
１０３・・・整数ユニット
１０４・・・ロード／記憶ユニット
１０５・・・浮動小数点ユニット
１０６・・・レジスタ
１０７・・・レジスタファイル
１０８・・・発行ポート
１０９・・・命令キュー
１１０・・・命令キャッシュ
２０１・・・ソースコード
２０２・・・コンパイラ
２０３・・・生成されたコード
２０４・・・検証コード
２０５・・・オプティマイザ
２０６・・・１次ハードウェア
２０７・・・計算セクション
２０８・・・時間的ダイバーシティタイマ
２０６（１）・・・１次ハードウェア
２０６（２）・・・２次ハードウェア
２０７・・・コードセクション
３０３・・・１次コードセグメント
３０４・・・検証コード
３０５・・・２次コードセグメント
３０６・・・１次コピー
３０７・・・２次コピー
３０８・・・検証コピー
【図１】
2006252548.tif 000009
【図２】
2006252548.tif 000010
【図３】
2006252548.tif 000011
【図４】
2006252548.tif 000012
【図５】
2006252548.tif 000013
【図６】
2006252548.tif 000014
【図７】
2006252548.tif 000015
【図８】
2006252548.tif 000016
【図９】
2006252548.tif 000017
【図１０】
2006252548.tif 000018
【図１１】
2006252548.tif 000019
【図１２】
2006252548.tif 000020