本明細書では、デジタルプロセッサに関係したエラーを検出するためのソフトウェア技法に関係のあるシステムを説明する。これらのシステムは、既存のコンピュータアーキテクチャと組み合わされた場合に、プロセッサの有効な障害検出カバレッジを提供する。用語「プロセッサ」は、この文書では、中央処理装置(「CPU」)に加えて、他のタイプの機能を提供するデジタルプロセッサを指すためにも使用される。本明細書で説明する障害検出技法は、検出された障害状況からの効率的な回復を提供するのに使用することもできる。例示の実施の形態では、これらの技法は、アプリケーションプログラムのアーキテクチャ、構造、又はソースコードの変更を必要とすることなく使用することができる。
図1は、本システムでの使用に適したIntel Itanium II等の例示のVLIW(Very Long [or Large] Instruction Word;超長命令語)プロセッサ101の関連部分のブロック図である。VLIWは、コンパイラが、複数の基本的な相互依存しないオペレーションを同じ命令語の中に詰め込む命令セットの思想を表す。これらの固定長の語(命令)は、キャッシュ又はメモリからプロセッサにフェッチされると、数個の短い長さの命令に分割される。これらの短い長さの命令は、独立した機能ユニット(「実行ユニット」としても知られている)にディスパッチされ、機能ユニットにおいて並列に実行される。図1に示すプロセッサでは、以下で説明するように、命令キャッシュ110の命令が命令キュー109に入れられ、発行ポート108を介して発行され、関連したレジスタ106A/106Bを使用して機能ユニット102〜105を介して実行される。
プロセッサ101は、2つの分岐/比較ユニット102A/102Bと、2つの整数ユニット103A/103Bと、2つのロード/記憶ユニット104A/104Bと、2つの浮動小数点ユニット105A/105Bとを含む。これらの機能ユニットのそれぞれは、対応するレジスタ又はレジスタセットを有する。このレジスタ又はレジスタセットは、パーティション106A及び106Bによって示されるように、対応するが別々である2つの部分に区画される。レジスタ106A/106Bの2つのグループは、「レジスタファイル」107と総称される。本システムは、並列な分岐/比較ユニット102Bがなくても機能することができるが、本明細書に示す例は、2つの比較ユニット102A/Bがプロセッサ101上で利用可能であることを前提とする。区画されたレジスタを使用することによって、レジスタファイル107のエラー又はレジスタファイルへの経路若しくはレジスタファイルからの経路のエラーの検出及び修復が可能になる。本システムは、異なるレジスタ名を冗長な命令(たとえば、ロード、記憶、比較)に符号化して、これらの区画されたレジスタを利用することを含む。
[時間的複製(temporal replication)]
プロセッサに影響を与えるソフトエラーは、主として、物理現象(たとえば、アルファ粒子及び宇宙線)の結果である。これらの物理現象は、ランダムに発生するように観測されるが、或る平均発生率を有し、システムが誤って振る舞う事象継続時間の確率分布又はシステムの状態が変更されている事象継続時間の確率分布を有する。さらに、この混乱は、一般に、VLSIチップ上の単一のアクティブデバイス又は一群の物理的に隣接したデバイスに限定される。これらの事象の発生間の平均時間は、混乱の最大継続時間よりもはるかに大きいという観測がなされる可能性がある。さらに、同じ回路が、第1の事象の影響が終了した後に第2の事象によって同様に混乱を受ける確率も極めて小さい。その結果、2つの独立した同一の連続したエラーが、同じ計算ユニットにおいて、ほぼ同時に発生する確率は無視することができる。したがって、時間的複製の技法を使用すると、計算がソフトエラーによって大幅に混乱していなかったことを検証するのに使用できる複数の計算領域を作り出すことができる。
事象継続時間の確率分布から、最大混乱期間Dmaxを特定することができる。この最大混乱期間Dmaxの特定は、Dmaxよりも長い継続時間を考慮する必要がないほど、事象継続時間がDmaxよりも長くなる確率が十分小さくなるように行われる。宇宙線、アルファ粒子、及び他のランダムに発生する混乱現象に起因する混乱事象の平均最大継続時間は、Dmaxの値が或る事前に決定可能なプロセッサクロックサイクル数又は他の所定の期間と等しくなることを必要とする。これらの混乱事象の継続時間は、半導体プロセスの特性及びプロセッサチップ上のデバイスの設計の特性と共に、粒子のタイプ及びエネルギーの関数である。したがって、Dmaxの実際の値は、あらゆる現実のプロセッサ設計に対して決定することができる。特定のプロセッサのDmaxに適用可能な値は、設計プロセスの一部として、ソフトエラーの原因の詳細なシミュレーションによって決定することもできるし、プロセッサを構成する実際のデバイスの集団を測定することによって決定することもできるし、高速エラーレート測定技法(accelerated error rate measurement technique)を通じて決定することもできる。たとえば、約1ギガヘルツのクロック周波数を有するプロセッサの場合、Dmaxは、数個のCPUクロックサイクルの値を有することができる。
図2は、時間的複製障害検出システム200の例示のコンポーネント及びプロセスフローを示す図である。図2に示すように、対象となるプログラムのソースコード201は、モデルに基づいてコンパイラ202により計算セクション207に分割される。このモデルでは、各セグメントは、一組の入力を取り込み、その入力値に対して計算を実行し、その後の計算に対する一組の出力を公開する。各計算セクション207はコンパイラ202によって処理され、その結果生成されたコード203はオプティマイザ205に渡される。オプティマイザ205は、特定のプロセッサの利用可能な資源を最良に利用するように、オペレーションの実行をスケジューリングする。
本方法は、コード生成段階前に、通常のコンパイラにおいて大幅な変更を実施することを必要としない。1つのあり得る変更には、エラーチェックをオン又はオフにするコンパイラフラグの処理が含まれる。(ソースコード構文解析段階に続く)コード生成段階では、コンパイラ202は、プログラムセマンティクスの中間コード化されたもの(intermediate encoding)を読み出し、標準的なオペレーションを実行する。この標準的なオペレーションは、識別子及び一時変数にアドレスを割り当てる等、対象コンピュータ上の空間及び資源を割り当てることを含む。コンパイラ202は、通常のコンパイラによって実行されるこれらのオペレーションに加えて、一時的な値を保持する資源(レジスタ等)の割り当て及び再割り当てを行うオペレーションのコードも生成する。
コンパイラ202のコード生成段階は、エラーハンドリングコード204を生成するように変更される。このエラーハンドリングコード204は、実行されると、プログラムの各セグメントの正しいオペレーションを検証する。プロセッサ101の資源は、冗長なチェック計算が、初期計算を実行する領域とは異なる計算領域でそれぞれ実行されるように使用される。コンパイラ202によって生成されたエラーハンドリングコード204は、さらに、エラー封じ込めに適した動作が行われるように構成され、代替的な一実施の形態では、エラーの検出時に回復動作が開始されるように構成される。
本プロセッサでは、通常、これらのプロセッサの設計に複数の実行ユニットが組み込まれて、プロセッサの性能が改善される。複数の、すなわち冗長な実行ユニットは、通常、HPPA(「Hewlett-Packard Precision Architecture(ヒューレットパッカード精密アーキテクチャ)」)やSPARC等の複数命令同時発行アーキテクチャ(multiple issue architecture)に存在するし、また、EPIC IPF(「Explicitly Parallel Instruction Computer Itanium Processor Family(明示的並列命令コンピュータItaniumプロセッサファミリ)」)等のVLIWアーキテクチャにも存在する。I/Oオペレーション及びメモリオペレーションに伴うシリアル化により、実行ユニットが十分に利用されないことが頻繁に発生する。その結果、多くの場合、プログラム実行時間に大きな影響を与えることなく、冗長なチェック計算の実行をスケジューリングすることができる。これらの資源のスケジューリングの制御は、通常、複数命令同時発行アーキテクチャには設けられず、いくつかのVLIW設計の場合には明白でない場合がある。したがって、資源スケジューリングは、オプティマイザ205によって行われる。オプティマイザ205は、機能ユニット、タイミング、待ち時間等のプロセッサの利用可能な資源を最良に利用するように、コードを並べ替え、オペレーションの実行をスケジューリングする。
本時間的複製方法では、コンパイルされたソースコードの特定のセクション207の1次コピー210(以下、1次「コードセグメント」と呼ぶ)の実行と2次コピー215(以下、2次「コードセグメント」と呼ぶ)の実行との間で経過するクロックサイクル数が最少(すなわち、時間量が最少)となるように、オプティマイザ205は、冗長なコードセグメント210/215の実行をスケジューリングする。1次/2次の対のコードセグメント210/215による同じハードウェア資源206の利用の間の時間が、或るデルタ、たとえばDmaxよりも大きい限り、これらのセグメントの実行順序は重要ではない。プログラムが一定のプロセッサ上で実行されるようにコンパイルされている時に、Dmaxが判明しているとすると、本システム200のコンパイラ202は、冗長な計算及びチェックを実行する各コードセグメント215が、初期計算/チェックを実行するコードセグメント210から独立して、少なくともDmaxのプロセッササイクルで確実に実行されるようにする。オプティマイザ205は、2つのコードセグメント210/215の間に、ノーオペレーション(「Nop」)を挿入するか、又は、他のオペレーションをスケジューリングして、適切な実行時間間隔を確保することができる。代替的に、以下で詳述するように、1つ又は複数の時間ダイバーシティタイマ(temporal diversity timer)208を使用して、第1のコードセクションが実行される前に十分な時間が経過することを確保することができる。
代替的な一実施の形態では、Dmaxに対応する時間の長さを組み込むためのメカニズムが、プロセッサ101上で実行されるプログラムがインターロゲートできる方法で設けられる。たとえば、これらのプログラム(コンパイラ202以外)は、Dmaxの値を使用して、冗長なスレッドの実行をタイムスキューし、それに応じて、Dmaxにほぼ等しい待ち時間量を考慮に入れることができる。
以下の表1に示すコンパイルされたコードは、オペレーションA+B=Cをプロセッサ101等の例示のVLIWプロセッサ上でどのように実行できるかを示す一例である。表1に示す例では、このVLIWプロセッサは、そのプロセッサの命令語に、1サイクルあたり5つのオペレーションを許可している。1つの分岐/比較ユニットのみが示されている。プロセッサがストールしてオペランドを待機していない限り、表1の各行に示される命令は、クロックサイクルごとに発行される。以下の例において、「BRUnit」は分岐/比較ユニット(102A/102B)であり、「ALU/cmpU」は整数ユニット(103A/103B)であり、「Load/storeU」はロード/記憶ユニット(104A/104B)であり、R1〜R3はレジスタ(106A/106B)である。上記に示したVLIWプロセッサの特徴は、以下に述べるその後のすべての例にも適用可能である。
上記プロセッサは並列実行可能であるが、上記に示すコンパイルされたコードには、まだいくつかのNopが存在する。コンパイラ202は、1サイクルあたりより多くのオペレーションをスケジューリングすること及び待ち時間を短縮することによって性能を向上させるために、利用可能なスロットに命令をスケジューリングするコード、プリフェッチを発行するコード等を含むことができる。
以下の表2に示す、コンパイルされ且つ最適化されたコードは、表1に示すA+B=Cのオペレーションを実行する本時間的複製方法の一例である。表2に示すように、レジスタR1及びR2に値A及びBをそれぞれロードするオペレーションは、最初にクロックサイクル1で実行され、その後、クロックサイクル4で同じレジスタを使用して繰り返される。最初の加算オペレーションの結果は、サイクル2でレジスタR3に保存され、ステップ220において、検証コード204により、第2の加算オペレーションの結果(サイクル5でレジスタR4に記憶される)と比較される。レジスタR3及びR4に記憶された値が等しくない場合、エラーハンドリングルーチン230への分岐が行われる。そうでない場合、処理は、ステップ225における次のコードセクションに続く。これら2つのオペレーションの結果が「公開」される前、又は、当該結果を使用してプログラムのその後の実行フローが変更される前に、当該2つのオペレーションの結果のチェックが行われるように、コンパイラ202はプログラムをセクション207に分割する。
結果の公開は、I/Oデバイスに当該結果を書き込むことによって行うこともできるし、或いは、条件分岐の実行時に別のプロセス又はプロセッサが見ることができるメモリ領域に当該結果を書き込むことによって行うこともできる。この条件分岐は、プログラムの制御フローを変更することもあるし、変更しないこともあるものである。エラー回復が実施される場合、チェックが成功して完了するまで、セグメントはその入力を破棄しないという制約が、コードセクション207に対して追加される。
オプティマイザ205によって、他のプログラム命令文を実行するための、隣接した計算セクションからのコードは、表2に示すようなセグメントの実行/チェックコードに重なることが可能になる。ただし、これは、各命令文の時間的冗長性が個別に維持され、且つ、結果がプログラムの順序で公開されるように順序付けが維持されているという条件の下で、各命令文のチェックシーケンスの実行が成功した後にのみ可能になる。
エラーハンドリングルーチン230は、エラーのあるオペレーションを所定の回数、再試行することもできるし、或いは、オペレーションを再試行する代わりに、障害を引き起こすか又は他の動作を取ることもできる。
表2に示す例では、Nopが、コンパイラ202によってクロックサイクル3に挿入されている。コンパイルされたコードセクションの1次コピー210の実行と2次コピー215の実行との間に置かれるクロックサイクル数は、上述したように、特定のプロセッサのDmaxの値の関数である。表2の例において、レジスタR1〜R4は、図1のレジスタファイル106A/106Bのレジスタに対応し、「Error」は、エラーハンドリングルーチン230のラベルである。表2に示すコードは、3サイクルのDmaxについてコンパイル/最適化されている。すなわち、冗長コードセグメントの実行と実行との間に、3つのクロックサイクルが存在する。たとえば、最初の「Load R1=A」オペレーションは、クロックサイクル(1)の期間中に実行されるようにコンパイルされており、この同じオペレーションの冗長な実行は、3サイクル後のクロックサイクル(4)の期間中に実行されるようにコンパイルされている。
[エラーハンドリング]
本システムは、図2の判定ブロック220(及び図3のブロック320)によって示されるように、1つ又は複数のチェックを実行し、2つの独立した計算領域(すなわち、時間領域又は空間領域)でコードセクションについて実行された計算結果が、その後の計算にそのコードを公開する前、又は、その結果を使用して分岐オペレーションを指令する前に、同一であることを確実にする。これは、オプティマイザ205による最適化の機会を提供するために、分岐が実際に行われる前及び後の双方で行うことができる。
不一致が冗長な計算間に検出された場合、プログラムは、エラーハンドリングコード230に分岐する。回復は、エラーの表示及びプログラム実行の終了(「フェイルファスト」)と同程度に単純なものであってもよい。この技法は、他の回復のレベルがシステムによって提供される場合にも適合することができる。或いは、プログラムをその開始から再起動することもできる。ただし、この手順は、いくつかの種類の対話型アプリケーションには受け入れられない場合がある。
より包括的な回復手順では、最後のプログラムセグメントが再実行される。すべての計算がチェックされるまで、計算された値は公開されないので、エラーのある結果を生成するプログラムステージ、すなわちセグメントをその開始から安全に再実行して、エラーからの回復を行うことができる。代替的な一実施の形態では、エラー回復オペレーションが進行中であることを示すフラグがセットされる。このフラグは、その計算ステージが成功して完了すると、クリアされる。このプログラムステージの実行を試みる際に、第2のエラーが発生すると、ハードエラーが発生したという表示が与えられる。
さらに別の代替的なエラーハンドリング技法は、結果が、異なる領域で3回以上計算されるようにプログラムを構成することを含む。この場合、プログラムコードは、過半数の計算領域によって配信された計算結果がそのコードの特定のセグメントの実行結果として公開されるように構成される。この保護レベルを必要とするコードにおいてのみ、これらの方法のいずれかを選択的に使用できることに留意されたい。
[空間的複製(spatial replication)]
図3は、空間的複製障害検出システム300の例示のコンポーネント及びプロセスフローを示す図である。この空間的複製方法では、特定のプログラムのコードを2回以上実行することができ、各実行パスでは、機能ユニット及びレジスタを含む別々のプロセッサ資源が使用される。
図3に示すように、対象となるプログラムのソースコード201は、最初に、コンパイラ202によりモデルに基づいて計算セクション207に分割される。このモデルでは、各セグメントが一組の入力を取り込み、その入力値に対して計算を実行し、その後の計算に対する一組の出力を公開する。次に、各計算セクション207は、コンパイラ202によってコンパイルされ、1次コンパイル済みコードセグメント303、2次コンパイル済みコードセグメント305、及び検証コード304が生成される。これらは、オプティマイザ205に入力される。
次に、オプティマイザ205は、コードセグメント303及び305に対応するコードの1次セグメント(コピー)306及び2次セグメント(コピー)307を生成し、これらの1次セグメント及び2次セグメントが、異なるレジスタ及び機能ユニット206(1)/206(2)(並びにプログラムによって利用される他のあらゆる実行資源)をそれぞれ使用して、確実に実行されるようにする。検証コード304の最適化されたコピー308も、オプティマイザ205によって生成される。オプティマイザ205は、次の場合に限り、セグメント306/307のオペレーションを並べ替えることができる。すなわち、オプティマイザ205が、セグメント対に関して1次オペレーション又は2次オペレーションを削除しない限り、又は、それらオペレーションを同じ資源上で実行するようにしない限り、若しくは、結果が同一であることをチェックコードが検証するまで結果を公開しない限り、オペレーションを並べ替えることができる。時間的複製の場合のように、コンパイラは、チェックがあらゆる結果の公開前又は制御の転送前に実行されるように、コードをセクションに分割する。
代替的な一実施の形態では、タグ等の「ヒント」が提供されて、それによって、計算領域を他の計算領域に使用される資源と交わらない一組の実行資源及びデータ資源に関連付けることが可能にされる。異なる計算領域の実行が重なり合うことを許容することができる。コンパイラ202は、プログラム実行の各ステージ(計算セクション)の実行用の第1のコードセグメントを、冗長計算及び結果のチェック用の第2のコードセグメントと共に生成して、各セグメントに異なる計算領域を指定する。
たとえば、プログラムの実行ステージにおいて、s=sin(a)の割り当てが必要な場合、コンパイラ202は、以下のようなコードを生成することができる。
ts=sin(a);第1の計算領域
rs=sin(a);第2の計算領域
if(ts<>rs) go to 回復ルーチン;
[この時点で、sをその後の計算に公開することができる]
s=ts;
次に、後続のプログラムステージのコードが生成される。本実施の形態では、一方の計算領域が、第1の組の実行ユニット、たとえば機能ユニット102A〜105A及びレジスタグループ106Aのレジスタを使用し、他方の計算領域が、第2の組の実行ユニット、たとえば機能ユニット102B〜105B及びレジスタグループ106Bのレジスタを使用する。
命令の各グループが関連付けられる計算領域を指定する情報で命令のグループにタグを付けることによって、「ヒント」をプロセッサの実行ユニットスケジューリングロジックに与えることができる。また、ヒントがコンパイルされたコードに含まれることによって、オプティマイザ又はハードウェアが、複製されたオペレーションを廃棄しないことを確実にすることができる。
計算結果が公開される前又はその後の計算に使用される前に、冗長な結果のチェックが実行される。コンパイラ202によって生成された検証コード304が実行され、判定ブロック310によって示されるように、1次コードセグメント306及び2次コードセグメント307の実行結果が比較される。また、このチェックは、現在の計算に使用されている計算領域とは異なる計算領域においても実行することができる。結果が一致しない場合には、上記セクションの時間的複製において、図2に関して説明した回復動作と同様の回復動作を試みることができる。コンパイル202は、多くのVLIWプロセッサの命令セットで利用可能な明示的なスケジューリングを利用して、冗長なコード対が同じ機能ユニットによって実行されないことを確実にすることができる。結果の不一致が検出されると、適切な回復動作が、エラーハンドリングルーチン320によって行われる。この回復動作には、再実行、停止、又は、ソフトウェア若しくはオペレーティングシステムハンドラへのトラップが含まれ得る。
以下の表3に示すコンパイルされるコードは、表1に示すA+B=Cのオペレーションを実行するための本空間的複製方法の一例である。表3に示すように、クロックサイクル1において、レジスタR1及びR11に値Aがロードされ、クロックサイクル2において、レジスタR2及びR12に値Bがロードされる。レジスタR1及びR2は、たとえば、レジスタグループ106Aの一部であり、レジスタR11及びR12はレジスタグループ106Bの一部である。クロックサイクル3の期間中に、レジスタR3及びR13が使用されて、レジスタR1/R2の内容とR11/R12の内容とがそれぞれ合計される。
次に、記憶された値「C」がレジスタR4にロードされ、次いで、クロックサイクル4(図3のステップ310)において、第1の加算オペレーションの結果が、コピー304/308の検証によって、第2の加算オペレーションの結果と比較される。レジスタR3及びR13に記憶された値が等しくない場合には、サイクル5において、エラーハンドリングルーチン320への分岐が行われる。クロックサイクル6の期間中に、レジスタR13に記憶された合計値は、プロセッサメモリに「C」として記憶される。レジスタR3及びR13に記憶された値が一致する場合には、クロックサイクル7において、レジスタ3及び4に記憶された値が比較される。この際、メモリに記憶されたオペランドの値が再ロードされ、そのフェッチされた値が、記憶されるはずであった値と比較される。これが行われて、レジスタからメモリへの経路のエラー又はメモリコントローラのエラーがないことが確認される。レジスタR3及びR4に記憶された値が等しくない場合には、サイクル8において、エラーハンドリングルーチン320への分岐が行われ、等しい場合には、ステップ315において、処理は次のコードセクションに続く。
2つのオペレーションの結果は、「公開」される前又はプログラムのその後の実行フローの変更に使用される前にチェックされる。エラーハンドリングルーチン320は、以下の動作の任意の組み合わせを提供することができる。すなわち、エラーのあるオペレーションを所定の回数再試行すること;オペレーションを再試行する代わりに、停止させるか又は他の動作を行うこと;エラー報告を行うこと;及び統計値を収集すること、の任意の組み合わせを提供することができる。
表3の各列の命令は、プロセッサ101の特定の機能ユニット、及び、レジスタファイル107のグループ106A又は106Bのいずれかの特定のレジスタグループによって実行される。レジスタファイル107は、同じレジスタ資源が1次コードセグメント306及び2次コードセグメント307によって使用されないように区画される。
オプティマイザ205は、上記に示したコードのNopの箇所のいくつかに、後続のオペレーションをスケジューリングできることに留意されたい。表3の例に示すように、複製されたコードが、異なる結果レジスタを使用することによって、機能ユニット、レジスタ、又はそれらの間のパスにエラーが存在するかどうかの判断が、結果の比較により可能になる。同じことは、オペレーションの比較にも同様に当てはまる。
代替的な一実施の形態では、分岐のターゲットアドレス又はラベル(又は制御オペレーションの他の変更)がレジスタにロードされ、その結果、レジスタに記憶された値を、分岐が行われたラベルに関連付けられたアドレスのリテラル値と比較することにより、制御の変更が正しく実行されたかどうかについての判断を行うことができる。記憶されて比較された値は、アドレスでなくてもよいが、同一に符号化されたラベル又はエントリポイントによって誤った分岐制御が行われる可能性がないように、ラベル又はエントリポイントに十分一意の値である必要がある。
さらに別の代替的な一実施の形態では、プロシージャコール及びシステムコールのパラメータを複製することができる。この複製には、冗長な戻りアドレス又はコマンドコードを渡すことが含まれる。同様に、複製された結果を戻すこともできる。これらの技法は、呼び出されたルーチンへのパラメータ及び呼び出されたルーチンからの結果が正しいことを確実にするのに役立つ。
ホストシステムが、メモリの十分なエラー検出及び訂正、並びに、メモリへのパス及びメモリからのパスの十分なエラー検出及び訂正を有しない場合には、1次コードセグメント306及び2次コードセグメント307によって表されるような2つの別々のデータ領域を保持することもできる。データは、冗長な領域からフェッチされて比較され、データの忠実性が保証される。
代替的な一実施の形態では、2つの空間的に異なる計算の結果を比較して、エラーハンドリングルーチンに分岐するか又はコードを再実行するのではなく、特定のプログラムのコードを3つ以上の空間領域で実行し、その結果を採決して、どの結果(すなわち、過半数又は一致した結果)を実行するかを決定することもできる。
図4は、図2及び図3に示すシステムのオペレーション中に実行される例示のステップを示すフローチャートである。図4に示すように、ステップ405において、プログラムのソースコードは、まず、ステップ406で、計算セクションにセグメント化され、次いで、2つの形態のうちの1つでコンパイルされて最適化される。いずれの形態でも、その結果であるコンパイルされたオブジェクトコードは、最初の計算を実行する領域とは異なる計算領域で冗長な計算を実行する。
結果であるコンパイルされたコードが、(図2について上述したように)タイムスキューされた方法で実行される場合には、ステップ407において、コンパイラ202及びオプティマイザ205は、2つの冗長なコードセグメントを生成し、最少のクロックサイクル数が、コンパイルされたソースコードの特定のセクションの1次コピー210の実行と2次コピー215の実行との間で経過するように、それら2つの冗長なコードセグメントの実行をスケジューリングする。
コンパイルされたコードが、異なるハードウェアエンティティを介して実行される場合には、ステップ408において、コンパイラ202/オプティマイザ205は、特定のコードセクションの本質的に冗長な1次コピー306及び2次コピー307を生成して、それら1次コピー及び2次コピーが、異なるレジスタ及び機能ユニット206(1)/206(2)を使用することを保証する。これらの2つのコピー、すなわちコードセグメントが本質的に冗長であると言われる理由は次の通りである。すなわち、これらの2つのセグメントは、機能的に同一であり、同じ計算(複数可)を実行するが、各セグメントの実行では、異なるレジスタ及び機能ユニットが使用されるので、厳密には同一でないからである。(ステップ407及び408で説明した)上記の場合のいずれにおいても、本明細書で説明したように、オプティマイザ205の追加された機能を実行するようにコンパイラ202を構成できることに留意すべきである。
対応するコードセクションのコンパイル中、ステップ410において、検証コードがコンパイラ202によって生成される。ステップ420において、コンパイルされたコードセクションの冗長な1次セグメント(コピー)及び2次セグメント(コピー)がプロセッサ101によって実行される。ステップ407で生成された検証コードは、ステップ425で実行されて、1次セグメント306及び2次セグメント307の各実行結果が比較される。判定ブロック430において、結果に不一致が検出されると、適切なエラーハンドリングルーチン230/320によって適切な動作が行われる。このエラー回復動作には、再実行(N1−ステップ433)、又は、停止、若しくは、ソフトウェア若しくはオペレーティングシステムハンドラへのトラップ(N2−ステップ432)が含まれ得る。1次セグメント306及び2次セグメント307の各実行結果が同一である場合には、ステップ434において、それらの結果がコミットされ、次のコードセクションの冗長なコピーがステップ420で実行される。
代替的な一実施の形態では、コンパイラによって生成された検証コード自体を、検証が複数の計算領域で冗長に実行されるように構成することができる。
上述したオペレーションは、標準的なコンパイラで実施することもできるし、「ジャストインタイム」(JIT)コンパイラで行われるような、ネイティブマシンコード又はオブジェクトフォーマットにコードを動的に変換するツールで実施することもできる。別のインプリメンテーション又はツールでは、本方法に従い、静的又は動的なコードの再編成又は最適化を行うソフトウェアを使用して、レガシーコードを冗長な形態に動的に変換することもできるし、既存のコードを徐々に変換することもできる。本システムに準拠した設計は、上記技法のすべて又は一部を使用することができる。すべてにするかそれとも一部にするかは、保護を行いたい量及びコードの性能要件によって決まり、且つ、エラー検出メカニズムが何に組み込まれようとも関連ハードウェアを増強するのに適切なものにされる。
[可変遅延命令]
代替的な一実施の形態では、プロセッサ命令セットは、コンパイラによって実施される可変遅延命令を含む。この可変遅延命令の有効な遅延値は、Dmaxの特徴付けられた値に基づいている。この実施の形態は、コンパイラによって実施される一対の命令又は命令述語を提供する。この一対の命令又は命令述語の第1のもの(「タイマ始動」命令)は、待機間隔が開始される開始時点を指定し、第2のもの(「タイマチェック」命令又は「待機」命令)は、開始点指定(「タイマ始動」)命令と条件付き待機(「タイマチェック」)命令との間で少なくともDmaxの時間分が経過するまで、後続の命令の実行を遅延させる。Dmaxに等しい期間がすでに経過している場合には、実行フローは、直ちに次の命令に進む。
タイマ始動命令及びタイマチェック命令は、本明細書で前述したような時間的ダイバーシティの条件を満たすのに十分な時間を確保するためのメカニズムを提供するために共に使用することができる。このメカニズムは、ソフトエラーによって引き起こされたあらゆる影響が、2次計算及び結果の比較/検証を試みる前に終了していることを保証する。簡単な最適化においては、結合された単一の「チェックアンド始動」命令又は述語が、Dmax時間が最後の結合されたチェックアンド始動命令から経過したかどうかを判断し、この条件が満たされるまで、後続の実行を一時停止する。次に、後続の結合された待機命令についての新たな時点の範囲が定められる。この結合された命令、命令対、又は述語対によって、プロセッサ又はシステムのDmaxの値の特徴付けを、コンパイルされたコードから効率的な方法で切り離すことが可能になる。
いくつかのオペレーションは、インターバルタイマ208を読み出す等、フォールスアラームを生成する可能性があるために、結果の検証から省くことができる。1次コードセグメント及び2次コードセグメントは、異なる時刻に実行されるので、それらセグメントの実行は、異なる結果を合法的に生み出す場合がある。これに加えて、外因性の事象の動作によって変更されるおそれのある実時間データに対して処理を行うコードもある。このタイプの実時間データを読み出すのに使用される命令も、冗長実行にとって良い候補ではない。しかしながら、これらの命令が、実行されるコードに占める割合は、通常、非常に少量(わずかな割合)であり、それら命令を省いても、本明細書で開示した方法の障害検出の有効性に対する影響はごくわずかである。
図5は、ソフトウェアによって実施される例示の時間的ダイバーシティタイマ208の状態図を示している。図5に示すように、ブロック501において、システムの初期化時に、時間的ダイバーシティタイマは満了状態にセットされる。ステップ502において、「タイマ始動」命令が実行されると、ステップ503において、タイマリセット命令が実行され、タイマ208は、少なくともDmax単位時間の間、ブロック504に示す待機状態に遷移する。Dmax単位時間の経過時点(ステップ506)で、タイマはブロック501の満了状態に入る。
時間的ダイバーシティタイマ208が待機状態にある間、ステップ505において、「タイマチェック」命令を実行して、タイマが満了したかどうかを判断することができる。「タイマチェック」命令によって、コードセグメントの実行は、タイマ満了時に再開することが可能になる。
図6は、例示の「タイマ始動」命令のオペレーション600を示す図である。この「タイマ始動」命令の実行は、ステップ601において、時間的ダイバーシティタイマ208をトリガし、ステップ602において、Dmax単位時間の間待機状態に入る。実行は、ステップ603において、タイマを待つことなく順に次の命令に進む。
図7は、例示の「タイマチェック」命令のオペレーション700を示す図である。この例示の「タイマチェック」命令は、ステップ701において実行されると、時間的ダイバーシティタイマが満了するまで、後続の命令の実行を一時中止する。ステップ702において、時間的ダイバーシティタイマ208がすでに満了状態にある場合、コードセグメントの実行は、ステップ704において、次の命令に直ちに進む。そうでない場合、命令の実行は、時間的ダイバーシティタイマ208が満了するまで、ステップ703において一次停止される。
さらに改良することによって、「タイマ始動」命令600及び「タイマチェック」命令700は、関係しない計算領域からの計算と重なることを可能にする各計算領域に対応した一意のタグを指定することが可能になる。
図8は、他の命令及び他のタイマ状態に関する「タイマ始動」命令及び「タイマチェック」命令の例示の使用を示す図である。図2について上記で示したように、対象となるプログラムのソースコード201は、最初に、好ましくはコンパイラ202により、モデルに基づいて複数の計算セクション207に分割される。このモデルでは、各セクションは、一組の入力を取り込み、入力値に対して計算を実行し、その後の計算に対する一組の出力を公開する。いくつかの例では、対象となるプログラム全体が計算セクション207を構成する場合があり、したがって、複数の計算セクションの残りのものは、実質上、空値のエンティティにされる。コンパイルされるソースコードの特定のセクション207の1次コピー210及び2次コピー215(以下、1次コードセグメント及び2次コードセグメントとそれぞれ呼ぶ)はコンパイラ202によって処理され、その結果生成されたコードは、オプションとして、オプティマイザ205に渡される。オプティマイザ205は、特定のプロセッサの利用可能な資源を最良に利用するように、オペレーションの実行をスケジューリングする。図9〜図12について以下でさらに提示する例も、同じプロセッサ上で実行されるこれらの1次コードセグメント210及び2次コードセグメント215を使用して、それらの図に示す各方法を実施する。
図8に示すように、1次コードセグメント210の実行は、ブロック800において開始される。1次セグメントの実行が完了した後、時間的ダイバーシティタイマ208が、ブロック801において、「タイマ始動」命令の実行によりトリガされる。それによって、Dmaxの値に等しい待機期間810が開始される。2次コードセグメント215の後続の命令の実行は、「タイマ始動」命令が実行された時からDmax時間が経過するまで、遅延される。2つのセグメントにおける対応する命令が少なくともDmaxに等しい期間によって分離される限り、2次コードセグメントは、1次セグメント全体の実行が完了するのを待機する必要はないことに留意すべきである。コードセグメント210/215の実行を「重ねる」この方法は、図9について後述する。
通常のシステムキャッシュの影響のため、第2のコードセグメント、すなわち2次コードセグメント215は、第1の(1次)コードセグメント210よりも高速に実行される傾向がある。実行される第1のコードセグメントは、より高いキャッシュ率を受け取り、TLB(変換索引バッファ)が不足し、したがって、実行はより遅くなる。実行される第2のコードセグメントは、第1のコードセグメントが自身のデータを「プリフェッチ」していることから利益を享受し、ストレージの階層による遅延をそれほど受けない。本明細書で説明したメカニズムは、1次コードセグメントの実行と2次コードセグメントの実行との間に安全な間隔を維持するのに役立つ。
例示の一実施の形態では、冗長なコードセグメントが同じ一時的な障害による影響を受けない可能性が十分高い場合に、Dmaxの値を最適なレベルに設定することができる。実際には、いくつかの一時的な事象は、他の事象よりも長く持続し、その障害の影響がほとんどなくなるまで、セグメントの1つの実行は、障害を受けた機能ユニットを使用できないことがある。特定のCPUアーキテクチャのDmaxの値は、そのCPUのハードウェア特性について調整できるだけでなく、特定の「時間的分離(temporal separation)」(タイマ配置)ストラテジーを考慮して調整することもできる。このストラテジーは、100パーセントよりも幾分小さなソフトエラー検出率を有する実際のフォールトトレラントソリューションを達成するのに必要とされるが、比較的高速な実行を提供するものである。この実施の形態のタイマ208の相対的な時間間隔は、特定の用途に許容可能な、検出されない一時的な(ソフト)エラー率を許容するように調整することができる。
Dmaxに設定された値は、環境の放射フラックス、システムの高度、及びシステムのシールドの予測された変化を考慮することができ、ローカルに測定されたこれらの変化及びそれ以外の因子に従って動的に変更することができる。
1次コードセグメント210及び2次コードセグメント215は、任意のサイズとすることができ、たとえば、単一の命令と同程度に小さくすることもできるし、所望なだけ大きくすることもできることに留意されたい。代替的な一実施の形態では、タイマリセット機能及びブロック機能(タイマ満了を待機する)が結合されて、特定のプロセッサによって実行される命令のそれぞれに含められる。したがって、この技法は、実質上、1つの命令(1次コードセグメント及び2次コードセグメント)対あたり1つのタイマを使用する。
待機期間810の間、ブロック802に示すように、他の命令(対象となるコードセグメントの一部ではない)をオプションとして実行することができ、ブロック803に示すように、「タイマチェック」命令を使用して時間的ダイバーシティタイマ208がチェックされて、待機期間が満了したかどうかが判断される。
矢印811によって示される時点において、時間的ダイバーシティタイマが始動してからDmaxに等しい期間が経過し、したがって、タイマは満了する。次に、ブロック804の展開図に示すように、ブロック800で開始された1次セグメントに対応する2次コードセグメント215(サブブロック804A)の実行、並びに、検証コード(サブブロック804B)及び次の1次コードセグメント(サブブロック804C)の実行を行うことができる。次の1次コードセグメントの実行前に、ブロック805において、時間的ダイバーシティタイマ208が、「タイマ始動」命令の実行によって再び始動され、したがって、待機期間812が開始される。この待機期間812は、この場合も、Dmaxの値に等しい。待機期間812の間、ブロック806に示すように、時間的ダイバーシティタイマ208が、「タイマチェック」命令を介してチェックされて、待機期間が満了したかどうかが判断される。対象となる本コードセグメントの一部ではない命令は、待機期間812の間に実行できることに留意されたい。
矢印813によって示される時点において、時間的ダイバーシティタイマ208が最後に始動されてからDmax時間が経過し、タイマは満了する。タイマ208が満了したことを「タイマチェック」命令が検出すると、次の2次コードセグメントの実行がブロック807において開始される。
[マルチスレッド化されたコードセグメントの実行]
代替的な一実施の形態では、1次コードセグメント及び2次コードセグメントが別々のCPU又はO/S(オペレーティングシステム)のスレッドで実行される。これらのスレッドは、同じアドレス空間及び時間的ダイバーシティタイマ(複数可)208を共有する。本実施の形態では、1次コードセグメント210は或るスレッドで実行され、2次セグメント及び検証コードは別のスレッドで実行される。図9について後述するが、この方法によって、スレッドは、別々のレジスタセットを使用して計算を実行することが可能になるが、検証コードしか、メモリに対する変更をコミットすることができない。代替的な一実施の形態では、検証コードを第3のスレッドで実行することができる。
図9は、同じコードセクションの2つのコードセグメント、すなわちスレッドの使用を示す例示の図である。ここでは、使用されるプロセッサセットが、命令の重なった実行を、たとえばハードウェアマルチスレッドを介して可能にするか、又は、単にマルチスレッド化されたO/Sを使用することによって、2つのコードセグメントの重なった実行が可能にされる。図9の実施の形態では、必ずしも、1次コードスレッド全体の実行が完了するのを待ってから、2次コードスレッドの実行が開始されるわけではない。図9に示す方法は、2次コードスレッドの実行が、通常は、1次コードスレッドの実行に追いつかないものと仮定する。
図9に示す実施の形態では、時間的ダイバーシティタイマ208が、1次コードスレッドの最初の命令の実行直後に始動され、このタイマは、始動された直後にチェックされ、2次コードスレッドのコードの実行が、タイマの満了が起こるまで遅延される。2次コードは、必ずしも1次コードと正確に同じハードウェアデバイス上で実行されていないので、図9に示す方法は、実質的には、幾分ハイブリッドな時間/空間方式である。
図9に示すように、1次コードセグメント、すなわちスレッド210の最初の命令の実行は、ブロック901において、スレッドAで開始される。その後、ブロック902における「タイマ始動」命令の実行が続く。それによって、時間的ダイバーシティタイマ208が始動され、1次スレッドの残りのコードについて、Dmaxの値に等しい待機期間が開始される。
タイマが始動された直後、ブロック903(時刻t=1に示す)において、第2のスレッドであるスレッドBが開始される。次に、ブロック905において、時間的ダイバーシティタイマ208がスレッドBでチェックされ、タイマがタイムアウトするまで、2次コードの実行開始が遅延される。本実施の形態では、2次コードスレッドは、1次スレッド全体の実行が完了するのを待機する必要はない。1次スレッド及び2次スレッドにおける対応する命令が、少なくともDmaxに等しい期間によって分離されている限り、時間的ダイバーシティタイマが満了するとすぐに2次コードスレッドを実行することができる。
スレッドAでは、ブロック904において、1次スレッドの残りの命令が、ブロック906における2次コードスレッドの実行と準同時に実行される。この2次コードスレッドは、タイマ208がタイムアウトした時に開始される。スレッドBでは、1次コードスレッドの実行が2次コードスレッドの実行終了時刻よりも前に完了したものと仮定して、検証コードがブロック907において実行される。スレッドBは、オプションとして、スレッドAによりセットされたスレッド完了フラグをチェックすることにより、1次コードスレッドが実行を完了したかどうかを判断することができる。
[複数のタイマの使用]
図10〜図12は、複数の指名されたタイマ208が使用されてプログラムセグメント210/215の重なった実行を可能にする例示の一実施の形態における複数のプログラムセグメントの実行を示す図である。2つの異なるコードセグメントの命令の実行に重なりがないものが、図10〜図12に示されているが、たとえば、マルチプロセシング又はマルチスレッドが使用される場合に、一定のプロセッサセットはプログラムコードの複数のセグメントの同時実行を可能にすることができることに留意すべきである。図10〜図12に示す方法では、複数の指名されたタイマ(たとえば、各タイマはタグを使用して、対応する計算領域を指定する)208が設けられる。これらのタイマ208の始動及び待機は、独立に行うことができる。たとえば、以下の命令対等のように、指名されたタイマの始動及び待機を行うための別々の命令が実施される。
starttimer<timer_name>
waitfortimer<time_name>
代替的に、たとえば、以下のように、上記機能の双方を実行する、結合された命令が提供される。
waitforandstart<waitfortimername>,<starttimername>
複数のタイマを提供することによって、時間的ダイバーシティをコードセグメントごとに維持することを可能にしつつ、異なるプログラムセグメントが重なることが可能になる。したがって、より効率的な命令の実行が可能になる。設けられるタイマの個数は、重なる可能性のある時間的領域又は計算プログラムのセクションの個数の関数である。いずれの場合にも、タイマ208及び対応する「タイマチェック」命令を使用することによって、指定されたタイマが始動してから十分な時間が経過し、時間的ダイバーシティの要件が維持されることが確実に行われる。
本実施の形態では、遅延命令によって消費される実際のクロックサイクル数は、プログラム可能にされるか、又は、ファームウェア若しくはオペレーティングシステムによって調整可能にされる。これによって、プロセッサのDmax値の特徴付けをプロセッサの設計から切り離すことが可能になる。また、これによって、このような特徴付けは、プロセッサの設計、開発、及び製造と時間的に重複するか、又は、時間的にこれらの後に続いて行うことが可能になり、それによって、製造プロセスの変化に対応することが可能になり、且つ、プロセッサの集団の長期の観察に基づくDmaxの特徴付けの改良にも対応することが可能になる。Dmaxの値は、特定のプロセッサ又はシステムに対応する物理パラメータの関数として計算することもできるし、物理環境、たとえば、高度又は測定された背景放射の関数に基づいて計算することもできる。
これに加えて、本実施の形態の上述した命令タイプのそれぞれは、本明細書で説明した時間的ダイバーシティ技法の全オペレーションが必要とされる場合にのみ遅延が課されるような形態にすることもできる。
図10は、例示の一組のステップを示す図である。ここでは、複数の時間的ダイバーシティタイマ208が使用されて、プログラムセグメント210/215の重なった実行が可能になる。図10に示す実施の形態では、時間的ダイバーシティタイマ208は、1次コードの各セグメント210が実行される前に始動される。複数のタイマを使用することによって、図10に示すように、1次コードセグメントの実行と2次コードセグメントの実行との間のより良好な時間的分離が可能になる。図10では、特定の計算セクション207の1次コードセグメント210の実行と、同じセクション207の2次(冗長)コードセグメント215の実行との間の時間的ダイバーシティを維持しつつ、プログラムコードの3つの分離した計算セクション207が実行される。各タイマ208は、レジスタ、又は、当該技術分野において既知の他の方法を介して実施することができる。代替的な一実施の形態では、システムハードウェアは、実行される命令ごとにタイマを自動的にセットすることができる。すなわち、タイマ208は、実質的に各命令に統合される。図10の例では、タイマ1及びタイマ2の2つのタイマ208が使用され、図10の例は、第1のタイマ(タイマ1)の再利用を示している。
図10に示すように、ブロック1001において、指名された「タイマ始動」命令(たとえば、「starttimer タイマ1」)を実行することにより、タイマ1が始動される。それによって、計算セクションAのコードについて、時間的ダイバーシティタイマ208が始動され、Dmaxの値に等しい待機期間が開始される。次に、計算セクションAの1次コードセグメントが、ブロック1002の期間中に実行される。計算セクションAの1次コードセグメントの実行の完了後、次に、指名された第2のタイマであるタイマ2が、ブロック1003において始動され、コード計算セクションBの1次コードセグメントが、ブロック1004の期間中に実行される。ブロック1005において、「タイマチェック」命令(たとえば、「waitfortimer タイマ1」)を使用して、タイマ1がチェックされる。タイマが満了すると、タイマはリセット(再始動)される。タイマ1は、今度は、計算セクションCに再利用される。
ブロック1006において、計算セクションCの実行が開始される。タイマ1は、セクションAの1次コードセグメントについて満了しているので、ブロック1007において、セクションAの2次コードセグメントが実行される。その後、計算セクションAの検証又はコードのチェックが実行されて、そのセクションの1次コードセグメントの実行中にソフトエラーが発生したかどうかが判断される。
ブロック1008では、タイマ2がチェックされ、タイマが満了すると、タイマはリセットされる。その後、計算セクションBの1次コードセグメントが、ブロック1009の期間中に実行される。ブロック1010において、タイマ1が満了した後、ブロック1011において、計算セクションCの2次コードセグメントが実行され、その後、そのセグメントの検証コードの実行が続く。以下の表4は、図10について上述したプロセスに対応する命令シーケンスを示している。
図11は、時間的ダイバーシティタイマ208が1次コードセグメントの実行と2次コードセグメントの実行との間に配置されて、1次実行ストリームと2次実行ストリームとの間のより良好な分離が得られる例示の一組のステップを示す図である。図11に示すように、ブロック1101において、計算セクションAの1次コードセグメントが実行される。次に、ブロック1102において、タイマ1が始動される。次に、ブロック1103において、計算セクションBの1次コードセグメントが実行され、その後、ブロック1104において、タイマ2が始動される。
ブロック1105において、「タイマチェック」命令を使用して、タイマ1がチェックされる。タイマが満了すると、タイマは再始動される。次に、ブロック1106において、計算セクションAの2次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。次に、ブロック1107において、タイマ3が再始動され、ブロック1108において、計算セクションCの1次コードセグメントが実行される。
ブロック1109において、タイマ2がチェックされ、タイマが満了すると、タイマは再始動される。次に、ブロック1110において、計算セクションBの2次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。次に、ブロック1111において、タイマ3がチェックされ、タイマが満了すると、タイマは再始動される。次に、ブロック1112において、計算セクションCの2次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。以下の表5は、図11について上述したプロセスに対応する命令シーケンスを示している。
図12は、1次コードセグメントと2次コードセグメントとの間に配置された時間的ダイバーシティタイマ208が再利用される例示の一組のステップを示す図である。図12に示すように、ブロック1201において、計算セクションAの1次コードセグメントが実行される。次に、ブロック1202において、時間的ダイバーシティタイマ1が始動される。次に、ブロック1203において、計算セクションBの1次コードセグメントが実行され、その後、ブロック1204において、時間的ダイバーシティタイマ2が始動される。
ブロック1205Aにおいて、「タイマチェック」命令を使用して、タイマ1がチェックされる。タイマが満了すると、タイマは、ブロック1205Bにおいて再始動される。図11について説明した方法とは異なり、タイマ1は、次に、別の計算セクション、すなわち、この例ではセクションCに再利用される。ブロック1206における計算セクションCの1次コードセグメントの実行後、ブロック1207において、計算セクションAの2次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。図12に示す方法は、1次コードセグメントの最初の実行と、対応する2次コードセグメントの実行/検証との間に、図11の方法よりも大きな遅延を課すことに留意されたい。
ブロック1208において、タイマ2がチェックされ、タイマが満了すると、タイマは再始動される。次に、ブロック1209において、計算セクションBの2次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。次に、ブロック1210において、タイマ1がチェックされ、タイマが満了すると、タイマは再始動される。次に、ブロック1211において、計算セクションCの2次コードセグメントが実行され、その後、そのセクションの検証コードの実行が続く。以下の表6は、図12について上述したプロセスに対応する命令シーケンスを示している。
本システムの範囲から逸脱することなく、上記方法及び上記システムに一定の変更を行うことができる。上記説明に含まれるか、又は、添付図面に示されるすべての事項は、例示として解釈されるべきであり、限定する意味に解釈されるべきではないことに留意すべきである。たとえば、図1に示すプロセッサを、図1に示すコンポーネント以外のコンポーネントを含むように構成することができ、これらのコンポーネントは、他の構成で配置することができる。図2〜図12に示す要素及びステップも、上記のように説明したシステムの精神から逸脱することなく、本明細書で説明した方法に従って変更することができ、それらの図に示したステップは、他の構成で配列することができる。