(57)【要約】【課題】  実際のデータ転送レートの変更、ホストプロセッサのキャッシュの振る舞いを考慮し、アクセラレータへオフロードするか否かを判断できるソフトウェア変換プログラムを提供する。【解決手段】  入力ソフトウェア７０２を解析して求めた、ループ中の算術演算回数をループ中にアクセスするデータのサイズで除した計算密度と、データを参照する領域を合計したデータ参照領域サイズと、予め用意された前記ホストプロセッサ１０１と前記アクセラレータプロセッサ１０４との実行時間の優劣が定められている勝敗表とに基づいて、各ループを実行させるプロセッサを決定する。この決定に基づくプロセッサで各ループが実行されるように入力ソフトウェア７０２を変換させる。【選択図】        図７
2011204209.tif 000002
【特許請求の範囲】
【請求項１】
ホストプロセッサと一以上のアクセラレータプロセッサとを備える計算機システムに実行させるためのソフトウェア変換プログラムであって、
入力ソフトウェアを解析させ、ループ中の算術演算回数をループ中にアクセスするデータのサイズで除した計算密度と、データを参照する領域を合計したデータ参照領域サイズとを求めさせる手段と、
求められた各値と、予め用意された前記ホストプロセッサと前記アクセラレータプロセッサとの実行時間の優劣が定められている勝敗表とに基づいて、各ループを実行させるプロセッサを決定させる手段と、
該決定された各プロセッサで各ループが実行されるように入力ソフトウェアを変換させる手段とを備えたことを特徴とする、コンピュータに実行させるためのソフトウェア変換プログラム。
【請求項２】
更に、該ホストプロセッサのメインメモリとアクセラレータメモリとの間のデータ転送レートを示すデータ転送レートを求めさせる手段を備えたことを特徴とする、請求項１に記載のソフトウェア変換プログラム。
【請求項３】
更に、テストプログラムのループ処理で参照されるデータの重なり度合いを示すデータ参照領域重なり率を求めさせる手段を備えたことを特徴とする請求項２に記載のソフトウェア変換プログラム。
【請求項４】
前記勝敗表は、予め定めた複数の前記計算密度と前記データ参照領域サイズと前記データ転送レートと前記データ参照重なり率とをそれぞれ組み合わせた際に、前記マイクロプロセッサ及び前記アクセラレータプロセッサに、テストプログラムを実行させて得た実行時間の優劣をそれぞれ判断し、優劣の結果に従って作成されたものであることを特徴とする請求項１乃至３の何れかに記載のソフトウェア変換プログラム。
【請求項５】
ホストプロセッサと、
一以上のアクセラレータプロセッサと、
入力ソフトウェアを解析し、ループ中の算術演算回数をループ中にアクセスするデータのサイズで除した計算密度を求める第１取得手段と、
データを参照する領域を合計したデータ参照領域サイズを求める第２取得手段と、
第１取得手段と第２取得手段とで求められた各値と、予め用意された前記ホストプロセッサと前記アクセラレータプロセッサとの実行時間の優劣が定められている勝敗表とに基づいて、前記入力プロセッサ内の各ループを実行させるプロセッサを決定する決定手段と、
該決定手段で決定された各プロセッサで各ループが実行されるように入力ソフトウェアを変換する変換手段とを備えたことを特徴とする、
計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機で実行するためのソフトウェアを高速に処理するために変換するソフトウェア変換プログラムに関する。
【背景技術】
【０００２】
近年の計算機システムでは、ホストプロセッサから、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）をグラフィックス処理のみならず汎用計算に利用するＧＰＧＰＵ（Ｇｅｎｅｒａｌ  Ｐｕｒｐｏｓｅ  ＧＰＵ）やＣＥＬＬプロセッサやＤＳＰなどのアクセラレータへ、実行するソフトウェア中の高い演算処理能力を要する演算処理を、移行して実行（以下、オフロードと称す）することで、プログラム全体の実行時間を小さくする技術が注目されている。
【０００３】
例えば、非特許文献１に明示されるＣ言語コンパイラを利用すれば、入力されるソフトウェア内に含まれるループ処理をアクセラレータへオフロードすることができる。
【０００４】
アクセラレータへ演算処理をオフロードするためには、演算処理に必要なデータを事前にアクセラレータのデバイスメモリへデータ転送する必要がある。
【０００５】
従って、アクセラレータへ演算処理をオフロードしたほうが良いか否かを、ソフトウェア作成者がソフトウェア作成時に判断し、オフロードする場合にはその旨をソフトウェアへ予め含めておくことが必要である。一般に、ソフトウェア作成者は、「ループ中の算術演算回数」を、「ループ中にアクセスするデータのサイズで除した値（＝「演算密度」）」を元に、アクセラレータへ演算処理をオフロードするか否かを判断していた。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】「ＰＧＩ  Ｆｏｒｔｒａｎ  ＆  Ｃ  Ａｃｃｅｌｅｒａｔｏｒ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｍｏｄｅｌ  ｖ１．０，  Ｔｈｅ  Ｐｏｒｔｌａｎｄ  Ｇｒｏｕｐ，  Ｊｕｎｅ  ２００９」
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、計算機システムでソフトウェアを実行すると、データ転送サイズの変更による実際のデータ転送レートの変化や、ホストプロセッサのキャッシュの振る舞いの影響などが発生するが、これを考慮しソフトウェア作成者がソフトウェアを作成することは難しく、或いは考慮して作成したとしても、実際に演算速度の向上に繋がるか不透明であった。
【０００８】
本発明は上記に鑑みてなされたものであって、実際のデータ転送レートの変更、ホストプロセッサのキャッシュの振る舞いを考慮し、アクセラレータへオフロードするか否かを判断できるソフトウェア変換プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
上述した課題を解決し、目的を達成するために、本発明は、ホストプロセッサと一以上のアクセラレータプロセッサとを備える計算機システムに実行させるためのソフトウェア変換プログラムであって、入力ソフトウェアを解析させ、ループ中の算術演算回数をループ中にアクセスするデータのサイズで除した計算密度と、データを参照する領域を合計したデータ参照領域サイズとを求めさせる手段と、求められた各値と、予め用意された前記ホストプロセッサと前記アクセラレータプロセッサとの実行時間の優劣が定められている勝敗表とに基づいて、各ループを実行させるプロセッサを決定させる手段と、該決定された各プロセッサで各ループが実行されるように入力ソフトウェアを変換させる手段とを備えたことを特徴とする。
【００１０】
また、本発明の計算機システムは、ホストプロセッサと、一以上のアクセラレータプロセッサと、入力ソフトウェアを解析し、ループ中の算術演算回数をループ中にアクセスするデータのサイズで除した計算密度を求める第１取得手段と、データを参照する領域を合計したデータ参照領域サイズを求める第２取得手段と、第１取得手段と第２取得手段とで求められた各値と、予め用意された前記ホストプロセッサと前記アクセラレータプロセッサとの実行時間の優劣が定められている勝敗表とに基づいて、前記入力プロセッサ内の各ループを実行させるプロセッサを決定する決定手段と、該決定手段で決定された各プロセッサで各ループが実行されるように入力ソフトウェアを変換する変換手段とを備えたことを特徴とする。
【発明の効果】
【００１１】
本発明によれば、転送サイズの変化による実際のデータ転送レートの変化や、ホストプロセッサのキャッシュの振る舞いの影響まで考慮することで、より正確にオフロード判定をすることが可能になる。
【図面の簡単な説明】
【００１２】
【図１】本実施の形態が適用される計算機システムを例示する図。
【図２】本実施の形態の全体を示すフローチャート。
【図３】生成されるデータ転送時間表の一例を示す図。
【図４】勝敗表生成プログラム１１２の実行動作フローチャート。
【図５】テストプログラム１１３の一例。
【図６】＜データ参照領域重なり率パラメタ，  データ参照領域サイズパラメタ＞  ＝  ＜５０％，６０００＞の組で特定される勝敗表６０１の例。
【図７】ソフトウェア変換プログラム１１４の構成を示す図。
【図８】入力ソフトウェアの例。
【図９】データ参照領域情報７０９の例。
【図１０】データ転送領域情報の例。
【図１１】データ参照領域サイズパラメタを求めるフローチャート。
【図１２】まとめられたデータ参照領域情報とデータ参照領域サイズパラメタの一例。
【図１３】データ参照領域重なり率パラメタを求めるフローを示す。
【図１４】データ転送レートパラメタを求めるフロー。
【図１５】勝敗表を補間した勝敗表１５０１を示す図。
【図１６】生成される出力ソフトウェア１６０１の一例。
【発明を実施するための形態】
【００１３】
以下に添付図面を参照して、本発明の一実施の形態について詳細に説明する。
【００１４】
図１は、本実施の形態が適用される計算機システムを示している。計算機システムは、ホストプロセッサ１０１、キャッシュ１０２、メインメモリ１０３、アクセラレータプロセッサ１０４、アクセラレータメモリ１０５、データ転送装置１０６とを備え、データ転送装置１０６とメインメモリ１０３は、バス１０７を介し接続される。本実施の形態では、アクセラレータプロセッサ１０４、アクセラレータメモリ１０５、データ転送装置１０６を一組だけ備えているが、二組以上あっても良い。また、計算機システムは、特に図示しないが、ＨＤＤまたは不揮発性メモリで構成される半導体記憶装置等の二次記憶装置を備えており、更に、キーボードやマウス等の入力装置、表示装置等を備えていても良いことは勿論である。
【００１５】
本計算システムに、データ転送測定プログラム１１１、勝敗表生成プログラム１１２、ソフトウェア変換プログラム１１４がインストールされた後、実行されることにより、本実施の形態が実現される。
【００１６】
本実施の形態の全体のフローを図２に示しつつ、各プログラムについて説明する。
【００１７】
計算機システム上でデータ転送測定プログラム１１１を実行すると、データサイズの異なる複数のデータのそれぞれを、メインメモリ１０３からアクセラレータメモリ１０５へ転送させ、各データの転送時間を測定し、各データのデータサイズと測定した転送時間とを対とし記録することによって、データ転送時間表を生成する（ステップ２０１）。生成されるデータ転送時間表の一例を図３に示す。データ転送時間表３０１の各エントリ３０２は、転送サイズと転送時間の組で構成される。なお、測定するデータのデータサイズは離散値で良く、実際に知りたいデータサイズがデータ転送時間表３０１に無い場合には、線形補間などを行い、補間値を用いればよい。なお、データ転送測定プログラム２０１の実行は、例えば、データ転送測定プログラム１１１が計算機システムにインストールされた際に行われる。
【００１８】
次に、計算機システム上で勝負表生成プログラム１１２を実行すると、ホストプロセッサ１０１とアクセラレータプロセッサ１０４の双方でテストプログラム１１３を実行させた場合にどちらのプロセッサ１０１／１０４での実行が速いかを測定し、測定結果を示した勝敗表を生成する（ステップ２０２）。もし、アクセラレータプロセッサ１０４が複数ある場合には、アクセラレータプロセッサ１０４の個数だけ同様に実行し、該個数分の勝敗表を生成する。勝敗表生成プログラム１１２の実行動作の詳細は、後述する。なお、勝敗表生成プログラム１１２の実行は、（前述のデータ転送時間表の生成後で、且つ）例えば、勝敗表生成プログラム１１２を計算機システムにインストールする時に行われる。 
次に、計算機システム上でソフトウェア変換プログラム１１４を実行すると、ユーザが計算機システムで実行しようとする入力ソフトウェアに含まれるループ処理をアクセラレータプロセッサ１０４へオフロードするか否かを、前記勝敗表を参照して判定し、オフロードすると判定した場合に、入力ソフトウェアの変換処理を行う（ステップ２０３）。ソフトウェア変換プログラム１１４の実行動作の詳細は、後述する。
【００１９】
以上のようなフローにより、データ転送レートやホストプロセッサのキャッシュの振る舞いの影響など計算機システムの実際の動作に基づいた勝敗表を利用するから、より正確なオフロード判定が可能となる。
【００２０】
次に、勝敗表生成プログラム１１２の実行動作について、以下に詳細に説明する。勝敗表生成プログラム１１２は、オフロード判定に用いる勝敗表を設定するために、「計算密度パラメタ」、「データ参照領域サイズパラメタ」、「データ参照領域重なり率パラメタ」、「データ転送レートパラメタ」の４つのパラメタの組み合わせを変更しつつ、テストプログラム１１３を実行することによって勝敗表を生成するものである。各パラメタの詳細について後述する。
【００２１】
図４は、勝敗表生成プログラム１１２の実行動作フローを示している。
【００２２】
まず、勝敗表生成プログラム１１２は、各パラメタの組み合わせを全通り生成する（ステップ４０１）。例えば、４つのパラメタが、「計算密度パラメタ：  １，３，５の３通り」、「データ参照領域パラメタ：６００，６０００の２通り」、「データ転送レートパラメタ：１．０，１．８，４．７の３通り」、「重なり率パラメタ：０，５０の２通り」の場合、組み合わせの数（全通り）は、３ｘ２ｘ３ｘ２＝３６通りとなる。なお、各パラメタの全通りの組み合わせを事前に求めて、勝敗表生成プログラム１１２内に、予め記録しておいても良い。
【００２３】
次に、勝敗表生成プログラム１１２は、全てのパラメタの組み合わせでテストプログラム１１３を実行したか否かを確認する  （ステップ４０２）。このステップの結果がＹｅｓ（Ｙ）の場合、本実行動作の処理は終了し、勝敗表の生成が完了する。
【００２４】
一方、Ｎｏ（Ｎ）の場合、即ち、全ての組み合わせの処理が完了していない場合には、勝敗表生成プログラム１１２は、ホストプロセッサ１０１とアクセラレータプロセッサ１０４の双方で、未だ実行していない組み合わせから一組取り出して、その組の各パラメタでテストプログラム１１３を実行し、それぞれの実行時間を測定する（ステップ４０３）。
【００２５】
勝敗表生成プログラム１１２は、ステップ４０３で測定された両実行時間のうち、短かった方を勝者として勝敗表の対応するエントリに記録する（ステップ４０４）。そして、ステップ４０２へ戻る。
【００２６】
図５に、テストプログラム１１３の一例を示す。このテストプログラム５０１は、Ｃ言語で書かれているが、他のプログラミング言語であっても良い。
【００２７】
テストプログラムは、多重ループ５０４を含み、多重ループ５０４内では、配列変数ＩＮ、ＯＵＴを参照している。
【００２８】
データ転送指示文箇所５０２は、ホストプロセッサ１０１で実行されるテストプログラムには書かれておらず、アクセラレータプロセッサ１０４で実行されるテストプログラムに書かれているものである。このデータ転送指示文箇所５０２は、アクセラレータプロセッサ１０４で実行するためにアクセラレータメモリ１０５へデータを転送するためのデータ転送指示文である。データ転送指示文は、例えば、＃ｐｒａｇｍａ  ｔｒａｎｓｆｅｒ（）  と表し、引数にデータ転送する範囲を指定する。この範囲ごとにデータ転送が行われる。データ転送指示文で指定する配列の範囲は、部分配列の形で指定する。例えば、配列変数名［１次元目の開始インデックス番号：１次元目の終了インデックス番号］［２次元目の開始インデックス番号：２次元目の終了インデックス番号］で表す。図中のデータ転送範囲ＩＮ［０：２＊Ｎ−１］［０：Ｍ−１］は、ＩＮ［０］［０］からＩＮ［２＊Ｎ−１］［Ｍ−１］までを表すとする。
【００２９】
テスト内容箇所５０３には、テスト内容文が挿入される。
【００３０】
次に、上述の４つのパラメタについて、以下に説明する。
【００３１】
「計算密度パラメタ」は、「ループ中の算術演算回数」を「ループ中にアクセスするデータのサイズ」で除した結果値である。「計算密度パラメタ」は、テスト内容文箇所５０２に挿入するテスト内容文を変更することで、変更される。例えば、まず、テスト内容文が図５中の
ＯＵＴ［ｉ］［ｊ］＝（ＩＮ［ｉ＊２］［ｊ］＊ＩＮ［ｉ＊２］［ｊ］）＊（ＩＮ［ｉ＊２＋１］［ｊ］＊ＩＮ［ｉ＊２＋１］［ｊ］）；
の場合、配列変数ＩＮの２要素を各々１回ずつ乗算した結果同士を乗算しその結果を配列変数ＯＵＴの対応する要素へ代入するので、多重ループの算術演算回数＝３、ループでアクセスするデータサイズ＝３要素なので、計算密度＝３／３＝１となる。また、配列変数ＩＮの２変数の各々の乗算を４回ずつ、７回ずつ行うようにテスト内容文を変更すると、多重ループの算術演算回数は９回、１５回と変更される。その結果、計算密度をそれぞれ３（＝９／３）、５（＝１５／３）となる。
【００３２】
「データ参照領域サイズパラメタ」は、プログラムを実行するためのデータを参照する領域の合計のサイズを示す値である。「データ参照領域サイズパラメタ」は、２次元配列を表す変数ＩＮとＯＵＴの１次元目の長さであるＮを変更することで、変更させる。Ｎ＝４の場合、データ参照領域サイズは、配列ＯＵＴ分の２００（＝Ｎ＊Ｍ）と配列ＩＮ分の４００（＝ＯＵＴ分の倍）  の合計で、６００となる。例えば、Ｎ＝４０と変更することで、データ参照領域サイズは、配列ＯＵＴ分の２０００（＝Ｎ＊Ｍ）と配列ＩＮ分（＝ＯＵＴ分の倍）の４０００の合計で、６０００と変更させることができる。
【００３３】
「データ転送レートパラメタ」は、メインメモリからアクセラレータメモリへのデータ転送レートを示す値である。「データ転送レートパラメタ」は、データ転送指示文箇所５０２に挿入するデータ転送指示文を変更することで、変更させる。図５中の
＃ｐｒａｇｍａ  ｔｒａｎｓｆｅｒ（ＩＮ［０：２＊Ｎ−１］［０：Ｍ−１］）、＃ｐｒａｇｍａ  ｔｒａｎｓｆｅｒ（ＯＵＴ［０：Ｎ−１］［０：Ｍ−１］）
では、配列ＩＮ全体と配列ＯＵＴ全体が、それぞれ転送される。配列ＩＮ全体は転送サイズ＝２Ｎ＊Ｍ＝４００、配列ＯＵＴ全体は転送サイズ＝Ｎ＊Ｍ＝２００となり、転送サイズｓでの転送時間をｔ（ｓ）と表記すると、転送時間の合計はｔ（４００）＋ｔ（２００）  となる。平均データ転送レートは、（配列ＩＮ全体の転送サイズ  ＋  配列ＯＵＴ全体の転送サイズ）／ｔ（４００）＋ｔ（２００）で求めることができる。データ転送時間表３０１より、ｔ（４００）＝６９、ｔ（２００）＝５９と線形補間で求めることができるので、平均データ転送レートは４．７と計算できる。例えば、データ転送指示文を、
＃ｐｒａｇｍａ  ｔｒａｎｓｆｅｒ（ＯＵＴ［０：０］［０：Ｍ−１］，ＯＵＴ［１：１］［０：Ｍ−１］，  ＯＵＴ［２：２］［０：Ｍ−１］，ＯＵＴ［３：３］［０：Ｍ−１］）
と４分割して書くと、各行が個別に転送されるとする。配列ＩＮと配列ＯＵＴの両方で、転送サイズ＝５０となり、平均データ転送レートは（配列ＩＮ全体サイズ＋配列ＯＵＴ全体サイズ）／ｔ（５０）＊１２となる。データ転送時間表３０１よりｔ（５０）＝５２と計算できるから、データ転送レートは１．０と計算できる。同様に、２分割して書くと、個々のデータ転送サイズ＝１００となり、ｔ（１００）＝５５と計算できるから、データ転送レートは（配列ＩＮ全体サイズ＋配列ＯＵＴ全体サイズ）／ｔ（１００）＊６＝１．８と計算できる。
【００３４】
「データ参照領域重なり率パラメタ」は、テストプログラムのループ処理で参照されるデータの重なり度合いを示す値である。「データ参照領域重なり率パラメタ」は、テスト内容文箇所５０５に挿入するテスト内容文を変更することで、変更させる。例えば、テスト内容文箇所５０５に挿入されているテスト内容文では、変数ｉが更新される度に、配列の違う行を参照するので重なりは０％である。このテスト内容文を
ＯＵＴ［ｉ］［ｊ］＝（ＩＮ［ｉ］［ｊ］＊ＩＮ［ｉ］［ｊ］）＊（ＩＮ［ｉ＋２］［ｊ］＊ＩＮ［ｉ＋２］［ｊ］）；
に変更する。この場合、ｉ＝ｋのときのＩＮ［ｉ＋２］［ｊ］とｉ＝ｋ＋１のときのＩＮ［ｉ］［ｊ］が重なる（行が重なる）ので、毎回５０％の重なりがあるように変更させることができる。
【００３５】
勝敗表６０１は、アクセラレータ毎に［データ参照領域重なり率パラメタのサンプル数×データ参照領域サイズパラメタのサンプル数］個用意する。例えば、前者のサンプルが０％と５０％の２つ、後者のサンプルが６００、６０００の２つの場合、合計４つの勝敗表を生成する。なお、ここでは、データ参照領域重なりパラメタとデータ参照領域サイズパラメタとの組み合わせごとに勝敗表を生成しているが、４つのパラメータの別の２つのパラメタの組み合わせごとに勝敗表を生成しても良い。
【００３６】
図６に、＜データ参照領域重なり率パラメタ，  データ参照領域サイズパラメタ＞  ＝  ＜５０％，６０００＞の組で特定される勝敗表６０１の例を示す。
【００３７】
勝敗表６０１は、第１軸が「データ転送レート」、第２軸が「計算密度」となっている。表の各エントリには、○か×を格納する。○はアクセラレータでの実行時間がホストプロセッサでの実行時間より小さくなった場合（オフロードした方が速くなった）に格納する。×は逆にホストプロセッサの実行時間が小さくなった場合に格納する（オフロードするとかえって遅くなった）。勝敗表を参照する際に、測定値がない値の場合は、簡単な補間を行いその補間値を用いればよい。
【００３８】
次に、ソフトウェア変換プログラム１１４の実行動作について、以下に詳細に説明する。
【００３９】
図７は、ソフトウェア変換プログラム１１４の構成を示している。
【００４０】
ソフトウェア変換プログラム１１４は、ユーザがこれから計算機システムで実行する入力ソフトウェア７０２を解析し、解析結果に基づいて、必要に応じて入力ソフトウェア７０２を変換して出力ソフトウェア７０３を生成し出力するものである。 
データ参照領域解析部７０４は、入力ソフトウェア７０２を解析し、入力ソフトウェア７０２が参照するデータの領域のそれぞれを抽出し、データ参照領域情報７０９を生成する。
【００４１】
入力ソフトウェアの例を図８に示す。この入力ソフトウェア８０１は、多重ループ８０２を含み、多重ループ８０２内では、配列変数ＡおよびＢを参照するものである。なお、入力ソフトウェアは、Ｃ言語で書かれているが、他のプログラミング言語であっても良い。
【００４２】
データ参照領域情報７０９の例を図９に示す。データ参照領域情報９０１、９０２の各データ参照領域９０３には、データ参照領域の先頭アドレスと末尾アドレスが記録される。データ参照領域情報９０１は、入力ソフトウェアの配列変数Ａの先頭アドレスが１００００番地の場合、データ参照領域情報９０２は、配列変数Ｂの先頭アドレスが２００００番地である場合の例を示している。
【００４３】
次に、データ転送領域解析部７０５は、生成されたデータ参照領域情報７０９に基づいて、データ参照領域毎にデータ転送を行う方式（Ａ方式）、所定ルールによって近接するデータ参照領域同士をまとめてデータ転送を行う方式（Ｂ方式）、及び、所定ルールによって全てのデータ参照領域をまとめてデータ転送を行う方式（Ｃ方式）、のそれぞれの方式について、事前に生成しておいた図３のデータ転送時間表３０１を用いてデータ転送時間を求め、最小のデータ転送時間値となる方式を選択し、その方式でデータ転送する領域を示すデータ転送領域情報７１０を生成する。
【００４４】
例えば、入力ソフトウェア７０１の配列Ｂについては、該Ａ方式での転送時間は「４＊ｔ（９９８）＝４＊９５．８＝３８３」となり、該Ｂ方式および該Ｃ方式での転送時間は「ｔ（３９９８）＝２３０」となる。よって、該Ｂ方式または該Ｃ方式を採用した方が転送時間を小さくできることが分かる。この結果得られるデータ転送領域情報の例を図１０に示す。
【００４５】
なお、データ転送領域解析部７０５で行われる処理の詳細は、文献［城田祐介ら，情報処理学会研究報告．  ハイパフォーマンスコンピューティング，２００６（８７），ｐｐ．２９３−２９８］で示される。
【００４６】
次に、パラメタ解析部７０６は、データ参照領域情報７０９からデータ参照領域サイズパラメタを求め、入力プログラムから計算密度パラメタを求め、データ参照領域情報７０９からデータ参照領域重なり率パラメタを求め、データ転送領域情報７１０からデータ転送レートパラメタを求め、パラメタ情報７１１を生成する。
【００４７】
図１１に、データ参照領域サイズパラメタを求めるフローを示す。
【００４８】
始めに、データ参照領域を先頭アドレスの昇順でソートする（ステップ１１０１）。
【００４９】
次に、データ参照領域情報に含まれる全てのデータ参照領域を処理したか確認する（ステップ１１０２）。
【００５０】
この結果、処理が完了していない場合には、処理対象のデータ参照領域と一つ前のデータ参照領域の２つのデータ参照領域間に重なりの有無を確認する（ステップ１１０３）。
【００５１】
この結果、重なりがある場合には、２つのデータ参照領域を融合し、融合したデータ参照領域の先頭アドレスには、一つ前のデータ参照領域の先頭アドレスを、末尾アドレスには処理対象のデータ参照領域の末尾アドレスを設定する（ステップ１１０４）。一方、重なりが無い場合には、Ｓ１１０２へ戻る。
【００５２】
Ｓ１１０２において、データ参照領域情報に含まれる全てのデータ参照領域を処理が完了したと確認した場合には、まとめられたデータ参照領域のサイズの総和を求める（ステップ１１０５）。以上によって、データ参照領域サイズパラメタを求める。
【００５３】
図１２には、まとめられたデータ参照領域情報とデータ参照領域サイズパラメタの一例を示す。この場合、データ参照領域サイズパラメタ＝６０００＋９９８＊４＝９９９２となっている。
【００５４】
次に、計算密度パラメタの求め方について説明する。計算密度パラメタは、対象の多重ループの算術演算回数／ループでアクセスするデータサイズで求める。対象の多重ループでは、算術演算回数はイタレーション回数が（Ｎ−２）＊（Ｍ−２）回、各イタレーションで８回の算術演算を行うので多重ループ全体では、
（Ｎ−２）＊（Ｍ−２）＊８＝４＊９９８＊８＝３１９３６回となる。一方、ループでアクセスするのは、上記で計算したデータ参照領域サイズパラメタなので、３１９３６／９９９２＝３．２と容易に求めることができる。
【００５５】
次に、図１３に、データ参照領域重なり率パラメタを求めるフローを示す。
【００５６】
始めに、重なり総サイズとデータ参照領域のデータ参照総サイズを０に初期化する（ステップ１３０１）。次に、データ参照領域情報に含まれる全てのデータ参照領域を処理したか確認する（ステップ１３０２）。
【００５７】
ステップ１３０２において、処理が完了していない場合には、処理対象のデータ参照領域と一つ前のデータ参照領域との２つのデータ参照領域間の重なりサイズを計算する（ステップ１３０３）。
【００５８】
計算された重なりサイズを該重なり総サイズに加算し、また、データ参照領域のサイズをデータ参照総サイズに加算する（ステップ１３０４）。
【００５９】
ステップ１３０２に戻り、処理が完了した場合には、重なり率を、重なりサイズ総和／データ参照領域サイズ総和で計算し、データ参照領域重なり率パラメタとする（ステップ１３０５）。
【００６０】
この例では、計算した結果、データ参照領域重なり率パラメタ＝６７％となる。
【００６１】
次に、図１４に、データ転送レートパラメタを求めるフローを示す。
【００６２】
始めに、データ総転送時間を０に初期化する（ステップ１４０１）。次に、データ参照領域情報に含まれる全てのデータ転送領域を処理したか確認する（ステップ１４０２）。
【００６３】
ステップ１４０２において、処理が完了していない場合には、処理対象のデータ転送領域の転送時間を求める（ステップ１４０３）。そして、データ総転送時間に、求められたデータ転送時間を加算する（ステップ１４０４）。
【００６４】
ステップ１４０２に戻り、処理が完了した場合にはデータ転送レートを計算し、データ転送レートパラメタとする（ステップ１４０５）。
【００６５】
このフローに従うと、データ転送レートパラメタは、  （（１５９９９−１００００＋１）＋（２４９９８−２１００１＋１））／（ｔ（６０００）＋ｔ（３９９８））と計算できる。ｔ（６０００）＝３２６、ｔ（３９９８）＝２３４と計算できるから、データ転送レートパラメタ＝１７．９と計算できる。    
以上のようにして、パラメタ解析部７０６は、データ参照領域サイズパラメタ、計算密度パラメタ、データ参照領域重なり率パラメタ、及びデータ転送レートパラメタを求め、パラメタ情報７１１を生成する。
【００６６】
図７に戻り、オフロード判定部７０７は、パラメタ情報７１１に基づいて予め生成・記憶した勝敗表を選定し、アクセラレータ１０４へオフロードすべきか否かを判定する。
【００６７】
オフロード判定部７０７は、パラメタ情報７１１のデータ参照領域重なりパラメタとデータ参照領域サイズパラメタから、簡単な補間により、最も近い勝敗表を選択する。本例においては、＜データ参照領域重なりパラメタ，データ参照領域サイズパラメタ＞  ＝  ＜６７％，９９９２＞  なので、簡単な補間により、４つの表から一番近い  ＜５０％，６０００＞の組で特定される勝敗表６０１を選択する。
【００６８】
次に、オフロード判定部７０７は、選択した勝敗表を補間して、勝敗表を作成する。本例では、勝敗表を補間して、図１５のような勝敗表１５０１を作成する。
【００６９】
オフロード判定部７０７は、（補間した）勝敗表に、パラメタ情報７１１の計算密度パラメタとデータ転送レートとを照らし、オフロードするか否かを判定する。本例では、補間した勝敗表１５０１より、計算密度＝３．２、データ転送レート＝１７．９なので、○と判定、つまり、オフロードすべきと判定される。なお、この例では、データ参照領域重なりパラメタとデータ参照領域サイズパラメタとの組み合わせごとに、勝敗表を記憶しているから、データ参照領域重なりパラメタとデータ参照領域サイズパラメタとの組みで勝敗表を特定しているが、４つのパラメタから別の２つのパラメタ毎に勝敗表を記憶している場合には、その別の２つのパラメタで勝敗表を特定すればよい。
【００７０】
図７に戻り、ソフトウェア変換部７０８は、オフロード判定部７０７からオフロードすべきと判定を受けると、入力ソフトウェア７０２へ、予め用意したオフロード指示文と、データ転送指示文とを挿入する、ソフトウェア変換を行って、出力ソフトウェア７０９を出力する。図１６に、その結果、生成される出力ソフトウェア１６０１の一例を示す。なお、本例では、ソフトウェア変換は、コンパイラ指示文の挿入という形で行ったが、その限りではない。
【００７１】
上記で説明した本実施の形態のソフトウェア変換プログラムは、計算密度、データ参照領域サイズ、データ転送レート、データ参照領域重なり率の４つのパラメタを用いてソフトウェアの変換の要否を判定したが、（性能は劣るが）計算密度、データ参照領域サイズの２つのパラメータを用いてソフトウェアの変換の要否を判定してもよく、これにデータ転送レートを加えた計３つのパラメータを用いてソフトウェアの変換の要否を判定してもよい。
【００７２】
以上詳細に説明した本実施の形態によれば、実際のデータ転送レートの変更、ホストプロセッサのキャッシュの振る舞いを考慮し、アクセラレータへオフロードするか否かを判断できるようになった。
【符号の説明】
【００７３】
１０１・・・ホストプロセッサ、１０２・・・キャッシュ、
１０３・・・メインメモリ、１０４・・・アクセラレータプロセッサ、
１０５・・・アクセラレータメモリ、１０６・・・データ転送装置、
１０７・・・バス
１１１・・・データ転送測定プログラム、１１２・・・勝敗表生成プログラム
１１３・・・テストプログラム、１１４・・・ソフトウェア変換プログラム
７０４・・・データ参照領域解析部、７０５・・・データ転送領域解析部
７０６・・・パラメータ解析部、７０７・・・オフロード判定部、
７０８・・・ソフトウェア変換部
【図１】
2011204209.tif 000003
【図２】
2011204209.tif 000004
【図３】
2011204209.tif 000005
【図４】
2011204209.tif 000006
【図５】
2011204209.tif 000007
【図６】
2011204209.tif 000008
【図７】
2011204209.tif 000009
【図８】
2011204209.tif 000010
【図９】
2011204209.tif 000011
【図１０】
2011204209.tif 000012
【図１１】
2011204209.tif 000013
【図１２】
2011204209.tif 000014
【図１３】
2011204209.tif 000015
【図１４】
2011204209.tif 000016
【図１５】
2011204209.tif 000017
【図１６】
2011204209.tif 000018