(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-03-07
(45)【発行日】2023-03-15
(54)【発明の名称】情報処理装置及びコンパイラプログラム
(51)【国際特許分類】
G06F 8/41 20180101AFI20230308BHJP
【FI】
G06F8/41 130
(21)【出願番号】P 2019121513
(22)【出願日】2019-06-28
【審査請求日】2022-03-08
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100094525
【氏名又は名称】土井 健二
(74)【代理人】
【識別番号】100094514
【氏名又は名称】林 恒徳
(72)【発明者】
【氏名】谷村 恭伸
(72)【発明者】
【氏名】山中 栄次
(72)【発明者】
【氏名】鎌塚 俊
【審査官】坂庭 剛史
(56)【参考文献】
【文献】特開平4-211830(JP,A)
【文献】特開2001-306333(JP,A)
【文献】米国特許第6651246(US,B1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/41
(57)【特許請求の範囲】
【請求項1】
ソースコードから生成した中間言語のループに含まれる各命令間の依存関係を示す依存情報を生成し、生成した前記依存情報を行列に変換することによって第1行列を生成する情報生成部と、
生成した前記第1行列から算出した各命令間における依存度合いに基づいて、前記ループに含まれる各命令を複数のグループに振り分けるグループ振分部と、
振り分けた前記複数のグループごとに、前記ループの分割を行うループ分割部と、を有する、
ことを特徴とする情報処理装置。
【請求項2】
請求項1において、
前記情報生成部は、
前記ループに含まれる命令の組合せごとに、各組合せに含まれる命令間に依存関係があることを前記依存情報が示しているか否かを判定し、
前記命令の組合せのうち、各組合せに含まれる命令間に依存関係があることを前記依存情報が示している組合せに対応する要素を第1の値とし、前記命令の組合せのうち、各組合せに含まれる命令間に依存関係があることを前記依存情報が示していない組合せに対応する要素を第2の値とすることにより、前記第1行列の生成を行う、
ことを特徴とする情報処理装置。
【請求項3】
請求項1において、
前記グループ振分部は、異なるグループにそれぞれ含まれる命令間において存在する依存関係が少なくなるように、前記ループに含まれる各命令を複数のグループに振り分ける、
ことを特徴とする情報処理装置。
【請求項4】
請求項1において、
前記グループ振分部は、
前記第1行列から各命令間における依存度合いを示す第2行列を生成し、
生成した前記第2行列に基づいて、前記ループに含まれる各命令を前記複数のグループに振り分ける、
ことを特徴とする情報処理装置。
【請求項5】
請求項4において、
前記グループ振分部は、
前記ループに含まれる命令の組合せごとに、各組合せに含まれる命令間における依存度合いを算出し、
算出した前記依存度合いのそれぞれを要素とすることにより、前記第2行列を生成する、
ことを特徴とする情報処理装置。
【請求項6】
請求項5において、
前記グループ振分部は、Newmanアルゴリズムを用いることにより、前記依存度合いを算出する、
ことを特徴とする情報処理装置。
【請求項7】
請求項5において、
前記グループ振分部は、
前記第2行列の要素の値のうち、最大の値に対応する複数の命令の振り分け先を同じグループに決定し、
前記第2行列における前記複数の命令に対応する複数の行を、前記複数の行における同一列ごとの要素の和を要素とする単一の行に変換し、かつ、前記第2行列における前記複数の命令に対応する複数の列を、前記複数の列における同一行ごとの要素の和を要素とする単一の列に変換することによって、前記第1行列を再生成し、
再生成した前記第1行列から前記第2行列を再生成し、
前記ループに含まれる各命令の振り分け先として決定したグループの数が所定数以下になるまで、前記決定する処理と前記第1行列を再生成する処理と前記第2行列を再生成する処理とを繰り返す、
ことを特徴とする情報処理装置。
【請求項8】
請求項2において、さらに、
近接する記憶領域に格納された各データに対してアクセスを行う複数の命令が前記ループに含まれているか否かを判定する近接判定部を有し、
前記情報生成部は、前記複数の命令が前記ループに含まれているか否かの判定結果に基づいて、前記第1行列の生成を行う、
ことを特徴とする情報処理装置。
【請求項9】
請求項8において、
前記情報生成部は、前記複数の命令が前記ループに含まれていると判定した場合、前記複数の命令間に対応する要素を前記第1の値よりも大きい第3の値とすることにより、前記第1行列の生成を行う、
ことを特徴とする情報処理装置。
【請求項10】
請求項8において、
前記近接する記憶領域に格納された各データは、同一の配列である、
ことを特徴とする情報処理装置。
【請求項11】
ソースコードから生成した中間言語のループに含まれる各命令間の依存関係を示す依存情報を生成し、
生成した前記依存情報を行列に変換することによって第1行列を生成し、
生成した前記第1行列から算出した各命令間における依存度合いに基づいて、前記ループに含まれる各命令を複数のグループに振り分け、
振り分けた前記複数のグループごとに、前記ループの分割を行う、
処理をコンピュータに実行させることを特徴とするコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理装置及びコンパイラプログラムに関する。
【背景技術】
【0002】
例えば、HPC(High Performance Conputing)等に用いられるコンパイラプログラム(以下、単にコンパイラとも呼ぶ)は、ソースコードのコンパイルを行う際に、処理速度等の処理性能を向上させるための最適化処理を行う。具体的に、コンパイラは、例えば、ソースコードに含まれるループ(以下、分割対象のループとも呼ぶ)を複数のループに分割するループ分割を行う。
【0003】
これにより、コンパイラは、例えば、ハード資源不足等に起因する最適化阻害要因の発生を抑制することが可能になる。また、コンパイラは、例えば、キャッシュ効率の低下を抑制することが可能になる(例えば、特許文献1及び2参照)。
【先行技術文献】
【特許文献】
【0004】
【文献】特開2002-123563号公報
【文献】特開2009-104422号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
ここで、上記のようなコンパイラは、例えば、分割対象のループに含まれる各命令間の依存関係をそれぞれ解析し、その解析結果に基づいて各命令を複数の分割ループにそれぞれ振り分けることにより、分析対象のループの分割を行う。
【0006】
しかしながら、依存関係を解析する必要がある命令の組合せ数は、分割対象のループに含まれる命令の数に従って多くなる。そのため、分割対象のループに含まれる命令の数が膨大である場合、コンパイラは、ループ分割に多くの時間を要することになり、ソースコードのコンパイルを効率的に行うことができなくなる。
【0007】
そこで、一つの側面では、本発明は、ソースコードに含まれるループの分割を高速に行うことを可能とする情報処理装置及びコンパイラプログラムを提供することを目的とする。
【課題を解決するための手段】
【0008】
実施の形態の一態様では、ソースコードから生成した中間言語のループに含まれる各命令間の依存関係を示す依存情報を生成し、生成した前記依存情報を行列に変換することによって第1行列を生成する情報生成部と、生成した前記第1行列から算出した各命令間における依存度合いに基づいて、前記ループに含まれる各命令を複数のグループに振り分けるグループ振分部と、振り分けた前記複数のグループごとに、前記ループの分割を行うループ分割部と、を有する。
【発明の効果】
【0009】
一つの側面によれば、ソースコードに含まれるループの分割を高速に行うことを可能とする。
【図面の簡単な説明】
【0010】
【
図1】
図1は、情報処理システム10の構成について説明する図である。
【
図2】
図2は、情報処理装置1が行うコンパイル処理を説明するフローチャートである。
【
図3】
図3は、情報処理装置1のハードウエア構成を説明する図である。
【
図4】
図4は、情報処理装置1の機能のブロック図である。
【
図5】
図5は、S2の処理の概略について説明するフローチャートである。
【
図6】
図6は、S2の処理の詳細を説明するフローチャート図である。
【
図7】
図7は、S2の処理の詳細を説明するフローチャート図である。
【
図8】
図8は、S2の処理の詳細を説明するフローチャート図である。
【
図9】
図9は、中間言語22の内容を説明する具体例である。
【
図10】
図10は、依存情報131の具体例について説明する図である。
【
図11】
図11は、依存グラフ131aの具体例について説明する図である。
【
図12】
図12は、第1行列132の具体例について説明する図である。
【
図13】
図13は、第2行列133の具体例について説明する図である。
【
図14】
図14は、依存情報131の具体例について説明する図である。
【
図15】
図15は、第1行列132の具体例について説明する図である。
【
図16】
図16は、第2行列133の具体例について説明する図である。
【
図17】
図17は、依存情報131の具体例について説明する図である。
【
図18】
図18は、第1行列132の具体例について説明する図である。
【
図19】
図19は、依存グラフ131aの具体例について説明する図である。
【
図20】
図20は、分割ループの内容を説明する具体例である。
【
図21】
図21は、第2の実施の形態におけるS2の処理を説明するフローチャート図である。
【
図22】
図22は、第2の実施の形態におけるS2の処理を説明するフローチャート図である。
【
図23】
図23は、第2の実施の形態におけるS2の処理を説明するフローチャート図である。
【
図24】
図24は、依存情報131の具体例について説明する図である。
【
図25】
図25は、第1行列132の具体例について説明する図である。
【
図26】
図26は、第1行列132の具体例について説明する図である。
【
図27】
図27は、依存グラフ131aの具体例について説明する図である。
【
図28】
図28は、分割ループの内容を説明する具体例である。
【発明を実施するための形態】
【0011】
[情報処理システムの構成]
初めに、情報処理システム10の構成について説明を行う。
図1は、情報処理システム10の構成について説明する図である。
【0012】
図1に示すように、情報処理システム10は、例えば、1台以上の物理マシンからなる情報処理装置1と、情報処理装置1の内部または外部に設けられる記憶部130と、操作端末5とを含む。操作端末5は、例えば、ソースコードのコンパイルを行う作業者が使用するPC(Personal Computer)であり、ネットワークNWを介して情報処理装置1と接続する。
【0013】
情報処理装置1(情報処理装置1において動作するコンパイラ)は、コンパイルを開始するタイミング(以下、コンパイル開始タイミングとも呼ぶ)になった場合、例えば、記憶部130に記憶されたソースコード21を取得し、取得したソースコード21のコンパイルを行う処理(以下、コンパイル処理とも呼ぶ)を行うことによって中間言語22を生成し、さらに、生成した中間言語22からオブジェクトコード23を生成する。コンパイル開始タイミングは、例えば、作業者が操作端末5を介してコンパイル処理を開始する旨の指示を行ったタイミングであってよい。
【0014】
また、情報処理装置1は、オブジェクトコード23を実行するタイミング(以下、コード実行タイミングとも呼ぶ)になった場合、記憶部130に記憶されたオブジェクトコード23を取得し、コンパイル処理によって生成されたオブジェクトコード23を実行する処理(以下、コード実行処理とも呼ぶ)を行う。以下、情報処理装置1が行うコンパイル処理及びコード実行処理について説明を行う。
【0015】
[情報処理装置によるコンパイル処理]
初めに、情報処理装置1が行うコンパイル処理について説明を行う。
図2は、情報処理装置1が行うコンパイル処理を説明するフローチャートである。
【0016】
情報処理装置1は、
図2に示すように、ソースコード21の字句解析及び構文解析を行うことにより、中間言語22を生成する(S1)。そして、情報処理装置1は、例えば、生成した中間言語22を情報格納領域130に記憶する。
【0017】
その後、情報処理装置1は、S1の処理において生成された中間言語22の最適化を行う(S2)。具体的に、情報処理装置1は、中間言語22に含まれるループのそれぞれに対して、ループ分割等の処理を行う。
【0018】
続いて、情報処理装置1は、例えば、S1で最適化を行った中間言語22からオブジェクトコード23の生成を行う(S3)。そして、情報処理装置1は、例えば、生成したオブジェクトコード23を記憶部130に記憶する。
【0019】
ここで、
図2で説明したS2の処理を行う場合、情報処理装置1は、例えば、ループに含まれる各命令間の依存関係をそれぞれ解析し、その解析結果に基づいて各命令を複数の分割ループにそれぞれ振り分けることにより、分析対象のループの分割を行う。
【0020】
しかしながら、依存関係を解析する必要がある命令の組合せ数は、分割対象のループに含まれる命令の数に従って多くなる。そのため、例えば、分割対象のループに含まれる命令の数が膨大である場合、情報処理装置1は、ループ分割に多くの時間を要することになり、ソースコードのコンパイルを効率的に行うことができなくなる。
【0021】
そこで、本実施の形態における情報処理装置1は、ソースコード21から生成した中間言語22のループに含まれる各命令間の依存関係を示す情報(以下、依存情報とも呼ぶ)を生成し、生成した依存情報を変換することによって行列(以下、第1行列とも呼ぶ)を生成する。
【0022】
そして、情報処理装置1は、生成した第1行列から算出した各命令間における依存度合いに基づいて、ループに含まれる各命令を複数のグループに振り分け、振り分けたグループごとにループの分割を行う。
【0023】
すなわち、本実施の形態における情報処理装置1は、依存情報から生成された第1行列を用いる演算を行うことで、分割対象のループに含まれる命令の組合せごとの依存関係の解析等を行うことなく、各命令の振り分け先を決定する。
【0024】
これにより、情報処理装置1は、ループ分割を効率的に行うことが可能になり、ソースコード21のコンパイルに要する時間を短縮することが可能になる。
【0025】
また、情報処理装置1は、分割対象のループに含まれる各命令の振り分け先を計算によって決定することで、異なる分割ループに含まれる命令間の依存関係が最も疎になるループ分割の方法を特定することが可能になる。そのため、情報処理装置1は、特定した方法に従ってループの分割を行うことにより、ソースコード21から生成されるオブジェクトコード23の実行時間についても短縮させることが可能になる。
【0026】
[情報処理システムのハードウエア構成]
次に、情報処理システム10のハードウエア構成について説明する。
図3は、情報処理装置1のハードウエア構成を説明する図である。
【0027】
情報処理装置1は、
図3に示すように、プロセッサであるCPU101と、メモリ102と、外部インターフェース(I/Oユニット)103と、記憶媒体104とを有する。各部は、バス105を介して互いに接続される。
【0028】
記憶媒体104は、例えば、コンパイル処理を行うためのプログラム110(コンパイラ)を記憶するプログラム格納領域(図示しない)を有する。また、記憶媒体104は、例えば、コンパイル処理を行う際に用いられる情報を記憶する記憶部130(以下、情報格納領域130とも呼ぶ)を有する。なお、記憶媒体104は、例えば、HDD(Hard Disk Drive)やSSD(Sokid State Drive)であってよい。
【0029】
CPU101は、記憶媒体104からメモリ102にロードされたプログラム110を実行してコンパイル処理を行う。
【0030】
また、外部インターフェース103は、例えば、操作端末5と通信を行う。
【0031】
[情報処理システムの機能]
次に、情報処理システム10の機能について説明を行う。
図4は、情報処理装置1の機能のブロック図である。
【0032】
情報処理装置1は、
図4に示すように、例えば、CPU101やメモリ102等のハードウエアとプログラム110とが有機的に協働することにより、分割判定部111と、情報生成部112と、情報管理部113と、グループ振分部114と、ループ分割部115と、近接判定部116とを含む各種機能を実現する。
【0033】
また、情報処理装置1は、例えば、
図4に示すように、依存情報131と、第1行列132と、第2行列133とを情報格納領域130に記憶する。
【0034】
分割判定部111は、例えば、ソースコード21から生成した中間言語22に含まれる各ループについてループ分割を行うか否かを判定する。具体的に、分割判定部111は、例えば、実行時に用いられるレジスタ数やストリーム数がCPU101のレジスタ数やストリーム数を超えるループが中間言語22に含まれている場合、そのループについてループ分割を行う旨の判定を行う。
【0035】
情報生成部112は、分割対象のループに含まれる各命令間の依存関係を示す依存情報131を生成する。具体的に、情報生成部112は、分割判定部111がループ分割を行う旨の判定を行ったループが存在する場合、そのループに対応する依存情報131を生成する。また、情報生成部112は、生成した依存情報131を行列に変換することによって第1行列132を生成する。
【0036】
情報管理部113は、例えば、情報生成部112が生成した依存情報131や第1行列132を情報格納領域130に記憶する。
【0037】
グループ振分部114は、情報生成部112が生成した第1行列132から算出した各命令間における依存度合いに基づいて、分割対象のループに含まれる各命令を複数のグループに振り分ける。
【0038】
ループ分割部115は、グループ振分部114が振り分けたグループごとに、分割対象のループについてのループ分割を行う。
【0039】
近接判定部116は、例えば、メモリ102内において近接するアドレスに格納された各データに対してアクセスを行う複数の命令が分割対象のループに含まれているか否かを判定する。
【0040】
そして、例えば、メモリ102内において近接するアドレスに格納された各データに対してアクセスを行う複数の命令が分割対象のループに含まれていると近接判定部116が判定した場合、情報生成部112は、分割対象のループに含まれる各命令間の依存関係と、各命令がアクセスするデータのメモリ102内における位置関係とに対応する依存情報131を生成する。第2行列133の説明については後述する。
【0041】
[第1の実施の形態の概略]
次に、第1の実施の形態の概略について説明する。具体的に、
図2で説明したS2の処理の概略について説明する。
図5は、S2の処理の概略について説明するフローチャートである。
【0042】
情報処理装置1の情報生成部112は、ソースコード21から生成した中間言語22のループに含まれる各命令間の依存関係を示す依存情報131を生成する(S11)。
【0043】
そして、情報生成部112は、S11の処理で生成した依存情報131を行列に変換することによって第1行列132を生成する(S12)。
【0044】
続いて、情報処理装置1のグループ振分部114は、S12の処理で生成した第1行列132から算出した各命令間の依存度合いに基づいて、分割対象のループに含まれる各命令を複数のグループに振り分ける(S13)。
【0045】
その後、情報処理装置のループ分割部115は、S13の処理で振り分けたグループごとに、分割対象のループの分割を行う(S14)。
【0046】
これにより、情報処理装置1は、ループ分割を効率的に行うことが可能になり、ソースコード21のコンパイルに要する時間を短縮することが可能になる。
【0047】
また、情報処理装置1は、分割対象のループに含まれる各命令の振り分け先を計算によって決定することで、異なる分割ループに含まれる命令間の依存関係が最も疎になるループ分割の方法を特定することが可能になる。そのため、情報処理装置1は、特定した方法に従ってループの分割を行うことにより、ソースコード21から生成されるオブジェクトコード23の実行時間についても短縮させることが可能になる。
【0048】
[第1の実施の形態の詳細]
次に、第1の実施の形態の詳細について説明する。
図6から
図9は、
図2で説明したS2の処理の詳細を説明するフローチャート図である。また、
図9から
図20は、S2の処理の詳細を説明する図である。
【0049】
情報処理装置1の分割判定部111は、
図6に示すように、情報格納領域130に記憶された中間言語22に、分割対象のループが含まれているか否かを判定する(S21)。以下、中間言語22の具体例について説明を行う。
【0050】
[中間言語の具体例]
図9は、中間言語22の内容を説明する具体例である。具体的に、
図9は、ソースコード21をアセンブラ命令相当で表現した場合の中間言語22を説明する具体例である。
【0051】
図9に示す中間言語22は、変数reg_iに初期値として1を設定することを示す命令である「mov reg_i,1」と、ループの開始位置を示すラベルである「LABEL1:」とを含む。
【0052】
また、
図9に示す中間言語22は、配列Aのreg_i番目に格納されている値を変数reg1に設定することを示す命令である「load reg1,mem“A(reg_i)”」と、配列Bのreg_i番目に格納されている値を変数reg2に設定することを示す命令である「load reg2,mem“B(reg_i)”」とを含む。
【0053】
また、
図9に示す中間言語22は、変数reg1に設定されている値と変数reg2に設定されている値とを加算することによって算出した値を、変数reg3に設定することを示す命令である「add reg3,reg1,reg2」と、配列Cのreg_i番目に格納されている値を変数reg4に設定することを示す命令である「load reg4,mem“C(reg_i)”」とを含む。
【0054】
また、
図9に示す中間言語22は、配列Dのreg_i番目に格納されている値を変数reg5に設定することを示す命令である「load reg5,mem“D(reg_i)”」と、配列Cのreg_i+10番目に格納されているデータを変数reg6に設定することを示す命令である「load reg6,mem“C(reg_i+10)”」とを含む。
【0055】
また、配列Eのreg_i番目に格納されている値を変数reg7に設定することを示す命令である「load reg7,mem“E(reg_i)”」と、変数reg3に設定されている値と変数reg4に設定されている値とを加算することによって算出した値を、変数reg8に設定することを示す命令である「add reg8,reg3,reg4」とを含む。
【0056】
また、
図9に示す中間言語22は、変数reg4に設定されている値と変数reg8に設定されている値とを加算することによって算出した値を、変数reg9に設定することを示す命令である「add reg9,reg4,reg8」と、変数reg3に設定されている値と変数reg5に設定されている値とを乗算することによって算出した値に、変数reg9に設定されている値を加算することによって算出した値を、変数reg10に設定に設定することを示す命令である「madd reg10,reg3,reg5,reg9」とを含む。
【0057】
また、
図9に示す中間言語22は、変数reg5に設定されている値と変数reg6に設定されている値とを乗算することによって算出した値に、変数reg10に設定されている値を加算することによって算出した値を、変数reg11に設定することを示す命令である「madd reg11,reg5,reg6,reg10」と、変数reg7に設定されている値と変数reg11に設定されている値とを加算することによって算出した値を、変数reg12に設定することを示す命令である「add reg12,reg7,reg11」とを含む。
【0058】
また、
図9に示す中間言語22は、変数reg12に設定されている値を配列Fのreg_i番目に格納することを示す命令である「store mem“F(reg_i)”,reg12」と、変数reg_iに設定されている値に1を加算することによって算出した値を、変数reg_iに設定することを示す命令である「add reg_i,reg_i,1」とを含む。
【0059】
さらに、
図9に示す中間言語22は、変数reg_iに設定されている値と100とを比較することを示す命令である「cmp reg_i,100」と、変数reg_iに設定されている値が100以下である場合、ループの開始位置を示す「LABEL1:」に分岐し、変数reg_iに設定されている値が100を上回る場合、ループを終了することを示す命令である「ble icc,LABAL1」とを含む。
【0060】
なお、以下、
図9に示す中間言語22において各命令の左端に記載されている番号を、各命令の命令番号とも呼ぶ。また、以下、命令番号が「1」から「13」である命令のそれぞれを命令1から命令13とも呼ぶ。
【0061】
図6に戻り、情報格納領域130に記憶された中間言語22に、分割対象のループが含まれている場合(S22のYES)、情報処理装置1の情報生成部112は、S21の処理で分割対象のループであると判定したループに含まれる各命令間の依存関係を示す依存情報131を生成する(S23)。以下、依存情報131の具体例について説明を行う。
【0062】
[依存情報の具体例]
図10は、依存情報131の具体例について説明する図である。
【0063】
図10に示す依存情報131は、中間言語22に含まれる各命令の命令番号が記憶される「命令番号」と、各命令と依存関係にある命令の命令番号についてのリストである「データ依存リスト」と、各命令が含まれるグループ(分割ループ)の名称が記憶される「グループ名」とを項目として有する。
【0064】
具体的に、
図9で説明した中間言語22において、命令1で値が設定された変数reg1は、命令3のみにおいて参照されている。そのため、情報生成部112は、例えば、
図10に示すように、「命令番号」が「1」である情報の「データ依存リスト」に「3」を記憶する。
【0065】
また、
図9で説明した中間言語22において、命令2で値が設定された変数reg2は、命令3のみにおいて参照されている。そのため、情報生成部112は、例えば、
図10に示すように、「命令番号」が「2」である情報の「データ依存リスト」に「3」を記憶する。
【0066】
さらに、
図9で説明した中間言語22において、命令3は、命令1で値が設定された変数reg1と命令2で値が設定された変数reg2とを参照している。また、
図9で説明した中間言語22において、命令3で値が設定された変数reg3は、命令8及び命令10において参照されている。そのため、情報生成部112は、例えば、
図10に示すように、「命令番号」が「3」である情報の「データ依存リスト」に「1」、「2」、「8」及び「10」を記憶する。
【0067】
また、情報生成部112は、例えば、
図10に示すように、各命令に対応する「グループ名」の初期値として各命令の命令番号を記憶する。
図10に含まれる他の情報についての説明は省略する。
【0068】
なお、情報生成部112は、S23の処理において、依存情報131に含まれる内容に対応する依存グラフ131aを生成するものであってもよい。以下、依存グラフ131aの具体例について説明を行う。
【0069】
[依存グラフの具体例(1)]
図11は、依存グラフ131aの具体例について説明する図である。以下、双方向の関係を示すエッジを双方向エッジとも呼び、単方向の関係を示すエッジを単方向エッジとも呼ぶ。
【0070】
具体的に、
図11に示す依存グラフ131aでは、命令1に対応するノードと命令3に対応するノードとの間、命令2に対応するノードと命令3に対応するノードとの間、命令3に対応するノードと命令8に対応するノードとの間、命令3に対応するノードと命令10に対応するノードとの間、及び、命令4に対応するノードと命令8に対応するノードとの間のそれぞれに双方向エッジが設定されている。また、
図11に示す依存グラフ131aでは、命令4に対応するノードと命令9に対応するノードとの間、命令5に対応するノードと命令10に対応するノードとの間、命令5に対応するノードと命令11に対応するノードとの間、命令6に対応するノードと命令11に対応するノードとの間、及び、命令7に対応するノードと命令12に対応するノードとの間のそれぞれに双方向エッジが設定されている。さらに、
図11に示す依存グラフ131aでは、命令8に対応するノードと命令9に対応するノードとの間、命令9に対応するノードと命令10に対応するノードとの間、命令10に対応するノードと命令11に対応するノードとの間、命令11に対応するノードと命令12に対応するノードとの間、及び、命令12に対応するノードと命令13に対応するノードとの間のそれぞれに双方向エッジが設定されている。すなわち、
図11に示す依存グラフ131aには、15本の双方向エッジが設定されている。
【0071】
図10で説明した依存情報131において、例えば、「命令番号」が「1」である情報の「データ依存リスト」には、「3」が記憶されており、「命令番号」が「3」である情報の「データ依存リスト」には、「1」が記憶されている。そのため、情報生成部112は、例えば、
図11に示すように、命令1に対応するノードと命令3に対応するノードとの間に双方向エッジを設定する。
【0072】
また、
図10で説明した依存情報131において、例えば、「命令番号」が「2」である情報の「データ依存リスト」には、「3」が記憶されており、「命令番号」が「3」である情報の「データ依存リスト」には、「2」が記憶されている。そのため、情報生成部112は、例えば、
図11に示すように、命令2に対応するノードと命令3に対応するノードとの間に双方向エッジを設定する。
【0073】
さらに、
図10で説明した依存情報131において、例えば、「命令番号」が「3」である情報の「データ依存リスト」には、「8」が記憶されており、「命令番号」が「8」である情報の「データ依存リスト」には、「3」が記憶されている。そのため、情報生成部112は、例えば、
図11に示すように、命令3に対応するノードと命令8に対応するノードとの間に双方向エッジを設定する。
図11に含まれる他の情報についての説明は省略する。
【0074】
図6に戻り、情報生成部112は、S23の処理で生成した依存情報131を行列に変換することによって第1行列132を生成する(S24)。以下、第1行列132の具体例について説明を行う。
【0075】
[第1行列の具体例]
図12は、第1行列132の具体例について説明する図である。
【0076】
図12に示す第1行列132において、「1」から「13」のそれぞれに対応する行は、命令1から命令13のそれぞれに対応する行であり、「1」から「13」のそれぞれに対応する列は、命令1から命令13のそれぞれに対応する列である。また、
図12に示す第1行列132の各要素(各欄)には、行に対応する命令と列に対応する命令との間に依存関係が存在することを示す値である「1」、または、行に対応する命令と列に対応する命令との間に依存関係が存在しないことを示す値である「0」が記憶される。
【0077】
具体的に、
図10に示す依存情報131において、「命令番号」が「1」である情報の「データ依存リスト」には、「3」が記憶されている。そのため、情報生成部112は、
図12に示すように、例えば、命令1に対応する行に含まれる欄のうち、命令3に対応する列に含まれる欄に「1」を記憶する。
【0078】
また、
図10に示す依存情報131において、「命令番号」が「2」である情報の「データ依存リスト」には、「3」が記憶されている。そのため、情報生成部112は、
図12に示すように、例えば、命令2に対応する行に含まれる欄のうち、命令3に対応する列に含まれる欄に「1」を記憶する。
【0079】
さらに、
図10に示す依存情報131において、「命令番号」が「3」である情報の「データ依存リスト」には、「1」、「2」、「8」及び「10」が記憶されている。そのため、情報生成部112は、
図12に示すように、例えば、命令3に対応する行に含まれる欄のうち、命令1に対応する列に含まれる欄と、命令2に対応する列に含まれる欄と、命令8に対応する列に含まれる欄と、命令10に対応する列に含まれる欄とのそれぞれに「1」を記憶する。
図12に含まれる他の情報についての説明は省略する。
【0080】
図6に戻り、情報処理装置1のグループ振分部114は、S24の処理で生成した第1行列132から、各命令間における依存度合いを示す第2行列133を生成する(S25)。以下、第2行列の具体例について説明を行う。
【0081】
[第2行列の具体例]
図13は、第2行列133の具体例について説明する図である。
【0082】
図13に示す第2行列133において、「1」から「13」のそれぞれに対応する行は、命令1から命令13のそれぞれに対応する行であり、「1」から「13」のそれぞれに対応する列は、命令1から命令13のそれぞれに対応する列である。また、
図13に示す第2行列133の各要素(各欄)には、行に対応する命令と列に対応する命令との間の依存度合いが記憶される。
【0083】
ここで、各命令間の依存度合いは、例えば、Newmanアルゴリズムによって算出されるクラスタリング指標値であってよい。この場合、グループ振分部114は、例えば、以下の式1を用いることによってクラスタリング指標値ΔQを算出する。
【0084】
ΔQ=eij+eji-2aiaj=2(eij-aiaj) (式1)
【0085】
上記の式1において、変数a
iは、
図11で説明した依存グラフ131aに含まれる単方向エッジのうち、命令iに対応するノードと他の命令に対するノードとの間における単方向エッジの数の割合を示し、変数a
jは、
図11で説明した依存グラフ131aに含まれる単方向エッジのうち、命令jに対応するノードと他の命令に対するノードとの間における単方向エッジの数の割合を示す。また、式1において、変数e
ijは、
図11で説明した依存グラフ131aに含まれる単方向エッジのうち、命令iに対応するノードと命令jに対応するノードとの間における単方向エッジの数の割合を示す。
【0086】
具体的に、
図11で説明した依存グラフ131aが示す状態は、双方向エッジが15本含まれている状態であり、単方向エッジが30本含まれている場合と同じ状態である。また、
図11で説明した依存グラフ131aにおいて、命令12に対応するノードと他のノードとの間における単方向エッジの数、命令13に対応するノードと他のノードとの間における単方向エッジの数及び命令12に対応するノードと命令13に対応するノードとの間における単方向エッジの数は、それぞれ3本、1本及び1本である。そのため、グループ振分部114は、例えば、命令iが命令12であって命令jが命令13である場合、以下の式(2)のように、クラスタリング指標値ΔQとして「0.060」を算出する。
【0087】
2*((1/30)-(3/30)*(1/30))=0.06 ・・・(式2)
【0088】
そのため、グループ振分部114は、
図13に示すように、例えば、命令12に対応する行に含まれる欄のうち、命令13に対応する列に含まれる欄に「0.060」を記憶する。
【0089】
なお、命令iが命令13であって命令jが12である場合のクラスタリング指標値ΔQは、命令iが命令12であって命令jが13である場合のクラスタリング指標値ΔQと同じ値になる。そのため、グループ振分部114は、例えば、命令iが命令12であって命令jが13である場合のクラスタリング指標値ΔQについての算出を行った場合、命令iが命令13であって命令jが12である場合のクラスタリング指標値ΔQについての算出を行わないものであってもよい。そして、グループ振分部114は、この場合、
図13に示すように、命令13に対応する行に含まれる欄のうち、命令12に対応する列に含まれる欄に、クラスタリング指標値ΔQの算出を行っていないことを示す値である「0.000」を記憶するものであってよい。
図13に含まれる他の情報についての説明は省略する。
【0090】
図7に戻り、グループ振分部114は、S25の処理で生成した第2行列133の要素の値のうち、最大の値に対応する各命令の振り分け先を同じグループに決定する(S31)。
【0091】
具体的に、
図13で説明した第2行列133において、命令12に対応する行に含まれる欄のうち、命令13に対応する列に含まれる欄と、命令7に対応する行に含まれる欄のうち、命令12に対応する列に含まれる欄とのそれぞれには、最大の値である「0.060」が設定されている。そのため、グループ振分部114は、
図13で説明した第2行列133の各要素に対応する命令の組合せのうち、命令12及び命令13の組合せまたは命令7及び命令12の組合せを特定する。そして、グループ振分部114は、例えば、命令12及び命令13の組合せを特定した場合、命令12と命令13とを同じグループに振り分ける旨の決定を行う。
【0092】
そして、グループ振分部114は、S25の処理で生成した第2行列133またはS33の処理(後述する処理)で再生成した第2行列133における行のうち、S31の処理で振り分け先を決定した各命令に対応する複数の行を、その複数の行における同一列ごとの要素の和を要素とする単一の行に変換し、S25の処理で生成した第2行列133またはS33の処理で再生成した第2行列133における列のうち、S31の処理で振り分け先を決定した各命令に対応する複数の列を、その複数の列における同一行ごとの要素の和を要素とする単一の列に変換することにより、第1行列132を再生成する(S32)。
【0093】
具体的に、グループ振分部114は、例えば、S31の処理における決定結果に基づいて依存情報131を更新する。そして、グループ振分部114は、例えば、更新した依存情報131を参照することによって第1行列132の再生成を行う。以下、S32の処理の具体例について説明を行う。
【0094】
[S32の処理の具体例]
図14及び
図15は、S32の処理の具体例を説明する図である。
【0095】
例えば、S31の処理で同じグループに振り分けることを決定した各命令が命令12及び命令13である場合、グループ振分部114は、
図14に示すように、「命令番号」が「13」である情報の「グループ名」に記憶された値を、「命令番号」が「12」である情報の「グループ名」に記憶された値である「12」に更新するように、依存情報131を更新する。
【0096】
その後、グループ振分部114は、例えば、
図15に示すように、命令12に対応する行に含まれる欄に、命令12に対応する行に含まれる欄に設定されている値と、命令13に対応する行に含まれる欄に設定されている値とを同一列ごとに加算することによって算出した値をそれぞれ記憶する。また、グループ振分部114は、例えば、
図15に示すように、命令12に対応する列に含まれる欄に、命令12に対応する列に含まれる欄に設定されている値と、命令13に対応する列に含まれる欄に設定されている値とを同一行ごとに加算することによって算出した値をそれぞれ記憶する。
【0097】
具体的に、
図12で説明した第1行列132において、例えば、命令12に対応する行に含まれる欄のうち、命令7に対応する列に含まれる欄には、「1」が記憶されており、命令13に対応する行に含まれる欄のうち、命令7に対応する列に含まれる欄には、「0」が記憶されている。そのため、グループ振分部114は、
図15に示すように、例えば、命令12に対応する行に含まれる欄のうち、命令7に対応する列に含まれる欄に、「1」及び「0」の和である「1」を記憶する。
【0098】
また、
図12で説明した第1行列132において、例えば、命令11に対応する行に含まれる欄のうち、命令12に対応する列に含まれる欄には、「1」が記憶されており、命令11に対応する行に含まれる欄のうち、命令13に対応する列に含まれる欄には、「0」が記憶されている。そのため、グループ振分部114は、
図15に示すように、例えば、命令11に対応する行に含まれる欄のうち、命令12に対応する列に含まれる欄に、「1」及び「0」の和である「1」を記憶する。
【0099】
さらに、
図12で説明した第1行列132において、例えば、命令12に対応する行に含まれる欄のうち、命令12に対応する列に含まれる欄には、「0」が記憶されており、命令12に対応する行に含まれる欄のうち、命令13に対応する列に含まれる欄には、「1」が記憶されており、命令13に対応する行に含まれる欄のうち、命令12に対応する列に含まれる欄には、「1」が記憶されており、命令13に対応する行に含まれる欄のうち、命令13に対応する列に含まれる欄には、「0」が記憶されている。そのため、グループ振分部114は、
図15に示すように、例えば、命令12に対応する行に含まれる欄のうち、命令12に対応する列に含まれる欄に、「0」、「1」、「1」及び「0」の和である「2」を記憶する。
図15に含まれる他の情報についての説明は省略する。
【0100】
図7に戻り、グループ振分部114は、S32の処理で再生成した第1行列132から第2行列133を再生成する(S33)。
【0101】
具体的に、グループ振分部114は、例えば、
図15で説明した第1行列132に対してS25の処理と同じ処理を行うことにより、
図16に示す第2行列133を生成(再生成)する。
【0102】
そして、グループ振分部114は、S21の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達したか否かを判定する(S34)。
【0103】
具体的に、
図14で説明した依存情報131の「グループ名」には、「1」から「12」までの値(12種類の値)が記憶されている。そのため、グループ振分部114は、この場合、S21の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数として「12」を特定する。そして、例えば、S34の処理における所定数が「2」である場合、グループ振分部114は、S21の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達していないと判定する。
【0104】
一方、
図17に示す依存情報131の「グループ名」には、「1」及び「5」のみ(2種類の値)が記憶されている。そのため、グループ振分部114は、この場合、S21の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数として「2」を特定する。そして、例えば、S34の処理における所定数が「2」である場合、グループ振分部114は、S21の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達したと判定する。
【0105】
なお、グループ振分部114は、
図17に示す依存情報131を生成したことに応じて、例えば、
図18に示す第1行列132の生成を行う。また、グループ振分部114は、
図17に示す依存情報131を生成したことに応じて、例えば、
図19に示す依存グラフ131aを生成する。以下、
図19に示す依存グラフ131aの具体例について説明を行う。
【0106】
[依存グラフの具体例(2)]
図19に示す依存グラフ131aにおいて、命令1、命令2、命令3、命令4、命令8及び命令9のそれぞれに対応するノード群と、命令5、命令6、命令7、命令10、命令11、命令12及び命令13のそれぞれに対応するノード群とは、それぞれ異なるグループに含まれている。
【0107】
そして、
図19に示す依存グラフ131aにおいて、命令1に対応するノードを含むグループと、命令5に対応するノードを含むグループとの間には、命令3に対応するノードと命令10に対応するノードとの間のエッジと、命令9に対応するノードと命令10に対応するノードとの間のエッジとが設定されている。
【0108】
すなわち、
図19に示す依存グラフ131aは、命令1、命令2、命令3、命令4、命令8及び命令9が一方の分割ループに含まれ、かつ、命令5、命令6、命令7、命令10、命令11、命令12及び命令13が他方の分割ループに含まれるようにループ分割を行った場合、異なる分割ループのそれぞれに含まれる命令間におけるエッジの数を2本に抑えることが可能になることを示している。
【0109】
図9に戻り、S21の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達したと判定した場合(S41のYES)、情報処理装置1のループ分割部115は、S33の処理で生成された第2行列133の内容に従って、S21の処理で分割対象であると判定したループのループ分割を行う(S42)。
【0110】
その後、情報処理装置1は、S2の処理を終了する。なお、情報処理装置1は、情報格納領域130に記憶された中間言語22に、分割対象のループが含まれていないと判定した場合も同様に(S22のNO)、S2の処理を終了する。
【0111】
一方、S21の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達していないと判定した場合(S41のNO)、グループ振分部114は、S32以降の処理を再度行う。以下、ループ分割を行った後の分割ループの具体例について説明を行う。
【0112】
[分割ループの具体例]
図20は、分割ループの内容を説明する具体例である。
図20(A)は、分割ループのうちの一方を説明する具体例であり、
図20(B)は、分割ループのうちの他方を説明する具体例である。
【0113】
図20(A)に示す分割ループには、
図9で説明した中間言語のうち、命令1、命令2、命令3、命令4、命令8及び命令9が含まれている。
【0114】
そして、
図20(A)に示す分割ループは、命令1等の後に、変数reg3に設定された値を、配列tmp_array1のreg_i番目に格納することを示す命令である「store tmp_array1(reg_i),reg3」と、変数reg9に設定された値を、配列tmp_array2のreg_i番目に格納することを示す命令である「store tmp_array2(reg_i),reg9」とを含む。
【0115】
一方、
図20(B)に示す分割ループには、
図9で説明した中間言語のうち、命令5、命令6、命令7、命令10、命令11、命令12及び命令13が含まれている。
【0116】
そして、
図20(B)に示す分割ループは、命令5等の前に、配列tmp_array1のreg_i番目に格納されている値を変数reg3に設定することを示す命令である「load reg3,tmp_array1(reg_i)」と、配列tmp_array2のreg_i番目に格納されている値を変数reg9に設定することを示す命令である「load reg9,tmp_array2(reg_i)」とを含む。
【0117】
すなわち、
図19で説明したように、変数reg3に設定された値(命令3に対応する値)、及び、変数reg9に設定された値(命令9に対応する値)は、
図20(B)に示す分割ループに含まれる命令10において参照される。そのため、
図20(A)に示す分割ループには、変数reg3に設定された値及び変数reg9に設定された値を一時配列に格納する命令が含まれている。また、
図20(B)に示す分割ループには、一時配列に格納されている値を取り出す命令が含まれている。
【0118】
このように、本実施の形態における情報処理装置1は、ソースコード21から生成した中間言語22のループに含まれる各命令間の依存関係を示す依存情報131を生成し、生成した依存情報131を行列に変換することによって第1行列132を生成する。
【0119】
そして、情報処理装置1は、生成した第1行列132から算出した各命令間における依存度合いに基づいて、ループに含まれる各命令を複数のグループに振り分け、振り分けたグループごとにループの分割を行う。
【0120】
すなわち、本実施の形態における情報処理装置1は、依存情報131から生成された第1行列132を用いた演算を行うことで、分割対象のループに含まれる命令の組合せごとの依存関係の解析等を行うことなく、各命令の振り分け先を決定する。
【0121】
これにより、情報処理装置1は、ループ分割を効率的に行うことが可能になり、ソースコード21のコンパイルに要する時間を短縮することが可能になる。
【0122】
また、情報処理装置1は、分割対象のループに含まれる各命令の振り分け先を計算によって決定することで、異なる分割ループに含まれる命令間の依存関係が最も疎になるループ分割の方法を特定することが可能になる。そのため、情報処理装置1は、特定した方法に従ってループの分割を行うことにより、ソースコード21から生成されるオブジェクトコード23の実行時間についても短縮させることが可能になる。
【0123】
なお、情報処理装置1は、S21及びS22の処理において、情報格納領域130に記憶された中間言語22に分割対象のループが複数含まれていると判定した場合、S23以降の処理を分割対象のループごとに行うものであってよい。
【0124】
また、情報処理装置1は、S25に処理においてクラスタリング指標値を算出する場合、Newmanアルゴリズム以外のアルゴリズム(例えば、ラベル伝搬法やK-means法等のアルゴリズム)を用いるものであってもよい。
【0125】
[第2の実施の形態]
次に、第2の実施の形態の詳細について説明する。
図21から
図23は、第2の実施の形態におけるS2の処理を説明するフローチャート図である。また、
図24から
図28は、第2の実施の形態におけるS2の処理の詳細を説明する図である。
【0126】
第2の実施の形態におけるコンパイル処理は、第1の実施の形態におけるコンパイル処理と異なり、各命令がアクセスするデータのメモリ102内における位置関係についても参照してループの分割を行う。
【0127】
分割判定部111は、
図21に示すように、情報格納領域130に記憶された中間言語22に、分割対象のループが含まれるか否かを判定する(S51)。
【0128】
そして、情報格納領域130に記憶された中間言語22に、分割対象のループが含まれていると判定した場合(S52のYES)、情報処理装置1の近接判定部116は、例えば、メモリ102内において近接するアドレスに格納された各データに対してアクセスを行う複数の命令が分割対象のループに含まれているか否かを判定する(S53)。
【0129】
具体的に、近接判定部116は、例えば、同一の配列に格納された各データに対してアクセスを行う複数の命令が同一の分割対象のループに含まれているか否かを判定する。
【0130】
すなわち、オブジェクトコード23の実行時において、例えば、第1命令の実行に伴って第1配列の第1データに対するアクセスが発生する場合、CPU101は、メモリ102に格納されている第1配列の各データを含む所定サイズのデータをキャッシュメモリ(図示しない)に一時的に格納し、キャッシュメモリに格納した第1データに対してアクセスを行う。
【0131】
そして、例えば、第1命令と異なる第2命令の実行に伴って第1配列の第2データに対するアクセスが発生する場合、CPU101は、第1配列の各データがキャッシュメモリにまだ格納されていれば、キャッシュメモリに格納されている第2データに対してアクセスを行う。一方、他のデータに対するアクセスの発生等に伴って第1配列の各データがキャッシュメモリから既に追い出されている場合、CPU101は、メモリ102に格納されている第1配列の各データを含む所定サイズのデータをキャッシュメモリに再度に格納し、キャッシュメモリに格納した第2データに対してアクセスを行う。
【0132】
そのため、情報処理装置1は、例えば、上記のような第1命令及び第2命令が分割対象のループに含まれている場合、第1命令と第2命令が同じ分割ループに含まれるようにループ分割を行い、第1命令の実行タイミングと第2命令の実行タイミングとを近接させる。
【0133】
これにより、情報処理装置1は、分割対象のループの実行中に第1データがキャッシュメモリから追い出される確率を抑えることが可能になる。そのため、情報処理装置1は、第1データをキャッシュメモリに再格納する処理の発生頻度を抑えることが可能になり、オブジェクトコード23の実行時間を短縮させることが可能になる。
【0134】
したがって、近接判定部116は、S53の処理において、例えば、分割対象のループに含まれる命令から、同一の配列に含まれる各データに対してアクセスを行う複数の命令の特定を行う。
【0135】
なお、近接判定部116は、例えば、ある配列に含まれるデータのうち、所定の回転数に対応する範囲内のデータに対してアクセスを行う複数の命令の特定を行うものであってもよい。
【0136】
図21に戻り、情報生成部112は、S51の処理で分割対象であると判定したループに含まれる各命令間の依存関係と、各命令がアクセスするデータのメモリ102内における位置関係とを示す依存情報131を生成する(S54)。
【0137】
[依存情報の具体例]
図24は、依存情報131の具体例について説明する図である。
【0138】
図24に示す依存情報131は、
図10で説明した依存情報131が有する項目に加え、メモリ102内における近接したアドレスに格納された各データに対してアクセスを行う複数の命令の命令番号についてのリストである「キャッシュ共有依存リスト」を項目として有する。
【0139】
具体的に、
図9で説明した中間言語22において、配列Cに格納されているデータは、命令4及び命令6のそれぞれにおいて参照されている。そのため、情報生成部112は、例えば、
図24に示すように、「命令番号」が「4」である情報の「キャッシュ共有依存リスト」に「6」を記憶し、「命令番号」が「6」である情報の「キャッシュ共有依存リスト」に「4」を記憶する。また、情報生成部112は、この場合、例えば、
図24に示すように、「命令番号」が「4」及び「6」以外である情報の「キャッシュ共有依存リスト」に、情報が存在しないことを示す「-」を記憶する。
【0140】
図21に戻り、情報生成部112は、S54の処理で生成した依存情報131を行列に変換することによって第1行列132を生成する(S55)。以下、第1行列132の具体例について説明を行う。
【0141】
[第1行列の具体例]
図25は、第1行列132の具体例について説明する図である。
【0142】
図25に示す第1行列132の各要素(各欄)には、行に対応する命令と列に対応する命令との間に依存関係が存在することを示す値である「1」、行に対応する命令及び列に対応する命令のそれぞれがアクセスするデータのメモリ102内における位置が近接していることを示す値である「5」、または、行に対応する命令と列に対応する命令との間に依存関係がせず、かつ、行に対応する命令及び列に対応する命令のそれぞれがアクセスするデータのメモリ102内における位置が近接していないことを示す値である「0」が記憶される。
【0143】
具体的に、
図24で説明した依存情報131において、「命令番号」が「4」である情報の「キャッシュ共有依存リスト」には、「6」が記憶されており、「命令番号」が「6」である情報の「キャッシュ共有依存リスト」には、「4」が記憶されている。そのため、情報生成部112は、
図25に示すように、例えば、命令4に対応する行に含まれる欄のうち、命令6に対応する列に含まれる欄に「5」を記憶する。また、情報生成部112は、
図25に示すように、例えば、命令6に対応する行に含まれる欄のうち、命令4に対応する列に含まれる欄に「5」を記憶する。
【0144】
すなわち、依存関係にある複数の命令が異なる分割ループに含まれることによるオブジェクトコード23の実行時間に対する影響よりも、キャッシュミスの発生回数が増加することによるオブジェクトコード23の実行時間に対する影響の方が大きいと判断できる。そのため、情報生成部112は、
図25に示すように、例えば、各命令がアクセスするデータのメモリ102内における位置が近接していることを示す値が、各命令間に依存関係が存在することを示す値よりも大きくなるように、第1行列132の生成を行う。
【0145】
図21に戻り、グループ振分部114は、S55の処理で生成した第1行列132から、各命令間における依存度合いを示す第2行列133を生成する(S56)。
【0146】
そして、グループ振分部114は、
図22に示すように、S56の処理で生成した第2行列133の要素の値のうち、最大の値に対応する複数の命令の振り分け先を同じグループに決定する(S61)。
【0147】
続いて、グループ振分部114は、S56の処理で生成した第2行列133またはS63の処理で再生成した第2行列133における行のうち、S61の処理で振り分け先を決定した各命令に対応する複数の行を、その複数の行における同一列ごとの要素の和を要素とする単一の行に変換し、S56の処理で生成した第2行列133またはS63の処理で再生成した第2行列133における列のうち、S61の処理で振り分け先を決定した各命令に対応する複数の列を、その複数の列における同一行ごとの要素の和を要素とする単一の列に変換することにより、第1行列132を再生成する(S62)。
【0148】
さらに、グループ振分部114は、S62の処理で再生成した第1行列132から第2行列133を再生成する(S63)。
【0149】
その後、グループ振分部114は、S51の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達したか否かを判定する(S64)。
【0150】
具体的に、例えば、S64の処理における所定数が「2」である場合において、
図26に示す第1行列132が生成されている場合、グループ振分部114は、S51の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達したと判定する。
【0151】
なお、
図27に示すように、
図26に示す第1行列132に対応する依存グラフ131aでは、同じ配列に格納された各データを参照する各命令(命令4及び命令6)が同じグループに振り分けられている。
【0152】
続いて、S51の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達したと判定した場合(S71のYES)、ループ分割部115は、S63の処理で生成された第2行列133の内容に従って、S51の処理で分割対象であると判定したループのループ分割を行う(S72)。
【0153】
そして、情報処理装置1は、S2の処理を終了する。なお、情報処理装置1は、情報格納領域130に記憶された中間言語22に、分割対象のループが含まれていないと判定した場合も同様に(S52のNO)、S2の処理を終了する。
【0154】
一方、S51の処理で分割対象であると判定したループに含まれる各命令の振り分け先のグループの数が所定数以下に到達していないと判定した場合(S71のNO)、グループ振分部114は、S62以降の処理を再度行う。以下、ループ分割を行った後の分割ループの具体例について説明を行う。
【0155】
[分割ループの具体例]
図28は、分割ループの内容を説明する具体例である。
図28(A)は、分割ループのうちの一方を説明する具体例であり、
図28(B)は、分割ループのうちの他方を説明する具体例である。
【0156】
図28(A)に示す分割ループには、
図9で説明した中間言語のうち、命令1、命令2、命令3、命令4、命令6、命令8及び命令9が含まれている。
【0157】
また、
図28(A)に示す分割ループは、命令1等の後に、変数reg3に設定された値を、配列tmp_array1のreg_i番目に格納することを示す命令である「store tmp_array1(reg_i),reg3」と、変数reg6に設定された値を、配列tmp_array2のreg_i番目に格納することを示す命令である「store tmp_array2(reg_i),reg6」と、変数reg9に設定された値を、配列tmp_array3のreg_i番目に格納することを示す命令である「store tmp_array3(reg_i),reg9」とを含む。
【0158】
一方、
図28(B)に示す分割ループには、
図9で説明した中間言語のうち、命令5、命令7、命令10、命令11、命令12及び命令13が含まれている。
【0159】
また、
図28(B)に示す分割ループは、命令5等の前に、配列tmp_array1のreg_i番目に格納されている値を変数reg3に設定することを示す命令である「load reg3,tmp_array1(reg_i)」と、配列tmp_array2のreg_i番目に格納されている値を変数reg6に設定することを示す命令である「load reg6,tmp_array2(reg_i)」と、配列tmp_array3のreg_i番目に格納されている値を変数reg9に設定することを示す命令である「load reg9,tmp_array3(reg_i)」とを含む。
【0160】
すなわち、
図28に示す分割ループは、
図20で説明した分割ループよりも一時配列の数が増加している。しかしながら、
図28に示す分割ループでは、同じ配列に格納された各データを参照する各命令(命令4及び命令6)が同じ分割ループに含まれている。
【0161】
これにより、情報処理装置1は、オブジェクトコード23の実行時間をより短縮させることが可能になる。
【0162】
以上の実施の形態をまとめると、以下の付記のとおりである。
【0163】
(付記1)
ソースコードから生成した中間言語のループに含まれる各命令間の依存関係を示す依存情報を生成し、生成した前記依存情報を行列に変換することによって第1行列を生成する情報生成部と、
生成した前記第1行列から算出した各命令間における依存度合いに基づいて、前記ループに含まれる各命令を複数のグループに振り分けるグループ振分部と、
振り分けた前記複数のグループごとに、前記ループの分割を行うループ分割部と、を有する、
ことを特徴とする情報処理装置。
【0164】
(付記2)
付記1において、
前記情報生成部は、
前記ループに含まれる命令の組合せごとに、各組合せに含まれる命令間に依存関係があることを前記依存情報が示しているか否かを判定し、
前記命令の組合せのうち、各組合せに含まれる命令間に依存関係があることを前記依存情報が示している組合せに対応する要素を第1の値とし、前記命令の組合せのうち、各組合せに含まれる命令間に依存関係があることを前記依存情報が示していない組合せに対応する要素を第2の値とすることにより、前記第1行列の生成を行う、
ことを特徴とする情報処理装置。
【0165】
(付記3)
付記1において、
前記グループ振分部は、異なるグループにそれぞれ含まれる命令間において存在する依存関係が少なくなるように、前記ループに含まれる各命令を複数のグループに振り分ける、
ことを特徴とする情報処理装置。
【0166】
(付記4)
付記1において、
前記グループ振分部は、
前記第1行列から各命令間における依存度合いを示す第2行列を生成し、
生成した前記第2行列に基づいて、前記ループに含まれる各命令を前記複数のグループに振り分ける、
ことを特徴とする情報処理装置。
【0167】
(付記5)
付記4において、
前記グループ振分部は、
前記ループに含まれる命令の組合せごとに、各組合せに含まれる命令間における依存度合いを算出し、
算出した前記依存度合いのそれぞれを要素とすることにより、前記第2行列を生成する、
ことを特徴とする情報処理装置。
【0168】
(付記6)
付記5において、
前記グループ振分部は、Newmanアルゴリズムを用いることにより、前記依存度合いを算出する、
ことを特徴とする情報処理装置。
【0169】
(付記7)
付記5において、
前記グループ振分部は、
前記第2行列の要素の値のうち、最大の値に対応する複数の命令の振り分け先を同じグループに決定し、
前記第2行列における前記複数の命令に対応する複数の行を、前記複数の行における同一列ごとの要素の和を要素とする単一の行に変換し、かつ、前記第2行列における前記複数の命令に対応する複数の列を、前記複数の列における同一行ごとの要素の和を要素とする単一の列に変換することによって、前記第1行列を再生成し、
再生成した前記第1行列から前記第2行列を再生成し、
前記ループに含まれる各命令の振り分け先として決定したグループの数が所定数以下になるまで、前記決定する処理と前記第1行列を再生成する処理と前記第2行列を再生成する処理とを繰り返す、
ことを特徴とする情報処理装置。
【0170】
(付記8)
付記2において、さらに、
近接する記憶領域に格納された各データに対してアクセスを行う複数の命令が前記ループに含まれているか否かを判定する近接判定部を有し、
前記情報生成部は、前記複数の命令が前記ループに含まれているか否かの判定結果に基づいて、前記第1行列の生成を行う、
ことを特徴とする情報処理装置。
【0171】
(付記9)
付記8において、
前記情報生成部は、前記複数の命令が前記ループに含まれていると判定した場合、前記複数の命令間に対応する要素を前記第1の値よりも大きい第3の値とすることにより、前記第1行列の生成を行う、
ことを特徴とする情報処理装置。
【0172】
(付記10)
付記8において、
前記近接する記憶領域に格納された各データは、同一の配列である、
ことを特徴とする情報処理装置。
【0173】
(付記11)
ソースコードから生成した中間言語のループに含まれる各命令間の依存関係を示す依存情報を生成し、
生成した前記依存情報を行列に変換することによって第1行列を生成し、
生成した前記第1行列から算出した各命令間における依存度合いに基づいて、前記ループに含まれる各命令を複数のグループに振り分け、
振り分けた前記複数のグループごとに、前記ループの分割を行う、
処理をコンピュータに実行させることを特徴とするコンパイラプログラム。
【0174】
(付記12)
付記11において、
前記第1行列を生成する処理では、
前記ループに含まれる命令の組合せごとに、各組合せに含まれる命令間に依存関係があることを前記依存情報が示しているか否かを判定し、
前記命令の組合せのうち、各組合せに含まれる命令間に依存関係があることを前記依存情報が示している組合せに対応する要素を第1の値とし、前記命令の組合せのうち、各組合せに含まれる命令間に依存関係があることを前記依存情報が示していない組合せに対応する要素を第2の値とすることにより、前記第1行列の生成を行う、
ことを特徴とするコンパイラプログラム。
【0175】
(付記13)
付記11において、
前記複数のグループに振り分ける処理では、異なるグループにそれぞれ含まれる命令間において存在する依存関係が少なくなるように、前記ループに含まれる各命令を複数のグループに振り分ける、
ことを特徴とするコンパイラプログラム。
【0176】
(付記14)
付記11において、
前記複数のグループに振り分ける処理では、
前記第1行列から各命令間における依存度合いを示す第2行列を生成し、
生成した前記第2行列に基づいて、前記ループに含まれる各命令を前記複数のグループに振り分ける、
ことを特徴とするコンパイラプログラム。
【符号の説明】
【0177】
1:情報処理装置 5:操作端末
21:ソースコード 22:中間言語
23:オブジェクトコード 130:記憶部
NW:ネットワーク