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

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

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

特開2024-157581分岐履歴記録システム、分岐履歴記録方法、及び分岐制御プログラム
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024157581
(43)【公開日】2024-11-08
(54)【発明の名称】分岐履歴記録システム、分岐履歴記録方法、及び分岐制御プログラム
(51)【国際特許分類】
   G06F 11/34 20060101AFI20241031BHJP
   G06F 8/41 20180101ALI20241031BHJP
【FI】
G06F11/34 171
G06F11/34 176
G06F8/41 100
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2023071975
(22)【出願日】2023-04-26
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100121083
【弁理士】
【氏名又は名称】青木 宏義
(74)【代理人】
【識別番号】100138391
【弁理士】
【氏名又は名称】天田 昌行
(74)【代理人】
【識別番号】100074099
【弁理士】
【氏名又は名称】大菅 義之
(72)【発明者】
【氏名】前田 宗則
【テーマコード(参考)】
5B042
5B081
【Fターム(参考)】
5B042HH30
5B042HH32
5B042HH35
5B042HH39
5B042MA05
5B042MA08
5B042MA10
5B042MA14
5B042MC04
5B042MC24
5B081CC16
5B081CC41
5B081DD02
(57)【要約】
【課題】プログラムの実行時における分岐履歴を容易に記録する。
【解決手段】第1演算処理部は、書き込みプログラムを実行することで、書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、記憶部に書き込む。第2演算処理部は、分岐制御プログラムを実行することで、記憶部から分岐情報を読み出し、分岐制御プログラムに含まれる複数のコードブロックのうち、分岐情報に対応するコードブロックへ分岐する、処理を実行する。取得部は、分岐制御プログラムの実行時に、実行された命令の命令アドレスを取得し、実行された命令の命令アドレスを含む動作情報を記録する。
【選択図】図5
【特許請求の範囲】
【請求項1】
記憶部と、
書き込みプログラムを実行することで、前記書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、前記記憶部に書き込む第1演算処理部と、
分岐制御プログラムを実行することで、前記記憶部から前記分岐情報を読み出し、前記分岐制御プログラムに含まれる複数のコードブロックのうち、前記分岐情報に対応するコードブロックへ分岐する、処理を実行する第2演算処理部と、
前記分岐制御プログラムの実行時に、実行された命令の命令アドレスを取得し、前記実行された命令の命令アドレスを含む動作情報を記録する取得部と、
を備えることを特徴とする分岐履歴記録システム。
【請求項2】
前記第2演算処理部は、前記分岐情報のハッシュ値を計算し、複数のハッシュ値それぞれを前記複数のコードブロックの何れかに対応付けるハッシュテーブルを用いて、前記分岐情報のハッシュ値に対応付けられたコードブロックを、前記分岐情報に対応するコードブロックとして特定することを特徴とする請求項1記載の分岐履歴記録システム。
【請求項3】
前記第2演算処理部は、前記分岐情報に対応するコードブロックが前記分岐制御プログラムに含まれていない場合、前記分岐制御プログラムに含まれているコードブロックをコピーすることで、前記分岐情報に対応するコードブロックを生成し、前記分岐情報に対応するコードブロックを前記分岐情報のハッシュ値と対応付けて前記ハッシュテーブルに登録することを特徴とする請求項2記載の分岐履歴記録システム。
【請求項4】
前記書き込みプログラムは、前記分岐情報を前記記憶部に書き込むコードを解析対象プログラムに埋め込むことで生成され、
前記分岐元命令アドレスは、前記解析対象プログラムにおける分岐元命令アドレスであり、
前記分岐先命令アドレスは、前記書き込みプログラムにおける分岐先命令アドレスであり、
前記第2演算処理部は、前記分岐情報に対応するコードブロックが前記分岐制御プログラムに含まれていない場合、前記分岐情報に対応するコードブロックのアドレスを、前記分岐情報と対応付けてコードブロック情報に記録し、
前記分岐履歴記録システムは、前記コードブロック情報と、前記分岐先命令アドレスを前記解析対象プログラムにおける分岐先命令アドレスに対応付けるアドレス対応情報とに基づいて、前記動作情報を分岐履歴情報に変換する変換部をさらに備え、
前記分岐履歴情報は、前記分岐元命令アドレスと前記解析対象プログラムにおける分岐先命令アドレスとの組を含むことを特徴とする請求項3記載の分岐履歴記録システム。
【請求項5】
前記記憶部は、複数の記憶領域を含むサイクリックバッファであり、
前記第1演算処理部は、前記複数の記憶領域のうちライトポインタが示す記憶領域に、前記分岐情報を書き込み、
前記第2演算処理部は、前記複数の記憶領域のうちリードポインタが示す記憶領域から、前記分岐情報を読み出すことを特徴とする請求項1乃至4の何れか1項に記載の分岐履歴記録システム。
【請求項6】
書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、記憶部から読み出し、
複数のコードブロックのうち前記分岐情報に対応するコードブロックへ分岐する、
処理をコンピュータに実行させ、
前記分岐情報は、前記書き込みプログラムを実行することで前記記憶部に書き込まれ、
前記処理の実行時に、実行された命令の命令アドレスが取得され、前記実行された命令の命令アドレスを含む動作情報が記録されることを特徴とする分岐制御プログラム。
【請求項7】
コンピュータが、
書き込みプログラムを実行することで、前記書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、記憶部に書き込み、
分岐制御プログラムを実行することで、前記記憶部から前記分岐情報を読み出し、前記分岐制御プログラムに含まれる複数のコードブロックのうち、前記分岐情報に対応するコードブロックへ分岐する、処理を実行し、
前記分岐制御プログラムの実行時に、実行された命令の命令アドレスを取得し、
前記実行された命令の命令アドレスを含む動作情報を記録する、
ことを特徴とする分岐履歴記録方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、分岐履歴記録技術に関する。
【背景技術】
【0002】
コンパイラにおける最適化方式として、PGO(Profile-Guided binary Optimization)と呼ばれる方式が知られている。PGOでは、実行ファイルの実行時における性能プロファイルに基づいて、実行ファイルが最適化される。PGOは、フィードバック駆動最適化(feedback-driven optimization)と呼ばれることもある。
【0003】
PGOによれば、実行時における分岐命令の分岐確率に基づいて、プログラムの基本ブロック(Basic Block,BB)を再配置することで、分岐ミス及び命令キャッシュミスを抑えることができる。BBは、コンパイラが扱うプログラム断片の基本単位である。BBの再配置は、性能改善効果が高い。
【0004】
コンパイラにおける最適化方式に関して、処理時間を短縮し、迅速に実行形式プログラムを生成することができるコンパイル処理装置が知られている(例えば、特許文献1を参照)。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2000-81984号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
CPU(Central Processing Unit)にLBR(Last Branch Record)が実装されていない場合、分岐確率の計算に用いられる分岐履歴の情報を収集することが難しい。
【0007】
なお、かかる問題は、PGOを実施する場合に限らず、様々な目的のために分岐履歴の情報を収集する場合において生ずるものである。
【0008】
1つの側面において、本発明は、プログラムの実行時における分岐履歴を容易に記録することを目的とする。
【課題を解決するための手段】
【0009】
1つの案では、分岐履歴記録システムは、記憶部、第1演算処理部、第2演算処理部、及び取得部を含む。
【0010】
第1演算処理部は、書き込みプログラムを実行することで、書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、記憶部に書き込む。
【0011】
第2演算処理部は、分岐制御プログラムを実行することで、記憶部から分岐情報を読み出し、分岐制御プログラムに含まれる複数のコードブロックのうち、分岐情報に対応するコードブロックへ分岐する、処理を実行する。取得部は、分岐制御プログラムの実行時に、実行された命令の命令アドレスを取得し、実行された命令の命令アドレスを含む動作情報を記録する。
【発明の効果】
【0012】
1つの側面によれば、プログラムの実行時における分岐履歴を容易に記録することができる。
【図面の簡単な説明】
【0013】
図1】プロファイル情報を示す図である。
図2】性能プロファイル・ファイルを示す図である。
図3】シンボルテーブルを示す図である。
図4】集計結果ファイルを示す図である。
図5】実施形態の分岐履歴記録システムの機能的構成図である。
図6】分岐履歴記録処理のフローチャートである。
図7】情報処理システムの機能的構成図である。
図8】分岐履歴記録処理を示す図である。
図9】アドレス対応テーブルを示す図である。
図10】分岐制御プログラムを示す図である。
図11】コードブロックを示す図である。
図12】コードブロックと分岐情報とを対応付けるシンボルテーブルを示す図である。
図13】取得部により生成される性能プロファイル・ファイルを示す図である。
図14】第1の分岐履歴ファイルを示す図である。
図15】バイナリ計装処理のフローチャートである。
図16】ブロック生成処理のフローチャートである。
図17】バイナリ計装処理を示す図である。
図18】バイナリ計装後のバイナリファイルを示す図である。
図19】分岐制御処理のフローチャートである。
図20】サイクリックバッファの第1の状態を示す図である。
図21】サイクリックバッファの第2の状態を示す図である。
図22】サイクリックバッファの第3の状態を示す図である。
図23】サイクリックバッファの第4の状態を示す図である。
図24】サイクリックバッファの第5の状態を示す図である。
図25】ハッシュテーブルの第1の状態を示す図である。
図26】ハッシュテーブルの第2の状態を示す図である。
図27】分岐制御プログラムの実行シーケンスを示す図である。
図28】変換処理のフローチャートである。
図29】集計テーブル生成処理のフローチャートである。
図30】集計テーブルを示す図である。
図31】集計処理のフローチャートである。
図32】更新された集計テーブルを示す図である。
図33】変換テーブル生成処理のフローチャートである。
図34】変換テーブルを示す図である。
図35】命令アドレス置換処理のフローチャートである。
図36】変換された集計テーブルを示す図である。
図37】出力処理のフローチャートである。
図38】第2の分岐履歴ファイルを示す図である。
図39】第1の分岐確率を示す図である。
図40】第2の分岐確率を示す図である。
図41】第3の分岐確率を示す図である。
図42】情報処理装置のハードウェア構成図である。
【発明を実施するための形態】
【0014】
以下、図面を参照しながら、実施形態を詳細に説明する。
【0015】
BOLT(Binary Optimization and Layout Tool)は、PGOによるBBの再配置を行うツールの一例である。BOLTは、BBの実行頻度と、個々の分岐命令における分岐確率とを用いて、BBの再配置を行う。
【0016】
近年のCPUには、CPUモニタ機構と呼ばれるハードウェアが設けられている。CPUモニタ機構を用いて、サイクルカウンタに基づく命令サンプリングを行うことで、BBの実行頻度を示す情報を取得することができる。
【0017】
サイクルカウンタに基づく命令サンプリングは、CPUモニタ機構とOS(Operating System)の割り込みハンドラとの協調動作によって行われる。CPUモニタ機構は、割り込み用カウンタを用いて、一定数のクロックサイクル毎に割り込みトリガ信号を出力する。割り込みハンドラは、割り込みトリガ信号が出力されたとき、CPUに割り込んで、その時点におけるプログラムカウンタが示す命令アドレスを、メモリ内の記憶領域であるプロファイルバッファに記録する。
【0018】
図1は、プロファイルバッファに記録されたプロファイル情報の例を示している。図1のプロファイル情報は、コア番号、スレッドID、サイクルカウンタ、及び命令アドレスの4つ組を含む。プロファイルバッファには、複数の4つ組が時系列に記録される。この例では、CPUはマルチコアプロセッサであり、複数のコアを含む。
【0019】
コア番号は、CPUに含まれるコアの識別情報であり、スレッドIDは、コアにおいて動作しているスレッドの識別情報である。サイクルカウンタは、CPU内のクロックの値であり、コンピュータの電源が投入されたときに0からカウントアップされる。命令アドレスは、サイクルカウンタが示す時点におけるプログラムカウンタの値である。
【0020】
プロファイル情報は、プロファイルバッファが溢れる前に性能プロファイル・ファイル等に永続化され、永続化が完了したプロファイル情報は、プロファイルバッファから削除される。
【0021】
図2は、図1のプロファイル情報から生成される性能プロファイル・ファイルの例を示している。図2の性能プロファイル・ファイルは、図1のプロファイル情報と同様の4つ組を含む。
【0022】
性能プロファイルの一般的な使用方法では、シンボル毎に実行時間を把握することが重要になる。シンボルは、関数名、分岐ラベル名等を表す。この場合、性能プロファイル・ファイルの内容から、各シンボルの直近の命令アドレスが記録された回数が集計される。
【0023】
図3は、シンボルとアドレスとの対応関係を示すシンボルテーブルの例を示している。図3のシンボルテーブルは、Address及びSymbolを含む。Addressは、実行ファイル中の命令アドレスを表し、Symbolは、集計対象のシンボルの名称を表す。
【0024】
通常のプログラムでは、シンボルテーブルはコンパイラにより生成され、実行ファイル中に埋め込まれている。集計結果ファイルは、性能プロファイル・ファイルとシンボルテーブルとを用いて生成される。
【0025】
図4は、図2の性能プロファイル・ファイルと図3のシンボルテーブルとを用いて生成される集計結果ファイルの例を示している。図3の集計結果ファイルは、Overhead、Count、及びSymbolを含む。Countは、Symbolが示すシンボルの直近の命令アドレスが記録された回数を表し、Overheadは、Countが示す回数の全体における割合を表す。
【0026】
BBの再配置に用いられる情報のうち、BBの実行頻度を示す情報は、集計結果ファイルから取得される。また、CPUモニタ機構がLBRを含んでいる場合、個々の分岐命令における分岐確率は、LBRに記録される情報から容易に計算することができる。
【0027】
LBRは、CPUに含まれるコア毎に、分岐元命令アドレスバッファ及び分岐先命令アドレスバッファを含む。分岐元命令アドレスバッファの各エントリには、分岐元命令アドレスが記録され、分岐先命令アドレスバッファの対応するエントリには、分岐先命令アドレスが記録される。
【0028】
分岐先命令アドレスバッファに含まれるエントリの個数は、分岐元命令アドレスバッファに含まれるエントリの個数と同じである。各バッファのエントリの個数は、CPUの種類に応じて異なる。しかし、LBRは、一部のベンダの一部のCPUにのみ実装されており、すべてのCPUに実装されているわけではない。
【0029】
近年のCPUは1GHz以上の周波数で動作し、一般的な実行ファイルには5~10命令毎に分岐命令が含まれている。このため、LBRがCPUに実装されていない場合に、ソフトウェアによりLBRと同等の情報を収集すると、膨大な量のデータが生成されてしまう。
【0030】
例えば、3GHzの周波数で動作するコアにおいて、10命令毎に64ビットの命令アドレスを記録すると、約3n秒毎に1回の分岐動作が発生するため、1コア当たり毎秒2.2Gバイトのデータが生成される。生成されたデータに対して間引き又は圧縮を実施しない場合、データの生成速度が通常のコンピュータのIO(Input/Output)帯域を大きく超えてしまう。
【0031】
そこで、コンパイル済みのバイナリファイルに対してバイナリ計装(Binary Instrumentation)を適用し、LBRと同等の情報を収集可能なバイナリファイルを生成することが有効である。バイナリ計装では、バイナリファイルのプログラムを実行する前に、プログラム中のすべての分岐命令について、例えば、次のような計装処理が直前に埋め込まれる。
【0032】
(P1)分岐先が静的に分かっている分岐命令の場合、CPUは、分岐命令の位置毎に用意されたカウンタ変数をインクリメントする。
【0033】
(P2)分岐先が静的に分かっていない分岐命令の場合、CPUは、分岐元命令アドレスと分岐先命令アドレスとの組をキーとしてハッシュテーブルを検索し、キーに対応するエントリ内のカウンタ変数をインクリメントする。
【0034】
しかしながら、分岐命令の直前に(P2)の処理を埋め込むと、ハッシュテーブルを検索してカウンタ変数をインクリメントする処理の処理時間が、そのままプログラムの実行時間に追加される。一般に分岐命令は高頻度で実行されるため、(P2)の処理のオーバーヘッドは非常に大きなものになる。
【0035】
図5は、実施形態の分岐履歴記録システムの機能的構成例を示している。図5の分岐履歴記録システム501は、記憶部511、第1演算処理部512、第2演算処理部513、及び取得部514を含む。
【0036】
図6は、図5の分岐履歴記録システム501が行う分岐履歴記録処理の例を示すフローチャートである。まず、第1演算処理部512は、書き込みプログラムを実行することで、書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、記憶部511に書き込む(ステップ601)。
【0037】
次に、第2演算処理部513は、分岐制御プログラムを実行することで、記憶部511から分岐情報を読み出し、分岐制御プログラムに含まれる複数のコードブロックのうち、分岐情報に対応するコードブロックへ分岐する、処理を実行する(ステップ602)。そして、取得部514は、分岐制御プログラムの実行時に、実行された命令の命令アドレスを取得し(ステップ603)、実行された命令の命令アドレスを含む動作情報を記録する(ステップ604)。
【0038】
図5の分岐履歴記録システム501によれば、プログラムの実行時における分岐履歴を容易に記録することができる。
【0039】
図7は、図3の分岐履歴記録システム501に対応する情報処理システムの機能的構成例を示している。図7の情報処理システム701は、計装部711、コア712-1、コア712-2、サイクリックバッファ713、CPUモニタ機構714、取得部715、変換部716、計算部717、出力部718、及び記憶部719を含む。
【0040】
情報処理システム701は、ハードウェアであるCPUを含む。CPUは、マルチコアプロセッサであり、複数のコアを含む。コア712-1及びコア712-2は、CPUに含まれる何れかのコアに対応する。CPUモニタ機構714は、CPUに含まれるハードウェア回路である。
【0041】
コア712-1、コア712-2、サイクリックバッファ713、及び取得部715は、図5の第1演算処理部512、第2演算処理部513、記憶部511、及び取得部514にそれぞれ対応する。
【0042】
記憶部719は、バイナリファイル721、計装プログラム722、分岐制御プログラム723、及び変換プログラム724を記憶する。バイナリファイル721は、コンパイル済みの実行ファイルであり、複数の分岐命令を含む。バイナリファイル721は、解析対象プログラムの一例である。
【0043】
図8は、図7の情報処理システム701が行う分岐履歴記録処理の例を示している。サイクリックバッファ713は、CPUに含まれるコア毎に設けられる。サイクリックバッファ713は、複数の記憶領域を含む有限長のバッファである。
【0044】
計装部711は、計装プログラム722を実行することで、バイナリファイル721に対してバイナリ計装を実施する。計装部711は、バイナリ計装を実施することで、バイナリファイル721に含まれる各分岐命令の位置に、分岐情報をサイクリックバッファ713に書き込むコードを埋め込み、バイナリファイル725を生成する。そして、計装部711は、生成されたバイナリファイル725を記憶部719に格納する。バイナリファイル725は、書き込みプログラムの一例である。
【0045】
さらに、計装部711は、アドレス対応テーブル726を生成して、記憶部719に格納する。バイナリ計装を実施することで、各BBのサイズが変化し、各BBの開始アドレスが変化するため、バイナリ計装の前後における各BBの開始アドレスの組が、アドレス対応テーブル726に記録される。これにより、アドレス対応テーブル726を用いて、バイナリファイル725における各分岐命令の分岐先命令アドレスを、バイナリファイル721における分岐先命令アドレスに置換することが可能になる。
【0046】
アドレス対応テーブル726は、分岐情報に含まれる分岐先命令アドレスを解析対象プログラムにおける分岐先命令アドレスに対応付けるアドレス対応情報の一例である。
【0047】
図9は、アドレス対応テーブル726の例を示している。図9のアドレス対応テーブル726は、BB_no、start_addr、及びpost_addrを含む。BB_noは、バイナリファイル721に含まれる各BBの識別情報である。start_addrは、バイナリ計装前のバイナリファイル721におけるBBの開始アドレスを表し、post_addrは、バイナリ計装後のバイナリファイル725におけるBBの開始アドレスを表す。“0x”は、16進数表記の数値であることを示す。
【0048】
コア712-1は、バイナリファイル725を実行することで、各分岐命令の分岐情報を、ライトポインタWPが示すサイクリックバッファ713の記憶領域に書き込む。分岐情報は、分岐命令の実行により発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む。分岐情報に含まれる分岐元命令アドレスは、バイナリファイル721における分岐元命令アドレスであり、分岐先命令アドレスは、バイナリファイル725における分岐先命令アドレスである。
【0049】
コア712-2は、コア712-1によるバイナリファイル725の実行とは非同期に、分岐制御プログラム723を実行することで、バイナリファイル725の実行時に発生する分岐動作をシミュレートする。
【0050】
図10は、分岐制御プログラム723の例を示している。図10の分岐制御プログラム723は、ハッシュテーブル1001及びコードブロック1002-0を含む。ハッシュテーブル1001は、コードブロック1002-1~コードブロック1002-4をエントリとして含む。ハッシュテーブル1001は、複数のハッシュ値それぞれを何れかのコードブロックに対応付けるテーブルである。
【0051】
コードブロック1002-0は、空エントリを表し、分岐制御プログラム723の実行開始時において、分岐制御プログラム723に含まれている。コードブロック1002-1~コードブロック1002-4は、分岐制御プログラム723の実行中に動的に生成されて、ハッシュテーブル1001に登録される。各コードブロック1002-k(k=0~4)は、何れも同じコードを含んでおり、各コードブロック1002-kの実行時間は同じである。
【0052】
code_minは、コードブロック1002-0~コードブロック1002-4を含むコードブロック領域のアドレスの最小値を表し、code_maxは、コードブロック領域のアドレスの最大値を表す。code_maxは、新たなコードブロック1002-kが生成される度に更新される。
【0053】
図11は、図10のコードブロック1002-kの例を示している。図11のコードブロック1002-kは、コード1101~コード1104を含む。コード1101は、リードポインタRPが示すサイクリックバッファ713の記憶領域から分岐情報を読み出すコードである。コード1102は、分岐情報のハッシュ値を計算するコードである。
【0054】
コード1103は、ハッシュテーブル1001にハッシュ値がヒットしたときの分岐処理を行うコードである。計算されたハッシュ値に対応付けられたコードブロック1002-kがハッシュテーブル1001に含まれている場合、ハッシュ値がヒットする。
【0055】
コード1104は、ハッシュテーブル1001にハッシュ値がミスヒットしたときの分岐処理を行うコードである。計算されたハッシュ値に対応付けられたコードブロック1002-kがハッシュテーブル1001に含まれていない場合、ハッシュ値がミスヒットする。
【0056】
コア712-2は、コア712-1によるバイナリファイル725の実行とは非同期に、分岐制御プログラム723を実行する。コードブロック1002-k内のコード1101を実行することで、コア712-1による書き込み動作とは非同期に、リードポインタRPが示すサイクリックバッファ713の記憶領域から分岐情報を読み出す。
【0057】
次に、コア712-2は、コード1102を実行することで、読み出された分岐情報のハッシュ値を計算し、計算されたハッシュ値がハッシュテーブル1001にヒットするか否かをチェックする。
【0058】
ハッシュ値がヒットした場合、コア712-2は、コード1103を実行することで、ハッシュ値に対応付けられたコードブロック1002-kを分岐先として特定し、分岐先のコードブロック1002-kへ分岐する処理を実行する。そして、コア712-2は、分岐先のコードブロック1002-kを実行する。
【0059】
ハッシュ値がミスヒットした場合、コア712-2は、コード1104を実行することで、ハッシュテーブル1001に含まれている何れかのコードブロック1002-kをコピーして、分岐情報に対応する分岐先のコードブロック1002-kを生成する。そして、コア712-2は、分岐先のコードブロック1002-kをハッシュ値と対応付けてハッシュテーブル1001に登録する。
【0060】
さらに、コア712-2は、分岐先のコードブロック1002-kの開始アドレスを分岐情報と対応付けて、記憶部719内のシンボルテーブル727に記録する。シンボルテーブル727は、コードブロック情報の一例である。そして、コア712-2は、分岐先のコードブロック1002-kへ分岐する処理を実行し、分岐先のコードブロック1002-kを実行する。
【0061】
分岐情報のハッシュ値とコードブロック1002-kとを対応付けるハッシュテーブル1001を用いることで、サイクリックバッファ713から読み出された分岐情報に対応するコードブロック1002-kを高速に特定することができる。
【0062】
また、ハッシュ値がミスヒットした場合に、コードブロック1002-kをコピーして、分岐情報に対応するコードブロック1002-kを生成することで、各コードブロック1002-kの実行時間を一定時間に揃えることができる。
【0063】
図12は、コードブロック1002-kと分岐情報とを対応付けるシンボルテーブル727の例を示している。図12のシンボルテーブル727は、コア毎かつスレッド毎に設けられ、コードブロックアドレス、sip、及びtipを含む。コードブロックアドレスは、分岐先のコードブロック1002-kの開始アドレスを表す。sipは、分岐情報に含まれる分岐元命令アドレスを表し、tipは、分岐情報に含まれる分岐先命令アドレスを表す。
【0064】
“0x5000000”は、コードブロック1002-0の開始アドレスを表す。コードブロック1002-0に対応するsip及びtipは“0”である。
【0065】
“0x5001000”は、コードブロック1002-1の開始アドレスを表す。コードブロック1002-1に対応するsipは“0xFA0”であり、tipは“0x42201”である。“0x5002000”は、コードブロック1002-2の開始アドレスを表す。コードブロック1002-2に対応するsipは“0x380”であり、tipは“0x403F0”である。
【0066】
“0x5003000”は、コードブロック1002-3の開始アドレスを表す。コードブロック1002-3に対応するsipは“0x40”であり、tipは“0x40000”である。“0x5004000”は、コードブロック1002-4の開始アドレスを表す。コードブロック1002-4に対応するsipは“0x316”であり、tipは“0x56044”である。
【0067】
コア712-2により分岐制御プログラム723が実行されているとき、CPUモニタ機構714は、割り込み用カウンタを用いて、一定数のクロックサイクル毎に割り込みトリガ信号を出力する。
【0068】
取得部715は、割り込みトリガ信号が出力されたとき、割り込みハンドラを実行することで、実行された命令の命令アドレスを含むプロファイル情報728を取得して、記憶部719に記録する。そして、取得部715は、プロファイル情報728から性能プロファイル・ファイル729を生成して、記憶部719に格納する。性能プロファイル・ファイル729は、実行された命令の命令アドレスを含む動作情報の一例である。
【0069】
図13は、取得部715により生成される性能プロファイル・ファイル729の例を示している。図13の性能プロファイル・ファイル729は、図2の性能プロファイル・ファイルと同様の4つ組を含む。図13には、性能プロファイル・ファイル729に含まれる4つ組の一部のみが示されており、残りの4つ組は省略されている。
【0070】
変換部716は、アドレス対応テーブル726及びシンボルテーブル727を用いて変換プログラム724を実行することで、性能プロファイル・ファイル729を分岐履歴ファイル730に変換する。分岐履歴ファイル730は、バイナリ計装前のバイナリファイル721における分岐元命令アドレスと分岐先命令アドレスとの組を含む。分岐履歴ファイル730は、分岐元命令アドレスと解析対象プログラムにおける分岐先命令アドレスとの組を含む分岐履歴情報の一例である。
【0071】
図14は、第1の分岐履歴ファイル730の例を示している。図14の分岐履歴ファイル730は、sip、tip、及び集計カウンタを含む。分岐履歴ファイル730に含まれるsip及びtipは、バイナリファイル721における分岐元命令アドレス及び分岐先命令アドレスの組を表す。集計カウンタは、バイナリファイル725の実行中に、sip及びtipの組に対応する分岐動作が発生した回数を表す。
【0072】
計算部717は、分岐履歴ファイル730を用いて、個々の分岐命令における分岐確率を計算し、出力部718は、計算された分岐確率を出力する。ユーザは、計算された分岐確率とBBの実行頻度とを用いて、BOLTによりBBの再配置を行うことができる。出力部718は、分岐確率の代わりに、分岐履歴ファイル730を出力してもよい。
【0073】
ここで、分岐履歴を表す仮想的なサイコロを用いて、分岐確率について説明する。サイコロは、複数の面を有する多面体であり、面の数Mは、バイナリファイル725の実行中に発生した分岐動作の総数と同じである。各面に表示された目X(k)(k=1~K)は、sip及びtipの組を含む。Kは、分岐履歴ファイル730に記録されたsip及びtipの組の総数を表す。
【0074】
サイコロを振ったときに特定の目X(k)が出る確率P(k)は、目X(k)を有する面の数M(k)に比例し、次式により表される。
【0075】
P(k)=M(k)/M (1)
【0076】
サイコロの目をサンプリングにより採取した場合も、特定の目X(k)が採取される確率は、式(1)により表される。したがって、すべての面を同じ実行時間の処理に置き換えて、CPUモニタ機構714により各処理に対応する目をサンプリングすることで、分岐確率の計算が可能になる。
【0077】
図10の各コードブロック1002-kは、分岐情報のハッシュ値を介して、その分岐情報に対応付けられている。また、各コードブロック1002-kは、異なる命令アドレスから始まっているが、その実行時間は同じである。この場合、コードブロック1002-kをサイコロの目X(k)と対応付けることができる。
【0078】
分岐制御プログラム723の実行中に、CPUモニタ機構714により任意のタイミングで命令アドレスをサンプリングしたとき、サンプリングされた命令アドレスがコードブロック1002-k内の命令アドレスである確率は、確率P(k)に一致する。したがって、分岐制御プログラム723とCPUモニタ機構714との連携動作は、LBRを確率的にシミュレートすることと同等である。
【0079】
図7の情報処理システム701によれば、LBRがCPUに実装されていない場合であっても、分岐制御プログラム723とCPUモニタ機構714との連携動作によって、バイナリファイル725の実行時における分岐履歴を容易に記録することができる。これにより、LBRがCPUに実装されている場合と同様に、個々の分岐命令における分岐確率を計算することができる。
【0080】
それほど一般的とは言えないハードウェアであるLBRに依存することなく、分岐履歴を記録できるため、情報処理システム701の汎用性が高くなる。
【0081】
さらに、前述した(P1)及び(P2)の処理を埋め込むバイナリ計装とは異なり、図8の分岐履歴記録処理では、分岐情報をサイクリックバッファ713に書き込むコードのみがバイナリファイル725に埋め込まれる。そして、バイナリファイル725を実行しているコア712-1とは異なるコア712-2が、ハッシュテーブル1001を検索して次のコードブロック1002-kへ分岐する処理を非同期に行う。
【0082】
このため、ハッシュテーブル1001の操作に伴う処理時間が、バイナリファイル725の実行時間に追加されることはなく、バイナリファイル725の実行時のオーバーヘッドは小さくなる。
【0083】
図15は、計装部711が行うバイナリ計装処理の例を示すフローチャートである。まず、計装部711は、バイナリファイル721を読み込み(ステップ1501)、バイナリファイル721をマシン命令の中間表現に変換する(ステップ1502)。
【0084】
次に、計装部711は、中間表現に含まれる命令の位置を示す制御変数posを0からNまで1ずつインクリメントしながら、ステップ1503~ステップ1505の処理を繰り返す。0は、最初の命令の位置を表し、Nは、最後の命令の位置を表す。
【0085】
ステップ1503において、計装部711は、posが示す位置の命令instructions[pos]を変数instrに設定する。ステップ1504において、計装部711は、instrが分岐命令であるか否かをチェックする。
【0086】
instrが分岐命令である場合(ステップ1504,YES)、計装部711は、ステップ1505のブロック生成処理を行う。そして、計装部711は、次の位置の命令を処理する。instrが分岐命令ではない場合(ステップ1504,NO)、計装部711は、ブロック生成処理を行わずに、次の位置の命令を処理する。
【0087】
次に、計装部711は、ブロック生成処理によって追加又は変更された命令のコードを生成し(ステップ1506)、アドレス対応テーブル726を生成する(ステップ1507)。そして、計装部711は、ステップ1506で生成されたコードを用いて、バイナリファイル725を生成する(ステップ1508)。
【0088】
図16は、図15のステップ1505におけるブロック生成処理の例を示すフローチャートである。まず、計装部711は、ブロックBを生成する(ステップ1601)。ブロックBは、次のような中間表現を含む。
【0089】
R1:レジスタ及びマシンステータスの値をスタックに保存する。
R2:コア番号cを読む。
R3:bp=cycle_buff[c]
R4:widx=write_index[c]
R5:bp[Mod(widx,bufsz)]に(sip,tip)を書き込む。
R6:write_index[c]=widx+1
R7:レジスタ及びマシンステータスの値をスタックから復元する。
R8:分岐
【0090】
R1のマシンステータスは、汎用レジスタとは異なるフラグレジスタを表す。R3は、コア番号cが示すコア用のサイクリックバッファ713の先頭位置cycle_buff[c]を、変数bpに設定する処理である。R4は、コア番号cが示すコア用のwriteインデクスwrite_index[c]を、変数widxに設定する処理である。
【0091】
R5のバッファサイズbufszは、サイクリックバッファ713に含まれる記憶領域の個数を表す。Mod(widx,bufsz)は、widxをbufszで除算したときの剰余を表す。bp[Mod(widx,bufsz)]は、bpにMod(widx,bufsz)を加算した位置を表し、ライトポインタWPとして用いられる。(sip,tip)は、バイナリファイル721における分岐元命令アドレスsipと、バイナリファイル725における分岐先命令アドレスtipとの組を表す。R6は、write_index[c]にwidx+1を設定する処理である。
【0092】
次に、計装部711は、生成されたブロックBをinstructions[pos]に設定する(ステップ1602)。
【0093】
図17は、バイナリ計装処理の例を示している。図17(a)は、バイナリ計装前のバイナリファイル721に含まれる分岐命令の例を示している。“0x40”は、分岐元命令アドレスを表し、“call %rax”は、分岐命令を表す。この分岐命令は間接分岐であり、分岐先命令アドレスは、レジスタ%raxに格納されている。
【0094】
図17(b)は、図17(a)の分岐命令に対するブロック生成処理により生成されたブロックBの例を示している。push_allregsは、R1の処理に対応し、関数write_cyclic_bufferの呼び出しは、R2~R6の処理に対応し、pop_allregsは、R7の処理に対応する。
【0095】
図17(b)のブロックBによれば、分岐元命令アドレス“0x40”とレジスタ%rax内の分岐先命令アドレスとがサイクリックバッファ713に書き込まれた後に、レジスタ%rax内の分岐先命令アドレスへ分岐する処理が行われる。サイクリックバッファ713に対する書き込みは、関数write_cyclic_bufferを呼び出すことで行われる。
【0096】
図18は、バイナリ計装後のバイナリファイル725の例を示している。図18のバイナリファイル725は、図17(b)に示したブロックBを含んでいる。コア712-1が命令アドレス“0x100”の命令を実行すると、レジスタ%raxに分岐先命令アドレス“0x210”が設定される。
【0097】
次に、コア712-1が命令アドレス“0x130”から命令アドレス“0x140”の直前までの命令を実行すると、サイクリックバッファ713に(0x40,0x210)が書き込まれる。(0x40,0x210)は、分岐元命令アドレスと分岐先命令アドレスとの組を表す。その後、コア712-1は、命令アドレス“0x140”の分岐命令を実行することで、分岐先命令アドレス“0x210”へ分岐し、分岐先命令アドレス“0x210”以降の命令を実行する。
【0098】
図19は、コア712-2が行う分岐制御処理の例を示すフローチャートである。コア712-2は、分岐制御プログラム723に含まれる何れかのコードブロック1002-kを実行することで、図19の分岐制御処理を行う。
【0099】
分岐制御プログラム723の実行が開始されたときは、何れのコードブロック1002-kもハッシュテーブル1001に登録されていないため、分岐制御プログラム723に含まれているコードブロック1002-0が実行される。
【0100】
まず、コア712-2は、サイクリックバッファ713が空であるか否かをチェックする(ステップ1901)。サイクリックバッファ713が空である場合(ステップ1901,YES)、コア712-2は、空エントリであるコードブロック1002-0へ分岐する(ステップ1911)。そして、コア712-2は、分岐先のコードブロック1002-0を実行することで、分岐制御処理を繰り返す。
【0101】
サイクリックバッファ713が空ではない場合(ステップ1901,NO)、コア712-2は、リードポインタRPが示す記憶領域から(sip,tip)を読み出す(ステップ1902)。そして、コア712-2は、(sip,tip)のハッシュ値hash(sip,tip)を計算し、hash(sip,tip)を変数indexに設定する(ステップ1903)。
【0102】
次に、コア712-2は、indexをキーとしてハッシュテーブル1001を検索し、indexに対応するコードブロック1002-kを示す変数next_ipの値を取得する(ステップ1904)。indexがハッシュテーブル1001にヒットした場合、next_ipの値は、分岐先のコードブロック1002-kの開始アドレスである。indexがハッシュテーブル1001にミスヒットした場合、next_ipの値は、NULLである。
【0103】
次に、コア712-2は、next_ipがNULLであるか否かをチェックする(ステップ1905)。next_ipがNULLである場合(ステップ1905,YES)、コア712-2は、図10のcode_maxの位置に新たなコードブロック1002-kの領域を割り当てる(ステップ1906)。そして、コア712-2は、割り当てられた領域のアドレスの上限値をcode_maxに設定することで、code_maxを更新する。
【0104】
次に、コア712-2は、ハッシュテーブル1001に登録されている何れかのコードブロック1002-kのコードを、割り当てられた領域にコピーすることで、新たなコードブロック1002-kを生成する(ステップ1907)。そして、コア712-2は、生成されたコードブロック1002-kを、indexと対応付けてハッシュテーブル1001に登録する(ステップ1908)。これにより、indexに対応するコードブロック1002-kが分岐制御プログラム723に追加される。
【0105】
次に、コア712-2は、生成されたコードブロック1002-kの開始アドレスをnext_ipに設定し、next_ip、sip、及びtipの組をシンボルテーブル727に記録する(ステップ1909)。next_ipは、シンボルテーブル727のコードブロックアドレスとして記録される。
【0106】
次に、コア712-2は、next_ipが示すコードブロック1002-kへ分岐する(ステップ1910)。そして、コア712-2は、分岐先のコードブロック1002-kを実行することで、分岐制御処理を繰り返す。
【0107】
next_ipがNULLではない場合(ステップ1905,NO)、コア712-2は、ステップ1910の処理を行う。
【0108】
図20は、サイクリックバッファ713の第1の状態の例を示している。IDXは、サイクリックバッファ713のインデクスを表し、分岐情報は、(sip,tip)を表す。
【0109】
ライトポインタWPは、writeインデクスをバッファサイズbufszで除算したときの剰余である。リードポインタRPは、readインデクスをbufszで除算したときの剰余である。writeインデクスが100002であり、bufszが10である場合、WP=Mod(100002,10)=2となる。
【0110】
writeインデクスは、readインデクスよりも常に大きい。readインデクスがwriteインデクスを追い抜くことは、サイクリックバッファ713が空であることを意味する。
【0111】
図21は、サイクリックバッファ713の第2の状態の例を示している。IDX=2の位置に(0x40,0x210)が書き込まれた後、writeインデクスが1だけインクリメントされて100003になった場合、WP=Mod(100003,10)=3となる。そして、IDX=3の位置に(0x316,0x3E8)が書き込まれる。
【0112】
図22は、サイクリックバッファ713の第3の状態の例を示している。readインデクスがwriteインデクス以上である場合、サイクリックバッファ713が空であるため、コードブロック1002-0へ分岐する処理が行われる。
【0113】
readインデクスがwriteインデクスよりも小さい場合、readインデクスをbufszで除算することで、リードポインタRPが求められ、リードポインタRPが示す位置から分岐情報が読み出される。readインデクスが99991である場合、RP=Mod(99991,10)=1となり、IDX=1の位置から(0x380,0x62)が読み出される。
【0114】
ライトポインタWPが示す位置に分岐情報を書き込み、リードポインタRPが示す位置から分岐情報を読み出すことで、コア712-1及びコア712-2が独立して書き込み及び読み出しを行うことができる。
【0115】
図23は、サイクリックバッファ713の第4の状態の例を示している。writeインデクスが100003であり、bufszが10である場合、サイクリックバッファ713には、99993~100002のwriteインデクスに対応する最新の10個の分岐情報が格納されている。
【0116】
readインデクスは99981であり、99993よりも小さい。このため、readインデクスを単純に1ずつインクリメントしながら分岐情報を読み出すと、readインデクスが99981、99991、及び100001のときに、IDX=1の位置から(0x380,0x62)が読み出される。このように、writeインデクスとreadインデクスとの差分が、bufszのI倍以上かつI+1倍未満(Iは正の整数)である場合、同じ分岐情報がI+1回重複して読み出される。
【0117】
そこで、同じ分岐情報が重複して読み出されることを防止するため、図11のコード1101として、例えば、次のような中間表現のコードが用いられる。
【0118】
R11:ridx=read_index[c]
R12:widx=write_index[c]
R13:if (ridx >= widx) goto empty-entry
R14:if (widx >= ridx+bufsz)
then ridx=widx-bufsz
R15:v=cycle_buff[c][Mod(ridx,bufsz)]
R16:read_index[c]=ridx+1
R17:sip=v.sip
R18:tip=v.tip
R19:ridx=read_index[c]
【0119】
R11は、コア番号cが示すコアの現在のreadインデクスread_index[c]を、変数ridxに設定する処理である。R12は、コア番号cが示すコアの現在のwriteインデクスwrite_index[c]を、変数widxに設定する処理である。
【0120】
R13は、ridxがwidx以上である場合、empty-entryへ分岐する処理である。empty-entryは、コードブロック1002-0を表す。R14は、widxがridx+bufsz以上である場合、widx-bufszをridxに設定することで、ridxを調整する処理である。widxとridxとの差分がbufsz以上である場合に、ridxをwidx-bufszまで進めることで、重複する分岐情報の読み出しが回避される。
【0121】
R15は、コア番号cが示すコア用のサイクリックバッファ713の先頭位置cycle_buff[c]にMod(ridx,bufsz)を加算した位置から、(sip,tip)を読み出して、変数vに設定する処理である。
【0122】
Mod(ridx,bufsz)は、ridxをbufszで除算したときの剰余を表す。cycle_buff[c]にMod(ridx,bufsz)を加算した位置は、リードポインタRPとして用いられる。
【0123】
R16は、read_index[c]にridx+1を設定する処理である。R17は、vからsipを抽出する処理である。R18は、vからtipを抽出する処理である。R19は、read_index[c]をridxに設定する処理である。
【0124】
図24は、サイクリックバッファ713の第5の状態の例を示している。図23に示したように、writeインデクスがreadインデクスからbufsz以上離れている場合、R14の処理を行うことで、重複する分岐情報の読み出しが回避される。
【0125】
この例では、widx-bufsz=100003-10=99993であるため、readインデクスが99981から99993に変更される。これにより、readインデクスが99981及び99991になることがないため、IDX=1の位置から(0x380,0x62)が重複して読み出されることがなくなる。
【0126】
仮に、readインデクスを100000まで一気に進めた場合であっても、重複読み出しを避ける効果は得られるが、サイクリックバッファ713から読み出される分岐情報の個数が減少してしまう。このため、writeインデクスよりもbufszだけ小さい位置までreadインデクスを進めることが好ましい。
【0127】
同じ分岐情報が重複して読み出されることを防止するため、図11のコード1101として、次のような中間表現のコードを用いてもよい。
【0128】
R21:ridx=read_index[c]
R22:widx=write_index[c]
R23:if (ridx >= widx) goto empty-entry
R24:v=VOID
R25:swap(v,
cycle_buff[c][Mod(ridx,bufsz)])
R26:read_index[c]=ridx+1
R27:if (v is VOID) goto empty-entry
R28:sip=v.sip
R29:tip=v.tip
【0129】
R21~R23の処理は、R11~R13の処理と同様である。R24は、変数vにVOIDを設定することで、vを初期化する処理である。R25は、コア番号cが示すコア用のサイクリックバッファ713の先頭位置cycle_buff[c]にMod(ridx,bufsz)を加算することで、読み出し位置を求め、読み出し位置に格納されている分岐情報とvの値とを交換する処理である。
【0130】
R25の処理により、リードポインタRPが示すサイクリックバッファ713の記憶領域から読み出された分岐情報がvに設定されるとともに、その記憶領域にVOIDが書き込まれる。サイクリックバッファ713に書き込まれている分岐情報が読み出されたときに、その分岐情報をVOIDに置き換えることで、重複する分岐情報の読み出しが回避される。
【0131】
R26の処理は、R16の処理と同様である。R27は、vがVOIDである場合、empty-entryへ分岐する処理である。R28及びR29の処理は、R17及びR18の処理と同様である。
【0132】
分岐情報の書き込み速度が読み出し速度を上回ってサイクリックバッファ713が一杯になった場合、バイナリファイル725の実行を一時的に停止し、分岐情報の読み出しが追いついた後に、バイナリファイル725の実行を再開してもよい。
【0133】
図25は、ハッシュテーブル1001の第1の状態の例を示している。keyは、ハッシュテーブル1001のキーを表し、codeは、キーに対応付けられたコードブロック1002-kの番号kを表す。
【0134】
サイクリックバッファ713から読み出された(sip,tip)が(0x380,0x62)であり、そのハッシュ値が“0x2”である場合、“0x2”をキーとしてハッシュテーブル1001が検索され、next_ipとしてNULLが取得される。
【0135】
図26は、ハッシュテーブル1001の第2の状態の例を示している。next_ip=NULLであるため、新たなコードブロック1002-88の領域を割り当てて、何れかのコードブロック1002-kのコードをコピーすることで、コードブロック1002-88が生成される。そして、コードブロック1002-88は、“0x2”と対応付けてハッシュテーブル1001に登録される。
【0136】
その後、何れかのコードブロック1002-kを実行することで、サイクリックバッファ713から(0x380,0x62)が読み出された場合、そのハッシュ値“0x2”をキーとしてハッシュテーブル1001が検索される。そして、next_ipとしてコードブロック1002-88の開始アドレスが取得され、コードブロック1002-88へ分岐する処理が行われる。
【0137】
図27は、分岐制御プログラム723の実行シーケンスの例を示している。横軸は、コードブロック1002-k(k=0,1,2,11)を表し、縦軸は、時間の経過を表す。水平方向の破線は、CPUモニタ機構714が命令アドレスをサンプリングするタイミングを表し、サンプリング結果は、サンプリングされた命令アドレスが属するコードブロック1002-kの番号kを表す。
【0138】
図28は、変換部716が行う変換処理の例を示すフローチャートである。まず、変換部716は、集計テーブル生成処理を行い(ステップ2801)、集計処理を行う(ステップ2802)。次に、変換部716は、変換テーブル生成処理を行い(ステップ2803)、命令アドレス置換処理を行う(ステップ2804)。次に、変換部716は、出力処理を行う(ステップ2805)。
【0139】
図29は、図28のステップ2801における集計テーブル生成処理の例を示すフローチャートである。まず、変換部716は、シンボルテーブル727をオープンし(ステップ2901)、シンボルテーブル727のすべてのエントリを処理したか否かをチェックする(ステップ2902)。
【0140】
未処理のエントリが残っている場合(ステップ2902,NO)、変換部716は、1つのエントリを選択し、選択されたエントリからコードブロックアドレス、sip、及びtipの組を読み出す(ステップ2903)。そして、変換部716は、読み出された組を集計テーブルに登録し(ステップ2904)、ステップ2902以降の処理を繰り返す。集計テーブルは、記憶部719内に生成される。
【0141】
すべてのエントリを処理した場合(ステップ2902,YES)、変換部716は、シンボルテーブル727をクローズする(ステップ2905)。
【0142】
図30は、図12のシンボルテーブル727から生成された集計テーブルの例を示している。図30の集計テーブルは、ハッシュテーブル3001を含む。ハッシュテーブル3001は、エントリ3002-0~エントリ3002-4を含む。
【0143】
ハッシュテーブル3001は、複数のキーそれぞれを何れかのエントリ3002-k(k=0~4)に対応付けるテーブルである。この場合、図12のシンボルテーブル727の5個のコードブロックアドレスがキーとして用いられる。図30では、5個のコードブロックアドレスのうち、“0x5003000”及び“0x5004000”が省略されている。
【0144】
各エントリ3002-kは、sip、tip、及び集計カウンタを含む。各コードブロックアドレスに対応するエントリ3002-kのsip及びtipには、シンボルテーブル727において同じコードブロックアドレスに対応するsip及びtipが登録される。集計カウンタには、初期値0が設定される。
【0145】
図31は、図28のステップ2802における集計処理の例を示すフローチャートである。まず、変換部716は、性能プロファイル・ファイル729をオープンし(ステップ3101)、性能プロファイル・ファイル729のすべてのエントリを処理したか否かをチェックする(ステップ3102)。
【0146】
未処理のエントリが残っている場合(ステップ3102,NO)、変換部716は、1つのエントリを選択し、選択されたエントリから命令アドレスを読み出す(ステップ3103)。そして、変換部716は、読み出された命令アドレスが、分岐制御プログラム723内のハッシュテーブル1001のコードブロック領域の範囲に含まれるか否かをチェックする(ステップ3104)。コードブロック領域の範囲は、code_minからcode_maxまでの範囲である。
【0147】
命令アドレスがコードブロック領域の範囲に含まれる場合(ステップ3104,YES)、変換部716は、その命令アドレスを変数code_ipに設定する。そして、変換部716は、code_ipを含むコードブロック1002-kの開始アドレスAddrを、次式により計算する(ステップ3105)。
【0148】
Addr=code_ip
-Mod((code_ip-code_min),S) (2)
【0149】
Sは、コードブロック1002-kのサイズを表す。Mod((code_ip-code_min),S)は、code_ipとcode_minとの差分をSで除算したときの剰余を表す。
【0150】
次に、変換部716は、Addrをキーとしてハッシュテーブル3001を検索し(ステップ3106)、Addrに対応するエントリ3002-kの集計カウンタを1だけインクリメントする(ステップ3107)。そして、変換部716は、ステップ3102以降の処理を繰り返す。
【0151】
命令アドレスがコードブロック領域の範囲に含まれない場合(ステップ3104,NO)、変換部716は、ステップ3102以降の処理を繰り返す。すべてのエントリを処理した場合(ステップ3102,YES)、変換部716は、性能プロファイル・ファイル729をクローズする(ステップ3108)。
【0152】
図31の集計処理によれば、性能プロファイル・ファイル729に記録されている命令アドレスのうち、sip及びtipの組に対応するコードブロック1002-kに含まれる命令アドレスの個数が、その組に対応する集計カウンタに記録される。
【0153】
図32は、集計処理により更新された集計テーブルの例を示している。図32の集計テーブルは、図13の性能プロファイル・ファイル729を用いて図30の集計テーブルを更新することで生成される。図32のsip及びtipの組に対応する集計カウンタは、図13の性能プロファイル・ファイル729に記録されている命令アドレスのうち、その組に対応するコードブロック1002-kに含まれる命令アドレスの個数を表す。
【0154】
図33は、図28のステップ2803における変換テーブル生成処理の例を示すフローチャートである。まず、変換部716は、アドレス対応テーブル726をオープンし(ステップ3301)、アドレス対応テーブル726のすべてのエントリを処理したか否かをチェックする(ステップ3302)。
【0155】
未処理のエントリが残っている場合(ステップ3302,NO)、変換部716は、1つのエントリを選択し、選択されたエントリからstart_addr及びpost_addrの組を読み出す(ステップ3303)。そして、変換部716は、読み出された組を変換テーブルに登録し(ステップ3304)、ステップ3302以降の処理を繰り返す。変換テーブルは、記憶部719内に生成される。
【0156】
すべてのエントリを処理した場合(ステップ3302,YES)、変換部716は、アドレス対応テーブル726をクローズする(ステップ3305)。
【0157】
図34は、図9のアドレス対応テーブル726から生成された変換テーブルの例を示している。図34の変換テーブルは、ハッシュテーブル3401を含む。ハッシュテーブル3401は、エントリ3402-0~エントリ3402-4を含む。
【0158】
ハッシュテーブル3401は、複数のキーそれぞれを何れかのエントリ3402-k(k=0~4)に対応付けるテーブルである。この場合、図9のアドレス対応テーブル726の5個のpost_addrがキーとして用いられる。
【0159】
各エントリ3402-kは、start_addrを含む。各post_addrに対応するエントリ3402-kのstart_addrには、シンボルテーブル727において同じpost_addrに対応するstart_addrが登録される。
【0160】
図35は、図28のステップ2804における命令アドレス置換処理の例を示すフローチャートである。変換部716は、集計テーブルのハッシュテーブル3001に登録されている各キーについて、ステップ3501~ステップ3504の処理を行う。
【0161】
変換部716は、キーに対応するエントリ3002-kからtipを読み出し(ステップ3501)、tipの値をチェックする(ステップ3502)。
【0162】
tipが0ではない場合(ステップ3502,NO)、変換部716は、tipをキーとして変換テーブルのハッシュテーブル3401を検索し、tipに対応するエントリ3402-kのstart_addrを取得する(ステップ3503)。そして、変換部716は、キーとして用いた集計テーブルのtipを、取得されたstart_addrに変更する(ステップ3504)。
【0163】
tipが0である場合(ステップ3502,YES)、変換部716は、tipを変更しない。
【0164】
図35の命令アドレス置換処理によれば、集計テーブルに登録されているtipが、バイナリ計装前のバイナリファイル721におけるBBの開始アドレスに変換される。したがって、バイナリファイル721における分岐元命令アドレスと分岐先命令アドレスとの組に、集計カウンタを対応付けることができる。
【0165】
図36は、命令アドレス置換処理により変換された集計テーブルの例を示している。図36の集計テーブルは、図34の変換テーブルを用いて図32の集計テーブルを変換することで生成される。図36のtipは、図34の変換テーブルにおけるstart_addrに変更されている。
【0166】
図37は、図28のステップ2805における出力処理の例を示すフローチャートである。出力処理の開始時において、分岐履歴ファイル730には、sip、tip、及び集計カウンタの組が未だ記録されていない。
【0167】
まず、変換部716は、分岐履歴ファイル730をオープンし(ステップ3701)、集計テーブルのハッシュテーブル3001に登録されている各キーについて、ステップ3702~ステップ3704の処理を行う。
【0168】
変換部716は、キーに対応するエントリ3002-kからtipを読み出し(ステップ3702)、tipの値をチェックする(ステップ3703)。
【0169】
tipが0ではない場合(ステップ3703,NO)、変換部716は、そのエントリ3002-kのsip、tip、及び集計カウンタの組を、分岐履歴ファイル730に記録する(ステップ3704)。
【0170】
tipが0である場合(ステップ3703,YES)、変換部716は、そのエントリ3002-kのsip、tip、及び集計カウンタの組を、分岐履歴ファイル730に記録しない。
【0171】
すべてのキーについてステップ3702~ステップ3704の処理が終了した後、変換部716は、分岐履歴ファイル730をクローズする(ステップ3705)。
【0172】
図37の出力処理により、図36の集計テーブルから図14の分岐履歴ファイル730が生成される。図36の集計テーブルのエントリ3002-0は、バイナリ計装前のバイナリファイル721には存在しない分岐動作の情報であるため、図14の分岐履歴ファイル730ではその情報が削除されている。
【0173】
図28の変換処理によれば、アドレス対応テーブル726及びシンボルテーブル727を用いて、分岐制御プログラム723の性能プロファイル・ファイル729が、分岐履歴ファイル730に変換される。これにより、バイナリ計装後のバイナリファイル725における分岐動作をシミュレートすることで得られたプロファイル情報から、バイナリ計装前のバイナリファイル721の分岐履歴を求めることができる。
【0174】
次に、図38から図41までを参照しながら、分岐履歴ファイル730から計算される分岐確率の具体例について説明する。
【0175】
図38は、第2の分岐履歴ファイル730の例を示している。図38の分岐履歴ファイル730は、図14の分岐履歴ファイル730と同様に、sip、tip、及び集計カウンタを含む。
【0176】
図39は、図38の分岐履歴ファイル730から計算される第1の分岐確率の例を示している。図39の分岐確率は、同一の分岐元から異なる分岐先への分岐確率を表す。
【0177】
sipは、分岐履歴ファイル730におけるsipを表し、分岐先m(m=1~3)のtipは、分岐履歴ファイル730において同じsipと対応付けられているm番目のtipを表す。
【0178】
各分岐先mの集計カウンタは、分岐履歴ファイル730においてsip及びtipの組と対応付けられている集計カウンタの値を表す。計算部717は、分岐先1~分岐先3の集計カウンタの総和に対する分岐先mの集計カウンタの比率を、分岐先mの分岐確率として計算する。
【0179】
例えば、sip=“0x50FA0”の場合、分岐先1のtipは“0x41092”であり、分岐先2のtipは“0x43FF0”であり、分岐先3のtipは“0x40000”である。分岐先1の集計カウンタは“3218629”であり、分岐先2の集計カウンタは“535”であり、分岐先3の集計カウンタは“1062147”である。したがって、分岐先1~分岐先3の集計カウンタの総和は、“4281311”である。
【0180】
この場合、“0x50FA0”から分岐先1への分岐確率は、3218629/4281311=0.7518となる。“0x50FA0”から分岐先2への分岐確率は、535/4281311=0.0001となる。“0x50FA0”から分岐先3への分岐確率は、1062147/4281311=0.2481となる。
【0181】
他のsipについては、分岐先2及び分岐先3が存在しないため、分岐先1の分岐確率は1.0となる。
【0182】
図40は、図38の分岐履歴ファイル730から計算される第2の分岐確率の例を示している。図40の分岐確率は、異なる分岐元から同一の分岐先への分岐確率を表す。
【0183】
tipは、分岐履歴ファイル730におけるtipを表し、分岐元m(m=1~3)のsipは、分岐履歴ファイル730において同じtipと対応付けられているm番目のsipを表す。
【0184】
各分岐元mの集計カウンタは、分岐履歴ファイル730においてsip及びtipの組と対応付けられている集計カウンタの値を表す。計算部717は、分岐元1~分岐元3の集計カウンタの総和に対する分岐元mの集計カウンタの比率を、分岐元mの分岐確率として計算する。
【0185】
例えば、tip=“0x40000”の場合、分岐元1のsipは“0x50240”であり、分岐元2のsipは“0x5482B”であり、分岐元3のsipは“0x50FA0”である。分岐元1の集計カウンタは“1845144”であり、分岐元2の集計カウンタは“900202”であり、分岐元3の集計カウンタは“1062147”である。したがって、分岐元1~分岐元3の集計カウンタの総和は、“3807493”である。
【0186】
この場合、分岐元1から“0x40000”への分岐確率は、1845144/3807493=0.4846となる。分岐元2から“0x40000”への分岐確率は、900202/3807493=0.2364となる。分岐元3から“0x40000”への分岐確率は、1062147/3807493=0.2790となる。
【0187】
他のtipについては、分岐元2及び分岐元3が存在しないため、分岐元1の分岐確率は1.0となる。
【0188】
図41は、図38の分岐履歴ファイル730から計算される第3の分岐確率の例を示している。図41の分岐確率は、sip及びtipのすべての組み合わせにおける各組み合わせの発生確率を表す。
【0189】
sip、tip、及び集計カウンタは、分岐履歴ファイル730におけるsip、tip、及び集計カウンタを表す。計算部717は、sip及びtipのすべての組み合わせの集計カウンタの総和に対する各組み合わせの集計カウンタの比率を、分岐確率として計算する。sip及びtipのすべての組み合わせの集計カウンタの総和は、“10831285”である。
【0190】
例えば、sip及びtipの組み合わせが“0x50FA0”及び“0x41092”である場合、集計カウンタは“3218629”である。この場合、“0x50FA0”及び“0x41092”の組み合わせの分岐確率は、3218629/10831285=0.29716となる。
【0191】
図7の情報処理システム701では、サイクリックバッファ713がコア毎に設けられているため、コア間における排他制御は不要である。このため、マルチスレッド又はマルチプロセスのような並列プログラムに対しても、分岐履歴記録処理を容易に適用することができる。
【0192】
また、サイクリックバッファ713は有限長のバッファであるため、サイクリックバッファ713の記憶領域が無制限に増加することはなく、サイクリックバッファ713から分岐情報を読み出すために、バイナリファイル725の実行を中断する必要もない。
【0193】
バイナリファイル725の実行時間が長時間になると、分岐命令の分岐確率が時間的に変化することがある。このような場合であっても、性能プロファイル・ファイル729に記録されているサイクルカウンタに基づいて、所定期間毎に分岐履歴ファイル730を生成することで、分岐確率の時間変化を検出することができる。
【0194】
計装部711は、バイナリファイル721に対してバイナリ計装を実施する際、バイナリファイル721に含まれる静的な分岐命令の分岐先命令アドレスを抽出して、分岐先情報を生成することも可能である。
【0195】
この場合、コア712-2は、バイナリファイル725の実行が開始される直前に、メモリマップ情報を取得し、分岐先情報及びメモリマップ情報に基づいて、静的な分岐命令の分岐情報のハッシュ値を計算する。そして、コア712-2は、計算されたハッシュ値に対応付けて、分岐先のコードブロック1002-kをハッシュテーブル1001に登録する。
【0196】
これにより、図19のステップ1902において動的な分岐命令の(sip,tip)が読み出された場合にのみ、ステップ1905においてnext_ip=NULLとなる。静的な分岐命令の(sip,tip)が読み出された場合は、next_ip=NULLとならないため、ステップ1906~ステップ1909の処理が行われる頻度が減少する。このため、分岐制御プログラム723の実行中に、next_ip、sip、及びtipの組がシンボルテーブル727に記録される回数が減少する。
【0197】
図5の分岐履歴記録システム501の構成は一例に過ぎず、分岐履歴記録システム501の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。
【0198】
図7の情報処理システム701の構成は一例に過ぎず、情報処理システム701の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。例えば、外部の装置が分岐確率を計算する場合は、計算部717を省略することができる。
【0199】
図6図15図16図19図28図29図31図33図35、及び図37のフローチャートは一例に過ぎず、分岐履歴記録システム501又は情報処理システム701の構成又は条件に応じて、一部の処理を省略又は変更してもよい。
【0200】
図1に示したプロファイル情報、図2に示した性能プロファイル・ファイル、及び図13に示した性能プロファイル・ファイル729は一例に過ぎず、プロファイル情報及び性能プロファイル・ファイルは、実行されるプログラムに応じて変化する。図3に示したシンボルテーブルと図4に示した集計結果ファイルは一例に過ぎず、シンボルテーブル及び集計結果ファイルは、実行されるプログラムに応じて変化する。
【0201】
図8に示した分岐履歴記録処理は一例に過ぎず、情報処理システム701の構成又は条件に応じて、一部の処理を省略又は変更してもよい。図9に示したアドレス対応テーブル726は一例に過ぎず、アドレス対応テーブル726は、バイナリファイル721に応じて変化する。
【0202】
図10に示した分岐制御プログラム723及び図11に示したコードブロック1002-kは一例に過ぎず、情報処理システム701の構成又は条件に応じて、別の構造の分岐制御プログラム723及びコードブロック1002-kを用いてもよい。
【0203】
図12に示したシンボルテーブル727は一例に過ぎず、シンボルテーブル727は、分岐制御プログラム723及びバイナリファイル725に応じて変化する。図14及び図38に示した分岐履歴ファイル730は一例に過ぎず、分岐履歴ファイル730は、バイナリファイル721に応じて変化する。図17に示したバイナリ計装処理と図18に示したバイナリファイル725は一例に過ぎず、バイナリ計装処理及びバイナリファイル725は、バイナリファイル721に応じて変化する。
【0204】
図20図24に示したサイクリックバッファ713は一例に過ぎず、サイクリックバッファ713の分岐情報は、バイナリファイル721及びバイナリファイル725に応じて変化する。図25及び図26に示したハッシュテーブル1001は一例に過ぎず、ハッシュテーブル1001に登録されるコードブロック1002-kは、分岐情報に応じて変化する。図27に示した分岐制御プログラム723の実行シーケンスは一例に過ぎず、実行シーケンスは、分岐情報に応じて変化する。
【0205】
図30図32、及び図36に示した集計テーブルは一例に過ぎず、集計テーブルは、シンボルテーブル727及び性能プロファイル・ファイル729に応じて変化する。図34に示した変換テーブルは一例に過ぎず、変換テーブルは、アドレス対応テーブル726に応じて変化する。図39図41に示した分岐確率は一例に過ぎず、分岐確率は、分岐履歴ファイル730に応じて変化する。
【0206】
式(1)及び式(2)は一例に過ぎず、情報処理システム701は、別の計算式を用いて分岐履歴記録処理を行ってもよい。
【0207】
図42は、図5の分岐履歴記録システム501及び図7の情報処理システム701として用いられる情報処理装置(コンピュータ)のハードウェア構成例を示している。図42の情報処理装置は、CPU4201、メモリ4202、入力装置4203、出力装置4204、補助記憶装置4205、媒体駆動装置4206、及びネットワーク接続装置4207を含む。これらの構成要素はハードウェアであり、バス4208により互いに接続されている。
【0208】
CPU4201(プロセッサ)は、CPUモニタ機構714及びコア4211-1~コア4211-L(Lは2以上の整数)を含む。CPUモニタ機構714及びコア4211-1~コア4211-Lは、ハードウェアである。
【0209】
何れかのコア4211-i(i=1~L)は、図5の第1演算処理部512として動作し、別のコア4211-iは、第2演算処理部513として動作する。何れかのコア4211-iは、取得部514として動作してもよい。
【0210】
何れかのコア4211-iは、図7のコア712-1として動作し、別のコア4211-iは、コア712-2として動作する。何れかのコア4211-iは、計装部711、取得部715、変換部716、及び計算部717として動作してもよい。
【0211】
メモリ4202は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)等の半導体メモリであり、処理に用いられるプログラム及びデータを記憶する。メモリ4202は、図5の記憶部511又は図7の記憶部719として動作してもよい。図7のサイクリックバッファ713は、メモリ4202内に設けられていてもよい。
【0212】
入力装置4203は、例えば、キーボード、ポインティングデバイス等であり、ユーザからの指示又は情報の入力に用いられる。出力装置4204は、例えば、表示装置、プリンタ等であり、ユーザへの問い合わせ又は指示、及び処理結果の出力に用いられる。出力装置4204は、図7の出力部718として動作してもよい。処理結果は、分岐履歴ファイル730又は分岐確率であってもよい。
【0213】
補助記憶装置4205は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置、テープ装置等である。補助記憶装置4205は、ハードディスクドライブ又はSSD(Solid State Drive)であってもよい。情報処理装置は、補助記憶装置4205にプログラム及びデータを格納しておき、それらをメモリ4202にロードして使用することができる。補助記憶装置4205は、図7の記憶部719として動作してもよい。
【0214】
媒体駆動装置4206は、可搬型記録媒体4209を駆動し、その記録内容にアクセスする。可搬型記録媒体4209は、メモリデバイス、フレキシブルディスク、光ディスク、光磁気ディスク等である。可搬型記録媒体4209は、CD-ROM(Compact Disk Read Only Memory)、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリ等であってもよい。ユーザは、可搬型記録媒体4209にプログラム及びデータを格納しておき、それらをメモリ4202にロードして使用することができる。
【0215】
このように、処理に用いられるプログラム及びデータを格納するコンピュータ読み取り可能な記録媒体は、メモリ4202、補助記憶装置4205、又は可搬型記録媒体4209のような、物理的な(非一時的な)記録媒体である。
【0216】
ネットワーク接続装置4207は、WAN(Wide Area Network)、LAN(Local Area Network)等の通信ネットワークに接続され、通信に伴うデータ変換を行う通信インタフェース回路である。情報処理装置は、プログラム及びデータを外部の装置からネットワーク接続装置4207を介して受信し、それらをメモリ4202にロードして使用することができる。ネットワーク接続装置4207は、図7の出力部718として動作してもよい。
【0217】
なお、情報処理装置が図42のすべての構成要素を含む必要はなく、情報処理装置の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。例えば、可搬型記録媒体4209又は通信ネットワークを使用しない場合は、媒体駆動装置4206又はネットワーク接続装置4207を省略することができる。
【0218】
開示の実施形態とその利点について詳しく説明したが、当業者は、特許請求の範囲に明確に記載した本発明の範囲から逸脱することなく、様々な変更、追加、省略をすることができるであろう。
【0219】
図1乃至図42を参照しながら説明した実施形態に関し、さらに以下の付記を開示する。
(付記1)
記憶部と、
書き込みプログラムを実行することで、前記書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、前記記憶部に書き込む第1演算処理部と、
分岐制御プログラムを実行することで、前記記憶部から前記分岐情報を読み出し、前記分岐制御プログラムに含まれる複数のコードブロックのうち、前記分岐情報に対応するコードブロックへ分岐する、処理を実行する第2演算処理部と、
前記分岐制御プログラムの実行時に、実行された命令の命令アドレスを取得し、前記実行された命令の命令アドレスを含む動作情報を記録する取得部と、
を備えることを特徴とする分岐履歴記録システム。
(付記2)
前記第2演算処理部は、前記分岐情報のハッシュ値を計算し、複数のハッシュ値それぞれを前記複数のコードブロックの何れかに対応付けるハッシュテーブルを用いて、前記分岐情報のハッシュ値に対応付けられたコードブロックを、前記分岐情報に対応するコードブロックとして特定することを特徴とする付記1記載の分岐履歴記録システム。
(付記3)
前記第2演算処理部は、前記分岐情報に対応するコードブロックが前記分岐制御プログラムに含まれていない場合、前記分岐制御プログラムに含まれているコードブロックをコピーすることで、前記分岐情報に対応するコードブロックを生成し、前記分岐情報に対応するコードブロックを前記分岐情報のハッシュ値と対応付けて前記ハッシュテーブルに登録することを特徴とする付記2記載の分岐履歴記録システム。
(付記4)
前記書き込みプログラムは、前記分岐情報を前記記憶部に書き込むコードを解析対象プログラムに埋め込むことで生成され、
前記分岐元命令アドレスは、前記解析対象プログラムにおける分岐元命令アドレスであり、
前記分岐先命令アドレスは、前記書き込みプログラムにおける分岐先命令アドレスであり、
前記第2演算処理部は、前記分岐情報に対応するコードブロックが前記分岐制御プログラムに含まれていない場合、前記分岐情報に対応するコードブロックのアドレスを、前記分岐情報と対応付けてコードブロック情報に記録し、
前記分岐履歴記録システムは、前記コードブロック情報と、前記分岐先命令アドレスを前記解析対象プログラムにおける分岐先命令アドレスに対応付けるアドレス対応情報とに基づいて、前記動作情報を分岐履歴情報に変換する変換部をさらに備え、
前記分岐履歴情報は、前記分岐元命令アドレスと前記解析対象プログラムにおける分岐先命令アドレスとの組を含むことを特徴とする付記3記載の分岐履歴記録システム。
(付記5)
前記記憶部は、複数の記憶領域を含むサイクリックバッファであり、
前記第1演算処理部は、前記複数の記憶領域のうちライトポインタが示す記憶領域に、前記分岐情報を書き込み、
前記第2演算処理部は、前記複数の記憶領域のうちリードポインタが示す記憶領域から、前記分岐情報を読み出すことを特徴とする付記1乃至4の何れか1項に記載の分岐履歴記録システム。
(付記6)
書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、記憶部から読み出し、
複数のコードブロックのうち前記分岐情報に対応するコードブロックへ分岐する、
処理をコンピュータに実行させ、
前記分岐情報は、前記書き込みプログラムを実行することで前記記憶部に書き込まれ、
前記処理の実行時に、実行された命令の命令アドレスが取得され、前記実行された命令の命令アドレスを含む動作情報が記録されることを特徴とする分岐制御プログラム。
(付記7)
前記分岐情報のハッシュ値を計算し、
複数のハッシュ値それぞれを前記複数のコードブロックの何れかに対応付けるハッシュテーブルを用いて、前記分岐情報のハッシュ値に対応付けられたコードブロックを、前記分岐情報に対応するコードブロックとして特定する、
処理を前記コンピュータにさらに実行させることを特徴とする付記6記載の分岐制御プログラム。
(付記8)
前記分岐情報に対応するコードブロックが前記分岐制御プログラムに含まれていない場合、前記分岐制御プログラムに含まれているコードブロックをコピーすることで、前記分岐情報に対応するコードブロックを生成し、
前記分岐情報に対応するコードブロックを前記分岐情報のハッシュ値と対応付けて前記ハッシュテーブルに登録する、
処理を前記コンピュータにさらに実行させることを特徴とする付記7記載の分岐制御プログラム。
(付記9)
前記分岐情報に対応するコードブロックが前記分岐制御プログラムに含まれていない場合、前記分岐情報に対応するコードブロックのアドレスを、前記分岐情報と対応付けてコードブロック情報に記録する処理を、前記コンピュータにさらに実行させ、
前記書き込みプログラムは、前記分岐情報を前記記憶部に書き込むコードを解析対象プログラムに埋め込むことで生成され、
前記分岐元命令アドレスは、前記解析対象プログラムにおける分岐元命令アドレスであり、
前記分岐先命令アドレスは、前記書き込みプログラムにおける分岐先命令アドレスであり、
前記コードブロック情報と、前記分岐先命令アドレスを前記解析対象プログラムにおける分岐先命令アドレスに対応付けるアドレス対応情報とに基づいて、前記動作情報が分岐履歴情報に変換され、
前記分岐履歴情報は、前記分岐元命令アドレスと前記解析対象プログラムにおける分岐先命令アドレスとの組を含むことを特徴とする付記8記載の分岐制御プログラム。
(付記10)
前記記憶部は、複数の記憶領域を含むサイクリックバッファであり、
前記複数の記憶領域のうちライトポインタが示す記憶領域に、前記分岐情報が書き込まれ、
前記分岐情報を前記記憶部から読み出す処理は、前記複数の記憶領域のうちリードポインタが示す記憶領域から、前記分岐情報を読み出す処理を含むことを特徴とする付記6乃至9の何れか1項に記載の分岐制御プログラム。
(付記11)
コンピュータが、
書き込みプログラムを実行することで、前記書き込みプログラムの実行時に発生する分岐動作の分岐元命令アドレスと分岐先命令アドレスとの組を含む分岐情報を、記憶部に書き込み、
分岐制御プログラムを実行することで、前記記憶部から前記分岐情報を読み出し、前記分岐制御プログラムに含まれる複数のコードブロックのうち、前記分岐情報に対応するコードブロックへ分岐する、処理を実行し、
前記分岐制御プログラムの実行時に、実行された命令の命令アドレスを取得し、
前記実行された命令の命令アドレスを含む動作情報を記録する、
ことを特徴とする分岐履歴記録方法。
(付記12)
前記分岐情報のハッシュ値を計算し、
複数のハッシュ値それぞれを前記複数のコードブロックの何れかに対応付けるハッシュテーブルを用いて、前記分岐情報のハッシュ値に対応付けられたコードブロックを、前記分岐情報に対応するコードブロックとして特定する、
処理を前記コンピュータがさらに実行することを特徴とする付記11記載の分岐履歴記録方法。
(付記13)
前記分岐情報に対応するコードブロックが前記分岐制御プログラムに含まれていない場合、前記分岐制御プログラムに含まれているコードブロックをコピーすることで、前記分岐情報に対応するコードブロックを生成し、
前記分岐情報に対応するコードブロックを前記分岐情報のハッシュ値と対応付けて前記ハッシュテーブルに登録する、
処理を前記コンピュータがさらに実行することを特徴とする付記12記載の分岐履歴記録方法。
(付記14)
前記書き込みプログラムは、前記分岐情報を前記記憶部に書き込むコードを解析対象プログラムに埋め込むことで生成され、
前記分岐元命令アドレスは、前記解析対象プログラムにおける分岐元命令アドレスであり、
前記分岐先命令アドレスは、前記書き込みプログラムにおける分岐先命令アドレスであり、
前記分岐情報に対応するコードブロックが前記分岐制御プログラムに含まれていない場合、前記分岐情報に対応するコードブロックのアドレスを、前記分岐情報と対応付けてコードブロック情報に記録し、
前記コードブロック情報と、前記分岐先命令アドレスを前記解析対象プログラムにおける分岐先命令アドレスに対応付けるアドレス対応情報とに基づいて、前記動作情報を分岐履歴情報に変換する、
処理を前記コンピュータがさらに実行し、
前記分岐履歴情報は、前記分岐元命令アドレスと前記解析対象プログラムにおける分岐先命令アドレスとの組を含むことを特徴とする付記13記載の分岐履歴記録方法。
(付記15)
前記記憶部は、複数の記憶領域を含むサイクリックバッファであり、
前記分岐情報を前記記憶部に書き込む処理は、前記複数の記憶領域のうちライトポインタが示す記憶領域に、前記分岐情報を書き込む処理を含み、
前記分岐情報を前記記憶部から読み出す処理は、前記複数の記憶領域のうちリードポインタが示す記憶領域から、前記分岐情報を読み出す処理を含むことを特徴とする付記11乃至14の何れか1項に記載の分岐履歴記録方法。
【符号の説明】
【0220】
501 分岐履歴記録システム
511、719 記憶部
512 第1演算処理部
513 第2演算処理部
514、715 取得部
701 情報処理システム
711 計装部
712-1、712-2、4211-1~4211-L コア
713 サイクリックバッファ
714 CPUモニタ機構
716 変換部
717 計算部
718 出力部
721、725 バイナリファイル
722 計装プログラム
723 分岐制御プログラム
724 変換プログラム
726 アドレス対応テーブル
727 シンボルテーブル
728 プロファイル情報
729 性能プロファイル・ファイル
730 分岐履歴ファイル
1001、3001、3401 ハッシュテーブル
1002-0~1002-4 コードブロック
1101~1104 コード
3002-0~3002-4、3402-0~3402-4 エントリ
4201 CPU
4202 メモリ
4203 入力装置
4204 出力装置
4205 補助記憶装置
4206 媒体駆動装置
4207 ネットワーク接続装置
4208 バス
4209 可搬型記録媒体
図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
図28
図29
図30
図31
図32
図33
図34
図35
図36
図37
図38
図39
図40
図41
図42