(57)【要約】  本発明は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、アクセラレータに対して効率的にデータを供給するようプログラムを書き換える技術を提供する。  プログラム解析部１１は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいてオフロード対象処理を特定する。高位合成部１２は、オフロード対象処理をアクセラレータ上に実装する演算装置の設計内容情報を生成するとともに演算装置の構造情報を生成する。プログラムコード片生成部１３は、構造情報に基づいて、演算装置に対して同時に供給する入力データの組をメモリ上の連続領域に配置し連続領域を用いてオフロード対象処理を呼び出す処理を記述したプログラムコード片を生成する。プログラム書換部１４は、プログラムにおけるオフロード対象処理の呼び出し箇所に、プログラムコード片を埋め込む。
2017056427.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、前記アクセラレータにオフロードされる処理（オフロード対象処理）を特定するプログラム解析手段と、
前記オフロード対象処理を前記アクセラレータ上に実装する演算装置の設計内容を表す設計内容情報を生成し、生成した設計内容情報に基づいて、前記演算装置の構造を表す構造情報を生成する高位合成手段と、
前記構造情報に基づいて、前記演算装置に対して同時に供給する入力データの組を読み込んでメモリ上の連続領域に配置するとともに前記連続領域を用いて前記オフロード対象処理を呼び出す処理を記述したプログラムコード片を生成するプログラムコード片生成手段と、
前記プログラムにおける前記オフロード対象処理の呼び出し箇所に、前記プログラムコード片を埋め込むプログラム書換手段と、
を備えたプログラム書換装置。
【請求項２】
前記高位合成手段は、前記構造情報として、前記演算装置の各入力端子について、最も前段の入力端子からのサイクル数（遅延数）を含む情報を生成し、
前記プログラムコード片生成手段は、前記遅延数に応じた前記各入力データを組にして前記連続領域に配置する処理の記述を、前記プログラムコード片に含めることを特徴とする請求項１に記載のプログラム書換装置。
【請求項３】
前記高位合成手段は、前記演算装置としてパイプライン演算器の設計内容情報を生成することを特徴とする請求項１または請求項２に記載のプログラム書換装置。
【請求項４】
コンピュータ装置が、
プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、前記アクセラレータにオフロードされる処理（オフロード対象処理）を特定し、
前記オフロード対象処理を前記アクセラレータ上に実装する演算装置の設計内容を表す設計内容情報を生成し、生成した設計内容情報に基づいて、前記演算装置の構造を表す構造情報を生成し、
前記構造情報に基づいて、前記演算装置に対して同時に供給する入力データの組を読み込んでメモリ上の連続領域に配置するとともに前記連続領域を用いて前記オフロード対象処理を呼び出す処理を記述したプログラムコード片を生成し、
前記プログラムにおける前記オフロード対象処理の呼び出し箇所に、前記プログラムコード片を埋め込む方法。
【請求項５】
プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、前記アクセラレータにオフロードされる処理（オフロード対象処理）を特定するプログラム解析ステップと、
前記オフロード対象処理を前記アクセラレータ上に実装する演算装置の設計内容を表す設計内容情報を生成し、生成した設計内容情報に基づいて、前記演算装置の構造を表す構造情報を生成する高位合成ステップと、
前記構造情報に基づいて、前記演算装置に対して同時に供給する入力データの組を読み込んでメモリ上の連続領域に配置するとともに前記連続領域を用いて前記オフロード対象処理を呼び出す処理を記述したプログラムコード片を生成するプログラムコード片生成ステップと、
前記プログラムにおける前記オフロード対象処理の呼び出し箇所に、前記プログラムコード片を埋め込むプログラム書換ステップと、
をコンピュータ装置に実行させるプログラムを記憶した記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムを書き換える技術に関する。
【背景技術】
【０００２】
プロセッサおよびアクセラレータを含むコンピュータシステムが知られている。このようなコンピュータシステムに実行させるプログラムを記載する際には、アクセラレータに割り当てる処理を決める必要がある。例えば、特許文献１には、アクセラレータに割り当てる関数を実行時に動的に決定する技術が記載されている。以降、アクセラレータに処理を割り当てることを、オフロードするとも記載する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１２−１３３７７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ここで、オフロードされた処理が実装されたアクセラレータには、効率的に入力データが供給されることが求められる。例えば、オフロードされた処理がパイプライン演算器として実装される場合、パイプライン演算器に対して、毎サイクル入力データが供給されることが望ましい。この場合、パイプライン演算のそれぞれのステージにおいて必要となる入力データが、パイプライン演算器に対して同時に供給される必要がある。つまり、パイプライン演算器に対しては、同じ組の入力データ群を、パイプライン演算器の構造に応じた異なるタイミングで供給する必要がある。そのために、多段のパイプラインレジスタを追加して入力データを遅延させることが考えられる。しかしながら、多段のパイプラインレジスタは、大きな回路面積を消費するため受け入れられない。【０００５】
このように、オフロードされた処理が実装されたアクセラレータは、あるサイクルにおいて、異なる組の複数個の入力データを必要とする。ところが、通常のメモリシステムでは、あるサイクルに要求できるアドレスは１種類である。メモリバス幅が広ければ、連続領域に配置された複数個の入力データを一度に読み込むことは可能である。しかしながら、非連続な領域に配置された複数個の入力データを一度に読み込むことはできない。したがって、オフロードされた処理が実装されたアクセラレータが、あるサイクルにおいて必要とする複数個の入力データを効率的に読み込むためには、それらの入力データが連続領域に配置されている必要がある。【０００６】
このように、オフロードされる処理が実装されたアクセラレータに対して入力データを効率的に供給するためには、各入力データの必要なタイミングを考慮して異なる組の複数個の入力データを、連続領域に配置するプログラムを記述する必要がある。しかし、そのようなプログラムを記述することは、プログラマにとって困難かつ非効率的である。【０００７】
特許文献１には、アクセラレータにオフロードする処理を実行時に動的に決めることについては記載されているものの、アクセラレータに対して入力データを効率的に供給することについては記載がない。【０００８】
本発明は、上述の課題を解決するためになされたものである。すなわち、本発明は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、アクセラレータに対して効率的にデータを供給するようプログラムを書き換える技術を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するために、本発明のプログラム書換装置は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、前記アクセラレータにオフロードされる処理（オフロード対象処理）を特定するプログラム解析手段と、前記オフロード対象処理を前記アクセラレータ上に実装する演算装置の設計内容を表す設計内容情報を生成し、生成した設計内容情報に基づいて、前記演算装置の構造を表す構造情報を生成する高位合成手段と、前記構造情報に基づいて、前記演算装置に対して同時に供給する入力データの組を読み込んでメモリ上の連続領域に配置するとともに前記連続領域を用いて前記オフロード対象処理を呼び出す処理を記述したプログラムコード片を生成するプログラムコード片生成手段と、前記プログラムにおける前記オフロード対象処理の呼び出し箇所に、前記プログラムコード片を埋め込むプログラム書換手段と、を備える。【００１０】
また、本発明の方法は、コンピュータ装置が、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、前記アクセラレータにオフロードされる処理（オフロード対象処理）を特定し、前記オフロード対象処理を前記アクセラレータ上に実装する演算装置の設計内容を表す設計内容情報を生成し、生成した設計内容情報に基づいて、前記演算装置の構造を表す構造情報を生成し、前記構造情報に基づいて、前記演算装置に対して同時に供給する入力データの組を読み込んでメモリ上の連続領域に配置するとともに前記連続領域を用いて前記オフロード対象処理を呼び出す処理を記述したプログラムコード片を生成し、前記プログラムにおける前記オフロード対象処理の呼び出し箇所に、前記プログラムコード片を埋め込む。【００１１】
また、本発明の記憶媒体は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、前記アクセラレータにオフロードされる処理（オフロード対象処理）を特定するプログラム解析ステップと、前記オフロード対象処理を前記アクセラレータ上に実装する演算装置の設計内容を表す設計内容情報を生成し、生成した設計内容情報に基づいて、前記演算装置の構造を表す構造情報を生成する高位合成ステップと、前記構造情報に基づいて、前記演算装置に対して同時に供給する入力データの組を読み込んでメモリ上の連続領域に配置するとともに前記連続領域を用いて前記オフロード対象処理を呼び出す処理を記述したプログラムコード片を生成するプログラムコード片生成ステップと、前記プログラムにおける前記オフロード対象処理の呼び出し箇所に、前記プログラムコード片を埋め込むプログラム書換ステップと、をコンピュータ装置に実行させるプログラムを記憶している。
【発明の効果】
【００１２】
本発明は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、アクセラレータに対して効率的にデータを供給するようプログラムを書き換える技術を提供することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施の形態としてのプログラム書換装置の構成を示すブロック図である。
【図２】本発明の実施の形態としてのプログラム書換装置のハードウェア構成の一例を示す図である。
【図３】本発明の実施の形態としてのプログラム書換装置の動作を説明するフローチャートである。
【図４】本発明の実施の形態の具体例において入力されるプログラム、ならびに、そのうちオフロード対象処理およびオフロード非対象処理の一例を示す図である。
【図５】本発明の実施の形態の具体例におけるプログラム解析部の動作の一例を説明するフローチャートである。
【図６】本発明の実施の形態の具体例における高位合成部の動作の一例を説明するフローチャートである。
【図７】本発明の実施の形態の具体例において決定されるパイプライン演算器の構成の一例を示す図である。
【図８】本発明の実施の形態の具体例において生成される設計内容情報の一例を示す図である。
【図９】本発明の実施の形態の具体例において生成される構造情報の一例を示す図である。
【図１０】本発明の実施の形態の具体例におけるプログラムコード片生成部の動作の一例を説明するフローチャートである。
【図１１】本発明の実施の形態の具体例において生成されるプログラムコード片の一例を示す図である。
【図１２】本発明の実施の形態の具体例においてパイプライン演算器に同時に供給される入力データの組の一例を説明する図である。
【図１３】本発明の実施の形態の具体例におけるプロローグおよびエピローグのプログラムコード片の一例を示す図である。
【図１４】本発明の実施の形態の具体例において出力されるプログラムの一例を示す図である。
【発明を実施するための形態】
【００１４】
以下、本発明の実施の形態について、図面を参照して詳細に説明する。
【００１５】
本発明の実施の形態としてのプログラム書換装置１の機能ブロック構成を図１に示す。図１において、プログラム書換装置１は、プログラム解析部１１と、高位合成部１２と、プログラムコード片生成部１３と、プログラム書換部１４とを備える。
【００１６】
ここで、プログラム書換装置１は、図２に示すようなハードウェア要素によって構成可能である。図２において、プログラム書換装置１は、ＣＰＵ（Central Processing Unit）１００１およびメモリ１００２を含む。メモリ１００２は、ＲＡＭ（Random Access Memory）、ＲＯＭ（Read Only Memory）、補助記憶装置（ハードディスク等）等によって構成される。この場合、プログラム書換装置１の各機能ブロックは、メモリ１００２に格納されるコンピュータ・プログラムを読み込んで実行するとともに他の各部を制御するＣＰＵ１００１によって構成される。なお、プログラム書換装置１およびその各機能ブロックのハードウェア構成は、上述の構成に限定されない。
【００１７】
プログラム解析部１１は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、アクセラレータにオフロードされる処理（オフロード対象処理）を特定する。例えば、プログラム解析部１１は、入力として、プログラムを表す情報と、そのうちオフロード対象処理を指定する情報とを取得することにより、オフロード対象処理を特定してもよい。また、例えば、プログラム解析部１１は、入力としてプログラムを表す情報を取得し、そのうちオフロード対象処理を決定する公知の技術を用いて、オフロード対象処理を特定してもよい。
【００１８】
高位合成部１２は、オフロード対象処理をアクセラレータ上に実装する演算装置の設計内容を表す設計内容情報を生成する。設計内容情報は、例えば、ＲＴＬ（Register Transfer Level）記述であってもよい。また、高位合成部１２は、生成した設計内容情報に基づいて、演算装置の構造を表す構造情報を生成する。構造情報には、例えば、各入力端子の遅延に関する情報が含まれていてもよい。
【００１９】
プログラムコード片生成部１３は、演算装置の構造情報に基づいて、プログラムコード片を生成する。プログラムコード片は、アクセラレータ上に実装される演算装置に対して同時に供給する入力データの組をメモリ１００２上の連続領域に配置する処理の記述と、その連続領域を用いてオフロード対象処理を呼び出す処理の記述とを含む。例えば、構造情報に各入力端子の遅延に関する情報が含まれる場合、プログラムコード片生成部１３は、各入力端子について遅延を考慮することにより同時に供給する入力データの組を読み込み、読み込んだ入力データの組を連続領域に配置する処理を記述する。また、プログラムコード片生成部１３は、オフロード対象処理の呼び出し文として、上述の連続領域を示す情報を引数とする呼び出し文を記述する。
【００２０】
プログラム書換部１４は、プログラムにおけるオフロード対象処理の呼び出し箇所に、上述のプログラムコード片を埋め込む。具体的には、プログラム書換部１４は、プログラムにおけるオフロード対象処理以外の部分について、オフロード対象処理の呼び出し文を含む箇所を、上述のプログラムコード片に置換したプログラムを、出力してもよい。
【００２１】
以上のように構成されたプログラム書換装置１の動作を図３に示す。
【００２２】
図３において、まず、プログラム解析部１１は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムを取得する。そして、プログラム解析部１１は、取得したプログラムにおいて、オフロード対象処理を特定する（ステップＳ１）。
【００２３】
例えば、前述のように、プログラム解析部１１は、オフロード対象処理を指定する情報を、プログラムとともに入力として取得してもよい。
【００２４】
次に、高位合成部１２は、オフロード対象処理をアクセラレータ上に実装する演算装置に関して、設計内容情報を生成する（ステップＳ２）。
【００２５】
次に、高位合成部１２は、設計内容情報に基づいて、演算装置の構造を表す構造情報を生成する（ステップＳ３）。
【００２６】
次に、プログラムコード片生成部１３は、構造情報に基づいて、プログラムコード片を生成する（ステップＳ４）。
【００２７】
前述したように、プログラムコード片は、演算装置に対して同時に供給する入力データの組をメモリ１００２上の連続領域に配置する処理の記述と、その連続領域を用いてオフロード対象処理を呼び出す処理の記述とを含む。
【００２８】
次に、プログラム書換部１４は、プログラムにおけるオフロード対象処理の呼び出し箇所に、上述のプログラムコード片を埋め込む（ステップＳ５）。
【００２９】
前述したように、プログラム書換部１４は、プログラムにおけるオフロード対象処理以外の部分について、オフロード対象処理の呼び出し文を含む箇所を、上述のプログラムコード片に置換したプログラムを、出力してもよい。
【００３０】
以上で、プログラム書換装置１は、動作を終了する。
【００３１】
このようにして、プログラム書換装置１は、ステップＳ１で取得したプログラムに対して、ステップＳ２で生成した設計内容情報と、ステップＳ５で書き換えたオフロード対象処理以外の部分のプログラムとを出力する。
【００３２】
次に、プログラム書換装置１の動作を具体例で示す。この例では、オフロード対象処理は、アクセラレータ上に、パイプライン演算器として実装されるものとする。
【００３３】
まず、ステップＳ１において、プログラム解析部１１は、図４に示す入力プログラムを表す情報と、オフロード対象処理を指定する情報とを取得する。この例では、入力プログラム中には、「ｆｕｎｃＡ」および「ｍａｉｎ」という２つの関数が含まれている。また、プログラム解析部１１は、オフロード対象処理を指定する情報として、関数名「ｆｕｎｃＡ」を取得したものとする。
【００３４】
そして、この具体例では、このステップにおいて、プログラム解析部１１は、取得した入力プログラムを、オフロード対象プログラムと、オフロードの対象でないオフロード非対象プログラムとに分けて出力する。
【００３５】
具体例におけるステップＳ１でのプログラム解析部１１の動作の詳細を図５に示す。
【００３６】
図５において、プログラム解析部１１は、入力プログラムの構造解析を行い、関数名シンボルを抽出する（ステップＳ１１）。ここでは、「ｆｕｎｃＡ」および「ｍａｉｎ」が抽出される。
【００３７】
次に、プログラム解析部１１は、抽出した関数名シンボルのうち、オフロード対象処理を指定する情報と一致する関数名シンボルを検索する（ステップＳ１２）。ここでは、「ｆｕｎｃＡ」が検出される。
【００３８】
次に、プログラム解析部１１は、検出した関数名シンボルに対応する範囲のプログラムを、オフロード対象プログラムとして出力する（ステップＳ１３）。
【００３９】
次に、プログラム解析部１１は、オフロード対象処理を指定する情報「ｆｕｎｃＡ」と一致しない関数名シンボルに対応する範囲のプログラムを、オフロード非対象プログラムとして出力する（ステップＳ１４）。
【００４０】
以上で、具体例でのステップＳ１の動作の詳細な説明を終了する。
【００４１】
これにより、図４に示すように、オフロード対象プログラムとしては、関数ｆｕｎｃＡの中身が出力される。また、オフロード非対象プログラムとしては、関数ｍａｉｎの中身が出力される。
【００４２】
次に、ステップＳ２〜Ｓ３において、高位合成部１２は、オフロード対象プログラムに基づいて、パイプライン演算器のＲＴＬ記述を出力する。また、高位合成部１２は、パイプライン演算器の各入力端子について、最も前段の入力端子からのサイクル数（遅延数）を表す情報を、構造情報として生成する。
【００４３】
具体例におけるステップＳ２〜Ｓ３での高位合成部１２の動作の詳細を図６に示す。
【００４４】
図６において、高位合成部１２は、オフロード対象プログラムの高位合成を行い、パイプライン演算器の構造を生成する（ステップＳ２１）。
【００４５】
この例では、図４に示したように、オフロード対象プログラムは、４つの入力ａ，ｂ，ｃ，ｄに対し、（（（ａ＊ｂ）＋ｃ）＊ｄ）の計算を行い、計算結果を出力するプログラムである。そこで、高位合成部１２は、このようなオフロード対象プログラムを実装するパイプライン演算器の構造として、図７に示す構造を生成する。このパイプライン演算器は、最初のパイプライン・ステージ（ステージ１）で、入力ａおよびｂの乗算を行う。乗算の遅延が２サイクルとすると、ステージ３で乗算結果が出力される。そして、このパイプライン演算器は、ステージ３で、ステージ１の乗算結果と入力ｃとの加算を行う。加算の遅延が２サイクルとすると、ステージ５で加算結果が出力される。そして、このパイプライン演算器は、ステージ５で、ステージ３の加算結果と入力ｄとの乗算を行う。乗算結果は、ステージ７で出力される。
【００４６】
次に、高位合成部１２は、生成された構造を、ＲＴＬ記述に変換し、出力する（ステップＳ２２）。
【００４７】
ここでは、図７に示したパイプライン演算器の構造に対して、図８に示すような、Ｖｅｒｉｌｏｇ−ＲＴＬ記述が出力されたものとする。なお、図８において、ＭＵＬＴＩＰＬＩＥＲは、乗算器を表す。また、ＡＤＤＥＲは、加算器を表す。
【００４８】
次に、高位合成部１２は、生成された構造中のそれぞれの入力端子について、最も前段の入力端子からのサイクル数（遅延数）を求め、構造情報として出力する（ステップＳ２３）。
【００４９】
ここでは、図７に示したパイプライン演算器の構造に対して、図９に示すような構造情報が出力される。図９の例では、構造情報は、入力データおよび遅延数の組で表される。例えば、入力ａは、ステージ１で入力される。入力ａの遅延数は、最も前段のステージであるステージ１との差であるので、１−１＝０となる。入力ｂの遅延数は、入力ａと同様に０となる。入力ｃは、ステージ３で入力される。したがって、入力ｃの遅延数は、３−１＝２である。また、入力ｄは、ステージ５で入力される。したがって、入力ｄの遅延数は、５−１＝４である。
【００５０】
以上で、具体例でのステップＳ２〜Ｓ３の動作の詳細な説明を終了する。
【００５１】
次に、ステップＳ４において、プログラムコード片生成部１３は、パイプライン演算器の構造情報を参照することにより、遅延数に応じた各入力データを組にして連続領域に配置する記述と、連続領域を用いてオフロード対象処理を呼び出す処理とを記述する。
【００５２】
具体例におけるステップＳ４でのプログラムコード片生成部１３の動作の詳細を図１０に示す。
【００５３】
図１０では、プログラムコード片生成部１３は、オフロード対象処理の呼び出し文における各引数について、以下のステップＳ３１〜Ｓ３２の処理を実行する。ここでは、各引数を、ａｒｇｊ（ｊ＝０〜Ｍ、Ｍは０以上の整数）とする。この例では、ａｒｇ０が「Ａ＋ｉ」、ａｒｇ１が「Ｂ＋ｉ」、ａｒｇ２が「Ｃ＋ｉ」、ａｒｇ３が「Ｄ＋ｉ」にそれぞれ相当する。なお、この例では、Ｍ＝３である。
【００５４】
ここでは、まず、プログラムコード片生成部１３は、構造情報を参照することにより、ａｒｇｊに対応する遅延数ｄｊを検索する（ステップＳ３１）。
【００５５】
例えば、図９を参照すると、ａｒｇ０に対応する遅延数ｄ０としては、０が検索される。
【００５６】
次に、プログラムコード片生成部１３は、連続領域に、遅延数に応じた引数を配置する記述として、「ｐａｃｋ［ｊ］＝＊（ａｒｇｊ＋Ｚ−ｄｊ）；」という文を生成する（ステップＳ３２）。
【００５７】
ここで、Ｚは、パイプライン演算器の入力から出力までの遅延数を表す。図７を参照すると、この具体例では、Ｚ＝６である。例えば、ａｒｇ０に対応するコード片は「ｐａｃｋ［０］＝＊（Ａ＋ｉ＋６）；」となる。そして、プログラムコード片生成部１３は、この引数について生成した記述を、プログラムコード片とする。もし、それまでに他の引数について生成されたプログラムコード片があれば、プログラムコード片生成部１３は、この引数について生成した記述を、それまでのプログラムコード片に追加する。
【００５８】
全ての引数についてステップＳ３１〜Ｓ３２が完了すると、図１１に示すように、遅延数に応じた引数の組を、連続領域に配置するプログラムコード片９０１が生成される。
【００５９】
次に、プログラムコード片生成部１３は、連続領域を表す「ｐａｃｋ」を用いてオフロード対象処理を呼び出す記述を生成する（ステップＳ３３）。これにより、図１１に示すように、オフロード対象処理の呼び出し文となるプログラムコード片９０２が出力される。
【００６０】
次に、プログラムコード片生成部１３は、遅延数に応じた引数の組を連続領域に配置してオフロード対象処理を呼び出す処理のプロローグおよびエピローグとなるプログラムコード片を生成する（ステップＳ３４）。
【００６１】
ここで、プロローグおよびエピローグとなるプログラムコード片について説明する。そのために、まず、図７に示したパイプライン演算器に対して、同時に供給する引数の組合せについて説明する。同時に供給する引数の組合せは、各引数の遅延数を考慮すると、図１２に示す通りとなる。図１２では、各行が、同時に供給する引数の組合せを表す。また、図１２において、「出力」の列は、各行の組合せの引数が入力されたサイクルでパイプライン演算器から出力される情報を表す。このとき、パイプライン演算器に最初に入力を行ってからＺサイクル目までの期間８０１は、引数の一部が不要またはパイプライン演算器からの出力がないため、上述のプログラムコード片９０１および９０２を適用できない。また、パイプライン演算器から最後の出力があるまでのＺサイクルの期間８０３は、引数の一部または全部が不要であるため、上述のプログラムコード片９０１および９０２を適用できない。つまり、上述のプログラムコード片９０１および９０２を適用可能である期間は、Ｚ＋１サイクル目からＮサイクル目までの期間８０２となる。そこで、プログラムコード片生成部１３は、図１３に示すように、期間８０１について、プロローグとなるプログラムコード片９０３を生成する。また、プログラムコード片生成部１３は、期間８０３について、エピローグとなるプログラムコード片９０４を生成する。なお、プログラムコード片生成部１３は、必要に応じて連続領域を宣言する記述を、プログラムコード片に付加しておく。図１１、図１３の例では、プロローグとなるプログラムコード片９０３の先頭に、連続領域ｐａｃｋの宣言文が付加されている。
【００６２】
以上で、具体例でのステップＳ４の動作の詳細な説明を終了する。
【００６３】
次に、ステップＳ５において、プログラム書換部１４は、オフロード非対象プログラムにおけるオフロード対象処理の呼び出し箇所に、上述のプログラムコード片９０１〜９０４を埋め込んで出力する。出力プログラムは、図１４に示す通りとなる。この具体例では、プログラム書換部１４は、図４に示したオフロード対象プログラムにおける呼び出し文「Ｒ［ｉ］＝ｆｕｎｃＡ（Ａ＋ｉ，Ｂ＋ｉ，Ｃ＋ｉ，Ｄ＋ｉ）」の直前に、図１１に示したプログラムコード片９０１を挿入している。また、プログラム書換部１４は、図４に示したオフロード対象プログラムにおける呼び出し文「Ｒ［ｉ］＝ｆｕｎｃＡ（Ａ＋ｉ，Ｂ＋ｉ，Ｃ＋ｉ，Ｄ＋ｉ）」を、図１１に示したプログラムコード片９０２に置換している。また、プログラムコード片９０１および９０２の繰り返し処理の繰り返し回数を、Ｎ−Ｚ回に変更している。そして、プログラム書換部１４は、プログラムコード片９０１および９０２の繰り返し処理の前後に、プログラムコード片９０３および９０４をそれぞれ挿入している。なお、図１４では、プログラムコード片９０３および９０４の詳細を省略している。
【００６４】
このようにして、この具体例では、プログラム書換装置１は、図４の入力プログラムに対して、図８のＲＴＬ記述と、図１４の出力プログラムとを出力する。
【００６５】
以上で、具体例の説明を終了する。
【００６６】
次に、本発明の実施の形態の効果について述べる。
【００６７】
本実施の形態としてのプログラム書換装置は、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、アクセラレータに対して効率的にデータを供給するようプログラムを書き換えることができる。
【００６８】
その理由について説明する。本実施の形態では、プログラム解析部が、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させるプログラムにおいて、オフロード対象処理を特定する。そして、高位合成部が、オフロード対象処理をアクセラレータ上に実装する演算装置の設計内容を表す設計内容情報を生成する。また、高位合成部が、生成した設計内容情報に基づいて、演算装置の構造を表す構造情報を生成する。そして、プログラムコード片生成部が、演算装置の構造情報に基づいて、プログラムコード片を生成する。プログラムコード片には、演算装置に対して同時に供給する入力データの組をメモリ上の連続領域に配置する処理の記述と、連続領域を用いてオフロード対象処理を呼び出す処理の記述とが含まれる。そして、プログラム書換部が、プログラムにおけるオフロード対象処理の呼び出し箇所に、プログラムコード片を埋め込むからである。
【００６９】
これにより、本実施の形態を用いて書き換えたプログラムを、プロセッサおよびアクセラレータを含むコンピュータシステムに実行させると、非連続な領域に配置されていた異なる組の入力データを、アクセラレータに対して同時刻に効率よく供給することができる。
【００７０】
ここで、本実施の形態により書き換えられたプログラムが、元のプログラムと比較して、アクセラレータによる入力データの読み込み速度を短縮する効果について、具体例を用いて説明する。
【００７１】
例えば、プログラム中のオフロード非対象処理において、オフロード対象処理を呼び出す際に、非連続な領域に配置された４個の４バイトデータを引数として渡すことを考えるここでは、オフロード対象処理は、パイプライン演算器として実装されているものとする。
【００７２】
まず、プロセッサと、アクセラレータ上のパイプライン演算器との速度差を考える。プロセッサが３ＧＨｚで動作し、アクセラレータ上のパイプライン演算器が１００ＭＨｚで動作すると、速度差は約３０倍である。また、プロセッサは、１サイクルに１個の４バイトデータをロードできるものとする。また、アクセラレータは、１サイクルに１個の４バイトデータをロードできるものとする。
【００７３】
書換前の元のプログラムは、同時刻に必要となる異なる組の４個の入力データを連続領域に配置しないでアクセラレータに供給する。この場合、プロセッサからアクセラレータへのアドレス送付は、４サイクル（１サイクル×４個）を必要とする。また、送付されたアドレスが非連続であるため、それぞれのアドレスに対応するデータのアクセラレータによるロードは、４サイクル（１サイクル×４個）を必要とする。ここで、アクセラレータの４サイクルは、プロセッサとの速度差３０倍を勘案すると、プロセッサのサイクル換算では１２０サイクルに相当する。すなわち、この場合、異なる組の４個の入力データの読み込みは、プロセッサのサイクル換算で、合計４＋１２０＝１２４サイクルを必要とする。
【００７４】
一方、本実施の形態により書き換えられたプログラムは、同時刻に必要となる異なる組の４個の入力データを連続領域に配置してからアクセラレータに供給する。この場合、プロセッサによる入力データの収集は、４サイクル（１サイクル×４個）を必要とする。次に、収集した入力データの連続領域への書込みは、４サイクル（１サイクル×４個）を必要とする。そして、プロセッサからアクセラレータへのアドレス送付は、１サイクル（１サイクル×１個）を必要とする。また、送付されたアドレスの示す連続領域に４個のデータが配置されているため、そのアドレスに対応するデータのアクセラレータによるロードは、１サイクル（１サイクル×１個）で完了する。ここで、アクセラレータの１サイクルは、プロセッサとの速度差３０倍を勘案すると、プロセッサのサイクル換算で３０サイクルに相当する。すなわち、本実施の形態では、異なる組の４個の入力データの読み込みは、プロセッサのサイクル換算で、合計４＋４＋１＋３０＝３９サイクルを必要とする。
【００７５】
このように、本実施の形態により書き換えられたプログラムは、元のプログラムと比較して、１２４÷３９＝約３．２倍高速に、アクセラレータに入力データを読み込ませることができる。
【００７６】
なお、本発明の実施の形態において、アクセラレータとしては、例えば、ＦＰＧＡ（field-programmable gate array）や、ＧＰＵ（Graphics Processing Unit）が適用可能であるが、これらに限らない。
【００７７】
また、本発明の実施の形態において、オフロードされる処理がアクセラレータ上にパイプライン演算器として実装される例について説明したが、オフロードされる処理を実装する演算装置は、パイプライン演算器に限らない。
【００７８】
また、本発明の実施の形態において、高位合成部によって生成される設計内容情報が、ＶｅｒｉｌｏｇのＲＴＬ記述である例を中心に説明したが、これに限らない。設計内容情報は、その他のハードウェア記述言語で記述されていてもよい。
【００７９】
また、本発明の実施の形態において、プログラム書換装置の各機能ブロックが、記憶装置またはＲＯＭに記憶されたコンピュータ・プログラムを実行するＣＰＵによって実現される例を中心に説明した。これに限らず、各機能ブロックの一部、全部、または、それらの組み合わせが専用のハードウェアにより実現されていてもよい。
【００８０】
また、上述した本発明の各実施の形態において、プログラム書換装置の機能ブロックは、複数の装置に分散されて実現されてもよい。
【００８１】
また、本発明の実施の形態において、各フローチャートを参照して説明したプログラム書換装置の動作を、本発明のコンピュータ・プログラムとしてコンピュータ装置の記憶装置（記憶媒体）に格納しておいてもよい。そして、係るコンピュータ・プログラムを当該ＣＰＵが読み出して実行するようにしてもよい。そして、このような場合において、本発明は、係るコンピュータ・プログラムのコードあるいは記憶媒体によって構成される。
【００８２】
以上、上述した実施形態を模範的な例として本発明を説明した。しかしながら、本発明は、上述した実施形態には限定されない。即ち、本発明は、本発明のスコープ内において、当業者が理解し得る様々な態様を適用することができる。
【００８３】
この出願は、２０１５年９月３０日に出願された日本出願特願２０１５−１９３１０６を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【符号の説明】
【００８４】
１    プログラム書換装置
１１    プログラム解析部
１２    高位合成部
１３    プログラムコード片生成部
１４    プログラム書換部
１００１    ＣＰＵ
１００２    メモリ
【図１】
2017056427.tif 000003
【図２】
2017056427.tif 000004
【図３】
2017056427.tif 000005
【図４】
2017056427.tif 000006
【図５】
2017056427.tif 000007
【図６】
2017056427.tif 000008
【図７】
2017056427.tif 000009
【図８】
2017056427.tif 000010
【図９】
2017056427.tif 000011
【図１０】
2017056427.tif 000012
【図１１】
2017056427.tif 000013
【図１２】
2017056427.tif 000014
【図１３】
2017056427.tif 000015
【図１４】
2017056427.tif 000016
【国際調査報告】
2017056427.tif 000017
2017056427.tif 000018
2017056427.tif 000019
2017056427.tif 000020