(57)【特許請求の範囲】
【請求項１】
複数の命令を繰り返すループ処理の記述を含むプログラムを記憶する記憶部と、
前記複数の命令内のロード命令におけるデータのロード先として第１のレジスタを設定し、前記ループ処理がソフトウェアパイプラインによりパイプライン化されるように、前記プログラムにおける前記複数の命令の実行順を並べ替え、ＳＩＭＤ（Single Instruction Multiple Data）拡張命令用の第２のレジスタの右に前記第１のレジスタを結合させて得られる記憶領域内のデータ列を左にシフトさせるシフト命令を、前記プログラムにおける前記ループ処理の記述中に挿入する演算部と、
を有する計算機。
【請求項２】
前記演算部は、パイプライン化により同時に保持するデータ数がＮ（Ｎは、２以上の整数）の場合、前記第１のレジスタにロードしたデータがＮ回のシフトで前記第２のレジスタの先頭に移動するように、前記シフト命令の１回当たりのシフト量を設定する、
ことを特徴とする請求項１記載の計算機。
【請求項３】
前記演算部は、前記ソフトウェアパイプラインをレジスタリネーミングで実現したときに、同時に保持するデータ数分のレジスタが確保できるか否かを判断し、レジスタが不足する場合に、前記ロード命令におけるデータのロード先としての前記第１のレジスタの設定と前記シフト命令の挿入とを行う、
ことを特徴とする請求項１または２に記載の計算機。
【請求項４】
コンピュータが、
複数の命令を繰り返すループ処理の記述を含むプログラムに基づいて、前記複数の命令内のロード命令におけるデータのロード先として第１のレジスタを設定し、
前記ループ処理が、ソフトウェアパイプラインによりパイプライン化されるように、前記プログラムにおける前記複数の命令の実行順を並べ替え、
ＳＩＭＤ拡張命令用の第２のレジスタの右に前記第１のレジスタを結合させて得られる記憶領域内のデータ列を左にシフトさせるシフト命令を、前記プログラムにおける前記ループ処理の記述中に挿入する、
コンパイル方法。
【請求項５】
コンピュータに、
複数の命令を繰り返すループ処理の記述を含むプログラムに基づいて、前記複数の命令内のロード命令におけるデータのロード先として第１のレジスタを設定し、
前記ループ処理が、ソフトウェアパイプラインによりパイプライン化されるように、前記プログラムにおける前記複数の命令の実行順を並べ替え、
ＳＩＭＤ拡張命令用の第２のレジスタの右に前記第１のレジスタを結合させて得られる記憶領域内のデータ列を左にシフトさせるシフト命令を、前記プログラムにおける前記ループ処理の記述中に挿入する、
処理を実行させるコンパイルプログラム。
【請求項６】
複数の命令を繰り返すループ処理を、コンピュータに、ソフトウェアパイプラインによりパイプライン化して実行させるパイプライン処理プログラムであって、
前記コンピュータに、
前記複数の命令内のロード命令により、第１のレジスタにデータをロードし、
パイプライン化された前記ループ処理の繰り返しごとに、ＳＩＭＤ拡張命令用の第２のレジスタの右に前記第１のレジスタを結合させて得られる記憶領域内のデータ列を左にシフトさせ、前記第２のレジスタからロードしたデータを参照する、
処理を実行させるパイプライン処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラムに関する。
【背景技術】
【０００２】
コンピュータに実行させるプログラムを生成する際に、ソフトウェアパイプライン（ソフトウェアパイプライニング、モジュロスケジューリングとも呼ぶ）により、ループ処理の最適化が行われることがある。ソフトウェアパイプラインは、ループ処理を対象とした命令スケジューリングを行い、ループ内の命令レベル並列性を高めるコンパイラの最適化手法である。大規模なプログラムにおける実行性能のボトルネックとなるのは、主としてループ処理である。そのため、ループ処理に対してソフトウェアパイプラインによる最適化を適用することは非常に重要である。
【０００３】
ソフトウェアパイプラインでは、ループの回転（イテレーション）をまたがって、命令スケジューリングが行われる。このスケジューリングに伴って、複数のループ分の処理が並列で実行され、各ループで使用するレジスタのライブレンジ（生存区間）が重なる。そのため、並列で実行されるループ間で同じレジスタを使用しないように、コンパイラによりレジスタリネーミングが行われる。
【０００４】
なお、プロセッサに実行させる命令は、命令セットアーキテクチャ（ＩＳＡ：Instruction Set Architecture）で規定される。ＩＳＡには、ＳＩＭＤ（Single Instruction Multiple Data）拡張命令が含まれることがある。ＳＩＭＤ拡張命令は、１つの命令を複数のデータに適用できるようにしたものである。このように、ＩＳＡの強化により、プロセッサの処理能力を向上させることができる。
【０００５】
プロセッサの処理能力向上に関する技術としては、例えばベクトル化処理命令に対する命令セットアーキテクチャを強化する技術も考えられている。またレジスタファイルのアクセス回数を低減することで処理時間を短縮する技術も考えられている。
【０００６】
プロセッサに実行させる処理の効率化に関する技術として、例えば条件付きループのベクトル化に関する技術がある。またアライメント命令の実行により、宛て先に格納される２つの連結されたソースのデータ要素の選択的な格納を行う技術がある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００１−１４７８０４号公報
【特許文献２】特開２０１２−１２８７９０号公報
【特許文献３】特開２０１２−１２８７９０号公報
【特許文献４】特表２０１４−５１０３５２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記のように、ソフトウェアパイプラインの適用によりループ処理をパイプラインで処理することで、処理の効率化が図れる。しかし、ソフトウェアパイプラインを用いた最適化によりレジスタリネーミングが行われると、使用するレジスタ数が増加する。そのため、ソフトウェアパイプラインの適用により使用するレジスタ数が増加し、レジスタ割り付けを行う際にレジスタが不足しやすくなる。レジスタが不足した場合、レジスタ内容の退避・復元命令（ロード、ストア命令）が、ループ内に追加される可能性がある。このような退避・復元命令の追加は、実行性能に悪影響を与え、ソフトウェアパイプラインによる実効性能の改善効果が相殺されてしまう。
【０００９】
１つの側面では、本発明は、ソフトウェアパイプライン適用時の使用レジスタ数を抑制することを目的とする。
【課題を解決するための手段】
【００１０】
１つの案では、以下のような記憶部と演算部とを有する計算機が提供される。記憶部は、複数の命令を繰り返すループ処理の記述を含むプログラムを記憶する。演算部は、ループ処理がソフトウェアパイプラインによりパイプライン化されるように、プログラムにおける複数の命令の実行順を並べ替える。次に演算部は、ＳＩＭＤ拡張命令用のレジスタを用いる命令を、プログラムにおけるループ処理の記述中に挿入する。
【発明の効果】
【００１１】
１態様によれば、ソフトウェアパイプライン適用時の使用レジスタ数を抑制できる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態に係る計算機の構成例を示す図である。
【図２】第２の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。
【図３】ソフトウェアパイプラインの一例を示す図である。
【図４】疑似レジスタの使用例を示す図である。
【図５】レジスタリネーミングの発生状況の一例を示す図である。
【図６】ループのイテレーションごとの疑似レジスタの割り当て例を示す図である。
【図７】結合シフト命令によるデータシフトの一例を示す図である。
【図８】結合シフト命令を用いた疑似レジスタ割り当ての例を示す図である。
【図９】コンパイラの機能を示すブロック図である。
【図１０】ソフトウェアパイプライン化の処理手順の一例を示すフローチャートである。
【図１１】第２のソフトウェアパイプライン化の処理手順の一例を示すフローチャートである。
【図１２】命令配置処理の手順の一例を示すフローチャートである。
【図１３】結合シフト命令挿入処理の手順の一例を示すフローチャートである。
【図１４】ソフトウェアパイプライン化対象のループ処理の例を示す図である。
【図１５】第１のソフトウェアパイプライン化後の命令列を示す図である。
【図１６】第２のソフトウェアパイプライン化後の命令列を示す図である。
【図１７】ＭＶＥ数＝４となる場合の例を示す図である。
【図１８】ＭＶＥ数＝４の場合の第２のソフトウェアパイプライン化後の命令列を示す図である。
【発明を実施するための形態】
【００１３】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第１の実施の形態〕
従来のソフトウェアパイプラインの方法ではレジスタが増加しすぎて、最適化を適用できない場合があった。そこで第１の実施の形態では、例えばＳＩＭＤ拡張命令用のレジスタ（以下、ＳＩＭＤ拡張レジスタと呼ぶ）を活用したレジスタリネーミングにより、ソフトウェアパイプライン最適化による使用レジスタ数を抑止する。使用するレジスタ数が抑止されることで、ソフトウェアパイプラインを適用できる可能性が向上する。
【００１４】
図１は、第１の実施の形態に係る計算機の構成例を示す図である。計算機１０は、記憶部１１と演算部１２とを有する。
記憶部１１は、複数の命令を繰り返すループ処理の記述を含むプログラム１を記憶する。
【００１５】
演算部１２は、命令スケジューリングにより、ループ処理がソフトウェアパイプラインによりパイプライン化されるように、プログラム１における複数の命令の実行順を並べ替える（ステップＳ１１）。次に演算部１２は、複数の命令内のロード命令におけるデータのロード先として第１のレジスタ２を設定する（ステップＳ１２）。さらに演算部１２は、データ複数個分の記憶領域を有する第２のレジスタ３の右に第１のレジスタ２を結合させて得られる記憶領域内のデータ列を左にシフトさせるシフト命令を、プログラム１におけるループ処理の記述中に挿入する（ステップＳ１３）。そして、演算部１２は、ソフトウェアパイプライン化したプログラムを出力する。
【００１６】
なお第２のレジスタ３は、例えばＳＩＭＤ拡張レジスタである。また演算部１２は、例えば、シフト命令のシフト量を、例えばロード命令によるデータのロードから、参照を伴う命令（例えばａｄｄ命令）による該データの参照までの期間に同時に保持するデータ数Ｎ（Ｎは、２以上の整数）に基づいて設定する。例えば演算部１２は、第１のレジスタ２にロードしたデータが、Ｎ回のシフトで第２のレジスタ３の先頭に移動するように、シフト命令の１回当たりのシフト量を設定する。図１の例では、第２のレジスタ３は、ロード対象のデータ４〜７のデータ長の４倍の記憶領域を有している。また図１の例では、同時に保持するデータ数Ｎは「４」である。そこで、図１の例では、第１のレジスタ２にロードしたデータ４〜７が、それぞれ４回の左シフトで第２のレジスタ３の先頭に移動するように、データ４〜７のデータ長分のシフト量が設定される。
【００１７】
演算部１２でソフトウェアパイプライン化したプログラムを計算機１０が実行すると、パイプライン化されたループ処理の繰り返し（イテレーション）ごとに、以下の処理が実行される。
【００１８】
まず１ループ分の処理を示す複数の命令内のロード命令に基づき、データが第１のレジスタ２へロードされる。次に、シフト命令に基づき、第２のレジスタ３の右に第１のレジスタ２を結合させて得られる記憶領域内のデータ列が左にシフトされる。イテレーションがパイプラインで並列に実行されることで、１つのイテレーションの実行期間中に、左シフトが繰り返し行われることとなる。そして参照を伴う命令（例えばａｄｄ命令）に基づき、左シフトの繰り返しにより第２のレジスタ３の先頭に移動したデータが参照される。
【００１９】
図１の例では、第１のイテレーション（Ｉ＝１）のロード命令により第１のレジスタ２にデータ４がロードされる。ロードされたデータ４は、第１のイテレーション（Ｉ＝１）のシフト命令（ｅｃｓｌ）で、所定量（例えばデータ４のデータ長）だけ左にシフトされる。これにより、データ４は、第２のレジスタ３の最後部（図中の右端）の領域に移動する。
【００２０】
その後、第２のイテレーション（Ｉ＝２）のロード命令により第１のレジスタ２にデータ５がロードされる。これまでにロードされている２つのデータ４，５は、第２のイテレーション（Ｉ＝２）のシフト命令（ｅｃｓｌ）で、所定量だけ左にシフトされる。次に、第３のイテレーション（Ｉ＝３）のロード命令により第１のレジスタ２にデータ６がロードされる。これまでにロードされている３つのデータ４〜６は、第３のイテレーション（Ｉ＝３）のシフト命令（ｅｃｓｌ）で、所定量だけ左にシフトされる。さらに、第４のイテレーション（Ｉ＝４）のロード命令により第１のレジスタ２にデータ７がロードされる。これまでにロードされている４つのデータ４〜７は、第４のイテレーション（Ｉ＝４）のシフト命令（ｅｃｓｌ）で、所定量だけ左にシフトされる。
【００２１】
第４のイテレーション（Ｉ＝４）のシフト命令（ｅｃｓｌ）が実行された結果、データ４が、第２のレジスタ３の先頭に移動する。その後、第１のイテレーション（Ｉ＝１）のａｄｄ命令により、第２のレジスタ３の先頭にあるデータ４が参照される。
【００２２】
このようにして、２つのレジスタを使用して、ソフトウェアパイプライン化が実現できる。これにより、同時に保持するデータ数分のレジスタを、レジスタリネーミングで割り当てる場合に比べ、使用するレジスタ数が削減される。
【００２３】
図１の例であれば、ループ処理における４つのイテレーションが並列で処理されるようにパイプライン化が行われている。この場合、第１のイテレーション（Ｉ＝１）内のロード命令でロードしたデータを、ａｄｄ命令で参照するまでに、第２〜第４のイテレーション（Ｉ＝２，３，４）それぞれのロード命令が実行される。そのため、シフト命令を用いずにレジスタリネーミングで対応しようとすると、４つのレジスタを使用することとなる。それに対して、第１の実施の形態では、２つのレジスタだけで、ソフトウェアパイプラインを適用することができる。
【００２４】
このような第１の実施の形態におけるレジスタ数の削減効果は、ＳＩＭＤ拡張レジスタのような大きなデータを格納できるレジスタを有効利用することで実現されている。すなわち、ＳＩＭＤ拡張レジスタは、ＳＩＭＤ拡張命令を格納できるだけの記憶領域を有している。ＳＩＭＤ拡張命令は、処理対象のデータを複数含むため、通常の命令よりもデータ量が多い。そのためＳＩＭＤ拡張レジスタは、例えばロード命令でロードするデータのデータ長の数倍（図１の例では４倍）の記憶領域を有する。ただし多くのプロセッサでは、ＳＩＭＤ拡張レジスタの先頭以外の記憶領域のみを指定したデータのロードや参照はできない。そこで、第１の実施の形態では、例えばＳＩＭＤ拡張レジスタのような大きな記憶領域を有する第２のレジスタ３の右に第１のレジスタ２を結合し、シフト命令によって、第１のレジスタ２内のデータを、第２のレジスタ３内の所定の場所に保持させる。これにより、ＳＩＭＤ拡張レジスタのような大きな記憶容量のレジスタが有効に利用され、ソフトウェアパイプライン適用時に使用するレジスタ数が削減される。その結果、レジスタ不足となることが抑制され、ソフトウェアパイプラインにより効率的な処理を実行できる可能性が高くなる。
【００２５】
しかも、第１の実施の形態では、store（退避）とload（復元）との２つの命令に相当する処理が、１つのシフト命令（ｅｃｓｌ）で実現されている。これは、以下の２つの特徴を活用したものである。
【００２６】
第１の特徴は、シフト命令（ｅｃｓｌ）は、データを、上位要素（右側の記憶領域）から順次下位要素（左側の記憶領域）にシフトする命令である、という点である。第２の特徴は、ソフトウェアパイプラインがループの繰り返しである、という点である。これらの特徴により、退避（最上位要素に入れる）と復元（最下位要素に入れる）とを同時に行うことが可能となる。また、ＳＩＭＤレジスタ内の要素を示す要素番号を指定せずに済むため、命令そのものがループごとに変化することもなく、アンロールなどの命令複製をせずに済む。第１の実施の形態におけるこれらの利点は、レジスタの上位要素に空きがあった場合に、その上位要素を指定して退避・復元を実施したのでは得ることができない。
【００２７】
なお、図１に示したパイプライン化は、他のパイプライン化においてレジスタ不足となる場合にのみ適用することもできる。例えば演算部１２は、ソフトウェアパイプラインをレジスタリネーミングで実現したときに、同時に保持するデータ数分のレジスタが確保できるか否かを判断する。そして演算部１２は、レジスタが不足する場合に、図１に示したように、ロード命令におけるデータのロード先としての第１のレジスタの設定とシフト命令の挿入とを行い、ソフトウェアパイプライン化を実現する。これにより、他に処理効率が高いパイプライン化が可能な場合には、効率的な方のパイプライン化を適用することができる。
【００２８】
また第１の実施の形態に示すパイプライン化の処理は、例えばプログラム１のコンパイル時に実行することができる。コンパイル時のパイプライン化で生成される実行形式のファイルは、例えばＳＩＭＤ拡張レジスタを有するプロセッサが搭載された計算機で実行できる。
【００２９】
なお、演算部１２は、例えば計算機１０が有するプロセッサにより実現することができる。また、記憶部１１は、例えば計算機１０が有するメモリにより実現することができる。
【００３０】
〔第２の実施の形態〕
次に第２の実施の形態について説明する。第２の実施の形態では、ソースファイルのコンパイル時に、ソフトウェアパイプラインによる最適化を実施する。また第２の実施の形態では、２つのＳＩＭＤ拡張レジスタを結合して得られる記憶領域内のデータをシフトさせるＳＩＭＤ拡張レジスタ結合シフト命令（以下、結合シフト命令と呼ぶ）を用いて、ソフトウェアパイプラインによる最適化を実現する。
【００３１】
図２は、第２の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。コンピュータ１００は、プロセッサ１０１によって装置全体が制御されている。プロセッサ１０１には、バス１０９を介してメモリ１０２と複数の周辺機器が接続されている。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ（Central Processing Unit）、ＭＰＵ（Micro Processing Unit）、またはＤＳＰ（Digital Signal Processor）である。プロセッサ１０１がプログラムを実行することで実現する機能の少なくとも一部を、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現してもよい。
【００３２】
プロセッサ１０１は、ＳＩＭＤ拡張命令を有するＩＳＡをサポートしている。なおプロセッサ１０１は、命令パイプラインを有していてもよい。命令がプロセッサ上でパイプライン化されていると、ループボディの命令列を命令スケジューリングによってパイプライン化した結果として得られる解の範囲が広がる。その結果、命令レベル並列性が高い解を得ることができ、最適化の効果が非常に大きくなる。またプロセッサ１０１は、ＳＩＭＤ拡張レジスタ群１０１ａを有している。ＳＩＭＤ拡張レジスタ群１０１ａは、ＳＩＭＤ拡張命令を格納できるだけのデータ幅を有するレジスタの集合である。
【００３３】
メモリ１０２は、コンピュータ１００の主記憶装置として使用される。メモリ１０２には、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ１０２には、プロセッサ１０１による処理に利用する各種データが格納される。メモリ１０２としては、例えばＲＡＭ（Random Access Memory）などの揮発性の半導体記憶装置が使用される。
【００３４】
バス１０９に接続されている周辺機器としては、ＨＤＤ（Hard Disk Drive）１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、機器接続インタフェース１０７およびネットワークインタフェース１０８がある。
【００３５】
ＨＤＤ１０３は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、コンピュータ１００の補助記憶装置として使用される。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。なお、補助記憶装置としては、フラッシュメモリなどの不揮発性の半導体記憶装置（ＳＳＤ：Solid State Drive）を使用することもできる。
【００３６】
グラフィック処理装置１０４には、モニタ２１が接続されている。グラフィック処理装置１０４は、プロセッサ１０１からの命令に従って、画像をモニタ２１の画面に表示させる。モニタ２１としては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００３７】
入力インタフェース１０５には、キーボード２２とマウス２３とが接続されている。入力インタフェース１０５は、キーボード２２やマウス２３から送られてくる信号をプロセッサ１０１に送信する。なお、マウス２３は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００３８】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク２４に記録されたデータの読み取りを行う。光ディスク２４は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク２４には、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００３９】
機器接続インタフェース１０７は、コンピュータ１００に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース１０７には、メモリ装置２５やメモリリーダライタ２６を接続することができる。メモリ装置２５は、機器接続インタフェース１０７との通信機能を搭載した記録媒体である。メモリリーダライタ２６は、メモリカード２７へのデータの書き込み、またはメモリカード２７からのデータの読み出しを行う装置である。メモリカード２７は、カード型の記録媒体である。
【００４０】
ネットワークインタフェース１０８は、ネットワーク２０に接続されている。ネットワークインタフェース１０８は、ネットワーク２０を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００４１】
以上のようなハードウェア構成によって、第２の実施の形態の処理機能を実現することができる。なお、第１の実施の形態に示した計算機１０も、図２に示したコンピュータ１００と同様のハードウェアにより実現することができる。
【００４２】
コンピュータ１００は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第２の実施の形態の処理機能を実現する。コンピュータ１００に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、コンピュータ１００に実行させるプログラムをＨＤＤ１０３に格納しておくことができる。プロセッサ１０１は、ＨＤＤ１０３内のプログラムの少なくとも一部をメモリ１０２にロードし、プログラムを実行する。またコンピュータ１００に実行させるプログラムを、光ディスク２４、メモリ装置２５、メモリカード２７などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ１０１からの制御により、ＨＤＤ１０３にインストールされた後、実行可能となる。またプロセッサ１０１が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
【００４３】
第２の実施の形態では、コンピュータ１００がコンパイラを有し、コンパイラにより、プログラムのソースファイルをコンパイルする。その際、ループ処理については、ソフトウェアパイプラインを適用することができる。
【００４４】
図３は、ソフトウェアパイプラインの一例を示す図である。ソフトウェアパイプラインを行う前の入力ループ３１では、イテレーションごとに、カーネル３１ａ，３１ｂ，３１ｃが順番に実行される。カーネル３１ａ，３１ｂ，３１ｃは、繰り返し実行される命令列である。入力ループ３１は、レジスタ割り付けを行う前であり、各命令のオペランドには、割り付け前の疑似的なレジスタ（以下、疑似レジスタ）が設定される。
【００４５】
コンパイルの際には、ソフトウェアパイプラインによる命令スケジューリングが行われる。命令スケジューリングでは、演算器資源の競合を無くしパイプラインストールが生じないように、命令が並べ替えられる。このとき、各カーネル３１ａ，３１ｂ，３１ｃは、ステージと呼ばれるいくつかの命令列のまとまりへ分割される。
【００４６】
命令スケジューリングによる変形後の出力ループ３２は、全ステージＳ１，Ｓ２，Ｓ３を重ね合わせた命令列が、ループカーネル３２ａ，３２ｂ，３２ｃとなる。各ステージＳ１，Ｓ２，Ｓ３はサイクル数が等しく、かつすべてのサイクルにおいて、各サイクルの時点におけるステージ間で資源の競合がない。例えばプロセッサ１０１に備わっているＡＬＵ（Arithmetic and Logic Unit ）が２つであるとき、ＡＬＵを要求する命令が、同じサイクルに３つ以上存在しない。
【００４７】
命令スケジューリングを行う際には、疑似レジスタの使用状況やライブレンジ、および演算器資源の競合を考慮して命令が配置される。
図４は、疑似レジスタの使用例を示す図である。ＳＩＭＤ拡張レジスタ群１０１ａには、複数のレジスタＲ１，Ｒ２，Ｒ３，・・・が含まれる。レジスタＲ１，Ｒ２，Ｒ３，・・・は、浮動小数点レジスタであり、４−ｗｉｄｅのＳＩＭＤ拡張レジスタである。すなわちＳＩＭＤ拡張レジスタは、プロセッサ１０１が取り扱う単位データのデータ幅の４倍の記憶領域を有している。
【００４８】
各レジスタＲ１，Ｒ２，Ｒ３，・・・は、記憶領域が４つの要素で構成される。各要素には、１〜４の要素番号が付与されている。ＳＩＭＤ拡張命令を記憶する場合、レジスタＲ１，Ｒ２，Ｒ３，・・・の４つの要素がすべて使用される。
【００４９】
第２の実施の形態におけるプロセッサのＩＳＡにおいて、スカラ命令では、要素番号「１」の要素のみが使用でき、拡張部分である要素番号「２」、「３」、「４」の要素を使用できない。すなわち、レジスタ割り付けとして扱えるのは、各レジスタの先頭の要素（要素番号「１」）のみであり、拡張部分の要素（要素番号「２」、「３」、「４」）への割り付けは行えない。そのため、各レジスタＲ１，Ｒ２，Ｒ３，・・・は、先頭の要素のみが使用され、それ以外の要素は使用されない場合がある。
【００５０】
図４では、レジスタＲ１，Ｒ２，Ｒ３，・・・内の使用されている要素を網掛けで示している。例えばレジスタＲ２は、要素番号「１」の要素は使用されているが、他の要素は使用されていない。すなわち、要素番号「２」、「３」、「４」の要素は空き領域である。
【００５１】
レジスタ割り当てで割り当て可能なすべての要素が割り当て済みとなれば、それ以上レジスタを割り当てることはできない。すなわち、ＳＩＭＤ拡張レジスタ群内に、空きの要素があっても割り付けられるレジスタが不足する場合がある。なお、スカラ命令で要素番号「２」の要素を使用できるＩＳＡもあるが、一般には、ＳＩＭＤ拡張レジスタのすべての要素を使用することはできない。
【００５２】
また、ソフトウェアパイプラインを適用すると、リネーミング対象となる疑似レジスタが生じる。
図５は、レジスタリネーミングの発生状況の一例を示す図である。例えば、スカラload命令で定義した疑似レジスタをスカラadd命令で参照するものとする。仮想的なマイクロアーキテクチャを想定し、図５のように命令がスケジューリングされたとする。３つのステージＳ１，Ｓ２，Ｓ３にスケジューリングできた場合、出力ループでは、ステージを重ねて新しいカーネルが生成される。このとき、最初のイテレーション（Ｉ＝１）と次のイテレーション（Ｉ＝２）とが同じ疑似レジスタを用いると、２回目のイテレーションのload命令が疑似レジスタを上書きしてしまう。そのため、偽の依存関係（Write After Read）ができてしまう。
【００５３】
Write After Readを解消しステージを重ね合わせるためには、レジスタリネーミングが行われる。一般には、ステージの数はいくらでもよく、何回転先の命令と重なるかもスケジューリングの結果次第である。レジスタリネーミングにより使用するレジスタの数は、ＭＶＥ（Modulo Variable Expansion）数と呼ばれる。図５の例では、２個のレジスタを使用するため、ＭＶＥ数＝２である。最適化適用後のループは、レジスタリネーミングを実施しＭＶＥ数だけアンロール（ループを展開する処理）が行われる。
【００５４】
図６は、ループのイテレーションごとの疑似レジスタの割り当て例を示す図である。Ｉ＝１のイテレーションのロード命令（load）では、ＳＩＭＤ拡張レジスタ４１の最初の要素が、疑似レジスタ４１ａとして割り当てられている。Ｉ＝２のイテレーションのロード命令では、ＳＩＭＤ拡張レジスタ４２の最初の要素が、疑似レジスタ４２ａとして割り当てられている。Ｉ＝１の回転で定義された疑似レジスタ４１ａとＩ＝２のイテレーションのロード命令で定義された疑似レジスタ４２ａのライブレンジは、２サイクル重なっている。
【００５５】
このように、イテレーションごとに、個別のＳＩＭＤ拡張レジスタ４１，４２の先頭の要素を疑似レジスタ４１ａ，４２ａとして割り当てると、ＭＶＥ数の分だけＳＩＭＤ拡張レジスタが使用される。すなわち、図６に示すような疑似レジスタの割り当ては、ＭＶＥ数分の空きＳＩＭＤ拡張レジスタが存在する場合にのみ可能となる。
【００５６】
一方、ＳＩＭＤ拡張レジスタ４１，４２における要素番号「２」〜「４」の要素は、使用されていない。そこで、第２の実施の形態では、空きＳＩＭＤ拡張レジスタが不足する場合、ＳＩＭＤ拡張レジスタ４１，４２における要素番号「２」〜「４」の要素を有効に利用して、ソフトウェアパイプラインの適用時に利用するＳＩＭＤ拡張レジスタ数を削減する。
【００５７】
ＳＩＭＤ拡張レジスタの要素番号「２」〜「４」の要素を有効利用するために、結合シフト命令を用いることができる。なお、結合シフト命令の配置においても、他の命令をスケジュールする場合と同様に、演算器資源の競合、疑似レジスタのライブレンジ、およびレイテンシなどが考慮される。そして、各ステージの疑似的なレジスタがリネーミングされ、重ね合わせた新しいカーネルが生成される。
【００５８】
図７は、結合シフト命令によるデータシフトの一例を示す図である。結合シフト命令では、２つのＳＩＭＤ拡張レジスタ４３，４４が、結合した１つのレジスタとして扱われる。そして結合シフト命令により、結合されたレジスタ内の要素ごとのデータが、左へシフトされる。シフト量は、即値（オペランドとして書き込まれた数値）で指定される。図７には、シフト量「２」の場合の例が示されている。
【００５９】
このような結合シフト命令を用いて、ＳＩＭＤ拡張レジスタ内の使われていない要素へ、データの格納および読み出しが可能となる。
図８は、結合シフト命令を用いた疑似レジスタ割り当ての例を示す図である。なお、図８の「ecsl」は、結合シフト命令を示す。
【００６０】
Ｉ＝１のイテレーションでは、ＳＩＭＤ拡張レジスタ４４の要素番号「１」の要素にデータ５１がロードされる。そしてシフト量「２」の結合シフト命令により、ロードされたデータ５１は、ＳＩＭＤ拡張レジスタ４３の要素番号「３」の要素に転送される。
【００６１】
次に、Ｉ＝２のイテレーションにおいて、ＳＩＭＤ拡張レジスタ４４の要素番号「１」の要素にデータ５２がロードされる。この時点では、Ｉ＝１のイテレーションでロードされたデータ５１は既に転送されており、そのデータ５１が上書きされることはない。そしてシフト量「２」の結合シフト命令により、データ５１がＳＩＭＤ拡張レジスタ４３の要素番号「１」の要素に転送され、データ５２がＳＩＭＤ拡張レジスタ４３の要素番号「３」の要素に転送される。Ｉ＝１のイテレーションでは、ＳＩＭＤ拡張レジスタ４３の要素番号「１」の要素内のデータ５１が、add命令により参照される。
【００６２】
これにより、ＳＩＭＤ拡張レジスタ４３，４４の要素番号「３」の要素が利用可能となり、レジスタプレッシャが減少する。
なお、結合シフト命令におけるシフト量は、命令挿入前における疑似レジスタのライブレンジの重なり（ＭＶＥ数に相当）に依存する。例えばＭＶＥ数が２であり、ＳＩＭＤ拡張レジスタの幅が疑似レジスタの４倍であれば、図８に示すようにシフト量が「２」となる。ＭＶＥ数が４であり、ＳＩＭＤ拡張レジスタの幅が疑似レジスタの４倍であれば、シフト量を「１」とすればよい。また図６に示すようなソフトウェアパイプラインにおけるＭＶＥ数分のアンロール処理は結合シフト命令によるシフトで実現でき、結合シフト命令を挿入した場合、別でアンロールをしなくてもよい。
【００６３】
次に、第２の実施の形態におけるソフトウェアパイプラインを用いたコンパイル処理について詳細に説明する。
図９は、コンパイラの機能を示すブロック図である。コンピュータ１００に実行されるコンパイラ１１０は、例えばソースファイル６１に高級言語で記述されたプログラムを、コンピュータ１００が実行可能なコードに変換し、オブジェクトファイル６２を生成する。
【００６４】
コンパイラ１１０は、プログラムの変換過程でループ処理の命令列をソフトウェアパイプラインにより最適化するパイプライン化部１１１を有する。パイプライン化部１１１は、ループ検出部１１１ａ、第１の最適化部１１１ｂ、および第２の最適化部１１１ｃを有する。ループ検出部１１１ａは、ソースファイル６１に記述されたプログラム内のループ処理を示す命令列を検出する。第１の最適化部１１１ｂは、ループ処理を、例えば図６に示すように、結合シフト命令を使用せずに、ソフトウェアパイプラインで最適化する。
【００６５】
第２の最適化部１１１ｃは、ループ処理を、例えば図８に示すように、結合シフト命令を使用して、ソフトウェアパイプラインで最適化する。第２の最適化部１１１ｃは、例えば、第１の最適化部１１１ｂが生成した中間表現に対して、ＩＳＡやマイクロアーキテクチャの情報に基づいて、疑似レジスタのライブレンジの重なり、演算器資源の重なりを解析する。マイクロアーキテクチャは、プロセッサに実行させる機械語に関する実装レベルのアーキテクチャである。第２の最適化部１１１ｃは、解析結果に基づいて、ＳＩＭＤ拡張レジスタへの転送命令を挿入する。
【００６６】
なお、図９に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。また、図９に示した各要素の機能は、例えば、その要素に対応するプログラムモジュールをコンピュータに実行させることで実現することができる。
【００６７】
次に、ソフトウェアパイプライン化の処理手順について説明する。
図１０は、ソフトウェアパイプライン化の処理手順の一例を示すフローチャートである。
【００６８】
［ステップＳ１０１］ループ検出部１１１ａは、ソースファイル６１をコンパイラが中間表現へと変換したプログラムから、ループ処理の命令列（入力ループ）を取得する。例えばfor文に対応する命令列などが取得される。
【００６９】
［ステップＳ１０２］第１の最適化部１１１ｂは、結合シフト命令を使用しないソフトウェアパイプライン化（第１のソフトウェアパイプライン化）により、ループ処理を最適化する。
【００７０】
［ステップＳ１０３］第２の最適化部１１１ｃは、最適化が成功し、かつレジスタが足りているか否かを判断する。例えば第２の最適化部１１１ｃは、使用する疑似レジスタの数に応じた、使用可能なＳＩＭＤ拡張レジスタがある場合、レジスタが足りていると判断する。最適化が成功し、かつレジスタが足りている場合、処理がステップＳ１０４に進められる。また、最適化に失敗したか、または成功してもレジスタが不足している場合、処理がステップＳ１０５に進められる。
【００７１】
［ステップＳ１０４］第２の最適化部１１１ｃは、第１のソフトウェアパイプライン化適用後の命令列を出力し、処理を終了する。
［ステップＳ１０５］第２の最適化部１１１ｃは、入力ループにおけるループ処理で使用するＳＩＭＤ拡張レジスタに、空き領域（使用されていない要素）があるか否かを判断する。空き領域があれば、処理がステップＳ１０６に進められる。空き領域がなければ、処理がステップＳ１１０に進められる。
【００７２】
［ステップＳ１０６］第２の最適化部１１１ｃは、入力ループの実行時に１つ以上の空きレジスタがあるか否かを判断する。１つ以上の空きレジスタがあれば、処理がステップＳ１０７に進められる。空きレジスタがなければ、処理がステップＳ１１０に進められる。
【００７３】
［ステップＳ１０７］第２の最適化部１１１ｃは、結合シフト命令を用いた第２のソフトウェアパイプライン化処理を行う。この処理の詳細は後述する（図１１参照）。
［ステップＳ１０８］第２の最適化部１１１ｃは、第２のソフトウェアパイプライン化による最適化が成功し、かつレジスタが足りるか否かを判断する。最適化が成功し、かつレジスタが足りる場合、処理がステップＳ１０９に進められる。最適化に失敗したか、あるいはレジスタが不足する場合、処理がステップＳ１１０に進められる。
【００７４】
［ステップＳ１０９］第２の最適化部１１１ｃは、第２のソフトウェアパイプライン化適用後の命令列を出力し、処理を終了する。
［ステップＳ１１０］第２の最適化部１１１ｃは、ソフトウェアパイプライン化を断念し、入力ループをそのまま出力し、処理を終了する。
【００７５】
このように第１のソフトウェアパイプライン化を適用できない場合に、結合シフト命令を用いた第２のソフトウェアパイプライン化が実施される。
次に、第２のソフトウェアパイプライン化処理について詳細に説明する。
【００７６】
図１１は、第２のソフトウェアパイプライン化の処理手順の一例を示すフローチャートである。
［ステップＳ１２１］第２の最適化部１１１ｃは、ステージ幅（サイクル数）に関する、ステップＳ１２２〜Ｓ１２８のループ（第１のループ）を実行する。第１のループでは、ステージ幅を、１サイクルから徐々に大きくする。ステージ幅が所定の上限に達するまで、ループが繰り返される。ステージ幅の上限は、翻訳時間の長さを考慮して、例えば１００サイクル程度とする。
【００７７】
［ステップＳ１２２］第２の最適化部１１１ｃは、ＭＶＥ数に関する、ステップＳ１２３〜Ｓ１２７のループ（第２のループ）を実行する。第２の最適化部１１１ｃは、第２のループにおいて、ＭＶＥ数を１からＳＩＭＤ幅（ＳＩＭＤ拡張レジスタの要素数）まで、徐々に大きくする。ＭＶＥ数としては、ＳＩＭＤ幅を割り切れる数（約数）のみ取り得るものとする。ＳＩＭＤ幅が４であれば、ＭＶＥ数として、１，２，４を取ることができる。これによりＭＶＥ数を、結合シフト命令のシフト量とすることができる。
【００７８】
［ステップＳ１２３］第２の最適化部１１１ｃは、命令選択に関する、ステップＳ１２４〜ステップＳ１２６のループ（第３のループ）を実行する。第２の最適化部１１１ｃは、第３のループにおいて、入力ループの命令を１つずつ選択する。
【００７９】
［ステップＳ１２４］第２の最適化部１１１ｃは、選択した命令の配置処理を行う。命令配置処理の詳細は後述する（図１２参照）。命令の配置とは、図８に示すように、イテレーションごとに、各サイクルで実行する命令を並べる処理である。
【００８０】
［ステップＳ１２５］第２の最適化部１１１ｃは、選択した命令の配置が成功したか否かを判断する。配置が成功した場合、処理がステップＳ１２６に進められる。配置に失敗した場合、処理がステップＳ１２８に進められる。
【００８１】
［ステップＳ１２６］第２の最適化部１１１ｃは、入力ループ内のすべての命令を配置したか否かを判断する。すべての命令の配置が完了した場合、処理がステップＳ１３１に進められる。配置されていない命令がある場合、処理がステップＳ１２７に進められる。
【００８２】
［ステップＳ１２７］第２の最適化部１１１ｃは、現在処理中のステージ幅およびＭＶＥ数において、すべての命令が選択済みとなったら、処理をステップＳ１２８に進める。第２の最適化部１１１ｃは、未選択の命令がある場合は、未選択の命令の１つを選択して、ステップＳ１２４〜Ｓ１２６の処理を行う。
【００８３】
［ステップＳ１２８］第２の最適化部１１１ｃは、現在処理中のステージ幅およびＭＶＥ数において、入力ループ内のいずれかの命令の配置に失敗した場合、ＭＶＥ数を増加させ、ステップＳ１２３〜Ｓ１２７の処理を行う。ＭＶＥ数が取り得るすべての値について処理が完了している場合、処理がステップＳ１２９に進められる。
【００８４】
［ステップＳ１２９］第２の最適化部１１１ｃは、現在処理中のステージ幅において、入力ループ内のすべての命令を配置可能なＭＶＥ数が存在しない場合、ステージ幅を拡大し、ステップＳ１２２〜Ｓ１２８の処理を行う。すでにステージ幅の上限に達している場合、処理がステップＳ１３０に進められる。
【００８５】
［ステップＳ１３０］第２の最適化部１１１ｃは、ステージ幅を上限まで広げても、すべての命令の配置ができない場合、スケジューリング（最適化）に失敗したとの戻り値を設定して、第２のソフトウェアパイプライン化処理を終了する。
【００８６】
［ステップＳ１３１］第２の最適化部１１１ｃは、すべての命令を配置できた場合、レジスタリネーミング対象の命令があるか否かを判断する。レジスタリネーミング対象の命令がある場合、処理がステップＳ１３２に進められる。レジスタリネーミング対象の命令がなければ、処理がステップＳ１３３に進められる。
【００８７】
［ステップＳ１３２］第２の最適化部１１１ｃは、レジスタリネーミング対象の命令に対してレジスタリネーミングを実施すると共に、アンロールを実施する。
［ステップＳ１３３］第２の最適化部１１１ｃは、スケジューリング（最適化）が成功したとの戻り値を設定して、スケジューリングした命令列を出力する。その後、第２のソフトウェアパイプライン化処理が終了する。
【００８８】
次に、命令配置処理について詳細に説明する。
図１２は、命令配置処理の手順の一例を示すフローチャートである。
［ステップＳ１４１］第２の最適化部１１１ｃは、選択した命令を配置可能な発行サイクルを走査する。例えば第２の最適化部１１１ｃは、選択した命令と、入力ループ内の他の命令との先後関係などに基づいて、選択した命令を配置可能な、該命令の発効サイクルを特定する。
【００８９】
［ステップＳ１４２］第２の最適化部１１１ｃは、配置可能な発行サイクル内での命令の配置場所に関する、ステップＳ１４３〜Ｓ１４９のループを実行する。命令配置場所に関するループでは、配置可能な場所のうち、他の命令が配置されていない場所が、順番に選択される。
【００９０】
［ステップＳ１４３］第２の最適化部１１１ｃは、他の命令と演算器の競合がないかを判断する。演算器は、加算器や乗算器などのＡＬＵ、ＳＩＭＤ演算ユニット、メモリアクセス用ユニットなどがある。選択した命令を実行する演算器が、選択した場所と同じサイクルに配置された他の命令の実行に使用される場合、競合があると判断される。競合がある場合、処理がステップＳ１５０に進められる。競合がない場合、処理がステップＳ１４４に進められる。
【００９１】
［ステップＳ１４４］第２の最適化部１１１ｃは、データ依存関係が入力ループと同じか否かを判断する。例えば、第１の命令の実行の結果得られたデータを、第２の命令で参照する場合、第２の命令は、第１の命令に依存している。入力ループでこのような依存関係にある場合、スケジューリング後の命令配置において、第１の命令の実行完了後に第２の命令が実行される配置となっていれば、データ依存関係が同じと判断される。データ依存関係が同じ場合、処理がステップＳ１４５に進められる。データ依存関係が異なる場合、処理がステップＳ１５０に進められる。
【００９２】
［ステップＳ１４５］第２の最適化部１１１ｃは、選択した命令で定義されている疑似レジスタ（定義レジスタ）がリネーミング対象か否かを判断する。例えば選択した命令が、図５に示すように、他のイテレーションで使用している疑似レジスタに対してデータをロードする場合、ロード先として定義されている定義レジスタがリネーミング対象となる。リネーミング対象であれば、処理がステップＳ１４６に進められる。リネーミング対象でなければ、処理がステップＳ１５３に進められる。
【００９３】
［ステップＳ１４６］第２の最適化部１１１ｃは、選択した命令がスカラを定義する命令か否かを判断する。例えばＳＩＭＤ拡張命令のように複数のデータに対して処理を行う命令ではなく、１つのデータに対して処理を行う命令の場合、スカラを定義する命令と判断される。スカラを定義する命令の場合、処理がステップＳ１４８に進められる。スカラを定義する命令ではない場合、処理がステップＳ１４７に進められる。
【００９４】
［ステップＳ１４７］第２の最適化部１１１ｃは、リネーミング用にＭＶＥ数−１個の空きレジスタがあるか否かを判断する。十分な空きレジスタがある場合、処理がステップＳ１５２に進められる。空きレジスタが不足している場合、処理がステップＳ１５０に進められる。
【００９５】
［ステップＳ１４８］第２の最適化部１１１ｃは、結合シフト用に１個の空きレジスタがあるか否かを判断する。結合シフト用の空きレジスタがあれば、処理がステップＳ１４９に進められる。空きレジスタがなければ、処理がステップＳ１５０に進められる。
【００９６】
［ステップＳ１４９］第２の最適化部１１１ｃは、命令のＭＶＥ数が、ステップＳ１２２に示す第２のループで選択したＭＶＥ数と同じか否かを判断する。ＭＶＥ数が一致すれば、処理がステップＳ１５４に進められる。ＭＶＥ数が一致しなければ、処理がステップＳ１５０に進められる。
【００９７】
［ステップＳ１５０］第２の最適化部１１１ｃは、配置可能なサイクル内のすべての場所についてステップＳ１４３〜Ｓ１４９の処理を実行しても、命令が配置できなければ、処理をステップＳ１５１に進める。未処理の場所があれば、未選択の場所のうちの１つを選択して、ステップＳ１４３〜Ｓ１４９の処理を実行する。
【００９８】
［ステップＳ１５１］第２の最適化部１１１ｃは、配置可能なサイクル内に、選択した命令を配置できる場所がないと判断し、命令配置に失敗したことを示す戻り値を設定して配置処理を終了する。
【００９９】
［ステップＳ１５２］第２の最適化部１１１ｃは、選択中の命令をリネーミング対象とする。
［ステップＳ１５３］第２の最適化部１１１ｃは、選択中の命令を、選択中の場所に配置する。その後、処理がステップＳ１５６に進められる。
【０１００】
［ステップＳ１５４］第２の最適化部１１１ｃは、結合シフト命令の挿入処理を行う。この処理の詳細は後述する（図１３参照）。
［ステップＳ１５５］第２の最適化部１１１ｃは、選択した命令と結合シフト命令との配置に成功したか否かを判断する。配置に成功した場合、処理がステップＳ１５６に進められる。配置に失敗した場合、処理がステップＳ１５１に進められる。
【０１０１】
［ステップＳ１５６］第２の最適化部１１１ｃは、命令の配置に成功したことを示す戻り値を設定して、配置処理を終了する。
次に、結合シフト命令挿入処理について詳細に説明する。
【０１０２】
図１３は、結合シフト命令挿入処理の手順の一例を示すフローチャートである。
［ステップＳ１６１］第２の最適化部１１１ｃは、配置対象の命令に定義されている定義レジスタを、一時レジスタへの定義に変更して配置する。一時レジスタは、ロードデータを一時的に格納する疑似レジスタである。
【０１０３】
［ステップＳ１６２］第２の最適化部１１１ｃは、一時レジスタの最初の要素を、元の定義レジスタの最後の要素に移す結合シフト命令を生成する。
［ステップＳ１６３］第２の最適化部１１１ｃは、結合シフト命令の配置に関する、ステップＳ１６４〜Ｓ１６５のループを実行する。このループでは、結合シフト命令を配置可能な場所が順番に選択される。
【０１０４】
［ステップＳ１６４］第２の最適化部１１１ｃは、選択した場所に結合シフト命令を配置した場合に、他の命令との演算器の競合がないか判断する。競合がない場合、処理がステップＳ１６５に進められる。競合が発生する場合、処理がステップＳ１６６に進められる。
【０１０５】
［ステップＳ１６５］第２の最適化部１１１ｃは、データ依存関係が入力ループと同じとなるか否かを判断する。データ依存関係が同じとなれば、処理がステップＳ１６８に進められる。データ依存関係が異なる場合、処理がステップＳ１６６に進められる。
【０１０６】
［ステップＳ１６６］第２の最適化部１１１ｃは、すべての場所についてステップＳ１６４〜Ｓ１６５の処理を実行しても、結合シフト命令が配置できなければ、処理をステップＳ１６７に進める。未処理の場所があれば、未選択の場所のうちの１つを選択して、ステップＳ１６４〜Ｓ１６５の処理を実行する。
【０１０７】
［ステップＳ１６７］第２の最適化部１１１ｃは、結合シフト命令の挿入に失敗したとの戻り値を設定して、結合シフト命令挿入処理を終了する。
［ステップＳ１６８］第２の最適化部１１１ｃは、選択した場所に結合シフト命令を配置する。
【０１０８】
［ステップＳ１６９］第２の最適化部１１１ｃは、結合シフト命令の挿入に成功したとの戻り値を設定して、結合シフト命令挿入処理を終了する。
このようにして、ソフトウェアパイプラインによる最適化が行われる。以下、具体的な最適化の例について説明する。
【０１０９】
図１４は、ソフトウェアパイプライン化対象のループ処理の例を示す図である。図１４には、ソースファイルから抽出された入力ループ７１を、ＩＳＡに従った命令列７２に変換した例である。図１４では、命令が疑似命令によって記述されている。なお、ソフトウェアパイプラインは、ＣＰＵのマイクロアーキテクチャに依存する。そのため、パイプライン化部１１１は、ＣＰＵの内部的なパイプライン構造、演算器資源情報を予め保持している。
【０１１０】
変換後の命令列７２の１行目「move r0, #0」は、sumに相当する、総和演算結果を保持する変数を格納するレジスタ「ｒ０」を、０で初期化する命令である。２行目「addr r2, a」は、配列ａの先頭アドレスを取得し、レジスタ「ｒ２」に格納する命令である。３行目「add r3, a, 400」は、indexの終値を表す配列のアドレスを計算し、レジスタ「ｒ３」に格納する命令である。
【０１１１】
ループ内の１行目「load r4, [r2]」は、レジスタ「ｒ２」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値をレジスタ「ｒ４」に格納する命令である。２行目「add r0, r4」は、レジスタ「ｒ４」の値とレジスタ「ｒ０」の値との和を、レジスタ「ｒ０」に格納する命令である。３行目「add r2, 4」は、レジスタ「ｒ２」に設定されている配列のアドレスを「４」だけ進める命令である。４行目「brne LOOP, r2, r3」は、レジスタ「ｒ２」の値とレジスタ「ｒ３」の値とが一致するまでループを繰り返すことを示す命令である。
【０１１２】
このようなループ処理に対して、まず、結合シフト命令を用いずにソフトウェアパイプライン化を行った場合について説明する。
図１５は、第１のソフトウェアパイプライン化後の命令列を示す図である。結合シフト命令を用いないソフトウェアパイプラインにより最適化を行うと、図１５に示すような命令列７３が出力される。
【０１１３】
１行目から２行目は、図１４の命令列７２と同じである。３行目「add r3', a, 396」は、indexの終値を表す配列のアドレスを計算し、レジスタ「ｒ３’」に格納する命令である。なお、ループを変形するため、indexの終値が、図１４に示した命令列７２の４行目の命令と異なっている。
【０１１４】
最適化の前処理の命令「load r4', [r2]」は、レジスタ「ｒ４」からレジスタ「ｒ４’」へのレジスタリネーミングにより生成された命令である。この命令では、レジスタ「ｒ２」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値がレジスタ「ｒ４’」に格納される。
【０１１５】
ループ内の１行目「add  r2, 4」は、レジスタ「ｒ２」に設定されている配列のアドレスを「４」だけ進める命令である。２行目「load r4, [r2]」は、レジスタ「ｒ２」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値をレジスタ「ｒ４」に格納する命令である。３行目「add r0, r4'」は、レジスタ「ｒ４’」の値とレジスタ「ｒ０」の値との和を、レジスタ「ｒ０」に格納する命令である。４行目「add  r2, 4」は、レジスタ「ｒ２」に設定されている配列のアドレスを「４」だけ進める命令である。５行目「load r4', [r2]」は、レジスタ「ｒ２」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値をレジスタ「ｒ４’」に格納する命令である。６行目「add r0, r4」は、レジスタ「ｒ４」の値とレジスタ「ｒ０」の値との和を、レジスタ「ｒ０」に格納する命令である。７行目「brne LOOP, r2, r3'」は、レジスタ「ｒ２」の値とレジスタ「ｒ３’」の値とが一致するまでループを繰り返すことを示す命令である。
【０１１６】
最適化の後処理の３行の命令は、それぞれループ処理の１行目から３行目までの処理と同じである。
このような命令列７３により、ループ処理内では、ＭＶＥと呼ばれるアンロールが行われる。そのため、入力ループ２回転分が、最適化後の１ループとなっている。ループ内の２行目の命令において、レジスタ「ｒ４」とレジスタ「ｒ４’」とが併存することとなっている。つまり、リネーミングなしでは、レジスタ「ｒ４’」の値を保持できない。
【０１１７】
このような第１のソフトウェアパイプライン化のための命令スケジューリングにより、前のイテレーションの最中に、次のイテレーションのデータのロードを実行することが可能となっている。
【０１１８】
次に、結合シフト命令を用いてソフトウェアパイプライン化の具体例について説明する。
図１６は、第２のソフトウェアパイプライン化後の命令列を示す図である。結合シフト命令を用いたソフトウェアパイプラインにより最適化を行うと、図１６に示すような命令列７４が出力される。
【０１１９】
１行目から２行目は、図１４の命令列７２と同じである。３行目「add r3', a, 400」は、indexの終値を表す配列のアドレスを計算し、レジスタ「ｒ３’」に格納する命令である。
【０１２０】
最適化の前処理の１行目「load rtmp, [r2]」は、レジスタ「ｒ２」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値をレジスタ「rtmp」の先頭の要素に格納する命令である。２行目「ecsl r4, rtmp, 2」は、レジスタ「ｒ４」の後ろにレジスタ「rtmp」を結合し、２要素分左にシフトする結合シフト命令である。３行目の命令「add r2, 4」は、レジスタ「ｒ２」に設定されている配列のアドレスを「４」だけ進める命令である。レジスタ「ｒ４」の先頭の要素には、まだデータがないため、次の結合シフト命令前に「add r0, r4」のような命令は行われず、４行目と５行目において、１行目および２行目と同じ命令が実行される。４行目の命令により、レジスタ「rtmp」の先頭の要素に、次のデータが格納される。５行目の命令により、１行目の命令で読み込まれたデータは、レジスタ「ｒ４」の先頭の要素に移動する。
【０１２１】
ループ内の１行目は、「add r0, r4」は、レジスタ「ｒ４」の値とレジスタ「ｒ０」の値との和を、レジスタ「ｒ０」に格納する命令である。２行目の命令「add  r2, 4」は、レジスタ「ｒ２」に設定されている配列のアドレスを「４」だけ進める命令である。３行目と４行目の命令は、最適化の前処理の１行目と２行目の命令と同じである。５行目の命令「brne LOOP, r2, r3'」は、レジスタ「ｒ２」の値とレジスタ「ｒ３’」の値とが一致するまでループを繰り返すことを示す命令である。
【０１２２】
最適化の後処理の１行目と２行目の命令は、ループ内の１行目と２行目の命令と同じである。ここで、最終のイテレーションでロードした値は、レジスタ「ｒ４」の要素番号「３」の要素にある。そのため、ループ内の３行目に示したようなロード命令は行わずに、３行目の結合シフト命令が実行される。３行目「ecsl r4, r4, 2」は、レジスタ「ｒ４」の後ろにレジスタ「ｒ４」を結合し、２要素分左にシフトする結合シフト命令である。４行目「add r0, r4」は、レジスタ「ｒ４」の値とレジスタ「ｒ０」の値との和を、レジスタ「ｒ０」に格納する命令である。
【０１２３】
このような最適化により、リネーミングやＭＶＥによるアンロールを行わずにすむようになる。そして、レジスタプレッシャを低減することができる。オブジェクトサイズが縮小される可能性もある。
【０１２４】
なお図１４〜図１６に示したのは、ＭＶＥ数＝２の例である。第２のソフトウェアパイプライン化では、レジスタリネーミングを行わない代わりに、一時レジスタ「rtmp」を使用するため、ＭＶＥ数＝２の場合には使用するレジスタ数に変わりはない。ＭＶＥ数＝４の場合には、使用するレジスタ数が減少する。
【０１２５】
図１７は、ＭＶＥ数＝４となる場合の例を示す図である。図１７に示すように、第１ステージ（Ｓ１）でロードした値を、第４ステージ（Ｓ４）のaddで利用する場合、ＭＶＥ数＝４となる。
【０１２６】
ＭＶＥ数＝４の場合、入力ループで定義されたレジスタ「ｒ４」のリネーミングとして、レジスタのライブレンジが４回転分重なる。そのため、第１のソフトウェアパイプライン化ではレジスタ「ｒ４’」、「ｒ４’’」、「ｒ４’’’」が用いられる。それに対して、第２のソフトウェアパイプライン化では、一時レジスタ「rtmp」を用いるだけで、パイプラインによる最適化を実現できる。したがって、使用するレジスタは、一時レジスタ用に一つ増えるが、リネーミング用の３つのレジスタを削減できる。
【０１２７】
図１８は、ＭＶＥ数＝４の場合の第２のソフトウェアパイプライン化後の命令列を示す図である。ＭＶＥ数＝４の場合に結合シフト命令を用いたソフトウェアパイプラインにより最適化を行うと、図１８に示すような命令列７５が出力される。１行目から３行目は、図１６に示した命令列７４の１行目から３行目と同じである。また最適化の前処理の１行目も、図１６に示す命令列７４の最適化の前処理の１行目と同じである。
【０１２８】
最適化の前処理の２行目「ecsl r4, rtmp, 1」は、レジスタ「ｒ４」の後ろにレジスタ「rtmp」を結合し、１要素分左にシフトする結合シフト命令である。このように、ＭＶＥ数＝４の場合、シフト量が「１」となる。これにより、レジスタ「rtmp」にロードされた値は、４回の結合シフト命令によって、レジスタ「ｒ４」の先頭の要素に移動する。３行目の命令「add r2, 4」は、レジスタ「ｒ２」に設定されている配列のアドレスを「４」だけ進める命令である。４行目と５行目は、最適化の前処理の１行目および２行目と同じである。その後、３行目から５行目と同じ命令が、２回繰り返される。
【０１２９】
最適化の前処理が終了した時点で、レジスタ「ｒ４」の要素番号「１」〜「４」の各要素には、４回のロード命令それぞれで読み出されたデータが格納されている。
ループ内の命令は、結合シフト命令のシフト量が「１」であることを除き、図１６に示す命令列のループ内の命令と同じである。
【０１３０】
最適化の後処理の１行目と２行目は、図１６に示す命令列７４の最適化後の後処理の１行目および２行目と同じである。３行目「ecsl r4, rtmp, 1」は、レジスタ「ｒ４」の後ろにレジスタ「rtmp」を結合し、１要素分左にシフトする結合シフト命令である。４行目「add  r0, r4」は、レジスタ「ｒ４」の値とレジスタ「ｒ０」の値との和を、レジスタ「ｒ０」に格納する命令である。その後、２行目から４行目と同じ命令が、２回繰り返される。
【０１３１】
このようにＭＶＥ数＝４の場合でも、入力ループで定義されているレジスタに加え、１つの一時レジスタ「rtmp」を使用すれば、ソフトウェアパイプライン化が可能となる。その結果、ソフトウェアパイプラインの適用による最適化で使用するレジスタ数を抑制することができる。
【０１３２】
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の２以上の構成（特徴）を組み合わせたものであってもよい。
【符号の説明】
【０１３３】
１  プログラム
２  第１のレジスタ
３  第２のレジスタ
４〜７  データ
１０  計算機
１１  記憶部
１２  演算部
【図１】
0006492943.tif 000002
【図２】
0006492943.tif 000003
【図３】
0006492943.tif 000004
【図４】
0006492943.tif 000005
【図５】
0006492943.tif 000006
【図６】
0006492943.tif 000007
【図７】
0006492943.tif 000008
【図８】
0006492943.tif 000009
【図９】
0006492943.tif 000010
【図１０】
0006492943.tif 000011
【図１１】
0006492943.tif 000012
【図１２】
0006492943.tif 000013
【図１３】
0006492943.tif 000014
【図１４】
0006492943.tif 000015
【図１５】
0006492943.tif 000016
【図１６】
0006492943.tif 000017
【図１７】
0006492943.tif 000018
【図１８】
0006492943.tif 000019