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