(57)【特許請求の範囲】
【請求項１】
入力を解析する解析手段と、
前記解析手段により解析された結果に対応して命令を生成する生成手段と、
前記生成手段により生成された前記命令を実行する実行手段と、
前記実行手段による命令の実行に必要とされるクロック数の上限値を設定し、前記上限値以下のクロック数で実行される前記命令を前記生成手段に生成させるとともに、前記実行手段により前記上限値以下のクロック数で、生成された前記命令が正しく実行されなかった場合、前記上限値を増加させて設定し直すことにより、前記クロック数が最小となる前記命令を探索する探索手段と
を備えることを特徴とする情報処理装置。
【請求項２】
前記解析手段は、入力に対応するDAGを生成する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記DAGを構成するノードに用いられる演算子は、２項演算子の+,-,*,/、または単項演算子の-,ABS,SQRTである
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
無駄な命令の生成を禁止する禁止手段をさらに備える
ことを特徴とする請求項１に記載の情報処理装置。
【請求項５】
入力を解析する解析手段と、
命令を生成する生成手段と、
生成された前記命令を実行する実行手段と、
前記実行手段による命令の実行に必要とされるクロック数の上限値を設定し、前記クロック数が最小となる前記命令を探索する探索手段と
を備える情報処理装置の情報処理方法であって、
前記解析手段が入力を解析する解析ステップと、
前記探索手段が命令の実行に必要とされるクロック数の前記上限値を設定する設定ステップと、
前記解析ステップで解析された結果に対応して、前記生成手段が、前記上限値以下のクロック数で実行される命令を生成する生成ステップと、
前記実行手段が前記生成ステップで生成された前記命令を実行する実行ステップと、
前記実行ステップにおいて前記上限値以下のクロック数で、生成された前記命令が正しく実行されなかった場合、前記探索手段が前記上限値を増加させて設定し直すことにより、前記クロック数が最小となる前記命令を探索する探索ステップと
を含むことを特徴とする情報処理方法。
【請求項６】
入力を解析する解析手段と、
命令を生成する生成手段と、
生成された前記命令を実行する実行手段と、
前記実行手段による命令の実行に必要とされるクロック数の上限値を設定し、前記クロック数が最小となる前記命令を探索する探索手段と
を備える情報処理装置に、
前記解析手段が入力を解析する解析ステップと、
前記探索手段が命令の実行に必要とされるクロック数の前記上限値を設定する設定ステップと、
前記解析ステップで解析された結果に対応して、前記生成手段が、前記上限値以下のクロック数で実行される命令を生成する生成ステップと、
前記実行手段が前記生成ステップで生成された前記命令を実行する実行ステップと、
前記実行ステップにおいて前記上限値以下のクロック数で、生成された前記命令が正しく実行されなかった場合、前記探索手段が前記上限値を増加させて設定し直すことにより、前記クロック数が最小となる前記命令を探索する探索ステップと
を含む処理を実行させる前記情報処理装置が読みとり可能なプログラムが記録されていることを特徴とする記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、情報処理装置および方法、並びに記録媒体に関し、特に、クロック数に基づいて、超最適化を行うようにした情報処理装置および方法、並びに記録媒体に関する。
【０００２】
【従来の技術】
コンピュータにより処理されるプログラム（マシン命令列）は、出来るだけ迅速に処理することができるのが好ましい。このような観点から、命令数またはクロック数が出来るだけ小さくなるように最適化が行われる。
【０００３】
さらに、最適化を発展させ、マシン語で書かれたプログラムを入力として受け取り、可能なプログラムを全て調べ、元のプログラムと同じ機能を有するものを探し出すようにすること、すなわち超最適化することも提案されている。この超最適化については、例えばMassalin,H.氏により、「Superoptimizer -- A Look at the Smallest Program,Proceedings of the Second International Conference on Architectural Support for Programming Languages and Operating System,1987,PP.122-126」に開示されている。
【０００４】
【発明が解決しようとする課題】
しかしながら、上記した論文に記載されている超最適化は、全探索に基づいて、与えられた関数を計算する命令数が最小となるプログラム（マシン命令列）を探索するものである。しかしながら、近年のパイプライン化されたプロセッサにおいては、命令実行パイプラインのスケジューリングが重要であり、命令数が少なくても、必ずしも実行時間が短くなることにはならない。
【０００５】
本発明はこのような状況に鑑みてなされたものであり、クロック数に基づいて、超最適化を行うことにより、より迅速に処理が可能なプログラムを生成できるようにするものである。
【０００６】
【課題を解決するための手段】
請求項１に記載の情報処理装置は、入力を解析する解析手段と、解析手段により解析された結果に対応して命令を生成する生成手段と、生成手段により生成された命令を実行する実行手段と、実行手段による命令の実行に必要とされるクロック数の上限値を設定し、上限値以下のクロック数で実行される命令を生成手段に生成させるとともに、実行手段により上限値以下のクロック数で、生成された命令が正しく実行されなかった場合、上限値を増加させて設定し直すことにより、クロック数が最小となる命令を探索する探索手段とを備えることを特徴とする。
【０００７】
請求項５に記載の情報処理方法は、入力を解析する解析ステップと、命令の実行に必要とされるクロック数の上限値を設定する設定ステップと、解析ステップで解析された結果に対応して、上限値以下のクロック数で実行される命令を生成する生成ステップと、生成ステップで生成された命令を実行する実行ステップと、実行ステップにおいて上限値以下のクロック数で、生成された命令が正しく実行されなかった場合、上限値を増加させて設定し直すことにより、クロック数が最小となる命令を探索する探索ステップとを含むことを特徴とする。
【０００８】
請求項６に記載の記録媒体は、入力を解析する解析ステップと、命令の実行に必要とされるクロック数の上限値を設定する設定ステップと、解析ステップで解析された結果に対応して、上限値以下のクロック数で実行される命令を生成する生成ステップと、生成ステップで生成された命令を実行する実行ステップと、実行ステップにおいて上限値以下のクロック数で、生成された命令が正しく実行されなかった場合、上限値を増加させて設定し直すことにより、クロック数が最小となる命令を探索する探索ステップとを含む処理を情報処理装置に実行させる情報処理装置が読みとり可能なプログラムが記録されていることを特徴とする。
【０００９】
請求項１に記載の情報処理装置、請求項５に記載の情報処理方法、および請求項６に記載の記録媒体においては、入力を解析した結果に対応して、設定された上限値以下のクロック数で実行される命令が生成され、実行される。上限値以下のクロック数で、生成された命令が正しく実行されなかった場合、上限値が増加されて設定し直されることにより、命令の実行に必要とされるクロック数が最小となる命令が探索される。
【００１０】
【発明の実施の形態】
以下に本発明の実施の形態を説明するが、特許請求の範囲に記載の発明の各手段と以下の実施の形態との対応関係を明らかにするために、各手段の後の括弧内に、対応する実施の形態（但し一例）を付加して本発明の特徴を記述すると、次のようになる。但し勿論この記載は、各手段を記載したものに限定することを意味するものではない。
【００１１】
請求項１に記載の情報処理装置は、入力を解析する解析手段（例えば、図１の構文解析部１）と、解析手段により解析された結果に対応して命令を生成する生成手段（例えば、図１の命令生成部３）と、生成手段により生成された命令を実行する実行手段（例えば、図１の命令実行シミュレータ４）と、実行手段による命令の実行に必要とされるクロック数の上限値を設定し、上限値以下のクロック数で実行される命令を生成手段に生成させるとともに、実行手段により上限値以下のクロック数で、生成された命令が正しく実行されなかった場合、上限値を増加させて設定し直すことにより、クロック数が最小となる命令を探索する探索手段（例えば、図１の探索実行部２）とを備えることを特徴とする。
【００１２】
請求項４に記載の情報処理装置は、無駄な命令の生成を禁止する禁止手段（例えば、図４のステップＳ３）をさらに備えることを特徴とする。
【００１３】
図１は、本発明を適用した超最適化装置の機能的構成例を表している。なお、以後の説明では例として、インテル社のPentium（商標）プロセッサの浮動小数点命令を使用するが、本発明は、それ以外のプロセッサに対しても有効である。構文解析部１は、コマンドライン引数で指定された目的の関数を構文解析し、入力された代入文を表すDAG（Directed Acyclic Graph）を生成する。なお、ここで、使用可能な演算子は、２項演算子（例えば、Ａ＋Ｂの「＋」）の+，-，*，/、または単項演算子（例えば、−Ａの「−」）の-，ABS（絶対値），SQRT（平方根）となっているが、必要なら他の演算子を追加することもできる。共通部分式（例えば、Ａ×Ｂ＋Ａ×Ｂの「Ａ×Ｂ」）は、ここでは、自動的に検出される。
【００１４】
探索実行部２は、構文解析部１により生成されたDAGに対応して、命令生成部３を再帰呼び出しし、命令を生成させる。また、探索実行部２は、命令実行シミュレータ４より供給されたクロック数に基づいて、クロック数の上限値を１，２，３，・・・と増加し、深さ優先探索処理を行う。再帰の各段階では、DAGの各ノードの実行に必要な命令、あるいは対応するノードのない命令（例えば、FXCH命令など）が１つ生成される。全てのノードに対する命令が生成され、クロック数の上限以内であれば、その命令列が出力される。解が見つからない場合には、クロック数の上限値が増加され、探索が継続される。
【００１５】
命令生成部３は、探索実行部２から呼び出され、DAGの各ノードの実行に必要な命令を生成し、再帰を行う。オペランドがそろっていないなど、実行できない場合には、命令生成部３は、何も処理しない。命令の候補が複数存在する場合には、順番に生成処理が行われる。例えば、レジスタST（本明細書において、レジスタST(0)は、レジスタSTとも記載される）とレジスタST(1)の加算を行う命令には、FADD ST,ST(1)、FADD ST(1),ST、FADDP ST(1),STの３種類があるが、これらは順番に生成される。
【００１６】
命令実行シミュレータ４は、Pentiumプロセッサの状態（演算に使用されるレジスタの保持している値に対応するノードへのポインタ、計算終了時刻など）、経過時間、生成した命令列などを保持している。また、命令生成部３により生成された命令を実行し、命令生成部３から読み出される手続きにより状態を更新する。後述する枝刈り処理などによるバックトラックのために命令を取り除くときは、状態が元に戻される。命令実行シミュレータ４は、命令を実行する上において必要となったクロック数を探索実行部２に出力する。探索実行部２は、入力されたクロック数が最小となる命令を探索する。
【００１７】
なお、この超最適化装置においては、次のようなことが前提とされている。
（１）レジスタが足りなくなることはないものとする。すなわち、メモリアクセスは、入出力の変数アクセスのみとされ、また、変数そのものを除く共通部分式は、使い終わるまで消去されない。
（２）入出力両方に現れる変数や、重複する出力変数はないものとする。そのようなメモリアクセスは冗長だからである。
（３）実行時間にキャッシュミス、ミスアラインメントなどは考慮されない。
（４）結合法則、分配法則など、代数的に等価な変換は、浮動小数点値では問題を起こす可能性があるので考慮されない。
【００１８】
次に、その動作について説明する。構文解析部１は、入力された代入文を構文解析してDAGを生成し、探索実行部２に出力する。例えば、いま代入文として、
Ａ：＝Ｂ＋Ｃ＋Ｄ
Ｅ：＝Ｆ＋Ｇ＋Ｈ
が入力されたとすると、それぞれから、例えば図２と図３に示すようなDAGが生成される。なお、図２と図３において、○印はノードを示している。
【００１９】
このようにして生成されたDAGに基づいて、探索実行部２、命令生成部３、および命令実行シミュレータ４は、例えば図４のフローチャートに示す処理を実行する。
【００２０】
すなわち、最初にステップＳ１において、探索実行部２は、クロックの上限値を表す変数limitclocksに１を初期設定し、ステップＳ２において、命令生成部３は、命令生成の初期化処理を実行する。
【００２１】
次に、ステップＳ３において、命令生成部３は、命令列を生成する。生成した命令列は、ステップＳ４において、命令実行シミュレータ４に供給され、シミュレートされる。さらに、命令実行シミュレータ４は、入力された命令が正しく実行され、かつ、ステップＳ１で設定した上限値limitclocks以下のクロックでその命令を実行することができたか否かを判定する。ステップＳ４において、ＮＯの判定が行われた場合には、ステップＳ６に進み、探索実行部２は、クロック数が上限値limitclocks以内の全ての命令を生成したか否かを判定する。まだ全ての命令を生成していない場合には、ステップＳ３に戻り、それ以降の処理が繰り返し実行される。
【００２２】
ステップＳ６において、クロック数が上限値limitclocks以内の全ての命令が生成されたと判定された場合、ステップＳ７に進み、探索実行部２は、命令列がステップＳ５において既に出力されたか否かを判定する。命令列がまだ出力されていない場合には、ステップＳ８に進み、探索実行部２は、上限値limitclocksを１だけインクリメントした後、ステップＳ２に戻る。そして、ステップＳ２以降の処理が繰り返し実行される。
【００２３】
以上のような動作が繰り返し実行されて、ステップＳ４において、生成された命令列が正しく実行され、かつ、上限値limitclocks以下のクロックで実行できたと判定された場合、ステップＳ５に進み、探索実行部２は、その命令列をアセンブリ言語命令列として出力する。この命令列が出力された後は、その後、ステップＳ７の処理ステップで命令列が出力されたと判定され、処理が終了される。
【００２４】
以下に、
Ａ：＝Ｂ＋Ｃ＋Ｄ
Ｅ：＝Ｆ＋Ｇ＋Ｈ
の演算を行うプログラム（Ｂ＋Ｃ＋Ｄを演算してＡに代入し、Ｆ＋Ｇ＋Ｈを演算してＥに代入するプログラム）を超最適化した場合について説明するが、その前に、超最適化を行わず、この代入文を素朴にインテルPentiumプロセッサのアセンブリ言語に翻訳した場合について、図５を参照して説明する。
【００２５】
すなわち、この代入文を素朴に翻訳すると、図５に示すような結果が得られる。図５の第１行目の命令FLD [B]において、レジスタST(0)にメモリＢの値をロードする。この処理は、第１番目のクロックで実行される。
【００２６】
次に、第２行目の命令FADD [C]により、レジスタST(0)にメモリＣの値が加算される。これにより、レジスタST(0)には、Ｂ＋Ｃが保持されることになる。この演算は、第２番目乃至第４番目のクロック（加算には３クロックが必要）で実行される。
【００２７】
次に、第３行目の命令FADD [D]が実行されると、それまでのレジスタST(0)の値Ｂ＋ＣにメモリＤの値が加算され、Ｂ＋Ｃ＋Ｄとなる。この演算は、第５番目乃至第７番目のクロックで実行される。
【００２８】
次に、第４行目の命令FSTP [A]により、レジスタST(0)に保持されている値Ｂ＋Ｃ＋ＤがメモリＡにロードされる。この命令FSTPは、その命令を開始する１クロック前までに、ロードする値を必要とするので、第８番目のクロック分だけストールされた後、第９番目のクロックと第１０番目のクロックにおいて、FSTP [A]の命令が実行される。
【００２９】
以上により、Ａ：＝Ｂ＋Ｃ＋Ｄが実行されたことになる。
【００３０】
以下、同様に、第５行目乃至第８行目の命令により、上述した場合と同様にして、Ｅ：＝Ｆ＋Ｇ＋Ｈの処理が実行される。
【００３１】
図６は、
Ａ：＝Ｂ＋Ｃ＋Ｄ
Ｅ：＝Ｆ＋Ｇ＋Ｈ
のプログラムを、図１の超最適化装置により超最適化した場合の例を表している。この例においては、第１行目の命令FLD [B]において、レジスタST(0)にメモリＢの値がロードされる。この命令は、第１クロックで実行される。第２行目の命令FADD [C]は、レジスタST(0)にメモリＣに記憶されている値を加算する命令である。これにより、レジスタST(0)には、Ｂ＋Ｃが保持されることになる。この加算は、第１行目の命令が完了した後の第２乃至第４クロックで実行される。
【００３２】
第３行目の命令FLD [F]は、レジスタST(0)にメモリＦの値をロードする命令であり、このとき、それまでレジスタST(0)に記憶されていた値Ｂ＋Ｃは、後段のレジスタST(1)にシフトされる。Pentium（商標）プロセッサにおいては、演算がパイプライン化され、FADD，FSUB，FMULの各命令は、その実行開始の次のクロックで引き続く命令の実行を開始することができる（但し、FMULが連続するときは２クロック後）。従って、第２行目の命令FADD [C]が第２番目のクロックで開始された後、次の第３番目のクロックにおいて、第３行目の命令FLD [F]が実行される。
【００３３】
第４行目の命令FADD [G]は、メモリＧに記憶されている値をレジスタST(0)に記憶された値に加算する命令であり、いまの場合、レジスタST(0)には、値Ｆがすでに記憶されているので、これに新たな値Ｇが加算され、Ｆ＋Ｇとなる。この命令は、第４番目乃至第６番目までの３クロックで実行される。
【００３４】
第５行目の命令FXCH ST(1)は、レジスタST(0)とレジスタST(1)の値を交換するものであり、いまの場合、それまでレジスタST(1)に保持されていた値Ｂ＋ＣがレジスタST(0)に移転され、それまでレジスタST(0)に保持されていた値Ｆ＋ＧがレジスタST(1)に移転される。この命令FXCHは、値が計算途中であっても実行可能な命令である。しかも、ある条件の下で、前の命令と同時に実行を開始できる。そこで、この第５行目の命令は、第４行目の命令FADD [G]と同じタイミングで、第４番目のクロックで開始される。
【００３５】
次に、第６行目の命令FADD [D]により、レジスタST(0)に保持されている値Ｂ＋Ｃに値Ｄが加算される。この命令は、第５行目の命令が完了した後、第５番目のクロックから第７番目のクロックで実行される。
【００３６】
第７行目の命令FLD [H]により、レジスタST(0)にメモリＨの値がロードされ、それまでレジスタST(0)に保持されていた値Ｂ＋Ｃ＋Ｄは、後段のレジスタST(1)にシフトされ、それまでレジスタST(1)に保持されていた値Ｆ＋Ｇは、後段のレジスタST(2)にシフトされる。この命令FLDは、直前の第６行目の命令がFADDであるので、それが開始された第５番目のクロックの次の第６番目のクロックにおいて実行される。
【００３７】
第８行目の命令FADDP ST(2),STは、レジスタST(2)に保持されている値Ｆ＋ＧにレジスタST（レジスタST(0)）に保持されている値Ｈを加算し、さらに、それまでレジスタST(0)に保持されていた値Ｈを削除し、そのとき、レジスタST(1)に保持されている値Ｂ＋Ｃ＋Ｄを前段のレジスタST(0)に転送し、そのときレジスタST(2)に保持されている値Ｆ＋Ｇ＋Ｈを前段のレジスタST(1)に転送する命令である。この命令は、直前の第７行目の命令が実行された第６番目のクロックの次の第７番目から第９番目のクロックの間に実行される。
【００３８】
さらに、第９行目の命令FSTP [A]は、メモリＡに、レジスタST(0)にそれまで保持されている値Ｂ＋Ｃ＋Ｄを記憶させる命令であり、その結果、それまで後段のレジスタST(1)に保持されていた値Ｆ＋Ｇ＋Ｈが、前段のレジスタST(0)に転送された状態となる。命令FSTPは、その命令を開始する１クロック前までにロードする値を必要とし、その値Ｂ＋Ｃ＋Ｄは、第６行目の命令FADD [D]を実行した第７番目のクロックのタイミングで得られるので、第８番目のクロックを待って、第９番目のクロックと第１０番目のクロックにおいて、この命令が実行される。
【００３９】
次に、第１０行目の命令FSTP [E]において、レジスタST(0)に保持されている値Ｆ＋Ｇ＋ＨがメモリＥに記憶される。その結果、レジスタST(0)には、何も記憶されていない状態となる。第９行目と第１０行目に、命令FSTPが連続して現れるが、この命令FSTPは並列処理することができない。従って、直前の第９行目の命令FSTPの処理が終了した第１１番目のクロックの次の第１２番目のクロックから実行される。
【００４０】
図５の命令列は、８行で構成されるが、その処理に必要とするクロック数は、２０となっている。これに対して、図６の命令列は、１０行であるが、そのクロック数は、１２となっている。従って、図６の命令列の方が図５の命令列に較べて、より迅速に同一の内容の演算結果を得ることができることになる。
【００４１】
このように、本発明においては、並列に実行できる命令や１クロック待つ命令を最適な順序で組み合わせるように超最適化処理が行われるため、より少ない数のクロックで処理可能なプログラムが生成される。
【００４２】
また、命令生成部３は、ステップＳ３において命令列を生成するにあたり、予め無駄と判る命令列の生成を省略する（枝刈り処理する）ことにより、より迅速に超最適化処理を完了できるようにしている。DAGの各ノードは、この枝刈り処理のため、演算子名、変数名、子ノードへのポインタなどの他、参照カウント、実行済みフラグ、クリティカルパスクロック数といったデータを計算して保持している。
【００４３】
参照カウントとは、そのノードの値を必要とするノード（そのノードを子ノードとしているノード）のうち、実行済みでないものの数を表す。実行済みフラグとは、そのノードの表す値を計算済みかどうかを表すフラグである。クリティカルパスクロック数とは、そのノードに対する命令が今実行されたとして、その結果に依存する計算が全て完了するまでにかかるクロック数を表し、複数の経路がある場合には、最大値が選択される。
【００４４】
枝刈り処理には、値の参照数による枝刈り、クロック数による枝刈り、クリティカルパスによる枝刈り、およびコードサイズによる枝刈りがある。
【００４５】
値の参照数による枝刈りは、命令列に命令をつけ加える際、次のような命令は候補としないようにするものである。
（１）参照カウントの値が０でないノードの表す値を持つレジスタの値を全て消すような命令。
（２）参照カウントの値が０である変数の値をレジスタにロードする命令。
【００４６】
クロック数による枝刈りとは、命令を付け加えた後、未実行のノードの実行に最低必要な時間を合計し、今まで生成した命令列のクロック数とその和が上限を超えていたら、その命令は候補としない（バックトラックする）というものである。例えば、加算が１個、代入が２個残っているような場合、１×１＋２×２＝５クロックサイクル最低必要となるので、現在のクロック数に５を加算した値が上限を超えていたら、その命令は候補としないようにする。
【００４７】
クリティカルパスによる枝刈りとは、命令を付け加えた後、未実行のノードの中で、クリティカルパスクロック数の最大値を求め、今まで生成した命令列のクロック数との合計が上限を超えるような命令は候補としないようにするものである。例えば、加算結果をそのまま代入する場合に、代入ノードには、FSTP命令の実行時間の２を記憶させ、加算ノードには、これにFSTP命令の待ち時間１と、加算の実行時間３を加えた６を記憶させる。そして、探索を進める前に、毎回未実行のノードの記憶している値の最大値を求め、今まで生成した命令のクロック数との合計が上限を超えていたら、バックトラックするようにする。
【００４８】
コードサイズによる枝刈りは、命令を付け加えた後、未実行のノードの実行に最低必要な命令のバイト数を合計して、今まで生成した命令のバイト数との和が既に見つかった解のバイト数を超えている場合、その命令は候補としないようにするものである。これは、同じクロック数の中で、なるべく短い（バイト数の少ない）命令列を出力することにしているために有効な方法である。
【００４９】
３次元モデルの処理によく使用されるベクトル和、内積、外積、および一次変換について、本願発明における方法と他の方法とで実験した結果、図７に示すような結果が得られた。
【００５０】
なお、図７において、超最適化の項に記載されている値が本願発明における方法に基づくものであり、ＢＣ５、ＶＣ５、およびIntelは、それぞれ次のようなコンパイラとコンパイルオプションを利用したものである。
ＢＣ５：Borland C++5.0J(BCC32-5-02-S)
ＶＣ５：Visual C++5.0(CL/G5/02/Fa)
Intel：Borland C++5.0Jに付属するインテル（商標）製コンパイラ
(BCC32I-5-02-S)
【００５１】
図７に示す値は、生成コードのバイト数とクロック数である。本願発明における方法により、バイト数は若干多くなる場合もあるが、クロック数は最も少ない命令列を生成できることが判る。
【００５２】
なお、図７における演算のうち、例えば外積の演算は、Ｃ＋＋プログラムで表すと、図８に示すようになる。図９は、この外積の命令列を本願発明の方法により超最適化した場合を表している。２２クロックで外積演算が行われることが判る。
【００５３】
このように、本願発明においては、クロック数の上限値以内で実行できる命令列を、命令数に関係なく全て生成するようにしている。空の命令列から初めて命令を１つずつ付け加えていって、候補となる命令列が生成される。目的の関数を計算できる前にクロック数の上限値を超えた場合、その命令列は、候補から削除される。実際には、クロック数の上限値に達する前に、枝刈り処理により候補から削除される命令列も発生する。
【００５４】
以上においては、クロック数を得るのに、動作のシミュレーションを行うようにしているが、命令を実際に動作させて時間を計測することでも、時間はクロックに対応するので、同様の結果を得ることができる。
【００５５】
なお、本明細書において、システムとは、複数の装置により構成される装置全体を表すものとする。
【００５６】
また、上記したような処理を行うコンピュータプログラムをユーザに提供する提供媒体としては、磁気ディスク、CD-ROM、固体メモリなどの記録媒体の他、ネットワーク、衛星などの通信媒体を利用することができる。
【００５７】
【発明の効果】
以上の如く、請求項１に記載の情報処理装置、請求項５に記載の情報処理方法、および請求項６に記載の記録媒体によれば、入力を解析し、解析された結果に対応して、設定された上限値以下のクロック数で実行される命令を生成し、上限値以下のクロック数で、生成された命令が正しく実行されなかった場合、上限値が増加されて設定し直されることにより、クロック数が最小となる命令を探索するようにしたので、より迅速な処理が可能な命令列を生成することが可能となる。
【図面の簡単な説明】
【図１】本発明の情報処理装置を適用した超最適化装置の構成例を示すブロック図である。
【図２】  DAGを説明する図である。
【図３】  DAGを説明する図である。
【図４】図１の超最適化装置の動作を説明するフローチャートである。
【図５】通常の方法により生成された命令列を説明する図である。
【図６】図１の超最適化装置により生成された命令列を説明する図である。
【図７】本願発明とその他の方法により生成された命令列のコードのバイト数とクロック数の関係を示す図である。
【図８】外積を計算するＣ＋＋プログラムを説明する図である。
【図９】外積を演算する場合における命令列を説明する図である。
【符号の説明】
１  構文解析部，  ２  検索実行部，  ３  命令生成部，  ４  命令実行シミュレータ
【図１】
0004158239.tif 000002
【図２】
0004158239.tif 000003
【図３】
0004158239.tif 000004
【図４】
0004158239.tif 000005
【図５】
0004158239.tif 000006
【図６】
0004158239.tif 000007
【図７】
0004158239.tif 000008
【図８】
0004158239.tif 000009
【図９】
0004158239.tif 000010