(57)【要約】【課題】プログラムの実行時間を低減すること。【解決手段】複数の命令を含む命令列５０を取得する取得部４１と、命令列５０に含まれる複数のnop命令の少なくとも一部を、先行する全ての命令の完了を待つwait命令に置換することにより、命令列５０と同じ実行結果が得られる新たな命令列の複数の候補P1〜P3を作成する作成部４２と、候補P1〜P3における命令列からnop命令又はwait命令を削除しても前記実行結果が変わらない場合には、当該命令列からnop命令又はwait命令を削除する処理を複数の候補P1〜P3の各々に対して行う削除部４３と、削除の後の複数の候補P1〜P3のうちで、命令数が規定数以下であり、かつ実行サイクル数が最も少ない候補を選択する選択部４４とを有する情報処理装置２１による。【選択図】図９
2020126303.tif 000002
【特許請求の範囲】
【請求項１】
複数の命令を含む命令列を取得する取得部と、
前記命令列に含まれる複数のnop命令の少なくとも一部を、先行する全ての前記命令の完了を待つwait命令に置換することにより、前記命令列と同じ実行結果が得られる新たな命令列の複数の候補を作成する作成部と、
前記候補における前記命令列から前記nop命令又は前記wait命令を削除しても前記実行結果が変わらない場合には、当該命令列から前記nop命令又は前記wait命令を削除する処理を複数の前記候補の各々に対して行う削除部と、
前記削除の後の複数の前記候補のうちで、命令数が規定数以下であり、かつ実行サイクル数が最も少ない前記候補を選択する選択部と、
を有することを特徴とする情報処理装置。
【請求項２】
前記作成部は、前記命令列に前記nop命令が連続して出現している場合には、連続した前記nop命令を１つの前記wait命令に置換することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記規定数は、後続の前記命令の繰り返しを指示する繰り返し命令が許容する前記後続の命令の上限数であることを特徴とする請求項１に記載の情報処理装置。
【請求項４】
複数の命令を含む命令列を取得する処理と、
前記命令列に含まれる複数のnop命令の少なくとも一部を、先行する全ての前記命令の完了を待つwait命令に置換することにより、前記命令列と同じ実行結果が得られる新たな命令列の複数の候補を作成する処理と、
前記候補における前記命令列から前記nop命令又は前記wait命令を削除しても前記実行結果が変わらない場合には、当該命令列から前記nop命令又は前記wait命令を削除する処理を複数の前記候補の各々に対して行う処理と、
前記削除の後の複数の前記候補のうちで、命令数が規定数以下であり、かつ実行サイクル数が最も少ない前記候補を選択する処理と、
をコンピュータに実行させるための情報処理プログラム。
【請求項５】
複数の命令を含む命令列を取得する処理と、
前記命令列に含まれる複数のnop命令の少なくとも一部を、先行する全ての前記命令の完了を待つwait命令に置換することにより、前記命令列と同じ実行結果が得られる新たな命令列の複数の候補を作成する処理と、
前記候補における前記命令列から前記nop命令又は前記wait命令を削除しても前記実行結果が変わらない場合には、当該命令列から前記nop命令又は前記wait命令を削除する処理を複数の前記候補の各々に対して行う処理と、
前記削除の後の複数の前記候補のうちで、命令数が規定数以下であり、かつ実行サイクル数が最も少ない前記候補を選択する処理と、
をコンピュータが実行することを特徴とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理プログラム、及び情報処理方法に関する。
【背景技術】
【０００２】
プロセッサにおける命令のスループットを高める方式としてパイプライン方式がある。パイプライン方式では、命令フェッチ、命令デコード、命令実行、メモリ参照、及びレジスタへの書き込みの各ステージに命令の実行ステージを分ける。そして、複数の命令を各ステージに連続して投入することにより、プロセッサ内において複数の命令を並列的に実行し、プログラムの実行時間を短縮する。
【０００３】
そのパイプライン方式では、正しい実行結果が得られない原因となる様々なハザードが発生し得る。そのハザードの一つにデータハザードがある。データハザードは、先行命令がその結果をまだレジスタに書き込んでいないにも関わらず、先行命令の結果を利用する後続命令がそのレジスタを読み出してしまうハザードである。
【０００４】
データハザードを回避する方法としてフォワーディングがある。フォワーディングは、先行命令がその結果をレジスタに書き込む前に、その結果を後続命令に供給する技術である。これによりデータハザードは解消されるものの、フォワーディングを行うための配線をプロセッサに設ける必要があり、プロセッサのハードウェア構造が複雑化してしまう。
【０００５】
また、フォワーディングを行わずに、パイプラインをストールさせてデータハザードを回避する方法もある。ストールは、先行命令と後続命令との間にnop(no operation)命令を挿入することにより、先行命令がその結果をレジスタに書き込むまで後続命令をパイプラインに投入しない技術である。
【０００６】
但し、ストールによりデータハザードを回避する方法には、プログラムの実行時間を低減するという点で改善の余地がある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平１１−７３３２７号公報
【特許文献２】特開２００１−３５０６３２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
一側面によれば、本発明は、プログラムの実行時間を低減することを目的とする。
【課題を解決するための手段】
【０００９】
一側面によれば、複数の命令を含む命令列を取得する取得部と、前記命令列に含まれる複数のnop命令の少なくとも一部を、先行する全ての前記命令の完了を待つwait命令に置換することにより、前記命令列と同じ実行結果が得られる新たな命令列の複数の候補を作成する作成部と、前記候補における前記命令列から前記nop命令又は前記wait命令を削除しても前記実行結果が変わらない場合には、当該命令列から前記nop命令又は前記wait命令を削除する処理を複数の前記候補の各々に対して行う削除部と、前記削除の後の複数の前記候補のうちで、命令数が規定数以下であり、かつ実行サイクル数が最も少ない前記候補を選択する選択部とを有する情報処理装置が提供される。
【発明の効果】
【００１０】
一側面によれば、プログラムの実行時間を低減することができる。
【図面の簡単な説明】
【００１１】
【図１】図１（ａ）、（ｂ）は、命令の実行サイクル数について模式的に示す図である。
【図２】図２は、図１（ａ）、（ｂ）の命令列の各々の命令数と実行サイクル数とを示す表である。
【図３】図３は、本実施形態に係るターゲットプロセッサのハードウェア構成図である。
【図４】図４は、本実施形態に係る情報処理装置のハードウェア構成図である。
【図５】図５は、本実施形態に係る情報処理装置２１の機能を示す機能構成図である。
【図６】図６は、本実施形態に係る取得部が取得する命令列の一例を示す図である。
【図７】図７は、本実施形態に係る作成部が命令列の候補を作成する作成方法について示す図である。
【図８】図８は、本実施形態に係る削除部が候補の命令列からnop命令とwait命令とを削除する方法について示す図である。
【図９】図９は、本実施形態に係る各候補の命令列の実行サイクル数を模式的に示す図である。
【図１０】図１０は、本実施形態において候補ごとに得られた実行サイクル数と命令数とを示す図である。
【図１１】図１１は、本実施形態に係る情報処理方法について示すフローチャート（その１）である。
【図１２】図１２は、本実施形態に係る情報処理方法について示すフローチャート（その２）である。
【図１３】図１３（ａ）は、本実施形態の例に係る命令列を示す図であり、図１３（ｂ）は、この命令列に含まれる各命令の依存関係を示す図である。
【図１４】図１４（ａ）は、図１３（ａ）の命令列に対して本実施形態を適用することで命令数が削減された命令列を示す図であり、図１４（ｂ）は、第１の比較例に係る命令列を示す図であり、図１４（ｃ）は、第２の比較例に係る命令列を示す図である。
【図１５】図１５は、本実施形態、第１の比較例、及び第２の比較例の各々の命令列に含まれる命令数と、これらの命令列を１回実行したときの実行サイクル数とを示す図である。
【発明を実施するための形態】
【００１２】
本実施形態の説明に先立ち、本願発明者が検討した事項について説明する。
【００１３】
ハードウェア構造の複雑化を招くフォワーディングを採用せずにデータハザードを回避するにはパイプラインをストールさせればよい。ストールは、パイプラインを一時的に停止する技術であって、先行命令と後続命令との間にnop命令を挿入することで実現し得る。nop命令は、パイプラインレジスタ、レジスタファイル、及びメインメモリ等の内容を変更させない命令である。これにより、nop命令が存在するステージでは上記の各レジスタやメインメモリの内容が変化しないため、パイプラインを停止するストールを行うことができる。
【００１４】
但し、nop命令は、発行してから１クロックサイクルで完了してしまうため、ストールさせるクロックサイクル数に相当する個数のnop命令が必要となり、プログラム全体の命令数が増えてしまう。
【００１５】
特に、命令セットの中には、後続命令の個数に上限数が設けられている命令があり、nop命令によって後続命令の個数がその上限数を超えてしまうおそれがある。このように上限数が設けられている命令としては、例えばDLUアーキテクチャにおけるrep命令や、X86アーキテクチャにおけるloop命令とloopcc命令とがある。
【００１６】
このうち、rep命令は、後続命令の繰り返しを指示する命令であり、「rep n, m」という書式で記述される。第１引数の「n」は、繰り返しの対象となる命令の個数を表す整数値である。また、第２引数の「m」は、繰り返しの回数を表す整数値である。DLUにおいては第１引数の「n」の上限値は１２である。よって、rep命令は、１２個よりも多い個数の後続命令を繰り返して実行することはできない。
【００１７】
命令列におけるnop命令の個数を削減するには、nop命令をwait命令に置換すればよい。wait命令は、先行する全ての命令が完了するのを待つ命令であり、nop命令と同様にパイプラインをストールさせることができる。また、wait命令は、１回の発行でこのようにパイプラインをストールすることができるため、nop命令を使用する場合と比較して命令数を削減できる。
【００１８】
但し、本願発明者が検討したところ、単純にnop命令をwait命令に置換したのでは、命令列全体の実行サイクル数がかえって増大することが明らかとなった。これについて図１（ａ）、（ｂ）を参照しながら説明する。
【００１９】
図１（ａ）、（ｂ）は、命令の実行サイクル数について模式的に示す図である。
【００２０】
このうち、図１（ａ）は、nop命令によりパイプラインをストールさせる命令列１を示す図である。
【００２１】
この命令列１は３つの命令A、B、Cを有しており、クロックサイクルの進行と共に上の命令から順に実行される。
【００２２】
なお、命令A、Bは、いずれも命令を発行してから完了するまで４クロックサイクルを要するものとする。また、命令Cは、命令Aに依存しており、命令Aが書き込みを行ったレジスタを読み出すものとする。よって、命令Aと命令Cとの間でパイプラインをストールさせないとデータハザードが生じることになる。これについては図１（ｂ）の命令列２でも同様である。
【００２３】
パイプラインをストールさせるために、この命令列１ではnop命令を命令Bと命令Cとの間に連続して２つ挿入している。なお、nop命令は、１クロックサイクルで完了するものとする。
【００２４】
これにより、命令Aが完了してから命令Cが開始するようになり、データハザードを回避することができる。但し、nop命令を２つ挿入したことにより、命令列１に含まれる命令数は５個と長くなってしまう。
【００２５】
一方、図１（ｂ）は、wait命令によりパイプラインをストールさせる命令列２を示す図である。
【００２６】
wait命令は、全ての先行命令が完了するまで後続命令の開始を待つ命令である。また、wait命令は、１回発行するだけでこの機能を実現できる。この例では、wait命令に対する先行命令は命令A、Bである。よって、命令A、Bの両方が完了した後に命令Cが開始されるようになり、データハザードを回避することができる。
【００２７】
このように、wait命令は１回の発行のみでパイプラインをストールさせることができるため、nop命令を使用する命令列１（図１（ａ））と比較して命令列２の命令数を少なくすることができる。
【００２８】
但し、wait命令を使うと、命令Aが開始してから命令Cが完了するまで６クロックサイクル必要となり、nop命令を使用する命令列１（図１（ａ））と比較してプログラム全体の実行サイクル数が増えてしまう。
【００２９】
図２は、図１（ａ）、（ｂ）の命令列１、２のそれぞれの命令数と実行サイクル数とを示す表である。
【００３０】
図２に示すように、nop命令のみでストールを行う命令列１は、wait命令でストールを行う命令列２よりも命令数が多くなる。そのため、この例よりも命令数が多いプログラムでは、rep命令が繰り返して実行可能な後続命令数の上限値を命令数が超えてしまい、rep命令でループ処理を実行できなくなるおそれがある。
【００３１】
また、rep命令を使用しない場合であっても、全体の命令数が多くなることでメモリ使用量が増大してしまう。そのため、組み込み機器等のようにメモリサイズが小さい機器向けのアプリケーションプログラムをメモリに格納できないおそれもある。
【００３２】
一方、wait命令でストールを行う命令列２では、命令列１よりも命令数を削減することができる。
【００３３】
但し、実行サイクル数が逆に増加してしまい、プログラムの実行時間が長くなってしまう。
【００３４】
以下に、命令数を削減しつつ、プログラムの実行時間が長くなるのを抑制することが可能な本実施形態について説明する。
【００３５】
（本実施形態）
[ターゲットプロセッサ]
図３は、本実施形態に係るターゲットプロセッサのハードウェア構成図である。
【００３６】
このターゲットプロセッサ１１は、例えば前述のDLUアーキテクチャの命令セットに対してパイプライン処理が可能なプロセッサである。また、ターゲットプロセッサ１１は、インオーダ実行により命令列を処理するプロセッサであり、命令列の先頭から順に命令が実行される。
【００３７】
この例では、ターゲットプロセッサ１１は、命令フェッチ部１２、命令デコード部１３、実行部１４、及び書き込み部１５を有する。これらの各部は、半導体基板上に形成されたレジスタや演算回路等であり、それぞれパイプライン処理のIF(Instruction Fetch)、ID(Instruction Decode)、EX(Execution)、及びWB(Write Back)の各ステージに対応する。
【００３８】
このうち、IFステージは、命令列に含まれる命令を命令フェッチ部１２が順にフェッチするステージである。また、IDステージは、命令デコード部１３が命令フェッチ部１２から命令を受け取り、その命令をデコードするステージである。
【００３９】
EXステージは、命令デコード部１３がデコードした命令に従い、実行部１４が算術演算や論理演算をするステージである。なお、これらの演算で使用するデータは、不図示のレジスタファイルに予め書き込まれている。
【００４０】
そして、WBステージは、EXステージにおいて実行部１４が出力した演算結果を書き込み部１５がレジスタファイルに書き込むステージである。
【００４１】
このようなターゲットプロセッサ１１においては、データハザードを回避するためのフォワーディングライン１６がない。フォワーディングライン１６は、WBステージに入力される前のデータをEXステージに供給する配線である。そのような配線を省くことで、ターゲットプロセッサ１１のハードウェア構造が複雑になるのを抑制することができる。
【００４２】
このようにフォワーディングライン１６がないプロセッサとしては、前述のDLUの他にMIPS R2000、MIPS R3000、及びTexas Instruments製のC6000 VLIW DSP familyもあり、これらをターゲットプロセッサ１１としてもよい。
【００４３】
また、以下では説明を簡単にするためにストア命令等のメモリ参照命令を用いていないが、メモリ参照命令を用いる場合には、メモリ参照を行うMEMステージをEXステージとWRステージとの間に設けてもよい。
【００４４】
[ハードウェア構成]
図４は、本実施形態に係る情報処理装置のハードウェア構成図である。
【００４５】
情報処理装置２１は、前述のターゲットプロセッサ１で実行されるプログラムの中間コードを出力するPCやサーバ等の計算機である。
【００４６】
この例では、情報処理装置２１は、記憶部２２、メインメモリ２３、プロセッサ２４、入力部２５、及び表示部２６を備える。これらの各部はバス２７によって相互に接続される。
【００４７】
このうち、記憶部２２は、例えばHDD(Hard Disk Drive)やSSD(Solid State Drive)等の二次記憶装置であり、本実施形態に係る情報処理プログラム３０を記憶する。情報処理プログラム３０は、入力された命令列の命令数を後述のように削減するプログラムである。
【００４８】
なお、その情報処理プログラム３０をコンピュータが読み取り可能な記録媒体２８に記録させておき、プロセッサ２４に記録媒体２８の情報処理プログラム３０を読み取らせるようにしてもよい。
【００４９】
そのような記録媒体２８としては、例えばCD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、及びUSB(Universal Serial Bus)メモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体２８として使用してもよい。これらの記録媒体２８は、物理的な形態を持たない搬送波のような一時的な媒体ではない。
【００５０】
更に、公衆回線、インターネット、及びLAN(Local Area Network)等に接続された装置に情報処理プログラム３０を記憶させておき、プロセッサ２４が情報処理プログラム３０を読み出して実行するようにしてもよい。
【００５１】
一方、メインメモリ２３は、DRAM等のようにデータを一時的に記憶するハードウェアであって、その上に前述の情報処理プログラム３０が展開される。
【００５２】
プロセッサ２４は、自装置の各部を制御したり、メインメモリ２３と協働して情報処理プログラム３０を実行したりするCPU(Central Processing Unit)等のハードウェアである。
【００５３】
なお、本実施形態ではターゲットプロセッサ１１（図３参照）とは異なるプロセッサ２４が情報処理プログラム３０を実行する場合を想定しているが、本実施形態はこれに限定されない。例えば、ターゲットプロセッサ１１を備えたマシンで情報処理プログラム３０を実行してもよい。
【００５４】
入力部２５は、キーボードやマウス等の入力デバイスである。ユーザがこれらの入力デバイスを操作することにより、情報処理プログラム３０で処理すべき命令列を指定したり、処理後の命令列の出力先が指定されたりする。
【００５５】
また、表示部２６は、情報処理プログラム３０の実行時にユーザが使用する様々なコマンドを表示する液晶ディスプレイ等の表示デバイスである。
【００５６】
[機能構成]
図５は、本実施形態に係る情報処理装置２１の機能を示す機能構成図である。
【００５７】
図５に示すように、情報処理装置２１は、取得部４１、作成部４２、削除部４３、選択部４４、及び出力部４５を有する。これらの各部は、プロセッサ２４とメインメモリ２３が協働して前述の情報処理プログラム３０を実行することにより実現される。
【００５８】
このうち、取得部４１は、命令列を取得する機能ユニットであり、例えば図６に示す命令列５０を取得する。
【００５９】
図６は、取得部４１が取得する命令列５０の一例を示す図である。
【００６０】
命令列５０は、前述のターゲットプロセッサ１で実行されるバイナリファイルを生成するための中間コードであり、命令A、命令B、命令C、命令D、及びnop命令を実行順に上から並べた列である。また、命令A、命令B、命令C、命令Dの例としては、算術演算命令、論理演算命令、ジャンプ命令、及びメモリ参照命令等がある。
【００６１】
また、nop命令は、前述のようにパイプラインレジスタ、レジスタファイル、及びメインメモリ等の内容を変更させないことによりパイプラインをストールさせる命令である。MIPSにおいては、これと等価な機能の「sll $0,$0,0」でnop命令が実現される。
【００６２】
なお、これらの命令は全て１クロックサイクルで発行されるものとする。また、発行から完了までのサイクル数は以下の通りとする。
命令A：８クロックサイクル
命令B：４クロックサイクル
命令C：１クロックサイクル
命令D：１クロックサイクル
nop命令：１クロックサイクル
【００６３】
更に、命令Dは、命令Aに依存しており、命令Aが書き込みを行ったレジスタを読み出すものとする。そして、命令Cは、命令Bに依存しており、命令Bが書き込みを行ったレジスタを読み出すものとする。
【００６４】
nop命令は、このような命令間の依存関係に起因してデータハザードが生じるのを防止するために命令列５０に挿入される。なお、以下では取得部４１がnop命令を含む命令列５０を取得する場合を例にして説明するが、情報処理プログラム３０自体がソースコードをコンパイルして命令列５０を生成するようにしてもよい。また、前述のようにnop命令によって命令列５０の命令数が増えているため、本実施形態では後述のようにその命令数を削減する。
【００６５】
再び図５を参照する。
作成部４２は、上記の命令列５０と同一の実行結果を有する新たな命令列の複数の候補を作成する。
図７は、その候補の作成方法について示す図である。
【００６６】
図７に示すように、この例では三つの候補P1〜P3が作成される。
【００６７】
これらの候補P1〜P3は、元の命令列５０における複数のnop命令の少なくとも一部をwait命令に置換することにより作成される。前述のように、wait命令は、１回の発行で先行命令の全てが完了するのを待つ命令である。
【００６８】
例えば、候補P1は、命令列５０における３個の連続したnop命令を１つのwait命令に置き換えることで作成される。この場合、命令Aと命令Bの完了を待って命令Cが開始されるため、依存関係にある命令B、Cに起因したデータハザードは生じない。同様に、依存関係にある命令A、Dに起因したデータハザードも生じない。
【００６９】
また、候補P2は、命令列５０における２個の連続したnop命令を１つのwait命令に置き換えることで作成される。この場合は、命令Dは、先行する全ての命令が完了するのをまってから開始される。よって、依存関係にある命令A、Dに起因したデータハザードも生じない。
【００７０】
一方、候補P3は、命令列５０における３個の連続したnop命令を１つのwait命令に置き換え、かつ命令列５０における２個の連続したnop命令を１つのwait命令に置き換えることで作成される。この場合も、候補P1、P2と同様にデータハザードは生じない。
【００７１】
なお、候補P1〜P3のいずれにおいても、複数のnop命令が連続して出現している場合には、これらの連続した複数のnop命令を一つのwait命令に置き換えている。
【００７２】
これにより、複数のnop命令のうちの一つのみをwait命令に置き換える場合と比較して各候補P1〜P3の命令数を削減できる。更に、複数のnop命令のうちの一つのみをwait命令に置換した候補を許容すると候補数が不必要に増えてしまうが、この例のように連続したnop命令を一括してwait命令に置換することで候補数の増大を抑制することもできる。
【００７３】
なお、これらの候補P1〜P3は、元の命令列５０における連続したnop命令をwait命令に単に置き換えただけであるため、命令数を削減する余地がある。
【００７４】
そこで、削除部４３（図５参照）は、これらの候補P1〜P3の各々から不要なnop命令とwait命令を削除する。
図８は、その削除の方法について示す図である。
【００７５】
不要かどうかは、nop命令やwait命令を削除しても命令列の実行結果が変わらないかどうかという観点から判断される。
【００７６】
例えば、候補P1の２つの連続したnop命令を削除しても、命令Dの開始前に命令Aが完了しているため、依存関係にある命令A、Dに起因したデータハザードは生じることがなく、削除前と実行結果が変わらない。よって、削除部４３は、候補P1における２つの連続したnop命令を削除する。
【００７７】
一方、候補P1のwait命令を削除してしまうと、命令Bが完了する前に命令Cが開始してしまう。前述のように命令B、Cは依存関係にあるため、このようにwait命令を削除すると元の命令列とは異なる実行結果を有する命令列が得られてしまう。よって、削除部４３は、候補P1におけるwait命令は削除しない。
【００７８】
候補P2と候補P3についてもこれと同様の方法で削除部４３がnop命令やwait命令を削除可能かどうか判断し、削除可能と判断した場合にこれらの命令を削除する。
【００７９】
例えば、候補P2ではnop命令やwait命令を削除すると削除前と実行結果が変わってしまうため、候補P2についてはこれらの命令を削除しない。また、候補P3では、２番目のwait命令を削除しても実行結果が変わらないため、そのwait命令を削除部４３が削除する。
【００８０】
選択部４４（図５参照）は、図８のように削除を行った各候補P1〜P3のうちで、命令数が規定数N0以下であり、かつ実行サイクル数が最も少ない候補を選択する。
【００８１】
規定数N0は、rep命令のように後続命令の個数に上限数が設けられている命令を使用する場合にはその上限数となる。また、rep命令を使用しない場合であっても、メモリ使用量を抑えるために命令数に予め上限数を設定しておき、その上限数を規定数N0として採用してもよい。
その選択方法について図９を参照しながら説明する。
【００８２】
図９は、各候補P1〜P3の命令列の実行サイクル数を模式的に示す図である。
【００８３】
選択部４４は、各命令A、B、C、Dの発行から完了までのサイクル数を利用することで各候補P1〜P3の実行サイクル数を算出する。このように算出された実行サイクル数は、候補P1では１０となる。また、候補P2の実行サイクル数は９であり、候補P3の実行サイクル数は１０である。
【００８４】
更に、選択部４４は、各候補P1〜P3の各々の命令列に含まれる命令数を算出する。
【００８５】
図１０は、このように候補P1〜P3ごとに得られた実行サイクル数と命令数とを示す図である。
【００８６】
この例では、命令数の規定数N0を８とする。この場合、選択部４４は、命令数がその規定数N0（＝８）以下となる各候補P1〜P3のうちで、実行サイクル数が最も少ない候補P2を選択する。
【００８７】
このように選択された候補P2は、データハザードが生じない命令列のうち実行サイクル数が最も少ない命令列である。よって、この候補P2の命令列をコンパイルして得られたバイナリファイルを前述のターゲットプロセッサ１（図３参照）で実行することで、データハザードの発生を防止しつつプログラムの実行速度を向上させることができる。
【００８８】
そして、出力部４５（図５参照）は、この候補P2の命令列を最終的な出力結果として出力する。
【００８９】
[フローチャート]
次に、本実施形態に係る情報処理方法について説明する。
図１１は、本実施形態に係る情報処理方法について示すフローチャートである。
【００９０】
まず、ステップS1において、取得部４１が図６の命令列５０を取得する。
【００９１】
次に、ステップS2に移り、取得部４１が、その命令列５０に含まれる命令数Nをカウントする。
【００９２】
次いで、ステップS3に移り、取得部４１が、その命令数Nが規定数N0以下かどうかを判断する。ここで、命令数Nは規定数N0以下である(YES)と判断された場合には、命令列５０の命令を削減する必要はない。よって、この場合は正常に処理を終了する。
【００９３】
一方、ステップS3において命令数Nは規定数N0以下ではない(NO)と判断された場合には、ステップS4の命令数の削除処理を行う。
【００９４】
図１２は、その命令数の削除処理について示すフローチャートである。
【００９５】
まず、ステップS10において、作成部４２が、命令列５０と同一の実行結果を有する新たな命令列の複数の候補P1〜P3（図７参照）を作成する。
【００９６】
次に、ステップS11に移り、削除部４３が、図８に示したように候補P1〜P3の各々から不要なnop命令とwait命令を削除する。
【００９７】
そして、ステップS12に移り、選択部４４が、図１０に示したように命令列の実行サイクル数と命令数nとを候補P1〜P3ごとに算出する。
【００９８】
続いて、ステップS13に移り、選択部４４が、各候補P1〜P3の中に、命令数nが規定数N0以下となる候補があるかを判断する。ここで、ない（ＮＯ）と判断された場合にはステップS14に移り、出力部４５がエラーを出力して終了する。
【００９９】
一方、ステップS13において命令数nが規定数N0以下となる候補があると判断された場合にはステップS15に移る。
【０１００】
そのステップS15では、選択部４４が、各候補P1〜P3のうちで、命令数nが規定数N0以下であり、かつ実行サイクル数が最も少ない候補を選択する。前述の図１０の例のように規定数N0を８とした例では、実行サイクル数が他のいずれの候補よりも少ない候補P2が選択される。
【０１０１】
そして、ステップS16に移り、ステップS15で選択した候補P2を出力部４５が出力する。
【０１０２】
以上により、本実施形態に係る情報処理方法の基本ステップを終了する。
【０１０３】
上記した本実施形態によれば、ステップS10において複数のnop命令の一部をwait命令に置換した新たな命令列の候補P1〜P3を作成する。そして、ステップS11において、これらの候補P1〜P3の各々の命令列から不要なnop命令とwait命令を削除し、これらを削除した候補のうちで命令数nが規定数N0よりも小さく、かつ実行サイクル数が最小のものを選択する。
【０１０４】
このようにして選択した命令列は、実行結果が元の命令列５０と同一でありながらその命令数が命令列５０よりも少なくなるため、rep命令のように後続命令数に制限のある命令を使用することができる。また、rep命令を使用しない場合であっても、命令数を削減したことでメモリ使用量を少なくすることもできる。
【０１０５】
しかも、命令数nが規定数N0よりも小さい複数の候補のうちで実行サイクル数が最小のものを選択したため、プログラムの実行時間を低減できるという技術的な効果が奏される。
【０１０６】
次に、本実施形態の更に具体的な例について説明する。
図１３（ａ）は、この例に係る命令列６０を示す図である。この例では、８SIMDのDLUで使用される命令列６０について説明する。
【０１０７】
この命令列６０は、ループ処理の内側のベーシックブロックを形成する命令列である。ここでは、２つのベクトルの各要素の平均値を求めるループ処理を想定している。なお、各ベクトルの要素は３２ビットの符号無し整数である。また、各ベクトルの要素数は８×１２８個である。
命令列６０における各命令の意味は次の通りである。
【０１０８】
%xor_xy = ixors %x, %y  …  レジスタ「x」の内容とレジスタ「y」の内容の排他的論理和をレジスタ「xor_xy」に書き込む
【０１０９】
%and_xy = iands %x, %y  …  レジスタ「x」の内容とレジスタ「y」の内容の論理和をレジスタ「and_xy」に書き込む
【０１１０】
%srl_xor_xy = isrls %xor_xy, 1  …  レジスタ「xor_xy」の内容を右に１ビットだけ論理シフトしたものをレジスタ「srl_xor_xy」に書き込む
【０１１１】
%res = iadds %and_xy, %srl_xor_xy  …  レジスタ「and_xy」の内容とレジスタ「srl_xor_xy」の内容との算術和をレジスタ「res」に書き込む
【０１１２】
なお、この例では前述のように8SIMDを想定しており、この命令列６０を１回実行する度に上記の全てのレジスタの番号が８だけ自動的にずれる。そして、この命令列６０を１２８回繰り返すことにより、レジスタ「res」の番号を８だけずらしながら、これらのレジスタ「res」に８×１２８個の要素の平均値が書き込まれていく。
【０１１３】
図１３（ｂ）は、この命令列６０に含まれる各命令の依存関係を示す図である。
【０１１４】
この例では、依存関係がある命令の間に矢印を設ける。また、その矢印の向きは、命令列６０における各命令の出現順を表す。例えば、iadds命令は、iands命令が出現した後に命令列に出現することを表す。
【０１１５】
図１３（ａ）に出現している命令は、nop命令を除き、全て８クロックサイクルで完了する。
【０１１６】
よって、このようにiands命令とisrls命令との間に６個のnop命令を挿入すると、最初のixors命令が開始してから８クロックサイクルを経過した後にisrls命令が開始する。これにより、依存関係のあるixors命令とisrls命令に起因したデータハザードを回避することができる。
【０１１７】
同様に、isrls命令とiadds命令との間に７個のnop命令を挿入したことで、isrls命令が開始してから８クロックサイクルを経過した後にiadds命令が開始する。その結果、依存関係のあるisrls命令とiadds命令に起因したデータハザードを回避することができる。
【０１１８】
このように命令列６０を繰り返して実行する命令としては前述のrep命令がある。但し、rep命令が繰り返して実行可能な後続命令数の上限値は１２であるのに対し、この命令列６０の命令数は１７個であるため、このままでは命令列６０をrep命令で繰り返して実行することができない。
【０１１９】
このような場合には、命令列６０に対して図１１〜図１２に示した本実施形態に係る情報処理方法を適用し、命令数の削減を図ればよい。
【０１２０】
図１４（ａ）は、命令列６０に対して本実施形態を適用することで命令数が削減された命令列７１を示す図である。
【０１２１】
この命令列７１における命令数は１１個であり、rep命令が実行可能な後続命令数の上限値（＝１２）よりも少ないため、rep命令によって命令列７１の命令列を繰り返して実行することが可能となる。よって、この場合は、例えば出力部４５が命令列７１にrep命令を追加して出力することで、命令列７１がrep命令の第２引数だけ繰り返されるループ処理を有する中間コードを得ることができる。なお、この例では前述のように繰り返しの回数を１２８回とするため、rep命令の第２引数は１２８となる。また、rep命令の第１引数は、繰り返しの対象となる命令列７１の命令数である１１となる。
【０１２２】
図１４（ｂ）は、第１の比較例に係る命令列７２を示す図である。
【０１２３】
第１の比較例に係る命令列７２は、元の命令列６０において連続しているnop命令を全て１つのwait命令に置換して得られた命令列である。その命令列７２における命令数は６個であるため、rep命令により命令列７２を繰り返し実行することができる。このようにrep命令を使用する場合、rep命令の第１引数は命令列７２の命令数である６となり、第２引数は繰り返しの回数である１２８となる。
【０１２４】
また、図１４（ｃ）は、第２の比較例に係る命令列７３を示す図である。
【０１２５】
第２の比較例に係る命令列７３は、元の命令列６０の命令数を削減せずに、ジャンプ命令でループ処理を実現する命令列である。
【０１２６】
第２の比較例では、ループ処理を実現するために、ループ回数を書き込むためのレジスタ「loop_cnt」と、全てのレジスタに共通のベースアドレスを書き込むためのレジスタ「loop_cnt」とを使用している。また、ベースアドレスの増分値を書き込むためのレジスタ「inc」も使用している。なお、前述のようにこの例では8SIMDを想定しているため、その増分値は８となる。
【０１２７】
これらのレジスタを使用する各命令の意味は次の通りである。
【０１２８】
%loop_cnt = sub %loop_cnt, 1  …  レジスタ「loop_cnt」に書き込まれているループ回数を１だけ減じる
【０１２９】
%baseadr=add %baseadr,%inc  …  レジスタ「baseadr」に書き込まれているベースアドレスを、レジスタ「inc」に書き込まれている増分値（＝８）だけ増やす
【０１３０】
bnzr %loop_cnt, LoopBegin  …  レジスタ「loop_cnt」に書き込まれているループ回数が０でないときはラベル「LoopBegin」にジャンプし、ループ回数が０のときは後続の命令を実行する
【０１３１】
図１５は、本実施形態に係る命令列７１、第１の比較例に係る命令列７２、及び第２の比較例に係る命令列７３の各々の命令数と、これらの命令列を１回実行したときの実行サイクル数とを示す図である。
【０１３２】
図１５に示すように、本実施形態の命令数は、rep命令が実行可能な後続命令数の上限値（１２）よりも少ない。第１の比較例でもその上限値よりも少ない命令数となっているが、第１の比較例では実行サイクル数が２２であり、本実施形態における実行サイクル数よりも増えてしまっている。
【０１３３】
また、第２の比較例では、命令数と実行サイクル数のいずれも本実施形態よりも大きくなってしまっている。
【０１３４】
この結果から、命令数を削減しつつ実行サイクル数を低減するのに本実施形態が有効であることが明らかとなった。
【０１３５】
なお、図１４（ａ）の例では命令数がrep命令に規定された規定数N0（＝１２）よりも少なくなったが、元の命令列によっては、本実施形態を適用しても命令数が規定数N0以下となる候補が存在しない場合も想定される。その場合には、図１２のステップＳ１４のようにエラーを表示するのに代えて、図１４（ｃ）のようにジャンプ命令でループ処理を実現する命令列７３を出力部４５（図５参照）が出力してもよい。この命令列７３は、前述のように元の命令列６０（図１３（ａ））にsub命令、add命令、及びbnzr命令を追加した命令列であり、rep命令を用いる場合（図１４（ａ））と同じ実行結果が得られる命令列である。
【０１３６】
以上説明した各実施形態に関し、更に以下の付記を開示する。
（付記１）  複数の命令を含む命令列を取得する取得部と、
前記命令列に含まれる複数のnop命令の少なくとも一部を、先行する全ての前記命令の完了を待つwait命令に置換することにより、前記命令列と同じ実行結果が得られる新たな命令列の複数の候補を作成する作成部と、
前記候補における前記命令列から前記nop命令又は前記wait命令を削除しても前記実行結果が変わらない場合には、当該命令列から前記nop命令又は前記wait命令を削除する処理を複数の前記候補の各々に対して行う削除部と、
前記削除の後の複数の前記候補のうちで、命令数が規定数以下であり、かつ実行サイクル数が最も少ない前記候補を選択する選択部と、
を有することを特徴とする情報処理装置。
（付記２）  前記作成部は、前記命令列に前記nop命令が連続して出現している場合には、連続した前記nop命令を１つの前記wait命令に置換することを特徴とする付記１に記載の情報処理装置。
（付記３）  前記規定数は、後続の前記命令の繰り返しを指示する繰り返し命令が許容する前記後続の命令の上限数であることを特徴とする付記１に記載の情報処理装置。
（付記４）  選択した前記候補の前記命令列に、当該命令列の繰り返しを指示する前記繰り返し命令を追加して出力する出力部を更に有することを特徴とする付記３に記載の情報処理装置。
（付記５）  前記命令数が前記規定数以下となる前記候補がない場合には、前記繰り返し命令と同じ実行結果が得られる命令を前記命令列に追加して出力する出力部を更に有することを特徴とする付記３に記載の情報処理装置。
（付記６）  複数の命令を含む命令列を取得する処理と、
前記命令列に含まれる複数のnop命令の少なくとも一部を、先行する全ての前記命令の完了を待つwait命令に置換することにより、前記命令列と同じ実行結果が得られる新たな命令列の複数の候補を作成する処理と、
前記候補における前記命令列から前記nop命令又は前記wait命令を削除しても前記実行結果が変わらない場合には、当該命令列から前記nop命令又は前記wait命令を削除する処理を複数の前記候補の各々に対して行う処理と、
前記削除の後の複数の前記候補のうちで、命令数が規定数以下であり、かつ実行サイクル数が最も少ない候補を選択する処理と、
をコンピュータに実行させるための情報処理プログラム。
（付記７）  複数の命令を含む命令列を取得する処理と、
前記命令列に含まれる複数のnop命令の少なくとも一部を、先行する全ての前記命令の完了を待つwait命令に置換することにより、前記命令列と同じ実行結果が得られる新たな命令列の複数の候補を作成する処理と、
前記候補における前記命令列から前記nop命令又は前記wait命令を削除しても前記実行結果が変わらない場合には、当該命令列から前記nop命令又は前記wait命令を削除する処理を複数の前記候補の各々に対して行う処理と、
前記削除の後の複数の前記候補のうちで、命令数が規定数以下であり、かつ実行サイクル数が最も少ない候補を選択する処理と、
をコンピュータが実行することを特徴とする情報処理方法。
【符号の説明】
【０１３７】
１、２、５０、６０、７１〜７３…命令列、１１…ターゲットプロセッサ、１２…命令フェッチ部、１３…命令デコード部、１４…実行部、１５…書き込み部、２１…情報処理装置、２２…記憶部、２３…メインメモリ、２４…プロセッサ、２５…入力部、２６…表示部、２７…バス、２８…記録媒体、４１…取得部、４２…作成部、４３…削除部、４４…選択部、４５…出力部、P1〜P3…候補。
【図１】
2020126303.tif 000003
【図２】
2020126303.tif 000004
【図３】
2020126303.tif 000005
【図４】
2020126303.tif 000006
【図５】
2020126303.tif 000007
【図６】
2020126303.tif 000008
【図７】
2020126303.tif 000009
【図８】
2020126303.tif 000010
【図９】
2020126303.tif 000011
【図１０】
2020126303.tif 000012
【図１１】
2020126303.tif 000013
【図１２】
2020126303.tif 000014
【図１３】
2020126303.tif 000015
【図１４】
2020126303.tif 000016
【図１５】
2020126303.tif 000017