(57)【要約】【課題】プログラムの本来性能を低下させずにプロセッサの故障検出率を高めることを目的として、アセンブリ言語で記述されたソースプログラムに対し、演算を二重化するコードをプログラムの空き部分に挿入することを特徴とする。【解決手段】プリプロセッサ（１０）は、アセンブリ言語で記述したプログラム（１）の性能を低下させずに、プログラム（１）内の空き命令を見つけて、二重化パターンファイル（１１）を参照して二重化パターンを挿入して自動的に演算を二重化する。二重化できない場合、前記プリプロセッサ（１０）は、前記二重化パターンの挿入前後の前記命令の出現回数に基づいて二重化度を算出し、他の命令に比べて前記二重化度が低い命令についてランダムパターンファイルを参照してランダムパターンを生成し、性能を低下させずにプログラム（１）に挿入する。【選択図】図１
2007133536.tif 000002
【特許請求の範囲】
【請求項１】
アセンブリ言語で記述したプログラム内の空き命令を見つけて、二重化パターンファイルを参照して自動的に二重化パターンを挿入して、命令を二重化した中間ファイルを生成するプリプロセッサと、
前記中間ファイルにアセンブル処理を行い、実行形式プログラムを出力するアセンブラ実行部と、
前記実行形式プログラムを実行するデータ処理部と
を具備する
故障検出プログラム作成装置。
【請求項２】
請求項１に記載の故障検出プログラム作成装置において、
前記プリプロセッサは、前記命令を二重化できない場合、前記二重化パターンの挿入前後の前記命令の出現回数に基づいて前記命令毎の二重化度を算出し、他の命令と比べて前記二重化度が低い命令について、ランダムパターンファイルを参照してランダムパターンを生成して前記プログラムに挿入する
故障検出プログラム作成装置。
【請求項３】
請求項１に記載の故障検出プログラム作成装置において、
前記データ処理部は、
前記実行形式プログラムに基づいて、オリジナルコードを実行した結果と二重化コードを実行した結果とを比較して比較結果の一致をチェックし、前記比較結果が不一致の場合、障害処理を行う
故障検出プログラム作成装置。
【請求項４】
請求項３に記載の故障検出プログラム作成装置において、
前記データ処理部は、
前記比較結果が一致していた場合、前記プログラムの実行を続行する
故障検出プログラム作成装置。
【請求項５】
アセンブリ言語で記述したプログラムと、
前記プログラムに二重化パターンを挿入するために参照する二重化パターンファイルと
を使用し、
前記プログラム内の空き命令を見つけて前記二重化パターンファイルに規定されている二重化コードを挿入し、自動的に命令を二重化する
プリプロセッサ。
【請求項６】
請求項５に記載のプリプロセッサにおいて、
前記プログラムにランダムパターンを挿入するために参照するランダムパターンファイルを更に使用し、
前記命令を二重化できない場合、前記二重化パターンの挿入前後の前記命令の出現回数に基づいて前記命令の二重化度を算出し、前記二重化度が低い命令について前記ランダムパターンを生成して前記プログラムに挿入する
プリプロセッサ。
【請求項７】
（ａ）ソースプログラム内の命令コードを指すポインタを初期化するステップと、
（ｂ）前記ポインタで指されたコードＡを取り出すステップと、
（ｃ）次の命令コードを指すために前記ポインタを進めるステップと、
（ｄ）前記コードＡが取り出せない場合、前記ソースプログラムの終了と判断するステップと、
（ｅ）前記ソースプログラムの終了と判断した場合、中間ファイルを出力するステップと、
（ｆ）前記コードＡの取り出し後、前記コードＡと同一サイクルで実行されるコードＢの有無をチェックするステップと、
（ｇ）前記コードＢが存在する場合、前記（ｂ）ステップへ戻り、前記（ｂ）ステップからの処理を繰り返すステップと、
（ｈ）前記コードＢが存在しない場合、前記コードＡが二重化対象命令かチェックするステップと、
（ｉ）二重化パターンファイルの所定の文字列を含む行をサーチし、前記コードＡが存在した場合、二重化対象命令であるかチェックするステップと、
（ｊ）前記コードＡが二重化対象命令である場合、二重化コードサイクル数を取得するステップと、
（ｋ）前記コードＡの実行サイクルから前記二重化コードサイクル数までの各サイクルにおいて前記コードの空きの有無をチェックするステップと、
（ｌ）前記コードの空きがないサイクルが存在した場合、前記（ｂ）ステップへ戻るステップと、
（ｍ）全てのサイクルに前記コードの空きがあった場合、前記コードＡの実行サイクルから前記二重化コードサイクル数までの各サイクルに、他のエリアからの分岐による移入の有無をチェックするステップと、
（ｎ）他のエリアからの分岐による移入が存在する場合、前記（ｂ）ステップへ戻るステップと、
（ｏ）前記他のエリアからの分岐による移入が存在しない場合、前記コードＡの実行サイクルから前記二重化コードサイクル数までの各サイクルに前記二重化コードを挿入するステップと
を具備する
故障検出プログラム作成方法。
【請求項８】
請求項７に記載の故障検出プログラム作成方法において、
前記（ｉ）ステップは、
（ｉ１）前記コードＡが二重化対象命令でない場合、前記（ｂ）ステップへ戻るステップを具備する
故障検出プログラム作成方法。
【請求項９】
請求項７に記載の故障検出プログラム作成方法において、
前記（ｉ）ステップは、
（ｉ２）前記コードＡが二重化対象外命令である場合、ランダムパターンファイルに定義されている命令を選択し、前記命令のランダムコードサイクル数を取得するステップを具備する
故障検出プログラム作成方法。
【請求項１０】
請求項９に記載の故障検出プログラム作成方法において、
前記（ｏ）ステップは、
（ｏ１）前記他のエリアからの分岐による移入が存在しない場合、前記コードＡの実行サイクルから前記二重化コードサイクル数までの各サイクルにランダムコードを挿入するステップを具備する
故障検出プログラム作成方法。
【請求項１１】
請求項７乃至１０のいずれか一項に記載の故障検出プログラム作成方法を、コンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プリプロセッサの故障検出率を高める故障検出プログラム作成方法に関する。
【背景技術】
【０００２】
プロセッサの高速化技術の一つに、ＶＬＩＷ（Ｖｅｒｙ  Ｌｏｎｇ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｗｏｒｄ）がある。ＶＬＩＷでは、依存関係にない複数の命令を一つの命令としてまとめて同時に実行する。同時実行される命令の数は常に一定に保たれ、規定の数に達しない場合は「何もしない」命令で埋められる。また、１命令の長さが従来のプロセッサに比べて極めて長い。
【０００３】
ＶＬＩＷプロセッサは複数の演算器を実装しており、複数の命令を同時に実行できるが、各命令間の処理の論理的な順序保証が必要な場合は、複数の命令を同時に実行できない。この時、プログラムの空き命令部分にはアセンブラによりＮｏ  ＯＰｅｒａｔｉｏｎ命令（ｎｏｐ）が挿入される。
【０００４】
また、プログラムの実行においては、プロセッサの演算器はｎｏｐ動作となるため、演算器は空き状態になっている。この空き状態の演算器を利用して演算を二重化し、プロセッサ故障を検出することでデータインティグリティ（Ｄａｔａ  Ｉｎｔｅｇｒｉｔｙ）を向上させる方法が存在する。なお、データインティグリティとは、認可されていないデータの変更に対して防護することにより保証される「データの完全性」である。認可されていないデータの変更には、意図的な変更（破壊を含む）とアクシデントによる変更（喪失を含む）の両方を含む。
【０００５】
従来、Ｃ言語によるプログラム開発では、ソースコードをコンパイルする時点で二重化したコードを出力し、その後、最適化を行うことで演算の二重化を実現しているが、二重化によりプログラムサイズが増大し、性能が低下してしまう問題があった。
【０００６】
一方、特に性能が要求される処理ではＣ言語などの高級言語よりもアセンブリ言語を用いて開発が行われる。アセンブリ言語においてプロセッサのデータインティグリティを向上させるプログラムを開発する場合、人手設計により二重化コードを追加する必要があり、開発工数が増加し、品質の低下が生じた。
【０００７】
関連する技術として、特開２００５−１６６０５７号公報（特許文献１）に障害検出コンピュータシステムが開示されている。
この従来技術は、プログラムを実行するデジタルプロセッサの計算エラーを検出する方法に関する。
この方法は、以下のステップを含む。
（１）第１ステップ
プログラムを、計算セグメントに分ける。
（２）第２ステップ
前記セグメントの少なくとも１つのソースコードをコンパイルするステップであって、それによって、２つのコードセクションを生成し、この２つのコードセクションの一方が、他方に対して機能的に冗長である。
（３）第３ステップ
前記２つのコードセクションの実行によって生成された結果を比較する検証コードを生成する。
（４）第４ステップ
前記コードセクションそれぞれを、異なる計算領域で実行するステップであって、それによって、各結果を生成する。
（５）第５ステップ
前記検証コードを使用して、前記各結果を比較する。
（６）第６ステップ
前記各結果が同一である場合にのみ、前記コードセクションの１つを実行するステップであって、それによって、前記プログラムの実行のその後のフローを変更する。
【０００８】
特許文献１では、ソースコードのコンパイル時二重化コードを生成し、オプティマイザで最適化を行うが、コンパイル時に二重化コードを生成するため二重化コードを生成しないプログラムに対して性能低下が発生していた。
【０００９】
また、特開平１１−２４９３１号公報（特許文献２）にＶＬＩＷ型計算機が開示されている。
このＶＬＩＷ型計算機は、複数の演算器と、実行手段と、比較器と、通知手段とで構成されることを特徴とする。
複数の演算器は、少なくとも第１の演算器及び第２の演算器を含む。実行手段は、前記第１の演算器があるサイクルにおいて演算命令を実行する時、前記第１の演算器以外の演算器に演算すべき命令が無い場合、前記第１の演算器で実行する命令と同じ命令を前記第１演算器以外の演算器に実行させる。比較器は、前記第１の演算器による前記命令の実行結果と前記第１演算器以外の演算器による前記命令の実行結果とを比較する。通知手段は、前記比較器による比較の結果、不一致を生じた時にそれを通知する。
【００１０】
特許文献２では、複数の演算器の演算結果を比較する命令をハードウェアに追加する必要があるため、専用プロセッサを開発しなければならず、一般的なプロセッサを利用する上では本特許は利用できなかった。
【００１１】
【特許文献１】特開２００５−１６６０５７号公報
【特許文献２】特開平１１−２４９３１号公報
【発明の開示】
【発明が解決しようとする課題】
【００１２】
本発明の目的は、プログラムの本来性能を低下させずにプロセッサの故障検出率を高めるため、アセンブリ言語で記述されたソースプログラムに対し、演算を二重化するコードをプログラムの空き部分に挿入する故障検出プログラム作成方法を提供することである。
【課題を解決するための手段】
【００１３】
以下に、［発明を実施するための最良の形態］で使用される番号を括弧付きで用いて、課題を解決するための手段を説明する。これらの番号は、［特許請求の範囲］の記載と［発明を実施するための最良の形態］との対応関係を明らかにするために付加されたものである。但し、それらの番号を、［特許請求の範囲］に記載されている発明の技術的範囲の解釈に用いてはならない。
【００１４】
本発明の故障検出プログラム作成装置は、アセンブリ言語で記述したプログラム（１）内の空き命令を見つけて、二重化パターンファイル（１１）を参照して自動的に二重化パターンを挿入して、命令を二重化した中間ファイル（２）を生成するプリプロセッサ（１０）と、前記中間ファイル（２）にアセンブル処理を行い、実行形式プログラム（３）を出力するアセンブラ実行部（２０）と、前記実行形式プログラム（３）を実行するデータ処理部（３０）とを具備する。
【００１５】
前記プリプロセッサ（１０）は、前記命令を二重化できない場合、前記二重化パターンの挿入前後の前記命令の出現回数に基づいて前記命令毎の二重化度を算出し、他の命令と比べて前記二重化度が低い命令について、ランダムパターンファイルを参照してランダムパターンを生成して前記プログラム（１）に挿入する。
【００１６】
前記データ処理部（３０）は、前記実行形式プログラム（３）に基づいて、オリジナルコードを実行した結果と二重化コードを実行した結果とを比較して比較結果の一致をチェックし、前記比較結果が不一致の場合、障害処理を行う。
【００１７】
前記データ処理部（３０）は、前記比較結果が一致していた場合、前記プログラム（１）の実行を続行する。
【００１８】
本発明のプリプロセッサ（１０）は、アセンブリ言語で記述したプログラム（１）と、前記プログラム（１）に二重化パターンを挿入するために参照する二重化パターンファイル（１１）とを使用し、前記プログラム（１）内の空き命令を見つけて前記二重化パターンファイル（１１）に規定されている二重化コードを挿入し、自動的に命令を二重化する。
【００１９】
本発明のプリプロセッサ（１０）は、前記プログラム（１）にランダムパターンを挿入するために参照するランダムパターンファイルを更に使用し、前記命令を二重化できない場合、前記命令の二重化度を算出し、前記二重化度が低い命令について前記ランダムパターンを生成して前記プログラム（１）に挿入する。
【００２０】
本発明の故障検出プログラム作成方法は、（ａ）ソースプログラム（１）内の命令コードを指すポインタを初期化するステップと、（ｂ）前記ポインタで指されたコードＡを取り出すステップと、（ｃ）次の命令コードを指すために前記ポインタを進めるステップと、（ｄ）前記コードＡが取り出せない場合、前記ソースプログラム（１）の終了と判断するステップと、（ｅ）前記ソースプログラム（１）の終了と判断した場合、中間ファイル（２）を出力するステップと、（ｆ）前記コードＡの取り出し後、前記コードＡと同一サイクルで実行されるコードＢの有無をチェックするステップと、（ｇ）前記コードＢが存在する場合、前記（ｂ）ステップへ戻り、前記（ｂ）ステップからの処理を繰り返すステップと、（ｈ）前記コードＢが存在しない場合、前記コードＡが二重化対象命令かチェックするステップと、（ｉ）二重化パターンファイル（１１）の所定の文字列を含む行をサーチし、前記コードＡが存在した場合、二重化対象命令であるかチェックするステップと、（ｊ）前記コードＡが二重化対象命令である場合、二重化コードサイクル数を取得するステップと、（ｋ）前記コードＡの実行サイクルから前記二重化コードサイクル数までの各サイクルにおいて前記コードの空きの有無をチェックするステップと、（ｌ）前記コードの空きがないサイクルが存在した場合、前記（ｂ）ステップへ戻るステップと、（ｍ）全てのサイクルに前記コードの空きがあった場合、前記コードＡの実行サイクルから前記二重化コードサイクル数までの各サイクルに、他のエリアからの分岐による移入の有無をチェックするステップと、（ｎ）他のエリアからの分岐による移入が存在する場合、前記（ｂ）ステップへ戻るステップと、（ｏ）前記他のエリアからの分岐による移入が存在しない場合、前記コードＡの実行サイクルから前記二重化コードサイクル数までの各サイクルに前記二重化コードを挿入するステップとを具備する。
【００２１】
前記（ｉ）ステップは、（ｉ１）前記コードＡが二重化対象命令でない場合、前記（ｂ）ステップへ戻るステップを具備する。
【００２２】
前記（ｉ）ステップは、（ｉ２）前記コードＡが二重化対象外命令である場合、ランダムパターンファイルに定義されている命令を選択し、前記命令のランダムコードサイクル数を取得するステップを具備する。
【００２３】
前記（ｏ）ステップは、（ｏ１）前記他のエリアからの分岐による移入が存在しない場合、前記コードＡの実行サイクルから前記二重化コードサイクル数までの各サイクルにランダムコードを挿入するステップを具備する。
【００２４】
本発明のプログラムは、上記の故障検出プログラム作成方法をコンピュータに実行させる。
【発明の効果】
【００２５】
第１の効果は、アセンブリ言語で記述したプログラムの性能を低下させずデータインティグリティ（Ｄａｔａ  Ｉｎｔｅｇｒｉｔｙ）を向上させることにある。その理由は、高速化のためにアセンブリ言語で記述しているため二重化コードを追加するにあたり性能を低下させてはならないが、データインティグリティの向上は通常は性能低下を伴うことが多く、性能高速化とデータインティグリティの向上は相反するためである。
第２の効果は、二重化コードの追加のための設計を自動化できることにある。その理由は、人手作業で二重化コードを追加するのは限度があり、オリジナルコードが大きいほど、二重化コードを人手で追加することは現実的ではない。また、人手作業では性能低下のリスクや不具合盛り込みのリスクを伴うが、プリプロセッサにより空きエリアに性能低下なく二重化コードを挿入することで、前記リスクを回避できるためである。
【発明を実施するための最良の形態】
【００２６】
以下に、本発明の第１実施形態について添付図面を参照して説明する。
図１を参照すると、本実施例は、プリプロセッサ１０と、アセンブラ実行装置２０と、データ処理装置３０を備える。
【００２７】
プリプロセッサ１０は、二重化コードを挿入するための規則を規定した二重化パターンファイル１１を参照しながら、アセンブリ言語で記述されたソースプログラム１を解析し、二重化コードを挿入して中間ファイル２を出力する。
アセンブラ実行装置２０は、中間ファイル２を入力としてアセンブル処理を行い、実行形式プログラム３を出力する。
データ処理装置３０は、ＶＬＩＷ（Ｖｅｒｙ  Ｌｏｎｇ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｗｏｒｄ）プロセッサを搭載した、プログラム制御により動作する一般的なコンピュータ装置である。ここでは、データ処理装置３０は実行形式プログラム３を実行する。
【００２８】
ここで、図１に、実行形式プログラム３を実行した際のデータ処理装置３０の動作をフローチャートで示す。
（１）ステップＳ３１
ステップＳ３１にてオリジナルコードを実行する。なお、オリジナルコードは複数回実行されており、この後もオリジナルコードの実行を続行する。ここでは例として、オリジナルコードの１回目の実行を示す。但し、実際には、上記の例に限定されるものではない。
（２）ステップＳ３２
ステップＳ３２にて二重化コードを実行する。
（３）ステップＳ３３
次に、ステップＳ３３にて、ステップＳ３１でオリジナルコードを実行した結果と、ステップＳ３２で二重化コードを実行した結果とについて、それぞれの結果を比較する。
（４）ステップＳ３４
ステップＳ３４にて比較結果の一致をチェックする。
（５）ステップＳ３５
ステップＳ３４にて比較結果が不一致の場合、障害処理へ移入する。
（６）ステップＳ３６
ステップＳ３４にて比較結果が一致していた場合、プログラムの実行を続行する。
【００２９】
なお、本発明は、中央処理装置（図示されず）と、記憶装置（図示されず）とを具備するコンピュータ上において実施しても良い。この時、中央処理装置が、プリプロセッサ１０、アセンブラ実行装置２０、及びデータ処理装置３０として機能する。また、記憶装置は、ソースプログラム１、中間ファイル２、実行形式プログラム３、及び二重化パターンファイル１１を記憶する。
【００３０】
図２は二重化パターンファイル１１の例である。
二重化パターンファイル１１は、“ＴＹＰＥ”行に二重化コードのサイクル数を規定する数字及び二重化対象命令を記述する。その下に二重化コード、比較命令、分岐命令を記述する。前記一連の形式にて、全ての二重化対象命令について規定する。
【００３１】
二重化パターンファイルは、二重化対象命令と二重化コードを規定するファイルであれば必ずしもこの形式でなくても良い。またファイルでなくてもよく、プリプロセッサ１０内で保持するデータとしても良い。
【００３２】
プリプロセッサ１０は、二重化コードを挿入するため、以下のアルゴリズムを備えている。
ソースプログラム１内のある命令を命令Ａとすると、命令Ａと同時に実行される命令が存在しないことを確認する。次に、二重化パターンファイル１１内をサーチし、命令Ａが二重化対象命令であることを確認する。次に、二重化パターンファイル１１内の命令Ａの二重化コードサイクル数以上の連続した空き命令があることを確認する。次に、前記の連続した空きエリア内に他のエリアからの分岐による移入がないことを確認する。前記条件を全て満たした場合、二重化コードを挿入可能であると判断しソースプログラム１の該当箇所に二重化パターンファイル１１で規定している二重化コードを挿入し、中間ファイル２として出力する。以上の処理をソースプログラム１内の全ての命令について行う。
【００３３】
次に、図面を参照して、本発明の第１実施形態の動作について詳細に説明する。
図３Ａ，図３Ｂはプリプロセッサ１０の具体的な動作を定義したフローチャートである。
（１）ステップＳ１０１
プリプロセッサ１０は、ソースプログラム１内の命令コードを指すポインタを備え、ステップＳ１０１で初期化する。
（２）ステップＳ１０２
ステップＳ１０２ではポインタで指されたコードＡを取り出す。ステップＳ１０２はソースプログラム１の全ての命令について処理を行うためのループ処理の先頭である。
（３）ステップＳ１０３
ステップＳ１０３では次の命令コードを指すためにポインタを進める。
（４）ステップＳ１０４
ステップＳ１０２でコードＡが取り出せない場合、ステップＳ１０４にてソースプログラム１の終了と判断する。
（５）ステップＳ１０５
ソースプログラム１の終了と判断した場合、ステップＳ１０５にて中間ファイル２を出力し、プリプロセッサ１０を終了する。
（６）ステップＳ１０６
ステップＳ１０２でのコードＡの取り出し後、コードＡと同一サイクルで実行されるコードＢの有無をチェックする。
（７）ステップＳ１０７
コードＢが存在する場合、ステップＳ１０２へ戻り、ステップＳ１０２からの処理を繰り返す。
（８）ステップＳ１０８
コードＢが存在しない場合、つまりコードに空きがある場合、ステップＳ１０８にてコードＡが二重化対象命令かチェックする。二重化パターンファイル１１の“ＴＹＰＥ”行をサーチしコードＡが存在した場合、二重化対象命令であるかチェックし、コードＡが二重化対象命令でない場合は、ステップＳ１０２へ戻る。
（９）ステップＳ１０９
コードＡが二重化対象命令である場合は、ステップＳ１０９にて二重化コードサイクル数を取得する。
（１０）ステップＳ１１０
ステップＳ１１０ではコードＡ実行サイクルからステップＳ１０９で取得したサイクル数までの各サイクルにおいてコードの空きの有無をチェックする。
（１１）ステップＳ１１１
コードの空きがないサイクルが存在した場合、ステップＳ１０２へ戻る。
（１２）ステップＳ１１２
全てのサイクルにコードの空きがあった場合、ステップＳ１１２にてコードＡ実行サイクルからステップＳ１０９で取得したサイクル数までの各サイクルに、他のエリアからの分岐による移入の有無をチェックする。これは二重化コードの途中に分岐した場合、二重化チェック処理が正常動作しないためである。
（１３）ステップＳ１１３
他のエリアからの分岐による移入が存在する場合、ステップＳ１０２へ戻る。
（１４）ステップＳ１１４
他のエリアからの分岐による移入が存在しない場合、ステップＳ１１４にてコードＡ実行サイクルからステップＳ１０９で取得したサイクル数までの各サイクルに二重化コードを挿入する。その後、ステップＳ１０２へ戻って処理を繰り返し、ソースプログラム１の全命令について二重化コードの挿入処理を行う。
【００３４】
図２によると、二重化コードは二重化パターンファイル１１で規定しており、二重化対象命令、二重化コードのサイクル数、二重化コードを一つの組として記述する。＃Ｓ１＃、＃Ｓ２＃、＃Ｄ１＃の表記は、二重化コード挿入時にコードＡで参照しているレジスタや定数、演算結果を格納するレジスタを置換するための定義である。
【００３５】
図４は二重化コードの挿入前後の例である。
図４では、先頭サイクル１のａｄｄ命令が二重化パターンファイル１１内に存在し、二重化コードサイクル数が３であるため、先頭から３サイクル分にコードの空きがあればよく、更に、連続した３サイクルの間に分岐で移入するケースはないと仮定する。
この時、プリプロセッサ１０は、＃Ｓ１＃、＃Ｓ２＃、＃Ｄ１＃の定義をサイクル１のａｄｄ命令で使用しているレジスタＡ，Ｂ，Ｃにそれぞれ置換し、各サイクルの演算器２側に二重化コードを挿入する。
【００３６】
プリプロセッサ１０が出力した中間ファイル２は、アセンブラ実行装置２０により実行形式プログラム３に変換される。
データ処理装置３０で実行形式プログラム３を実行すると、ステップＳ３１，３２にてそれぞれの演算器でオリジナルコード及び二重化コードを実行する。次に、ステップＳ３３にてそれぞれの演算結果の比較を行い、演算結果が不一致の場合、故障と判断し障害処理３５へ分岐し、演算結果が一致した場合は処理を続行する。
【００３７】
次に、本発明の第２実施形態の構成について図面を参照して詳細に説明する。
第１実施形態との相違点は、プリプロセッサは二重化コードを挿入できない箇所に、ランダムデータによる演算コードを挿入することであり、ランダムコードを挿入するための規則を規定したランダムパターンファイルを参照する。すなわち、プリプロセッサ１０は、二重化コードを挿入できない箇所では、二重化パターンファイル１１の代わりにランダムパターンファイルを参照する。従って、ランダムパターンファイルは、二重化パターンファイル１１の一種であるとみなすことができる。
【００３８】
図５はランダムパターンファイルの一例である。二重化パターンコードと同様な形式であるが、ランダムコード対象命令、ランダムコードサイクル数、ランダムデータによる演算コードを規定している。
【００３９】
図６Ａ，図６Ｂは、二重化パターンを適用できない場合に、ランダムパターンファイルの命令を挿入する動作を説明したフローチャートである。
（１）ステップＳ２０１
ステップＳ２０１からＳ２０７は、第１実施形態のステップＳ１０１〜Ｓ１０７と同様である。
プリプロセッサ１０は、ソースプログラム１内の命令コードを指すポインタを備え、ステップＳ２０１で初期化する。
（２）ステップＳ２０２
ステップＳ２０２ではポインタで指されたコードＡを取り出す。ステップＳ２０２はソースプログラム１の全ての命令について処理を行うためのループ処理の先頭である。
（３）ステップＳ２０３
ステップＳ２０３では次の命令コードを指すためにポインタを進める。
（４）ステップＳ２０４
ステップＳ２０２でコードＡが取り出せない場合、ステップＳ２０４にてソースプログラム１の終了と判断する。
（５）ステップＳ２０５
ソースプログラム１の終了と判断した場合、ステップＳ２０５にて中間ファイル２を出力し、プリプロセッサ１０を終了する。
（６）ステップＳ２０６
ステップＳ２０２でのコードＡの取り出し後、コードＡと同一サイクルで実行されるコードＢの有無をチェックする。
（７）ステップＳ２０７
コードＢが存在する場合、ステップＳ２０２へ戻り、ステップＳ２０２からの処理を繰り返す。
（８）ステップＳ２０８
コードＢが存在しない場合、つまりコードに空きがある場合、ステップＳ２０８にてコードＡが二重化対象命令かチェックする。二重化パターンファイル１１の“ＴＹＰＥ”行をサーチしコードＡが存在した場合、二重化対象命令であるかチェックする。
（８−２）ステップＳ２０８−２
ステップＳ２０８にてコードＡが二重化対象外命令であった時、ステップＳ２０８−２にてランダムパターンファイルに定義されている命令を選択し、命令のランダムコードサイクル数を取得する。命令を選択する基準は、命令毎の二重化度を算出し、あるいはプログラムのパス毎の実行頻度を考慮して二重化割合の低い命令を選択する。あるいはファイルの先頭から順に選択していっても良いし、ランダムに選択しても良い。
なお、命令についての二重化度は、以下の式で算出する。
（二重化コード挿入前のソースコードに対する命令の出現回数）÷（二重化コード挿入後のソースコードに対する命令の出現回数）
この式により、全ての二重化対象命令について算出する。
（９）ステップＳ２０９
ステップＳ２０９からステップＳ２１３は、第１実施形態のステップＳ１０９からステップＳ１１３と同様である。
コードＡが二重化対象命令である場合、ステップＳ２０９にて二重化コードサイクル数を取得する。
（１０）ステップＳ２１０
ステップＳ２１０ではコードＡ実行サイクルからステップＳ２０９で取得したサイクル数までの各サイクルにおいてコードの空きの有無をチェックする。
（１１）ステップＳ２１１
コードの空きがないサイクルが存在した場合、ステップＳ２０２へ戻る。
（１２）ステップＳ２１２
全てのサイクルにコードの空きがあった場合、ステップＳ２１２にてコードＡ実行サイクルからステップＳ２０９で取得したサイクル数までの各サイクルに、他のエリアからの分岐による移入の有無をチェックする。これは二重化コードの途中に分岐した場合、二重化チェック処理が正常動作しないためである。
（１３）ステップＳ２１３
他のエリアからの分岐による移入が存在する場合、ステップＳ２０２へ戻る。
（１４）ステップＳ２１４
他のエリアからの分岐による移入が存在しない場合、ステップＳ２１４にてコードＡ実行サイクルからステップＳ２０９で取得したサイクル数までの各サイクルにランダムコードを挿入する。その後、ステップＳ２０２へ戻って処理を繰り返し、ソースプログラム１の全命令について二重化コードあるいはランダムコードの挿入処理を行う。
【００４０】
図７はランダムコードの挿入前後の例である。
図７では、先頭サイクル１のｌｏａｄ命令が二重化パターンファイル１１内に存在しないため、ランダムパターンファイルからａｎｄｃｍ命令を決定した。ランダムコードサイクル数が３であるため、先頭から３サイクル分の空きがあればよく、更に連続した３サイクルの間に移入するケースはないと仮定する。
この時、プリプロセッサ１０は＃ＲＡＮＤ＃記述部についてランダムデータを生成して置換し、各サイクルの演算器２側にランダムコードを挿入する。
また、ステップＳ２１０では、二重化命令を挿入する際のプロセッサ制約等により同一サイクルに命令を挿入できない等の都合により、先頭サイクルを前後にずらしても良い。
更に、ステップＳ２１２の条件が満たされていれば連続した空きサイクルでなく、サイクル間が離れていても良い。
【００４１】
以上のように、本発明は、一般的なＶＬＩＷプロセッサ上でチェックを行うことを前提としており、チェックのための専用回路を必要とせず、故障の検出を実現する。また、プログラムの性能を低下させないように二重化演算を挿入するため、空きサイクル数を考慮して二重化演算パターンを挿入する。
【００４２】
本発明では、プリプロセッサ１０が、二重化コードを挿入するための規則を規定した二重化パターンファイル１１を参照しながら、アセンブリ言語で記述されたソースプログラム１を解析し、二重化コードを挿入して中間ファイル２を出力する。
二重化パターンファイル１１は、図２に示すように、二重化の対象とする命令（二重化対象命令）と、二重化コードを挿入するのに必要なサイクル数の二重化コードサイクル数と、二重化コードを一つの組として、全ての二重化可能な命令について規定するファイルである。
【００４３】
プリプロセッサ１０が二重化コードを挿入するためのアルゴリズムは次の通りである。
ソースプログラム１内のある命令を命令Ａとすると、命令Ａと同時に実行される命令が存在しないことを確認する。次に、二重化パターンファイル１１内をサーチし、命令Ａが二重化対象命令であることを確認する。次に、二重化パターンファイル１１内の命令Ａの二重化コードサイクル数以上の連続した空き命令があることを確認する。次に、前記の連続した空きエリア内に他のエリアからの分岐による移入がないことを確認する。前記条件を全て満たした場合、二重化コードを挿入可能であると判断しソースプログラム１の該当箇所に二重化パターンファイル１１で規定している二重化コードを挿入し、中間ファイル２として出力する。以上の処理をソースプログラム１内の全ての命令について行う。
【００４４】
アセンブラ実行装置２０では前記中間ファイル２をアセンブルし、実行形式プログラム３を生成する。アセンブラ実行装置２０により生成された実行形式プログラム３を、ＶＬＩＷプロセッサを搭載した一般的なコンピュータシステムであるデータ処理装置３０で実行する。
【００４５】
本発明の特徴について以下に説明する。
（１）アセンブリ言語で記述したプログラムの性能を低下させずに、プログラム内の空き命令を見つけて自動的に演算を二重化するプリプロセッサを備える。
（２）プリプロセッサが二重化パターン挿入のために参照する二重化パターンを有する
（３）二重化できない場合は、二重化度を算出し、二重化度が低い命令についてランダムパターンを生成し、性能を低下させずにプログラムに挿入するプリプロセッサを備える。
（４）プリプロセッサがランダムパターン挿入のために参照するランダムパターンを有する。
【００４６】
本発明によれば、高性能を要求されるプログラムにおいてデータインティグリティ（Ｄａｔａ  Ｉｎｔｅｇｒｉｔｙ）を高めることも必要なミッションクリティカルなプログラムの開発といった用途に適用できる。
また、エミュレーションプログラムに本発明を適用することにより、エミュレーションされる側のプログラムを二重化しなくてもデータインティグリティ向上効果がある。
【図面の簡単な説明】
【００４７】
【図１】図１は、プログラムアセンブルフローチャート及びプログラム実行フローチャートである。
【図２】図２は、二重化パターンファイルの例を示す図である。
【図３Ａ】図３Ａは、プリプロセッサの動作を示すフローチャートである。
【図３Ｂ】図３Ｂは、図３Ａの続きである。
【図４】図４は、二重化コード挿入例を示す図である。
【図５】図５は、ランダムパターンファイル例を示す図である。
【図６Ａ】図６Ａは、ランダムコードのケースにおけるプリプロセッサの動作を示すフローチャートである。
【図６Ｂ】図６Ｂは、図６Ａの続きである。
【図７】図７は、ランダムコード挿入例を示す図である。
【符号の説明】
【００４８】
１…  ソースプログラム
２…  中間ファイル
３…  実行形式プログラム
１０…  プリプロセッサ
１１…  二重化パターンファイル
２０…  アセンブラ実行装置
３０…  データ処理装置
【図１】
2007133536.tif 000003
【図２】
2007133536.tif 000004
【図３Ａ】
2007133536.tif 000005
【図３Ｂ】
2007133536.tif 000006
【図４】
2007133536.tif 000007
【図５】
2007133536.tif 000008
【図６Ａ】
2007133536.tif 000009
【図６Ｂ】
2007133536.tif 000010
【図７】
2007133536.tif 000011