(57)【要約】【課題】対象プログラムに含まれる命令に関するキャッシュメモリの利用状況を示すプロファイル情報を取得する。【解決手段】第１変換部１１及び取得部１２が、対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、第２変換部１３及び生成部１４が、取得されたアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、キャッシュメモリの構成情報に基づいて模擬することにより、命令に関するキャッシュメモリへのアクセスの成否を示す情報を生成する。【選択図】図１
2019028918.tif 000002
【特許請求の範囲】
【請求項１】
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得する取得部と、
前記取得部により取得されたアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する生成部と、
を含む情報処理装置。
【請求項２】
前記取得部は、前記対象プログラムに含まれる命令の位置に付加情報を付加し、前記付加情報に対応するアドレスを、前記命令を示すデータが記憶される主記憶装置のアドレスとして取得する請求項１に記載の情報処理装置。
【請求項３】
前記生成部は、前記取得部により取得された各命令を示すデータのアドレスと、対象プログラムが利用するデータのアドレスとを変更した複数の配置情報の各々について、キャッシュミスの回数を取得し、前記キャッシュミスの回数が最も少ない場合に対応する前記配置情報を、前記キャッシュメモリへのアクセスの成否を示す情報として生成する請求項１又は請求項２に記載の情報処理装置。
【請求項４】
前記生成部は、前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否を示す情報を生成する請求項１〜請求項３のいずれか１項に記載の情報処理装置。
【請求項５】
前記生成部は、前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否を示す情報を生成する処理を、前記キャッシュセット毎に並列に実行する請求項４に記載の情報処理装置。
【請求項６】
前記生成部は、前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応する命令を示すデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を生成する請求項４又は請求項５に記載の情報処理装置。
【請求項７】
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、
取得したアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する
ことを含む処理をコンピュータが実行する情報処理方法。
【請求項８】
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、
取得したアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する
ことを含む処理をコンピュータに実行させるための情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
開示の技術は、情報処理装置、情報処理方法、及び情報処理プログラムに関する。
【背景技術】
【０００２】
従来、プログラム実行時のキャッシュメモリへのアクセスに関するプロファイル情報を取得する技術が存在する。
【０００３】
例えば、キャッシュメモリのキャッシュセット毎のプロファイルデータを取得する技術が提案されている。この技術は、配列Ｘのアドレスに対応するキャッシュセット番号を求め、キャッシュセット番号がプロファイルデータ取得処理を担当するセット番号ｓであるか否かを判断する。そして、この技術は、キャッシュセット番号がプロファイルデータ取得処理を担当するセット番号ｓである場合には、配列Ｘのアドレスに対応するタグ情報が記憶部に記憶されている場合、ヒット変数を１加算する。記憶されていない場合には、ミス変数を１加算する。
【０００４】
また、例えば、High Performance Computing（ＨＰＣ）アプリケーションプログラムなどではプログラムのホットスポットが限られる傾向がある。したがって、プログラムの特徴を捉えるためにプロファイルデータを取得する場合でも、いくつかのループ（カーネルループ）のみを調査すればよいことが多い。ＨＰＣアプリケーションのループは一般に大量のデータにアクセスするため、ループを高速に実行するためには、ＣＰＵのキャッシュメモリを有効利用する必要がある。
【０００５】
また、キャッシュメモリには、プログラムの実行時にアクセスされる変数や配列の要素の値などのデータが記憶されるが、プログラムを表す命令自体もデータであるため、キャッシュメモリに記憶される。プログラムの実行時に、実行される命令がキャッシュメモリ上に存在しない場合には、ＣＰＵは主メモリから該当の命令を取得するまで、プログラムの実行を継続することができない。したがって、命令のキャッシュミスは、データのキャッシュミスよりも重大な性能低下の要因となる。特に、ループのプログラムでは同一の命令が繰り返し実行されるため、命令についてもキャッシュメモリを有効利用することが必要である。したがって、命令のキャッシュプロファイル情報を取得することは、重要な技術となる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１４−２３２３６９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
現在利用されているキャッシュの利用状況の調査方法は、ＣＰＵに内蔵のレジスタを利用するもので、キャッシュミスの回数のカウントなどの単純な情報を取得することは可能である。しかし、ＣＰＵの内蔵レジスタを利用する手法では、命令のキャッシュを考慮した詳細なキャッシュプロファイル情報は取得することはできない。また、ＣＰＵのシミュレータや専用のツールを使って詳細なプロファイル情報を取得する手法を使うことも考えられるが、この場合、普通にプログラムを実行するより、はるかに長い実行時間を要するという問題がある。例えば、大規模High Performance Computing（ＨＰＣ）アプリケーションプログラムの実行時間は一般に長時間であるため、キャッシュメモリの利用状況のプロファイル情報を取得するために、長時間実機を利用することは現実的ではない。
【０００８】
開示の技術は、一つの側面として、プログラムに含まれる命令に関するキャッシュメモリの利用状況を示すプロファイル情報を取得することを目的とする。
【課題を解決するための手段】
【０００９】
一つの態様として、取得部が、対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得する。そして、生成部が、取得されたアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する。
【発明の効果】
【００１０】
一つの側面として、プログラムに含まれる命令に関するキャッシュメモリの利用状況を示すプロファイル情報を取得することができる。
【図面の簡単な説明】
【００１１】
【図１】第１及び第２実施形態に係る情報処理装置の機能ブロック図である。
【図２】情報処理装置として機能するコンピュータの概略構成を示すブロック図である。
【図３】第１実施形態における情報処理の一例を示すフローチャートである。
【図４】プログラム情報の一例を示す図である。
【図５】命令アドレス情報取得プログラムの一例を示す図である。
【図６】プログラムデータ情報の一例を示す図である。
【図７】配列データ情報の一例を示す図である。
【図８】変数データ情報の一例を示す図である。
【図９】命令アドレス情報の一例を示す図である。
【図１０】プロファイル情報生成プログラムの一例を示す図である。
【図１１】キャッシュ構成情報の一例を示す図である。
【図１２】第１変換処理の一例を示すフローチャートである。
【図１３】対象プログラムを各構成要素に分解した一例を示す図である。
【図１４】第１変換処理の一例を示すフローチャートである。
【図１５】第２実施形態における情報処理の一例を示すフローチャートである。
【図１６】最適化用命令アドレス情報の一例を示す図である。
【図１７】最適化用プロファイル情報生成プログラムの一例を示す図である。
【図１８】配置試行情報の一例を示す図である。
【図１９】配置情報の一例を示す図である。
【図２０】ハーバード・アーキテクチャに対応させたプロファイル情報生成プログラムの一例を示す図である。
【発明を実施するための形態】
【００１２】
以下、図面を参照して開示の技術に係る実施形態の一例を詳細に説明する。なお、以下の各実施形態では、命令を示すデータ（以下、単に「命令」という）と、変数や配列の要素の値などのデータ（以下、単に「データ」という）とを同じキャッシュメモリに記憶するノイマン型アーキテクチャの例で説明する。
【００１３】
＜第１実施形態＞
図１に示すように、第１実施形態に係る情報処理装置１０には、プロファイルの対象である対象プログラムに関する入力情報が入力される。入力情報には、対象プログラムを示すプログラム情報（ソースファイル）、プログラムデータ情報、配列データ情報、変数データ情報、及びキャッシュ構成情報が含まれる。入力情報に含まれる各情報の詳細については後述する。
【００１４】
また、情報処理装置１０は、対象プログラムを実行した場合のキャッシュメモリへのアクセスをシミュレーションし、キャッシュメモリへのアクセスに関するプロファイル情報（以下、「キャッシュのプロファイル情報」という）を生成して出力する。第１実施形態では、キャッシュのプロファイル情報として、キャッシュミスの回数を出力する場合について説明する。なお、キャッシュミスとは、プログラムがアクセスするメモリ（主記憶装置）のメモリ領域に記憶されている命令又はデータがキャッシュメモリに存在しない場合である。
【００１５】
情報処理装置１０は、図１に示すように、機能的には、第１変換部１１と、取得部１２と、第２変換部１３と、生成部１４とを含む。なお、第１変換部１１及び取得部１２は、開示の技術の取得部の一例であり、第２変換部１３及び生成部１４は、開示の技術の生成部の一例である。
【００１６】
第１変換部１１は、入力情報に含まれる対象プログラムのプログラム情報を、命令アドレス情報取得プログラムのソースファイルに変換する。命令アドレス情報取得プログラムは、対象プログラム中の命令をCentral Processing Unit（ＣＰＵ）が実行する際にアクセスするメモリのアドレス値の情報（以下、「命令アドレス情報」という）を生成するためのプログラムである。
【００１７】
取得部１２は、入力情報に含まれるプログラムデータ情報、配列データ情報、及び変数データ情報を用いて、第１変換部１１により変換された命令アドレス情報取得プログラムを実行することにより、命令アドレス情報を取得する。
【００１８】
第２変換部１３は、入力情報に含まれる対象プログラムのプログラム情報を、プロファイル情報生成プログラムのソースファイルに変換する。プロファイル情報生成プログラムは、対象プログラム中のデータ及び命令が記憶されたメモリへのアクセス要求に対応するキャッシュメモリへのアクセスのプロファイル情報を生成するためのプログラムである。
【００１９】
生成部１４は、入力情報に含まれるプログラムデータ情報、配列データ情報、変数データ情報、及びキャッシュ構成情報を用いて、第２変換部１３により変換されたプロファイル情報生成プログラムを実行する。生成部１４は、プロファイル情報生成プログラムの実行により、対象プログラム中のデータ及び命令が記憶されたメモリへのアクセス要求に対応するキャッシュメモリへのアクセスをシミュレーションして、キャッシュのプロファイル情報を生成する。生成部１４は、生成したキャッシュのプロファイル情報を出力する。
【００２０】
情報処理装置１０は、例えば図２に示すコンピュータ２０で実現することができる。コンピュータ２０は、ＣＰＵ２１と、一時記憶領域としてのメモリ２２と、不揮発性の記憶部２３とを備える。また、コンピュータ２０は、表示部及び入力部を含む入出力装置２４と、記憶媒体２９に対するデータの読み込み及び書き込みを制御するRead/Write（Ｒ／Ｗ）部２５とを備える。また、コンピュータ２０は、インターネット等のネットワークに接続される通信interface（Ｉ／Ｆ）２６を備える。ＣＰＵ２１、メモリ２２、記憶部２３、入出力装置２４、Ｒ／Ｗ部２５、及び通信Ｉ／Ｆ２６は、バス２７を介して互いに接続される。なお、ＣＰＵ２１はハードウェアである。
【００２１】
記憶部２３は、Hard Disk Drive（ＨＤＤ）、Solid State Drive（ＳＳＤ）、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部２３には、コンピュータ２０を情報処理装置１０として機能させるための情報処理プログラム３０が記憶される。情報処理プログラム３０は、第１変換プロセス３１と、取得プロセス３２と、第２変換プロセス３３と、生成プロセス３４とを有する。
【００２２】
ＣＰＵ２１は、情報処理プログラム３０を記憶部２３から読み出してメモリ２２に展開し、情報処理プログラム３０が有するプロセスを順次実行する。ＣＰＵ２１は、第１変換プロセス３１を実行することで、図１に示す第１変換部１１として動作する。また、ＣＰＵ２１は、取得プロセス３２を実行することで、図１に示す取得部１２として動作する。また、ＣＰＵ２１は、第２変換プロセス３３を実行することで、図１に示す第２変換部１３として動作する。また、ＣＰＵ２１は、生成プロセス３４を実行することで、図１に示す生成部１４として動作する。これにより、情報処理プログラム３０を実行したコンピュータ２０が、情報処理装置１０として機能する。
【００２３】
なお、情報処理プログラム３０により実現される機能は、例えば半導体集積回路、より詳しくはApplication Specific Integrated Circuit（ＡＳＩＣ）等で実現することも可能である。
【００２４】
次に、第１実施形態に係る情報処理装置１０の作用について説明する。対象プログラムの入力情報が情報処理装置１０に入力され、プロファイルの開始が指示されると、情報処理装置１０が、図３に示す情報処理を実行する。
【００２５】
ここで、例えば、High Performance Computing（ＨＰＣ）アプリケーションプログラムでは、プログラムのホットスポットが限られる傾向がある。したがって、プログラムの特徴を捉えるためにプロファイル情報を取得する場合でも、いくつかのループ処理のみを調査すればよい場合が多い。そこで、第１実施形態では、例えばある業務処理に関するプログラム全体のうち、ループ処理を含む一部分を対象プログラムとし、この対象プログラムに関する入力情報を情報処理装置１０に入力する場合について説明する。図４に、情報処理装置１０に入力される対象プログラムのプログラム情報の一例を示す。
【００２６】
ステップＳ１０で、詳細を後述する第１変換処理が実行されて、対象プログラムのプログラム情報が、例えば図５に示すような命令アドレス情報取得プログラムのソースファイルに変換される。
【００２７】
次に、ステップＳ３０で、取得部１２が、例えば、図６に示すプログラムデータ情報、図７に示す配列データ情報、及び図８に示す変数データ情報を用いて、第１変換部１１により変換された命令アドレス情報取得プログラムを実行する。図６に示すプログラムデータ情報には、対象プログラムで参照する各配列の開始アドレス、配列の要素当たりのバイト数、及び次元情報が含まれる。図７に示す配列データ情報は、図４に示す対象プログラムで参照される配列ＮＪの各要素の値（データ）をインデックスと対応付けた情報である。図８に示す変数データ情報は、対象プログラムにおけるループの回転数を示す変数ＮＩの値（データ）を示す情報である。
【００２８】
取得部１２は、図５に示す命令アドレス情報取得プログラムを実行し、例えば図９に示すような命令アドレス情報を取得する。図９に示す命令アドレス情報では、対象プログラム内の命令の位置に付加されたラベル（詳細は後述）と、そのラベルの位置でプログラムがアクセスするメモリのアドレス値とが対応付けられている。各ラベルの位置に対応するアドレス値の取得方法は、例えばＣ言語のプログラムであれば、ＧＮＵ  Ｃコンパイラがコンパイラの拡張機能として持つ、ラベルに対応するアドレス値を取得するための演算子＆＆を利用して実現することができる。
【００２９】
次に、ステップＳ４０で、詳細を後述する第２変換処理が実行されて、対象プログラムのプログラム情報が、例えば図１０に示すようなプロファイル情報生成プログラムのソースファイルに変換される。
【００３０】
次に、ステップＳ６０で、生成部１４が、上記ステップＳ４０で変換されたプロファイル情報生成プログラムを実行する。生成部１４は、プロファイル情報生成プログラムの実行に、入力情報に含まれるプログラムデータ情報、配列データ情報、変数データ情報、キャッシュ構成情報、及び上記ステップＳ３０で取得した命令アドレス情報を用いる。これにより、生成部１４は、対象プログラム中のデータ及び命令が記憶されたメモリへのアクセス要求に対応するキャッシュメモリへのアクセスをシミュレーションして、キャッシュのプロファイル情報を生成する。生成部１４は、生成したキャッシュのプロファイル情報を出力し、情報処理は終了する。
【００３１】
図１０に示すプロファイル情報生成プログラムに含まれるライブラリ関数ＡＣＣＥＳＳで呼び出される関数ａｄｄｒｅｓｓ（Ｄ）は、プログラム実行時に配列の要素Ｄのアドレス値を取得する関数である。このａｄｄｒｅｓｓ（Ｄ）は、図６に示すプログラムデータ情報を参照して、該当のアドレス値を特定することで実現することができる。例えば、ＮＪ［ｉ］のアドレスは、配列ＮＪの開始アドレス４０００、配列の要素当たりのバイト数４、及び変数ｉから、４０００＋ｉ×４と特定することができる。また、例えばＣ言語のプログラムであれば、演算子＆を利用して実現してもよい。
【００３２】
また、図１０に示すプロファイル情報生成プログラムに含まれるライブラリ関数ＡＣＣＥＳＳで呼び出される関数ｉａｄｄｒｅｓｓ（Ｉ）は、プログラム中のラベルＩに対応するアドレス値を取得する関数である。このｉａｄｄｒｅｓｓ（Ｉ）は、取得部１２により取得された命令アドレス情報（例えば図９）のラベル「Ｉ」に対応付けられた「アドレス値」を取得することにより実現することができる。
【００３３】
また、図１０に示すプロファイル情報生成プログラムに含まれるライブラリ関数ＡＣＣＥＳＳ（ａ）は、引数ａにａｄｄｒｅｓｓ（Ｄ）又はｉａｄｄｒｅｓｓ（Ｉ）で取得されたアドレス値を受け取る。そして、ライブラリ関数ＡＣＣＥＳＳ（ａ）は、入力情報に含まれるキャッシュ構成情報に基づいて、メモリのアドレスａへのアクセスに対応するキャッシュメモリへのアクセスをシミュレーションする。
【００３４】
具体的には、ライブラリ関数ＡＣＣＥＳＳ（ａ）は、アドレス値ａに対応するキャッシュメモリ上のキャッシュセット番号を特定する。アドレス値ａに対応するキャッシュセット番号ｓは、例えば図１１に示すような、キャッシュの連想数Ａ、ブロックサイズＢ、及びセット数Ｓの情報を含むキャッシュ構成情報を用い、以下のように特定される。
【００３５】
ｓ＝（ａ／Ｂ（小数点以下切捨て））ｍｏｄ Ｓ
【００３６】
そして、特定されたキャッシュセット番号ｓが示すキャッシュセットに、プログラムがアクセス要求したデータ又は命令が記憶されているか否かを判定する。該当のデータがキャッシュメモリに記憶されていない場合には、キャッシュミスであると判定する。なお、ライブラリ関数ＡＣＣＥＳＳ（ａ）は、特開２０１４−２３２３６９号公報で開示されている技術を適用することができるため、ここでは、詳細な説明を省略する。
【００３７】
また、図１０に示すプロファイル情報生成プログラムに含まれる関数ｐｒｉｎｔ＿ｏｕｔ＿ＲＥＳＵＬＴ（）は、ライブラリ関数ＡＣＣＥＳＳで特定されたキャッシュミス回数を、キャッシュのプロファイル情報として出力する。関数ｐｒｉｎｔ＿ｏｕｔ＿ＲＥＳＵＬＴ（）；は、例えば、特開２０１４−２３２３６９号公報で開示されているライブラリ関数ＤＵＭＰを実行することで実現することができる。
【００３８】
なお、図１０に示すプログラムは、キャッシュセット毎に、キャッシュのプロファイル情報生成処理を逐次実行する場合のキャッシュ情報生成プログラムの一例である。ここで、キャッシュのプロファイル情報はキャッシュセット毎に独立してシミュレーションすることが可能である。この性質を利用して、全てのキャッシュセットを同時にシミュレーションし、各キャッシュセットに関するキャッシュプロファイル情報生成処理を並列に実行することができる。例えば、キャッシュ情報生成プログラムの冒頭に、上述のキャッシュセット番号ｓを特定する式と同様の「ａｓ＝（ａｄｄｒｅｓｓ／Ｂ）％Ｓ」を加える。そして、ａｓが該当のキャッシュセットの番号（ｓ）と一致する場合に、上述のライブラリ関数ＡＣＣＥＳＳ（ａ）が実行されるようにすればよい。これにより、各キャッシュセットのプロファイル情報を並列処理で生成することができるため、プロファイル情報を高速に生成することができる。
【００３９】
次に、図１２を参照して、図３に示す情報処理のステップＳ１０で実行される第１変換処理について説明する。
【００４０】
まず、ステップＳ１１で、第１変換部１１が、入力された対象プログラムのプログラム情報を構成要素に分解する。そして、第１変換部１１は、全ての代入文に、ラベルを付加する。この際、第１変換部１１は、代入文を表現するデータサイズがキャッシュメモリのブロックサイズＢよりも大きい場合は、代入文を複数の文に分割し、それぞれにラベルを付加する。
【００４１】
次に、ステップＳ１２で、第１変換部１１が、入力された対象プログラムの入口（プログラム全体における対象プログラムの開始箇所）のアドレス値を取得するためのコードを出力する。なお、コードを出力するとは、生成するプログラムのソースファイルに該当のコードを記述することを意味する。
【００４２】
次に、ステップＳ１３で、第１変換部１１が、プログラム情報を分解した構成要素のうち、以下のステップＳ１４〜Ｓ１９の処理が未処理の構成要素が存在するか否かを判定する。未処理の構成要素が存在する場合には、第１変換部１１が、未処理の構成要素から、対象プログラムにおける出現順に１つの構成要素Ｓを選択し、処理はステップＳ１４へ移行する。
【００４３】
ステップＳ１４では、第１変換部１１が、構成要素Ｓがループか否かを判定する。肯定判定の場合には、処理はステップＳ１５へ移行し、第１変換部１１が、構成要素Ｓを出力し、処理はステップＳ１３に戻る。一方、否定判定の場合には、処理はステップＳ１６へ移行する。
【００４４】
ステップＳ１６では、第１変換部１１が、構成要素Ｓが代入文か否かを判定する。肯定判定の場合には、処理はステップＳ１７へ移行し、否定判定の場合には、処理はステップＳ１８へ移行する。
【００４５】
ステップＳ１７では、第１変換部１１が、代入文に付加されているラベルＬを検出し、代入文の直前の位置のアドレス値を取得するためのコードを出力する。そして、第１変換部１１が、代入文Ｓを出力する。さらに、第１変換部１１が、代入文Ｓの後に代入文の直後の位置のアドレス値を取得するためのコードを出力し、処理はステップＳ１３に戻る。
【００４６】
ステップＳ１８では、第１変換部１１が、構成要素Ｓがループを閉じる括弧か否かを判定する。肯定判定の場合には、処理はステップＳ１９へ移行し、第１変換部１１が、構成要素Ｓを出力し、処理はステップＳ１３に戻る。否定判定の場合には、そのままステップＳ１３に戻る。
【００４７】
ステップＳ１３で、第１変換部１１が、対象プログラムのプログラム情報を分解した構成要素の全てについて、ステップＳ１４〜Ｓ１９の処理が終了したと判定した場合には、処理はステップＳ２０へ移行する。ステップＳ２０では、第１変換部１１が、入力された対象プログラムの出口（プログラム全体における対象プログラムの終了箇所）のアドレス値を取得するためのコードを出力する。
【００４８】
次に、ステップＳ２１で、取得されたアドレス値の各々を、各ラベルと対応付けた命令アドレス情報を出力するためのコードを出力して、第１変換処理は終了する。
【００４９】
第１変換処理の一例として、図４に示す対象プログラムのプログラム情報を命令アドレス情報取得プログラムに変換する場合について説明する。
【００５０】
まず、第１変換部１１は、プログラム情報を、図１３に示すように、各構成要素に分解する（ステップＳ１１）。図１３の例では、プログラム情報において各構成要素が出現する順に、各構成要素に番号Ｅｊ（ｊ＝１，２，・・・，６）を付与している。以下では、番号Ｅｊの構成要素を「構成要素Ｅｊ」と表記する。
【００５１】
そして、第１変換部１１は、代入文である構成要素Ｅ２及びＥ４の各々にラベルを付加する（ステップＳ１１）。図１３では、構成要素Ｅ２にはラベル「Ｓ１」が付加され、構成要素Ｅ４にはラベル「Ｓ２」が付加された例を示している。なお、本実施形態では、説明を分かり易くするため、図４に示す対象プログラムのプログラム情報についても、ラベルを付加した状態で表している。
【００５２】
なお、以下に示すような代入文がプログラム情報に含まれ、この代入文のデータサイズが、キャッシュメモリのブロックサイズＢよりも大きいとする。
【００５３】
Ａ［ｘ］＝Ｂ［ｘ］＋Ｂ［ｘ＋１］＋Ｂ［ｘ＋２］＋Ｂ［ｘ＋３］
＋Ｂ［ｘ＋４］＋Ｂ［ｘ＋５］＋Ｂ［ｘ＋６］；
【００５４】
この場合、例えば、以下に示すように、分割後の各部分のサイズがブロックサイズＢよりも小さくなるように代入文を分割した上で、分割された代入文の各部分にそれぞれラベルを付加する。ここで、ｔｍｐは代入文を分割するために導入する作業用変数である。
【００５５】
Ｓ１：  ｔｍｐ＝Ｂ［ｘ］＋Ｂ［ｘ＋１］＋Ｂ［ｘ＋２］＋Ｂ［ｘ＋３］；
Ｓ２：  Ａ［ｘ］＝ｔｍｐ＋Ｂ［ｘ＋４］＋Ｂ［ｘ＋５］＋Ｂ［ｘ＋６］；
【００５６】
次に、第１変換部１１は、入力された対象プログラムの入口のアドレス値を取得するためのコードとして、例えば、以下のコードを出力する（ステップＳ１２）。
【００５７】
ＡＳ：；
【００５８】
ＡＳは、対象プログラムの入口の位置を示すラベルである。
【００５９】
次に、第１変換部１１は、構成要素Ｅ１を処理対象として選択する。構成要素Ｅ１はループであるため、第１変換部１１は、構成要素Ｅ１を出力する（ステップＳ１５）。
【００６０】
次に、第１変換部１１は、構成要素Ｅ２を処理対象として選択する。構成要素Ｅ２は代入文であるため、第１変換部１１は、まず、代入文のラベル「Ｓ１」を検出し、検出したラベルを利用して、例えば以下に示すように、代入文の直前の位置のアドレス値を取得するためのコードを出力する（ステップＳ１７）。
【００６１】
ＡＳ１Ｓ：；
【００６２】
そして、第１変換部１１は、構成要素Ｅ２自身を出力し、その後に、例えば以下に示すような、代入文の直後の位置のアドレス値を取得するためのコードを出力する（ステップＳ１７）。
【００６３】
ＡＳ１Ｅ：；
【００６４】
ＡＬＳは、ラベルＬが付加された代入文の直前の位置を示すラベル、ＡＬＥは、ラベルＬが付加された代入文の直後の位置を示すラベルである。
【００６５】
次に、第１変換部１１は、構成要素Ｅ３を処理対象として選択する。構成要素Ｅ３はループであるため、第１変換部１１は、構成要素Ｅ３を出力する（ステップＳ１５）。
【００６６】
次に、第１変換部１１は、構成要素Ｅ４を処理対象として選択する。構成要素Ｅ４は代入文であるため、第１変換部１１は、まず、代入文のラベル「Ｓ２」を検出し、検出したラベルを利用して、例えば以下に示すように、代入文の直前の位置のアドレス値を取得するためのコードを出力する（ステップＳ１７）。
【００６７】
ＡＳ２Ｓ：；
【００６８】
そして、第１変換部１１は、構成要素Ｅ４自身を出力し、その後に、例えば以下に示すような、代入文の直後の位置のアドレス値を取得するためのコードを出力する（ステップＳ１７）。
【００６９】
ＡＳ２Ｅ：；
【００７０】
次に、第１変換部１１は、構成要素Ｅ５を処理対象として選択する。構成要素Ｅ５はループを閉じる括弧であるため、第１変換部１１は、単に構成要素Ｅ５を出力する（ステップＳ１９）。構成要素Ｅ６もループを閉じる括弧であるため、構成要素Ｅ５と同様に処理される。
【００７１】
以上のように、全ての構成要素の処理が終了すると、第１変換部１１は、入力された対象プログラムの出口のアドレス値を取得するためのコードとして、例えば、以下のコードを出力する（ステップＳ２０）。
【００７２】
ＡＥ：；
【００７３】
ＡＥは、対象プログラムの出口の位置を示すラベルである。
【００７４】
最後に、第１変換部１１は、例えば以下に示すように、取得されたアドレス値の各々を、各ラベルと対応付けて出力するためのコードを出力する（ステップＳ２３）。
【００７５】
ｐｒｉｎｔｆ（”０ｘ％ｘ￥ｎ”，＆＆ＡＳ）；
ｐｒｉｎｔｆ（”０ｘ％ｘ￥ｎ”，＆＆ＡＳ１Ｓ）；
ｐｒｉｎｔｆ（”０ｘ％ｘ￥ｎ”，＆＆ＡＳ１Ｅ）；
ｐｒｉｎｔｆ（”０ｘ％ｘ￥ｎ”，＆＆ＡＳ２Ｓ）；
ｐｒｉｎｔｆ（”０ｘ％ｘ￥ｎ”，＆＆ＡＳ２Ｅ）；
ｐｒｉｎｔｆ（”０ｘ％ｘ￥ｎ”，＆＆ＡＥ）；
【００７６】
上記の例は、ＧＮＵ  Ｃコンパイラがコンパイラの拡張機能として持つ、ラベルに対応するアドレス値を取得するための演算子＆＆を利用している。
【００７７】
これにより、図４に示すプログラム情報が、図５に示すような命令アドレス情報取得プログラムに変換される。
【００７８】
次に、図１４を参照して、図３に示す情報処理のステップＳ４０で実行される第２変換処理について説明する。なお、第２変換処理において、上述の第１変換処理（図１２）と同様の処理については、同一符号を付している。
【００７９】
まず、ステップＳ１１で、第２変換部１３が、入力された対象プログラムのプログラム情報を構成要素に分解する。なお、上述の第１変換処理（図１２）のステップＳ１１におけるプログラム情報の分解結果（例えば図１３）を取得してもよい。
【００８０】
次に、ステップＳ４１で、第２変換部１３が、入力された対象プログラムの入口のラベルＡＳに対応するアドレス値を引数とするライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する。なお、第２変換部１３は、対象プログラムの入口のラベルＡＳに対応するアドレス値を、取得部１２により取得された命令アドレス情報（例えば図９）から取得する関数ｉａｄｄｒｅｓｓを引数に設定する。
【００８１】
次に、ステップＳ１３で、第２変換部１３が、未処理の構成要素が存在するか否かを判定する。未処理の構成要素が存在する場合には、第２変換部１３が、未処理の構成要素から、対象プログラムにおける出現順に１つの構成要素Ｓを選択し、処理はステップＳ１４へ移行する。
【００８２】
ステップＳ１４では、第２変換部１３が、構成要素Ｓがループか否かを判定する。肯定判定の場合には、処理はステップＳ１５へ移行し、第２変換部１３が、構成要素Ｓを出力し、処理はステップＳ１３に戻る。一方、否定判定の場合には、処理はステップＳ４２へ移行する。
【００８３】
ステップＳ４２では、第２変換部１３が、構成要素Ｓがループの回転数に影響を与えない代入文か否かを判定する。否定判定の場合には、処理はステップＳ４４へ移行し、肯定判定の場合には、処理はステップＳ４３へ移行し、第２変換部１３が、構成要素Ｓを削除し、処理はステップＳ４６へ移行する。
【００８４】
ステップＳ４４では、第２変換部１３が、構成要素Ｓがループの回転数に影響を与える代入文か否かを判定する。否定判定の場合には、処理はステップＳ１８へ移行し、肯定判定の場合には、処理はステップＳ４５へ移行し、第２変換部１３が、構成要素Ｓを出力し、処理はステップＳ４６へ移行する。
【００８５】
ステップＳ４６では、第２変換部１３が、構成要素Ｓである代入文に付加されたラベルＬを検出し、代入文の直前の位置を示すラベルＡＬＳに対応するアドレス値を引数とするライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する。そして、第２変換部１３が、構成要素Ｓの代入文に含まれる各項ｔが参照する配列の要素のアドレス値の各々を引数とするライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する。さらに、第２変換部１３が、代入文の直後の位置を示すラベルＡＬＥに対応するアドレス値を引数とするライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する。
【００８６】
なお、第２変換部１３は、ラベルＡＬＳ及びＡＬＥに対応するアドレス値を、取得部１２により取得された命令アドレス情報（例えば図９）から取得する関数ｉａｄｄｒｅｓｓを、ラベルＡＬＳ及びＡＬＥに対するライブラリ関数ＡＣＣＥＳＳの引数に設定する。また、各項ｔが参照する配列の要素のアドレス値を、プログラムデータ情報（例えば図７）を参照して特定する関数ａｄｄｒｅｓｓを、各項ｔに対するライブラリ関数ＡＣＣＥＳＳの引数に設定する。そして、処理はステップＳ１３に戻る。
【００８７】
ステップＳ１８では、第２変換部１３が、構成要素Ｓがループを閉じる括弧か否かを判定する。肯定判定の場合には、処理はステップＳ１９へ移行し、第２変換部１３が、構成要素Ｓを出力し、処理はステップＳ１３に戻る。否定判定の場合には、そのままステップＳ１３に戻る。
【００８８】
ステップＳ１３で、第２変換部１３が、対象プログラムのプログラム情報を分解した構成要素の全てについて、ステップＳ１４〜Ｓ１９の処理が終了したと判定した場合には、処理はステップＳ４７へ移行する。ステップＳ４７では、第２変換部１３が、入力された対象プログラムの出口のラベルＡＥに対応するアドレス値を引数とするライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する。なお、第２変換部１３は、対象プログラムの出口のラベルＡＥに対応するアドレス値を、取得部１２により取得された命令アドレス情報（例えば図９）から取得する関数ｉａｄｄｒｅｓｓを引数に設定する。
【００８９】
次に、ステップＳ４８で、第２変換部１３が、キャッシュのプロファイル情報を出力するコードを出力し、第２変換処理は終了する。
【００９０】
第２変換処理の一例として、図４に示す対象プログラムのプログラム情報をプロファイル情報生成プログラムに変換する場合について説明する。
【００９１】
まず、第２変換部１３は、第１変換処理と同様に、プログラム情報を、図１３に示すように、各構成要素に分解する（ステップＳ１１）。
【００９２】
次に、第２変換部１３は、例えば、以下に示すように、対象プログラムの入口のアドレス値に対して、ライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する（ステップＳ４１）。
【００９３】
ＡＣＣＥＳＳ（ｉａｄｄｒｅｓｓ（ＡＳ））；
【００９４】
次に、第２変換部１３は、構成要素Ｅ１を処理対象として選択する。構成要素Ｅ１はループであるため、第２変換部１３は、構成要素Ｅ１を出力する（ステップＳ１５）。
【００９５】
次に、第２変換部１３は、構成要素Ｅ２を処理対象として選択する。構成要素Ｅ２はループの回転数に影響を与える代入文であるため、第２変換部１３は、まず構成要素Ｅ２自身を出力する（ステップＳ４５）。そして、第２変換部１３は、構成要素Ｅ２である代入文に付加されたラベルＳ１を検出し、以下に示すように、代入文の直前の位置を示すラベルＡＳ１Ｓに対応するアドレス値に対して、ライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する（ステップＳ４６）。
【００９６】
ＡＣＣＥＳＳ（ｉａｄｄｒｅｓｓ（ＡＳ１Ｓ））；
【００９７】
その後に、第２変換部１３は、以下に示すように、構成要素Ｅ２である代入文に出現する、配列の要素ＮＪ［ｉ］に対して、ライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する（ステップＳ４６）。
【００９８】
ＡＣＣＥＳＳ（ａｄｄｒｅｓｓ（ＮＪ［ｉ］））；
【００９９】
そして、第２変換部１３は、以下に示すように、代入文の直後の位置を示すラベルＡＳ１Ｅに対応するアドレス値に対して、ライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する（ステップＳ４６）。
【０１００】
ＡＣＣＥＳＳ（ｉａｄｄｒｅｓｓ（ＡＳ１Ｅ））；
【０１０１】
次に、第２変換部１３は、構成要素Ｅ３を処理対象として選択する。構成要素Ｅ３はループであるため、第２変換部１３は、構成要素Ｅ３を出力する（ステップＳ１５）。
【０１０２】
次に、第２変換部１３は、構成要素Ｅ４を処理対象として選択する。構成要素Ｅ４はループの回転数に影響を与えない代入文であるため、第２変換部１３は、構成要素Ｅ４を削除する（ステップＳ４３）。そして、第２変換部１３は、構成要素Ｅ４である代入文に付加されたラベルＳ２を検出し、例えば以下に示すように、代入文の直前の位置を示すラベルＡＳ２Ｓに対応するアドレス値に対して、ライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する（ステップＳ４６）。
【０１０３】
ＡＣＣＥＳＳ（ｉａｄｄｒｅｓｓ（ＡＳ２Ｓ））；
【０１０４】
その後に、第２変換部１３は、以下に示すように、構成要素Ｅ４である代入文の右辺に出現するＸ［ｉ］［ｊ］、Ｙ［ｉ］［ｊ］と、左辺に出現するＺ［ｉ］［ｊ］の３つの配列の要素の各々に対して、ライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する（ステップＳ４６）。
【０１０５】
ＡＣＣＥＳＳ（ａｄｄｒｅｓｓ（Ｘ［ｉ］［ｊ］））；
ＡＣＣＥＳＳ（ａｄｄｒｅｓｓ（Ｙ［ｉ］［ｊ］））；
ＡＣＣＥＳＳ（ａｄｄｒｅｓｓ（Ｚ［ｉ］［ｊ］））；
【０１０６】
そして、第２変換部１３は、例えば以下に示すように、代入文の直後の位置を示すラベルＡＳ２Ｅに対応するアドレス値に対して、ライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する（ステップＳ４６）。
【０１０７】
ＡＣＣＥＳＳ（ｉａｄｄｒｅｓｓ（ＡＳ２Ｅ））；
【０１０８】
次に、第２変換部１３は、構成要素Ｅ５を処理対象として選択する。構成要素Ｅ５はループを閉じる括弧であるため、第２変換部１３は、単に構成要素Ｅ５を出力する（ステップＳ１９）。構成要素Ｅ６もループを閉じる括弧であるため、構成要素Ｅ５と同様に処理される。
【０１０９】
以上のように、全ての構成要素の処理が終了すると、第２変換部１３は、例えば以下に示すように、入力された対象プログラムの出口のアドレス値に対して、ライブラリ関数ＡＣＣＥＳＳを実行するコードを出力する（ステップＳ４７）。
【０１１０】
ＡＣＣＥＳＳ（ｉａｄｄｒｅｓｓ（ＡＥ））；
【０１１１】
最後に、第２変換部１３は、例えば以下に示すように、キャッシュのプロファイル情報を出力するコードを出力する（ステップＳ４８）。
【０１１２】
ｐｒｉｎｔ＿ｏｕｔ＿ＲＥＳＵＬＴ（）；
【０１１３】
これにより、図４に示すプログラム情報が、図１０に示すようなプロファイル情報生成プログラムに変換される。
【０１１４】
以上説明したように、第１実施形態に係る情報処理装置１０によれば、プログラム内の命令に付加したラベルを手がかりに、プログラムがラベルに対応する位置を実行する際にアクセス要求するメモリのアドレス値を取得する。そして、第１実施形態に係る情報処理装置１０は、取得したアドレス値に対応するキャッシュメモリのキャッシュセットへのアクセスをシミュレーションして、キャッシュのプロファイル情報を取得する。これにより、命令についても、配列の要素等の他のデータと同様に、キャッシュのプロファイル情報を取得することができる。
【０１１５】
また、対象プログラムが行う計算を省略して、メモリへのアクセスだけを考慮したシミュレーションを行うことにより、プロファイル情報を高速に取得することができる。
【０１１６】
例えば、ＨＰＣアプリケーションプログラムは一般に、複数の巨大な配列にアクセスするため、プログラムの総実行時間における、メモリアクセスに要する時間が占める割合が多く、かつ個々の命令の実行時間が長い浮動小数点演算を大量に含む。本実施形態では、浮動小数点演算もメモリアクセスもほとんど必要としないため、処理を高速化することができる。
【０１１７】
また、キャッシュアクセスをシミュレーションするため、対象プログラムが稼動する実機を使用することなく、対象プログラムのキャッシュアクセスのプロファイル情報を取得することができる。
【０１１８】
また、対象プログラムの開発環境と実際の稼働環境との相違により、開発時と実際の稼動時とでキャッシュ構成が異なる場合がある。ＣＰＵの内蔵レジスタを使用してプロファイル情報を取得する場合は、そのＣＰＵのキャッシュ構成に基づくプロファイル情報しか取得することができない。本実施形態では、実際の稼動時のキャッシュ構成を示すキャッシュ構成情報を与えてシミュレーションすることで、適切なプロファイル情報を取得することができる。
【０１１９】
また、キャッシュメモリへのアクセスのシミュレーションを、キャッシュセット毎に並列に行うことができる。このことも、プロファイル情報取得の高速化に寄与する。例えば、キャッシュセット数はＣＰＵによって異なるが、一般に１００個以上から数千個である。したがって、キャッシュセット毎に逐次プロファイル情報を取得する場合と比較して、１００倍から数千倍以上の高速化を図ることができる。
【０１２０】
＜第２実施形態＞
次に、第２実施形態について説明する。なお、第２実施形態に係る情報処理装置において、第１実施形態に係る情報処理装置１０と同一の部分については、同一符号を付して、詳細な説明を省略する。
【０１２１】
第２実施形態に係る情報処理装置２１０に入力される対象プログラムの入力情報には、第１実施形態における入力情報に加え、配置試行情報（詳細は後述）が含まれる。情報処理装置２１０は、図１に示すように、機能的には、第１変換部１１と、取得部１２と、第２変換部１３と、生成部２１４とを含む。なお、第１変換部１１及び取得部１２は、開示の技術の取得部の一例であり、第２変換部１３及び生成部２１４は、開示の技術の生成部の一例である。
【０１２２】
生成部２１４は、取得部１２により取得された命令アドレス情報と、対象プログラムの入力情報として与えたプログラムデータ情報のデータアドレス情報とを変更した複数の配置情報の各々について、キャッシュミスの回数を計測する。そして、生成部２１４は、キャッシュミスの回数が最も少ない場合に対応する配置情報を、命令及びデータのアドレスの最適配置情報として生成し、出力する。
【０１２３】
情報処理装置２１０は、例えば図２に示すコンピュータ２０で実現することができる。コンピュータ２０の記憶部２３には、コンピュータ２０を情報処理装置２１０として機能させるための情報処理プログラム２３０が記憶される。情報処理プログラム２３０は、第１変換プロセス３１と、取得プロセス３２と、第２変換プロセス３３と、生成プロセス２３４とを有する。
【０１２４】
ＣＰＵ２１は、情報処理プログラム２３０を記憶部２３から読み出してメモリ２２に展開し、情報処理プログラム２３０が有するプロセスを順次実行する。ＣＰＵ２１は、生成プロセス２３４を実行することで、図１に示す生成部２１４として動作する。他のプロセスについては、第１実施形態に係る情報処理プログラム３０と同様である。これにより、情報処理プログラム２３０を実行したコンピュータ２０が、情報処理装置２１０として機能する。
【０１２５】
なお、情報処理プログラム２３０により実現される機能は、例えば半導体集積回路、より詳しくはＡＳＩＣ等で実現することも可能である。
【０１２６】
次に、第２実施形態に係る情報処理装置２１０の作用について説明する。対象プログラムの入力情報が情報処理装置２１０に入力され、プロファイルの開始が指示されると、情報処理装置２１０が、図１５に示す情報処理を実行する。なお、第２実施形態における情報処理において、第１実施形態における情報処理（図３）と同様の処理については、同一符号を付して詳細な説明を省略する。
【０１２７】
ステップＳ１０〜Ｓ４０が第１実施形態と同様に実行され、例えば、図９に示す命令アドレス情報、及び図１０に示すプロファイル情報生成プログラムが得られる。
【０１２８】
次に、ステップＳ５０で、生成部２１４が、上記ステップＳ３０で取得された命令アドレス情報を、各ラベルに対応するアドレス値を、先頭のラベルに対応するアドレス値からのオフセット値の表現に変換した、最適化用命令アドレス情報に変換する。なお、本実施形態においては、先頭のラベルとは、最も小さいアドレス値に対応するラベル、すなわち、プログラム全体における対象プログラムの入口を示すラベルＡＳである。したがって、生成部２１４は、ラベルＡＳに対応するアドレス値と各ラベルに対応するアドレス値との差を各ラベルに対応するオフセット値として計算することにより、命令アドレス情報を最適化用命令アドレス情報に変換する。図１６に、図９に示す命令アドレス情報を変換した最適化用命令アドレス情報を示す。
【０１２９】
次に、ステップＳ５５で、生成部２１４が、上記ステップＳ４０で変換されたプロファイル情報生成プログラムを、最適化用プロファイル情報生成プログラムに変換する。
【０１３０】
具体的には、生成部２１４は、命令のキャッシュのプロファイル情報を取得するライブラリ関数ＡＣＣＥＳＳの引数を、以下に示すように変換する。
【０１３１】
変換前：ＡＣＣＥＳＳ（ｉａｄｄｒｅｓｓ（Ｉ））；
変換後：ＡＣＣＥＳＳ（ＡＳＴＡＲＴ＋ｉｏｆｆｓｅｔ（Ｉ））；
【０１３２】
ここで、ＡＳＴＡＲＴは、先頭のラベルに対応するアドレス値である。また、ｉｏｆｆｓｅｔ（Ｉ）の値は、上記ステップＳ５０で変換された最適化用命令アドレス情報のラベルＩに対応するオフセット値である。
【０１３３】
また、生成部２１４は、配列の要素のキャッシュのプロファイル情報を取得するライブラリ関数ＡＣＣＥＳＳの引数を、以下に示すように変換する。
【０１３４】
変換前：ＡＣＣＥＳＳ（ａｄｄｒｅｓｓ（Ｄ））；
変換後：ＡＣＣＥＳＳ（ＤＳＴＡＲＴ（Ｘ）＋ｏｆｆｓｅｔ（Ｘ））；
【０１３５】
ここで、ＤＳＴＡＲＴ（Ｘ）は、配列Ｘの先頭要素のアドレス値である。また、ｏｆｆｓｅｔ（Ｘ）の値は、配列Ｘの要素Ｄのアドレス値から配列Ｘの先頭要素のアドレス値を引くことによって、最適化用プロファイル情報生成プログラムの実行時に計算することができる。例えば、ｏｆｆｓｅｔ（Ｘ［ｉ］［ｊ］）は、
＆（Ｘ［ｉ］［ｊ］）−＆（Ｘ［０］［０］）
として、計算することができる。図１７に、図１０に示すプロファイル情報生成プログラムを変換した最適化用プロファイル情報生成プログラムを示す。
【０１３６】
次に、ステップＳ６１で、生成部２１４が、キャッシュミス回数の最小値を表す作業用変数ＭをＭ＝∞に初期化し、キャッシュミス回数を最小化する最適な配置情報を表す作業用変数ＲＥＳＵＬＴを空に初期化する。
【０１３７】
次に、ステップＳ６２で、生成部２１４が、入力情報に含まれる配置試行情報から作成される配置情報のうち、以下のステップＳ６４〜Ｓ６６の処理が未試行の配置情報が存在するか否かを判定する。未試行の配置情報が存在する場合には、処理はステップＳ６３へ移行する。
【０１３８】
ここで、配置試行情報は、例えば図１８に示すように、「データ名」で特定される命令及びデータの「開始アドレス値」と、各データに対して開始アドレス値をどのような値の範囲で変更するかを示す「変更オフセット範囲」とを定義している。「データ名」の「ＡＳＴＡＲＴ」は、先頭のラベルに対応する命令を表す。また、「データ名」が配列を示す場合、その配列の先頭要素の開始アドレス値が「開始アドレス値」で定義されている。
【０１３９】
図１３の例では、先頭のラベル及び全てのデータについて、変更オフセット範囲を０から２５６バイトの範囲としている。先頭のラベル及び各データについての、変更オフセット範囲内で、所定バイト単位のオフセット値の組合せの各々が、配置情報となる。例えば、所定バイト単位が８バイトの場合、先頭のラベル及び各データのオフセット値は、０、８、・・・、２５６の３３パターンから選択可能であり、図１８の例では、データが５種類あるため、３３５パターンの配置情報が作成可能である。なお、所定バイト単位は、キャッシュ構成情報、キャッシュメモリのブロック及びラインのサイズ、配列のサイズ、要素のデータサイズ等に応じて適宜設定すればよい。
【０１４０】
ステップＳ６３では、生成部２１４が、配置試行情報を参照して、図１９に示すように、未試行の配置情報Ｘを１つ作成する。図１９の配置情報Ｘでは、配列Ｚについて、１２８バイト分、開始アドレス値を増やし、
ＤＳＴＡＲＴ（Ｚ）＝０ｘ３０００＋１２８＝０ｘ３０８０
とすることを表す。先頭のラベル及びそれ以外のデータに関しては、配置試行情報で定義された開始アドレス値をそのまま使用することを表している。
【０１４１】
次に、ステップＳ６４で、生成部２１４が、プログラムデータ情報、配列データ情報、変数データ情報、キャッシュ構成情報、最適化命令アドレス情報、配置試行情報、及び配置情報Ｘを用いて、最適化用プロファイル情報生成プログラムを実行する。この際、最適化用プロファイル情報生成プログラムのＡＳＴＡＲＴ及びＤＳＴＡＲＴ（Ｄ）の各々では、配置試行情報の「開始アドレス値」に、上記ステップＳ６３で作成された配置情報Ｘで示されるオフセット値を加えたアドレス値が参照される。生成部２１４は、最適化用プロファイル情報生成プログラムの実行結果として、キャッシュミスの回数ｍを出力する。
【０１４２】
次に、ステップＳ６５で、生成部２１４が、上記ステップＳ６４で出力されたキャッシュミスの回数ｍが、作業用変数Ｍより小さいか否かを判定する。ｍ＜Ｍの場合には、処理はステップＳ６６へ移行し、生成部２１４が、Ｍにｍの値を保存し、かつ作業用変数ＲＥＳＵＬＴに、上記ステップＳ６３で作成された配置情報Ｘを保存し、処理はステップＳ６２に戻る。一方、ｍ≧Ｍの場合には、ステップＳ６６の処理はスキップして、ステップＳ６２に戻る。
【０１４３】
ステップＳ６２で、全ての配置情報を試行済みであると判定された場合には、処理はステップＳ６７へ移行する。ステップＳ６７では、生成部２１４が、Ｍに保存されている最小のキャッシュミスの回数、及びＲＥＳＵＬＴに保存されている配置情報Ｘを、対象プログラムのキャッシュのプロファイル情報として出力し、情報処理は終了する。
【０１４４】
以上説明したように、第２実施形態に係る情報処理装置２１０によれば、命令及びデータの配置を変更した複数の配置情報について、キャッシュのプロファイル情報としてキャッシュミスの回数を取得する。そして、キャッシュミスの回数が最小となる配置情報を、命令及びデータの最適配置情報として出力する。これにより、第２実施形態に係る情報処理装置２１０は、第１実施形態の効果に加え、人手による試行錯誤を必要とすることなく、キャッシュの利用効率を改善できる命令及びデータの最適配置情報を取得することができる。
【０１４５】
なお、上記各実施形態では、命令とデータとを同じキャッシュに記憶するノイマン型アーキテクチャを前提に説明したが、これに限定されない。ノイマン型アーキテクチャの実施形態を一部変更することで、命令とデータとを異なるキャッシュに記憶するハーバード・アーキテクチャにも適用可能である。
【０１４６】
例えば、レベル１に命令キャッシュＬ１Ｉと、データキャッシュＬ１Ｄとが存在し、レベル２のキャッシュがｕｎｉｆｉｅｄキャッシュであるアーキテクチャを考える。この場合、図１１に示すようなキャッシュ構成情報を、Ｌ１Ｉ用、Ｌ１Ｄ用、及びＬ２用の３つ用意する。そして、命令アドレス情報を参照するライブラリ関数ＡＣＣＥＳＳを、ライブラリ関数ＩＡＣＣＥＳＳに変更する。すなわち、ライブラリ関数ＡＣＣＥＳＳは、データキャッシュＬ１Ｄへのアクセスをシミュレーションし、ライブラリ関数ＩＡＣＣＥＳＳは命令キャッシュＬ１Ｉへのアクセスをシミュレーションするように実現する。
【０１４７】
キャッシュＬ１Ｉ及びＬ１Ｄの下には、キャッシュＬ２を結合し、例えば、特開２０１４−２３２３６９に示す、多段キャッシュのシミュレーションによって、キャッシュのプロファイル情報を取得する。図２０に、図４に示す対象プログラムのプログラム情報を、ハーバード・アーキテクチャに対応させて、プロファイル情報生成プログラムに変換した例を示す。
【０１４８】
また、上記各実施形態では、ライブラリ関数ＡＣＣＥＳＳにより取得されるキャッシュミスの回数をキャッシュのプロファイル情報として出力する場合について説明したが、これに限定されない。例えば、どの命令又はどのデータへのアクセスでキャッシュミスが発生しているかを示す情報を出力することも可能である。この場合、例えば、
ＡＣＣＥＳＳ（行ｘ）（ａｄｄｒｅｓｓ）；
のように、対象プログラムの何行目の命令又はデータに関するキャッシュのプロファイル情報を出力するためのライブラリ関数ＡＣＣＥＳＳかを示す情報を付加しておく。この場合、
行ｘ：ｍ回
のように、行毎、すなわち、命令やデータ毎のキャッシュミスの回数を、キャッシュのプロファイル情報として出力することができる。
【０１４９】
また、上記各実施形態では、命令及びデータの両方のキャッシュのプロファイル情報を取得する場合について説明したが、命令のキャッシュのプロファイル情報のみを取得するようにしてもよい。
【０１５０】
また、上記では、情報処理プログラム３０、２３０が記憶部２３に予め記憶（インストール）されている態様を説明したが、これに限定されない。プログラムは、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＵＳＢメモリ等の記憶媒体に記憶された形態で提供することも可能である。
【０１５１】
以上の各実施形態に関し、更に以下の付記を開示する。
【０１５２】
（付記１）
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得する取得部と、
前記取得部により取得されたアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する生成部と、
を含む情報処理装置。
【０１５３】
（付記２）
前記取得部は、前記対象プログラムに含まれる命令の位置に付加情報を付加し、前記付加情報に対応するアドレスを、前記命令を示すデータが記憶される主記憶装置のアドレスとして取得する付記１に記載の情報処理装置。
【０１５４】
（付記３）
前記生成部は、前記取得部により取得された各命令を示すデータのアドレスと、対象プログラムが利用するデータのアドレスとを変更した複数の配置情報の各々について、キャッシュミスの回数を取得し、前記キャッシュミスの回数が最も少ない場合に対応する前記配置情報を、前記キャッシュメモリへのアクセスの成否を示す情報として生成する付記１又は付記２に記載の情報処理装置。
【０１５５】
（付記４）
前記生成部は、前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否を示す情報を生成する付記１〜付記３のいずれか１項に記載の情報処理装置。
【０１５６】
（付記５）
前記生成部は、前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否を示す情報を生成する処理を、前記キャッシュセット毎に並列に実行する付記４に記載の情報処理装置。
【０１５７】
（付記６）
前記生成部は、前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応する命令を示すデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を生成する付記４又は付記５に記載の情報処理装置。
【０１５８】
（付記７）
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、
取得したアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する
ことを含む処理をコンピュータが実行する情報処理方法。
【０１５９】
（付記８）
前記対象プログラムに含まれる命令の位置に付加情報を付加し、前記付加情報に対応するアドレスを、前記命令を示すデータが記憶される主記憶装置のアドレスとして取得する付記７に記載の情報処理方法。
【０１６０】
（付記９）
取得された各命令を示すデータのアドレスと、対象プログラムが利用するデータのアドレスとを変更した複数の配置情報の各々について、キャッシュミスの回数を取得し、前記キャッシュミスの回数が最も少ない場合に対応する前記配置情報を、前記キャッシュメモリへのアクセスの成否を示す情報として生成する付記７又は付記８に記載の情報処理方法。
【０１６１】
（付記１０）
前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否を示す情報を生成する付記７〜付記９のいずれか１項に記載の情報処理方法。
【０１６２】
（付記１１）
前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否を示す情報を生成する処理を、前記キャッシュセット毎に並列に実行する付記１０に記載の情報処理方法。
【０１６３】
（付記１２）
前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応する命令を示すデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を生成する付記１０又は付記１１に記載の情報処理方法。
【０１６４】
（付記１３）
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、
取得したアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する
ことを含む処理をコンピュータに実行させるための情報処理プログラム。
【０１６５】
（付記１４）
前記対象プログラムに含まれる命令の位置に付加情報を付加し、前記付加情報に対応するアドレスを、前記命令を示すデータが記憶される主記憶装置のアドレスとして取得する付記１３に記載の情報処理プログラム。
【０１６６】
（付記１５）
取得された各命令を示すデータのアドレスと、対象プログラムが利用するデータのアドレスとを変更した複数の配置情報の各々について、キャッシュミスの回数を取得し、前記キャッシュミスの回数が最も少ない場合に対応する前記配置情報を、前記キャッシュメモリへのアクセスの成否を示す情報として生成する付記１３又は付記１４に記載の情報処理プログラム。
【０１６７】
（付記１６）
前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否を示す情報を生成する付記１３〜付記１５のいずれか１項に記載の情報処理プログラム。
【０１６８】
（付記１７）
前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否を示す情報を生成する処理を、前記キャッシュセット毎に並列に実行する付記１６に記載の情報処理プログラム。
【０１６９】
（付記１８）
前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応する命令を示すデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を生成する付記１６又は付記１７に記載の情報処理プログラム。
【０１７０】
（付記１９）
対象プログラムに含まれる命令を示すデータが記憶される主記憶装置のアドレスを取得し、
取得したアドレスへのアクセス要求に対応するキャッシュメモリへのアクセスを、前記キャッシュメモリの構成情報に基づいて模擬して、前記命令に関して、前記キャッシュメモリへのアクセスの成否を示す情報を生成する
ことを含む処理をコンピュータに実行させるための情報処理プログラムを記憶した記憶媒体。
【符号の説明】
【０１７１】
１０、２１０  情報処理装置
１１   第１変換部
１２   取得部
１３   第２変換部
１４、２１４  生成部
２０   コンピュータ
２１   ＣＰＵ
２２   メモリ
２３   記憶部
２９   記憶媒体
３０、２３０  情報処理プログラム
【図１】
2019028918.tif 000003
【図２】
2019028918.tif 000004
【図３】
2019028918.tif 000005
【図４】
2019028918.tif 000006
【図５】
2019028918.tif 000007
【図６】
2019028918.tif 000008
【図７】
2019028918.tif 000009
【図８】
2019028918.tif 000010
【図９】
2019028918.tif 000011
【図１０】
2019028918.tif 000012
【図１１】
2019028918.tif 000013
【図１２】
2019028918.tif 000014
【図１３】
2019028918.tif 000015
【図１４】
2019028918.tif 000016
【図１５】
2019028918.tif 000017
【図１６】
2019028918.tif 000018
【図１７】
2019028918.tif 000019
【図１８】
2019028918.tif 000020
【図１９】
2019028918.tif 000021
【図２０】
2019028918.tif 000022