(57)【要約】      （修正有）【課題】マルチコアプロセッサのコア間のクロックのサイクル値の差分を測定するプログラムの提供。【解決手段】ＣＰＵチップＣＰＵ＃０、ＣＰＵ＃１は複数のコアＣＯＲＥ＃０、＃１、ＣＯＲＥ＃２、＃３とクロックジェネレータを有する。各コアは、クロックをカウントするクロックカウンタと、カウント値が格納されるサイクル値レジスタＣＹＣ＿ＲＥＧ０〜３を有する。複数のコアによる連続するサイクル値の取得時の間の時間が、第一、第２の補正値ＣＲＲ１,ＣＲＲ２として、各コアがサイクル値を取得するために要する時間が第３の補正値ＣＲＲ３として測定される。ロックを取得してから自分のサイクル値を内部レジスタに格納しその後アンロックする処理を、複数のコアが連続して実行する。収集した全コアのサイクル値と基準コアのサイクル値との差分を、補正値ＣＲＲ１,ＣＲＲ２,ＣＲＲ３に基づいて補正して、基準コアとの間のサイクル値差分を算出する。【選択図】図１
2018206180.tif 000002
【特許請求の範囲】
【請求項１】
マルチコアプロセッサを有する情報処理装置における複数のコアのクロックをカウントしたサイクル値の前記複数のコア間の差分を測定する処理をコンピュータに実行させるサイクル値測定プログラムであって、
前記処理は、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定プログラム。
【請求項２】
前記サイクル値差分算出処理は、前記第１の差分から、前記第１の補正値と前記第２の補正値とを減じて、前記サイクル値差分を算出する、請求項１に記載のサイクル値測定プログラム。
【請求項３】
前記処理は、更に、
前記一つのコアにおいて、前記一つのコア内のサイクル値を第６の記憶部に記憶し、続けて前記サイクル値を第７の記憶部に記憶する第３の測定処理を有し、
前記サイクル値差分算出処理は、前記第１の差分から、前記第１の補正値と前記第２の補正値とを減じ、更に、前記第６，７の記憶部内のサイクル値の差分である第３の補正値を加算して、前記サイクル値差分を算出する、請求項１に記載のサイクル値測定プログラム。
【請求項４】
前記第１、第２のコアのサイクル値の一方を、前記サイクル値差分に基づいて補正する、請求項１に記載のサイクル値測定プログラム。
【請求項５】
前記第１の測定処理が、前記複数のコアで実行される、請求項１に記載のサイクル値測定プログラム。
【請求項６】
マルチコアプロセッサを有する情報処理装置における複数のコアのクロックをカウントしたサイクル値の前記複数のコア間の差分を測定するサイクル値測定方法であって、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定方法。
【請求項７】
それぞれ複数のコアを有する複数のプロセッサと、
前記複数のプロセッサの複数のコアからアクセスされるメモリを有し、
前記複数のプロセッサの複数のコアは、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定処理を実行する、マルチコアプロセッサを有する情報処理装置。
【請求項８】
それぞれ複数のコアを有する複数のプロセッサと、前記複数のプロセッサの複数のコアからアクセスされるメモリを有し、前記複数のプロセッサの複数のコアは、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定処理を実行する、情報処理装置と、
前記第１、第２のコアがそれぞれ収集した前記サイクル値をタイムスタンプとする第１、第２のログのうち、前記第２のコアの前記第２のログのタイムスタンプであるサイクル値を、前記サイクル値差分に基づいて補正し、前記第１のログと第２のログを、前記第１のログのサイクル値と前記第２のログの補正サイクル値に基づいてマージするログ分析装置とを有する、マルチコアプロセッサを有する情報処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，マルチコアプロセッサにおけるサイクル値測定プログラム、サイクル値測定方法、マルチコアプロセッサを有する情報処理装置及びマルチコアプロセッサを有する情報処理システムに関する。
【背景技術】
【０００２】
ログにはその時刻情報が付与される。この時刻情報に情報処理装置内に設けられる時計デバイスの絶対時刻を利用することで、コア間で共通の時刻情報をログに付与できる。しかし、絶対時刻はマイクロ秒の精度であるので、コア内でサイクル値のナノ秒の精度で実行される動作のログの時刻情報としては適切ではない。また、CPUチップの外部に設けられた時計デバイスへのアクセス速度は遅いのでログ収集処理での絶対時刻取得処理により性能低下が発生する。
【０００３】
そこで、コア内のサイクル値をログの時刻情報として付与することが有効である。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１３−２０６４７２号公報
【特許文献２】特開２０１４−１０６５９４号公報
【特許文献３】特開２００８−１２３４３８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、コア毎にサイクル値に差が発生する場合がある。例えば、CPUチップベンダーによっては、マルチコア間でサイクル値が一致することを補償しない場合や、CPUチップ間で及びコア間でクロックカウンタへのリセット信号を同時に入力できない場合などがあるからである。コア間でサイクル値に差が生じていると、コア間でコアそれぞれのログの順序性を確保することができない。
【０００６】
そこで，本開示の第1の側面の目的は，複数のコア間のクロックのサイクル値の差分を測定するマルチコアプロセッサにおけるサイクル値測定プログラム、サイクル値測定方法、マルチコアプロセッサを有する情報処理装置及びマルチコアプロセッサを有する情報処理システムを提供することにある。
【課題を解決するための手段】
【０００７】
本実施の形態の第１の側面は，マルチコアプロセッサを有する情報処理装置における複数のコアのクロックをカウントしたサイクル値の前記複数のコア間の差分を測定する処理をコンピュータに実行させるサイクル値測定プログラムであって、
前記処理は、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定プログラムである。
【発明の効果】
【０００８】
第１の側面によれば，複数コア間のクロックのサイクル値の差分を測定できる。
【図面の簡単な説明】
【０００９】
【図１】マルチコアプロセッサを有する情報処理装置１０の構成例を示す図である。
【図２】CPUチップCPU#0,CPU#1の構成例を示す図である。
【図３】情報処理装置１０内のプログラムの構成例を示す図である。
【図４】本実施の形態におけるログ収集処理の初期化処理を示すフローチャート図である。
【図５】ログ分析装置４０の構成例を示す図である。
【図６】ログ分析装置によるログマージ処理のフローチャート図である。
【図７】全コアのサイクル値収集STEP2のうち全コアを代表する基準コアの処理を示すフローチャート図である。
【図８】全コアのサイクル値収集STEP2のうち全コアを代表する基準コアの処理を示すフローチャート図である。
【図９】全コアのサイクル値収集STEP2のうち全コアを代表する基準コアの処理を示すフローチャート図である。
【図１０】全コアのサイクル値収集STEP2のうち基準コア以外のコアの処理を示すフローチャート図である。
【図１１】全コアのサイクル値収集STEP2のうち基準コア以外のコアの処理を示すフローチャート図である。
【図１２】補正値測定処理STEP1-1のフローチャート図である。
【図１３】補正値測定処理STEP1-2のフローチャート図である。
【図１４】初期化処理のコア間のサイクル値差分の算出処理STEP3のフローチャート図である。
【図１５】初期化処理で使用されるメインメモリ内の変数を示す図である。
【図１６】初期化処理で使用されるメインメモリ内の変数を示す図である。
【図１７】全コアのサイクル値収集処理STEP2の具体例を示す図である。
【図１８】補正値測定処理STEP1-1とSTEP1-2の具体例を示す図である。
【図１９】ログ分析装置による各コアのログのマージ処理の具体例を示す図である。
【発明を実施するための形態】
【００１０】
以下に説明する実施の形態では、情報処理装置内のマルチコアプロセッサの複数のCPUコア（以下単にコアと称する。）が、それぞれのログをそれぞれのサイクル値をタイムスタンプとして取得する。ここでサイクル値とは、各コア内に設けられるクロックカウンタのカウント値であり、クロックサイクルの値である。各コアのサイクル値は、クロックカウンタの起動タイミングを完全に一致することは困難であるので、コア間でサイクル値の差分を有する。
【００１１】
そして、ログ分析装置が、情報処理装置から複数のコアのログを収集して分析する。ログ分析装置は、各コアのログのサイクル値を、コア間のサイクル値差分に基づいて、基準コアのサイクル値の時間軸に補正する。そして、単一の時間軸のサイクル値に基づいて、複数のコアのログをマージする。これにより、複数のコア間のログの発生時刻が単一の時間軸上に並べられる。
【００１２】
本実施の形態のマルチコアプロセッサを有する情報処理装置は、コア間のサイクル値差分を求めるための初期化処理（ログ収集処理のための初期化処理）を実行する。この初期化処理は、情報処理装置内のカーネル（OS：Operational System）の一つの機能である。したがって、情報処理装置が起動するときの初期化処理で、前述のログ収集処理のための初期化処理が実行され、コア間のサイクル値差分が求められる。
【００１３】
図１は、マルチコアプロセッサを有する情報処理装置１０の構成例を示す図である。情報処理装置１０は、複数のCPUチップ（プロセッサ）CPU#0,CPU#1と、それぞれのCPUチップからメモリバスMEM_BUSを介してアクセスされるメインメモリMEM0,MEM1とを有する。また、複数のCPUチップCPU#0,CPU#1は、インターコネクトI_CNEを介して、互いに通信可能である。各CPUチップは、入出力バスIO_BUSを介して、時計デバイス１２の時刻を格納する絶対時刻レジスタ１１と、HDDやSSDなどの大容量の補助記憶装置１３と、ネットワークインターフェースカードNICとに接続される。
【００１４】
各CPUチップCPU#0,CPU#1は、それぞれ複数のコアCORE#0,#1、CORE#2,#3を有するマルチコアプロセッサである。そして、各コアは、各CPUチップ内のクロックジェネレータ（図示せず）が生成するクロックをカウントするクロックカウンタを有し、クロックカウンタのカウント値がサイクル値レジスタCYC_REGに格納される。つまり、サイクル値レジスタはクロックカウンタ内のカウントレジスタである。
【００１５】
情報処理装置１０が起動するときの初期化動作で、時計デバイス１２が、あらかじめ設定されているタイムゾーンの標準時に初期化され、絶対時刻を刻む。この絶対時刻の分解能は、例えばマイクロ秒（μsec）である。情報処理装置内の複数のコアは、時計デバイスの絶対時刻レジスタ１１の時刻を読みだすことで、同じ絶対時刻を共有する。
【００１６】
図２は、CPUチップCPU#0,CPU#1の構成例を示す図である。図２には、CPUチップCPU#0内の一つのコアCORE#0の構成例が示される。コアCORE#0は、キャッシュ２７にアクセス可能に接続され、さらに、キャッシュ２７は、メモリアクセスコントローラMACを介して、メインメモリMEM0にアクセス可能である。MACとメインメモリMEM0との間は前述のメモリバスMEM_BUSで接続される。
【００１７】
コアCORE#0は、プログラムカウンタPCのカウント値から命令フェッチアドレスを生成する命令フェッチアドレス生成部２０と、プログラム内の命令を格納する一次命令キャッシュ２１と、命令デコーダ２２と、ロードストアユニット２３とそのレジスタ群２４と、演算器２５とそのレジスタ群２６とを有する。また、コアCORE#0は、クロックジェネレータCLK_GENが生成するクロックCLKをカウントするクロックカウンタCLK_CNTRを有し、クロックカウンタ内にサイクル値レジスタCYC_REGが設けられる。さらに、コアCORE#0は、図示しない一次データキャッシュを有し、ロードストアユニットがメインメモリから読み出したデータを一次データキャッシュに記憶する。
【００１８】
クロックCLKのサイクルは、例えばナノ秒（nsec）のオーダであり、絶対時刻のマイクロ秒（μsec）のオーダより約１０００倍の細かい分解能である。
【００１９】
コアCORE#0の概略的動作を以下説明する。コアCORE#0は、一般に、内部クロックCLKに同期したパイプライン動作で命令を実行する。
【００２０】
コアがサイクル値レジスタCYC_REGのサイクル値を読み出す命令を実行する場合、命令フェッチアドレス生成部２０がサイクル値読み出し命令のアドレスを生成し、一次命令キャッシュ２１内のサイクル値読み出し命令をフェッチする。そして、命令デコーダ２２がそのフェッチしたサイクル値読み出し命令をデコードし、デコード結果に基づいて、ロードストアユニット２３が読み出し命令を実行する。ロードストアユニット２３は、サイクル値レジスタCYC_REGにアクセスし、そのサイクル値を読み出し、レジスタ群２４、２６内のレジスタに格納する。これらの動作は、前述のパイプライン動作により行われる。
【００２１】
また、コアが絶対時刻レジスタ内の絶対時刻を読み出す命令を実行する場合、上記と同様の動作により、ロードストアユニット２３が、絶対時刻レジスタのアドレスにアクセスして、絶対時刻を読み出し、レジスタ群２４、２５内のレジスタに格納する。
【００２２】
そして、コアがメインメモリMEM0へのストア命令（読み出し命令）またはストア命令（書き込み命令）を実行する場合、上記と同様の動作により、ロードストアユニット２３が一次データキャッシュ（図示せず）にアクセスし、キャッシュミスすると、二次キャッシュ２７にロード要求またはストア要求を出力する。二次キャッシュ２７は、キャッシュミスすると、MACにロード要求またはストア要求を出力し、MACがメインメモリMEM0に対して読み出しまたは書き込みを実行する。このような動作では、アクセス先がキャッシュ制御によりアクセスされるキャッシュ領域内にある。
【００２３】
一方、前述のサイクル値レジスタのサイクル値を読み出す命令を実行する場合、ロードストアユニットは、キャッシュ制御を介することなく、直接サイクル値レジスタCYC_REGにアクセスしてサイクル値を読み出す。この動作では、アクセス先がキャッシュ制御を介さないノンキャッシュ領域内にある。
【００２４】
上記のように、CPUチップ（プロセッサ）内のプロセッサコアは、サイクル値レジスタ内のサイクル値を内部のレジスタ２４、２６に格納するために、所定数のクロックサイクルの動作時間を必要とする。同様に、プロセッサコアは、絶対時刻レジスタ内の絶対時刻を内部のレジスタに格納するためにも、所定数のクロックサイクルの動作時間を必要とする。また、プロセッサコアは、メインメモリへのロード命令やストア命令を実行する場合、メインメモリにMACを介してアクセスするので、上記のコア内のサイクル値レジスタよりも長い動作時間を必要とする。
【００２５】
図３は、情報処理装置１０内のプログラムの構成例を示す図である。プログラムは、補助記憶装置１３に記憶され、情報処理装置が起動されるときにメインメモリ内に展開され、プロセッサコアによって実行される。図３は、メモリMEM0内に展開された状態でプログラムの構成を示している。
【００２６】
プログラムは、カーネル（OS）３０と、ユーザのアプリケーションプログラムのプロセス（ユーザプロセス）３５、３６と、ログ送信処理プログラム３７とを有する。カーネル３０には、カーネルの主機能（入出力処理関数、ロック関数、アンロック関数など）３１と、ログ収集処理３４とログ収集処理の初期化処理３３などを有するログ収集プログラム３２などが含まれる。各コアは、カーネル内のログ収集プログラムを実行して、ログの収集を実行する。また、CPUチップの起動時にログ収集処理の初期化処理が実行され、複数のコアは、後述する一連の初期化処理により各コア内のサイクル値レジスタのサイクル値を読み出し、コア間のサイクル値差分を算出する。
【００２７】
[本実施の形態の概略]
ログにはその時刻情報が付与される。この時刻情報に情報処理装置内に設けられる時計デバイスの絶対時刻を利用することで、コア間で共通の時刻情報をログに付与できる。しかし、絶対時刻はマイクロ秒の精度であるので、コア内でサイクル値のナノ秒の精度で実行される動作のログの時刻情報としては適切ではない。また、CPUチップの外部に設けられた時計デバイスへのアクセス速度は遅いのでログ収集処理での絶対時刻取得処理により性能低下が発生する。
【００２８】
そこで、コア内のサイクル値をログの時刻情報として付与することが有効である。但し、コア毎にサイクル値に差が発生する場合がある。例えば、CPUチップベンダーによっては、マルチコア間でサイクル値が一致することを補償しない場合や、CPUチップ間で及びコア間でクロックカウンタへのリセット信号が同時に入力できない場合などがあるからである。コア間でサイクル値に差が生じていると、コア間でコアそれぞれのログの順序性を確保することができない。
【００２９】
本実施の形態では、ログ収集処理の初期化処理で、各コアが自分のサイクル値を所定の初期化処理により収集し、コア間のサイクル値の差分を算出する。ログ分析装置は、このコア間のサイクル値差分に基づいて、各コアのログのサイクル値を基準コアのサイクル値の時間に補正し、共通の時間軸上のサイクル値に基づいて各コアのログをマージする。これにより、コア間のログの関係も分析可能になる。
【００３０】
図４は、本実施の形態におけるログ収集処理の初期化処理を示すフローチャート図である。コアは、初期化処理プログラムを実行して、まず、補正値CRR1,CRR2,CRR3を測定し（STEP1）、更に、全コアのサイクル値を収集する（STEP2）。この２つの処理STEP1,STEP2は、逆の順番でも良い。
【００３１】
また、補正値の測定処理STEP1の補正値CRR1,CRR2の測定は、情報処理装置がNUMA（Non-Uniform Memory Access）構成ではない場合、代表するCPUチップ内のコアだけが実行しても良いが、NUMA構成の場合は、全CPUチップ内の全コアまたは代表コアが実行する必要がある。補正値CRR3の測定は、全コアが実行する。
【００３２】
全コアのサイクル値の収集処理STEP2では、ロックを取得してから自分のサイクル値を内部レジスタに格納しその後アンロックする処理を、複数のコアが連続して実行する。そして、補正値の測定処理STEP1では、複数のコアによる連続するサイクル値の取得時の間の時間が、第一、第２の補正値CRR1,CRR2として測定される。また、STEP1では、各コアがサイクル値を取得するために要する時間が第３の補正値CRR3として測定される。
【００３３】
そして、いずれかのコアまたは全コアは、初期化処理プログラムを実行して、ログ収集処理の初期化処理として、更に、コア間のサイクル値差分を算出する（STEP3）。この算出処理は、STEP2で収集した全コアのサイクル値と代表コア（基準コア）のサイクル値との差分を、補正値CRR1,CRR2に基づいて、または、補正値CRR1,CRR2,CRR3に基づいて補正して、基準コアとの間のサイクル値差分を算出する。
【００３４】
上記のログ収集処理の初期化処理は、後で具体例を示して詳述する。
【００３５】
図５は、ログ分析装置４０の構成例を示す図である。ログ分析装置４０は、CPUチップCPU#0とメインメモリMEM0と、それらの間のメモリバスMEM_BUSと、補助記憶装置４１と、ネットワークインターフェースNICと、表示装置４２と、キーボードやタッチパネルなどの入力装置４３と、入出力バスIO_BUSとを有する。
【００３６】
補助記憶装置４１は、OSと、ログ受信処理及びログのマージ処理を含むログ分析プログラムとを記憶し、ログ分析装置が起動するときに、これらのプログラムがメインメモリに展開され、CPUチップにより実行される。
【００３７】
図６は、ログ分析装置によるログマージ処理のフローチャート図である。ログ分析装置のプロセッサは、ログ分析プログラムを実行して、各コアのログのサイクル値に、基準コアとのサイクル値差分を加算または減算して、補正サイクル値を算出する（STEP11）。そして、ログ分析装置のプロセッサは、補正サイクル値に基づいて各コアのログを整列しマージする（STEP12）。
【００３８】
[初期化処理の詳細]
以下、初期化処理について具体例を示しながら詳述する。理解を容易にするために、初期化処理を、全コアのサイクル値収集処理STEP2、補正値の測定処理STEP1、コア間のサイクル値差分の算出処理STEP3の順に、各処理のフローチャートと具体例を示して説明する。
【００３９】
[初期化処理、全コアのサイクル値収集STEP2]
図７、図８、図９は、全コアのサイクル値収集STEP2のうち全コアを代表する基準コアの処理を示すフローチャート図である。図１０、図１１は、全コアのサイクル値収集STEP2のうち基準コア以外のコアの処理を示すフローチャート図である。
【００４０】
更に、図１５、図１６は、初期化処理で使用されるメインメモリ内の変数を示す図である。以下の説明中に適宜図１５、図１６の変数が参照される。
【００４１】
理解を容易にするために、上記のフローチャートの説明を、全コアのサイクル値収集処理STEP2の具体例を示しながら行う。本実施の形態では、全コアのサイクル値の基準コアのサイクル値との差分を求める。そのために、全コアのサイクル値を取得して、その差分を算出する。ここで、問題になるのは、全コアのサイクル値を全く同一のタイミングで取得することは困難な点である。
【００４２】
そこで、本実施の形態では、全コアがシーケンシャルに自分のサイクル値をサイクル値レジスタから読みだしてコア内の所定のレジスタに格納する処理をそれぞれ実行する。そして、複数のコアがパラレルにサイクル値を収集しないようにするため、各コアが、ロックを取得した後にサイクル値を収集しそのロックを解除するという動作を、シーケンシャルに行う。また、複数のコアの取得順は、処理STEP2について全コアの制御を行うコアが最初にサイクル値を取得し、その後は、先にロックを取得した順に残りのコアがサイクル値取得処理を実行する。全コアの制御を行うコアは、前述の基準コアでなくてもよいが、以下の例では基準コアである。
【００４３】
図１７は、全コアのサイクル値収集処理STEP2の具体例を示す図である。図１７では、縦方向が時間軸Tであり、コア#0-#3が、コア#0,コア#2,コア#1,コア#3の順にサイクル値を収集する例を示す。また、４つのコアのうちコア#0が基準コアである。
【００４４】
まず、基準コア#0が、初期化処理プログラムを実行して、ロック獲得トライを実行しロック獲得に成功する。図１５のメインメモリ内の変数VA1に示す通り、基準コア番号BASE-IDはメインメモリ内にある。また、ロックは複数のCPUチップの複数のコアが獲得するので、図１５の変数VA2に示すとおりロック変数lockはメインメモリ内にある。また、ロック獲得に成功するまでロック獲得を連続してトライするスピンロックが採用される。そして、基準コア#0が残りのコアによるサイクル値収集処理のカーネルスレッドを起動して、残りのコア#1-#3がその処理を開始する。既に基準コア#0がロック獲得に成功しているので、他のコア#1-#3は、処理開始直後ロック獲得を失敗し続ける。
【００４５】
次に、基準コア#0は、メモリ内の変数VA3の共通ロック獲得順位lockorderをコア内のレジスタAに格納し、更に、そのメモリ内の共通ロック獲得順位を＋１インクリメントする。共通ロック獲得順位は０に初期化されていたため、レジスタA内には獲得順位「０」が格納される。そして、基準コア#0は、自分のサイクル値をサイクル値レジスタCYC_REGから読みだして（時刻T1）コア内のレジスタBに格納する。さらに、基準コア#0はアンロックを実行する。
【００４６】
基準コア#0によるアンロックに応答して、図１７の例では、コア#2がロック獲得に成功する。そこで、コア#2は、基準コア#0と同じ処理である、メモリ内の変数VA3の共通ロック獲得順位lockorderをコア内のレジスタAに格納し、そのメモリ内の共通ロック獲得順位を＋１インクリメントし、自分のサイクル値をサイクル値レジスタから読みだして（時刻T2）コア内のレジスタBに格納し、アンロックを実行する。
【００４７】
基準コア#2によるアンロックに応答して、図１７の例では、コア#1がロック獲得に成功する。そこで、コア#1は、上記と同じ処理、メモリ内の変数VA3の共通ロック獲得順位lockorderをコア内のレジスタAに格納し、そのメモリ内の共通ロック獲得順位を＋１インクリメントし、自分のサイクル値をサイクル値レジスタから読み出して（時刻T3）コア内のレジスタBに格納し、アンロックを実行する。
【００４８】
最後に、基準コア#1によるアンロックに応答して、図１７の例では、コア#3がロック獲得に成功する。そこで、コア#3は、上記と同じ処理、メモリ内の変数VA3の共通ロック獲得順位lockorderをコア内のレジスタAに格納し、そのメモリ内の共通ロック獲得順位を＋１インクリメントし、自分のサイクル値をサイクル値レジスタから読みだして（時刻T4）コア内のレジスタBに格納し、アンロックを実行する。
【００４９】
図１７のコア#2とコア#1でサイクル値レジスタからサイクル値を読みだした瞬間の時間差T3-T2は次のとおりである。即ち、時間差T3-T2は、コア#2でのサイクル値読み出し(T2)からアンロックを行う時間CRR2と、コア#1でのロック獲得を行いロック獲得を判定しロック獲得順位をメモリから読みだしてレジスタAに書き込みロック獲得順位を＋１しサイクル値を読み出す（T3）までの時間CRR1の和CRR2+CRR1である。
【００５０】
ここで、時間CRR1はロック獲得からサイクル値を読みだした瞬間までの時間であり、サイクル値収集に要するオーバーヘッド時間の前半の時間に相当する。一方、時間CRR2はサイクル値を読み出した瞬間からアンロックを完了するまでの時間であり、サイクル値収集に要するオーバーヘッド時間の後半の時間である。つまり、ロック獲得とアンロック、及びロック獲得順位の記憶とロック獲得順位のインクリメントは、サイクル値読み出しの前後に行われるオーバーヘッド時間である。
【００５１】
これらの時間CRR1,CRR2は、後述する補正値の測定STEP1で測定される。なお、図１７中に示される時間Tx,Tyは、後で説明する。
【００５２】
図７、図８、図９の初期化処理内の全コアのサイクル値収集処理STEP2-1の詳細を説明する。最初に、初期化処理プログラムを実行中のコアがSTEP2-1を実行する基準コアか否かを判定し（S201）、基準コアでなければ（S201のNO）、動作中CPUの割り込み禁止を解除し、タスクスイッチ禁止を解除する（S208）。一方、STEP2-1を実行する基準コアであれば（S201のYES）、以下の処理を行う。基準コアの情報は、メモリ内の変数VA1のBASE-IDである。上記の処理S201,S208は、後述する初期化処理内の補正値の測定処理STEP1-1と関連する処理であり、測定処理STEP1-1の説明の時に再度触れることにする。
【００５３】
基準コアのCPUチップは、CPUチップの割り込み禁止状態、タスクスイッチ禁止状態にされている（S202）。すなわち、補正値の測定処理STEP1-1でそれぞれの状態にされている。これらの状態にすることで、コアでのサイクル値収集処理中にCPU割り込みや別のタスクへの切り替わりが発生することを回避できる。
【００５４】
次に、基準コアは、初期化処理プログラムを実行して、メモリ内の変数VA3の共通ロック獲得順位lockorderを「０」に初期化する（S203）。そして、基準コアは、ロック獲得関数を呼び出してロック獲得トライを実行し（S204）、ロック獲得に成功する（S205のYES）。ロック獲得できない場合は異常動作である。そして、基準コアは、ロック獲得関数を呼び出すと、メモリ内の変数VA2のロック変数lockを読み出し、ロック変数がアンロック状態か否かを判定する。他のコアは未だロック関数を呼び出していないので、アンロック状態となりロック獲得成功となる（S205のYES）。
【００５５】
そして、基準コアは、現在の共通ロック獲得順位（変数VA3:lockorder）（現在初期値「０」）をメモリ内の配列（変数VA4）内の自分のインデックスに格納し（S206）、メモリ内の共通ロック獲得順位を＋１インクリメントする（S207）。これらの処理は、メインメモリへのアクセスを必要とする。
【００５６】
図８に移り、基準コアは他のコアを起動する処理を実行する。図８では、変数iがi=0からi=MAXCPUに達するまで処理S210-S214を繰り返す（S209,S215）。ここでMAXCPUとは情報処理装置内のCPUコアの総数である。または、MAXCPUはログをマージすべきCPUコアの総数である。まず、変数iが動作中のCPUコア番号（この時点で基準コア）と異なっていなければ、つまり一致すれば（S210のNO）、処理S211-S214の他のコアの起動処理を実行せず、異なっていれば（S210のYES）、実行する。
【００５７】
基準コアは、自分以外のコア番号iのコアに対して、カーネルスレッドを生成し（S211）、CPUコア#iにそのカーネルスレッドを割り当てて（S212）、カーネルスレッドを最高優先度に設定し（S213）、CPUコア#iに割り当てたカーネルスレッドを起動する（S214）。これにより、基準コアの番号と異なる#i番目のコア#iを全て起動することができる。
【００５８】
各コアに割り当てるスレッド番号は、メモリ内の変数VA6の配列内に格納され、各コアに割り当てられたスレッド番号がカーネルスレッドの起動関数に渡される。この起動による他のコア#iの動作については図１０、図１１で後述する。また、カーネルスレッドは、他のコアに図１７で説明したサイクル値収集処理を実行させるプログラムである。
【００５９】
基準コアは、更に、基準コア以外の全CPUコアのロック待ちフラグがON状態であることを確認する（S216）。これは、基準コア以外の全コアのカーネルスレッドを起動させたが、それらの他のコアは、カーネルスレッドを起動した直後、ロック獲得を試み、基準コアによるロック獲得状態によりロック獲得を失敗し、ロック待ちフラグをON状態にする。ロック待ちフラグがON状態になると、スピンロックの機能により、引き続きロック獲得トライとロック判定（失敗）を繰り返すことになる。そして、他のコア全てがロック待ちフラグをON状態にしたこと（つまり起動後スピンロックの獲得トライと判定を繰り返す状態になったこと）を確認してから（S216）、図９に示す通り、基準コアは自分のサイクル値をサイクル値レジスタから読みだして内部のレジスタREG1に格納する（S217）。ロック待ちフラグは、メモリ内の変数VA7の配列に格納されている。
【００６０】
次に、基準コアは、初期化プログラムを実行することで、アンロック関数を呼び出してアンロックを実行し（S219）、レジスタREG1内のサイクル値をメモリ内の変数VA8の各コアのサイクル値を格納する配列に書き込む（S220）。そして、基準コアの動作CPUの割り込み禁止を解除し、タスクスイッチ禁止も解除する（S221）。
【００６１】
次に、図１０、図１１の他のコアによるサイクル値収集処理（カーネルスレッドの処理）を説明する。基準コア#0によるカーネルスレッドの起動により、他のコアそれぞれは、図１０、図１１の処理を実行する。まず、他のコアは、動作コア番号を取得する（S231）。この動作コア番号はメモリ内の変数VA14である。
【００６２】
そして、他のコアは、カーネルスレッドを実行して、動作CPUの割り込みを禁止し、タスクスイッチを禁止する（S232）。そして、まず、スピンロック獲得関数を呼び出し（S233）、ロック獲得の判定を行う（S234）。判定結果が失敗であれば（S234のNO）、起動直後は未だロック待ちフラグがOFFであるので（S235のYES）、ロック待ちフラグをON状態にする（S236）。ロック待ちフラグはコア内のレジスタとメモリ内の変数VA7に格納されていて、ここでは両方ともON状態にする。ロック待ちフラグがON状態になったことは、スピンロック獲得S233と獲得判定S234が開始されたことを意味する。
【００６３】
そこで、他のコアは、カーネルスレッドを実行して、メモリ内の共通ロック獲得順位（VA3:lockorder）を読みだしてコア内のレジスタに格納し（S237）、メモリ内の共通ロック獲得順位を＋１インクリメントする（S238）。それに続いて、他のコアは、コア内のサイクル値レジスタのサイクル値を読み出しコア内のレジスタREG1に格納し（S239）、アンロック関数を呼び出してアンロックを実行し（S240）、レジスタREG1のサイクル値をメモリ内の変数VA8の配列の自分のコア番号のインデックスに書き込む（S241）。この時、コア内のレジスタの自分のロック獲得順位をメモリ内の変数VA4の配列に書き込んでも良い。最後に、他のコアは、動作CPUの割り込み禁止を解除し、タスクスイッチ禁止を解除する（S242）。
【００６４】
以上の動作により、図１７で示した各コアによるサイクル値収集処理STEP2が行われる。各コアがロック獲得を成功するタイミングはその時の状況で変化するので、上記の処理では、全コアに共通の共通ロック獲得順位lockorderをメモリ内の変数VA3に格納し、各コアがロック獲得に成功するたびに変数VA3の共通ロック獲得順位を読み出して、自分のロック獲得順位としてコア内のレジスタに記憶しておく。さらに、コア内のサイクル値レジスタのサイクル値も読みだしてコア内のレジスタREG1に記憶しておく。そして、各コアのサイクル値収集処理が完了するとき、または全コアによるサイクル値収集処理が完了後に、各コアは、コア内のレジスタのロック獲得順位とサイクル値を、メモリ内の変数VA4とVA8の配列のコアに対応するインデックスに書き込む。
【００６５】
[初期化処理、補正値の測定STEP1]
初期化処理内の補正値の測定は、第１及び第２の補正値CRR1,CRR2の測定処理STEP1-1と、第３の補正値CRR3の測定処理STEP1-2とを有する。図１２、図７−９の例では、補正値測定処理STEP1-1は、サイクル値収集処理STEP2-1の前に行われる。
【００６６】
この第１、第２の補正値CRR1,CRR2の測定処理STEP1-1は、CPUチップとメインメモリとの間のアクセス時間が全CPUで等しいUMA（Uniform Memory Access）の場合は、いずれかのCPUコアが実行すればよく、例えばサイクル値収集処理STEP2-1を実行する基準コアに実行させる。また、CPUチップとメインメモリとの間のアクセス時間が全CPUで等しくないNUMA（NON-Uniform Memory Access）や情報処理装置内のCPUチップが異なっていたり、CPUチップ内のコアが異なっている場合は、測定処理STEP1-1はすべてのCPUコアで実行する。
【００６７】
また、第３の補正値CRR3の測定処理STEP1-2は、コア内のサイクル値を読みだしてレジスタ内への格納処理である。したがって、UMAまたはNUMAにかかわらず、情報処理装置内のCPUチップが同じで、CPUチップ内のコアも同じであれば、いずれかのCPUのいずれかのコアが実行すればよい。CPUコアの構成や動作が異なる場合は、第３の補正値CRR3の測定処理STEP1-2は全コアで実行することが精度を上げるためには望ましい。
【００６８】
図１２は、補正値測定処理STEP1-1のフローチャート図であり、図１３は、補正値測定処理STEP1-2のフローチャート図である。これらのフローチャートを説明する前に、補正値測定処理STEP1-1とSTEP1-2の具体例を説明する。
【００６９】
図１８は、補正値測定処理STEP1-1とSTEP1-2の具体例を示す図である。補正値測定処理STEP1-1は、サイクル値収集処理STEP2-1,STEP2-2での各コアによるサイクル値のレジスタBへの格納処理の前半のロック獲得トライから後半のアンロックまでの一連の処理の前後に、サイクル値のレジスタCへの格納処理と、サイクル値のレジスタDへの格納処理を有する。つまり、サイクル値のコア内レジスタへの格納処理が３回実行される。
【００７０】
すなわち、図１８に示されるとおり、補正値測定処理STEP1-1では、コアが、サイクル値をサイクル値レジスタから読みだしてコア内のレジスタCに格納し、その後、ロック獲得トライ、ロック判定、ロック獲得順位をコア内のレジスタAに格納、メモリ内のロック獲得順位を＋１インクリメントを実行する。それに続いて、コアが、サイクル値を読み出してコア内のレジスタBに格納する。さらに、コアが、アンロックを行なって、再度サイクル値を読み出してコア内のレジスタDに格納する。
【００７１】
上記の一連の処理から理解できるとおり、サイクル値をレジスタBに格納する処理の前の処理時間CRR1が第１の補正値であり、後の処理時間CRR2が第２の補正値である。つまり、第１の補正値CRR1は、サイクル値をレジスタBに格納するための処理の前半のオーバーヘッド時間である。一方、第２の補正値CRR2は、後半のオーバーヘッド時間である。
【００７２】
この第１、第２の補正値CRR1,CRR2は、以下の式により求められる。
第１の補正値（前半部の処理時間）CRR1 = レジスタB-レジスタC
第２の補正値（後半部の処理時間）CRR2 = レジスタD-レジスタB
ここで、各レジスタB,C,Dの値は、サイクル値のレジスタへの格納処理で読み出したサイクル値レジスタ内のサイクル値である。
【００７３】
次に、補正値測定処理STEP1-2では、コアは、サイクル値を読み出してコア内のレジスタCに格納し、それに続いて、サイクル値を読みだしてコア内のレジスタBに格納する処理を有する。そして、コアがサイクル値レジスタからサイクル値を読み出してコア内のレジスタBまたはCに格納する時間は、コアがサイクル値のレジスタ格納命令を実行開始してからサイクル値レジスタのサイクル値を読み出すまでの前半時間Txと、その後コア内レジスタBまたはCに格納するまでの後半時間Tyとの和Tx+Tyである。そして、この和Tx+Tyは第３の補正値CRR3であり、レジスタB,C内のサイクル値から次の式により算出できる。
第３の補正値（サイクル値のレジスタ格納処理時間）CRR3 = レジスタB-レジスタC = Tx+Ty
ここで、レジスタC,Bは、補正値測定処理STEP1-1でも使用されているが処理STEP1-1中にレジスタC,Bのサイクル値は上記の式によりCRR1,CRR2の算出に利用済みであるので、補正値測定処理STEP1-2で同じレジスタC,Bを使用しても問題はない。または、レジスタC,B以外のコア内のレジスタを使用してもよい。
【００７４】
第３の補正値CRR3は、コア内の処理であるのに対して、第１、第２の補正値CRR1,CRR2は、外部メモリアクセスを伴う処理である。したがって、一般に、第３の補正値は、第１、第２の補正値より非常に短い時間（少ないサイクル数）である。
【００７５】
図１８から明らかな通り、補正値測定処理STEP1-1で求めた第１の補正値CRR1には、サイクル値をレジスタCに格納する時間の後半時間Tyとサイクル値をレジスタBに格納する時間の前半時間Txとが含まれる。同様に、第２の補正値CRR2には、サイクル値をレジスタBに格納する時間の後半時間Tyとサイクル値をレジスタCに格納する時間の前半時間Txとが含まれる。
【００７６】
一方、図１７に示したコア#0,#2による、コア#2,#1による、及びコア#1,#3によるそれぞれ連続するサイクル値のレジスタBへの格納処理の間の後半部の補正値CRR2には、サイクル値をレジスタに格納する前半時間Txは含まれるべきではなく、同様に、前半部の補正値CRR1には、同後半時間Tyが含まれるべきではない。
【００７７】
したがって、第３の補正値CRR3が第１、第２の補正値CRR1,CRR2にとって無視できるほど小さいとみなす場合は、第１、第２の補正値CRR1,CRR2の第３の補正値による微調整は不要である。一方で、無視できないとみなす場合は、微調整を行う必要がある。この点は、コア間のサイクル値差分の算出式に影響を与える。詳しくは後述するコア間のサイクル値差分の算出処理STEP3で説明する。
【００７８】
図１２は、初期化処理内の第１、第２の補正値CRR1,CRR2を測定する処理STEP1-1を示すフローチャート図である。この処理STEP1-1は、前述のとおり、NUMA構成などの場合は、すべてのコアで実行するが、NUMA構成などではない（UMA構成など）場合は、代表コアである基準コア（処理STEP2-1を実行すべきコア）だけが実行する。但し、図１２の処理STEP1-1とそれに続く図７の処理STEP2-1は、NUMA構成を前提として、処理STEP1-1をすべてのコアで実行することを前提に記載されている。
【００７９】
処理STEP1-1では、処理を実行しているコアは、そのコア番号を取得し（S101）、コアのCPUの割り込みを禁止にし、タスクスイッチも禁止にする（S102）。そして、コアは、メモリ内の変数VA3の共通ロック獲得順位lockorderを「０」に初期化し（S103）、サイクル値をサイクル値レジスタから読み出してレジスタREG1（図１８のレジスタC）に格納する（S104）。上記の初期化処理S103は、図７の処理STEP2-1の初期化処理S203に対応する。
【００８０】
そこで、コアは、ロック獲得関数を呼び出してロック取得トライを実行し（S105）、ロック獲得に成功すると（S106のYES）、メモリ内変数VA3の共通ロック獲得順位をコア内のレジスタREG4（図１８のレジスタA）に格納し（S107）、メモリ内の共通ロック獲得順位を＋１インクリメントする（S108）。
【００８１】
それに続いて、コアは、サイクル値をサイクル値レジスタから読み出してレジスタREG2（図１８のレジスタB）に格納する（S109）。さらに、コアは、アンロック関数を呼び出してアンロックを実行し(S110)、サイクル値をサイクル値レジスタから読み出してレジスタREG3（図１８のレジスタD）に格納する（S111）。
【００８２】
そして、コアは、以下の式により第１の補正値CRR1と第２の補正値CRR2を算出し、図１５に示したメモリ内の変数VA5の配列内の該当するコア番号のインデックスに書き込む（S112）。
CRR1=REG2-REG1
CRR2=REG3-REG2
ここで、変数VA5の配列には、コア番号#0には第１の補正値CRR1_#0と第２の補正値CRR2_#0が書き込まれ、コア番号#Nには第１の補正値CRR1_#Nと第２の補正値CRR2_#Nが書き込まれる(Nは0から(MAXCPU-1)まで)。
【００８３】
そして、処理S112は図７の処理STEP2-1へ続く。そこで、図７の処理STEP2-1を見ると、処理STEP1-1を実行中のコアは、そのコア番号が処理STEP2-1を実行すべきコアであるか否かを判定し（S201）、実行すべきコアでない場合（S201のNO）、そのCPUの割り込み禁止とタスクスイッチ禁止をそれぞれ解除する（S208）。この解除は、図１２の処理STEP1-1でのCPU割り込み禁止とタスクスイッチ禁止（S102）に対応する処理である。つまり、図１２に処理STEP1-1は全てのコアが実行するが、処理STEP2-1を実行すべきコア（基準コア）だけが、図７の処理STEP2-1を実行し、それ以外のコアは処理STEP2-1を実行しない。よって、基準コアの場合は、図７のSTEP2-1にて既にCPU割り込み禁止及びタスクスイッチ禁止の状態にされている。
【００８４】
次に、図１３の初期化処理の第３の補正値CRR3の測定処理STEP1-2について説明する。この処理STEP1-2は、コア内の処理時間を測定するものであるので、複数のコアの構成が異なるなどの場合を除いて、NUMA構成であってもいずれかのCPUチップのいずれかの１つのコアが実行すれば良い。
【００８５】
まず、コアは、そのCPUの割り込み禁止及びタスクスイッチ禁止にする（S121）。そして、コアは、サイクル値レジスタのサイクル値を読み出しコア内のレジスタREG1に格納し（S122）、引き続き、サイクル値レジスタのサイクル値を読み出しコア内のレジスタREG2に格納する（S122）。さらに、コアは、次の式により第３の補正値CRR3を算出し、メモリ内の変数VA11に書き込む（S124）。
第３の補正値CRR3 = REG2-REG1 = Tx+Ty
第３の補正値CRR3は、前述のとおり、サイクル値のレジスタへの格納処理の前半時間TxとTyの合計時間（サイクル数）である。
【００８６】
[初期化処理、コア間のサイクル値差分の算出STEP3]
コア間のサイクル値の差分は次のようにして算出される。図１７の例の場合、コア#0が基準コアであるので、コア#0-#2間、コア#0-#1間、コア#0-#3間のサイクル値差分がそれぞれ以下の式で算出される。つまり、コア#1,#2,#3それぞれの基準コア#0とのサイクル値の差分が算出される。
【００８７】
（１）第３の補正値CRR3を無視する場合、以下の式１により、コア間サイクル値差分はコア間のサイクル値CYC#の差分からΣCRR2+CRR1を減算して求める。
（式１）
コア#0-#2間 = (コア#2のCYC2-コア#0のCYC0)-(CRR2_#0+CRR1_#2)
コア#0-#1間 = (コア#1のCYC1-コア#0のCYC0)-(CRR2_#0+CRR1_#2+CRR2_#2+CRR1_#1)
コア#0-#3間 = (コア#3のCYC3-コア#0のCYC0)-
(CRR2_#0+CRR1_#2+CRR2_#2+CRR1_#1+CRR2_#1+CRR1_#3)
すなわち、コア#0-#1間の場合、サイクル値差分を求める対象コア#1のサイクル値CYC1と基準コアのサイクル値CYC0の間には、コア#0のCRR2とコア#2のCRR1及びCRR2とコア#1のCRR1とが含まれている。したがって、差分（CYC1-CYC0）から（CRR2_#0+CRR1_#2+CRR2_#2+CRR1_#1）＝ΣCRRを減じることで、同一時刻でのコア#0,#1との間のサイクル値差分を算出することができる。
【００８８】
（２）第３の補正値CRR3も補正する場合、以下の式２により、コア間サイクル値差分をコア間のサイクル値CYC#の差分からΣCRR2+CRR1とCRR3*（orderX=コア間数）を減算して求める。
（式２）
コア#0-#2間 = (コア#2のCYC2-コア#0のCYC0)-(CRR2_#0+CRR1_#2)-CRR3
コア#0-#1間 = (コア#1のCYC1-コア#0のCYC0)-(CRR2_#0+CRR1_#2+CRR2_#2+CRR1_#1)-CRR3*2
コア#0-#3間 = (コア#3のCYC3-コア#0のCYC0)-
(CRR2_#0+CRR1_#2+CRR2_#2+CRR1_#1+CRR2_#1+CRR1_#3)-CRR3*3
ここで、コア間数orderXとは、基準コア#0と対象のコア#iまでのコア間処理の回数であり、CORE#0-CORE#2-CORE#1の場合はコア間処理は２回、CORE#0-CORE#2-CORE#1-CORE#3の場合はコア間処理は３回である。
【００８９】
すなわち、図１８の補正値測定処理の第１、第２の補正値CRR1,CRR2には、それぞれサイクル値のレジスタへの格納処理の後半時間Tyと前半時間Txとが含まれている。これに対して、図１７の第２の補正値CRR2にはサイクル値のレジスタ格納処理の前半時間Txは含まれるべきではなく、図１７の第１の補正値CRR1にはサイクル値のレジスタ格納処理の後半時間Tyは含まれるべきではない。
【００９０】
そこで、コア#0-#1間の場合、サイクル値差分を求める対象コア#1のサイクル値CYC1と基準コアのサイクル値CYC0の差分（CYC1-CYC0）から（CRR2_#0+CRR1_#2+CRR2_#2+CRR1_#1）＝ΣCRRを減じ、更に、CRR3*2を減じて、コア#1のサイクル値とコア#0のサイクル値の同じ瞬間（同一時刻）でのサイクル値差分を算出する。
【００９１】
図１４は、初期化処理のコア間のサイクル値差分の算出処理STEP3のフローチャート図である。この算出処理STEP3は、情報処理装置内のいずれかのCPUチップのいずれかのコアで実行される。または、算出処理STEP3は、ログ分析装置のCPUで実行されてもよい。
【００９２】
サイクル値差分の算出処理は、変数iを初期値０から最大コア番号MAXCPUに達するまで変更し、それぞれ変数iのコア番号のコアの基準コアとのサイクル値差分を求める（S301,S310）。
【００９３】
まず、コアは、第１、第２の補正値CRR1,CRR2の累積値ΣCRRを「０」で初期化する（S302）。そして、変数iが基準コア番号BASE-IDと一致すれば（S303のYES）、コア間のサイクル値差分は０であるので、処理S304-S307を実行しない。変数iが基準コア番号BASE-IDと一致しなければ（S303のNO）、処理S304-S307を実行する。
【００９４】
一致しない場合（S303のNO）、つまり、変数iが基準コア番号BASE-IDと異なる場合、コアは、補正値コア番号#COREを基準コア番号BASE-IDで初期化し（S304）、初期化した補正値コア番号＃COREのコアの第１の補正値CRR1_#COREを累積値ΣCRRに加算する（S305）。さらに、スピンロック獲得順にしたがって基準コアの次にスピンロックを獲得したコア番号に補正値コア番号＃COREを更新し（S306）、更新した補正値コア番号＃COREのコアの第２の補正値CRR2_#COREを累積値ΣCRRに加算する（S307）。
【００９５】
上記の処理S305-S307が、補正値コア番号#COREが変数iに達するまで繰り返す（S308）。補正値コア番号＃COREが変数iに達したら、コアは、基準コアBASE-IDとi番目のCPUコアのサイクル値差分を、前述の式１または式２により算出し、メモリ内の変数VA12の配列内に書き込む（S309）。
【００９６】
[ログ分析装置によるログのマージ処理]
図１９は、ログ分析装置による各コアのログのマージ処理を示す図である。図１９の上の表は、コア#0とコア#1が収集したログの一例である。各ログには、イベント内容に、絶対時刻と各コアのサイクル値とがタイムスタンプとして付与される。絶対時刻はマイクロ秒の精度であるのに対して、サイクル値はそれより高精度の例えばナノ秒の精度である。
【００９７】
仮に、初期化処理のコア間のサイクル値差分の算出処理STEP3により、基準コア#0に対するコア#1のサイクル値差分が+30と検出されたとする。その場合、ログ分析装置は、コア#1のサイクル値に+30して、基準コア#0のサイクル値と同じ時間軸のサイクル値に補正する。その結果、図１９の下の表では、コア#1の各サイクル値が上の表のサイクル値に対して+30される。
【００９８】
そして、ログ分析装置は、このコア#1のログを補正されたタイムスタンプのサイクル値に基づいて、コア#0のログにマージする。その結果、図１９の下の表では、コア#0、コア#1それぞれのログが同じ時間軸上のサイクル値に基づく順番でマージされている。
【００９９】
以上説明したとおり、本実施の形態によれば、CPUコア間のサイクル値の起点を同時にすることができない課題を解決するために、第1に、各コアのサイクル値の読み出しを組み合わせて補正値CRR1,CRR2,CRR3を測定する。第２に、全コアのサイクル値の読み出しをロックアルゴリズムを利用して連続して実行し、基準コア以外のコアのサイクル値を補正値に基づいて補正して基準コアのサイクル値に対する差分（サイクル値差分）を算出する。第３に、このサイクル値差分を利用して、基準コア以外のログのタイムスタンプのサイクル値を補正して、全コアのログのタイムスタンプを同じ時間軸（サイクル値軸）上にマージする。
【０１００】
上記の実施の形態では、マルチコアプロセッサを有する情報処理装置内の全てのコアについて、第１、第２の補正値CRR1,CRR2を測定する処理STEP1-1と、サイクル値収集処理STEP2を実行し、全てのコアのサイクル値を補正値に基づいて基準コアの時間軸のサイクル値に補正した。但し、マルチコアプロセッサ内の複数のコアがほとんど同じ第1、第２の補正値を有する場合、全コアではなく、全CPUについて補正値測定処理STEP1-1と、サイクル値収集処理STEP2を実行してもよい。この場合は、CPU間のサイクル値差分が補正値に基づいて補正される。
【０１０１】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１０２】
（付記１）
マルチコアプロセッサを有する情報処理装置における複数のコアのクロックをカウントしたサイクル値の前記複数のコア間の差分を測定する処理をコンピュータに実行させるサイクル値測定プログラムであって、
前記処理は、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定プログラム。
【０１０３】
（付記２）
前記サイクル値差分算出処理は、前記第１の差分から、前記第１の補正値と前記第２の補正値とを減じて、前記サイクル値差分を算出する、付記１に記載のサイクル値測定プログラム。
【０１０４】
（付記３）
前記処理は、更に、
前記一つのコアにおいて、前記一つのコア内のサイクル値を第６の記憶部に記憶し、続けて前記サイクル値を第７の記憶部に記憶する第３の測定処理を有し、
前記サイクル値差分算出処理は、前記第１の差分から、前記第１の補正値と前記第２の補正値とを減じ、更に、前記第６，７の記憶部内のサイクル値の差分である第３の補正値を加算して、前記サイクル値差分を算出する、付記１に記載のサイクル値測定プログラム。
【０１０５】
（付記４）
前記第１、第２のコアのサイクル値の一方を、前記サイクル値差分に基づいて補正する、付記１に記載のサイクル値測定プログラム。
【０１０６】
（付記５）
前記第１の測定処理が、前記複数のコアで実行される、付記１に記載のサイクル値測定プログラム。
【０１０７】
（付記６）
前記コア内のサイクル値を読み出す処理が、非キャッシュ領域へのアクセスにより行われる、付記１に記載のサイクル値測定プログラム。
【０１０８】
（付記７）
マルチコアプロセッサを有する情報処理装置における複数のコアのクロックをカウントしたサイクル値の前記複数のコア間の差分を測定するサイクル値測定方法であって、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定方法。
【０１０９】
（付記８）
それぞれ複数のコアを有する複数のプロセッサと、
前記複数のプロセッサの複数のコアからアクセスされるメモリを有し、
前記複数のプロセッサの複数のコアは、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定処理を実行する、マルチコアプロセッサを有する情報処理装置。
【０１１０】
（付記９）
それぞれ複数のコアを有する複数のプロセッサと、前記複数のプロセッサの複数のコアからアクセスされるメモリを有し、前記複数のプロセッサの複数のコアは、
前記複数のコアのうち少なくとも一つのコアにおいて、前記一つのコア内のサイクル値を第１の記憶部に記憶し、排他処理のロックを獲得し、前記サイクル値を第２の記憶部に記憶し、前記ロックを開放し、前記サイクル値を第３の記憶部に記憶する第１の測定処理と、
第１のコアにおいて、前記排他処理のロックを獲得し、前記第１のコア内のサイクル値を第４の記憶部に記憶し、前記ロックを開放し、第２のコアにおいて、前記排他処理のロックを獲得し、前記第２のコア内のサイクル値を第５の記憶部に記憶する第２の測定処理と、
前記第４、第５の記憶部内のサイクル値の第１の差分を、前記第１，２の記憶部内のサイクル値の差分である第１の補正値と前記第２，３の記憶部内のサイクル値の差分である第２の補正値とに基づいて補正し、第１、第２のコアのサイクル値の差分であるサイクル値差分を算出するサイクル値差分算出処理とを有する、サイクル値測定処理を実行する、情報処理装置と、
前記第１、第２のコアがそれぞれ収集した前記サイクル値をタイムスタンプとする第１、第２のログのうち、前記第２のコアの前記第２のログのタイムスタンプであるサイクル値を、前記サイクル値差分に基づいて補正し、前記第１のログと第２のログを、前記第１のログのサイクル値と前記第２のログの補正サイクル値に基づいてマージするログ分析装置とを有する、マルチコアプロセッサを有する情報処理システム。
【符号の説明】
【０１１１】
CPU#0,CPU#1：CPUチップ、プロセッサ
CORE#0-#4：CPUコア、コア
CYC_REG0-3：サイクル値レジスタ
MEM0,MEM1：メインメモリ
CRR1：第１の補正値
CRR2：第２の補正値
CRR3；第３の補正値
【図１】
2018206180.tif 000003
【図２】
2018206180.tif 000004
【図３】
2018206180.tif 000005
【図４】
2018206180.tif 000006
【図５】
2018206180.tif 000007
【図６】
2018206180.tif 000008
【図７】
2018206180.tif 000009
【図８】
2018206180.tif 000010
【図９】
2018206180.tif 000011
【図１０】
2018206180.tif 000012
【図１１】
2018206180.tif 000013
【図１２】
2018206180.tif 000014
【図１３】
2018206180.tif 000015
【図１４】
2018206180.tif 000016
【図１５】
2018206180.tif 000017
【図１６】
2018206180.tif 000018
【図１７】
2018206180.tif 000019
【図１８】
2018206180.tif 000020
【図１９】
2018206180.tif 000021