(57)【要約】【課題】実行情報により記述された複数の処理の実行時間を短縮する。【解決手段】記憶部２１１は、複数のデータに対する第１処理と、第１処理に続いて実行される第２処理とを含む、第１実行情報２２１を記憶する。変換部２１２は、第１処理に含まれるデータライトの順序と第２処理に含まれるデータリードの順序とに基づいて、実行順序の制約の下で、第２処理の開始タイミングを第１処理の終了タイミングよりも早めることで、第１実行情報を第２実行情報２２２に変換する。そして、変換部２１２は、第２実行情報２２２を出力する。実行順序の制約は、複数のデータ各々について、第１処理におけるデータライトの後で第２処理におけるデータリードを実行することを示す。【選択図】図２
2020129297.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータに対する第１処理と前記第１処理に続いて実行される第２処理とを含む第１実行情報を記憶する記憶部と、
前記第１処理に含まれるデータライトの順序と前記第２処理に含まれるデータリードの順序とに基づいて、前記複数のデータ各々について前記第１処理におけるデータライトの後で前記第２処理におけるデータリードを実行する実行順序の制約の下で、前記第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることで、前記第１実行情報を第２実行情報に変換し、前記第２実行情報を出力する変換部と、
を備えることを特徴とする情報処理装置。
【請求項２】
前記複数のデータは複数の第１データであり、
前記第１処理は、前記複数の第１データ各々を書き込むデータライトを含み、
前記第２処理は、複数の第２データ各々を生成する演算単位を含み、
前記演算単位は、いずれかの第１データを読み出すデータリードと、いずれかの第２データを読み出すデータリードと、読み出された第１データ及び第２データを用いて、演算結果を示す第２データを生成するデータ演算と、前記演算結果を示す第２データを書き込むデータライトとを含み、
前記変換部は、前記第１処理における前記複数の第１データに対するデータライトの順序と、前記第２処理における前記複数の第２データに対する演算単位の順序とに基づいて、前記複数の第２データ各々についてデータライトの後でデータリードを実行する実行順序の制約の下で、前記第２処理に含まれる演算単位の順序を変更し、変更後の第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記変換部は、前記第１処理における前記複数の第１データに対するデータライトの順序に従って第１データを選択し、前記第２処理に含まれる演算単位の中から、選択された第１データを読み出すデータリードを含む演算単位を選択し、前記第１実行情報における前記第２処理の開始タイミングと選択された演算単位の実行タイミングとの間に、前記第１処理において前記選択された第１データよりも後で書き込まれる第１データを読み出すデータリードを含む演算単位が存在する場合、前記選択された演算単位の実行タイミングを早めるように、前記第２処理に含まれる演算単位の順序を変更することを特徴とする請求項２記載の情報処理装置。
【請求項４】
前記変換部は、前記選択された演算単位によって読み出される第２データを生成する演算単位を再帰的に特定し、前記複数の第２データ各々についてデータライトの後でデータリードを実行する実行順序の制約に従って、特定された演算単位が前記選択された演算単位よりも前に実行されるように、前記第２処理に含まれる演算単位の順序を変更することを特徴とする請求項３記載の情報処理装置。
【請求項５】
情報処理装置によって実行される情報処理方法であって、
前記情報処理装置が、
複数のデータに対する第１処理と前記第１処理に続いて実行される第２処理とを含む第１実行情報を解析し、
前記第１処理に含まれるデータライトの順序と前記第２処理に含まれるデータリードの順序とに基づいて、前記複数のデータ各々について前記第１処理におけるデータライトの後で前記第２処理におけるデータリードを実行する実行順序の制約の下で、前記第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることで、前記第１実行情報を第２実行情報に変換し、
前記第２実行情報を出力する、
ことを特徴とする情報処理方法。
【請求項６】
複数のデータに対する第１処理と前記第１処理に続いて実行される第２処理とを含む第１実行情報を解析し、
前記第１処理に含まれるデータライトの順序と前記第２処理に含まれるデータリードの順序とに基づいて、前記複数のデータ各々について前記第１処理におけるデータライトの後で前記第２処理におけるデータリードを実行する実行順序の制約の下で、前記第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることで、前記第１実行情報を第２実行情報に変換し、
前記第２実行情報を出力する、
処理をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理方法、及びプログラムに関する。
【背景技術】
【０００２】
コンピュータによってＦＰＧＡ（Field-Programmable Gate Array）等の論理回路を合成する高位合成技術が知られている（例えば、特許文献１を参照）。高位合成技術では、論理回路で処理するアルゴリズムをＣ言語等のプログラム言語により記述した動作記述が、ハードウェア記述言語（Hardware Description Language，ＨＤＬ）の回路記述に変換される。
【０００３】
ＦＰＧＡによって高性能な処理を実現するためには、パイプライン処理を用いることが望ましい。高位合成技術によれば、Ｃ言語等を用いてパイプライン処理を記述することで、パイプライン回路を製造することができる。
【０００４】
並列／パイプライン式のコンピュータに関連して、制御依存性とデータ依存性とから成るプログラム依存性グラフを生成して命令をスケジュールする、コンピュータ用大域命令スケジューラが知られている（例えば、特許文献２を参照）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１６−１７７４５４号公報
【特許文献２】特開平４−２６３３３１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
論理回路によって実行されるパイプライン処理には複数の処理が含まれており、それらの処理が順番に実行される場合、先行する処理の開始時刻から、その処理の実行時間だけ遅れて、次の処理が開始される。このため、従来の高位合成技術では、パイプライン処理を効率良く実行するパイプライン回路を製造することが困難である。
【０００７】
なお、かかる問題は、ハードウェア回路によって実行されるパイプライン処理に限らず、ソフトウェアによって実行されるパイプライン処理においても生ずるものである。
【０００８】
１つの側面において、本発明は、実行情報により記述された複数の処理の実行時間を短縮することを目的とする。
【課題を解決するための手段】
【０００９】
１つの案では、情報処理装置は、記憶部及び変換部を含む。記憶部は、複数のデータに対する第１処理と、第１処理に続いて実行される第２処理とを含む、第１実行情報を記憶する。
【００１０】
変換部は、第１処理に含まれるデータライトの順序と第２処理に含まれるデータリードの順序とに基づいて、実行順序の制約の下で、第２処理の開始タイミングを第１処理の終了タイミングよりも早めることで、第１実行情報を第２実行情報に変換する。そして、変換部は、第２実行情報を出力する。実行順序の制約は、複数のデータ各々について、第１処理におけるデータライトの後で第２処理におけるデータリードを実行することを示す。
【発明の効果】
【００１１】
実施形態によれば、実行情報により記述された複数の処理の実行時間を短縮することができる。
【図面の簡単な説明】
【００１２】
【図１】論理回路によって実行される処理を示す図である。
【図２】情報処理装置の機能的構成図である。
【図３】変換処理のフローチャートである。
【図４】前処理におけるデータライトの実行順序を示す図である。
【図５】メイン処理におけるデータリードの実行順序及びデータ依存性を示す図である。
【図６】前処理及びメイン処理に含まれるデータライト及びデータリードの順序を示す図である。
【図７】メイン処理に含まれるデータライト及びデータリードの順序を示す図である。
【図８】ｉｎ［１］［０］が選択された場合の実行順序変更処理を示す図である。
【図９】ｉｎ［２］［０］が選択された場合の実行順序変更処理を示す図である。
【図１０】実行順序変更処理が終了したときのデータライト及びデータリードの順序を示す図である。
【図１１】オーバラップさせた前処理及びメイン処理に含まれるデータライト及びデータリードの順序を示す図である。
【図１２】変換処理の具体例を示すフローチャートである。
【図１３Ａ】実行順序変更処理のフローチャート（その１）である。
【図１３Ｂ】実行順序変更処理のフローチャート（その２）である。
【図１４】開始時刻変更処理のフローチャートである。
【図１５】実行順序変更処理を省略した場合のデータライト及びデータリードの順序を示す図である。
【図１６】情報処理装置のハードウェア構成図である。
【発明を実施するための形態】
【００１３】
以下、図面を参照しながら、実施形態を詳細に説明する。
図１は、論理回路によって実行される処理の例を示している。図１（ａ）は、処理Ｐ１、処理Ｐ２、及び処理Ｐ３を含むパイプライン処理における遅延時間の例を示している。処理Ｐ１、処理Ｐ２、及び処理Ｐ３の各々は、例えば、画像符号化、深層学習（Deep Learning）、科学技術計算等における多次元の配列データに対する処理である。画像符号化の場合、配列データとして、画像ブロックの画素値を格納する２次元の配列データが用いられる。
【００１４】
図１（ａ）に示すように、従来の高位合成技術では、処理Ｐ１、処理Ｐ２、及び処理Ｐ３を順番に実行する回路記述が生成される。この場合、遅延時間Ｄ２Ａは、処理Ｐ１の開始時刻から処理Ｐ２の開始時刻までの時間を表し、遅延時間Ｄ３Ａは、処理Ｐ２の開始時刻から処理Ｐ３の開始時刻までの時間を表す。
【００１５】
図１（ｂ）は、連続する２つの処理を時間的にオーバラップさせた場合の遅延時間の例を示している。この場合、処理Ｐ１の開始時刻から処理Ｐ２の開始時刻までの遅延時間Ｄ２Ｂは、遅延時間Ｄ２Ａよりも短縮され、処理Ｐ２の開始時刻から処理Ｐ３の開始時刻までの遅延時間Ｄ３Ｂは、遅延時間Ｄ３Ａよりも短縮される。したがって、図１（ａ）のパイプライン処理と比較して、処理Ｐ１〜処理Ｐ３の総実行時間が大きく短縮される。
【００１６】
しかしながら、先行する処理の処理結果を用いて次の処理が実行される場合、それらの処理をオーバラップさせることは困難である。
【００１７】
図２は、実施形態の情報処理装置（コンピュータ）の機能的構成例を示している。図２の情報処理装置２０１は、記憶部２１１及び変換部２１２を含む。記憶部２１１は、複数のデータに対する第１処理と、第１処理に続いて実行される第２処理とを含む、第１実行情報２２１を記憶する。変換部２１２は、第１実行情報２２１を第２実行情報２２２に変換する。
【００１８】
図３は、図２の情報処理装置２０１が行う変換処理の例を示すフローチャートである。まず、変換部２１２は、第１実行情報２２１を解析する（ステップ３０１）。
【００１９】
次に、変換部２１２は、第１処理に含まれるデータライトの順序と第２処理に含まれるデータリードの順序とに基づいて、実行順序の制約の下で、第２処理の開始タイミングを第１処理の終了タイミングよりも早める（ステップ３０２）。これにより、第１実行情報２２１が第２実行情報２２２に変換される。実行順序の制約は、複数のデータ各々について、第１処理におけるデータライトの後で第２処理におけるデータリードを実行することを示す。そして、変換部２１２は、第２実行情報２２２を出力する（ステップ３０３）。
【００２０】
図２の情報処理装置２０１によれば、実行情報により記述された複数の処理の実行時間を短縮することができる。
【００２１】
例えば、図１（ａ）に示した処理Ｐ１〜処理Ｐ３の場合、処理Ｐ１に含まれるデータライトの順序と処理Ｐ２に含まれるデータリードの順序とに基づいて、実行順序の制約の下で、処理Ｐ２の開始タイミングが処理Ｐ１の終了タイミングよりも早められる。これにより、図１（ｂ）に示したように、遅延時間Ｄ２Ａを削減することができる。同様に、処理Ｐ２に含まれるデータライトの順序と処理Ｐ３に含まれるデータリードの順序とに基づいて、実行順序の制約の下で、処理Ｐ３の開始タイミングを処理Ｐ２の終了タイミングよりも早めることで、遅延時間Ｄ３Ａを削減することができる。
【００２２】
次に、論理回路の製造に用いられる実行情報の具体例について説明する。この場合、第１実行情報２２１としては、例えば、Ｃ言語等のプログラム言語により記述された動作記述が用いられ、第２実行情報２２２としては、例えば、ＨＤＬ等により記述された回路記述が用いられる。パイプライン処理の動作記述が、次のような前処理及びメイン処理を含み、前処理の次にメイン処理が実行される場合を想定する。
【００２３】
（１）前処理
ｆｏｒ  （ｘ＝０；  ｘ＜５；  ｘ＋＋）
ｆｏｒ  （ｙ＝０；  ｙ＜５；  ｙ＋＋）
ｉｎ［ｙ］［ｘ］＝・・・
（２）メイン処理
ｆｏｒ  （ｘ＝０；  ｘ＜５；  ｘ＋＋）  ｛
ｏｕｔ［０］［ｘ］＝ｉｎ［０］［ｘ］；
｝
ｆｏｒ  （ｙ＝１；  ｙ＜５；  ｙ＋＋）  ｛
ｆｏｒ  （ｘ＝０；  ｘ＜５；  ｘ＋＋）  ｛
ａ＝ｏｕｔ［ｙ−１］［ｘ］；
ｂ＝（ｘ＜４）？  ｏｕｔ［ｙ−１］［ｘ＋１］：０；
ｏｕｔ［ｙ］［ｘ］＝ｆｕｎｃ（ａ，ｂ，ｉｎ［ｙ］［ｘ］）；
｝
｝
【００２４】
前処理及びメイン処理は、第１処理及び第２処理の一例である。前処理は、５×５の２次元配列ｉｎ［ｙ］［ｘ］（ｘ，ｙ＝０〜４）の各要素にデータを書き込むループ処理であり、２５個のデータライトを含む。メイン処理は、ｉｎ［ｙ］［ｘ］から、演算結果を示す５×５の２次元配列ｏｕｔ［ｙ］［ｘ］を生成する処理であり、ｏｕｔ［０］［ｘ］を生成するループ処理Ｌ１と、ｏｕｔ［ｙ］［ｘ］（ｙ≠０）を生成するループ処理Ｌ２とを含む。
【００２５】
ループ処理Ｌ１は、ｉｎ［０］［ｘ］（ｘ＝０〜４）からデータを読み出す５個のデータリードと、読み出したデータをｏｕｔ［０］［ｘ］に書き込む５個のデータライトとを含む。一方、ループ処理Ｌ２は、以下のような処理を含む。
（Ａ１）ｉｎ［ｙ］［ｘ］（ｘ＝０〜４，ｙ＝１〜４）を読み出す２０個のデータリード
（Ａ２）ｏｕｔ［ｙ−１］［ｘ］（ｘ＝０〜４，ｙ＝１〜４）を読み出す２０個のデータリード
（Ａ３）ｏｕｔ［ｙ−１］［ｘ＋１］（ｘ＝０〜３，ｙ＝１〜４）を読み出す１６個のデータリード
（Ａ４）読み出されたデータを用いてｏｕｔ［ｙ］［ｘ］（ｘ＝０〜４，ｙ＝１〜４）を生成する２０個のデータ演算
（Ａ５）生成されたｏｕｔ［ｙ］［ｘ］（ｘ＝０〜４，ｙ＝１〜４）を書き込む２０個のデータライト
【００２６】
図４は、前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの実行順序を示している。ｉｎ［ｙ］［ｘ］は５×５のブロックで表され、横方向はｘ方向を表し、縦方向はｙ方向を表す。前処理では、ｉｎ［ｙ］［ｘ］は、ｉｎ［０］［０］、ｉｎ［１］［０］、ｉｎ［２］［０］、・・・の順番にアクセスされる。
【００２７】
図５は、メイン処理におけるデータリードの実行順序及びデータ依存性を示している。図５（ａ）は、ループ処理Ｌ１におけるｉｎ［ｙ］［ｘ］に対するデータリードの実行順序を示している。ループ処理Ｌ１では、ｉｎ［ｙ］［ｘ］は、ｉｎ［０］［０］、ｉｎ［０］［１］、ｉｎ［０］［２］、・・・の順番にアクセスされる。
【００２８】
図５（ｂ）は、ループ処理Ｌ２におけるデータ依存性を示している。ｏｕｔ［ｙ］［ｘ］（ｘ＝０〜３，ｙ＝１〜４）は、その上方の要素ｏｕｔ［ｙ−１］［ｘ］及び右上の要素ｏｕｔ［ｙ−１］［ｘ＋１］を用いて生成されるため、ｏｕｔ［ｙ］［ｘ］は、それらの要素に対するデータ依存性を有する。
【００２９】
このように、ループ処理Ｌ２にはデータ依存性があるため、添え字ｙに関するループ処理（外側のループ処理）と、添え字ｘに関するループ処理（内側のループ処理）とを入れ換えることは難しい。したがって、前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの実行順序が予め決められている場合、メイン処理におけるｉｎ［ｙ］［ｘ］に対するデータリードの実行順序は、前処理とは異なる実行順序になる。
【００３０】
図６は、前処理及びメイン処理に含まれるデータライト及びデータリードの順序の例を示している。図６の表の各列は時刻を表し、各行は、記憶領域内におけるｉｎ［ｙ］［ｘ］及びｏｕｔ［ｙ］［ｘ］のアドレスを表す。時刻は、処理の実行タイミングの一例である。Ａｉｎはｉｎ［ｙ］［ｘ］のアドレスを表し、Ａｏｕｔはｏｕｔ［ｙ］［ｘ］のアドレスを表す。図６のＡｉｎ及びＡｏｕｔは、次式により記述される。
Ａｉｎ＝ｘ＋ｙ＊５  （ｘ＝０〜４，ｙ＝０〜４）        （１）
Ａｏｕｔ＝ｘ＋ｙ＊５  （ｘ＝０〜４，ｙ＝０〜４）      （２）
【００３１】
例えば、ｉｎ［０］［０］〜ｉｎ［０］［４］のアドレスＡｉｎは、それぞれ、０〜４であり、ｉｎ［１］［０］〜ｉｎ［１］［４］のアドレスＡｉｎは、それぞれ、５〜９である。ｉｎ［２］［０］〜ｉｎ［２］［４］のアドレスＡｉｎは、それぞれ、１０〜１４であり、ｉｎ［３］［０］〜ｉｎ［３］［４］のアドレスＡｉｎは、それぞれ、１５〜１９である。ｉｎ［４］［０］〜ｉｎ［４］［４］のアドレスＡｉｎは、それぞれ、２０〜２４である。
【００３２】
ｏｕｔ［ｙ］［ｘ］のアドレスＡｏｕｔについても、アドレスＡｉｎと同様である。ただし、実際の記憶領域内では、ｘ及びｙの値の各組み合わせに対して、アドレスＡｉｎとアドレスＡｏｕｔとが異なる位置に割り当てられる。
【００３３】
図６の表の各セルに記述された“ｒ”は、そのセルの行に対応するアドレスに対するデータリードを表し、そのセルの列に対応する時刻において実行される。一方、各セルに記述された“ｗ”は、そのセルの行に対応するアドレスに対するデータライトを表し、そのセルの列に対応する時刻において実行される。
【００３４】
時刻０〜時刻２４の処理は前処理に対応し、時刻２５〜時刻４９の処理はメイン処理に対応する。各列は、１つのデータを書き込むための１つ以上の処理を含み、これらの処理は、１つの演算単位とみなされる。
【００３５】
例えば、時刻０〜時刻２４の各時刻における演算単位は、Ａｉｎに対する１個のデータライトを含む。この演算単位を実行することで、データがｉｎ［ｙ］［ｘ］に書き込まれる。
【００３６】
時刻２５〜時刻２９の各時刻における演算単位は、Ａｉｎに対する１個のデータリードと、Ａｏｕｔに対する１個のデータライトとを含む。この演算単位を実行することで、ｉｎ［０］［ｘ］から読み出されたデータがｏｕｔ［０］［ｘ］に書き込まれる。
【００３７】
時刻３０〜時刻３３、時刻３５〜時刻３８、時刻４０〜時刻４３、及び時刻４５〜時刻４８の各時刻における演算単位は、Ａｉｎに対する１個のデータリードと、Ａｏｕｔに対する２個のデータリードと、Ａｏｕｔに対する１個のデータライトとを含む。この演算単位を実行することで、ｉｎ［ｙ］［ｘ］、ｏｕｔ［ｙ−１］［ｘ］、及びｏｕｔ［ｙ−１］［ｘ＋１］から読み出されたデータを用いて演算結果が生成され、その演算結果がｏｕｔ［ｙ］［ｘ］に書き込まれる。
【００３８】
時刻３４、時刻３９、時刻４４、及び時刻４９の各時刻における演算単位は、Ａｉｎに対する１個のデータリードと、Ａｏｕｔに対する１個のデータリードと、Ａｏｕｔに対する１個のデータライトとを含む。この演算単位を実行することで、ｉｎ［ｙ］［ｘ］及びｏｕｔ［ｙ−１］［ｘ］から読み出されたデータを用いて演算結果が生成され、その演算結果がｏｕｔ［ｙ］［ｘ］に書き込まれる。
【００３９】
なお、時刻３０〜時刻４９の各時刻における演算単位には、演算結果を生成する不図示のデータ演算も含まれている。前処理に含まれる２５個のデータライトの順序は、図４に示した実行順序に対応しており、メイン処理に含まれる２５個の演算単位の順序は、図５（ａ）に示した実行順序に対応している。
【００４０】
図６のパイプライン処理において、前処理の開始時刻０からメイン処理の開始時刻２５までの遅延時間ＤＡは、２５である。
【００４１】
変換部２１２は、前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの順序と、メイン処理における演算単位の順序とに基づいて、いずれかの時刻の演算単位を別の時刻に移動させることで、メイン処理に含まれる演算単位の順序を変更する。このとき、変換部２１２は、ｏｕｔ［ｙ］［ｘ］の各要素について、データライトの後でデータリードを実行する、実行順序の制約を守りながら、演算単位の順序を変更する。これにより、ｏｕｔ［ｙ］［ｘ］のデータ依存性が保持される。
【００４２】
次に、変換部２１２は、前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの順序と、メイン処理におけるｉｎ［ｙ］［ｘ］に対するデータリードの順序とに基づいて、メイン処理の開始時刻を前処理の終了時刻よりも早める。これにより、第１実行情報２２１が第２実行情報２２２に変換される。このとき、変換部２１２は、ｉｎ［ｙ］［ｘ］の各要素について、前処理におけるデータライトの後でメイン処理におけるデータリードを実行する、実行順序の制約を守りながら、メイン処理の開始時刻をなるべく早い時刻に変更する。
【００４３】
メイン処理の開始時刻を前処理の終了時刻よりも早めることで、遅延時間ＤＡを削減して、パイプライン処理の総実行時間を短縮することができる。また、前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの順序に基づいて、メイン処理に含まれる演算単位の順序を変更することで、遅延時間ＤＡをさらに削減することが可能になる。
【００４４】
図７は、図６のメイン処理に含まれるデータライト及びデータリードの順序を示している。ただし、図７では、図６の時刻２５〜時刻４９が時刻０〜時刻２４にそれぞれ変更されている。
【００４５】
変換部２１２は、メイン処理に含まれる演算単位の順序を変更する実行順序変更処理において、前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの順序に従って、ｉｎ［ｙ］［ｘ］の要素を順番に選択する。次に、変換部２１２は、メイン処理に含まれる演算単位の中から、選択されたｉｎ［ｙ］［ｘ］を読み出すデータリードを含む特定の演算単位を選択する。
【００４６】
上述したように、メイン処理におけるｉｎ［ｙ］［ｘ］に対するデータリードの実行順序は、前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの実行順序とは異なっている。このため、メイン処理の開始時刻と、選択された特定の演算単位の時刻との間に、選択されたｉｎ［ｙ］［ｘ］よりも後で書き込まれたｉｎ［ｙ］［ｘ］を読み出すデータリードを含む、演算単位が存在することがある。この場合、変換部２１２は、特定の演算単位の時刻を早めるように、メイン処理に含まれる演算単位の順序を変更する。
【００４７】
このような実行順序変更処理によれば、メイン処理におけるｉｎ［ｙ］［ｘ］に対するデータリードの実行順序を、前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの実行順序に近づけることができる。したがって、前処理の開始時刻とメイン処理の開始時刻の間隔をできるだけ短縮することが可能になる。
【００４８】
ただし、ｏｕｔ［ｙ］［ｘ］のデータ依存性を保存するため、ｏｕｔ［ｙ］［ｘ］の各要素について実行順序の制約が遵守される。例えば、メイン処理における時刻５の演算単位では、Ａｏｕｔ＝０に対応するｏｕｔ［０］［０］と、Ａｏｕｔ＝１に対応するｏｕｔ［０］［１］とが読み出される。一方、ｏｕｔ［０］［０］は時刻０において書き込まれ、ｏｕｔ［０］［１］は時刻１において書き込まれる。このため、時刻５の演算単位を時刻０又は時刻１に移動することは禁止される。
【００４９】
前処理におけるｉｎ［ｙ］［ｘ］に対するデータライトの順序によれば、最初に、時刻０のデータライトによって書き込まれるｉｎ［０］［０］が選択される。メイン処理において、選択されたｉｎ［０］［０］を読み出すデータリードを含む演算単位は、時刻０の演算単位である。時刻０はメイン処理の開始時刻であるため、時刻０の演算単位は移動させる必要がない。
【００５０】
次に、前処理における時刻１のデータライトによって書き込まれるｉｎ［１］［０］が選択される。
【００５１】
図８は、ｉｎ［１］［０］が選択された場合の実行順序変更処理の例を示している。この場合、矢印８０１が示すように、メイン処理において、選択されたｉｎ［１］［０］を読み出すデータリードを含む、時刻５の演算単位が選択される。時刻０と時刻５の間には、ｉｎ［１］［０］よりも後で書き込まれたｉｎ［０］［１］〜ｉｎ［０］［４］を読み出すデータリードを含む、４個の演算単位が存在する。
【００５２】
また、時刻５の演算単位は、矢印８０２が示すように、ｏｕｔ［０］［１］を読み出すデータリードを含む。ｏｕｔ［０］［１］は、矢印８０３が示すように、メイン処理における時刻１のデータライトによって書き込まれている。したがって、時刻５の演算単位を時刻１に移動することは禁止される。そこで、メイン処理における時刻０及び時刻１の演算単位は変更されず、時刻５の演算単位が時刻２に移動する。
【００５３】
次に、前処理における時刻２のデータライトによって書き込まれるｉｎ［２］［０］が選択される。
【００５４】
図９は、ｉｎ［２］［０］が選択された場合の実行順序変更処理の例を示している。図９では、図８のメイン処理における時刻５の演算単位が時刻２に移動しており、時刻２〜時刻４の演算単位が時刻３〜時刻５に移動している。
【００５５】
この場合、矢印９０１が示すように、メイン処理において、選択されたｉｎ［２］［０］を読み出すデータリードを含む、時刻１０の演算単位が選択される。時刻０と時刻１０の間には、ｉｎ［２］［０］よりも後で書き込まれたｉｎ［０］［１］〜ｉｎ［０］［４］及びｉｎ［１］［１］〜ｉｎ［１］［４］を読み出すデータリードを含む、８個の演算単位が存在する。
【００５６】
また、時刻１０の演算単位は、矢印９０２が示すように、ｏｕｔ［１］［１］を読み出すデータリードを含む。ｏｕｔ［１］［１］は、矢印９０３が示すように、メイン処理における時刻６のデータライトによって書き込まれている。
【００５７】
時刻６の演算単位は、矢印９０４が示すように、ｏｕｔ［０］［２］を読み出すデータリードを含む。ｏｕｔ［０］［２］は、矢印９０５が示すように、メイン処理における時刻３のデータライトによって書き込まれている。
【００５８】
このように、メイン処理において、データ依存性を有する演算単位の依存先の演算単位が、さらに別の演算単位に対してデータ依存性を有する場合がある。そこで、変換部２１２は、選択された演算単位によって読み出されるｏｕｔ［ｙ］［ｘ］を生成する演算単位を、再帰的に特定する。そして、変換部２１２は、特定された演算単位が選択された演算単位よりも前に実行されるように、メイン処理に含まれる演算単位の順序を変更する。
【００５９】
これにより、メイン処理におけるｏｕｔ［ｙ］［ｘ］のデータ依存性をすべて保持しながら、演算単位の順序を変更することができる。
【００６０】
図９の例では、時刻３の演算単位の次に時刻６の演算単位を実行し、時刻６の演算単位の次に時刻１０の演算単位を実行することで、すべてのデータ依存性が保存される。そこで、時刻０〜時刻３の演算単位は変更されず、時刻６の演算単位が時刻４に移動し、時刻１０の演算単位が時刻５に移動する。
【００６１】
以降、ｉｎ［ｙ］［ｘ］に対するデータライトの順序に従って同様の操作を繰り返すことで、メイン処理に含まれる演算単位の順序がさらに変更される。
【００６２】
図１０は、実行順序変更処理が終了したときのメイン処理に含まれるデータライト及びデータリードの順序の例を示している。
【００６３】
変換部２１２は、ｉｎ［ｙ］［ｘ］の各要素について実行順序の制約を守りながら、図１０のメイン処理の開始時刻を早めることで、前処理とメイン処理をオーバラップさせる。
【００６４】
図６の前処理と図１０のメイン処理とを比較すると、ｉｎ［ｙ］［ｘ］の２５個の要素のうち、前処理におけるデータライトとメイン処理におけるデータリードとの間隔が最も短いのは、Ａｉｎ＝４に対応するｉｎ［０］［４］である。そこで、ｉｎ［０］［４］に対するデータライトの直後にｉｎ［０］［４］に対するデータリードが実行されるように、前処理とメイン処理をオーバラップさせることで、メイン処理の開始時刻を可能な限り早めることができる。
【００６５】
図１１は、オーバラップさせた前処理及びメイン処理に含まれるデータライト及びデータリードの順序の例を示している。図１１において、ｉｎ［０］［４］に対するデータライトは時刻２０で実行されており、ｉｎ［０］［４］に対するデータリードは時刻２１で実行されている。前処理の開始時刻０からメイン処理の開始時刻１１までの遅延時間ＤＢは、１１であり、図６の遅延時間ＤＡよりも１４だけ削減されている。したがって、前処理及びメイン処理の総実行時間も、１４だけ短縮される。
【００６６】
図１２は、変換部２１２が行う変換処理の具体例を示すフローチャートである。まず、変換部２１２は、第１実行情報２２１を用いて実行順序変更処理を行うことで、第２処理に含まれる演算単位の順序を変更する（ステップ１２０１）。次に、変換部２１２は、開始時刻変更処理を行うことで、変更後の第２処理の開始時刻を変更する（ステップ１２０２）。そして、変換部２１２は、第１処理と変更後の第２処理とを含む第２実行情報２２２を出力する（ステップ１２０３）。
【００６７】
出力された第２実行情報２２２を用いることで、パイプライン処理を効率良く実行するパイプライン回路を製造することができる。
【００６８】
図１３Ａ及び図１３Ｂは、図１２のステップ１２０１における実行順序変更処理の例を示すフローチャートである。まず、変換部２１２は、第１処理及び第２処理から、１つのデータを書き込むための１つ以上の処理を抽出し、抽出された処理を演算単位として、演算単位に含まれるデータライト及びデータリードの順序を示す表を生成する（ステップ１３０１）。これにより、例えば、図６のような表が生成される。
【００６９】
表の各行には、各データライトによって書き込まれるデータのアドレスが設定され、各列には、各演算単位が実行される時刻が設定される。各演算単位には、データライトのみが含まれることもあり、データリード及びデータライトが含まれることもあり、データリード、データ演算、及びデータライトが含まれることもある。変換部２１２は、第２処理の表として、図６のメイン処理の表の代わりに、図７のメイン処理の表を生成しても構わない。
【００７０】
次に、変換部２１２は、第１処理における時刻を示す変数ｔに、第１処理の開始時刻を設定し、第２処理における時刻を示す変数ｔ＿ｌａｓｔに、第２処理の開始時刻を設定する（ステップ１３０２）。そして、変換部２１２は、ｔ又はｔ＿ｌａｓｔのいずれかが終了時刻に一致するか否かをチェックする（ステップ１３０３）。
【００７１】
ｔ又はｔ＿ｌａｓｔのいずれも終了時刻に一致しない場合（ステップ１３０３，ＮＯ）、変換部２１２は、時刻ｔにおける第１処理のデータライトによって書き込まれるデータのアドレスａｄｄｒ＿ｔ１ｗを取得する。そして、変換部２１２は、第１処理のデータライトによって書き込まれ、かつ、時刻ｔ＿ｌａｓｔにおける第２処理のデータリードによって読み出されるデータのアドレスと、ａｄｄｒ＿ｔ１ｗとを比較する（ステップ１３０４）。
【００７２】
ａｄｄｒ＿ｔ１ｗと読み出されるデータのアドレスとが一致する場合（ステップ１３０４，ＹＥＳ）、変換部２１２は、時刻ｔ＿ｌａｓｔを１だけインクリメントし（ステップ１３０９）、時刻ｔを１だけインクリメントする（ステップ１３１０）。そして、変換部２１２は、ステップ１３０３以降の処理を繰り返す。
【００７３】
一方、ａｄｄｒ＿ｔ１ｗと読み出されるデータのアドレスとが一致しない場合（ステップ１３０４，ＮＯ）、変換部２１２は、第２処理において、ａｄｄｒ＿ｔ１ｗからデータを読み出すデータリードが実行される時刻ｔ＿ｒを探索する（ステップ１３０５）。そして、変換部２１２は、ｔ＿ｒとｔ＿ｌａｓｔを比較する（ステップ１３０６）。ｔ＿ｒがｔ＿ｌａｓｔよりも早い場合（ステップ１３０６，ＹＥＳ）、変換部２１２は、ステップ１３１０以降の処理を行う。
【００７４】
一方、ｔ＿ｒがｔ＿ｌａｓｔ以降である場合（ステップ１３０６，ＮＯ）、変換部２１２は、スタック構造のリストＩｎｓｅｒｔＬｉｓｔとキュー構造のリストＳｅａｒｃｈＬｉｓｔとを初期化する（ステップ１３０７）。スタック構造は、ＬＩＦＯ（Last In First Out）の構造であり、キュー構造は、ＦＩＬＯ（First In Last Out）の構造である。ＩｎｓｅｒｔＬｉｓｔは、移動させる演算単位が実行される時刻を格納し、ＳｅａｒｃｈＬｉｓｔは、再帰的に探索される時刻を格納する。ＩｎｓｅｒｔＬｉｓｔ及びＳｅａｒｃｈＬｉｓｔを初期化することで、これらのリストが空になる。
【００７５】
次に、変換部２１２は、ＩｎｓｅｒｔＬｉｓｔにｔ＿ｒをプッシュし、ＳｅａｒｃｈＬｉｓｔにｔ＿ｒをエンキューする（ステップ１３０８）。そして、変換部２１２は、ＳｅａｒｃｈＬｉｓｔが空であるか否かをチェックする（ステップ１３１１）。
【００７６】
ＳｅａｒｃｈＬｉｓｔが空でない場合（ステップ１３１１，ＮＯ）、変換部２１２は、ＳｅａｒｃｈＬｉｓｔからデキューした時刻をｔ＿ｃｕｒに設定する（ステップ１３１３）。
【００７７】
次に、変換部２１２は、第２処理のデータライトによって書き込まれ、かつ、時刻ｔ＿ｃｕｒのデータリードによって読み出される１つ以上のデータのアドレスを、リストａｄｄｒＬｉｓｔに設定する（ステップ１３１４）。そして、変換部２１２は、ａｄｄｒＬｉｓｔが空であるか否かをチェックする（ステップ１３１５）。
【００７８】
ａｄｄｒＬｉｓｔが空でない場合（ステップ１３１５，ＮＯ）、変換部２１２は、ａｄｄｒＬｉｓｔから最も早い時刻（最小値）を取り出して、アドレスａｄｄｒに設定する（ステップ１３１６）。そして、変換部２１２は、第２処理において、ａｄｄｒにデータを書き込むデータライトが実行される時刻ｔ＿ｄｅｐを探索する。
【００７９】
次に、変換部２１２は、ｔ＿ｄｅｐとｔ＿ｌａｓｔを比較する（ステップ１３１７）。ｔ＿ｄｅｐがｔ＿ｌａｓｔよりも早い場合（ステップ１３１７，ＮＯ）、変換部２１２は、ステップ１３１５以降の処理を繰り返す。
【００８０】
一方、ｔ＿ｄｅｐがｔ＿ｌａｓｔ以降である場合（ステップ１３１７，ＹＥＳ）、変換部２１２は、ＩｎｓｅｒｔＬｉｓｔにｔ＿ｄｅｐをプッシュし、ＳｅａｒｃｈＬｉｓｔにｔ＿ｄｅｐをエンキューする（ステップ１３１８）。そして、変換部２１２は、ステップ１３１５以降の処理を繰り返す。
【００８１】
ａｄｄｒＬｉｓｔが空である場合（ステップ１３１５，ＹＥＳ）、変換部２１２は、ステップ１３１１以降の処理を繰り返す。そして、ＳｅａｒｃｈＬｉｓｔが空である場合（ステップ１３１１，ＹＥＳ）、変換部２１２は、ＩｎｓｅｒｔＬｉｓｔからポップした時刻において実行される演算単位を、ポップした時刻の順番に、ｔ＿ｌａｓｔ以降の時刻に挿入する（ステップ１３１２）。
【００８２】
さらに、変換部２１２は、ｔ＿ｌａｓｔ以降の各時刻のうち、ＩｎｓｅｒｔＬｉｓｔからポップされなかった時刻の演算単位が、挿入された演算単位よりも後で実行されるように、演算単位の順序を変更する。そして、変換部２１２は、ＩｎｓｅｒｔＬｉｓｔからポップされた時刻の個数をｔ＿ｌａｓｔに加算することで、ｔ＿ｌａｓｔを更新し、ステップ１３１０以降の処理を繰り返す。
【００８３】
そして、ｔ又はｔ＿ｌａｓｔのいずれかが終了時刻に一致する場合（ステップ１３０３，ＹＥＳ）、変換部２１２は、処理を終了する。
【００８４】
例えば、ステップ１３０１において、第１処理の表として、図６の前処理の表が生成され、第２処理の表として、図７のメイン処理の表が生成された場合、ステップ１３０２において、ｔ＝ｔ＿ｌａｓｔ＝０となる。
【００８５】
このとき、ａｄｄｒ＿ｔ１ｗはＡｉｎ＝０を指している。図７において、時刻０のデータリードによって読み出されるデータのアドレスは０であり、ａｄｄｒ＿ｔ１ｗと一致する。したがって、ｔ＿ｌａｓｔ及びｔが１だけインクリメントされる。
【００８６】
次に、ｔ＝ｔ＿ｌａｓｔ＝１の場合、ａｄｄｒ＿ｔ１ｗ＝５となる。図７において、時刻１のデータリードによって読み出されるデータのアドレスは１であり、ａｄｄｒ＿ｔ１ｗと一致しない。したがって、ｔ＿ｒ＝５となり、ＩｎｓｅｒｔＬｉｓｔ＝［５］、ＳｅａｒｃｈＬｉｓｔ＝［５］となる。
【００８７】
ＳｅａｒｃｈＬｉｓｔから時刻５をデキューすると、ＳｅａｒｃｈＬｉｓｔ＝［］（空）、ｔ＿ｃｕｒ＝５となる。図７において、時刻５のデータリードによって読み出されるデータのアドレスＡｏｕｔは、０及び１である。したがって、ａｄｄｒＬｉｓｔ＝［０，１］となる。
【００８８】
次に、ａｄｄｒＬｉｓｔから０が取り出され、ａｄｄｒ＝０となる。図７において、Ａｏｕｔ＝０にデータを書き込むデータライトの時刻は０であるため、ｔ＿ｄｅｐ＝０となる。ｔ＿ｄｅｐはｔ＿ｌａｓｔよりも早いため、ａｄｄｒＬｉｓｔから１が取り出され、ａｄｄｒ＝１となる。図７において、Ａｏｕｔ＝１にデータを書き込むデータライトの時刻は１であるため、ｔ＿ｄｅｐ＝ｔ＿ｌａｓｔ＝１となる。したがって、ＩｎｓｅｒｔＬｉｓｔに時刻１がプッシュされ、ＳｅａｒｃｈＬｉｓｔに時刻１がエンキューされて、ＩｎｓｅｒｔＬｉｓｔ＝［１，５］、ＳｅａｒｃｈＬｉｓｔ＝［１］となる。
【００８９】
ＳｅａｒｃｈＬｉｓｔから時刻１をデキューすると、ＳｅａｒｃｈＬｉｓｔ＝［］、ｔ＿ｃｕｒ＝１となる。図７において、時刻１のデータリードによって読み出されるデータのアドレスはＡｉｎ＝１のみであり、Ａｏｕｔからはデータが読み出されない。したがって、ａｄｄｒＬｉｓｔ＝［］となり、ＳｅａｒｃｈＬｉｓｔ＝［］のままである。
【００９０】
そこで、ＩｎｓｅｒｔＬｉｓｔ＝［１，５］から時刻１及び時刻５が順番にポップされ、図９に示したように、それらの時刻の演算単位が時刻１及び時刻２にそれぞれ挿入される。そして、時刻２〜時刻４の演算単位が時刻３〜時刻５にそれぞれ移動し、ｔ＿ｌａｓｔ＝３となり、ｔ＝２となる。
【００９１】
次に、ｔ＝２、ｔ＿ｌａｓｔ＝３の場合、ａｄｄｒ＿ｔ１ｗ＝１０となる。図９のメイン処理において、時刻３のデータリードによって読み出されるデータのアドレスは２であり、ａｄｄｒ＿ｔ１ｗと一致しない。したがって、ｔ＿ｒ＝１０となり、ＩｎｓｅｒｔＬｉｓｔ＝［１０］、ＳｅａｒｃｈＬｉｓｔ＝［１０］となる。
【００９２】
ＳｅａｒｃｈＬｉｓｔから時刻１０をデキューすると、ＳｅａｒｃｈＬｉｓｔ＝［］、ｔ＿ｃｕｒ＝１０となる。図９のメイン処理において、時刻１０のデータリードによって読み出されるデータのアドレスＡｏｕｔは、５及び６である。したがって、ａｄｄｒＬｉｓｔ＝［５，６］となる。
【００９３】
次に、ａｄｄｒＬｉｓｔから５が取り出され、ａｄｄｒ＝５となる。図９のメイン処理において、Ａｏｕｔ＝５にデータを書き込むデータライトの時刻は２であるため、ｔ＿ｄｅｐ＝２となる。ｔ＿ｄｅｐはｔ＿ｌａｓｔよりも早いため、ａｄｄｒＬｉｓｔから６が取り出され、ａｄｄｒ＝６となる。図９のメイン処理において、Ａｏｕｔ＝６にデータを書き込むデータライトの時刻は６であるため、ｔ＿ｄｅｐ＝６となる。ｔ＿ｄｅｐはｔ＿ｌａｓｔよりも遅いため、ＩｎｓｅｒｔＬｉｓｔに時刻６がプッシュされ、ＳｅａｒｃｈＬｉｓｔに時刻６がエンキューされて、ＩｎｓｅｒｔＬｉｓｔ＝［６，１０］、ＳｅａｒｃｈＬｉｓｔ＝［６］となる。
【００９４】
ＳｅａｒｃｈＬｉｓｔから時刻６をデキューすると、ＳｅａｒｃｈＬｉｓｔ＝［］、ｔ＿ｃｕｒ＝６となる。図９のメイン処理において、時刻６のデータリードによって読み出されるデータのアドレスＡｏｕｔは、１及び２である。したがって、ａｄｄｒＬｉｓｔ＝［１，２］となる。
【００９５】
次に、ａｄｄｒＬｉｓｔから１が取り出され、ａｄｄｒ＝１となる。図９のメイン処理において、Ａｏｕｔ＝１にデータを書き込むデータライトの時刻は２であるため、ｔ＿ｄｅｐ＝２となる。ｔ＿ｄｅｐはｔ＿ｌａｓｔよりも早いため、ａｄｄｒＬｉｓｔから２が取り出され、ａｄｄｒ＝２となる。図９のメイン処理において、Ａｏｕｔ＝２にデータを書き込むデータライトの時刻は３であるため、ｔ＿ｄｅｐ＝ｔ＿ｌａｓｔ＝３となる。したがって、ＩｎｓｅｒｔＬｉｓｔに時刻３がプッシュされ、ＳｅａｒｃｈＬｉｓｔに時刻３がエンキューされて、ＩｎｓｅｒｔＬｉｓｔ＝［３，６，１０］、ＳｅａｒｃｈＬｉｓｔ＝［３］となる。
【００９６】
ＳｅａｒｃｈＬｉｓｔから時刻３をデキューすると、ＳｅａｒｃｈＬｉｓｔ＝［］、ｔ＿ｃｕｒ＝３となる。図９のメイン処理において、時刻３のデータリードによって読み出されるデータのアドレスはＡｉｎ＝２のみであり、Ａｏｕｔからはデータが読み出されない。したがって、ａｄｄｒＬｉｓｔ＝［］となり、ＳｅａｒｃｈＬｉｓｔ＝［］のままである。
【００９７】
そこで、ＩｎｓｅｒｔＬｉｓｔ＝［３，６，１０］から時刻３、時刻６、及び時刻１０が順番にポップされ、それらの時刻の演算単位が時刻３、時刻４、及び時刻５にそれぞれ挿入される。そして、時刻４、時刻５、時刻７〜時刻９の演算単位が時刻６以降に移動し、ｔ＿ｌａｓｔ＝６となり、ｔ＝３となる。
【００９８】
以降、ｔをインクリメントしながら同様の操作を繰り返すことで、図７の表が図１０に示した表に変換される。
【００９９】
図１３Ａ及び図１３Ｂの実行順序変更処理によれば、ｔをインクリメントしながらａｄｄｒ＿ｔ１ｗを更新することで、第１処理におけるデータライトの順序に従って、第１処理におけるデータが順番に選択される。次に、ａｄｄｒ＿ｔ１ｗからデータを読み出すデータリードの時刻ｔ＿ｒを探索することで、第２処理に含まれる演算単位の中から、選択されたデータを読み出すデータリードを含む特定の演算単位が選択される。
【０１００】
そして、ｔ＿ｒがｔ＿ｌａｓｔ以降である場合にＩｎｓｅｒｔＬｉｓｔが生成され、ＩｎｓｅｒｔＬｉｓｔからポップした時刻の演算単位が、ｔ＿ｌａｓｔ以降の時刻に挿入される。これにより、メイン処理の開始時刻と特定の演算単位の時刻との間に、選択されたデータよりも後で書き込まれたデータを読み出すデータリードを含む、演算単位が存在する場合に、特定の演算単位の時刻を早めるように、演算単位の順序が変更される。
【０１０１】
また、ａｄｄｒＬｉｓｔの最小値にデータを書き込むデータライトの時刻ｔ＿ｄｅｐがＩｎｓｅｒｔＬｉｓｔにプッシュされ、ＩｎｓｅｒｔＬｉｓｔからポップした時刻の順番に、それらの時刻の演算単位がｔ＿ｌａｓｔ以降の時刻に挿入される。これにより、第２処理における各データについて実行順序の制約が遵守される。
【０１０２】
さらに、ＳｅａｒｃｈＬｉｓｔにｔ＿ｄｅｐがエンキューされ、ＳｅａｒｃｈＬｉｓｔからデキューされた時刻のデータリードによって読み出されるデータのアドレスが、ａｄｄｒＬｉｓｔに設定される。これにより、選択された演算単位によって読み出されるデータを生成する演算単位が再帰的に特定され、特定された演算単位が選択された演算単位よりも前に実行されるように、演算単位の順序が変更される。
【０１０３】
図１４は、図１２のステップ１２０２における開始時刻変更処理の例を示すフローチャートである。まず、変換部２１２は、第１処理と第２処理をオーバラップさせる時間幅を示す変数ｔｗに無効値（例えば、−１）を設定し、データのアドレスを示す変数ａｄｄｒ＿ｃｕｒに初期値０を設定する（ステップ１４０１）。そして、変換部２１２は、ａｄｄｒ＿ｃｕｒと、第１処理のデータライトによって書き込まれるデータの最終アドレスとを比較する（ステップ１４０２）。
【０１０４】
ａｄｄｒ＿ｃｕｒがデータの最終アドレスではない場合（ステップ１４０２，ＮＯ）、変換部２１２は、第１処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻のうち、最も遅い時刻ｔ＿１を求める（ステップ１４０３）。また、変換部２１２は、第２処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻のうち、最も早い時刻ｔ＿２を求める。そして、変換部２１２は、次式により時間幅ｔｅｍｐを計算する（ステップ１４０４）。
ｔｅｍｐ＝ｔ＿２−ｔ＿１−１      （３）
【０１０５】
次に、変換部２１２は、ｔｗの値をチェックする（ステップ１４０５）。ｔｗが無効値であるか、又はｔｅｍｐよりも大きい場合（ステップ１４０５，ＹＥＳ）、変換部２１２は、ｔｗにｔｅｍｐの値を設定する（ステップ１４０６）。そして、変換部２１２は、ａｄｄｒ＿ｃｕｒを１だけインクリメントして（ステップ１４０７）、ステップ１４０２以降の処理を繰り返す。
【０１０６】
一方、ｔｗが無効値ではなく、かつ、ｔｅｍｐ以下である場合（ステップ１４０５，ＮＯ）、変換部２１２は、ａｄｄｒ＿ｃｕｒを１だけインクリメントして（ステップ１４０７）、ステップ１４０２以降の処理を繰り返す。
【０１０７】
そして、ａｄｄｒ＿ｃｕｒがデータの最終アドレスに達した場合（ステップ１４０２，ＹＥＳ）、変換部２１２は、第２処理の開始時刻をｔｗだけ早める（ステップ１４０８）。これにより、第２処理を第１処理とオーバラップさせることができる。
【０１０８】
例えば、図６の前処理と図１０のメイン処理をオーバラップさせる場合、変換部２１２は、図１０のメイン処理における時刻０〜時刻２４を時刻２５〜時刻４９に変更してから、開始時刻変更処理を開始する。この場合、第１処理のデータライトによって書き込まれるｉｎ［ｙ］［ｘ］の最終アドレスはＡｉｎ＝２４である。
【０１０９】
まず、ａｄｄｒ＿ｃｕｒ＝０のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は０であるため、ｔ＿１＝０となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は２５であるため、ｔ＿２＝２５となる。したがって、ｔｅｍｐ＝２５−０−１＝２４となる。ｔｗは無効値であるため、ｔｗ＝ｔｅｍｐ＝２４となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１１０】
次に、ａｄｄｒ＿ｃｕｒ＝１のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は５であるため、ｔ＿１＝５となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は２６であるため、ｔ＿２＝２６となる。したがって、ｔｅｍｐ＝２６−５−１＝２０となる。ｔｗ＞ｔｅｍｐであるため、ｔｗ＝ｔｅｍｐ＝２０となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１１１】
次に、ａｄｄｒ＿ｃｕｒ＝２のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は１０であるため、ｔ＿１＝１０となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は２８であるため、ｔ＿２＝２８となる。したがって、ｔｅｍｐ＝２８−１０−１＝１７となる。ｔｗ＞ｔｅｍｐであるため、ｔｗ＝ｔｅｍｐ＝１７となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１１２】
次に、ａｄｄｒ＿ｃｕｒ＝３のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は１５であるため、ｔ＿１＝１５となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は３１であるため、ｔ＿２＝３１となる。したがって、ｔｅｍｐ＝３１−１５−１＝１５となる。ｔｗ＞ｔｅｍｐであるため、ｔｗ＝ｔｅｍｐ＝１５となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１１３】
次に、ａｄｄｒ＿ｃｕｒ＝４のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は２０であるため、ｔ＿１＝２０となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は３５であるため、ｔ＿２＝３５となる。したがって、ｔｅｍｐ＝３５−２０−１＝１４となる。ｔｗ＞ｔｅｍｐであるため、ｔｗ＝ｔｅｍｐ＝１４となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１１４】
以降、ａｄｄｒ＿ｃｕｒをインクリメントしながら同様の操作を繰り返しても、ｔｗ≦ｔｅｍｐとなるため、ｔｗは更新されず、ａｄｄｒ＿ｃｕｒ＝２４のとき、メイン処理の開始時刻が１４だけ早められる。これにより、図１１に示したように、メイン処理の開始時刻が時刻２５から時刻１１に変更され、前処理及びメイン処理の総実行時間が１４だけ短縮される。
【０１１５】
ところで、変換部２１２は、図１２のステップ１２０１の実行順序変更処理を省略して、ステップ１２０２の開始時刻変更処理のみを行ってもよい。例えば、図６の前処理とメイン処理をオーバラップさせる場合、以下の手順で開始時刻変更処理が行われる。
【０１１６】
まず、ａｄｄｒ＿ｃｕｒ＝０のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は０であるため、ｔ＿１＝０となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は２５であるため、ｔ＿２＝２５となる。したがって、ｔｅｍｐ＝２５−０−１＝２４となる。ｔｗは無効値であるため、ｔｗ＝ｔｅｍｐ＝２４となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１１７】
次に、ａｄｄｒ＿ｃｕｒ＝１のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は５であるため、ｔ＿１＝５となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は２６であるため、ｔ＿２＝２６となる。したがって、ｔｅｍｐ＝２６−５−１＝２０となる。ｔｗ＞ｔｅｍｐであるため、ｔｗ＝ｔｅｍｐ＝２０となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１１８】
次に、ａｄｄｒ＿ｃｕｒ＝２のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は１０であるため、ｔ＿１＝１０となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は２７であるため、ｔ＿２＝２７となる。したがって、ｔｅｍｐ＝２７−１０−１＝１６となる。ｔｗ＞ｔｅｍｐであるため、ｔｗ＝ｔｅｍｐ＝１６となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１１９】
次に、ａｄｄｒ＿ｃｕｒ＝３のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は１５であるため、ｔ＿１＝１５となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は２８であるため、ｔ＿２＝２８となる。したがって、ｔｅｍｐ＝２８−１５−１＝１２となる。ｔｗ＞ｔｅｍｐであるため、ｔｗ＝ｔｅｍｐ＝１２となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１２０】
次に、ａｄｄｒ＿ｃｕｒ＝４のとき、前処理においてａｄｄｒ＿ｃｕｒにデータを書き込むデータライトが実行される時刻は２０であるため、ｔ＿１＝２０となる。また、メイン処理においてａｄｄｒ＿ｃｕｒからデータを読み出すデータリードが実行される時刻は２９であるため、ｔ＿２＝２９となる。したがって、ｔｅｍｐ＝２９−２０−１＝８となる。ｔｗ＞ｔｅｍｐであるため、ｔｗ＝ｔｅｍｐ＝８となり、ａｄｄｒ＿ｃｕｒが１だけインクリメントされる。
【０１２１】
以降、ａｄｄｒ＿ｃｕｒをインクリメントしながら同様の操作を繰り返しても、ｔｗ≦ｔｅｍｐとなるため、ｔｗは更新されず、ａｄｄｒ＿ｃｕｒ＝２４のとき、メイン処理の開始時刻が８だけ早められる。これにより、メイン処理の開始時刻が時刻２５から時刻１７に変更され、前処理及びメイン処理の総実行時間が８だけ短縮される。
【０１２２】
図１５は、実行順序変更処理を省略して図６の前処理とメイン処理をオーバラップさせた場合のデータライト及びデータリードの順序の例を示している。図１５では、メイン処理の開始時刻が時刻２５から時刻１７に変更され、前処理及びメイン処理の総実行時間が８だけ短縮されている。
【０１２３】
なお、変換部２１２は、図１４とは異なる開始時刻変更処理によって、第１処理と第２処理をオーバラップさせることも可能である。例えば、第２処理の開始時刻を１時刻ずつ早めながら、第１処理における各データライトのアドレスについて、第１処理におけるデータライトの時刻と第２処理におけるデータリードの時刻とが隣接しているか否かをチェックする方法を用いてもよい。この場合、いずれかのアドレスに対するデータリードの時刻が、同じアドレスに対するデータライトの時刻と隣接する時刻になった時点で、処理が終了する。
【０１２４】
図２の情報処理装置の構成は一例に過ぎず、情報処理装置の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。
【０１２５】
図３及び図１２〜図１４のフローチャートは一例に過ぎず、情報処理装置の構成又は条件に応じて一部の処理を省略又は変更してもよい。例えば、第２処理に含まれる演算単位の順序を変更しない場合は、図１２のステップ１２０１の処理を省略することができる。
【０１２６】
図４〜図１１及び図１５に示した前処理及びメイン処理は一例に過ぎず、第１処理及び第２処理は、データ依存性を有する別の処理であってもよい。第１処理及び第２処理は、ハードウェア回路によって実行される処理に限られず、ソフトウェアによって実行される処理であってもよい。
【０１２７】
図１６は、図２の情報処理装置のハードウェア構成例を示している。図１６の情報処理装置は、ＣＰＵ（Central Processing Unit）１５０１、メモリ１５０２、入力装置１５０３、出力装置１５０４、補助記憶装置１５０５、媒体駆動装置１５０６、及びネットワーク接続装置１５０７を含む。これらの構成要素はバス１５０８により互いに接続されている。
【０１２８】
メモリ１５０２は、例えば、ＲＯＭ（Read Only Memory）、ＲＡＭ（Random Access Memory）、フラッシュメモリ等の半導体メモリであり、処理に用いられるプログラム及びデータを格納する。メモリ１５０２は、図２の記憶部２１１として用いることができる。
【０１２９】
ＣＰＵ１５０１（プロセッサ）は、例えば、メモリ１５０２を利用してプログラムを実行することにより、図２の変換部２１２として動作する。
【０１３０】
入力装置１５０３は、例えば、キーボード、ポインティングデバイス等であり、オペレータ又はユーザからの指示又は情報の入力に用いられる。出力装置１５０４は、例えば、表示装置、プリンタ、スピーカ等であり、オペレータ又はユーザへの問い合わせ又は指示、及び処理結果の出力に用いられる。処理結果は、第２実行情報２２２であってもよい。
【０１３１】
補助記憶装置１５０５は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置、テープ装置等である。補助記憶装置１５０５は、ハードディスクドライブ又はフラッシュメモリであってもよい。情報処理装置は、補助記憶装置１５０５にプログラム及びデータを格納しておき、それらをメモリ１５０２にロードして使用することができる。補助記憶装置１５０５は、図２の記憶部２１１として用いることができる。
【０１３２】
媒体駆動装置１５０６は、可搬型記録媒体１５０９を駆動し、その記録内容にアクセスする。可搬型記録媒体１５０９は、メモリデバイス、フレキシブルディスク、光ディスク、光磁気ディスク等である。可搬型記録媒体１５０９は、ＣＤ−ＲＯＭ（Compact Disk Read Only Memory）、ＤＶＤ（Digital Versatile Disk）、ＵＳＢ（Universal Serial Bus）メモリ等であってもよい。オペレータ又はユーザは、この可搬型記録媒体１５０９にプログラム及びデータを格納しておき、それらをメモリ１５０２にロードして使用することができる。
【０１３３】
このように、処理に用いられるプログラム及びデータを格納するコンピュータ読み取り可能な記録媒体は、メモリ１５０２、補助記憶装置１５０５、又は可搬型記録媒体１５０９のような、物理的な（非一時的な）記録媒体である。
【０１３４】
ネットワーク接続装置１５０７は、ＬＡＮ（Local Area Network）、ＷＡＮ（Wide Area Network）等の通信ネットワークに接続され、通信に伴うデータ変換を行う通信インタフェース回路である。情報処理装置は、プログラム及びデータを外部の装置からネットワーク接続装置１５０７を介して受信し、それらをメモリ１５０２にロードして使用することができる。
【０１３５】
なお、情報処理装置が図１６のすべての構成要素を含む必要はなく、用途又は条件に応じて一部の構成要素を省略することも可能である。例えば、オペレータ又はユーザとのインタフェースが不要な場合は、入力装置１５０３及び出力装置１５０４を省略してもよい。可搬型記録媒体１５０９又は通信ネットワークを使用しない場合は、媒体駆動装置１５０６又はネットワーク接続装置１５０７を省略してもよい。
【０１３６】
開示の実施形態とその利点について詳しく説明したが、当業者は、特許請求の範囲に明確に記載した本発明の範囲から逸脱することなく、様々な変更、追加、省略をすることができるであろう。
【０１３７】
図１乃至図１６を参照しながら説明した実施形態に関し、さらに以下の付記を開示する。
（付記１）
複数のデータに対する第１処理と前記第１処理に続いて実行される第２処理とを含む第１実行情報を記憶する記憶部と、
前記第１処理に含まれるデータライトの順序と前記第２処理に含まれるデータリードの順序とに基づいて、前記複数のデータ各々について前記第１処理におけるデータライトの後で前記第２処理におけるデータリードを実行する実行順序の制約の下で、前記第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることで、前記第１実行情報を第２実行情報に変換し、前記第２実行情報を出力する変換部と、
を備えることを特徴とする情報処理装置。
（付記２）
前記複数のデータは複数の第１データであり、
前記第１処理は、前記複数の第１データ各々を書き込むデータライトを含み、
前記第２処理は、複数の第２データ各々を生成する演算単位を含み、
前記演算単位は、いずれかの第１データを読み出すデータリードと、いずれかの第２データを読み出すデータリードと、読み出された第１データ及び第２データを用いて、演算結果を示す第２データを生成するデータ演算と、前記演算結果を示す第２データを書き込むデータライトとを含み、
前記変換部は、前記第１処理における前記複数の第１データに対するデータライトの順序と、前記第２処理における前記複数の第２データに対する演算単位の順序とに基づいて、前記複数の第２データ各々についてデータライトの後でデータリードを実行する実行順序の制約の下で、前記第２処理に含まれる演算単位の順序を変更し、変更後の第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることを特徴とする付記１記載の情報処理装置。
（付記３）
前記変換部は、前記第１処理における前記複数の第１データに対するデータライトの順序に従って第１データを選択し、前記第２処理に含まれる演算単位の中から、選択された第１データを読み出すデータリードを含む演算単位を選択し、前記第１実行情報における前記第２処理の開始タイミングと選択された演算単位の実行タイミングとの間に、前記第１処理において前記選択された第１データよりも後で書き込まれる第１データを読み出すデータリードを含む演算単位が存在する場合、前記選択された演算単位の実行タイミングを早めるように、前記第２処理に含まれる演算単位の順序を変更することを特徴とする付記２記載の情報処理装置。
（付記４）
前記変換部は、前記選択された演算単位によって読み出される第２データを生成する演算単位を再帰的に特定し、前記複数の第２データ各々についてデータライトの後でデータリードを実行する実行順序の制約に従って、特定された演算単位が前記選択された演算単位よりも前に実行されるように、前記第２処理に含まれる演算単位の順序を変更することを特徴とする付記３記載の情報処理装置。
（付記５）
前記第１実行情報は、前記第１処理及び前記第２処理を実行するパイプライン回路におけるデータ演算の実行順序を記述した情報であることを特徴とする付記１乃至４のいずれか１項に記載の情報処理装置。
（付記６）
情報処理装置によって実行される情報処理方法であって、
前記情報処理装置が、
複数のデータに対する第１処理と前記第１処理に続いて実行される第２処理とを含む第１実行情報を解析し、
前記第１処理に含まれるデータライトの順序と前記第２処理に含まれるデータリードの順序とに基づいて、前記複数のデータ各々について前記第１処理におけるデータライトの後で前記第２処理におけるデータリードを実行する実行順序の制約の下で、前記第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることで、前記第１実行情報を第２実行情報に変換し、
前記第２実行情報を出力する、
ことを特徴とする情報処理方法。
（付記７）
前記複数のデータは複数の第１データであり、
前記第１処理は、前記複数の第１データ各々を書き込むデータライトを含み、
前記第２処理は、複数の第２データ各々を生成する演算単位を含み、
前記演算単位は、いずれかの第１データを読み出すデータリードと、いずれかの第２データを読み出すデータリードと、読み出された第１データ及び第２データを用いて、演算結果を示す第２データを生成するデータ演算と、前記演算結果を示す第２データを書き込むデータライトとを含み、
前記情報処理装置は、前記第１処理における前記複数の第１データに対するデータライトの順序と、前記第２処理における前記複数の第２データに対する演算単位の順序とに基づいて、前記複数の第２データ各々についてデータライトの後でデータリードを実行する実行順序の制約の下で、前記第２処理に含まれる演算単位の順序を変更し、変更後の第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることを特徴とする付記６記載の情報処理方法。
（付記８）
前記情報処理装置は、前記第１処理における前記複数の第１データに対するデータライトの順序に従って第１データを選択し、前記第２処理に含まれる演算単位の中から、選択された第１データを読み出すデータリードを含む演算単位を選択し、前記第１実行情報における前記第２処理の開始タイミングと選択された演算単位の実行タイミングとの間に、前記第１処理において前記選択された第１データよりも後で書き込まれる第１データを読み出すデータリードを含む演算単位が存在する場合、前記選択された演算単位の実行タイミングを早めるように、前記第２処理に含まれる演算単位の順序を変更することを特徴とする付記７記載の情報処理方法。
（付記９）
前記情報処理装置は、前記選択された演算単位によって読み出される第２データを生成する演算単位を再帰的に特定し、前記複数の第２データ各々についてデータライトの後でデータリードを実行する実行順序の制約に従って、特定された演算単位が前記選択された演算単位よりも前に実行されるように、前記第２処理に含まれる演算単位の順序を変更することを特徴とする付記８記載の情報処理方法。
（付記１０）
前記第１実行情報は、前記第１処理及び前記第２処理を実行するパイプライン回路におけるデータ演算の実行順序を記述した情報であることを特徴とする付記６乃至９のいずれか１項に記載の情報処理方法。
（付記１１）
複数のデータに対する第１処理と前記第１処理に続いて実行される第２処理とを含む第１実行情報を解析し、
前記第１処理に含まれるデータライトの順序と前記第２処理に含まれるデータリードの順序とに基づいて、前記複数のデータ各々について前記第１処理におけるデータライトの後で前記第２処理におけるデータリードを実行する実行順序の制約の下で、前記第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることで、前記第１実行情報を第２実行情報に変換し、
前記第２実行情報を出力する、
処理をコンピュータに実行させるためのプログラム。
（付記１２）
前記複数のデータは複数の第１データであり、
前記第１処理は、前記複数の第１データ各々を書き込むデータライトを含み、
前記第２処理は、複数の第２データ各々を生成する演算単位を含み、
前記演算単位は、いずれかの第１データを読み出すデータリードと、いずれかの第２データを読み出すデータリードと、読み出された第１データ及び第２データを用いて、演算結果を示す第２データを生成するデータ演算と、前記演算結果を示す第２データを書き込むデータライトとを含み、
前記コンピュータは、前記第１処理における前記複数の第１データに対するデータライトの順序と、前記第２処理における前記複数の第２データに対する演算単位の順序とに基づいて、前記複数の第２データ各々についてデータライトの後でデータリードを実行する実行順序の制約の下で、前記第２処理に含まれる演算単位の順序を変更し、変更後の第２処理の開始タイミングを前記第１処理の終了タイミングよりも早めることを特徴とする付記１１記載のプログラム。
（付記１３）
前記コンピュータは、前記第１処理における前記複数の第１データに対するデータライトの順序に従って第１データを選択し、前記第２処理に含まれる演算単位の中から、選択された第１データを読み出すデータリードを含む演算単位を選択し、前記第１実行情報における前記第２処理の開始タイミングと選択された演算単位の実行タイミングとの間に、前記第１処理において前記選択された第１データよりも後で書き込まれる第１データを読み出すデータリードを含む演算単位が存在する場合、前記選択された演算単位の実行タイミングを早めるように、前記第２処理に含まれる演算単位の順序を変更することを特徴とする付記１２記載のプログラム。
（付記１４）
前記コンピュータは、前記選択された演算単位によって読み出される第２データを生成する演算単位を再帰的に特定し、前記複数の第２データ各々についてデータライトの後でデータリードを実行する実行順序の制約に従って、特定された演算単位が前記選択された演算単位よりも前に実行されるように、前記第２処理に含まれる演算単位の順序を変更することを特徴とする付記１３記載のプログラム。
（付記１５）
前記第１実行情報は、前記第１処理及び前記第２処理を実行するパイプライン回路におけるデータ演算の実行順序を記述した情報であることを特徴とする付記１１乃至１４のいずれか１項に記載のプログラム。
【符号の説明】
【０１３８】
２０１  情報処理装置
２１１  記憶部
２１２  変換部
２２１  第１実行情報
２２２  第２実行情報
８０１〜８０３、９０１〜９０５  矢印
１５０１  ＣＰＵ
１５０２  メモリ
１５０３  入力装置
１５０４  出力装置
１５０５  補助記憶装置
１５０６  媒体駆動装置
１５０７  ネットワーク接続装置
１５０８  バス
１５０９  可搬型記録媒体
【図１】
2020129297.tif 000003
【図２】
2020129297.tif 000004
【図３】
2020129297.tif 000005
【図４】
2020129297.tif 000006
【図５】
2020129297.tif 000007
【図６】
2020129297.tif 000008
【図７】
2020129297.tif 000009
【図８】
2020129297.tif 000010
【図９】
2020129297.tif 000011
【図１０】
2020129297.tif 000012
【図１１】
2020129297.tif 000013
【図１２】
2020129297.tif 000014
【図１３Ａ】
2020129297.tif 000015
【図１３Ｂ】
2020129297.tif 000016
【図１４】
2020129297.tif 000017
【図１５】
2020129297.tif 000018
【図１６】
2020129297.tif 000019