(58)【調査した分野】(Int.Cl.,DB名)
前記生成部は、前記取得部により取得された各命令を示すデータのアドレスと、対象プログラムが利用するデータのアドレスとを変更した複数の配置情報の各々について、キャッシュミスの回数を取得し、前記キャッシュミスの回数が最も少ない場合に対応する前記配置情報を、前記キャッシュメモリへのアクセスの成否を示す情報として生成する請求項1に記載の情報処理装置。
前記生成部は、前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否を示す情報を生成する請求項1又は請求項2に記載の情報処理装置。
前記生成部は、前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応する命令を示すデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を生成する請求項3又は請求項4に記載の情報処理装置。
【発明を実施するための形態】
【0012】
以下、図面を参照して開示の技術に係る実施形態の一例を詳細に説明する。なお、以下の各実施形態では、命令を示すデータ(以下、単に「命令」という)と、変数や配列の要素の値などのデータ(以下、単に「データ」という)とを同じキャッシュメモリに記憶するノイマン型アーキテクチャの例で説明する。
【0013】
<第1実施形態>
図1に示すように、第1実施形態に係る情報処理装置10には、プロファイルの対象である対象プログラムに関する入力情報が入力される。入力情報には、対象プログラムを示すプログラム情報(ソースファイル)、プログラムデータ情報、配列データ情報、変数データ情報、及びキャッシュ構成情報が含まれる。入力情報に含まれる各情報の詳細については後述する。
【0014】
また、情報処理装置10は、対象プログラムを実行した場合のキャッシュメモリへのアクセスをシミュレーションし、キャッシュメモリへのアクセスに関するプロファイル情報(以下、「キャッシュのプロファイル情報」という)を生成して出力する。第1実施形態では、キャッシュのプロファイル情報として、キャッシュミスの回数を出力する場合について説明する。なお、キャッシュミスとは、プログラムがアクセスするメモリ(主記憶装置)のメモリ領域に記憶されている命令又はデータがキャッシュメモリに存在しない場合である。
【0015】
情報処理装置10は、
図1に示すように、機能的には、第1変換部11と、取得部12と、第2変換部13と、生成部14とを含む。なお、第1変換部11及び取得部12は、開示の技術の取得部の一例であり、第2変換部13及び生成部14は、開示の技術の生成部の一例である。
【0016】
第1変換部11は、入力情報に含まれる対象プログラムのプログラム情報を、命令アドレス情報取得プログラムのソースファイルに変換する。命令アドレス情報取得プログラムは、対象プログラム中の命令をCentral Processing Unit(CPU)が実行する際にアクセスするメモリのアドレス値の情報(以下、「命令アドレス情報」という)を生成するためのプログラムである。
【0017】
取得部12は、入力情報に含まれるプログラムデータ情報、配列データ情報、及び変数データ情報を用いて、第1変換部11により変換された命令アドレス情報取得プログラムを実行することにより、命令アドレス情報を取得する。
【0018】
第2変換部13は、入力情報に含まれる対象プログラムのプログラム情報を、プロファイル情報生成プログラムのソースファイルに変換する。プロファイル情報生成プログラムは、対象プログラム中のデータ及び命令が記憶されたメモリへのアクセス要求に対応するキャッシュメモリへのアクセスのプロファイル情報を生成するためのプログラムである。
【0019】
生成部14は、入力情報に含まれるプログラムデータ情報、配列データ情報、変数データ情報、及びキャッシュ構成情報を用いて、第2変換部13により変換されたプロファイル情報生成プログラムを実行する。生成部14は、プロファイル情報生成プログラムの実行により、対象プログラム中のデータ及び命令が記憶されたメモリへのアクセス要求に対応するキャッシュメモリへのアクセスをシミュレーションして、キャッシュのプロファイル情報を生成する。生成部14は、生成したキャッシュのプロファイル情報を出力する。
【0020】
情報処理装置10は、例えば
図2に示すコンピュータ20で実現することができる。コンピュータ20は、CPU21と、一時記憶領域としてのメモリ22と、不揮発性の記憶部23とを備える。また、コンピュータ20は、表示部及び入力部を含む入出力装置24と、記憶媒体29に対するデータの読み込み及び書き込みを制御するRead/Write(R/W)部25とを備える。また、コンピュータ20は、インターネット等のネットワークに接続される通信interface(I/F)26を備える。CPU21、メモリ22、記憶部23、入出力装置24、R/W部25、及び通信I/F26は、バス27を介して互いに接続される。なお、CPU21はハードウェアである。
【0021】
記憶部23は、Hard Disk Drive(HDD)、Solid State Drive(SSD)、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部23には、コンピュータ20を情報処理装置10として機能させるための情報処理プログラム30が記憶される。情報処理プログラム30は、第1変換プロセス31と、取得プロセス32と、第2変換プロセス33と、生成プロセス34とを有する。
【0022】
CPU21は、情報処理プログラム30を記憶部23から読み出してメモリ22に展開し、情報処理プログラム30が有するプロセスを順次実行する。CPU21は、第1変換プロセス31を実行することで、
図1に示す第1変換部11として動作する。また、CPU21は、取得プロセス32を実行することで、
図1に示す取得部12として動作する。また、CPU21は、第2変換プロセス33を実行することで、
図1に示す第2変換部13として動作する。また、CPU21は、生成プロセス34を実行することで、
図1に示す生成部14として動作する。これにより、情報処理プログラム30を実行したコンピュータ20が、情報処理装置10として機能する。
【0023】
なお、情報処理プログラム30により実現される機能は、例えば半導体集積回路、より詳しくはApplication Specific Integrated Circuit(ASIC)等で実現することも可能である。
【0024】
次に、第1実施形態に係る情報処理装置10の作用について説明する。対象プログラムの入力情報が情報処理装置10に入力され、プロファイルの開始が指示されると、情報処理装置10が、
図3に示す情報処理を実行する。
【0025】
ここで、例えば、High Performance Computing(HPC)アプリケーションプログラムでは、プログラムのホットスポットが限られる傾向がある。したがって、プログラムの特徴を捉えるためにプロファイル情報を取得する場合でも、いくつかのループ処理のみを調査すればよい場合が多い。そこで、第1実施形態では、例えばある業務処理に関するプログラム全体のうち、ループ処理を含む一部分を対象プログラムとし、この対象プログラムに関する入力情報を情報処理装置10に入力する場合について説明する。
図4に、情報処理装置10に入力される対象プログラムのプログラム情報の一例を示す。
【0026】
ステップS10で、詳細を後述する第1変換処理が実行されて、対象プログラムのプログラム情報が、例えば
図5に示すような命令アドレス情報取得プログラムのソースファイルに変換される。
【0027】
次に、ステップS30で、取得部12が、例えば、
図6に示すプログラムデータ情報、
図7に示す配列データ情報、及び
図8に示す変数データ情報を用いて、第1変換部11により変換された命令アドレス情報取得プログラムを実行する。
図6に示すプログラムデータ情報には、対象プログラムで参照する各配列の開始アドレス、配列の要素当たりのバイト数、及び次元情報が含まれる。
図7に示す配列データ情報は、
図4に示す対象プログラムで参照される配列NJの各要素の値(データ)をインデックスと対応付けた情報である。
図8に示す変数データ情報は、対象プログラムにおけるループの回転数を示す変数NIの値(データ)を示す情報である。
【0028】
取得部12は、
図5に示す命令アドレス情報取得プログラムを実行し、例えば
図9に示すような命令アドレス情報を取得する。
図9に示す命令アドレス情報では、対象プログラム内の命令の位置に付加されたラベル(詳細は後述)と、そのラベルの位置でプログラムがアクセスするメモリのアドレス値とが対応付けられている。各ラベルの位置に対応するアドレス値の取得方法は、例えばC言語のプログラムであれば、GNU Cコンパイラがコンパイラの拡張機能として持つ、ラベルに対応するアドレス値を取得するための演算子&&を利用して実現することができる。
【0029】
次に、ステップS40で、詳細を後述する第2変換処理が実行されて、対象プログラムのプログラム情報が、例えば
図10に示すようなプロファイル情報生成プログラムのソースファイルに変換される。
【0030】
次に、ステップS60で、生成部14が、上記ステップS40で変換されたプロファイル情報生成プログラムを実行する。生成部14は、プロファイル情報生成プログラムの実行に、入力情報に含まれるプログラムデータ情報、配列データ情報、変数データ情報、キャッシュ構成情報、及び上記ステップS30で取得した命令アドレス情報を用いる。これにより、生成部14は、対象プログラム中のデータ及び命令が記憶されたメモリへのアクセス要求に対応するキャッシュメモリへのアクセスをシミュレーションして、キャッシュのプロファイル情報を生成する。生成部14は、生成したキャッシュのプロファイル情報を出力し、情報処理は終了する。
【0031】
図10に示すプロファイル情報生成プログラムに含まれるライブラリ関数ACCESSで呼び出される関数address(D)は、プログラム実行時に配列の要素Dのアドレス値を取得する関数である。このaddress(D)は、
図6に示すプログラムデータ情報を参照して、該当のアドレス値を特定することで実現することができる。例えば、NJ[i]のアドレスは、配列NJの開始アドレス4000、配列の要素当たりのバイト数4、及び変数iから、4000+i×4と特定することができる。また、例えばC言語のプログラムであれば、演算子&を利用して実現してもよい。
【0032】
また、
図10に示すプロファイル情報生成プログラムに含まれるライブラリ関数ACCESSで呼び出される関数iaddress(I)は、プログラム中のラベルIに対応するアドレス値を取得する関数である。このiaddress(I)は、取得部12により取得された命令アドレス情報(例えば
図9)のラベル「I」に対応付けられた「アドレス値」を取得することにより実現することができる。
【0033】
また、
図10に示すプロファイル情報生成プログラムに含まれるライブラリ関数ACCESS(a)は、引数aにaddress(D)又はiaddress(I)で取得されたアドレス値を受け取る。そして、ライブラリ関数ACCESS(a)は、入力情報に含まれるキャッシュ構成情報に基づいて、メモリのアドレスaへのアクセスに対応するキャッシュメモリへのアクセスをシミュレーションする。
【0034】
具体的には、ライブラリ関数ACCESS(a)は、アドレス値aに対応するキャッシュメモリ上のキャッシュセット番号を特定する。アドレス値aに対応するキャッシュセット番号sは、例えば
図11に示すような、キャッシュの連想数A、ブロックサイズB、及びセット数Sの情報を含むキャッシュ構成情報を用い、以下のように特定される。
【0035】
s=(a/B(小数点以下切捨て))mod S
【0036】
そして、特定されたキャッシュセット番号sが示すキャッシュセットに、プログラムがアクセス要求したデータ又は命令が記憶されているか否かを判定する。該当のデータがキャッシュメモリに記憶されていない場合には、キャッシュミスであると判定する。なお、ライブラリ関数ACCESS(a)は、特開2014−232369号公報で開示されている技術を適用することができるため、ここでは、詳細な説明を省略する。
【0037】
また、
図10に示すプロファイル情報生成プログラムに含まれる関数print_out_RESULT()は、ライブラリ関数ACCESSで特定されたキャッシュミス回数を、キャッシュのプロファイル情報として出力する。関数print_out_RESULT();は、例えば、特開2014−232369号公報で開示されているライブラリ関数DUMPを実行することで実現することができる。
【0038】
なお、
図10に示すプログラムは、キャッシュセット毎に、キャッシュのプロファイル情報生成処理を逐次実行する場合のキャッシュ情報生成プログラムの一例である。ここで、キャッシュのプロファイル情報はキャッシュセット毎に独立してシミュレーションすることが可能である。この性質を利用して、全てのキャッシュセットを同時にシミュレーションし、各キャッシュセットに関するキャッシュプロファイル情報生成処理を並列に実行することができる。例えば、キャッシュ情報生成プログラムの冒頭に、上述のキャッシュセット番号sを特定する式と同様の「as=(address/B)%S」を加える。そして、asが該当のキャッシュセットの番号(s)と一致する場合に、上述のライブラリ関数ACCESS(a)が実行されるようにすればよい。これにより、各キャッシュセットのプロファイル情報を並列処理で生成することができるため、プロファイル情報を高速に生成することができる。
【0039】
次に、
図12を参照して、
図3に示す情報処理のステップS10で実行される第1変換処理について説明する。
【0040】
まず、ステップS11で、第1変換部11が、入力された対象プログラムのプログラム情報を構成要素に分解する。そして、第1変換部11は、全ての代入文に、ラベルを付加する。この際、第1変換部11は、代入文を表現するデータサイズがキャッシュメモリのブロックサイズBよりも大きい場合は、代入文を複数の文に分割し、それぞれにラベルを付加する。
【0041】
次に、ステップS12で、第1変換部11が、入力された対象プログラムの入口(プログラム全体における対象プログラムの開始箇所)のアドレス値を取得するためのコードを出力する。なお、コードを出力するとは、生成するプログラムのソースファイルに該当のコードを記述することを意味する。
【0042】
次に、ステップS13で、第1変換部11が、プログラム情報を分解した構成要素のうち、以下のステップS14〜S19の処理が未処理の構成要素が存在するか否かを判定する。未処理の構成要素が存在する場合には、第1変換部11が、未処理の構成要素から、対象プログラムにおける出現順に1つの構成要素Sを選択し、処理はステップS14へ移行する。
【0043】
ステップS14では、第1変換部11が、構成要素Sがループか否かを判定する。肯定判定の場合には、処理はステップS15へ移行し、第1変換部11が、構成要素Sを出力し、処理はステップS13に戻る。一方、否定判定の場合には、処理はステップS16へ移行する。
【0044】
ステップS16では、第1変換部11が、構成要素Sが代入文か否かを判定する。肯定判定の場合には、処理はステップS17へ移行し、否定判定の場合には、処理はステップS18へ移行する。
【0045】
ステップS17では、第1変換部11が、代入文に付加されているラベルLを検出し、代入文の直前の位置のアドレス値を取得するためのコードを出力する。そして、第1変換部11が、代入文Sを出力する。さらに、第1変換部11が、代入文Sの後に代入文の直後の位置のアドレス値を取得するためのコードを出力し、処理はステップS13に戻る。
【0046】
ステップS18では、第1変換部11が、構成要素Sがループを閉じる括弧か否かを判定する。肯定判定の場合には、処理はステップS19へ移行し、第1変換部11が、構成要素Sを出力し、処理はステップS13に戻る。否定判定の場合には、そのままステップS13に戻る。
【0047】
ステップS13で、第1変換部11が、対象プログラムのプログラム情報を分解した構成要素の全てについて、ステップS14〜S19の処理が終了したと判定した場合には、処理はステップS20へ移行する。ステップS20では、第1変換部11が、入力された対象プログラムの出口(プログラム全体における対象プログラムの終了箇所)のアドレス値を取得するためのコードを出力する。
【0048】
次に、ステップS21で、取得されたアドレス値の各々を、各ラベルと対応付けた命令アドレス情報を出力するためのコードを出力して、第1変換処理は終了する。
【0049】
第1変換処理の一例として、
図4に示す対象プログラムのプログラム情報を命令アドレス情報取得プログラムに変換する場合について説明する。
【0050】
まず、第1変換部11は、プログラム情報を、
図13に示すように、各構成要素に分解する(ステップS11)。
図13の例では、プログラム情報において各構成要素が出現する順に、各構成要素に番号Ej(j=1,2,・・・,6)を付与している。以下では、番号Ejの構成要素を「構成要素Ej」と表記する。
【0051】
そして、第1変換部11は、代入文である構成要素E2及びE4の各々にラベルを付加する(ステップS11)。
図13では、構成要素E2にはラベル「S1」が付加され、構成要素E4にはラベル「S2」が付加された例を示している。なお、本実施形態では、説明を分かり易くするため、
図4に示す対象プログラムのプログラム情報についても、ラベルを付加した状態で表している。
【0052】
なお、以下に示すような代入文がプログラム情報に含まれ、この代入文のデータサイズが、キャッシュメモリのブロックサイズBよりも大きいとする。
【0053】
A[x]=B[x]+B[x+1]+B[x+2]+B[x+3]
+B[x+4]+B[x+5]+B[x+6];
【0054】
この場合、例えば、以下に示すように、分割後の各部分のサイズがブロックサイズBよりも小さくなるように代入文を分割した上で、分割された代入文の各部分にそれぞれラベルを付加する。ここで、tmpは代入文を分割するために導入する作業用変数である。
【0055】
S1: tmp=B[x]+B[x+1]+B[x+2]+B[x+3];
S2: A[x]=tmp+B[x+4]+B[x+5]+B[x+6];
【0056】
次に、第1変換部11は、入力された対象プログラムの入口のアドレス値を取得するためのコードとして、例えば、以下のコードを出力する(ステップS12)。
【0058】
ASは、対象プログラムの入口の位置を示すラベルである。
【0059】
次に、第1変換部11は、構成要素E1を処理対象として選択する。構成要素E1はループであるため、第1変換部11は、構成要素E1を出力する(ステップS15)。
【0060】
次に、第1変換部11は、構成要素E2を処理対象として選択する。構成要素E2は代入文であるため、第1変換部11は、まず、代入文のラベル「S1」を検出し、検出したラベルを利用して、例えば以下に示すように、代入文の直前の位置のアドレス値を取得するためのコードを出力する(ステップS17)。
【0062】
そして、第1変換部11は、構成要素E2自身を出力し、その後に、例えば以下に示すような、代入文の直後の位置のアドレス値を取得するためのコードを出力する(ステップS17)。
【0064】
ALSは、ラベルLが付加された代入文の直前の位置を示すラベル、ALEは、ラベルLが付加された代入文の直後の位置を示すラベルである。
【0065】
次に、第1変換部11は、構成要素E3を処理対象として選択する。構成要素E3はループであるため、第1変換部11は、構成要素E3を出力する(ステップS15)。
【0066】
次に、第1変換部11は、構成要素E4を処理対象として選択する。構成要素E4は代入文であるため、第1変換部11は、まず、代入文のラベル「S2」を検出し、検出したラベルを利用して、例えば以下に示すように、代入文の直前の位置のアドレス値を取得するためのコードを出力する(ステップS17)。
【0068】
そして、第1変換部11は、構成要素E4自身を出力し、その後に、例えば以下に示すような、代入文の直後の位置のアドレス値を取得するためのコードを出力する(ステップS17)。
【0070】
次に、第1変換部11は、構成要素E5を処理対象として選択する。構成要素E5はループを閉じる括弧であるため、第1変換部11は、単に構成要素E5を出力する(ステップS19)。構成要素E6もループを閉じる括弧であるため、構成要素E5と同様に処理される。
【0071】
以上のように、全ての構成要素の処理が終了すると、第1変換部11は、入力された対象プログラムの出口のアドレス値を取得するためのコードとして、例えば、以下のコードを出力する(ステップS20)。
【0073】
AEは、対象プログラムの出口の位置を示すラベルである。
【0074】
最後に、第1変換部11は、例えば以下に示すように、取得されたアドレス値の各々を、各ラベルと対応付けて出力するためのコードを出力する(ステップS23)。
【0075】
printf(”0x%x¥n”,&&AS);
printf(”0x%x¥n”,&&AS1S);
printf(”0x%x¥n”,&&AS1E);
printf(”0x%x¥n”,&&AS2S);
printf(”0x%x¥n”,&&AS2E);
printf(”0x%x¥n”,&&AE);
【0076】
上記の例は、GNU Cコンパイラがコンパイラの拡張機能として持つ、ラベルに対応するアドレス値を取得するための演算子&&を利用している。
【0077】
これにより、
図4に示すプログラム情報が、
図5に示すような命令アドレス情報取得プログラムに変換される。
【0078】
次に、
図14を参照して、
図3に示す情報処理のステップS40で実行される第2変換処理について説明する。なお、第2変換処理において、上述の第1変換処理(
図12)と同様の処理については、同一符号を付している。
【0079】
まず、ステップS11で、第2変換部13が、入力された対象プログラムのプログラム情報を構成要素に分解する。なお、上述の第1変換処理(
図12)のステップS11におけるプログラム情報の分解結果(例えば
図13)を取得してもよい。
【0080】
次に、ステップS41で、第2変換部13が、入力された対象プログラムの入口のラベルASに対応するアドレス値を引数とするライブラリ関数ACCESSを実行するコードを出力する。なお、第2変換部13は、対象プログラムの入口のラベルASに対応するアドレス値を、取得部12により取得された命令アドレス情報(例えば
図9)から取得する関数iaddressを引数に設定する。
【0081】
次に、ステップS13で、第2変換部13が、未処理の構成要素が存在するか否かを判定する。未処理の構成要素が存在する場合には、第2変換部13が、未処理の構成要素から、対象プログラムにおける出現順に1つの構成要素Sを選択し、処理はステップS14へ移行する。
【0082】
ステップS14では、第2変換部13が、構成要素Sがループか否かを判定する。肯定判定の場合には、処理はステップS15へ移行し、第2変換部13が、構成要素Sを出力し、処理はステップS13に戻る。一方、否定判定の場合には、処理はステップS42へ移行する。
【0083】
ステップS42では、第2変換部13が、構成要素Sがループの回転数に影響を与えない代入文か否かを判定する。否定判定の場合には、処理はステップS44へ移行し、肯定判定の場合には、処理はステップS43へ移行し、第2変換部13が、構成要素Sを削除し、処理はステップS46へ移行する。
【0084】
ステップS44では、第2変換部13が、構成要素Sがループの回転数に影響を与える代入文か否かを判定する。否定判定の場合には、処理はステップS18へ移行し、肯定判定の場合には、処理はステップS45へ移行し、第2変換部13が、構成要素Sを出力し、処理はステップS46へ移行する。
【0085】
ステップS46では、第2変換部13が、構成要素Sである代入文に付加されたラベルLを検出し、代入文の直前の位置を示すラベルALSに対応するアドレス値を引数とするライブラリ関数ACCESSを実行するコードを出力する。そして、第2変換部13が、構成要素Sの代入文に含まれる各項tが参照する配列の要素のアドレス値の各々を引数とするライブラリ関数ACCESSを実行するコードを出力する。さらに、第2変換部13が、代入文の直後の位置を示すラベルALEに対応するアドレス値を引数とするライブラリ関数ACCESSを実行するコードを出力する。
【0086】
なお、第2変換部13は、ラベルALS及びALEに対応するアドレス値を、取得部12により取得された命令アドレス情報(例えば
図9)から取得する関数iaddressを、ラベルALS及びALEに対するライブラリ関数ACCESSの引数に設定する。また、各項tが参照する配列の要素のアドレス値を、プログラムデータ情報(例えば
図7)を参照して特定する関数addressを、各項tに対するライブラリ関数ACCESSの引数に設定する。そして、処理はステップS13に戻る。
【0087】
ステップS18では、第2変換部13が、構成要素Sがループを閉じる括弧か否かを判定する。肯定判定の場合には、処理はステップS19へ移行し、第2変換部13が、構成要素Sを出力し、処理はステップS13に戻る。否定判定の場合には、そのままステップS13に戻る。
【0088】
ステップS13で、第2変換部13が、対象プログラムのプログラム情報を分解した構成要素の全てについて、ステップS14〜S19の処理が終了したと判定した場合には、処理はステップS47へ移行する。ステップS47では、第2変換部13が、入力された対象プログラムの出口のラベルAEに対応するアドレス値を引数とするライブラリ関数ACCESSを実行するコードを出力する。なお、第2変換部13は、対象プログラムの出口のラベルAEに対応するアドレス値を、取得部12により取得された命令アドレス情報(例えば
図9)から取得する関数iaddressを引数に設定する。
【0089】
次に、ステップS48で、第2変換部13が、キャッシュのプロファイル情報を出力するコードを出力し、第2変換処理は終了する。
【0090】
第2変換処理の一例として、
図4に示す対象プログラムのプログラム情報をプロファイル情報生成プログラムに変換する場合について説明する。
【0091】
まず、第2変換部13は、第1変換処理と同様に、プログラム情報を、
図13に示すように、各構成要素に分解する(ステップS11)。
【0092】
次に、第2変換部13は、例えば、以下に示すように、対象プログラムの入口のアドレス値に対して、ライブラリ関数ACCESSを実行するコードを出力する(ステップS41)。
【0093】
ACCESS(iaddress(AS));
【0094】
次に、第2変換部13は、構成要素E1を処理対象として選択する。構成要素E1はループであるため、第2変換部13は、構成要素E1を出力する(ステップS15)。
【0095】
次に、第2変換部13は、構成要素E2を処理対象として選択する。構成要素E2はループの回転数に影響を与える代入文であるため、第2変換部13は、まず構成要素E2自身を出力する(ステップS45)。そして、第2変換部13は、構成要素E2である代入文に付加されたラベルS1を検出し、以下に示すように、代入文の直前の位置を示すラベルAS1Sに対応するアドレス値に対して、ライブラリ関数ACCESSを実行するコードを出力する(ステップS46)。
【0096】
ACCESS(iaddress(AS1S));
【0097】
その後に、第2変換部13は、以下に示すように、構成要素E2である代入文に出現する、配列の要素NJ[i]に対して、ライブラリ関数ACCESSを実行するコードを出力する(ステップS46)。
【0098】
ACCESS(address(NJ[i]));
【0099】
そして、第2変換部13は、以下に示すように、代入文の直後の位置を示すラベルAS1Eに対応するアドレス値に対して、ライブラリ関数ACCESSを実行するコードを出力する(ステップS46)。
【0100】
ACCESS(iaddress(AS1E));
【0101】
次に、第2変換部13は、構成要素E3を処理対象として選択する。構成要素E3はループであるため、第2変換部13は、構成要素E3を出力する(ステップS15)。
【0102】
次に、第2変換部13は、構成要素E4を処理対象として選択する。構成要素E4はループの回転数に影響を与えない代入文であるため、第2変換部13は、構成要素E4を削除する(ステップS43)。そして、第2変換部13は、構成要素E4である代入文に付加されたラベルS2を検出し、例えば以下に示すように、代入文の直前の位置を示すラベルAS2Sに対応するアドレス値に対して、ライブラリ関数ACCESSを実行するコードを出力する(ステップS46)。
【0103】
ACCESS(iaddress(AS2S));
【0104】
その後に、第2変換部13は、以下に示すように、構成要素E4である代入文の右辺に出現するX[i][j]、Y[i][j]と、左辺に出現するZ[i][j]の3つの配列の要素の各々に対して、ライブラリ関数ACCESSを実行するコードを出力する(ステップS46)。
【0105】
ACCESS(address(X[i][j]));
ACCESS(address(Y[i][j]));
ACCESS(address(Z[i][j]));
【0106】
そして、第2変換部13は、例えば以下に示すように、代入文の直後の位置を示すラベルAS2Eに対応するアドレス値に対して、ライブラリ関数ACCESSを実行するコードを出力する(ステップS46)。
【0107】
ACCESS(iaddress(AS2E));
【0108】
次に、第2変換部13は、構成要素E5を処理対象として選択する。構成要素E5はループを閉じる括弧であるため、第2変換部13は、単に構成要素E5を出力する(ステップS19)。構成要素E6もループを閉じる括弧であるため、構成要素E5と同様に処理される。
【0109】
以上のように、全ての構成要素の処理が終了すると、第2変換部13は、例えば以下に示すように、入力された対象プログラムの出口のアドレス値に対して、ライブラリ関数ACCESSを実行するコードを出力する(ステップS47)。
【0110】
ACCESS(iaddress(AE));
【0111】
最後に、第2変換部13は、例えば以下に示すように、キャッシュのプロファイル情報を出力するコードを出力する(ステップS48)。
【0112】
print_out_RESULT();
【0113】
これにより、
図4に示すプログラム情報が、
図10に示すようなプロファイル情報生成プログラムに変換される。
【0114】
以上説明したように、第1実施形態に係る情報処理装置10によれば、プログラム内の命令に付加したラベルを手がかりに、プログラムがラベルに対応する位置を実行する際にアクセス要求するメモリのアドレス値を取得する。そして、第1実施形態に係る情報処理装置10は、取得したアドレス値に対応するキャッシュメモリのキャッシュセットへのアクセスをシミュレーションして、キャッシュのプロファイル情報を取得する。これにより、命令についても、配列の要素等の他のデータと同様に、キャッシュのプロファイル情報を取得することができる。
【0115】
また、対象プログラムが行う計算を省略して、メモリへのアクセスだけを考慮したシミュレーションを行うことにより、プロファイル情報を高速に取得することができる。
【0116】
例えば、HPCアプリケーションプログラムは一般に、複数の巨大な配列にアクセスするため、プログラムの総実行時間における、メモリアクセスに要する時間が占める割合が多く、かつ個々の命令の実行時間が長い浮動小数点演算を大量に含む。本実施形態では、浮動小数点演算もメモリアクセスもほとんど必要としないため、処理を高速化することができる。
【0117】
また、キャッシュアクセスをシミュレーションするため、対象プログラムが稼動する実機を使用することなく、対象プログラムのキャッシュアクセスのプロファイル情報を取得することができる。
【0118】
また、対象プログラムの開発環境と実際の稼働環境との相違により、開発時と実際の稼動時とでキャッシュ構成が異なる場合がある。CPUの内蔵レジスタを使用してプロファイル情報を取得する場合は、そのCPUのキャッシュ構成に基づくプロファイル情報しか取得することができない。本実施形態では、実際の稼動時のキャッシュ構成を示すキャッシュ構成情報を与えてシミュレーションすることで、適切なプロファイル情報を取得することができる。
【0119】
また、キャッシュメモリへのアクセスのシミュレーションを、キャッシュセット毎に並列に行うことができる。このことも、プロファイル情報取得の高速化に寄与する。例えば、キャッシュセット数はCPUによって異なるが、一般に100個以上から数千個である。したがって、キャッシュセット毎に逐次プロファイル情報を取得する場合と比較して、100倍から数千倍以上の高速化を図ることができる。
【0120】
<第2実施形態>
次に、第2実施形態について説明する。なお、第2実施形態に係る情報処理装置において、第1実施形態に係る情報処理装置10と同一の部分については、同一符号を付して、詳細な説明を省略する。
【0121】
第2実施形態に係る情報処理装置210に入力される対象プログラムの入力情報には、第1実施形態における入力情報に加え、配置試行情報(詳細は後述)が含まれる。情報処理装置210は、
図1に示すように、機能的には、第1変換部11と、取得部12と、第2変換部13と、生成部214とを含む。なお、第1変換部11及び取得部12は、開示の技術の取得部の一例であり、第2変換部13及び生成部214は、開示の技術の生成部の一例である。
【0122】
生成部214は、取得部12により取得された命令アドレス情報と、対象プログラムの入力情報として与えたプログラムデータ情報のデータアドレス情報とを変更した複数の配置情報の各々について、キャッシュミスの回数を計測する。そして、生成部214は、キャッシュミスの回数が最も少ない場合に対応する配置情報を、命令及びデータのアドレスの最適配置情報として生成し、出力する。
【0123】
情報処理装置210は、例えば
図2に示すコンピュータ20で実現することができる。コンピュータ20の記憶部23には、コンピュータ20を情報処理装置210として機能させるための情報処理プログラム230が記憶される。情報処理プログラム230は、第1変換プロセス31と、取得プロセス32と、第2変換プロセス33と、生成プロセス234とを有する。
【0124】
CPU21は、情報処理プログラム230を記憶部23から読み出してメモリ22に展開し、情報処理プログラム230が有するプロセスを順次実行する。CPU21は、生成プロセス234を実行することで、
図1に示す生成部214として動作する。他のプロセスについては、第1実施形態に係る情報処理プログラム30と同様である。これにより、情報処理プログラム230を実行したコンピュータ20が、情報処理装置210として機能する。
【0125】
なお、情報処理プログラム230により実現される機能は、例えば半導体集積回路、より詳しくはASIC等で実現することも可能である。
【0126】
次に、第2実施形態に係る情報処理装置210の作用について説明する。対象プログラムの入力情報が情報処理装置210に入力され、プロファイルの開始が指示されると、情報処理装置210が、
図15に示す情報処理を実行する。なお、第2実施形態における情報処理において、第1実施形態における情報処理(
図3)と同様の処理については、同一符号を付して詳細な説明を省略する。
【0127】
ステップS10〜S40が第1実施形態と同様に実行され、例えば、
図9に示す命令アドレス情報、及び
図10に示すプロファイル情報生成プログラムが得られる。
【0128】
次に、ステップS50で、生成部214が、上記ステップS30で取得された命令アドレス情報を、各ラベルに対応するアドレス値を、先頭のラベルに対応するアドレス値からのオフセット値の表現に変換した、最適化用命令アドレス情報に変換する。なお、本実施形態においては、先頭のラベルとは、最も小さいアドレス値に対応するラベル、すなわち、プログラム全体における対象プログラムの入口を示すラベルASである。したがって、生成部214は、ラベルASに対応するアドレス値と各ラベルに対応するアドレス値との差を各ラベルに対応するオフセット値として計算することにより、命令アドレス情報を最適化用命令アドレス情報に変換する。
図16に、
図9に示す命令アドレス情報を変換した最適化用命令アドレス情報を示す。
【0129】
次に、ステップS55で、生成部214が、上記ステップS40で変換されたプロファイル情報生成プログラムを、最適化用プロファイル情報生成プログラムに変換する。
【0130】
具体的には、生成部214は、命令のキャッシュのプロファイル情報を取得するライブラリ関数ACCESSの引数を、以下に示すように変換する。
【0131】
変換前:ACCESS(iaddress(I));
変換後:ACCESS(ASTART+ioffset(I));
【0132】
ここで、ASTARTは、先頭のラベルに対応するアドレス値である。また、ioffset(I)の値は、上記ステップS50で変換された最適化用命令アドレス情報のラベルIに対応するオフセット値である。
【0133】
また、生成部214は、配列の要素のキャッシュのプロファイル情報を取得するライブラリ関数ACCESSの引数を、以下に示すように変換する。
【0134】
変換前:ACCESS(address(D));
変換後:ACCESS(DSTART(X)+offset(X));
【0135】
ここで、DSTART(X)は、配列Xの先頭要素のアドレス値である。また、offset(X)の値は、配列Xの要素Dのアドレス値から配列Xの先頭要素のアドレス値を引くことによって、最適化用プロファイル情報生成プログラムの実行時に計算することができる。例えば、offset(X[i][j])は、
&(X[i][j])−&(X[0][0])
として、計算することができる。
図17に、
図10に示すプロファイル情報生成プログラムを変換した最適化用プロファイル情報生成プログラムを示す。
【0136】
次に、ステップS61で、生成部214が、キャッシュミス回数の最小値を表す作業用変数MをM=∞に初期化し、キャッシュミス回数を最小化する最適な配置情報を表す作業用変数RESULTを空に初期化する。
【0137】
次に、ステップS62で、生成部214が、入力情報に含まれる配置試行情報から作成される配置情報のうち、以下のステップS64〜S66の処理が未試行の配置情報が存在するか否かを判定する。未試行の配置情報が存在する場合には、処理はステップS63へ移行する。
【0138】
ここで、配置試行情報は、例えば
図18に示すように、「データ名」で特定される命令及びデータの「開始アドレス値」と、各データに対して開始アドレス値をどのような値の範囲で変更するかを示す「変更オフセット範囲」とを定義している。「データ名」の「ASTART」は、先頭のラベルに対応する命令を表す。また、「データ名」が配列を示す場合、その配列の先頭要素の開始アドレス値が「開始アドレス値」で定義されている。
【0139】
図13の例では、先頭のラベル及び全てのデータについて、変更オフセット範囲を0から256バイトの範囲としている。先頭のラベル及び各データについての、変更オフセット範囲内で、所定バイト単位のオフセット値の組合せの各々が、配置情報となる。例えば、所定バイト単位が8バイトの場合、先頭のラベル及び各データのオフセット値は、0、8、・・・、256の33パターンから選択可能であり、
図18の例では、データが5種類あるため、33
5パターンの配置情報が作成可能である。なお、所定バイト単位は、キャッシュ構成情報、キャッシュメモリのブロック及びラインのサイズ、配列のサイズ、要素のデータサイズ等に応じて適宜設定すればよい。
【0140】
ステップS63では、生成部214が、配置試行情報を参照して、
図19に示すように、未試行の配置情報Xを1つ作成する。
図19の配置情報Xでは、配列Zについて、128バイト分、開始アドレス値を増やし、
DSTART(Z)=0x3000+128=0x3080
とすることを表す。先頭のラベル及びそれ以外のデータに関しては、配置試行情報で定義された開始アドレス値をそのまま使用することを表している。
【0141】
次に、ステップS64で、生成部214が、プログラムデータ情報、配列データ情報、変数データ情報、キャッシュ構成情報、最適化命令アドレス情報、配置試行情報、及び配置情報Xを用いて、最適化用プロファイル情報生成プログラムを実行する。この際、最適化用プロファイル情報生成プログラムのASTART及びDSTART(D)の各々では、配置試行情報の「開始アドレス値」に、上記ステップS63で作成された配置情報Xで示されるオフセット値を加えたアドレス値が参照される。生成部214は、最適化用プロファイル情報生成プログラムの実行結果として、キャッシュミスの回数mを出力する。
【0142】
次に、ステップS65で、生成部214が、上記ステップS64で出力されたキャッシュミスの回数mが、作業用変数Mより小さいか否かを判定する。m<Mの場合には、処理はステップS66へ移行し、生成部214が、Mにmの値を保存し、かつ作業用変数RESULTに、上記ステップS63で作成された配置情報Xを保存し、処理はステップS62に戻る。一方、m≧Mの場合には、ステップS66の処理はスキップして、ステップS62に戻る。
【0143】
ステップS62で、全ての配置情報を試行済みであると判定された場合には、処理はステップS67へ移行する。ステップS67では、生成部214が、Mに保存されている最小のキャッシュミスの回数、及びRESULTに保存されている配置情報Xを、対象プログラムのキャッシュのプロファイル情報として出力し、情報処理は終了する。
【0144】
以上説明したように、第2実施形態に係る情報処理装置210によれば、命令及びデータの配置を変更した複数の配置情報について、キャッシュのプロファイル情報としてキャッシュミスの回数を取得する。そして、キャッシュミスの回数が最小となる配置情報を、命令及びデータの最適配置情報として出力する。これにより、第2実施形態に係る情報処理装置210は、第1実施形態の効果に加え、人手による試行錯誤を必要とすることなく、キャッシュの利用効率を改善できる命令及びデータの最適配置情報を取得することができる。
【0145】
なお、上記各実施形態では、命令とデータとを同じキャッシュに記憶するノイマン型アーキテクチャを前提に説明したが、これに限定されない。ノイマン型アーキテクチャの実施形態を一部変更することで、命令とデータとを異なるキャッシュに記憶するハーバード・アーキテクチャにも適用可能である。
【0146】
例えば、レベル1に命令キャッシュL1Iと、データキャッシュL1Dとが存在し、レベル2のキャッシュがunifiedキャッシュであるアーキテクチャを考える。この場合、
図11に示すようなキャッシュ構成情報を、L1I用、L1D用、及びL2用の3つ用意する。そして、命令アドレス情報を参照するライブラリ関数ACCESSを、ライブラリ関数IACCESSに変更する。すなわち、ライブラリ関数ACCESSは、データキャッシュL1Dへのアクセスをシミュレーションし、ライブラリ関数IACCESSは命令キャッシュL1Iへのアクセスをシミュレーションするように実現する。
【0147】
キャッシュL1I及びL1Dの下には、キャッシュL2を結合し、例えば、特開2014−232369に示す、多段キャッシュのシミュレーションによって、キャッシュのプロファイル情報を取得する。
図20に、
図4に示す対象プログラムのプログラム情報を、ハーバード・アーキテクチャに対応させて、プロファイル情報生成プログラムに変換した例を示す。
【0148】
また、上記各実施形態では、ライブラリ関数ACCESSにより取得されるキャッシュミスの回数をキャッシュのプロファイル情報として出力する場合について説明したが、これに限定されない。例えば、どの命令又はどのデータへのアクセスでキャッシュミスが発生しているかを示す情報を出力することも可能である。この場合、例えば、
ACCESS(行x)(address);
のように、対象プログラムの何行目の命令又はデータに関するキャッシュのプロファイル情報を出力するためのライブラリ関数ACCESSかを示す情報を付加しておく。この場合、
行x:m回
のように、行毎、すなわち、命令やデータ毎のキャッシュミスの回数を、キャッシュのプロファイル情報として出力することができる。
【0149】
また、上記各実施形態では、命令及びデータの両方のキャッシュのプロファイル情報を取得する場合について説明したが、命令のキャッシュのプロファイル情報のみを取得するようにしてもよい。
【0150】
また、上記では、情報処理プログラム30、230が記憶部23に予め記憶(インストール)されている態様を説明したが、これに限定されない。プログラムは、CD−ROM、DVD−ROM、USBメモリ等の記憶媒体に記憶された形態で提供することも可能である。
【0151】
以上の各実施形態に関し、更に以下の付記を開示する。
【0152】
(付記1)
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得する取得部と、
前記取得部により取得されたアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する生成部と、
を含む情報処理装置。
【0153】
(付記2)
前記取得部は、前記対象プログラムに含まれる命令の位置に付加情報を付加し、前記付加情報に対応するアドレスを、前記命令を示すデータが記憶される主記憶装置のアドレスとして取得する付記1に記載の情報処理装置。
【0154】
(付記3)
前記生成部は、前記取得部により取得された各命令を示すデータのアドレスと、対象プログラムが利用するデータのアドレスとを変更した複数の配置情報の各々について、キャッシュミスの回数を取得し、前記キャッシュミスの回数が最も少ない場合に対応する前記配置情報を、前記キャッシュメモリへのアクセスの成否を示す情報として生成する付記1又は付記2に記載の情報処理装置。
【0155】
(付記4)
前記生成部は、前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否を示す情報を生成する付記1〜付記3のいずれか1項に記載の情報処理装置。
【0156】
(付記5)
前記生成部は、前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否を示す情報を生成する処理を、前記キャッシュセット毎に並列に実行する付記4に記載の情報処理装置。
【0157】
(付記6)
前記生成部は、前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応する命令を示すデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を生成する付記4又は付記5に記載の情報処理装置。
【0158】
(付記7)
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、
取得したアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する
ことを含む処理をコンピュータが実行する情報処理方法。
【0159】
(付記8)
前記対象プログラムに含まれる命令の位置に付加情報を付加し、前記付加情報に対応するアドレスを、前記命令を示すデータが記憶される主記憶装置のアドレスとして取得する付記7に記載の情報処理方法。
【0160】
(付記9)
取得された各命令を示すデータのアドレスと、対象プログラムが利用するデータのアドレスとを変更した複数の配置情報の各々について、キャッシュミスの回数を取得し、前記キャッシュミスの回数が最も少ない場合に対応する前記配置情報を、前記キャッシュメモリへのアクセスの成否を示す情報として生成する付記7又は付記8に記載の情報処理方法。
【0161】
(付記10)
前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否を示す情報を生成する付記7〜付記9のいずれか1項に記載の情報処理方法。
【0162】
(付記11)
前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否を示す情報を生成する処理を、前記キャッシュセット毎に並列に実行する付記10に記載の情報処理方法。
【0163】
(付記12)
前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応する命令を示すデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を生成する付記10又は付記11に記載の情報処理方法。
【0164】
(付記13)
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、
取得したアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する
ことを含む処理をコンピュータに実行させるための情報処理プログラム。
【0165】
(付記14)
前記対象プログラムに含まれる命令の位置に付加情報を付加し、前記付加情報に対応するアドレスを、前記命令を示すデータが記憶される主記憶装置のアドレスとして取得する付記13に記載の情報処理プログラム。
【0166】
(付記15)
取得された各命令を示すデータのアドレスと、対象プログラムが利用するデータのアドレスとを変更した複数の配置情報の各々について、キャッシュミスの回数を取得し、前記キャッシュミスの回数が最も少ない場合に対応する前記配置情報を、前記キャッシュメモリへのアクセスの成否を示す情報として生成する付記13又は付記14に記載の情報処理プログラム。
【0167】
(付記16)
前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否を示す情報を生成する付記13〜付記15のいずれか1項に記載の情報処理プログラム。
【0168】
(付記17)
前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否を示す情報を生成する処理を、前記キャッシュセット毎に並列に実行する付記16に記載の情報処理プログラム。
【0169】
(付記18)
前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応する命令を示すデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を生成する付記16又は付記17に記載の情報処理プログラム。
【0170】
(付記19)
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、
取得したアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する
ことを含む処理をコンピュータに実行させるための情報処理プログラムを記憶した記憶媒体。