IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士通株式会社の特許一覧

特開2024-165013コンパイラプログラム、判定方法および情報処理装置
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024165013
(43)【公開日】2024-11-28
(54)【発明の名称】コンパイラプログラム、判定方法および情報処理装置
(51)【国際特許分類】
   G06F 8/41 20180101AFI20241121BHJP
   G06F 9/50 20060101ALN20241121BHJP
【FI】
G06F8/41 130
G06F9/50 150C
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2023080815
(22)【出願日】2023-05-16
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】高野 茂幸
【テーマコード(参考)】
5B081
【Fターム(参考)】
5B081CC16
5B081CC32
(57)【要約】
【課題】演算の割り当て先を効率的に判定する。
【解決手段】処理部12は、中間コード11aに基づいて、データ間のデータ依存距離とループ制御に用いられるインデックス値の変化量であるストライド量とを取得する。処理部12は、中間コード11aに対応するデータフローグラフ20の経路ごとに、経路長とデータのベクトル長とに基づき、単位時間当たりにアクティブになるノード数を示すリソース使用率を計算する。処理部12は、各径路に対して、データ依存距離とストライド量とリソース使用率とに基づき、当該経路における各命令を並列に実行し得る演算リソースの数の指標である平均実行リソース数を計算する。処理部12は、各経路に対して計算した平均実行リソース数に基づいて、中間コード11aに対応する演算の割り当て先を、逐次演算を行う第1の演算器とするか、または、データ並列演算を行う第2の演算器とするかを判定する。
【選択図】図1
【特許請求の範囲】
【請求項1】
コンピュータに、
ソースプログラムから生成された中間コードに基づいて、前記中間コードの演算に用いられるデータ間のデータ依存距離と前記中間コードにおけるループ制御に用いられるインデックス値の変化量であるストライド量とを取得し、
前記中間コードに含まれる複数の命令に対応する複数のノードを含むデータフローグラフにおける1以上の経路であって、ロード命令のノードからストア命令のノードに至る前記1以上の経路それぞれに対して、当該経路の経路長と当該経路で用いられるデータのベクトル長とに基づき、当該経路に含まれるノードのうち、単位時間当たりにアクティブになるノード数を示すリソース使用率を計算し、
前記1以上の経路それぞれに対して、前記データ依存距離と前記ストライド量と当該経路に対応する前記リソース使用率とに基づき、当該経路における各命令を並列に実行し得る演算リソースの数の指標である平均実行リソース数を計算し、
前記1以上の経路それぞれに対して計算した前記平均実行リソース数に基づいて、前記中間コードに対応する演算の割り当て先を、逐次演算を行う第1の演算器とするか、または、データ並列演算を行う第2の演算器とするかを判定する、
処理を実行させるコンパイラプログラム。
【請求項2】
前記ロード命令の対象のデータを示す前記インデックス値と、前記ストア命令の対象のデータを示す前記インデックス値との差分を前記データ依存距離として取得する、
処理を前記コンピュータに実行させる請求項1記載のコンパイラプログラム。
【請求項3】
前記経路長と前記ベクトル長とに基づいて、該当の経路においてデータが出現する総ステップ数を計算し、当該経路の各ノードへデータが割り当てられる回数の総和を、前記総ステップ数と当該経路の総ノード数との積により割ることで、前記リソース使用率を計算する、
処理を前記コンピュータに実行させる請求項1記載のコンパイラプログラム。
【請求項4】
前記データ依存距離を、前記リソース使用率と前記ストライド量との積により割ることで、前記平均実行リソース数を計算する、
処理を前記コンピュータに実行させる請求項1記載のコンパイラプログラム。
【請求項5】
前記判定では、前記平均実行リソース数が閾値以上である経路の数と正の実数値との第1の積が、前記データフローグラフにおける前記ロード命令の数と前記ストア命令の数との第2の積以上であるか否かを判定し、
前記第1の積が前記第2の積未満である場合、前記割り当て先を前記第1の演算器とすると判定し、
前記第1の積が前記第2の積以上である場合、前記割り当て先を前記第2の演算器とすると判定する、
処理を前記コンピュータに実行させる請求項1記載のコンパイラプログラム。
【請求項6】
前記割り当て先を前記第1の演算器と判定すると、前記第1の演算器に対応する実行可能コードを生成する第1のコンパイラバックエンドに対して前記中間コードを出力し、
前記割り当て先を前記第2の演算器と判定すると、前記第2の演算器に対応する実行可能コードを生成する第2のコンパイラバックエンドに対して前記中間コードを出力する、
処理を前記コンピュータに実行させる請求項1記載のコンパイラプログラム。
【請求項7】
コンピュータが、
ソースプログラムから生成された中間コードに基づいて、前記中間コードの演算に用いられるデータ間のデータ依存距離と前記中間コードにおけるループ制御に用いられるインデックス値の変化量であるストライド量とを取得し、
前記中間コードに含まれる複数の命令に対応する複数のノードを含むデータフローグラフにおける1以上の経路であって、ロード命令のノードからストア命令のノードに至る前記1以上の経路それぞれに対して、当該経路の経路長と当該経路で用いられるデータのベクトル長とに基づき、当該経路に含まれるノードのうち、単位時間当たりにアクティブになるノード数を示すリソース使用率を計算し、
前記1以上の経路それぞれに対して、前記データ依存距離と前記ストライド量と当該経路に対応する前記リソース使用率とに基づき、当該経路における各命令を並列に実行し得る演算リソースの数の指標である平均実行リソース数を計算し、
前記1以上の経路それぞれに対して計算した前記平均実行リソース数に基づいて、前記中間コードに対応する演算の割り当て先を、逐次演算を行う第1の演算器とするか、または、データ並列演算を行う第2の演算器とするかを判定する、
判定方法。
【請求項8】
ソースプログラムから生成された中間コードを記憶する記憶部と、
前記中間コードに基づいて、前記中間コードの演算に用いられるデータ間のデータ依存距離と前記中間コードにおけるループ制御に用いられるインデックス値の変化量であるストライド量とを取得し、前記中間コードに含まれる複数の命令に対応する複数のノードを含むデータフローグラフにおける1以上の経路であって、ロード命令のノードからストア命令のノードに至る前記1以上の経路それぞれに対して、当該経路の経路長と当該経路で用いられるデータのベクトル長とに基づき、当該経路に含まれるノードのうち、単位時間当たりにアクティブになるノード数を示すリソース使用率を計算し、前記1以上の経路それぞれに対して、前記データ依存距離と前記ストライド量と当該経路に対応する前記リソース使用率とに基づき、当該経路における各命令を並列に実行し得る演算リソースの数の指標である平均実行リソース数を計算し、前記1以上の経路それぞれに対して計算した前記平均実行リソース数に基づいて、前記中間コードに対応する演算の割り当て先を、逐次演算を行う第1の演算器とするか、または、データ並列演算を行う第2の演算器とするかを判定する処理部と、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明はコンパイラプログラム、判定方法および情報処理装置に関する。
【背景技術】
【0002】
異種の演算器が混在するヘテロジニアスな環境を有するコンピュータシステムが利用されている。当該コンピュータシステムは、逐次演算を行うCPU(Central Processing Unit)などの演算器やデータ並列演算を行うCGRA(Coarse Grained Reconfigurable Array)などの演算器を含み得る。
【0003】
例えば、命令セットの異なるプロセッサを集積するヘテロジニアス・マルチプロセッサシステムにおいて、タスクの実行コストに応じて汎用プロセッサグループまたはアクセラレータグループのいずれか一方へ当該タスクを割り当てるコンパイラの提案がある。提案のコンパイラは、汎用プロセッサグループおよびアクセラレータグループそれぞれのプロセッサについて、データ転送時間とタスク処理時間との和として、タスクの実行コストを求める。
【0004】
また、コンピュータが、逐次プログラムを構成する各タスクの実行時間を判断値として、それが一定値以上であれば仮の並列タスクとし、一定値未満であれば逐次タスクに分類する並列化方法の提案がある。提案の並列化方法では、コンピュータは更に、仮の並列タスクのうちハンドラ処理が干渉する可能性が低いものを並列タスクに採用し、干渉する可能性が高いものを並列タスクに採用せず逐次タスクとする。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2007-328415号公報
【特許文献2】特開2020-181407号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
上記のように、ヘテロジニアスなコンピュータシステムでは、コンパイル時に、演算の割り当て先とする演算器の判定処理が行われ得る。当該判定処理の効率性は、コンパイルに要する時間に影響する。例えば、実行時コンパイル(JIT(Just-In-Time)コンパイル)を行う場合、当該判定処理に時間がかかると、演算完了までの時間が遅延し得る。
【0007】
1つの側面では、本発明は、演算の割り当て先を効率的に判定可能にすることを目的とする。
【課題を解決するための手段】
【0008】
1つの態様では、コンパイラプログラムが提供される。このコンパイラプログラムは、コンピュータに次の処理を実行させる。コンピュータは、ソースプログラムから生成された中間コードに基づいて、中間コードの演算に用いられるデータ間のデータ依存距離と中間コードにおけるループ制御に用いられるインデックス値の変化量であるストライド量とを取得する。コンピュータは、中間コードに含まれる複数の命令に対応する複数のノードを含むデータフローグラフにおける1以上の経路であって、ロード命令のノードからストア命令のノードに至る1以上の経路それぞれに対して、当該経路の経路長と当該経路で用いられるデータのベクトル長とに基づき、当該経路に含まれるノードのうち、単位時間当たりにアクティブになるノード数を示すリソース使用率を計算する。コンピュータは、1以上の経路それぞれに対して、データ依存距離とストライド量と当該経路に対応するリソース使用率とに基づき、当該経路における各命令を並列に実行し得る演算リソースの数の指標である平均実行リソース数を計算する。コンピュータは、1以上の経路それぞれに対して計算した平均実行リソース数に基づいて、中間コードに対応する演算の割り当て先を、逐次演算を行う第1の演算器とするか、または、データ並列演算を行う第2の演算器とするかを判定する。
【0009】
また、1つの態様では、コンピュータによって実行される判定方法が提供される。また、1つの態様では、記憶部と処理部とを有する情報処理装置が提供される。
【発明の効果】
【0010】
1つの側面では、演算の割り当て先を効率的に判定できる。
【図面の簡単な説明】
【0011】
図1】第1の実施の形態の情報処理装置を説明する図である。
図2】第2の実施の形態の計算機システムの例を示す図である。
図3】情報処理装置のハードウェア例を示す図である。
図4】情報処理装置の機能例を示す図である。
図5】データフローグラフの例を示す図である。
図6】MVMカーネルのソースプログラムの例を示す図である。
図7】MVMカーネルの制御フローグラフの例を示す図である。
図8】MVMカーネルのデータフローグラフの例を示す図である。
図9】インデックス値およびストライド量の例を示す図である。
図10】配列要素に対する書き出しおよび読み出しのアクセス例を示す図である。
図11】MVMカーネルの表現の例を示す図である。
図12】データ依存距離が2となる例を示す図である。
図13】マップ先判定処理の例を示すフローチャートである。
図14】データフローグラフの第1の例を示す図である。
図15】各ノードに対するデータの割り当ての遷移例を示す図である。
図16】各ノードに対するデータの割り当ての遷移例(続き)を示す図である。
図17】各ノードに対するデータの割り当ての遷移例(続き)を示す図である。
図18】各ノードに対するデータの割り当ての遷移例(続き)を示す図である。
図19】各ステップでアクティブとなるノードの例を示す図である。
図20】各ステップでアクティブとなるノードの例(続き)を示す図である。
図21】各ステップでアクティブとなるノードの例(続き)を示す図である。
図22】各ステップでアクティブとなるノードの例(続き)を示す図である。
図23】各ステップでアクティブとなるノードの例(続き)を示す図である。
図24】各ステップでアクティブとなるノードの例(続き)を示す図である。
図25】各ステップでアクティブとなるノードの例(続き)を示す図である。
図26】各ステップでアクティブとなるノードの例(続き)を示す図である。
図27】データフローグラフの第2の例を示す図である。
【発明を実施するための形態】
【0012】
以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
【0013】
図1は、第1の実施の形態の情報処理装置を説明する図である。
情報処理装置10は、ソースプログラムのコンパイルを行う。ソースプログラムに係る演算の割り当て先の候補には、逐次演算を行う第1の演算器およびデータ並列演算を行う第2の演算器がある。情報処理装置10は、コンパイルの際に、当該演算の割り当て先を、第1の演算器とするか、または、第2の演算器とするかの判定を行う。第1の演算器は、例えばCPUやGPU(Graphics Processing Unit)などである。第2の演算器は、例えばCGRAやFPGA(Field Programmable Gate Array)などである。なお、図1では、第1の演算器および第2の演算器の図示は省略されている。
【0014】
情報処理装置10は、記憶部11および処理部12を有する。記憶部11は、RAM(Random Access Memory)などの揮発性の半導体メモリでもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性ストレージでもよい。処理部12は、例えば、CPU、GPU、DSP(Digital Signal Processor)などのプロセッサである。ただし、処理部12は、ASIC(Application Specific Integrated Circuit)やFPGAなどの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリ(記憶部11でもよい)に記憶されたプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【0015】
処理部12における下記の処理は、ソースプログラムから中間コードを生成するコンパイラフロントエンドと、中間コードから第1の演算器および第2の演算器それぞれに対応する実行可能コードを生成するコンパイラバックエンドとの間で実行される。
【0016】
処理部12は、中間コード11aに基づいて、中間コード11aの演算に用いられるデータ間のデータ依存距離と中間コードにおけるループ制御に用いられるインデックス値の変化量であるストライド量とを取得する(ステップS1)。具体的には、処理部12は、中間コード11aにおけるロード命令の対象のデータを示すインデックス値と、ストア命令の対象のデータを示すインデックス値との差分としてデータ依存距離を取得する。
【0017】
ここで、処理部12は、データ依存距離Dおよびストライド量Δiから、式(1)によりデータレベル並列性DLPを計算することができる。
【0018】
【数1】
【0019】
データレベル並列性DLPは複数のデータについて同時並列に演算できる並列性を表す指標である。データレベル並列性DLPが大きいほど、同時並列に演算可能なポテンシャルがあると評価される。
【0020】
処理部12は、中間コード11aに含まれる複数の命令に対応する複数のノードを含むデータフローグラフ20における1以上の経路であって、ロード命令のノードからストア命令のノードに至る1以上の経路を取得する。例えば、データフローグラフ20は、ノード21,22,23,24,25,26とノード間を結ぶ有向エッジとを含む。ノード21,22,23,24,25,26それぞれは命令を実行する演算リソースに相当し、中間コード11aの何れかの命令に対応付けられる。有向エッジは、ノード間のデータの流れを示す。経路の起点となるノード21,23はロード命令に対応する。経路の終点となるノード26はストア命令に対応する。例えば、データフローグラフ20は、経路A,Bを有する。経路Aは、ノード21を起点とし、ノード22,25を経由してノード26に至る経路である。経路Bは、ノード23を起点とし、ノード24,25を経由してノード26に至る経路である。
【0021】
処理部12は、取得した各経路に対して、当該経路の経路長と当該経路で用いられるデータのベクトル長とに基づき、当該経路に含まれるノードのうち、単位時間当たりにアクティブになるノード数を示すリソース使用率を計算する(ステップS2)。ノードがアクティブになるとは、後に詳述されるが、ロード命令のノードからストア命令のノードへ向かってデータが流れる場合に、当該ノードに対してデータが割り当てられている状態を意味する。なお、ノードは、前述のように命令を実行する演算リソースを表す。このため、ノードがアクティブになることを、演算リソースがアクティブになると言い換えてもよい。
【0022】
具体的には、処理部12は、当該経路の経路長Lとデータのベクトル長lとに基づいて、式(2)により該当の経路においてデータが出現する総ステップ数Pを計算する。
【0023】
【数2】
【0024】
そして、処理部12は、当該経路の各ノードへデータが割り当てられる回数の総和Σ n(k)を、総ステップ数Pと当該経路の総ノード数Nとの積により割ることで、リソース使用率Uを計算することができる。ここで、kは、データフローグラフ20におけるグラフレベル(階層)を示す。データフローグラフ20の例では、階層は全部で4つである。ただし、処理部12は、データフローグラフ20の平均経路長Lavgおよびデータフローグラフ20の各ノードの平均アクティブ率navgとの積を、総ステップ数Pで割ることで、リソース使用率Uを近似的に求めることもできる。すなわち、処理部12は、リソース使用率Uを式(3)により計算することができる。
【0025】
【数3】
【0026】
例えば、処理部12は、データフローグラフ20の経路A,Bそれぞれに対してリソース使用率Uを計算する。なお、ステップS1,S2の実行順序は逆でもよい。
処理部12は、各経路に対し、データ依存距離とストライド量とリソース使用率とに基づき、当該経路における各命令を並列に実行し得る演算リソースの数の指標である平均実行リソース数を計算する(ステップS3)。具体的には、処理部12は、該当の経路について、データ依存距離Dを、リソース使用率Uとストライド量Δiとの積により割ることで、平均実行リソース数Rを計算する。すなわち、処理部12は、式(4)により、経路A,Bそれぞれに対する平均実行リソース数Rを計算することができる。
【0027】
【数4】
【0028】
ここで、データフローグラフ20におけるノードは、前述のように命令を実行する演算リソースを表す。このため、平均実行リソース数Rは、データの読み出しから書き込みまでの間で実際に命令を実行している演算リソース数の平均値に相当する。
【0029】
そして、処理部12は、各径路に対して計算した平均実行リソース数に基づいて、中間コード11aに対応する演算の割り当て先を、逐次演算を行う第1の演算器とするか、または、データ並列演算を行う第2の演算器とするかを判定する(ステップS4)。
【0030】
具体的には、処理部12は、平均実行リソース数が閾値以上である経路の数と正の係数値との第1の積が、データフローグラフ20におけるロード命令の数とストア命令の数との第2の積以上であるか否かを判定する。そして、処理部12は、第1の積が第2の積未満である場合、当該演算の割り当て先を第1の演算器とすると判定する。また、処理部12は、第1の積が第2の積以上である場合、当該演算の割り当て先を第2の演算器とすると判定する。第1の積と第2の積とに関する判定式は、式(5)、(6)により表される。
【0031】
【数5】
【0032】
【数6】
【0033】
ここで、式(5)のsは、データフローグラフ20に含まれる経路の集合Sの要素に対応する変数(s∈S)である。例えば、データフローグラフ20に含まれる経路は、経路A,Bである。rは判定用の閾値であり、1以上の実数である。
【0034】
s_iは、i番目の経路に対応する平均実行リソース数である。ここで、“_i”の表記は便宜的な表現であり、下付きの添え字を示す。すなわち、「s_i」は「s」に相当する。また、Nspawnは、正の実数(Nspawn>0)である。Nstはデータフローグラフ20におけるストア命令の数(Nst>0)である。Nldはデータフローグラフ20におけるロード命令の数(Nld>0)である。NstとNldの積は、データフローグラフ20における全経路数の概算の見積りに相当する。また、Σsは、多数決に相当する。rやNspawnの値は予め与えられる。
【0035】
そして、処理部12は、割り当て先を第1の演算器と判定すると、例えば第1の演算器に対応する実行可能コードを生成する第1のコンパイラバックエンドに対して中間コード11aを出力する。また、処理部12は、割り当て先を第2の演算器と判定すると、例えば第2の演算器に対応する実行可能コードを生成する第2のコンパイラバックエンドに対して中間コード11aを出力する。
【0036】
このように、情報処理装置10によれば次の処理が実行される。ソースプログラムから生成された中間コード11aに基づいて、中間コードの演算に用いられるデータ間のデータ依存距離と中間コードにおけるループ制御に用いられるインデックス値の変化量であるストライド量とが取得される。中間コードに含まれる命令列に対応するデータフローグラフにおける1以上の経路であって、ロード命令のノードからストア命令のノードに至る1以上の経路それぞれに対して、リソース使用率が計算される。リソース使用率は、該当の経路の経路長と当該経路で用いられるデータのベクトル長とに基づき、当該経路に含まれる複数のノードのうち、単位時間当たりにアクティブになるノード数を示す。1以上の経路それぞれに対して、データ依存距離とストライド量と当該経路に対応するリソース使用率とに基づき、当該経路における各命令を並列に実行し得る演算リソースの数の指標である平均実行リソース数が計算される。1以上の経路それぞれに対して計算した平均実行リソース数に基づいて、中間コードに対応する演算の割り当て先を、逐次演算を行う第1の演算器とするか、または、データ並列演算を行う第2の演算器とするかが判定される。
【0037】
これにより、情報処理装置10は、演算の割り当て先を効率的に判定できる。具体的には、情報処理装置10の上記処理に用いられる情報は、中間コード11aから容易に取得可能である。また、情報処理装置10は、これらの情報を用いて簡便な計算により割り当て先の演算器を判定可能である。すなわち、情報処理装置10は、中間コード11aに対する簡易な解析により割り当て先の演算器の判定を行うことができ、当該判定のための処理コストを低減できる。例えば、情報処理装置10は演算の割り当て先を高速に判定できる。このため、情報処理装置10の機能は、例えばJITコンパイルへの応用が期待できる。
【0038】
また、情報処理装置10は、ソースプログラムを入力として、実行可能コードの生成までエンドツーエンド(End-to-End)のコンパイルを可能とする。このため、割り当て先の決定のためのユーザの作業を省ける。更に、情報処理装置10によれば割り当て先の判定は、式(2)~(6)で示されるように、定量による判定である。このため、例えば情報処理装置10は、割り当て先の判定のために計算した各値を出力することで、判定の理由をユーザに対して分かり易く提示することができる。情報処理装置10による割り当て先の判定は、形式化された方法であるため、判断理由も明確である。このため、情報処理装置10は、当該判断理由をユーザに提供し、ユーザによる最終的な割り当て先の判断が円滑に行われるように支援してもよい。
【0039】
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図2は、第2の実施の形態の計算機システムの例を示す図である。
【0040】
計算機システム1は、異種の演算器が混在するヘテロジニアスコンピュータシステムである。計算機システム1は、ヘテロジニアスな環境を有するHPC(High Performance Computing)システムでもよい。計算機システム1は、インターコネクションネットワーク30、情報処理装置100、CPU-A群200、CPU-B群300、GPU群400、CGRA群500およびストレージノード群600を有する。情報処理装置100、CPU-A群200、CPU-B群300、GPU群400、CGRA群500およびストレージノード群600は、インターコネクションネットワーク30に接続される。インターコネクションネットワーク30には、例えばInfiniBandなどが用いられる。
【0041】
情報処理装置100は、ソースプログラムのコンパイルを行い、CPU-A群200、CPU-B群300、GPU群400およびCGRA群500に属する演算器に、演算を割り当てるコンピュータである。
【0042】
CPU-A群200は、CPU-Aのグループである。CPU-B群300は、CPU-Bのグループである。例えば、CPU-AやCPU-Bの末尾の「A」、「B」の表記は、x86やARM(登録商標)などの命令セットの種別を表す。GPU群400は、GPUのグループである。CGRA群500は、CGRAのグループである。ストレージノード群600は、ストレージノードのグループである。ストレージノードは、RAMやSSD(Solid State Drive)などの記憶装置を提供する。CPU-A群200、CPU-B群300、GPU群400およびCGRA群500の各演算器は、ストレージノード群600に含まれるストレージノードを用いて演算を実行する。例えば、各演算器とストレージノードとの接続関係は、情報処理装置100により制御される。
【0043】
図3は、情報処理装置のハードウェア例を示す図である。
情報処理装置100は、プロセッサ101、RAM102、HDD103、GPU104、入力インタフェース105、媒体リーダ106および通信インタフェース107,108を有する。情報処理装置100が有するこれらのユニットは、情報処理装置100の内部でバスに接続されている。プロセッサ101は、第1の実施の形態の処理部12に対応する。RAM102またはHDD103は、第1の実施の形態の記憶部11に対応する。
【0044】
プロセッサ101は、プログラムの命令を実行する演算装置である。プロセッサ101は、例えばCPUである。プロセッサ101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、プロセッサ101は複数のプロセッサコアを含んでもよい。また、情報処理装置100は複数のプロセッサを有してもよい。以下で説明する処理は複数のプロセッサまたはプロセッサコアを用いて並列に実行されてもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【0045】
RAM102は、プロセッサ101が実行するプログラムやプロセッサ101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、情報処理装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【0046】
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、情報処理装置100は、フラッシュメモリやSSDなどの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【0047】
GPU104は、プロセッサ101からの命令に従って、情報処理装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
【0048】
入力インタフェース105は、情報処理装置100に接続された入力デバイス112から入力信号を取得し、プロセッサ101に出力する。入力デバイス112としては、マウス、タッチパネル、タッチパッド、トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、情報処理装置100に、複数の種類の入力デバイスが接続されていてもよい。
【0049】
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
【0050】
媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、プロセッサ101によって実行される。なお、記録媒体113は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体113やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
【0051】
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他の情報処理装置と通信する。ネットワーク114は、LAN(Local Area Network)やWAN(Wide Area Network)やインターネットなどを含んでもよい。通信インタフェース107は、スイッチやルータなどの有線通信装置に接続される有線通信インタフェースでもよいし、基地局やアクセスポイントなどの無線通信装置に接続される無線通信インタフェースでもよい。
【0052】
通信インタフェース108は、インターコネクションネットワーク30に接続される。前述のように、通信インタフェース108には、例えばInfiniBandなどが用いられる。
【0053】
図4は、情報処理装置の機能例を示す図である。
情報処理装置100は、コンパイラとして機能する。情報処理装置100は、記憶部120、コンパイラフロントエンド130、マップ先判定部140およびコンパイラバックエンド150,160,170,180を有する。記憶部120には、RAM102やHDD103の記憶領域が用いられる。コンパイラフロントエンド130、マップ先判定部140およびコンパイラバックエンド150,160,170,180は、RAM102に記憶されたプログラムがCPU101により実行されることで実現される。
【0054】
記憶部120は、IR(Intermediate Representation)コード121を記憶する。IRコード121は、コンパイラフロントエンド130により生成される。IRコード121は、中間コードと言われてもよい。
【0055】
コンパイラフロントエンド130は、ソースプログラム(ソースコード)を基にIRコード121を生成する。コンパイラフロントエンド130は、例えばLLVM(Low Level Virtual Machine)と言われるソフトウェアでもよい。
【0056】
マップ先判定部140は、IRコード121に基づいて、IRコード121に係る演算の割り当て先の演算器を判定する。マップ先判定部140は、割り当て先に決定した演算器に対応するコンパイラバックエンドに、IRコード121を出力する。マップ先判定部140は、まず、IRコード121を解析することで、逐次演算を行うCPUやGPUなどの第1の演算器を割り当て先とするか、CGRAやFPGAなどのデータ並列演算を行う第2の演算器を割り当て先とするかを判定する。第1の演算器および第2の演算器は、互いに異なる種類の演算器であると言える。ここで、計算機システム1の例では、第1の演算器にもCPU-A、CPU-Bなど、扱う命令セットの異なる複数の演算器が含まれる。このため、マップ先判定部140は、使用される命令セットに応じて、複数の第1の演算器の中から、何れかの演算器を演算の割り当て先として選択する。
【0057】
コンパイラバックエンド150,160,170,180は、マップ先判定部140から入力されるIRコードから、各演算器に対応する実行可能コードを生成する。例えば、コンパイラバックエンド150,160,170,180は、それぞれCPU-A、CPU-B、GPU、CGRAに対応する。そして、何れかのコンパイラバックエンドにより生成された実行可能コードを用いて、割り当て先の演算器による演算が実行される。
【0058】
次に、マップ先判定部140によるIRコード121の解析について説明する。
図5は、データフローグラフの例を示す図である。
データフローグラフ40は、演算ノードと2つの演算ノード間を結ぶエッジとを含む。演算ノードは、命令の実行に用いられる演算リソースに相当し、IRコード121の命令列における何れかの命令に対応付けられる。エッジは有向エッジである。エッジの矢印の向きはデータの流れを示す。演算ノードは、単にノードと言われてもよい。また、演算リソースは、例えばプロセッサエレメント(PE:Processing Element)を含み得る。
【0059】
ソースプログラムは、コンパイラフロントエンド130により基本ブロック単位で、データフローグラフに変換される。例えば、マップ先判定部140は、コンパイラフロントエンド130からデータフローグラフの情報を取得することができる。マップ先判定部140は、取得したデータフローグラフの情報を記憶部120に格納する。
【0060】
ここで、IRコード121の生成元となるソースプログラムの例を説明する。一例として、行列ベクトル積(MVM:Matrix-Vector Multiplications)を計算するMVMカーネルのソースプログラムを説明する。
【0061】
図6は、MVMカーネルのソースプログラムの例を示す図である。
ソースプログラム50は、C言語によるMVMカーネルの記述例である。ソースプログラム50では、M[R][C]で示される二次元アレイやV[C]、Y[R]で示される一次元アレイが定義される。行列を表すM[R][C]とベクトルを表すV[C]との積の演算結果が、ベクトルを表すY[R]に格納される。ソースプログラム50は、コンパイラフロントエンド130により構文解析されて、基本ブロック単位にIR命令列に変換される。
【0062】
図7は、MVMカーネルの制御フローグラフの例を示す図である。
制御フローグラフ60は、ソースプログラム50で表されるMVMカーネルにおける基本ブロックの実行順序を示す。制御フローグラフ60は、基本ブロックに相当するノードと、基本ブロックの実行順序を表す、2つのノード間を結ぶエッジとを含む。ノードには基本ブロックの識別番号である基本ブロックID(IDentifier)が記載されている。例えば、基本ブロックID「a」の基本ブロックは、基本ブロック「a」と表記される。
【0063】
例えば、基本ブロック「4」は、行のインデックスrがRに達したか否かの判定である。基本ブロック「12」は、列のインデックスcがCに達したか否かの判定である。特に、基本ブロック「15」は、Y[r]の要素の計算に相当する。
【0064】
図8は、MVMカーネルのデータフローグラフの例を示す図である。
データフローグラフ70は、制御フローグラフ60における基本ブロック「15」のデータフローグラフである。データフローグラフ70は、基本ブロック「15」の命令列における各命令に対応付けられる複数の演算ノードを有する。演算ノード間は、データの流れを示すエッジで結ばれる。データの流れは、図8の上側から下側へ向かう方向となる。また、データフローグラフ70は、データの流れの起点の演算ノードから終点の演算ノードへ至る複数の経路(図8の例では6個の経路)を有する。データの流れの起点の演算ノードは、ロード命令に対応する。データの流れの終点のノードは、ストア命令に対応する。
【0065】
データフローグラフ70は、演算ノード群G1,G2,G3および演算ノード71,72,73,74,75,76を有する。演算ノード群G1は、一次元アレイVのインデックス値の計算に相当する。演算ノード群G2は、二次元アレイMのインデックス値の計算に相当する。演算ノード群G3は、一次元アレイYのインデックス値の計算に相当する。
【0066】
演算ノード71は、Vの要素のロードに対応する。演算ノード72は、Mの要素のロードに対応する。演算ノード73は、Vの要素とMの要素との乗算に対応する。演算ノード74は、Yの要素のロードに対応する。演算ノード75は、Vの要素とMの要素との積と、Yの要素との加算に対応する。演算ノード76は、当該加算の結果であるYの要素のストアに対応する。インデックスcの各値に対して演算ノード73~76が繰り返し実行されることで、累和としてY[r]が計算される。
【0067】
ここで、MVMカーネルに対応する演算の割り当て先の判定では、マップ先判定部140は、上記の制御フローグラフ60の演算本体に相当する基本ブロック「15」に着目すればよい。例えば、マップ先判定部140は、次のように演算本体の基本ブロック「15」を特定し得る。まず、マップ先判定部140は、制御フローグラフ60において、MVMカーネル内の2つのループを確認する。具体的には、基本ブロックID「12」、「15」、「33」に対応する1つ目のループ、および、基本ブロックID「4」、「7」、「12」、「36」、「37」に対応する2つ目のループである。全ての演算ノードは、即値あるいはロード命令で値を取得して演算などを行い、最後にストアする。その上で、マップ先判定部140は、ループを横断した演算ノード間で、ストアからロードの接続(すなわち、メモリアドレスを格納しているレジスタの番号)を確認することで、演算本体とその他(すなわち、インデックス操作)とを区別することができる。
【0068】
ここで、インデックス値およびストライド量について説明する。
図9は、インデックス値およびストライド量の例を示す図である。
図9では、前述のMVMカーネルのソースプログラム50におけるインデックス値およびストライド量の例を示す。インデックスは、現在までのループの繰り返し回数を保持する変数である。インデックス値は、特定のアレイ要素を指し示す実際の値である。インデックス値は式で表されることもある。ストライド量は、インデックス値の変化量(Δi)である。Δi=現在のインデックス値-前回のインデックス値として計算される。
【0069】
次に、データ依存距離Dについて説明する。
データ依存距離Dは、ループでの入出力タイミングの間隔を表す指標である。入出力タイミングとは、書き込む配列(代入先要素)および読み出す配列(参照元要素)それぞれのタイミングである。例えば、マップ先判定部140は、代入式の左辺と右辺の配列変数について全てのインデックス値を検証する。多重ループがn個のインデックス変数を持っていれば入出力のタイミングについて少なくともn個のDがある。複数のDがある場合、マップ先判定部140は、そのうち、0以外の最小値(頻繁に参照代入がされているボトルネック)を使用し得る。
【0070】
図10は、配列要素に対する書き出しおよび読み出しのアクセス例を示す図である。
アクセス例80は、複数の配列要素それぞれに対する、D=2の場合の書き出しおよび読み出しの様子を示す。アクセス例80によれば、実線で示されるアクセスの系列と、破線で示されるアクセスの系列とが存在することが分かる。このように、例えばD=2の場合、当該複数の配列要素に対して、2つの独立したアクセス性が存在することになる。
【0071】
マップ先判定部140は、アレイのインデックス値に着目してデータ依存距離Dを求める。データ依存距離Dは、読み出し元アレイと書き込み先アレイとのインデックス値の差分値である。D=0の場合、両者にはデータ依存が無いことになる。このように、マップ先判定部140は、シストリックアレイで使用されているDを一般的なコンパイル問題に応用する。
【0072】
次に、MVMカーネルに対するデータ依存距離Dの計算について説明する。
図11は、MVMカーネルの表現の例を示す図である。
ソースプログラム51は、MVMカーネルにおけるループ部分の記述である。ソースプログラム52は、ソースプログラム51と等価な、次元を全て合わせた表現の例である。ソースプログラム51,52の例では、Xが二次元アレイであり、Y,Zが一次元アレイである。Zに行列XとベクトルYとの積が格納される。最内ループでのアキュームレートは、その最内ループでのΔi(=j+1-j=1)をオフセットとする。各レベルでアキュームレートがあれば、そのレベルでのΔiがオフセットとして使用される。
【0073】
マップ先判定部140は、MVMカーネルについて、次のようにデータ依存距離Dを得る。まず、Z-X間のD値は、iについてi-i=0である。すなわち、行インデックスについてZ,Xは独立である。また、Z-X間のD値は、jについてj-j=0である。すなわち、列インデックスについてZ,Xは独立である。
【0074】
次に、Z-Y間のD値は、iについてi-i=0である。すなわち、行インデックスについてZ,Yは独立である。また、Z-Y間のD値は、jについてj-j=0である。すなわち、列インデックスについてZ,Yは独立である。
【0075】
更に、Z自身のD値は、iについてi-i=0である。すなわち、行インデックスについてZ自身は独立である。また、Z自身のD値は、jについてj-(j-1)=1である。これはストライド量Δiと等しい。よって、マップ先判定部140は、上記のD値のうち、0以外の最小値として、MVMカーネルに対するD=1を得る。
【0076】
次に、他の例として、データ依存距離D=2になる場合を説明する。
図12は、データ依存距離が2となる例を示す図である。
ソースプログラム53では、Z-X間についてD値=i-(i-2)=2と計算可能である。また、他のデータ間についてD値=0である。したがって、データ依存距離D=2となる。ここで、図12では、ソースプログラム53に対応する複数の配列要素へのアクセスの系列81,82が例示される。系列81,82は、インデックスiで制御されるループについて、iが1つずつインクリメントされる場合を示す。系列81は、演算してストアする系F1による、配列要素からのXの要素の読み出しと、配列要素へのZの要素の書き込みとを例示する。系列82は、演算してストアする系F2による、配列要素からのXの要素の読み出しと、配列要素へのZの要素の書き込みとを例示する。系F1,F2はそれぞれが演算リソースに相当すると考えてもよい。ここで、配列要素から系F1,F2それぞれへ向かう実線矢印は、Xの要素の読み出しを示す。また、系F1,F2それぞれか配列要素へ向かう破線矢印は、Zの要素の書き込みを示す。
【0077】
このような2つの独立したアクセス性は、データレベル並列性DLPと呼ばれる指標によって表される。データレベル並列性DLPは、前述の式(1)により計算される。例えば、D=2、Δi=1の場合、DLP=2/1=2である。データレベル並列性DLPが大きいほど、同時並列に演算可能なポテンシャルがあると言える。
【0078】
次に、情報処理装置100によるマップ先判定処理の手順を説明する。
図13は、マップ先判定処理の例を示すフローチャートである。
(S10)マップ先判定部140は、コンパイラフロントエンド130により生成されたIRコード121を取得する。
【0079】
(S11)マップ先判定部140は、IRコード121に対応するデータフローグラフの経路ごとの平均実行リソース数Rを、式(4)により計算する。具体的には、マップ先判定部140は、IRコード121に基づいて、前述のデータ依存距離Dおよびストライド量Δiを取得する。また、マップ先判定部140は、計算対象の経路の経路長Lとデータのベクトル長lとに基づいて、式(2)により該当の経路においてデータが出現する総ステップ数Pを計算する。更に、マップ先判定部140は、総ステップ数Pを用いて、式(3)により当該経路のリソース使用率Uを計算する。リソース使用率Uは、単位時間(ステップ)当たりアクティブなリソース数(演算ノード数に相当)を示す。そして、マップ先判定部140は、当該経路のリソース使用率U、データ依存距離Dおよびストライド量Δiの各値を式(4)に代入することで、当該経路の平均実行リソース数Rを求める。平均実行リソース数Rは、あるデータについて読み出しから書き込みまでの間で実際に実行しているリソース数の平均値を示す。
【0080】
(S12)マップ先判定部140は、経路ごとの平均実行リソース数Rs_iに基づいて、式(5)により経路ごとの判定値sを計算する。ここで、経路sの表記におけるiは、経路を識別する番号である。Rs_iはi番目の経路の平均実行リソース数を示す。
【0081】
(S13)マップ先判定部140は、経路ごとの判定値sの総和が式(6)で表される条件式を満たすか否かを判定する。判定値sの総和が当該条件式を満たす場合、ステップS14に処理が進む。判定値sの総和が当該条件式を満たさない場合、ステップS15に処理が進む。
【0082】
(S14)マップ先判定部140は、データ並列演算を行う演算器を割り当て先として決定する。すなわち、マップ先判定部140は、空間にマップすると判断する。マップ先判定部140は、割り当て先とする演算器に対応するコンパイラバックエンドにIRコード121を出力し、実行可能コードを生成させる。そして、マップ先判定処理が終了する。
【0083】
(S15)マップ先判定部140は、逐次演算を行う演算器を割り当て先として決定する。すなわち、マップ先判定部140は、時間軸にマップすると判断する。そして、マップ先判定部140は、割り当て先とする演算器に対応するコンパイラバックエンドにIRコード121を出力し、実行可能コードを生成させる。そして、マップ先判定処理が終了する。
【0084】
このように、マップ先判定部140は、ステップS12,S13により、演算ノードに対応する演算リソースの、データレベル並列性に対する利用効率が、所定の基準よりも高くなることが見込まれる場合に、該当の演算をデータ並列演算系の演算器に割り当てる。一方、それ以外の場合には、マップ先判定部140は、該当の演算を逐次演算系の演算器に割り当てる。これにより、マップ先判定部140は、割り当て先を適切に判定できる。例えば、マップ先判定部140は、演算実行時におけるデータ並列演算系の演算器の利用効率が低下しないように制御できる。ここで、上記の所定の基準は、式(5)、(6)の閾値r,Nspawn,Nld,Nstによって定められる。
【0085】
なお、前述のように、計算機システム1では、例えば逐次演算を行う演算器にもCPU-A、CPU-Bなど、扱う命令セットの異なる複数の演算器が含まれ得る。この場合、マップ先判定部140は、ステップS14,S15では、使用される命令セットに応じて、当該複数の演算器の中から、何れかの演算器を演算の割り当て先として更に選択する。
【0086】
次に、マップ先判定部140によるマップ先判定の処理の具体例を説明する。
図14は、データフローグラフの第1の例を示す図である。
データフローグラフ90は、ロード命令に対応する演算ノードからストア命令に対応する演算ノードに至る経路が1つである例、すなわち、リニアなトポロジーの例を示す。データフローグラフ90では、図中の最も左側に位置する演算ノードがロード命令に対応する演算ノードである。また、図中の最も右側に位置する演算ノードがストア命令に対応する演算ノードである。データフローグラフ90について、ノード数N=6である。また、当該1つの経路の経路長L=N-1=5である。
【0087】
当該経路においてデータが出現する総ステップ数Pは次のように求められる。
図15は、各ノードに対するデータの割り当ての遷移例を示す図である。
データのベクトル長、すなわち、データ長l=8とする。ここで、データ長は、ロード命令およびストア命令の即値となっていることが多い。このため、マップ先判定部140は、ロード命令およびストア命令からデータ長lを取得可能である。即値で扱えない場合にはレジスタが参照されるため、マップ先判定部140は、その参照命令のソースレジスタを確認することでデータ長lを取得できる。
【0088】
また、図中のデータの各要素(データ要素)は1~8の番号を付して区別され、番号順にロードされる。ステップごとの各データ要素の移動方向は、データフローグラフ90のロード命令の演算ノードからストア命令の演算ノードへ向かう方向、すなわち、図の左側から右側へ向かう方向である。
【0089】
まず、データ要素「1」が読み出される(ステップST1)。この場合、データ要素「1」は、ロード命令の演算ノードに割り当てられる。データ要素が演算ノードに割り当てられていることを、当該演算ノードがアクティブであると言う。次に、データ要素「2」が読み出される(ステップST2)。この場合、データ要素「1」は、ロード命令の次の演算ノードに割り当てられる。また、データ要素「2」は、ロード命令の演算ノードに割り当てられる。以降、同様にして、データ要素「3」~「5」が順次読み出される(ステップST3~ST5)。
【0090】
図16は、各ノードに対するデータの割り当ての遷移例(続き)を示す図である。
更に、データ要素「6」~「8」が順次読み出される(ステップST6~ST8)。例えば、ステップST7の段階で、先頭のデータ要素「1」のストアが完了済となる。データ要素「8」は、末尾のデータ要素である。
【0091】
図17は、各ノードに対するデータの割り当ての遷移例(続き)を示す図である。
各データ要素はステップが1つ進むごとに次の演算ノードに割り当てられる(ステップST9~ST11)。
【0092】
図18は、各ノードに対するデータの割り当ての遷移例(続き)を示す図である。
更に、データ要素「7」のストアが行われる(ステップST12)。データ要素「8」のストアが行われる(ステップST13)。データ要素「8」のストアが完了する(ステップST14)。
【0093】
このように、各演算ノードに何れかのデータ要素が割り当てられることで、当該演算ノードがアクティブとなる。データフローグラフ90に対して、データ長l=8の場合、データフローグラフ90に相当する経路においてデータが出現する総ステップ数P=N+l=6+8=14となる。
【0094】
次に、データフローグラフ90に対するリソース使用率Uの計算例を説明する。
図19は、各ステップでアクティブとなるノードの例を示す図である。
データフローグラフ90の例では、グラフレベル(グラフの階層)の総数は6である。6つの階層は、ロード命令の演算ノードの階層からストア命令の演算ノードの階層まで、階層番号k=1,2,…,6で識別される。図15図18で例示したステップST1~ST14の各ステップにおいて、各階層でのアクティブな演算ノード数n(k)は次の通りである。
【0095】
ステップST1では、n(1)=1であり、それ以外の階層ではn(k)=0である。ステップST2では、n(1)=n(2)=1であり、それ以外の階層ではn(k)=0である。ステップST3では、n(1)=n(2)=n(3)=1であり、それ以外の階層ではn(k)=0である。
【0096】
ここで、図19以降では、各ステップにおいてアクティブである演算ノードの履歴を、演算ノードの下側に記載された黒色の長方形により表している。
図20は、各ステップでアクティブとなるノードの例(続き)を示す図である。
【0097】
ステップST4では、n(1)=n(2)=n(3)=n(4)=1であり、それ以外の階層ではn(k)=0である。ステップST5では、n(1)=n(2)=n(3)=n(4)=n(5)=1であり、それ以外の階層ではn(k)=0である。なお、図中「n(1)=1」などの表記は省略されている。
【0098】
図21は、各ステップでアクティブとなるノードの例(続き)を示す図である。
ステップST6,ST7では、k=1~6について、n(k)=1である。
図22は、各ステップでアクティブとなるノードの例(続き)を示す図である。
【0099】
ステップST8では、k=1~6について、n(k)=1である。ステップST9では、n(2)=n(3)=n(4)=n(5)=n(6)=1である。また、ステップST9では、k=1の階層の演算ノードは非アクティブとなるため、n(1)=0となる。図中、アクティブから非アクティブへ遷移した演算ノードの履歴を、当該演算ノードの下側に記載された白色の長方形により表している。
【0100】
図23は、各ステップでアクティブとなるノードの例(続き)を示す図である。
ステップST10では、n(3)=n(4)=n(5)=n(6)=1である。また、ステップST10では、k=2の階層の演算ノードは非アクティブとなるため、n(1)=n(2)=0となる。
【0101】
ステップST11では、n(4)=n(5)=n(6)=1である。また、ステップST10では、k=3の階層の演算ノードは非アクティブとなるため、n(1)=n(2)=n(3)=0となる。
【0102】
図24は、各ステップでアクティブとなるノードの例(続き)を示す図である。
ステップST12では、n(5)=n(6)=1である。また、ステップST12では、k=4の階層の演算ノードは非アクティブとなるため、n(1)=n(2)=n(3)=n(4)=0となる。
【0103】
図25は、各ステップでアクティブとなるノードの例(続き)を示す図である。
ステップST13では、n(6)=1である。また、ステップST13では、k=5の階層の演算ノードは非アクティブとなるため、n(1)=n(2)=n(3)=n(4)=n(5)=0となる。
【0104】
図26は、各ステップでアクティブとなるノードの例(続き)を示す図である。
ステップST14では、k=1~6についてn(k)=0である。ただし、ステップST14に対する白色の長方形の図示は省略されている。
【0105】
この場合、マップ先判定部140は、総ステップ数Pの間に、データフローグラフ90の各階層においてアクティブとなる演算ノードの数を、Σn(1)=Σn(2)=Σn(3)=Σn(4)=Σn(5)=Σn(6)=8と計算する。ここで、Σは、1~14までのステップ数で和を取ることを示す。また、階層当たりのアクティブ総回数である平均アクティブ率navgは、6×8/6=8となる。なお、平均アクティブ率は平均アクティブ回数と言われてもよい。
【0106】
例えば、リソース使用率Uは、U=(平均経路長×平均アクティブ率)/(時間)=(平均経路長×アクティブ総回数)/(ノード数*時間)として計算される。時間は総ステップ数Pに相当する。なお、1/U=(経路当たりのノード数)×(アクティブに要する時間)に相当する。
【0107】
図26の例に対して、平均経路長=5、アクティブ総回数=6×8、ノード数=6、時間(総ステップ数P)=14である。したがって、マップ先判定部140は、U=(平均経路長×アクティブ総回数)/(ノード数*時間)=(5×6×8)/(6×14)=20/7と計算する。
【0108】
例えば、マップ先判定部140は、データフローグラフ90に対応するIRコードに基づいて、データ依存距離D=1、ストライド量Δi=1を取得するものとする。この場合、マップ先判定部140は、データフローグラフ90の1つの経路に対して、式(4)に基づき、平均実行リソース数R=1/U=0.35を計算する。
【0109】
例えば、式(5)の閾値r=1.0の場合、R=0.35<1.0である。したがって、この場合、マップ先判定部140は、式(5)に基づいてs=0を得る。
更に、データフローグラフ90について、ロード命令数Nld=1であり、ストア命令数Nst=1である。したがって、N=Nst×Nld=1×1=1である。また、Nspawn=1とする。この場合、マップ先判定部140は、式(6)について、Σs=s<Nとなり、式(6)が満たされないと判断する。したがって、マップ先判定部140は、該当のIRコードに係る演算の割り当て先を、CPUなどの逐次演算を行う演算器にすると判定する。
【0110】
次に、データフローグラフの他の例を説明する。
図27は、データフローグラフの第2の例を示す図である。
データフローグラフ91は、2つのロード命令に対応する演算ノードを有し、当該2つの演算ノードから、ストア命令に対応する演算ノードに至る2つの経路a,bを含むものである。データフローグラフ91の総演算ノード数Nは6である。また、グラフの階層の総数は4である。更に、経路a,bそれぞれに含まれる演算ノード数は4である。経路a,bそれぞれの経路長LはL=Lavg=3である。また、例えばデータ長l=16であるとする。
【0111】
この場合、経路a,bそれぞれについて、P=L-1+l=2+16=18である。また、経路a,bそれぞれの各階層の平均アクティブ回数navg=16(=l)である。
したがって、マップ先判定部140は、式(3)に基づき、リソース使用率U=Lavg×navg/(N×P)=3×16/(6×18)=4/9と計算する。このように、マップ先判定部140は、Lavg×navgの計算により、式(3)の分母(N×P)に対する分子のΣ n(k)の近似値を求め、リソース使用率Uの計算に用いてもよい。
【0112】
ここで、マップ先判定部140は、データフローグラフ91に対応するIRコードに基づき、データ依存距離D=1、ストライド量Δi=1を得るとする。
すると、マップ先判定部140は、経路a,bそれぞれについて、式(4)に基づき、平均実行リソース数R=2.25と計算する。また、閾値r=1であるとする。この場合、マップ先判定部140は、式(5)に基づいて、経路a,bそれぞれに対し、s=1と計算する。
【0113】
データフローグラフ91では、Nld=2であり、Nst=1である。また、Nspawn=1とする。この場合、マップ先判定部140は、式(6)に基づいて、Σs=2=Nld×Nst=2×1となり、式(6)を満たすと判定する。したがって、マップ先判定部140は、該当のIRコードに係る演算の割り当て先を、CGRAなどのデータ並列演算を行う演算器にすると判定する。
【0114】
ところで、演算の割り当て先の決定では、例えば、データがスカラの場合、データフローグラフにおける演算ノードはほぼ使用されないため、時間軸(CPU)で扱った方が良いなどの判断を、属人的な判定により行うことがある。例えば、データフローグラフを演算器アレイにマップするとして、データ長が短いベクトルあるいはスカラ値の場合、グラフ規模が大きいほど演算器の使用回数が減るため、CPUなどのプロセッサで実行しても差し支えないなどの判断をユーザが行う。このように、演算を、演算器アレイのようなデータ並列実行系にマップするかプロセッサのような逐次実行系にマップするか判断したいことがある。
【0115】
これに対し、情報処理装置100によれば、演算の割り当て先を効率的に判定できる。具体的には、情報処理装置100の上記処理に用いられる情報は、IRコードから容易に取得可能である。また、情報処理装置100は、これらの情報を用いて簡便な計算により割り当て先の演算器を判定可能である。すなわち、情報処理装置100は、IRコードに対する簡易な解析により割り当て先の演算器の判定を行うことができ、当該判定のための処理コストを低減できる。例えば、情報処理装置100は演算の割り当て先を高速に判定できる。このため、情報処理装置100の機能は、例えばJITコンパイルへの応用が期待できる。JITコンパイルに応用されることで、コンパイルの時間が減り、演算の実行完了までの遅延を低減し得る。
【0116】
また、情報処理装置100は、ソースプログラムを入力として、実行可能コードの生成までエンドツーエンドのコンパイルを可能とする。すなわち、情報処理装置100は、IRコードに係る演算に対応するタスクの特性を形式化することで、当該タスクのリソースへの割り当て判定を自動化できる。このため、割り当て先の決定のためのユーザの作業を省ける。更に、情報処理装置100によれば割り当て先の判定は、式(2)~(6)で示されるように、定量による判定である。このため、例えば情報処理装置100は、割り当て先の判定のために計算した各値(例えば、式(1)~(6)に用いられる各値)を出力することで、判定の理由をユーザに対して分かり易く提示することができる。情報処理装置100による割り当て先の判定は、形式化された方法であるため、判断理由も明確である。このため、情報処理装置100は、当該判断理由をユーザに提供し、ユーザによる最終的な割り当て先の判断が円滑に行われるように支援してもよい。
【0117】
以上説明したように、情報処理装置100は例えば次の処理を実行する。
プロセッサ101は、ソースプログラムから生成された中間コード(IRコード)に基づいて、中間コードの演算に用いられるデータ間のデータ依存距離と中間コードにおけるループ制御に用いられるインデックス値の変化量であるストライド量とを取得する。プロセッサ101は、中間コードに含まれる複数の命令に対応する複数のノードを含むデータフローグラフにおける1以上の経路であって、ロード命令のノードからストア命令のノードに至る1以上の経路を特定する。プロセッサ101は、当該1以上の経路それぞれに対して、当該経路の経路長と当該経路で用いられるデータのベクトル長とに基づき、当該経路に含まれる複数のノードのうち、単位時間当たりにアクティブになるノード数を示すリソース使用率を計算する。プロセッサ101は、当該1以上の経路それぞれに対して、データ依存距離とストライド量と当該経路に対応するリソース使用率とに基づき、当該経路における各命令を並列に実行し得る演算リソースの数の指標である平均実行リソース数を計算する。プロセッサ101は、当該1以上の経路それぞれに対して計算した平均実行リソース数に基づいて、中間コードに対応する演算の割り当て先を、逐次演算を行う第1の演算器とするか、または、データ並列演算を行う第2の演算器とするかを判定する。
【0118】
これにより、情報処理装置100は、演算の割り当て先を効率的に判定できる。例えば、情報処理装置100は、中間コードに対する簡易な解析により割り当て先の演算器の判定を行うことができ、当該判定のための処理コストを低減でき、ソースプログラムのコンパイル時において演算の割り当て先を高速に判定できる。
【0119】
また、プロセッサ101は、ロード命令の対象のデータを示すインデックス値と、ストア命令の対象のデータを示すインデックス値との差分をデータ依存距離として取得する。これにより、情報処理装置100は、データ依存距離を適切に取得できる。なお、データ依存距離の候補値が複数ある場合、プロセッサ101は、複数の候補値のうちの0以外の最小値をデータ依存距離として取得してもよい。
【0120】
また、プロセッサ101は、リソース使用率の計算対象の経路について、当該経路の経路長とデータのベクトル長とに基づいて、該当の経路においてデータが出現する総ステップ数を計算する。そして、プロセッサ101は、当該経路の各ノードへデータが割り当てられる回数の総和を、総ステップ数と当該経路の総ノード数との積により割ることで、リソース使用率を計算する。
【0121】
これにより、情報処理装置100は、リソース使用率を効率的に計算できる。なお、ある経路の各ノードへデータが割り当てられる回数の総和は、ベクトルデータの経路上出現回数に相当し、より詳細には、当該データのロードからストアまでにおいて、当該データのデータ要素が各ノードに割り当てられる回数の総和であると言える。また、プロセッサ101は、データフローグラフに含まれる複数の経路の平均経路長(Lavg)と、各径路においてデータのロードからストアまでにアクティブになるノード数の、データフローグラフの階層ごとの平均値(navg)との積を求めてもよい。そして、プロセッサ101は、平均経路長(Lavg)と平均値(navg)とを、総ステップ数(P)と当該経路の総ノード数(N)との積により割ることで、リソース使用率(U)を計算してもよい。これにより、情報処理装置100は、より簡便な計算によりリソース使用率を効率的に計算できる。
【0122】
また、プロセッサ101は、データ依存距離を、リソース使用率とストライド量との積により割ることで、平均実行リソース数を計算する。これにより、情報処理装置100は、平均実行リソース数を簡便に計算できる。当該平均実行リソース数(R)の計算は、式(4)に相当する。
【0123】
プロセッサ101は、演算の割り当て先の判定では、平均実行リソース数が閾値以上である経路の数と正の実数値との第1の積が、データフローグラフにおけるロード命令の数とストア命令の数との第2の積以上であるか否かを判定してもよい。この場合、プロセッサ101は、第1の積が第2の積未満である場合、当該割り当て先を第1の演算器とすると判定する。一方、プロセッサ101は、第1の積が第2の積以上である場合、当該割り当て先を第2の演算器とすると判定する。
【0124】
これにより、情報処理装置100は、演算の割り当て先の判定を効率的に行える。なお、平均実行リソース数が閾値(r)以上である経路の数は、式(6)のΣsに相当する。また、正の実数値は、式(6)のNspawnに相当する。ロード命令の数は、式(6)のNldに相当する。ストア命令の数は、式(6)のNstに相当する。また、式(6)を判定式に用いることで、閾値(r)および正の実数値(Nspawn)の調整により、割り当て先として選択される演算器の調整も可能になる。
【0125】
更に、プロセッサ101は、割り当て先を第1の演算器と判定すると、第1の演算器に対応する実行可能コードを生成する第1のコンパイラバックエンドに対して中間コードを出力してもよい。また、プロセッサ101は、割り当て先を第2の演算器と判定すると、第2の演算器に対応する実行可能コードを生成する第2のコンパイラバックエンドに対して中間コードを出力してもよい。これにより、情報処理装置100は、コンパイラフロントエンド130からコンパイラバックエンド150,160,170,180までのエンドツーエンドのコンパイルを可能にできる。
【0126】
なお、第1の実施の形態の情報処理は、処理部12にプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、プロセッサ101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体113に記録できる。
【0127】
例えば、プログラムを記録した記録媒体113を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体113に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【0128】
10 情報処理装置
11 記憶部
11a 中間コード
12 処理部
20 データフローグラフ
21,22,23,24,25,26 ノード
S1,S2,S3,S4 ステップ
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21
図22
図23
図24
図25
図26
図27