以下に、本願の開示するコンピュータ試験方法、コンピュータ試験装置およびコンピュータ試験プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
図3は、実施例2にかかるコンピュータ試験装置の概要構成を示す概要構成図である。図3に示したコンピュータ10は、CPU(Central Processing Unit)11、メインメモリ12、ROM(Read Only Memory)13、バス15を有する。CPU11、メインメモリ12、ROM13はバス15に接続され、バス15を介してデータの授受を行なう。
CPU11は、メインメモリ12を主記憶装置として動作する演算装置であり、内部に命令制御部21、演算部22、レジスタ群23、バスインタフェース24を有する。命令制御部21は、命令のデコードと処理順序制御を行なう処理部である。具体的には命令制御部21は、CPU11が処理する命令を読み込み、解釈し、解釈結果を出力する。演算部22は、演算を行なう処理部である。具体的には演算部22は、命令の対象となるデータを読み込み、命令制御部21によって解釈された命令に従って演算し、演算結果を出力する。
レジスタ群23は、演算部22による演算結果など各種情報の保持を行なうレジスタセットを複数有する。バスインタフェース24は、命令制御部21および演算部22とバス15との間に介在するインタフェースである。
命令制御部21は、メインメモリ12に展開されたプログラムから命令を読み出して実行する。命令制御部21は、実行結果をメインメモリ12に戻すか、もしくはレジスタ群23に格納する。演算部22は、命令制御部21に指示された演算の入力値をメインメモリ12もしくはレジスタ群23から読み出して演算を実行し、実行結果をメインメモリ12に戻すか、もしくはレジスタ群23に格納する。
ROM13は、例えばフラッシュメモリであり、CPU11が実行するプログラムなどを格納する。ROM13に試験プログラム31を格納し、CPU11が試験プログラム31を実行することで、コンピュータ10は自身の動作を試験するコンピュータ試験装置として機能する。
また、コンピュータ10は、図示しない任意のインタフェースを介して外部装置と接続してもよい。コンピュータ10は、外部装置から試験プログラムを受信して実行することで自身の動作を試験するコンピュータ試験装置として機能することができる。
図4は、試験プログラムを実行するコンピュータの説明図である。CPU11が試験プログラム31を実行することで、CPU11は命令生成部41および試験実行部42の機能を実現する。また、CPU11は試験プログラム31を実行する場合に、メインメモリ12を記憶部43として使用する。なお、CPU11は、メインメモリ12に限らず任意の記憶媒体を記憶部43として使用することができる。また、CPU11は複数の記憶媒体にデータを分散させて記憶部43として使用してもよい。
命令生成部41は、シード値設定部51、ランダムデータ生成部52、試験用命令列生成部53を有する。シード値設定部51は、試験用命令列の乱数部分の生成に使用するシード値を設定する。シード値設定部51が新規にシード値を定めた場合、シード値設定部51は新規に定めたシード値を記憶部43にシード値データ61として格納する。また、予め定められたシード値を用いる場合、シード値設定部51は、記憶部43からシード値データ61を読み出してシード値に設定する。
ランダムデータ生成部52は、シード値設定部51が設定したシード値を初期値として擬似ランダム列を生成し、擬似ランダム列から試験用命令と同じ長さのデータを順次切り出してランダムデータを生成する。
試験用命令列生成部53は、ランダムデータ生成部52が生成したランダムデータから試験用命令列を生成し、試験用命令列データ66として記憶部43に格納する。ランダムデータからの試験用命令列の生成には、命令定義構造体テーブル62、コンフリクトカウンタ63、コンフリクトレジスタテーブル64を使用する。ランダムデータからの試験用命令列生成の詳細については後述する。
試験実行部42は、命令生成部41が生成した試験用命令列データ66を用いて試験を行なう処理部であり、初期値設定部54、命令列実行部55、実行結果退避部56、結果比較部57を有する。
初期値設定部54は、記憶部43からレジスタ初期値データ65を読み出してレジスタにセットする。すなわち、記憶部43は、レジスタ初期値データ65を格納するレジスタ初期値データ格納部として機能する。
命令列実行部55は、初期値設定部54による初期値のセットの後、記憶部43から試験用命令列データ66を読み出して実行する。実行結果退避部56は、命令列実行部55の実行結果を実行結果データ67として記憶部43に登録する。その後、命令列実行部55は、再度試験用命令列データ66を読み出して実行する。結果比較部57は、命令列実行部55の二度目の実行結果と、実行結果データ67とを比較して評価を行なう。すなわち、命令列実行部55と結果比較部57とは、協働して評価処理部として機能する。
例えば、命令列実行部55の二度の実行結果が一致しなければ、結果比較部57は、試験用命令列の実行中に何らかの異常が発生したと評価する。試験用命令列の実行中に生じる異常の例としては動作の遅れがある。試験用命令列の実行中に動作の遅れが生じると、命令の処理順序が乱れ、データに異常が発生する。このデータの異常によって試験用命令列を実行するごとに結果が異なる値となるので、結果比較部57は二度の実行結果を比較することで異常の有無を評価することができるのである。なお、命令の動作の遅れは、動作チェック部をさらに設けて試験用命令列の実行中の状態を監視することでも検知することができる。
次に、例外処理による問題点について説明する。図5は、例外処理の説明図である。図5に示した試験用命令列を実行すると、CPU11は、まず試験用命令op11を実行し、次に試験用命令op12、試験用命令op13と順次命令を実行する。
試験用命令列は、試験用命令op13の実行後、試験用命令op14を実行することを定めている。しかし、試験用命令op13の実行の結果として例外割込みが発生すると、CPU11は例外処理に移行する。
例外処理に移行すると、CPU11は例外処理用命令opx−1,例外処理用命令opx−2と順次命令を実行する。そして、最後の例外処理用命令opx−endを実行し、例外処理が終了すると、CPU11は試験用命令列の処理に戻る。
図5に示した例では、試験用命令op13で例外割込みが発生しているので、CPU11は、例外処理の終了後に試験用命令op14、試験用命令op15を実行し、試験用命令列の処理を進める。
このように、試験用命令列の実行中に例外割込みが発生すると、CPU11は例外処理のための命令を実行する。例外処理にかかる命令の実行は、試験の中では意図されていない。このため、例外割込みが発生して試験用命令列の動作から外れると、CPU11は、試験用命令列で意図していた状態を維持できない場合がある。
たとえば、高負荷試験では、CPUのパイプラインに命令を連続して投入して高負荷状態を実現し、CPUやコンピュータの動作を検証する。この高負荷試験用に生成した試験用命令列をコンピュータが実行している途中で例外割込みが発生すると、高負荷状態が解消してしまう場合がある。
また、コンフリクト試験では、コンピュータは先行する命令の出力レジスタを入力レジスタとして指定した命令をパイプラインに投入してコンフリクト状態を実現し、動作を検証する。このコンフリクト試験用に生成した試験用命令列をコンピュータが実行している途中に例外割込みが発生すると、意図したコンフリクト状態が発生しない場合がある。この問題に対して本実施例2にかかるコンピュータ10は、実施例1と同様に、レジスタを入出力兼用レジスタと入力専用レジスタに分け、例外割り込みが生じる可能性のある命令については入力値に入力専用レジスタを使用することで例外割り込みの発生を回避する。
この例外発生の可能性のある命令と例外発生の回避について説明する。図6は、例外割込みが発生する可能性のある命令種と例外発生の回避条件の例を示す説明図である。命令種が浮動小数点演算である場合は、コンピュータは入力値によっては例外割込みを発生する。具体的には、積算などの結果としてオーバーフローが起きる場合や、演算結果が非数となる場合などに、コンピュータは例外割込みを発生する。浮動小数点演算での例外割込みの発生を回避するためには、コンピュータが演算に使用する入力値の少なくとも一つに、他の入力値がどのような値であっても例外割り込みの発生を防止する値を用いればよい。具体的には、1、もしくは1に近い値、例えば0.9〜1.1の範囲の値を浮動小数点演算の一方の入力値として用いる。この入力値の範囲は、浮動小数点演算の他の入力値がどのような値であっても演算の結果として例外割り込みが発生しない範囲で任意に設定可能である。
また、命令種が固定小数点除算である場合は、コンピュータは除数が0である場合に例外割込みを発生する。コンピュータが固定小数点除算での例外割込みの発生を回避するためには、除数に0以外の値を用いればよい。
この例外発生を回避するため、本実施例2にかかるコンピュータ10は、レジスタを入出力兼用レジスタと入力専用レジスタに分け、入力専用レジスタに対して例外処理を伴わない、言い換えると例外割込みが発生する可能性のない初期値を設定する。図7は、レジスタ群23における入出力兼用レジスタと入力専用レジスタについての説明図である。レジスタ群23は、浮動小数点演算に用いる浮動小数点レジスタセット71と固定小数点演算に用いる汎用レジスタセット72とを有する。
浮動小数点レジスタセット71は、32個のレジスタを有する。浮動小数点レジスタセット71が有する32個のレジスタのレジスタ番号はfr00〜31である。これらのレジスタ番号はビット列で示すと「00000」〜「11111」である。図7の例では、ビット列で示したレジスタ番号のうち、上位2ビット目が「0」であるレジスタを入力専用レジスタとし、上位2ビット目が「1」であるレジスタを入出力兼用レジスタとしている。図7において、ハッチングを付したレジスタが入出力兼用レジスタを、ハッチングを付していないレジスタが入力専用レジスタを、それぞれ示す。
したがって、「00000」〜「11111」のうち、入力専用レジスタは「00000」〜「00111」と「10000」〜「10111」の16個、入出力兼用レジスタは「01000」〜「01111」と「11000」〜「11111」の16個となる。
浮動小数点レジスタセット71の各レジスタのレジスタ番号「00000」〜「11111」をfr00〜31として表記すると、入力専用レジスタはfr00〜07とfr16〜23、入出力兼用レジスタはfr08〜15とfr24〜31である。
コンピュータ10が浮動小数点レジスタセット71に初期値をセットする際には、入力専用レジスタには1あるいは1に近い値をセットする。コンピュータ10は、入出力兼用レジスタの初期値には乱数など任意の値をセットすることができる。
汎用レジスタセット72は、32個のレジスタを有する。汎用レジスタセット72が有する32個のレジスタのレジスタ番号はgr00〜31である。各レジスタ番号gr00〜31は、ビット列で示すと「00000」〜「11111」である。図7の例では、ビット列で示したレジスタ番号のうち、上位2ビット目が「0」であるレジスタを入力専用レジスタとし、上位2ビット目が「1」であるレジスタを入出力兼用レジスタとしている。浮動小数点レジスタセット71と同様、汎用レジスタセット72において、ハッチングを付したレジスタが入出力兼用レジスタを、ハッチングを付していないレジスタが入力専用レジスタをそれぞれ示す。
したがって、「00000」〜「11111」のうち、入力専用レジスタは「00000」〜「00111」と「10000」〜「10111」の16個、入出力兼用レジスタは「01000」〜「01111」と「11000」〜「11111」の16個となる。
この汎用レジスタセット72のレジスタ番号「00000」〜「11111」をgr00〜31として表記すると、入力専用レジスタはgr00〜07とgr16〜23、入出力兼用レジスタはgr08〜15とgr24〜31となる。
コンピュータ10が汎用レジスタセット72に初期値をセットする際には、入力専用レジスタには0以外の値をセットする。コンピュータ10は、入出力兼用レジスタの初期値には乱数など任意の値をセットすることができる。
次に、コンピュータ10の試験用命令列生成部53による試験用命令列の生成について説明する。試験用命令列を構成する命令は、命令の種別を示すオペコード、入力レジスタ、出力レジスタを有する。コンピュータ10は、試験用命令の入力レジスタと出力レジスタとにランダムな値を設定する。
コンピュータ10が試験用命令を生成する場合は、ランダムデータから入力レジスタ分と出力レジスタ分のデータを取り出して生成する命令に挿入してもよいが、命令と同じ長さの一つのランダムデータから入力レジスタと出力レジスタの値がランダムな命令を得る方法も知られている。
図8は、一つのランダムデータからの試験用命令の生成を説明する図である。図8に示した例では、コンピュータ10は、シード値に基づいて生成した擬似ランダム列から、生成対象の命令全体と同じビット数のランダムデータD0を取り出して試験用命令の生成に使用する。コンピュータ10は、ランダムデータD0とANDデータD1との論理積(AND)をとり、さらにORデータD2との論理和(OR)を取ることで、試験用命令D3を得る。
ANDデータD1とORデータD2は、それぞれビット数が命令全体と同じである。また、ANDデータD1とORデータD2は、命令の種別ごとに定められる。図8の例では、ANDデータD1は、命令のオペコードに対応する範囲のビットの値が全て0である。一方、図8ではORデータD2は、命令のオペコードに対応する範囲のビットの値は生成する試験用命令D3のオペコードと同一の値である。
したがって、コンピュータ10は、ランダムデータD0とANDデータD1の論理積をとり、論理積結果とORデータD2との論理和を取ることで、オペコードに対応する範囲について、ランダムデータD0の対応する領域の値に関わらず、ORデータD2の値を残すことができる。
また、図8の例ではANDデータD1は、生成する試験用命令D3の出力レジスタと入力レジスタに対応する範囲のビットの値が全て1である。一方、ORデータD2は、生成する試験用命令D3の命令の出力レジスタと入力レジスタに対応する範囲のビットの値が全て0である。
したがって、コンピュータ10は、ランダムデータD0とANDデータD1の論理積をとり、論理積結果とORデータD2との論理和を取ることで、出力レジスタと入力レジスタに対応する範囲について、ランダムデータD0の対応する領域の値をそのまま残すことができる。
このように、命令種ごとにANDデータD1とORデータD2を用意し、ORデータD2のオペコード対応部分を目的のオペコードに合わせれば、コンピュータ10は目的のオペコードを持ち、入力レジスタと出力レジスタがランダムに設定された試験用命令D3を得ることができる。
ここで、入力レジスタと出力レジスタの値を全てランダムに定めると、コンピュータ10は入力レジスタと出力レジスタのそれぞれについて、レジスタセット全体からいずれか一つのレジスタを指定することになる。コンピュータ10は、図7を参照して説明したように、レジスタ番号の上位2ビット目の値によって入力専用レジスタと入出力兼用レジスタを分ける。このため、コンピュータ10は、ANDデータD1とORデータD2とのうち入力レジスタと出力レジスタとに対応する範囲の値を図9のように定める。
図9は、レジスタ番号の制御についての説明図である。入力レジスタや出力レジスタに対応する範囲の値が、ANDデータD1のビットがオール1であり、ORデータD2のビットがオール0であれば、ランダムデータD0の入力レジスタ/出力レジスタに対応する範囲の値がそのまま残る。このため、コンピュータ10は、レジスタセット全体から各レジスタを選択することとなる。
これに対し、入力レジスタや出力レジスタに対応する範囲の値が、ANDデータD1の2ビット目が0、他のビットが1であり、ORデータD2がオール0であれば、生成される試験用命令D3のレジスタ番号の上位2ビット目は常に0となる。この結果、ANDデータD1とORデータD2との入出力レジスタに対応する値を上記のように設定することによって、コンピュータ10は、入力専用レジスタのいずれかを選択することとなる。
また、入力レジスタや出力レジスタに対応する範囲の値が、ORデータD2の2ビット目が1、他のビットが0であれば、生成される試験用命令D3のレジスタ番号の上位2ビット目は常に1となる。この結果、コンピュータ10は、入出力兼用レジスタのいずれかを選択することとなる。なお、入力レジスタや出力レジスタに対応する範囲について、ORデータD2の上位2ビット目を1とした場合は、ANDデータD1の2ビット目は0であっても1であってもよい。
この試験用命令の生成についてfdiv命令とfand命令の生成を例示する。図10は、fdiv命令を生成する具体例の説明図である。浮動小数点の除算であるfdiv命令は、入力値によっては例外割り込みを発生させるので、コンピュータ10は、fdiv命令の第1入力レジスタと第2入力レジスタの双方を入力専用レジスタから選択する。また、コンピュータ10は、出力レジスタについては、入出力兼用レジスタから選択する。
図10に示した例では、ランダムデータD0(図10「乱数」)のうち、第1入力レジスタに対応する範囲の乱数は「11011」である。この値とANDデータD1の値「10111」との論理積をとると「10011」となる。論理積の結果として得られた値とORデータD2の値「00000」との論理和をとると「10011」となる。この値は浮動小数点レジスタセット71のレジスタfr19に対応する。
同様に、図10に示した例では、ランダムデータD0のうち、第2入力レジスタに対応する範囲の乱数は「01101」である。この値とANDデータD1の値「10111」との論理積をとると「00101」となる。論理積の結果として得られた値とORデータD2の値「00000」との論理和をとると「00101」となる。この値は浮動小数点レジスタセット71のレジスタfr05に対応する。
また、図10に示した例では、ランダムデータD0のうち、出力レジスタに対応する範囲の乱数は「00110」である。この値とANDデータD1の値「10111」との論理積をとると「00110」となる。論理積の結果として得られた値とORデータD2の値「01000」との論理和をとると「01110」となる。この値は浮動小数点レジスタセット71のレジスタfr14に対応する。
したがって図10に示した例では、命令「fdiv,fr19,fr05,fr14」が生成される。既に述べたように、入力専用レジスタのレジスタ番号はfr00〜07とfr16〜23、入出力兼用レジスタのレジスタ番号はfr08〜15とfr24〜31である。命令「fdiv,fr19,fr05,fr14」のうち入力レジスタfr19,fr05は入力専用レジスタであり、出力レジスタfr14は入出力兼用レジスタである。
図11は、fand命令を生成する具体例の説明図である。浮動小数点の論理積であるfand命令は、入力値によらず例外割り込みを発生させない。このため、コンピュータ10は、fand命令の第1入力レジスタと第2入力レジスタの双方をレジスタセット全体から選択することができる。また、コンピュータ10は、出力レジスタについては入出力兼用レジスタから選択する。
図11に示した例では、ランダムデータD0(図11「乱数」)のうち、第1入力レジスタに対応する範囲の乱数は「10011」である。この値とANDデータD1の値「11111」との論理積をとると「10011」となる。論理積の結果として得られた値とORデータD2の値「00000」との論理和をとると「10011」となる。この値は浮動小数点レジスタセット71のレジスタ番号fr19に対応する。
同様に、図11に示した例では、ランダムデータD0のうち、第2入力レジスタに対応する範囲の乱数は「11011」である。この値とANDデータD1の値「11111」との論理積をとると「11011」となる。論理積の結果として得られた値とORデータD2の値「00000」との論理和をとると「11011」となる。この値は浮動小数点レジスタセット71のレジスタ番号fr27に対応する。
また、図11に示した例では、ランダムデータD0のうち、出力レジスタに対応する範囲の乱数は「00111」である。この値とANDデータD1の値「10111」との論理積をとると「00111」となる。論理積の結果として得られた値とORデータD2の値「01000」との論理和をとると「01111」となる。この値は浮動小数点レジスタセット71のレジスタ番号fr15に対応する。
したがって図11に示した例では、命令として「fand,fr19,fr27,fr15」が生成される。既に述べたように、入力専用レジスタのレジスタ番号はfr00〜07とfr16〜23、入出力兼用レジスタのレジスタ番号はfr08〜15とfr24〜31である。命令「fand,fr19,fr27,fr15」のうち入力レジスタfr19は入力専用レジスタである。また、入力レジスタfr27は入出力兼用レジスタである。同様に出力レジスタfr14は入出力兼用レジスタである。
このように一つのランダムデータに対して、ANDデータとの論理積と、論理積結果とORデータとの論理和を用いて試験用命令を生成する場合に、ANDデータとORデータのレジスタ指定部の値を適宜設定することで、命令の入力レジスタと出力レジスタの指定先を簡易に設定することができる。
コンピュータ10が高負荷試験を行なう場合には、コンピュータ10は、このように入力レジスタと出力レジスタの指定先を設定して生成した命令をパイプラインに順次投入することで、高負荷状態を実現して試験を行なう。
一方、コンピュータ10がコンフリクト試験を行なう場合には、コンピュータ10は、このように入力レジスタと出力レジスタの指定先を設定し、さらに命令間にコンフリクトが発生するよう設定した試験用命令列を用いて試験を行なう。
図12は、コンフリクトの説明図である。図12に示した命令op21は、オペコードが浮動小数点の加算を示すfadd、第1入力レジスタがfr10、第2入力レジスタがfr12、出力レジスタがfr14である。また、命令op21の後続の命令op22は、オペコードが浮動小数点の減算を示すfsubd、第1入力レジスタがfr14、第2入力レジスタがfr16、出力レジスタがfr18である。
ここで、命令op21の出力レジスタであるfr14は、後続の命令op22の入力レジスタとして使用されている。このように、ある命令の出力レジスタに割り振られたレジスタが後続の命令の入力レジスタに使用されることをコンフリクトといい、この状態をコンフリクト状態、対象となったレジスタをコンフリクトレジスタという。
通常、コンピュータは、コンフリクト状態に無い命令列はCPUのパイプラインに連続的に投入する。しかし、命令列にコンフリクト状態が存在すると、コンピュータはコンフリクトの原因となった命令が終了するまで、コンフリクト状態である後続の命令の処理を保留する。コンピュータは、コンフリクト状態の命令を保留している間も、コンフリクト状態に無い後続の命令はパイプラインに流し続ける。このため、コンピュータは命令間の順序関係を保証するため複雑な制御を行なう。このコンフリクトの制御の状態を試験する場合、コンピュータは、様々なコンフリクト状態が組み込まれた試験用命令列を実行する。
図13は、試験用命令列におけるコンフリクトの設定についての説明図である。図13に示した命令op31と命令op32は、それぞれオペコード、第1入力レジスタ、第2入力レジスタ、出力レジスタを有する。コンピュータ10は、試験用命令列を構成する命令op31と命令op32の入力レジスタおよび出力レジスタにランダムな値を設定する。
コンフリクトレジスタテーブル64は、コンフリクトレジスタを登録するレジスタテーブルである。コンフリクトカウンタ63は、コンフリクトレジスタテーブル64へのレジスタ番号の登録数を管理するカウンタである。
コンピュータ10は、先行する命令である命令op31の出力レジスタのレジスタ番号をコンフリクトレジスタテーブル64に登録する。コンピュータ10はまた、後続の命令op32の入力レジスタのレジスタ番号を、コンフリクトレジスタテーブル64から読み出した、先行する命令の出力レジスタのレジスタ番号に書き換える。
入力レジスタとして他の命令の出力レジスタを使用することができるか否かは、命令ごと、また複数の入力を用いる命令であれば入力ごとに予め設定され、コンピュータ10が設定データを保持している。
コンピュータ10は、コンフリクトレジスタテーブル64に登録したレジスタ番号を他の命令の入力レジスタとして使用した場合に、使用したレジスタ番号をコンフリクトレジスタテーブル64から削除する。
また、コンピュータ10は、コンフリクトレジスタテーブル64に対してレジスタ番号の登録や削除を行なった場合に、コンフリクトカウンタ63の値を書き換える。コンフリクトカウンタ63の値が最大値となった場合、すなわちコンフリクトレジスタテーブル64に登録したレジスタ番号の数が上限に達した場合には、コンピュータ10はコンフリクトレジスタテーブル64から最も古い値を削除する。
このようにコンピュータ10が命令の出力レジスタをコンフリクトレジスタテーブル64に登録し、後続の命令の入力レジスタとしてコンフリクトレジスタテーブル64に登録した出力レジスタを用いることで、試験用命令列にコンフリクト状態を組み込むことができる。なお、出力レジスタのレジスタ番号をコンフリクトレジスタテーブル64に登録した命令と、登録されたレジスタ番号を入力レジスタとして使用する命令との間には他の命令が存在してもよい。
次に、命令生成部41による試験用命令列生成の具体例について説明する。図14は、ランダムデータ生成部52が生成したランダムデータの具体例である。ランダムデータ生成部52は、シード値を初期値として擬似ランダム列を生成する。そして、ランダムデータ生成部52は、生成した擬似ランダム列を試験用命令のビット数ごとに切り出して試験用命令列に含まれる命令数以上のランダムデータを生成する。図14の例では、最初のランダムデータD0−1の値は「0x3ea8e2db」である。このうち0xは16進数表記であることを示し、3ea8e2dbがデータ本体である。また、2つ目のランダムデータD0−2は「0xc7428a58」である。
図15は、記憶部43に格納された命令定義構造体テーブル62の具体例である。命令定義構造体テーブル62は、命令の種別ごとに定めた命令定義構造体を保持する。各命令定義構造体は、命令の種別、ANDデータ、ORデータ、コンフリクトフラグを有する。
ANDデータとORデータは、それぞれ4バイトのデータである。試験用命令列生成部53は、4バイトのランダムデータとANDデータとの論理積をとり、さらに論理積結果とORデータとの論理和をとることで、命令の種別に定められた命令を生成する。なお、図15では、ANDデータとORデータを16進数で表記している。
また、コンフリクトフラグは1バイトのデータであり、命令の入力レジスタと出力レジスタがコンフリクトの設定に使用可能であるか否かを示す。命令定義構造体テーブル62では、コンフリクトフラグのうち4ビットを有効なビットとして使用する。なお、図15では、コンフリクトフラグを2進数で表記している。
命令定義構造体テーブル62は、出力レジスタがコンフリクトレジスタとして使用できるか否かを、コンフリクトフラグの図示範囲の上位1ビット目で示している。コンフリクトフラグの上位1ビット目は、命令の出力レジスタがいずれかのレジスタを指している場合、すなわち命令の出力をいずれかのレジスタに書き込む場合に1、命令の出力をレジスタに書き込まない場合に0となる。
また、命令定義構造体テーブル62は、コンフリクトフラグの上位2ビット目から4ビット目で3つの入力レジスタがコンフリクトレジスタとして使用できるか否かをそれぞれ示している。これらのビットはそれぞれ、3つの入力のいずれか一つに対応しており、対応する入力レジスタを命令が使用し、かつコンフリクトレジスタとして使用できる場合に1となり、対応する入力レジスタを命令が使用しない場合やコンフリクトレジスタとして使用できない場合に0となる。コンフリクトレジスタとして使用できない入力レジスタは、例えばそのレジスタの値によっては例外処理が発生する可能性のある入力レジスタである。
図15では、命令定義構造体テーブル62は、浮動小数点の論理和を示すfor命令のANDデータとして「0x1e07c01f」、ORデータとして「0xa1b00f80」、コンフリクトフラグとして「1011」を定義している。また、命令定義構造体テーブル62は、fadd命令のANDデータとして「0x1e03c00f」、ORデータとして「0xa1a00840」、コンフリクトフラグとして「1000」を定義している。
同様に、命令定義構造体テーブル62は、fsubd命令のANDデータとして「0x1e03c00f」、ORデータとして「0xa1a008c0」、コンフリクトフラグとして「1000」を定義している。
また、命令定義構造体テーブル62は、浮動小数点の積算を示すfmuld命令のANDデータとして「0x1e03c00f」、ORデータとして「0xa1a00940」、コンフリクトフラグとして「1000」を定義している。
図16は、試験用命令列生成部53が生成した試験用命令列データ66の具体例である。図16に示した試験用命令列データ66は、試験用命令列生成部53が命令定義構造体テーブル62を用いてランダムデータから生成した命令列の一例である。
試験用命令列データ66のうち、1番目の命令から5番目の命令を例示する。1番目の命令は「fsubd fr17,fr21,fr31」である。このfsubd命令の第1入力レジスタであるfr17と第2入力レジスタであるfr21は入力専用レジスタである。そして、このfsubd命令の出力レジスタであるfr31は入出力兼用レジスタである。
2番目の命令は「fmuld fr23,fr05,fr24」である。このfmuld命令の第1入力レジスタであるfr23と第2入力レジスタであるfr05は入力専用レジスタである。そして、このfmuld命令の出力レジスタであるfr24は入出力兼用レジスタである。
3番目の命令は「for fr09,fr19,fr09」である。このfor命令の第1入力レジスタであるfr09は入出力兼用レジスタであり、第2入力レジスタであるfr19は入力専用レジスタである。そして、このfor命令の出力レジスタであるfr09は入出力兼用レジスタである。
4番目の命令は「for fr05,fr04,fr25」である。このfor命令の第1入力レジスタであるfr05と第2入力レジスタであるfr04は入力専用レジスタである。そして、このfor命令の出力レジスタであるfr25は入出力兼用レジスタである。
5番目の命令は「fsubd fr21,fr00,fr30」である。このfsubd命令の第1入力レジスタであるfr21と第2入力レジスタであるfr00は入力専用レジスタである。そして、このfsubd命令の出力レジスタであるfr30は入出力兼用レジスタである。
このように、コンピュータ10は、各命令の出力レジスタに入出力兼用レジスタを指定し、特定の種別の命令の入力レジスタに入力専用レジスタを指定した試験用命令列データ66を生成する。
高負荷状態の試験などに用いる場合は、コンピュータ10は、この試験用命令列データ66を記憶部43に格納して使用すればよい。試験用命令列にコンフリクトを設定する場合は、コンピュータ10は試験用命令列の入力レジスタを置き換えて試験用命令列データ66を更新し、記憶部43に格納する。
図17は、コンフリクト設定の具体例である。初期状態ではコンフリクトレジスタテーブル64にはレジスタ番号が登録されておらず、コンフリクトカウンタ63の値は0である。コンピュータ10の試験用命令列生成部53は、まず1番目の命令について命令定義構造体テーブル62のコンフリクトフラグを参照し、1番目の命令のレジスタ番号に対応する出力レジスタをコンフリクトに使用可能かを判定する。1番目の命令は、「fsubd fr17,fr21,fr31」であり、出力レジスタをコンフリクトに使用可能である。このため、試験用命令列生成部53は、1番目の命令の出力レジスタのレジスタ番号fr31をコンフリクトレジスタテーブル64に登録し、コンフリクトカウンタ63の値を1にする。
2番目の命令は「fmuld fr23,fr05,fr24」である。命令定義構造体テーブル62のコンフリクトフラグは、fmuld命令については出力レジスタのみコンフリクトに使用可能であることを示している。このため、試験用命令列生成部53は、2番目の命令の出力レジスタfr24をコンフリクトレジスタテーブル64に登録し、コンフリクトカウンタ63の値を2にする。
3番目の命令は「for fr09,fr19,fr09」である。命令定義構造体テーブル62のコンフリクトフラグは、for命令については出力レジスタと入力レジスタとがともにコンフリクトに使用可能であることを示している。このため、試験用命令列生成部53は、コンフリクトレジスタテーブル64からレジスタ番号fr31とfr24を読み出し、3番目の命令の2つの入力レジスタ番号と置き換える。この時、試験用命令列生成部53は、for命令に使用したfr31とfr24をコンフリクトレジスタテーブル64から削除し、コンフリクトカウンタ63の値を2減算して0とする。さらに、試験用命令列生成部53は、3番目の命令の出力レジスタfr09をコンフリクトレジスタテーブル64に登録し、コンフリクトカウンタ63の値を1にする。
4番目の命令は「for fr05,fr04,fr25」である。命令定義構造体テーブル62のコンフリクトフラグは、for命令については出力レジスタと入力レジスタとがともにコンフリクトに使用可能であることを示している。このため、試験用命令列生成部53は、コンフリクトレジスタテーブル64からレジスタ番号fr09を読み出し、4番目の命令の2つの入力レジスタ番号の一方をレジスタ番号fr09に置き換える。試験用命令列生成部53は、使用したレジスタ番号fr09をコンフリクトレジスタテーブル64から削除し、コンフリクトカウンタ63の値を1減算して0とする。さらに、試験用命令列生成部53は、4番目の命令の出力レジスタ番号fr25をコンフリクトレジスタテーブル64に登録し、コンフリクトカウンタ63の値を1にする。
5番目の命令は「fsubd fr21,fr00,fr30」である。命令定義構造体テーブル62のコンフリクトフラグは、fsubd命令については出力レジスタのみコンフリクトに使用可能であることを示している。このため、試験用命令列生成部53は、5番目の命令の出力レジスタのレジスタ番号fr30をコンフリクトレジスタテーブル64に登録し、コンフリクトカウンタ63の値を2にする。
このように置き換えた結果、1番目の命令は「fsubd fr17,fr21,fr31」、2番目の命令は「fmuld fr23,fr05,fr24」となる。また、3番目の命令は「for fr31,fr24,fr09」、4番目の命令は「for fr09,fr04,fr25」、5番目の命令は「fsubd fr21,fr00,fr30」となる。1番目、2番目、5番目の命令は置き換え前と変更がないが、3番目の命令と4番目の命令はコンフリクトが発生するように変更されている。
次に、コンピュータ10の処理動作について説明する。図18は、試験プログラム31を実行した場合のコンピュータ10の処理動作を説明するフローチャートである。試験プログラム31を実行したコンピュータ10は、まず試験の種別を選択する(S201)。試験の種別とは、どのような条件下の動作試験を行なうかを示す。例えば固定小数点演算の試験や、浮動小数点演算の試験、固定小数点演算と浮動小数点演算の混在した試験、演算処理とアクセス処理とが混在した試験、演算処理と分岐処理が混在した試験などである。試験の種別の選択は、例えばユーザ入力などによって行なえばよい。
試験種別を選択した後、コンピュータ10は、試験パラメータを設定する(S202)。試験パラメータは、試験用命令列の命令数や、コンフリクトを設定するか否かなどを含む。また、コンピュータ10は、シード値を試験パラメータとして指定することもできる。コンピュータ10は、試験パラメータとしてシード値を指定した場合にはシード値からレジスタ初期値データを生成しても良い。
試験パラメータを設定した後、コンピュータ10は実行する試験種のうちの一つを選び(S203)、命令生成部41による命令生成処理(S204)を行なう。そして、コンピュータ10は生成した命令列を用いて試験実行部42による試験実行処理を行なう(S205)。
試験実行処理の後、コンピュータ10は選択した全ての試験種を実施したかを判定する(S206)。まだ実施していない試験種が残っていれば(S206,No)、コンピュータ10は、ふたたびS203に戻る。選択した全ての試験種について試験を実施したならば(S206,Yes)、コンピュータ10は処理を終了する。
図19は、図18に示した命令生成処理の詳細について説明するフローチャートである。命令生成部41は、まず、シード値設定部51によるシード値の設定を行なう(S301)。ここでシード値が試験パラメータとして指定されていれば、シード値設定部51は指定されたシード値を用いる。また、シード値が指定されていなければ、シード値設定部51はシード値を新たに生成して設定する。
シード値を設定した後、命令生成部41は、シード値設定部51によって設定されたシード値を用いてランダムデータ生成部52によるランダムデータ列の生成を行なう(S302)。ランダムデータ生成部52は、シード値を初期値として擬似ランダム列を生成し、擬似ランダム列から命令長と同じ長さのランダムデータを順次切り出してランダムデータ列とする。
ランダムデータ列が生成されると、命令生成部41は、ランダムデータを一つ選択し(S303)、ランダムデータに命令定義構造体を適用して試験用命令を生成する(S304)。生成した試験用命令の数が試験パラメータによって指定された数に満たなければ(S305,No)、命令生成部41はランダムデータの選択(S303)に戻る。
生成した試験用命令の数が試験パラメータによって指定された数を満たすと(S305,Yes)、命令生成部41は試験パラメータによってコンフリクトが指定されているか否かを判定する(S306)。この結果、コンフリクトが指定されていなければ(S306,No)、命令生成部41は生成した試験用命令を試験用命令列データとして出力し(S308)、処理を終了する。一方、コンフリクトが指定されていれば(S306,Yes)、命令生成部41は生成した試験用命令に対してコンフリクト設定を行なって(S307)、試験用命令列データとして出力し(S308)、処理を終了する。
図20は、図19に示したコンフリクト設定処理の詳細について説明するフローチャートである。コンフリクト設定処理が開始されると、試験用命令列生成部53はまず、生成した試験用命令列の最初の命令を選択する(S401)。
試験用命令列生成部53は、命令を選択した後、命令の第1入力レジスタを選択し(S402)、レジスタ番号置き換え処理を行なう(S403)。この後、試験用命令列生成部53は、命令の第2入力レジスタを選択し(S404)、レジスタ番号置き換え処理を行なう(S405)。そして試験用命令列生成部53は、命令の第3入力レジスタを選択し(S406)、レジスタ番号置き換え処理を行なう(S407)。
入力レジスタ番号の置き換え後、試験用命令列生成部53は命令の出力レジスタをコンフリクト対象とすることができるかを判定する(S408)。判定の結果、出力レジスタをコンフリクトの対象とすることができる場合(S408,Yes)、試験用命令列生成部53はコンフリクトカウンタの値が最大値であるかを判定する(S409)。
コンフリクトカウンタ63の値が最大値である場合(S409,Yes)、試験用命令列生成部53はコンフリクトレジスタテーブル64から最も古い値を削除し(S410)、コンフリクトカウンタ63の値を1減らす(S411)。
コンフリクトカウンタ63の値を減らした後、もしくはコンフリクトカウンタの値が最大値では無い場合(S409,No)、試験用命令列生成部53は命令の出力レジスタのレジスタ番号をコンフリクトレジスタテーブル64に登録し(S412)、コンフリクトカウンタの値を1増やす(S413)。
コンフリクトカウンタの値を増やした後、もしくは命令の出力レジスタをコンフリクト対象にできない場合(S408,No)、試験用命令列生成部53は試験用命令列の全ての命令に対して処理が終了したかを判定する(S414)。この結果、処理を行なっていない命令が残っているならば(S414,No)、試験用命令列生成部53は、次の命令を選択して(S415)、第1入力レジスタの選択に戻る(S402)。そして、全ての命令に対して処理が終了した場合に(S414,Yes)、試験用命令列生成部53はコンフリクト設定処理を終了する。
図21は、図20に示したレジスタ番号置き換え処理の詳細について説明するフローチャートである。レジスタ番号の置き換え処理が開始されると、試験用命令列生成部53はまず、コンフリクトカウンタ63の値が1以上であるか否かを判定する(S501)。
コンフリクトカウンタ63の値が1以上であれば(S501,Yes)、試験用命令列生成部53は命令定義構造体テーブル62のコンフリクトフラグを参照し、対象の入力レジスタをコンフリクト対象とすることができるか否かを判定する(S502)。
判定の結果、対象の入力レジスタをコンフリクト対象にできる場合(S502,Yes)、試験用命令列生成部53は、対象の入力レジスタをコンフリクトレジスタテーブル64に登録された最も古いレジスタ番号に置き換える(S503)。
対象の入力レジスタを置き換えた後、試験用命令列生成部53は、置き換えに用いたレジスタ番号をコンフリクトレジスタテーブル64から削除し(S504)、コンフリクトカウンタ63の値を1減らす(S505)。
コンフリクトカウンタ63の値を1減らした後、試験用命令列生成部53は、レジスタ番号置き換え処理を終了する。また、コンフリクトカウンタ63の値が0である場合(S501,No)および対象の入力レジスタをコンフリクトの対象にできない場合(S502,No)にも、試験用命令列生成部53はレジスタ番号置き換え処理を終了する。
図22は、図18に示した試験実行処理の詳細について説明するフローチャートである。試験実行処理が開始されると、試験実行部42内部の初期値設定部54がレジスタに初期値をセットする(S601)。記憶部43にレジスタ初期値データ65が格納されていれば、初期値設定部54はレジスタ初期値データ65を読み出して使用する。一方、記憶部43にレジスタ初期値データ65が格納されていなければ、初期値設定部54は、シード値データ61に基づいてレジスタ初期値データ65を生成して使用し、記憶部43に格納する。既に述べたようにレジスタ初期値データ65は浮動小数点レジスタのうち入力専用レジスタにセットする値として1に近い値を持ち、汎用レジスタのうち入力専用レジスタにセットする値として0以外の値を持つ。
レジスタに初期値をセットした後、命令列実行部55は、記憶部43から試験用命令列データ66を読み出して実行する(S602)。試験用命令列の実行後、実行結果退避部56は実行結果を記憶部43に実行結果データ67として格納する(S603)。
実行結果データ67を記憶部43に格納した後、初期値設定部54がレジスタに再度初期値をセットする(S604)。レジスタに初期値をセットした後、命令列実行部55は、記憶部43から試験用命令列データ66を読み出して実行する(S605)。
二度目の命令列の実行を終えた後、結果比較部57は、実行結果データ67として記憶部43に格納された一度目の実行結果と二度目の実行結果とを比較して評価し(S606)、比較結果を出力して(S607)、処理を終了する。
上述してきたように、本実施例2では、コンピュータに試験プログラムを実行させることでコンピュータ試験装置として動作させ、コンピュータ試験方法を実行する。そして、実施例2にかかる方法、装置、プログラムは、命令のオペランドに指定される複数のレジスタの一部を入力専用レジスタとする。加えて、実施例2にかかる方法、装置、プログラムは、特定の種別の命令については入力専用レジスタをオペランドとして指定しつつ試験用命令列を生成する。そして、実施例2にかかる方法、装置、プログラムは、入力専用レジスタに対して特定種別の命令によって例外割り込みを発生しない初期値を設定する。
このため、実施例2にかかる方法、装置およびプログラムは、例外割り込みと例外処理の発生を効率的かつ未然に抑制する。したがって、実施例2にかかる方法、装置およびプログラムは、レジスタの値を書き換えつつ、かつ例外割り込みと例外処理を発生することなく試験を行なうことができる。
また、実施例2にかかる方法、装置およびプログラムは、試験用命令列を生成する際に、命令が固定小数点除算である場合には除数として用いるオペランドとして入力専用レジスタを指定し、入力専用レジスタに初期値として0以外の値を設定する。このため、実施例2にかかる方法、装置およびプログラムは、固定小数点除算における例外割り込みの発生を回避することができる。
また、実施例2にかかる方法、装置およびプログラムは、試験用命令列を生成する際に、命令が浮動小数点演算である場合にオペランドの少なくとも一つに入力専用レジスタを指定する。そして、実施例2にかかる方法、装置およびプログラムは、入力専用レジスタに設定する初期値として、浮動小数点演算に用いる他の入力値がどのような値であっても浮動小数点演算における例外割り込みの発生を防止する値を用いる。このため、実施例2にかかる方法、装置およびプログラムは、浮動小数点演算における例外割り込みの発生を回避することができる。
また、実施例2にかかる方法、装置およびプログラムは、試験用命令列に含まれる複数の命令を順次実行して、実行結果を評価処理する。このため、実施例2にかかる方法、装置およびプログラムは、試験対象装置に複数回試験用命令列を実行させ、実行結果の比較によって評価を行なうことができる。この場合は、試験対象装置が試験用命令列の比較対象を試験中に生成することとなるので、シード値を変更させながら繰り返し試験を行なうことで長時間の動作試験を容易に実施可能である。
また、実施例2にかかる方法、装置およびプログラムは、試験用命令列を生成する際には、ランダムデータと第1のデータであるANDデータとの論理積に対し、第2のデータであるORデータとの論理和を取って試験用命令列に含まれる命令を生成する。第1のデータと第2のデータは、命令の種別ごとに定められる。そして、第1のデータは、命令の実行結果の出力先として使用するレジスタに対応する範囲のビット値に0を含む。このため、実施例2にかかる方法、装置およびプログラムは、簡易な処理で命令の出力にかかるレジスタ番号を制御することができる。
同様に、実施例2にかかる方法、装置およびプログラムは、第1のデータと第2のデータについて、命令の入力として使用するレジスタに対応する範囲のビット値を適宜設定することで、簡易な処理で命令の入力にかかるレジスタ番号を制御することができる。
また、実施例2にかかる方法、装置およびプログラムは、試験用命令列を生成する際に、命令の実行結果の出力先として指定したレジスタを後続の命令の入力に使用することで実行時にコンフリクトを発生する試験用命令列を生成することができる。このため、実施例2にかかる方法、装置およびプログラムは、コンフリクト試験中の例外割り込みの発生を回避することができる。
また、実施例2にかかる方法、装置およびプログラムは、先行する命令の実行結果の出力先として指定されたレジスタを入力に使用可能であるかを命令の種別ごとに指定するデータを用いてコンフリクト試験に用いる試験用命令列を生成する。このため、実施例2にかかる方法、装置およびプログラムは、入力専用レジスタなどをコンフリクトレジスタから除外してコンフリクト試験用の試験用命令列を生成することができる。
また、実施例2にかかる方法、装置およびプログラムは、出力レジスタを登録し、登録後に後続の命令の入力レジスタとして指定した場合に削除するレジスタテーブルを用いてコンフリクト試験用の試験用命令列を生成する。このため、実施例2にかかる方法、装置およびプログラムは、コンフリクト試験用の試験用命令列を簡易に生成することができる。