(57)【要約】  コンパイラ装置１０は、ノードとエッジの集合を含むデータフローグラフと、各エッジに流れるデータが取り得る値の範囲を示す情報とを入力する入力部と、第１ノードの種類と、前記第１ノードと接続する第１エッジに流れるデータが取り得る値の範囲を示す情報とに基づいて、種類の異なる複数のハードウェア資源のうち、前記第１ノードを割り当て可能なハードウェア資源を判定する判定部とを備える。コンパイラ装置１０によれば、データの精度を失うことなしに、ハードウェア資源の効率的な利用ができる。
2011096016.tif 000002
【特許請求の範囲】
【請求項１】
ノードとエッジの集合を含むデータフローグラフと、各エッジに流れるデータが取り得る値の範囲を示す情報とを入力する入力部と、
第１ノードの種類と、前記第１ノードと接続する第１エッジに流れるデータが取り得る値の範囲を示す情報とに基づいて、種類の異なる複数のハードウェア資源のうち、前記第１ノードを割り当て可能なハードウェア資源を判定する判定部とを備える
コンパイラ装置。
【請求項２】
前記判定部は、各ハードウェア資源が実行可能なプロセスの種類と、前記各ハードウェア資源が処理可能なデータの値の範囲とを記憶する記憶部を備え、
前記判定部は、前記第１ノードに対応するプロセスの種類を処理可能であって、かつ、処理可能なデータ範囲が前記第１エッジに流れるデータが取り得る値の範囲を包含するハードウェア資源を、前記第１ノードに割り当て可能なハードウェア資源と判定することを特徴とする
請求項１記載のコンパイラ装置。
【請求項３】
前記判定部によって、前記第１ノードに割り当て可能と判定されたハードウェア資源のうち、ノード間の依存関係とハードウェア資源間のデータの受け渡しにかかる時間とを用いて、前記第１ノードを割り当てるハードウェア資源を決定し、前記第１ノードを割り当てる割当部とを備えることを特徴とする
請求項２記載のコンパイラ装置。
【請求項４】
前記エッジに流れるデータが取り得る値の範囲と前記ハードウェア資源の処理可能なデータの範囲とは、ビット幅で表現されることを特徴とする
請求項１記載のコンパイラ装置。
【請求項５】
ソースプログラムを入力するソースプログラム入力部と、
前記ソースプログラムをノードとエッジの集合を含むデータフローグラフで解析する第１解析部と、
前記エッジに流れるデータが取り得る値の範囲を解析する第２解析部と、
第１ノードの種類と、前記第１ノードと接続する第１エッジに流れるデータが取り得る値の範囲を示す情報とに基づいて、前記第１ノードに割り当て可能なハードウェア資源を判定する判定部と、
前記第１ノードを割り当て可能なハードウェア資源を、前記第１ノードに割り当てる割当部とを備えることを特徴とする
コンパイラ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイルの分野に関し、特に演算マッピングに関する。
【背景技術】
【０００２】
コンパイルは、人間がプログラミング言語を用いて作成したソースコードを計算機上で実行可能な形式（オブジェクトコード）に変換する技術である。【０００３】
計算機の処理の効率化を達成する技術として特許文献１の技術がある。特許文献１の技術では、オブジェクトコードの表現を最適化することにより計算機の処理の効率化を図っている。この技術は、演算を演算結果が桁あふれしない範囲で演算精度の最も小さな命令に一意に割り当てを行い、メモリ利用効率を最適化するものである。この技術の背景には、Java（登録商標）のようなスタックマシンを利用したとき、演算の精度と演算の利用するスタックサイズ（利用メモリ量）が比例関係にあるという事実が存在する。しかしながら、異なる特徴を持つハードウェア資源が複数存在していると、演算精度の小さなハードウェア資源に割り当てることが計算機の処理の効率化に結び付くとは限らない等の問題があった。【０００４】
計算機の処理の効率化を達成する技術として非特許文献１の技術がある。非特許文献１の技術では、オブジェクトコードの表現を最適化することにより計算機の処理の効率化を図っている。この技術は、ある演算群をSIMD（Single Instruction Multiple Data）命令で実現する時、演算結果の精度を許容できる範囲で演算精度の小さなSIMD命令にまとめることにより、演算の実行効率を最適化するものである。この技術の背景には、演算精度の小さなSIMD命令の方が同時に演算可能な演算数が多いという事実が存在する。しかしながら、異なる特徴を持つハードウェア資源が複数存在していると、命令数を削減することが計算機の処理の効率化に結び付くとは限らない等の問題があった。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】国際公開  ＷＯ０１／０３５２０１号公報
【非特許文献】
【０００６】
【非特許文献１】Aart J.C. Bik. The Software Vectorization Handbook, Chapter 5, Intel Press, 2004.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明のコンパイラ装置によれば、データの精度を失うことなしに、ハードウェア資源の効率的な利用をすることを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一観点のコンパイラ装置は、ノードとエッジの集合を含むデータフローグラフと、各エッジに流れるデータが取り得る値の範囲を示す情報とを入力する入力部と、第１ノードの種類と、前記第１ノードと接続する第１エッジに流れるデータが取り得る値の範囲を示す情報とに基づいて、種類の異なる複数のハードウェア資源のうち、前記第１ノードを割り当て可能なハードウェア資源を判定する判定部とを備える。
【発明の効果】
【０００９】
本発明によれば、データの精度を失うことなしに、ハードウェア資源の効率的な利用ができる。
【図面の簡単な説明】
【００１０】
【図１】実施形態に係るコンパイラシステムの構成例を示す図。
【図２】実施形態に係るコンパイラ装置の概略構成を機能部品で示した図。
【図３】コンパイラ装置の動作を示すフローチャート。
【図４】判定部の動作を示すフローチャート。
【図５】ソースプログラムの一例を示す図。
【図６】データフローグラフの一例を示す図。
【図７】データフローグラフとデータフローグラフの一部のエッジのデータ範囲を示す図。
【図８】データ依存解析部が出力する情報の例を示す図。
【図９】データフローグラフとデータフローグラフの全てのエッジのデータ範囲を示す図。
【図１０】データ範囲解析部が出力する情報の例を示す図。
【図１１】ハードウェア資源の例を示す図。
【図１２】第１記憶部が記憶するハードウェア資源と演算の種類とデータ範囲の対応表。
【図１３】判定部が出力する情報を示す図。
【図１４】第２記憶部が記憶するハードウェア資源管理情報の例を示す図。
【図１５】割当部が出力する情報を示す図。
【図１６】判定部に入力される情報の一例を示す図。
【図１７】第１記憶部が記憶するハードウェア資源と演算の種類とビット幅の対応表。
【図１８】実施形態に係る判定装置を示す図。
【図１９】実施形態に係る割当装置を示す図。
【発明を実施するための形態】
【００１１】
以下、本発明の実施形態について、図面を参照して説明する。
【００１２】
図１は、実施形態に係るコンパイラシステムの構成例を示す図である。コンパイラシステムは、コンパイラ装置１０と入力装置１５と出力装置１７とを備える。コンパイラ装置１０は、ソースプログラムのコンパイルを行い、オブジェクトコードを生成、出力する。入力装置１５は、情報を入力できる装置であって、例えば、マウスやキーボードである。出力装置１７は、例えばモニタである。ハードウェア資源１６は、コンパイラ装置１０がソースプログラムをコンパイルして出力するオブジェクトコードを実行する装置である。コンパイラ装置１０と入力装置１５とハードウェア資源１６と出力装置１７とは、一体の装置であってもよく、それぞれ別個の装置でなくともよい。
【００１３】
コンパイラ装置１０は、演算処理装置（CPU１１）と、主メモリ（RAM１２）と、読み出し専用メモリとを具備している。演算処理装置（CPU１１）、主メモリ（RAM１２）、及び読み出し専用メモリ（ROM１３）はバス１４を介して互いにデータの受け渡しが可能に接続されている。ROM１３に、演算処理装置（CPU１１）をコンパイラ装置１０として機能させるためのプログラムが記憶されており、このプログラムを主メモリ（RAM１２）上に載せ、CPU１１がこれを実行することによりコンパイラ装置１０が実現される。
【００１４】
次に、以上のように構成されたコンパイラ装置１０の機能構成を説明する。図２は、コンパイラ装置１０の概略構成を機能ブロックで示したものである。コンパイラ装置１０は、ソースプログラム入力部１０１、データ依存解析部１０２、データ範囲解析部１０３、判定部１０４、割当部１０５を備える。
【００１５】
コンパイラ装置１０の動作の概略を説明する。図３は、コンパイラ装置１０の動作を示すフローチャートである。
【００１６】
コンパイラ装置１０は、まず、ソースプログラム入力部１０１にソースプログラムを入力する（S１０１）。次に、データ依存解析部１０２が、ソースプログラムからデータフローグラフを生成する（S１０２）。データフローグラフは、ノードとノード間を接続するエッジを要素として含むグラフである。次に、データ範囲解析部１０３が、エッジに流れるデータのデータ範囲を解析して求める（S１０３）。次に、判定部１０４が、ノードの種類とハードウェア資源が処理可能なプロセスの種類との比較結果、および、そのノードに接続されたエッジに流れるデータが取り得る範囲とハードウェア資源の処理可能なデータ範囲との比較結果とを用いて、ノードに対応付け（割り当て）可能なハードウェア資源を判定する（S１０４）。各ノードに対応付け可能なハードウェア資源は複数あっても良い。次に、割当部１０５が、判定部１０４がノードに対応付け可能と判定したハードウェア資源から少なくとも１つのハードウェア資源をノードに対して割り当てる（S１０５）。
【００１７】
以下の説明では、コンパイラ装置１０の各機能部品を図２の順番で直列に接続した最も基本的な実施の形態での各機能ブロックの説明を行っていく。しかしながら、実施の形態はこれに限られない。例えば、複数の機能ブロックが協調しながら動作を行う構成、一部の機能ブロックの順番を入れ替える構成、ある機能ブロックを複数の機能ブロックに分割する構成、前記3つの形態を組み合わせる構成等で実施することもできる。また、機能ブロックを複数のモジュールに分割して実施することもできる。
【００１８】
ソースプログラム入力部１０１は、ソースプログラムをコンパイラ装置１０に入力する。図５にソースプログラムの例を示す。図５のソースプログラムはvalue “ａ”、“ｂ”、“ｃ”、“ｄ”が“ｄ＝ａ＋ｂ−ｃ”の関係にあることを示す。また、ソースプログラムの「＃ｐｒａｇｍａ  ｖａｌｕｅ＿ｂｏｕｎｄ（ａ，“[−１０、１０]”）」は、ａの取り得るデータ範囲が[−１０、１０]であることを示す。また、「＃ｐｒａｇｍａ  ｖａｌｕｅ＿ｂｏｕｎｄ（ｂ，“[５、１０]”）」は、ｂの取り得るデータ範囲が[５、１０]であることを示す。また、また、「＃ｐｒａｇｍａ  ｖａｌｕｅ＿ｂｏｕｎｄ（ｃ，“[−５、１０]”）」は、ｃの取り得るデータ範囲が[−５、１０]であることを示す。
【００１９】
ソースプログラムは、例えば、C言語やJava（登録商標）のようなプログラミング言語である。コンパイラ装置独自のプログラミング言語であってもよい。ソースプログラムは、単に演算や依存関係をデータとして並べたデータ構造であってもよい。また、ソースプログラムは、人が見て構造を容易に理解できるテキストファイルである必要はなく、バイナリファイルであってもよい。また、ソースプログラムは、1つのファイルに全ての情報が入っている必要はなく、情報が分割されて複数のファイルになっているものであっても良い。
【００２０】
ソースプログラム入力部１０１の入力の方法は、例えば、一般に広く行われているファイルシステムからの方法を用いる。また、ネットワークを介して既にメモリに読み込んだものを入力する方法であってもよい。また、そのほかの方法としては、例えば、コンパイラ装置１０にソースプログラムを組み込んでおく方法、GUI（Graphical User Interface）を利用してインタラクティブに入力させる方法、装置の外部にある様々なセンサを利用してインタラクティブに入力させる方法などがある。
【００２１】
データ依存解析部１０２は、ソースプログラムを解析してデータフローグラフを生成する。ノード（節点、頂点）の集合とエッジ（枝、辺）の集合で構成されるグラフを生成し、ノードがどのようにエッジで結ばれているかを明らかにする。データフローグラフの一例を図６に示す。
【００２２】
データ依存解析部１０２は、ソースプログラムを解析することにより、データフローグラフと合わせてエッジのデータ範囲を出力する。図７に、データ依存解析部が出力するデータフローグラフとエッジのデータ範囲を含む情報を示す。また、図８に、図７と等価の情報を表にして示す。
【００２３】
以下では、データ依存解析部１０２が、図５のソースプログラムを解析して図７のデータフローグラフとエッジのデータ範囲を合わせた情報を出力する方法を説明する。
【００２４】
データ依存解析部１０２が、図５のソースプログラムから図６のデータフローグラフを生成する例を説明する。ここで、図５のソースプログラムの演算“+”と演算”−”の優先順位が等しく左結合であり、かつ演算“=”の優先順位は他の演算子（演算“＋”と演算”−”）よりも低いとする。この場合、図５のソースプログラムから図６のデータフローグラフを生成することができる。図６のデータフローグラフは、まず、ノード“a”の値とノード“b”の値をノード“＋”で加算する。また、ノード“＋”の加算の結果からノード“c”の値をノード“−”で減算する。次に、その結果を“d”に代入する。
【００２５】
図６のデータフローグラフは、複数のノード（ノード“ａ”、ノード“ｂ”、ノード“＋”、ノード“ｃ”、ノード”−”、ノード“ｄ”）と複数のエッジ（エッジ“ａ”→“＋”、エッジ“ｂ”→“＋”、エッジ“＋”→“−”、エッジ“ｃ”→“−”、エッジ“−”→“ｄ”）を含む情報である。ここで、エッジ“a”→“＋”とは、ノード“a”とノード“＋”との間を接続するエッジであるとして説明する。
【００２６】
次に、データ依存解析部１０２が、図７のエッジのデータ範囲を出力する方法を説明する。前述したように、ソースプログラムは、ａの取り得るデータ範囲が［−１０、１０］であることを示している。また、ｂの取り得るデータ範囲が［５、１０］であることを示している。また、ｃの取り得るデータ範囲が［−５、１０］であることを示している。したがって、データ依存解析部１０２は、データフローグラフと合わせて、エッジ“ａ”→“＋”に流れるデータのデータ範囲［−１０、１０］と、エッジ“ｂ”→“＋”に流れるデータのデータ範囲［５、１０］と、エッジ“ｃ”→“−”に流れるデータのデータ範囲[−５、１０]とを出力する。ここで、例えば[−１０、１０]とは、−１０から１０の範囲を取り得るということを表している。逆にその範囲外の値となることはないことを示している。
【００２７】
以上より、データ依存解析部１０２が、図５のソースプログラムから図７のデータフローグラフとエッジのデータ範囲を合わせた情報を出力する方法を説明した。
【００２８】
なお、本実施例では、ノードを演算“＋”、“−”とする例を説明した。また、エッジを演算間の依存関係として説明した。しかしながら、データフローグラフは、他の情報を保持してもよい。
【００２９】
データ依存解析部１０２が解析する部分は、ソースプログラム全体でなくてもよい。例えば、データ依存解析部１０２は、指定された関数の中だけを解析してもよい。また、データ依存解析部１０２が解析する部分を自動で選択してもよい。データ依存解析部１０２は、指定されたコードの部分だけを解析してもよい。これらの方法を組み合わせてもよい。
【００３０】
データ範囲解析部１０３は、データ依存解析部１０２が生成したデータフローグラフの各エッジに流れるデータが取り得る値の範囲を解析して出力する。データ範囲解析部１０３は、入力部によって入力された各エッジに流れるデータの取り得る値の範囲を示す情報を用いて、各エッジに流れるデータが取り得る値の範囲を出力しても良い。
【００３１】
各エッジに流れるデータの取り得る値の範囲を示す情報は、各エッジに流れるデータの取り得る値の範囲を示すことができればどのような情報であってもよく、たとえば、エッジに流れうるデータの値の範囲や、エッジに流れうるデータを表現するビットの幅であっても良い。データ範囲解析部１０３は、データ依存解析部１０２からエッジに流れるデータのデータ範囲が入力された場合、入力されたエッジ以外のエッジに流れるデータのデータ範囲を求めても良い。
【００３２】
以下では、データ依存解析部１０２が、図７に示すデータフローグラフとエッジのデータ範囲を含む情報を出力した場合に、データ範囲解析部１０３が、その情報を解析することにより、全てのエッジのデータ範囲を求める例を説明する。図９は、データ範囲解析部１０３が解析を行った結果出力する、データフローグラフと全てのエッジのデータ範囲とを合わせた情報である。図１０は、図９の情報と等価な情報を表で表した。図８と図１０を比較すると、データ範囲解析部１０３は、図８の情報に加えて、エッジ“＋”→“−”のデータ範囲と、エッジ“−”→“ｄ”のデータ範囲を出力することがわかる。
【００３３】
以下では、図７の情報から図９の情報を出力するために行ったデータ範囲解析部１０３の解析方法について説明する。
【００３４】
図７の情報から、エッジ“＋”→“−”に流れるデータのデータ範囲は、［−１０、１０］と［５、１０］を足したときの小値−１０＋５＝−５、最大値１０＋１０＝２０となる。また、エッジ“−”→“ｄ”に流れるデータのデータ範囲は、［−５、２０］から［−５、１０］を引いたときの最小値−５−１０＝−１５、最大値２０−（−５）＝２５となる。したがって、図９及び図１０に示すように、エッジ“＋”→“−”がデータ範囲［−５、２０］であり、エッジ“−”→“ｄ”がデータ範囲［−１５、２５］であることを求めることができる。
【００３５】
なお、この例では、エッジのデータ範囲が割当てられていない部分のみを解析したが、既にエッジのデータ範囲が割当てられている部分を解析してもよい。
【００３６】
例えば、図７のデータフローグラフにおいて、すでにエッジ“−”→“d”のデータ範囲を[-100, 200]として割り当てられていたとする。この場合、データ範囲解析部１０３が、解析によりエッジ“−”→“d”を求めることにより、エッジのデータ範囲は［−１５、２５］で十分であることが分かる。一方、図７のデータフローグラフにおいて、すでにエッジ“−”→“d”のデータ範囲が［−１、５］として与えられていたとする。この場合、データ範囲解析部１０３が、解析により［−１５、２０］と求めることにより、与えられていたエッジのデータ範囲が解析により求めたエッジのデータ範囲より小さいことがわかり、割り当てられていたデータ範囲と解析により求めたデータ範囲とが矛盾することがわかる。
【００３７】
割り当てられていたエッジのデータ範囲が解析の結果求めたエッジのデータ範囲より大きなデータ範囲である場合、解析の結果求めたエッジのデータ範囲で更新するかしないかを指定できるとしても良い。
【００３８】
割り当てられていたエッジのデータ範囲が解析の結果求めたエッジのデータ範囲より小さな範囲の値が割り当てられていたときは、例えば、割り当てられていたエッジのデータ範囲から解析の結果求めたエッジのデータ範囲へと更新を行わなくても良い。また、結果が矛盾することをユーザに警告を発してもよい。また、割り当てられていたエッジのデータ範囲から解析結果のエッジのデータ範囲に更新するとしても良い。割り当てられていたエッジのデータ範囲と求めたデータ範囲とが矛盾する場合に備えて、エッジのデータ範囲に優先順位をつけてもよい。
【００３９】
また、エッジのデータ範囲を割り当てられていたデータ範囲から解析結果のデータ範囲に更新をできるか否かオプションで指定できるようにしてもよい。
【００４０】
また、データ範囲解析部に入力されたデータフローグラフのエッジのデータ範囲が全て予め指定されている場合、データ範囲解析部は全く解析を行わなくても良いし、エッジのデータ範囲の更新や矛盾発見を期待して解析を行っても良い。
【００４１】
以上の例では、データフローグラフの上から下に向かってエッジのデータ範囲を解析したが、任意の順序で解析してもよい。
【００４２】
エッジのデータ範囲は、図９のように全てエッジについて解析できる必要はなく、解析できないエッジや解析しないエッジがあってもよい。エッジのデータ範囲を解析できないときや解析しないときは、コンパイラ装置利用者に対して警告を発してもよい。単に解析できないということを伝えるだけではなく、データフローグラフのどのエッジがどのような原因で解析できないという詳細な情報を示してもよい。エッジのデータ範囲を解析できないとき、データフローグラフのどこかの入力で解析できない原因を取り除いてもよいし、解析しないまま先に進めてもよい。以降の処理において、解析できなかったエッジをどのように処理するかは、後述する。
【００４３】
エッジのデータ範囲は、エッジのデータ範囲になりうる情報であれば、図５のようにエッジに直接対応していなくても良い。例えば、各ノードにノードの入出力のデータ範囲を結びつけることは、エッジにエッジのデータ範囲を結び付けていることと等価である。
【００４４】
エッジの解析を行うためには解析の起点となるエッジのデータ範囲を持った1つ以上のエッジを必要とする。図７の例では，図５のプラグマで指定されたデータを起点としている。すなわち、図５のプラグマでは、ノードa、ノードｂ、ノードｃそれぞれのデータ範囲をそれぞれ[−１０、１０]、[５、１０]、[−５、１０]と指定している。尚、起点の情報は、ソースプログラムに埋め込んでも良いし、ソースプログラムとは別に入力しても良い。
【００４５】
また、起点となるエッジのデータ範囲は、データ範囲解析部１０３が自動的に決定しても良い。
【００４６】
エッジのデータ範囲をソースプログラムに埋め込む方法としては、16bit整数型や32bit整数型などの変数の型を利用した方法、変数の命名規則にデータ範囲の記述方法を含める方法、エッジのデータ範囲を直接的に記述できる記述方法を利用する方法、プラグマとしてエッジのデータ範囲を記述しておいて解析する方法、既存の記述方法の上にエッジのデータ範囲を記述してプリプロセス時に処理する方法、バイナリファイル中にエッジのデータ範囲を記録しておく方法などがある。
【００４７】
エッジのデータ範囲をソースプログラムとは別に入力する方法としては、エッジのデータ範囲を別のファイルに記述しておいて入力する方法、GUI（Graphical User Interface）を通してユーザにエッジのデータ範囲をインタラクティブに指定させる方法などがある。
【００４８】
データ範囲解析部１０３が自動的に決定する方法としては、メモリからの入力部は全て16bitであるとハードウェア資源の特徴から決めておく方法、ある演算を行ったときはエッジのデータ範囲が限定されると推定する方法、複数の演算の依存関係を見て決める方法などがある。
【００４９】
判定部１０４は、データ範囲解析部１０３から入力された情報（データフローグラフとエッジを流れるデータの取り得る範囲）を受け取り、その情報からデータフローグラフの要素（ノード、又はエッジ）を対応付け可能なハードウェア資源を判定する。判定部１０４は、図２に示すように第１記憶部１０４Aを備える。第１記憶部１０４Aは、図１２に示すように、コンパイラ装置１０が生成するオブジェクトコードを実行させるハードウェア資源と当該ハードウェア資源の演算の種類と当該演算の演算可能なデータ範囲を記憶する。図１１に、コンパイラ装置１０が生成するオブジェクトコードを実行させるハードウェア資源群の例を示す。判定部１０４は、ハードウェア資源群のハードウェア資源のうち、データフローグラフのノードの演算の種類と一致し、かつノードに入力されるエッジのデータ範囲とノードから出力されるエッジのデータ範囲を全て含むデータ範囲を処理可能なハードウェア資源をノードと対応付け可能なハードウェア資源と判定する。判定部１０４は、データフローグラフの各要素に対応付け可能なハードウェア資源を全て対応付け可能と判定する。したがって、データフローグラフの各要素に対して対応付けるハードウェア資源は１つである必要はない。
【００５０】
どの要素について対応付けの判定を行うか否かは、ハードウェア資源の性質やコンパイラ装置１０への要求によって異なる。例えば、演算器はヘテロジニアスでデータパスはホモジニアスであるならば、データパスの判定は行わずに演算器の判定のみを行うということもできる。
【００５１】
データフローグラフの要素をハードウェア資源に対応付けられるかどうかの判定は、ハードウェア資源が、各データフローグラフの要素を正しく実行できるかによって判断される。各データフローグラフの要素を正しく実行できるためには、例えば、目的の演算を実現できること、データの精度を失うことなく演算することが条件となる。目的の演算を実現できることは、例えば、ノードが“＋”（足し算を行う演算子）であるときは、ハードウェア資源は加算器を含む演算器に割当てる必要があることである。
【００５２】
また、データの精度を失うことなく演算することとは、例えば、ハードウェア資源の演算の演算可能なデータ範囲が、ノードに入力されるエッジのデータのデータ範囲と、ノードが出力するエッジのデータ範囲すべてのデータ範囲を含むデータ範囲であることが必要である。例えば、図９の演算ノード“+”に対応する加算器がデータの精度を失わないための条件は、演算ノード“＋”に入力されるエッジ“ａ”→“＋”のデータ範囲［−１０、１０］とエッジ“ｂ”→“＋”のデータ範囲［５、１０］のデータを入力することができて、かつこの入力に対する演算を行った結果の出力であるエッジ“＋”→“−”のデータ範囲［−５、２０］を出力とすることができる加算器である必要がある。すなわち、加算器は、データ範囲［−１０、２０］が演算可能である必要がある。また、データの精度を失うことなく演算することができる演算器とは、例えば、ノードが３２ｂｉｔでの足し算を行う必要があればそれ以上の精度（３２ｂｉｔより高いｂｉｔ数）をもつ演算器であっても良い。
【００５３】
ここで、データの精度を失うとは、結果が数学的に正しくないという意味ではなく、求められた精度に収まればよい。例えば、０．００５/１００が０になってしまっていても、小数点第三位まで正しければよいという性質であるならば、この結果は正しい精度で演算を行えているということである。
【００５４】
エッジをデータパスに割当てる際には、エッジに流れるデータのデータ範囲をデータパスで流せることが必要である。
【００５５】
図９と図１０と図１１と図１２とを利用して判定部１０４の動作を説明する。
【００５６】
図１１のハードウェア資源群は、加算器と減算器がまとまった演算器群ＡからＤを含む。また、このハードウェア資源群は、４つの演算器群とLoad/Store演算器が相互接続されている。Load/Store演算器からのデータパスと演算器群間のデータパスは、演算器群内の演算器のどちらにも接続されているとする。演算器群Ａは、演算の種類が“＋”（加算）でありかつ処理可能なデータ範囲が［−１０５、１０５］であるハードウェア資源Ａ１と、演算の種類が”−”（減算）でありかつ処理可能なデータ範囲が［−１０５、１０５］であるハードウェア資源Ａ２とを備える。演算器群Ｂは、演算の種類が“＋”（加算）でありかつ処理可能なデータ範囲が［−１００、１００］であるハードウェア資源Ｂ１と、演算の種類が”−”（減算）でありかつ処理可能なデータ範囲が［−１、２］であるハードウェア資源Ｂ２とを備える。演算器群Ｃは、演算の種類が“＋”（加算）でありかつ処理可能なデータ範囲が［−１、２］であるハードウェア資源Ｃ１と、演算の種類が”−”（減算）でありかつ処理可能なデータ範囲が［−１、２］であるハードウェア資源Ｃ２とを備える。演算器群Ｄは、演算の種類が“＋”（加算）でありかつ処理可能なデータ範囲が［−１、２］であるハードウェア資源Ｄ１と、演算の種類が”−”（減算）でありかつ処理可能なデータ範囲が［−１００、１００］であるハードウェア資源Ｄ２とを備える。また、Load/Store演算器はハードウェア資源Ｅである。ハードウェア資源Ｅのデータ範囲は、［−１２８、１２７］である。
【００５７】
尚、本実施形態では各データパスは、どのようなサイズのデータも通すことができることとする。すなわち、本実施形態では、各エッジに流れるデータのデータ範囲からデータパスを選ぶ必要がない。なお、データパスに通すことができるデータサイズに制限がある場合、判定部１０４は、エッジのデータ範囲から当該データ範囲のデータサイズを通すことができるデータパスを判定する機能を設けても良い。
【００５８】
ここで、演算器群という概念は、短い時間でデータ転送可能な演算器の集合を表現するものである。演算器群とは、ハードウェア資源として特別な機構を備えている必要は無い。たとえば、演算器群内においてハードウェア資源間のデータパスは1クロックでデータを転送できるとする。一方、演算器群間のデータパスは、例えばデータ転送に5クロック係るものとする。
【００５９】
各演算器は１クロックで演算を実行することが可能であるとする。Load/Store演算器は、メモリアクセス時間とデータ転送時間を合わせて１０クロックでデータを他のハードウェア資源へ転送できるとする。
【００６０】
図９のデータフローグラフの各要素が図１１のハードウェア資源群のうちどのハードウェア資源に対応付け可能かを判定する方法の例を示す。本実施形態では、各データパスにはどのようなデータも通すことができると仮定したため、データフローグラフのエッジのデータパスの対応付け可能か否かの判定を行う必要はない。
【００６１】
判定は、各ノードの目的の演算を実現できること、データの精度を失うことなく演算することの２つの条件を満たすか否かで判定する。本実施形態では、データの精度は、ハードウェア資源の処理可能なデータ範囲が、ノードに入力されるエッジと出力されるエッジのデータ範囲を含むか否かで判定する。例えば、図４のようなステップで判定する。すなわち、判定するノードを選択し（Ｓ１４０１）、次に、データ範囲解析部１０３から入力された図１０の情報と第１記憶部１０４Ａが記憶する図１２の情報とを比較することにより、各ハードウェア資源が、ノードの目的の演算を実現可能かを判定し（Ｓ１４０２）、次に、ハードウェア資源が、データの精度を失わない演算をすることが可能か否かを判定する（Ｓ１４０３）。
【００６２】
図９のメモリアクセスの演算ノードａ、ｂ、ｃ、ｄは、Load/Store演算器であるハードウェア資源Ｅによって演算を実現可能である。また、ノードa、b、cから出力されるエッジのデータ範囲及びノードｄに入力されるエッジのデータ範囲は、それぞれLoad/Store演算器の読み書き可能データ範囲［−１２８、１２７に含まれている。したがって、ノードa、b、c、dは、Load/Store演算器に対応付け可能であると判定される。
【００６３】
図９のノード“+”は、足し算を行う演算子である。したがって、図１２の表からハードウェア資源Ａ１、Ｂ１、Ｃ１、Ｄ１で演算を実現可能であると判定する。また、ノード“＋”に入力されるエッジは“ａ”→“＋”（データ範囲は［−１０、１０］）と“ｂ”→“＋”（データ範囲は［５、１０］）である。ノード“＋”から出力されるエッジは、“−”→“ｄ”（データ範囲は［−５、２０］）である。したがって、ハードウェア資源は、データ範囲［−１０、２０］の処理可能な演算器である必要がある。したがって、表１２から、ハードウェア資源Ａ１、Ｂ１を対応付け可能なハードウェア資源であることと判定することができる。また、同様に、図９のノード“−”に対応付け可能なハードウェア資源は、ハードウェア資源Ａ２とハードウェア資源Ｄ２であると判定する。判定部１０４が判定して出力する各ノードと各ノードそれぞれに対応する対応付け可能なハードウェア資源を含む情報を図１３に示す
なお、ノードの種類は、変数ノード、足し算には限られない。例えば、ノードの種類は、足し算と掛け算の複合、FFT（Fast Fourier Transform）、H.264デコードなど、低レベルの演算から高レベルの演算がある。データフローグラフは、低レベルの演算と高レベルの演算を1つのデータフローグラフに含んでいても良い。また、ノードの種類は、算術演算だけではなく、論理演算、メモリ操作、条件分岐、複素演算、スタック操作、データ転送、関数呼び出し、関数リターンなどでも良い。
【００６４】
ハードウェア資源も、加算器に限られない。ハードウェア資源は、例えば、乗算器、SIMD（Single Instruction Multiple Data）で複数のデータの足し算を行う演算器、SIMDで複数のデータの足し算を行う演算器の中にある各加算器、ALU（Arithmetic Logic Unit）のように複数種類の演算が可能で演算を選択可能な演算器、複数のALUが結合しているALUアレイのような演算器、FFT（Fast Fourier Transform）のような特定の演算を行う演算器、H.264デコードを行う演算器、複数のプロセッサコアが結合するマルチコア、複数のプロセッサが結合するマルチプロセッサなどがある。ハードウェア資源は、低レベルの演算器であっても高レベルの演算器であっても良い。ハードウェア資源は、1まとまりのハードウェア資源の中に低レベルの演算器から高レベルの演算器が入り混じってもよい。また、演算器だけではなく演算器間を結ぶデータパスもハードウェア資源に含まれる。
【００６５】
ハードウェア資源は、コンパイラ装置から階層的に見えていてもよい。例えば、高レベルの演算器の中に低レベルの演算器が含まれるという情報を保持して判定に利用してもよい。例えば、加算してから減算する演算器を1つの演算器としてみるとき、その演算器の中に加算器と減算器があるということを利用してもよく、10を足したいときに10加算して0減算するということを行えば同じことを実現できるため、対応付け可能と判定してもよい。このようにすることにより、対応付け可能と判定される演算器の数が増える。
【００６６】
対応付け可能性の判定は、1箇所もしくは１箇所以上のハードウェア資源に対して行う。ハードウェア資源の対応付け可能性の判定を1箇所のハードウェア資源に対して行うのであれば、判定結果は対応付け可能か否かということになる。1箇所のハードウェア資源に対して判定を行うとき、判定を行う1箇所のハードウェア資源の選択することには様々な方法が考えられる。例えば、ランダムに1箇所を選ぶ方法、メモリに近いハードウェア資源を優先的に選ぶ方法、アルゴリズムに従って選ぶ方法、既に割当てられているハードウェア資源があるならそこに近いハードウェア資源を選ぶ方法、強力な演算を行えるハードウェア資源を優先的に選ぶ方法、太いデータパスに近いハードウェア資源を選ぶ方法、各ハードウェア資源へのパスを最小化できるように論理的に中心に近いハードウェア資源を選ぶ方法、それらを組み合わせた方法などが考えられる。1箇所以上のハードウェア資源に対して行うのであれば、判定結果は対応付け可能なハードウェア資源の集合、対応付け可能なハードウェア資源の部分集合などが考えられる。
【００６７】
判定部１０４は、外部からあるデータフローグラフのノードを特定のハードウェア資源に対応付け可能もしくは不可能という情報を受け取ってもよい。例えば、外部から、あるハードウェア資源をデータフローグラフのノードの演算とは異なる処理のために利用したいとの情報を受け取った場合、判定部１０４は、データフローグラフのノード全てに対してそのハードウェア資源を対応付け可能と判定しない。判定部が外部から情報を受け取る方法は、例えば、外部のファイルから入力される方法、GUI（Graphical User Interface）からノードのプロパティとしてインタラクティブに指定される方法などがある。尚、外部からの情報は、データフローグラフの全てのノードとハードウェア資源の関係を指定するものであっても、一部のノードとハードウェア資源の関係を指定するものであっても良い。
【００６８】
尚、判定部１０４は、対応付け可能と判定できるハードウェア資源がなかったときには、コンパイラ装置１０利用者や他の装置に対して警告を行ってもよい。例えば、ハードウェア資源を割当てられないノードやエッジの情報をコンソールに表示したり、プロセス間通信を利用して通知したりしてもよい。警告を行うかどうかをオプションで指定したり、警告の情報詳細度を指定したりしてもよい。
【００６９】
判定部１０４に入力される情報として、エッジのデータ範囲を与えられていない部分がある場合、判定部１０４での対応には様々な方法が考えられる。例えば、判定部１０４は、エラーとして処理を進めない方法、ノードに対して演算を実現可能なハードウェア資源のうち最も処理可能なデータ範囲が大きいハードウェア資源を対応付け可能と判定する方法、ノードの演算を実現可能なハードウェア資源の中からランダムに対応付け可能と判定する方法、ノードの演算を実現可能なハードウェア資源の中から一定以上のデータ範囲を持つハードウェア資源を対応付け可能と判定する方法などがある。
【００７０】
割当部１０５は、データフローグラフの各要素に判定部１０４が対応付け可能と判断したハードウェア資源のうち少なくとも一つのハードウェア資源を割り当てる。割当部１０５は、ハードウェア資源管理情報を記憶する第２記憶部１０５Ａを有する。第２記憶部１０５Ａが記憶するハードウェア資源管理情報の１例を図１４に示す。図１４に示すように、第２記憶部１０５Ａは、ハードウェア資源管理情報としてハードウェア資源がどの演算器群に属するかを記憶する。
【００７１】
割当部１０５は、データフローグラフの各要素にハードウェア資源の割り当てを行う際に、データフローグラフの依存関係とハードウェア資源管理情報を基に行う。
【００７２】
データフローグラフの依存関係とは、例えば、各ノード間の依存関係である。例えば、図７において、ノード“＋”は、ノード“−”の前に処理を行う依存関係がある。また、依存関係とは、各ノードに対応付け可能なハードウェア資源に関する依存関係を含んでもよい。
【００７３】
図１３と図１４と図１５を利用して割当部１０５の動作を説明する。図１５は、割当部１０５が各ノードに対して割り当てるハードウェア資源を示す表である。
【００７４】
ノードaとbとcとdは、図１３に示すとおり、判定部１０４によって１つのLoad/Store演算器（ハードウェア資源Ｅ）に対応付け可能であると判定されている。したがって、割当部１０５は、ノードａとｂとｃとｄに対してLoad/Store演算器（ハードウェア資源Ｅ）を割当てる。
【００７５】
図１３に示すとおり、ノード“＋”は、判定部１０４によってハードウェア資源Ａ１とハードウェア資源Ｂ１に対応付け可能と判定されている。ノード“−”は、図１３に示すとおり、判定部１０４によってハードウェア資源Ａ２、Ｄ２と対応付け可能と判定されている。そして、図１４のハードウェア資源管理情報からハードウェア資源Ａ１とＡ２は同じ演算器群に属することがわかる。また、データフローグラフからわかるようにノード“＋”の処理はノード“−”の処理の前に行うという依存関係がある。
【００７６】
本実施形態では、割当部１０５は、ノードに対するハードウェア資源を割り当てる際に、処理の実行時間が早くできることを基準として割り当てる。割当部１０５は、ハードウェア資源の属する演算器群の情報と、ノードの依存関係を基に、ノードに対するハードウェア資源を割り当てる。ここで、ハードウェア資源が同じ演算器群内であればハードウェア資源間のデータパスを1クロックで移動できる。また、ハードウェア資源が異なる演算器群にある場合、ハードウェア資源間のデータパスを５クロックで移動する。
【００７７】
前述したとおり、演算に必要なクロック数は、加算器へのメモリ読み込みに１０クロックであり、加算に1クロック、減算に1クロック、減算器からのメモリの書き込みに１０クロック必要である。
【００７８】
したがって、ノード“＋”とノード“−”を同一の演算器群内にあるハードウェア資源に割り当てた場合、データフローグラフ全体を処理するためには、合計２３クロックかかる。
【００７９】
一方、ノード“＋”とノード“−”を異なる演算器群にあるハードウェア資源を割り当てた場合、例えば、ノード“＋”にハードウェア資源Ｂ１を割り当てて、ノード“−”にハードウェア資源Ｄ２を割り当てた場合、ハードウェア資源Ｂ１からハードウェア資源Ｄ２へのデータ受け渡しに５クロック必要となるため、データフローグラフ全体を処理するためには、合計２７クロックかかる。
【００８０】
割当部１０５は、ノード“＋”にはハードウェア資源Ａ１を割り当て、ノード“−”にはハードウェア資源Ａ２を割り当てる。
【００８１】
尚、本実施形態では、ハードウェア資源管理情報としてハードウェア資源の属する演算器群の情報を用いて、割当部１０５は、最も実行時間が早いハードウェア資源を割り当てた。しかしながら、ハードウェア資源管理情報は演算器群に限られない。また、ノードに対するハードウェア資源の割当も最も早くなるハードウェア資源を割り当てる場合に限られない。
【００８２】
ハードウェア資源管理情報には様々な種類の情報がある。例えば、ハードウェア資源の接続状況、アルゴリズムによって既に割当てられているノードとハードウェア資源の情報、アルゴリズムによってこれから割当てられるノードとノードに対応付け可能なハードウェア資源の情報、ハードウェア資源間のデータパスの遅延に関する情報、ハードウェア資源の実行時間に関する情報、ハードウェア資源の消費電力に関する情報、ハードウェア資源の熱分布に関する情報など、ハードウェア資源そのものの情報に加えて割当状況などの割当アルゴリズムに関する情報などを幅広く含んだ情報である。
【００８３】
割当部１０５は、ハードウェア資源の割当の指定を外部から受け取って、ノードに対するハードウェア資源の割当を行っても良い。例えば、あるノード“＋”を特定の加算器に割当てたいとき、その情報を外部から入力してもよい。入力の方法は、例えば、外部のファイルから入力する方法、GUI（Graphical User Interface）からノードのプロパティとしてインタラクティブに指定する方法がある。また、ハードウェア資源割当の外部からの指定は、ノードに対して1つのハードウェア資源への割当ての指定である必要はなく、ノードに対して複数のハードウェア資源の候補のどれかを割り当てるという指定であってもよい。また、ある演算器の下位階層にある演算器のどれかという指定でもよい。また、外部からのハードウェア資源割当の指定に強制力を持たせることもできるし、希望という指定を行うこともできる。希望という指定を行ったとき、割当部１０５は可能な限りそのハードウェア資源に割り当てようとするが、割当てられないときや求める効果を満たせないときには他のハードウェア資源に割当を行ってもよい。
【００８４】
割当部１０５は、割当てられるハードウェア資源がないときに警告を行ってもよい。例えば、データ幅[200, 300]同士の加算を行うノード“＋”を図１１のハードウェア資源に割当てることはできないという情報を示す。このとき、割当部１０５は、エラーとして処理を実行しても良いし、処理可能なデータ幅の大きいハードウェア資源に割当ててもよいし、ランダムにハードウェア資源を選択して割り当ててもよい。
【００８５】
割当部１０５は、割当てられるようなハードウェア資源をプログラマブルデバイス上に作成してもよい。例えば、加算器のような専用ハードウェア資源とFPGAのようなプログラマブルデバイスが結合しているとき、専用ハードウェア資源として存在している加算器の演算可能な範囲が不十分であるときは、FPGA上に演算可能な範囲を満たす加算器を作成してもよい。割当部１０５は、割当てられるハードウェア資源があるときにでも新しいハードウェア資源を作成してもよい。前述のハードウェア資源の例では、用意されている専用ハードウェア資源の加算器でも十分であるが、専用ハードウェア資源の加算器を他の加算のために利用したい場合や、他の演算との依存関係やハードウェア資源管理情報から前の演算に近いFPGAに割当てたい場合など、様々な理由が考えられる。プログラマブルデバイスがあるとき、判定部１０４は常にプログラマブルデバイスに対応付け可能と割当部１０５に伝達してもよいし、自由に演算器を作れるのだから明示的に割当部１０５に伝達しないという手段をとってもよい。
【００８６】
本実施形態のコンパイラ装置１０によれば、オブジェクトコードを実行するハードウェア資源が複数ある場合に、データの精度を失うことなくハードウェア資源の効率的な利用を行うことができる。
【００８７】
尚、割当部１０５が、ノードに対してハード資源の割当を行うその他の方法として、下記の方法がある。
【００８８】
コンパイラ装置１０が出力するオブジェクトコードを実行するハードウェア資源群がSIMD（Single Instruction Multiple Data）の演算器を有するハードウェア資源を含む場合を説明する。この場合、判定部１０４が、複数のノードをSIMDユニットに対応付け可能と判定した場合、割当部１０５は、それらノードを複数まとめてSIMDの演算器に割当を行う。これにより、複数のデータをまとめて処理できるため、別々に演算を行ったときよりも処理時間を短縮できる。
【００８９】
また、割当部１０５は、例えばオブジェクトサイズの削減を目的としてハードウェア資源割当を行ってもよい。例えば、ハードウェア資源Ａ１、Ａ２は、様々な演算をサポートするため、演算の指定に32bit必要であったとする。それ以外のハードウェア資源は、加算と減算のみをサポートするため、演算の指定に1bit必要であったとする。この場合、ノード“＋”にハードウェア資源Ａ１を割り当てて、ノード“−”に演算器Ａ２を割り当てた場合、合計64bitを演算の指定に利用する。一方、ノード“＋”にハードウェア資源Ｂ１を割り当てて、ノード“−”にハードウェア資源Ｄ２を割り当てた場合、合計2bitで十分である。この場合、オブジェクトサイズの削減を達成することができる。
【００９０】
また、割当部１０５は、例えば利用メモリ量の削減を目的としてハードウェア資源割り当てを行っても良い。例えば、ハードウェア資源Ａ１、Ａ２はスタックマシンであり、演算に必要なデータをメモリに格納する必要があるとする。それ以外のハードウェア資源は、レジスタを有しており、演算に必要なデータをレジスタから持ってくることができるとする。この場合、ノード“＋”にハードウェア資源Ｂ１を割り当てて、ノード“−”にハードウェア資源Ｄ２を割り当てた場合、ハードウェア資源Ａ１、Ａ２を割り当てた場合と比べて利用メモリ量を削減できる。
【００９１】
また、割当部１０５は、例えば消費現力の削減を目的としてハードウェア資源割り当てを行っても良い。例えば、ハードウェア資源Ａ１、Ａ２は強力な演算器であり消費電力が大きいとする。一方、他のハードウェア資源はハードウェア資源Ａ１、Ａ２よりも消費電力が小さいとする。この場合、ハードウェア資源Ａ１、Ａ２に割当てないことにより、ハードウェア資源Ａ１、Ａ２に対してクロックゲーティングなどの技術を使って消費電力を削減することができる可能性がある。
【００９２】
また、割当部１０５は、例えば発生する熱の低減を目的としてハードウェア資源割当てを行ってもよい。例えば、特定のハードウェア資源ばかりを利用していると熱が集中するのに対して、色々なハードウェア資源を利用することにより、熱を分散することができる可能性がある。したがって、割当部１０５は、例えば、いろいろなハードウェア資源を割り当てることにより、熱の低減を達成することができる。
【００９３】
また、割当部１０５は、例えば利用ハードウェア資源量の削減を目的として割当てを行ってもよい。例えば、複数の処理があったときに、それらの処理を同時に行いたいという状況を想定する。それらの処理を時分割すると、処理に求められている時間制約を満たせない場合などである。この場合、割当部１０５は、データフローグラフのノード＋とノード−の処理をハードウェア資源Ａ１とＡ２のみに割当てて、他のハードウェア資源を他の処理のために空けておくことにより、異なる処理を同時に実行することができる可能性がある。
【００９４】
また、データフローグラフの各要素が1つのハードウェア資源に割り当てられる例を説明したが、判定部１０４は、データフローグラフの各要素を複数のハードウェア資源に割り当て可能と判定しても良い。
【００９５】
例えば、６４ｂｉｔの精度が必要なデータフローグラフのエッジをハードウェア資源のデータパスに割り当てることを考える。ここで、判定部１０４は、このデータフローグラフのエッジが表現する64bitのデータの上位３２ｂｉｔと下位３２ｂｉｔのデータを別のエッジと考えることによって、２つの３２ｂｉｔデータパスに割り当て可能と判定しても良い。
【００９６】
このように、データフローグラフの１つのエッジを、複数のエッジと考えることで、判定部１０４は、データフローグラフの各要素を複数のハードウェア資源に割り当て可能と判定することができる。これは、データパスだけではなく演算器の場合にも適用可能である。たとえば、２つの６４ｂｉｔのデータ同士のビット単位の論理和を計算するとき、上位３２ｂｉｔと下位３２ｂｉｔとを異なる２つの３２ｂｉｔ演算器に割り当て可能と判定してもよい。割当部１０５は、判定部１０４によってデータフローグラフの一つの要素が複数のハードウェア資源に割り当て可能と判定されたとき、その割り当て方法も候補に含め、割り当てを行う。
【００９７】
本発明は、上記実施形態に限られない。エッジに流れるデータの取り得る範囲を示す情報は、1つのデータ範囲を示す情報に限られない。たとえば、エッジに流れるデータの取り得る範囲を示す情報は、エッジに流れうる値の集合で表しても良い。例えば、エッジに流れうる値を(1, 2, 5, 8)と表現してもよい。この場合、エッジは、1か2か5か8の値を取り得ることを表す。エッジに流れるデータの取り得る範囲を示す情報は、複数のデータ範囲の集合で表現されても良い。例えば、[12, 20][50, 75]と表す。この場合、エッジに流れる値は、12から20の範囲又は50から75の範囲にある。
【００９８】
エッジに流れる値は、図７では全て整数として示したが、整数以外でも良い。例えば、小数や行列や複素数などで表現しても良い。
【００９９】
また、エッジに流れる値はビット幅を用いて表現しても良い。以下では、エッジに流れる値をビット幅で表現する場合について説明する。
【０１００】
この場合、図５のソースコードの変数ａ、ｂ、ｃ、ｄはデータ範囲でなく、ビット幅で表す。また、図７、図８、図９、図１０のエッジに流れる値として、データ範囲の代わりにビット幅を用いる。また、ハードウェア資源の処理量もデータ範囲でなく、ビット幅で表す。このとき、判定部１０４の第１記憶部１０４Aは、各ハードウェア資源について、図１７のようなビット幅との対応表を記憶している。また、図１６に、図９のデータフローグラフにおいて、各エッジに流れる値をビット幅で表した場合のデータフローグラフの要素とエッジのビット幅との対応表を示す。
【０１０１】
判定部１０４は、各ノードについて入力のビット幅と出力のビット幅と各ハードウェア資源の処理可能なビット幅とを比較して、ハードウェア資源の処理可能なビット幅が大きい場合に、当該ハードウェア資源を対応付け可能なハードウェア資源と判定する。例えば、図１６においては、ノードaの出力のエッジである“a”→“＋”、ノードｂの出力のエッジである“ｂ”→“＋”、ノードｃの出力のエッジである“c”→“−”、ノードｄの入力のエッジであるエッジ“−”→“ｄ”のビット幅がそれぞれ、１６、１６、１６、１８である。またハードウェア資源Eは、ビット幅６４である。したがって、判定部１０４は、ノードa、ｂ、ｃ、ｄは、ハードウェア資源Eで対応付け可能と判定する。また、ノード“＋”の入力のエッジである“a”→“＋”と“ｂ”→“＋”は、それぞれのビット幅が１６である。また、ノード“＋”の出力のエッジである“＋”→“−”のビット幅は、１７である。したがって、判定部１０４は、図１７よりノード“＋”は、ハードウェア資源A1とハードウェア資源B１と対応付け可能と判定する。また、ノード“−”の入力のエッジである“ｃ”→“−”のビット幅とは１６ビットである。また、ノード“−”の入力のエッジである“＋”→“−”のビット幅は、１７である。また、ノード“−”の出力のエッジである“−”→“ｄ”のビット幅は１８である。したがって、判定部１０４は、ノード“−”は、図１７よりハードウェア資源A2、D2と対応付け可能であると判定する。
【０１０２】
尚、本実施形態は、コンパイラ装置１０のうちソースプログラム入力部１０１、データ依存解析部１０２、データ範囲解析部１０３、割当部１０５を備えない構成である判定装置２０としても良い。判定装置２０は、入力部２０１と判定部１０４を備える構成である。入力部２０１は、データフローグラフ（ノードとエッジ）とエッジに流れるデータ範囲を入力する。判定部１０４は、コンパイラ装置１０の判定部１０４の動作と同じである。尚、判定装置２０は、ソースプログラム入力部１０１、データ依存解析部１０２、データ範囲解析部１０３、判定部１０４それぞれを備える構成であってもよい。
【０１０３】
また、本実施形態は、コンパイラ装置１０のうちソースプログラム入力部１０１、データ依存解析部１０２、データ範囲解析部１０３を備えない構成である割当装置３０としても良い。割当装置３０は、入力部２０１と判定部１０４と割当部１０５を備える構成である。入力部２０１は、判定装置２０の動作と同じである。判定部１０４、割当部１０５は、コンパイラ装置１０の判定部１０４、割当部１０５の動作と同じである。
【０１０４】
判定装置２０、割当装置３０によれば、データの精度を失わない範囲で効率的にハードウェア資源を利用することができる。
【０１０５】
なお、コンパイラ装置１０は、例えば、汎用のコンピュータ装置を基本ハードウェア資源として用いることでも実現することが可能である。すなわち、ソースプログラム入力部１０１、データ依存解析部１０２、データ範囲解析部１０３、判定部１０４、割当部１０５は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、コンパイラ装置１０は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、ＣＤ−ＲＯＭなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。また第１記憶部１０４A、第２記憶部１０５Aは、上記のコンピュータ装置に内蔵あるいは外付けされたメモリ、ハードディスクもしくはＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−ＲＡＭ、ＤＶＤ−Ｒなどの記憶媒体などを適宜利用して実現することができる。
【０１０６】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【符号の説明】
【０１０７】
１０・・・コンパイラ装置、１１・・・CPU、１２・・・RAM、１３・・・ROM、１４・・・バス、１５・・・入力装置、１６・・・ハードウェア資源、１７・・・出力装置、１０１・・・ソースプログラム入力部、１０２・・・データ依存解析部、１０３・・・データ範囲解析部、１０４・・・判定部、１０４A・・・第１記憶部、１０５・・・割当部、１０５A・・・第２記憶部、２０・・・判定装置、３０・・・割当装置、２０１・・・入力部
【図１】
2011096016.tif 000003
【図２】
2011096016.tif 000004
【図３】
2011096016.tif 000005
【図４】
2011096016.tif 000006
【図５】
2011096016.tif 000007
【図６】
2011096016.tif 000008
【図７】
2011096016.tif 000009
【図８】
2011096016.tif 000010
【図９】
2011096016.tif 000011
【図１０】
2011096016.tif 000012
【図１１】
2011096016.tif 000013
【図１２】
2011096016.tif 000014
【図１３】
2011096016.tif 000015
【図１４】
2011096016.tif 000016
【図１５】
2011096016.tif 000017
【図１６】
2011096016.tif 000018
【図１７】
2011096016.tif 000019
【図１８】
2011096016.tif 000020
【図１９】
2011096016.tif 000021
【手続補正書】
【提出日】平成22年6月4日(2010.6.4)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
ノードとエッジの集合を含むデータフローグラフと、各エッジに流れるデータが取り得る値の範囲を示す情報とを入力する入力部と、
第１ノードの種類と、前記第１ノードと接続する第１エッジに流れるデータが取り得る値の範囲を示す情報とに基づいて、種類の異なる複数のハードウェア資源のうち、前記第１ノードを割り当て可能なハードウェア資源の候補を判定し、
第２ノードの種類と、前記第２ノードと接続する第２エッジに流れるデータが取り得る値の範囲を示す情報とに基づいて、種類の異なる複数のハードウェア資源のうち、前記第２ノードを割り当て可能なハードウェア資源の候補を判定する判定部と、
前記第１ノードを割り当て可能なハードウェア資源の候補と、前記第２ノードを割り当て可能なハードウェア資源の候補とを用いて、前記第１ノードを割り当てる第１ハードウェア資源と前記第２ノードを割り当てる第２ハードウェア資源とを決定する割当部とを備える
コンパイラ装置。
【請求項２】
前記判定部は、各ハードウェア資源が実行可能なプロセスの種類と、前記各ハードウェア資源が処理可能なデータの値の範囲とを記憶する記憶部を備え、
前記判定部は、前記第１ノードに対応するプロセスの種類を処理可能であって、かつ、処理可能なデータ範囲が前記第１エッジに流れるデータが取り得る値の範囲を包含するハードウェア資源を、前記第１ノードに割り当て可能なハードウェア資源の候補と判定し、
前記第２ノードに対応するプロセスの種類を処理可能であって、かつ、処理可能なデータ範囲が前記第２エッジに流れるデータが取り得る値の範囲を包含するハードウェア資源を、前記第２ノードに割り当て可能なハードウェア資源の候補と判定することを特徴とする
請求項１記載のコンパイラ装置。
【請求項３】
前記割当部は、前記第１ノードに割り当て可能と判定されたハードウェア資源の候補のうち、ノード間の依存関係とハードウェア資源間の接続関係とを用いて、前記第１ノードを割り当てる第１ハードウェア資源を決定し、
前記第２ノードに割り当て可能と判定されたハードウェア資源の候補のうち、ノード間の依存関係とハードウェア資源間の接続関係とを用いて、前記第２ノードを割り当てる第２ハードウェア資源を決定することを特徴とする
請求項１記載のコンパイラ装置。
【請求項４】
前記エッジに流れるデータが取り得る値の範囲と前記ハードウェア資源の処理可能なデータの範囲とは、ビット幅で表現されることを特徴とする
請求項１記載のコンパイラ装置。
【請求項５】
ソースプログラムを入力するソースプログラム入力部と、前記ソースプログラムをノードとエッジの集合を含むデータフローグラフで解析する第１解析部と、
前記エッジに流れるデータが取り得る値の範囲を解析する第２解析部と、
第１ノードの種類と、前記第１ノードと接続する第１エッジに流れるデータが取り得る値の範囲を示す情報とに基づいて、前記第１ノードに割り当て可能なハードウェア資源の候補を判定し、
第２ノードの種類と、前記第２ノードと接続する第２エッジに流れるデータが取り得る値の範囲を示す情報とに基づいて、前記第２ノードに割り当て可能なハードウェア資源の候補を判定する判定部と、
前記第１ノードを割り当て可能なハードウェア資源の候補と、前記第２ノードを割り当て可能なハードウェア資源の候補とを用いて、前記第１ノードを割り当てる第１ハードウェア資源と前記第２ノードを割り当てる第２ハードウェア資源とを決定する割当部とを備えることを特徴とする
コンパイラ装置。
【国際調査報告】
2011096016.tif 000022
2011096016.tif 000023
2011096016.tif 000024
2011096016.tif 000025