説明

処理装置および履歴取得方法

【課題】ユーザプログラム実行時の処理装置の内部の動作状況を確認する技術を提供する。
【解決手段】処理装置は、一連の命令を含む実行対象のプログラムを実行するプロセッサ部を含む処理装置であって、処理装置の動作履歴を記録する履歴記録部と、履歴記録部による記録処理を制御するとともに、履歴記録部に記録された動作履歴を読み出す管理部と、実行対象のプログラム中の命令のうち、管理部宛の制御命令を管理部に引き渡す処理を起動する起動命令を検出し、起動命令にしたがって制御命令を管理部に引き渡す入力部と、管理部が読み出した動作履歴を管理部から受け取る出力部とを備える。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータ等の処理装置の動作状況を収集し、解析するための技術に関する。
【背景技術】
【0002】
コンピュータ等の処理装置において、ハードウェアの動作状況を解析するため、様々な技術が提案されている。
【0003】
例えば、パフォーマンス・モニタ回路(PM回路)および中央演算装置(CPU)、入出力(I/O)装置等の複数のデバイスをデータバスに接続したシステムが例示される。このようなシステムでは、PM回路がモニタ対象である事象の検出を行い、モニタした結果をPM回路内部の記録領域に格納することが提案されている。また、カウンタが比較値と一致したときプロセッサが割り込まれるように、比較レジスタと割り込みラインを有するシステムが例示される。さらに、情報処理装置内の命令プロセッサに組み込まれている、ハードウェアモニタと呼ばれるCPU性能プロファイリングにおいて、ある一定の閾値を超える回数の測定イベントが発生した際に割込みを発生する機能が提案されている。
【0004】
ハードウェアの動作状況解析に関する技術を開示する文献として、例えば以下のものがあげられる。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特表2006−524375号公報
【特許文献2】特開2005−339107号公報
【特許文献3】特開平08−30494号公報
【特許文献4】特開2005−215816号公報
【特許文献5】特開2007−249534号公報
【特許文献6】特開2007−272692号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
従来、コンピュータ等の処理装置は、パフォーマンスアナライザ、パフォーマンス・モニタ等によって、命令実行時間およびキャッシュミス回数を観測することで、期待した性能が出ているか否かを確認することができた。しかし、従来のパフォーマンスアナライザ等は、ユーザプログラム実行時に期待した性能が出ていないときは、その性能向上のための解決手段としては十分ではなかった。例えば、上記技術によるイベント回数等の観測結果からは、ユーザは、なぜ処理装置が期待した動作をしていないのかを知ることはできなかった。
【0007】
開示の実施形態の目的は、ユーザプログラム実行時の処理装置の内部の動作状況を確認する技術を提供することである。
【課題を解決するための手段】
【0008】
開示の実施形態の一態様は、一連の命令を含む実行対象のプログラムを実行するプロセッサ部を含む処理装置であって、処理装置の動作履歴を記録する履歴記録部と、履歴記録部による記録処理を制御するとともに、履歴記録部に記録された動作履歴を読み出す管理部と、実行対象のプログラム中の命令のうち、管理部宛の制御命令を管理部に引き渡す処
理を起動する起動命令を検出し、起動命令にしたがって制御命令を管理部に引き渡す入力部と、管理部が制御命令にしたがって読み出した動作履歴を管理部から受け取る出力部と、を備える処理装置として例示される。
【発明の効果】
【0009】
開示の技術によれば、ユーザは、ユーザプログラム実行時の処理装置の内部の動作状況を確認することができる。
【図面の簡単な説明】
【0010】
【図1】実施例1に係る処理装置の構成図である。
【図2】実施例2に係る処理装置の構成を例示する図である。
【図3A】ASI空間直接指定コマンドの例である。
【図3B】ASI空間間接指定コマンドの例である。
【図4】NACK_codeの定義を例示する図である。
【図5】ASIコマンド経由でJTAGコマンドが各処理部へと受け渡される経路の構成を説明する図である。
【図6】JTAGコマンド制御部の詳細構成を例示する図である。
【図7】コマンド発行手順のフローチャートを例示する図(その1)である
【図8】コマンド発行手順のフローチャートを例示する図(その2)である
【図9】ロックの獲得および開放の実施を試みたときのコマンドデータへの設定値、および、その設定値によるレジスタの状態の変化を例示する図である。
【図10】L2キャッシュ制御部のヒストリRAMのヒストリ制御部と、レジスタCORE_DEBUG_REG1のビット構成との関係を示す図である。
【図11】命令処理装置のヒストリRAMのヒストリ制御部と、ヒストリ制御部での制御を指定する制御レジスタとの関係を示す概念図である。
【図12】L2キャッシュ制御部のヒストリRAMに記録されるデータフォーマットを例示する図である。
【図13】履歴の記録を開始するときに、識別情報を埋め込む回路構成を例示する図である。
【図14】本処理装置で実行されるユーザプログラムの処理を例示する図である。
【図15】ユーザプログラムを実行するコンピュータの構成を例示する図である。
【図16】ノンキャッシュ空間へのアクセスを使用した処理装置の構成例である。
【図17】特権命令を用いた制御による、処理装置の構成例である。
【図18】処理装置で実行される被監視プログラムの処理を示すフローチャートである。
【図19】監視プログラムの処理を例示する図である。
【図20】他の監視プログラムの処理を例示する図である。
【発明を実施するための形態】
【0011】
以下、図面を参照して本開示の技術の一態様(以下、実施形態という)に係る処理装置を説明する。本実施形態の構成は例示であり、本処理装置は実施形態の構成には限定されない。
【実施例1】
【0012】
コンピュータの性能解析には、パフォーマンスアナライザと呼ばれる解析ツールが用いられる。コンピュータのユーザは、パフォーマンスアナライザによって、例えば、コンピュータがプログラムを実行するときの命令実行時間およびキャッシュミス回数等のイベント回数を観測することができる。このような観測結果を基に、ユーザは、コンピュータで実行されるプログラムのチューニングを行う。
【0013】
例えば、コンピュータで本来想定した以上にキャッシュミスが頻繁に起きている場合を仮定する。そして、キャッシュミスの原因が、異なる物理アドレスに格納されたデータによるスラッシングにあったとする。例えば、キャッシュラインの同一インデックスアドレスへ登録されるデータが、キャッシュWAY数を超えて同時期に使用されているとスラッシングが発生する。
【0014】
このようなとき、ユーザは、コンピュータ上でキャッシュミス回数を観測することはできる。しかし、キャッシュミスの原因がスラッシングによるものか、あるいは、キャッシュメモリの容量不足に起因するものかを特定することが困難である。また、仮にスラッシングがキャッシュミスの原因であることが分かったとしても、どのアドレスのデータによってスラッシングが発生しているかを知ることは困難である。このため、ユーザは、プログラムによるチューニングを行うための要点、あるいは、原因解明の手がかりをつかめないことがある。そして、このような問題がコンピュータの性能向上のためのチューニングの妨げとなっている。
【0015】
ユーザがスラッシングやプログラム実行状況を把握できるようにするために、コンピュータのハードウェアは、履歴記録部(ヒストリRAM(Random Access Memory)ともいう)を備えている。しかし、履歴記録部の操作体系(コマンドともいう)、およびその操作体系を受け付けるインターフェースは、管理用プロセッサからの操作を受け付けるが、ユーザのコンピュータからの操作は受け付けないようになっている。管理用プロセッサは、サービスプロセッサ、あるいは、システム制御装置とも呼ばれ、コンピュータシステムの内部の状況を監視し、あるいは、コンピュータ内部を制御する機能を有する。
【0016】
しかし、サービスプロセッサへのアクセスは、ユーザに開放されていない。このため、ユーザは、サービスプロセッサを操作することはできない。したがって、ユーザは、ユーザプログラムの実行と同期させて、履歴記録部を利用することができない。例えば、ユーザは、ユーザプログラムの所望の命令列が実行されたタイミングの近傍で、履歴記録部による履歴の蓄積を開始、あるいは、停止することができない。したがって、ユーザが所望の命令列実行のタイミング近傍の履歴を取得するのは困難である。
【0017】
サービスプロセッサは、ユーザが使用するコンピュータから独立したシステムに存在し、特別な処理体系を持つシステムである。このため、ユーザがサービスプロセッサを使用することは想定されていない。一方、ユーザがサービスプロセッサを使用すると、ユーザは、コンピュータの内部に対する操作、あるいはコンピュータ内部の操作によるコンピュータの各部への限度を超えたアクセスが可能となる。そのため、サービスプロセッサをユーザに開放することには危険が伴い、ユーザに履歴記録部への操作を開放することによって発生する問題への対処が極めて困難であった。
【0018】
そのため、安全上の配慮から、サービスプロセッサによる履歴記録部からの読み出し結果は、サービスプロセッサおよびサービスプロセッサに接続されたシステムにて利用されている。そして、サービスプロセッサは、ユーザのコンピュータが認識できない独立したシステムである。このような環境では、履歴情報をユーザに提供するために、ネットワークを介してしてサービスプロセッサからユーザのコンピュータシステムへ履歴情報が転送される。このため、履歴情報提供の利便性に問題がある。例えば、ユーザプログラムの実行時に、ユーザ所望の条件下で、コンピュータ内部の動作を履歴記録部に記録することは困難である。
【0019】
そこで、本実施例では、サービスプロセッサの機能に代えて、ユーザのコンピュータシステムに履歴記録部に蓄積された情報を提供することが可能な技術を例示する。本実施例では、履歴記録部の履歴情報は、安全に、かつ、ユーザのコンピュータの処理と連携して
取得され、ユーザのコンピュータに提供される。ここで、「安全に」とは、例えば、ユーザのコンピュータからコンピュータの障害につながる可能性のあるアクセスがあった場合に、そのようなアクセスを検出し、そのようなアクセスを禁止できる状態をいう。また、「ユーザのコンピュータシステムの処理と連携して取得」とは、例えば、ユーザのコンピュータで、ユーザ指定の処理が実行されたときにコンピュータで発生したイベントを蓄積でき、ユーザに提供できることをいう。すなわち、本実施例では、ユーザのコンピュータがユーザ指定の処理を実行したときに、コンピュータの内部で何が発生したかを示す情報を提供できるようにする。
【0020】
以下、本実施形態では、コンピュータをコンピュータシステムともいう。コンピュータシステムという用語が使用されるときは、特に、複数のプロセッサ、プロセッサ間を結合するバス、メモリ等を含むものが想定されている場合もある。ただし、本実施形態では、コンピュータとコンピュータシステムとが厳密に区別される訳ではない。
【0021】
図1に基づいて、実施例1に係る処理装置を説明する。図1は、処理装置の構成図を示す。図1の処理装置は、プロセッサ部1と、入力部2と、出力部3と、管理部4と、履歴記録部5とを含む。図1の処理装置は、例えば、コンピュータのCPU(Central Processing Unit)、あるいは、CPUを含むコンピュータシステムとして例示される。
【0022】
プロセッサ部1は、ユーザプログラムを実行する。ユーザプログラムは、プロセッサ部1が実行可能な命令コードの列を含む。ユーザプログラムは、例えば、仮想アドレスで指定される仮想アドレス空間に対応するメモリ上の位置に格納される。この場合、メモリには、1または複数階層に渡るキャッシュメモリが含まれてもよい。
【0023】
プロセッサ部1は、ユーザプログラムを実行することで、様々な機能を実現する。その場合に、プロセッサ部1は、メモリ上のユーザプログラムから次に実行すべき命令を読み出し、読み出した命令をデコードして実行し、命令の実行結果をメモリに格納する。
【0024】
履歴記録部5は、処理装置内の様々なイベント、あるいは動作状況を動作履歴として記録する。処理装置内の様々なイベントとは、プロセッサ部1がアクセスしたメモリのアドレス、キャッシュメモリのヒットまたはミスの状況、特定の命令の実行の開始、完了、特定命令の実行回数等を含む。
【0025】
管理部4は、処理装置内の各部の監視、あるいは、各部を診断する診断機能を提供する。例えば、管理部4は、履歴記録部5に、動作履歴の取得の開始、および動作履歴取得の停止を指示する。また、管理部4は、履歴記録部5に、動作履歴の取得の開始、あるいは動作履歴取得の停止の条件を指定する。そのような条件が管理部4により指定された場合、履歴記録部5は指定された条件が満足されたときに、動作履歴の取得を開始し、あるいは停止する。例えば、処理装置内で指定のイベントが発生したときに、履歴記録部5は処理装置内部の動作履歴を取得し、あるいは、取得を停止する。また、履歴記録部5により、管理部4から指定されたイベントの回数が計数される。そして、管理部4から指定されたイベント回数が所定値に達したときに、履歴記録部5による処理装置内部の動作履歴の記録が開始され、あるいは、記録が停止される。このように、管理部4は、履歴記録部5での動作履歴の記録処理を制御する。
【0026】
処理装置には、例えば、サービスプロセッサ100が接続される。サービスプロセッサ100は、管理部4との間でデータを授受するインターフェースを有する。サービスプロセッサ100は、インターフェースを通じて管理部4にコマンドを送り、処理装置内の動作状況の監視、動作履歴の取得の開始、あるいは停止等を管理部4に要求する。サービスプロセッサ100による要求にしたがって、管理部4は、処理装置内の各部の監視、診断
機能、動作履歴の取得等を実行する。そして、管理部4は、監視結果、診断結果、あるいは、動作履歴を、インターフェースを通じてサービスプロセッサ100に引き渡す。サービスプロセッサ100は、管理部4とのインターフェースによって、処理装置の監視、診断機能を実行する。サービスプロセッサ100による監視や診断の機能は、通常、ユーザには開放されない。サービスプロセッサ100の処理では、処理装置の内部がアクセスされるため、サービスプロセッサ100の機能がユーザにそのまま開放されると、処理装置の動作が影響を受ける場合もあるからである。
【0027】
そこで、本実施例の処理装置は、プロセッサ部1から管理部4にアクセスするための入力部2、および処理装置内部で取得された情報を管理部4から受け取る出力部3を有している。管理部4は、入力部2から制御命令を受け取り、受け取った制御命令による要求を受け付け、処理装置内の各部の監視、診断機能、動作履歴の取得等を実行する。この場合、サービスプロセッサ100からの要求とは異なり、プロセッサ部1から受け付け可能な要求が限定できればよい。すなわち、管理部4は、プロセッサ部1からの特定の要求を受け付けなければよい。ここで、特定の要求には、例えば、処理装置の動作への影響が大きいと考えられるものが含まれる。
【0028】
プロセッサ部1が実行する命令には、通常の演算命令のようにプロセッサ部1自身が実行する第1の種類の命令と、入力部2に引き渡される第2の種類の命令が含まれる。入力部2は、第2の種類の命令の中から起動命令と呼ばれる命令を検出する。起動命令は、管理部4で実行される制御命令を管理部4へ引き渡すよう、入力部2に指示する命令である。起動命令には、入力部2に書き込むべき制御命令および制御命令に伴うデータが指定される。
【0029】
入力部2は、管理部4からの起動命令を検出すると、検出した起動命令に指定されている制御命令およびデータを取得する。そして、入力部2は、取得した制御命令とデータとを、管理部4の入力インターフェース4Aに引き渡す。入力部2は、管理部4内のレジスタなどの格納先に制御命令とデータとを格納し、管理部4の処理を起動する。
【0030】
管理部4は、入力部2から制御命令を入力インターフェース4Aで受け取ると、まず、サービスプロセッサ100からの要求による処理が実行中でないことを確認する。サービスプロセッサ100からの要求による処理が実行中である場合、入力部2からの制御命令は実行されない。すなわち、管理部4は、サービスプロセッサ100からの処理を優先する。
【0031】
一方、サービスプロセッサ100から要求された処理が実行中でない場合、管理部4は、入力部2から引き渡された制御命令が、プロセッサ部1からの要求として許容される制御命令か否かを判定する。そして、管理部4は、プロセッサ部1からの要求として許容されない制御命令については、出力インターフェース4Bを介して出力部3にエラーを返す。この場合、出力部3はプロセッサ部1にエラーを報告する。
【0032】
また、管理部4は、プロセッサ部1からの要求として許容される制御命令については、その制御命令にしたがった処理を実行する。例えば、管理部4は、履歴記録部5に動作履歴の取得の開始、あるいは終了を指示し、記録処理を制御する。また、管理部4は、動作状況の監視、動作履歴の取得の開始、あるいは停止等の条件を、制御命令に伴うデータによって指定する。この制御命令に伴うデータは、入力部2を通じてプロセッサ部1で実行されるプログラムから入力されたものである。したがって、プログラムの動作と連係して、処理装置内部のイベント、状態が、履歴記録部5に記録され得る。イベントは、処理装置内部の各装置の動作ということもできる。
【0033】
また、制御命令には、履歴記録部5からの読み出しを指定する命令が含まれる。そのような制御命令によって管理部4に読み出しが指定されると、管理部4は、履歴記録部5に記録された情報を読み出し、出力インターフェース4Bを通じて出力部3に引き渡す。そして、出力部3は、引き渡された履歴記録部5からの情報をプロセッサ部1で実行されるプログラムに引き渡す。
【0034】
以上述べたように、本実施例の処理装置では、プロセッサ部1は、通常の情報処理で実行される第1の種類の命令と、制御命令を管理部4に引き渡す処理を起動するための起動命令を含む第2の種類の命令とを実行可能である。したがって、ユーザがユーザプログラム中に、第1の種類の命令の他に起動命令を含めることで、ユーザは、プロセッサ部1がユーザプログラムを実行中に、ユーザの所望のタイミングで管理部4での監視、診断機能の実行を要求することができる。したがって、例えば、処理装置内がユーザプログラムを実行したときに、所望の性能が達成されないような場合の処理装置内部の状況に関する情報取得手段が提供される。すなわち、ユーザは、管理部4への診断処理を要求する制御命令を指定して、ユーザプログラム中に起動命令を組み込むことができる。コンパイラがソースプログラムをコンパイルするときに、ユーザプログラムに制御命令および起動命令が組み込まれる。このような管理部4宛の制御命令を指定して、起動命令を埋め込んだプログラムを処理装置に実行させることで、ユーザは、ユーザ所望のタイミングで、ユーザプログラム実行中の処理装置の内部状態を取得できる。
【0035】
すなわち、本実施例では、サービスプロセッサ100の機能に代えて、ユーザが利用するコンピュータシステムからの指示に応じて、履歴記録部5が、コンピュータシステムの内部の動作状況を、安全に、かつ、ユーザのコンピュータシステムの処理と連携して採取できる。そして、管理部4が、履歴記録部5で採取された情報をユーザのコンピュータシステムに提供することが可能となる。
【0036】
なお、図1では、入力部2および出力部3が、プロセッサ部1と異なる回路ブロックに設けられている。しかし、本処理装置の構成がこのような構成に限定される訳ではない。例えば、入力部2および出力部3が、プロセッサ部1内に設けられてもよい。
【実施例2】
【0037】
実施例2では、処理装置がキャッシュメモリを含む場合を例にして、性能解析を説明する。本実施例2では、履歴記録部の記録処理を制御し、記録された処理装置の動作履歴をユーザに提供するためのさらに具体的な技術を説明する。
【0038】
<装置の構成>
図2は、本実施例に係る処理装置の構成を例示する図である。図2の処理装置は、例えば、コンピュータのCPU、あるいは、CPUを含むコンピュータシステムである。本実施例では、処理装置は、複数のプロセッサ部1と、プロセッサ部1からのメモリアクセス等の要求を受け取るL2キャッシュ制御部30と、L2キャッシュ制御部30からアクセスされるL2(Level−2)キャッシュデータ部61と、各種のインターフェースとを有する。本実施形態では、複数のプロセッサ部1は、個々に示す場合にはプロセッサ部1−1、1−2、1−N等のように呼ばれる。また、複数のプロセッサ部は、総称してプロセッサ部1と呼ばれる。プロセッサ部1は、プロセッサコア、あるいは、単にコアとも呼ばれる。
【0039】
プロセッサ部1は、命令処理装置11と、演算器12と、L1(Level−1)命令キャッシュ13と、L1オペランドキャッシュ14と、L1キャッシュ制御部20とを有する。
【0040】
命令処理装置11は、L1命令キャッシュ13から取り出した命令をデコードし、デコードした命令の実行を管理する。デコードした命令が演算命令であれば、命令処理装置11は、演算器12を使用して演算する。デコードした命令が演算に使用するオペランドデータのロード命令・ストア命令などであれば、命令処理装置11は、演算器12を使用してオペランドアドレスを計算する。そして、命令処理装置11は、計算したオペランドアドレスをL1オペランドキャッシュ14へと送って、所望のアドレスのデータを読み書きする。
【0041】
L1キャッシュ制御部20は、命令処理装置11から、L1命令キャッシュ13へのフェッチ要求や、L1オペランドキャッシュ14へのロード・ストア要求を受け取る。そして、L1キャッシュ制御部20は、受け取った要求中の仮想アドレスを物理アドレスへとTLB(Translation Lookaside Buffer)を用いて変換する。アドレスの変換とともに、L1キャッシュ制御部20は、キャッシュタグを検索し、所望のアドレスのデータがL1キャッシュ上に存在するかどうかを検査する。以下、L1命令キャッシュ13、L1オペランドキャッシュ14の両方を指していうときには、L1キャッシュという言葉が用いられる。
【0042】
要求されたアドレスのデータがL1キャッシュ上に存在しているとき、その要求が命令フェッチであれば、L1キャッシュ制御部20は、L1命令キャッシュ13から取り出したデータを命令処理装置11へと送る。また、その要求がオペランドフェッチであれば、L1キャッシュ制御部20は、L1オペランドキャッシュ14から取り出したデータを演算器12へと送る。また、その要求がストア要求であれば、L1キャッシュ制御部20は、演算器12からストアデータが届くのを待つ。そして、L1キャッシュ制御部20は、ストアデータが演算器12から届いてストア対象アドレスがL1キャッシュ上に存在しているのを確認した後、命令実行順序にしたがってストアデータをL1オペランドキャッシュへ14と書き込む。このように、L1キャッシュは、処理装置内の階層的なキャッシュの構造中で、プロセッサ部1に最も近い階層のキャッシュメモリをいう。また、L2ャッシュは、L1キャッシュの次の階層に位置するキャッシュメモリをいう。通常、L2キャッシュのデータ転送時間は、L1キャッシュよりも長いが、L2キャッシュの容量は、L1キャッシュよりも大きい。
【0043】
命令フェッチ要求、オペランドのロード要求・ストア要求で使用するアドレスのデータがL1キャッシュ上に存在していないとき、すなわちL1キャッシュミスが発生したとき、L1キャッシュ制御部20は、対象アドレスをL2キャッシュ制御部30へと送る。これにより、L1キャッシュ制御部20は、対象データのL1キャッシュへの転送をL2キャッシュ制御部30に要求する。
【0044】
L2キャッシュ制御部30は、L2キャッシュデータ部61と、他CPUインターフェース62と、メモリインターフェース63と、I/Oインターフェース64と、JTAGインターフェース65へと接続されている。
【0045】
L2キャッシュデータ部61は、データを格納するキャッシュメモリである。他CPUインターフェース62は、図2の処理装置が他の処理装置と通信するためのインターフェースである。メモリインターフェース63は、主記憶装置(物理メモリともいう)との間でデータを授受するためのインターフェースである。I/Oインターフェース64は、入出力装置を処理装置と接続するインターフェースである。入出力装置は、例えば、内蔵外部記憶装置、着脱可能記憶装置、LAN(Local Area Network)基板等である。JTAGインターフェース65は、サービスプロセッサ100と接続するためのインターフェースである。
【0046】
L2キャッシュ制御部30は、L1キャッシュ制御部20から要求されたアドレスがL2キャッシュ上に存在するかどうかを検査する。そして、要求されたアドレスがL2キャッシュ上に存在していれば、L2キャッシュ制御部30は、要求されたデータをL2キャッシュデータ部61から取り出して、L1キャッシュへと転送する。
【0047】
要求されたデータがL2キャッシュ上に存在していないとき、L2キャッシュ制御部30は、要求されたデータを取り出すために、他CPUインターフェース62またはメモリインターフェース63へと要求を送る。そして、L2キャッシュ制御部30は、要求されたアドレスにおいて必要とされるデータを要求先から転送してもらう。さらに、L2キャッシュ制御部30は、受け取ったデータをL2キャッシュデータ部61に書き込むとともに、L1キャッシュへと転送する。
【0048】
また、図2のように、処理装置は、ファイルシステムなどのI/O装置からの要求を受け取るI/Oインターフェース64を備える。I/Oインターフェース64から要求を受け取ると、L2キャッシュ制御部30は、要求されたデータがL2キャッシュ上に存在するかどうかを検査する。そして、要求されたデータがL2キャッシュ上に存在すれば、L2キャッシュ制御部30は、L2キャッシュデータ部61またはL1オペランドキャッシュ14から最新のデータを取り出す。そして、L2キャッシュ制御部30は、I/Oインターフェース64を経由して、取り出したデータをI/O装置へと送り返す。
【0049】
さらに、処理装置は、サービスプロセッサ100から発行されるJTAGコマンドを受け取るJTAGインターフェース65を備える。JTAG(Joint Test Action Group)
コマンドは、CPUなどLSIチップを制御するためのコマンド体系が定義されたコマンドである。JTAGコマンドは、LSIの動作を起動し、あるいは、停止する他、CPU内部のスキャンチェーンや特定のレジスタの読み出しなど、CPUの動作を制御する特殊な処理を実行することができる。JTAGインターフェース65から受け取ったコマンドは、L2キャッシュ制御部30に備えるJTAGコマンド制御部40へと送られる。JTAGコマンド制御部40は、実施例1の管理部4に相当する。JTAGコマンド制御部40は、受け取ったJTAGコマンドをデコードし、実行する。必要があれば、JTAGコマンド制御部40は、JTAGインターフェース65を通じて実行結果をサービスプロセッサ100へ送り返す。
【0050】
また、本実施例では、処理装置は、内部の各装置、例えば、命令処理装置11、L1キャッシュ制御部20、L2キャッシュ制御部30、他CPUインターフェース62、メモリインターフェース63、I/Oインターフェース64等に履歴記録部51−56(図2では「ヒストリRAM」と表記。以下、「ヒストリRAM」という)を備える。ヒストリRAM51−56は、それぞれの装置で実行した処理の履歴を記録する。なお、以下において、ヒストリRAM51−56を総称する場合には、符号を付さずに単に「ヒストリRAM」という。
命令処理装置11が備えるヒストリRAM51は、現在実行中の命令アドレスと仕掛かり中の命令のいくつかを記録する機能を有する。仕掛かり中とは、命令フェッチ後、まだ命令のデコードあるいは命令の実行が完了していない状態をいう。L1キャッシュ制御部20のヒストリRAM52およびL2キャッシュ制御部30のヒストリRAM53は、キャッシュパイプラインの動作状況、キャッシュがヒットしたアドレス、ヒットしたときの要求の種別、キャッシュミスしたアドレス、ミスしたときの要求の種別等を記録する機能を有する。他CPUインターフェース62のヒストリRAM54、メモリインターフェース63のヒストリRAM55、I/Oインターフェース64のヒストリRAM56は、それぞれのインターフェースに届いた要求を記録する機能を有する。
【0051】
また、ヒストリRAM51−56等を制御するヒストリ制御部が、それぞれのヒストリ
RAM51−56に付随して設けられている。ヒストリ制御部として、図6のヒストリ制御部51Aが例示される。ヒストリ制御部は、JTAGコマンド制御部40からの指示にしたがって、ヒストリRAM51−56に蓄積する履歴情報を複数種類の情報の中から選択できる。ヒストリ制御部は、RAM読み書き論理ユニットとも呼ばれる。ヒストリ制御部は、JTAGコマンド制御部40からの要求に応じて、記録する履歴情報を選択し、あるいは、記録するタイミングを指定し、履歴情報をヒストリRAMに記録することができる。なお、「履歴情報の記録」は、以下「記憶」あるいは「採取」とも称する。ヒストリ制御部は、履歴制御部に相当する。
【0052】
命令処理装置11およびJTAGコマンド制御部40は、履歴記録の開始・停止・読み出し・記録の再開を指示する機能、および採取対象の履歴情報の選択機能を備える。命令処理装置11およびJTAGコマンド制御部40は、ヒストリ制御部のレジスタに、履歴記録の開始・停止・読み出し・記録の再開、各種処理再開のタイミング、および採取対象の履歴情報を指示する。これにより、命令処理装置11およびJTAGコマンド制御部40は、処理装置内のそれぞれの装置で発生した事象の履歴情報を、指定の条件で採取することができる。ヒストリ記録の停止・再開は通常、JTAGコマンド制御部40がJTAGコマンドでヒストリ制御部に指示する。ただし、特殊な用途として、命令処理装置11が履歴記録の停止または再開をヒストリ制御部に指示することもできる。
【0053】
<コマンドインターフェース>
本実施例の処理装置では、JTAGコマンドのうち、ヒストリ操作に関わるコマンドがユーザに開放される。ここで、ヒストリ操作としては、例えば、ヒストリ記録の開始・停止・読み出し・記録の再開・履歴情報の選択機能が例示できる。そのような装置を実現するため、処理装置は、プロセッサ部1が実行する命令から、ヒストリ操作に関わるコマンドをJTAGコマンド制御40に引き渡すインターフェースを有する。以下では、処理装置として、SPARC(登録商標)チップを例に説明する。
【0054】
SPARC−V9命令セットは、ASI(Address Space Identifier)コマンドと呼ばれる命令体系を備えている。ASIコマンドは、通常のロード・ストア命令に付随する情報として、8ビットのASI空間番号と呼ばれるIDを指示する手段を備える。ASI空間番号は、ロード・ストア命令が参照するアドレス空間、例えば、プライマリ・アドレス空間、セカンダリ・アドレス空間、ニュークリアス・アドレス空間等を指定する。ASIコマンドが入力、すなわちフェッチされると、入力されたASIコマンドのオペランドに指定された仮想アドレスは、TLBにより物理アドレスに変換される。すなわち、L1キャッシュ制御部20などのプロセッサ部1は、ASI空間番号で指定されたアドレス空間に定義された仮想アドレスと物理アドレスとの対に対応する情報をTLBから取り出す。そして、プロセッサ部1は、ASIコマンドのオペランドに指定された仮想アドレスを物理アドレスに変換する。
【0055】
ASI空間番号は8ビットのIDであるため、論理的には256個の異なるアドレス空間を指示することが可能である。しかし、実際には、256ものアドレス空間は定義されておらず、アドレス空間番号には、割り付けが未定義の番号も存在する。割り付けされていないASI空間番号は、既存のASI空間以外の用途のために、新たな別の空間の定義に使用されることがある。ASI空間番号の新たな定義によって、ASI空間番号は、例えば、仮想アドレスそのものを物理アドレスとして扱うアドレス変換動作を指示するために使用される。また、ASI空間番号は、処理装置内の制御レジスタを読み書きすることに使用されている。
【0056】
さらに、処理装置内の制御レジスタのいくつかは、予め特定のASI空間番号を指示することによって、そのレジスタの値が読み出され、または、書き換えられる。すなわち、
処理装置にはそのようなASI空間が定義されている。また、処理装置内の制御レジスタが読み書きされる場合には、制御レジスタの読み書きに使用される仮想アドレスの下位8ビット中の一部、例えば5ビットが使用される。そして、1つのASI空間番号に対して、32種類のレジスタのいずれか1つが選択されるようにしてもよい。このようにして、レジスタアクセスの実行対象が拡張され得る。
【0057】
以上のように、ASIコマンドにより、所望の空間を使用して仮想アドレスから物理アドレスへとアドレスを変換することや、処理装置内のレジスタの読み書きを実施することができるように、ASIコマンドの体系が定義されている。
【0058】
図3A、図3Bに、ASIコマンドのデータパターン例を示す。図3Aは、ASI空間直接指定コマンドの例である。図3Aのコマンド例では、先頭2ビット('11'固定)と、OP3(ビット24:19)がオペレーションコードを指定する。オペレーションコードには
、ロード命令とストア命令とを識別するコードが指定される。Register Destination(ビット29:25)には、ロードまたはストアされるデータを保持するプロセッサ部1のレジス
タが指定される。RS1(ビット18:14)とRS2(ビット4:0)とによって、メモリの仮想アドレスが指定される。例えば、RS1がベースアドレスであり、RS2がディスプレースメントアドレスである。I=0(ビット13)は、ASI空間番号を直接指定するコマンドであることを示す。直接指定では、レジスタを介さずに、コマンドのオペランド中に、ASI空間番号が指定される。すなわち、データパターン中のIMM_ASI(ビット12:5)に、ASI空間番号が指定される。
【0059】
図3Bは、ASI空間間接指定コマンドの例である。図3Bのコマンド例は、I=1(ビット13)によって、ASI空間を間接的に指定するASI空間間接指定コマンドであることを示している。間接指定では、ASI空間番号が、所定のレジスタ(ASIレジスタと呼ぶレジスタ)に設定される。このとき、RS1(ビット18:14)およびSIMM13
(ビット12:0)によって、メモリの仮想アドレスが指定される。
【0060】
本実施例の処理装置では、ASI空間番号が新たに1つ定義されている。そして、ASI空間番号で指定されるASI空間において、2つの仮想アドレスが割り当てられる。なお、ASI空間番号で指定されるASI空間は、第1のアドレス空間に相当する。新ASI空間番号と仮想アドレスの対において、サービスプロセッサ100から発行されるJTAGコマンドに準拠したコマンド(以下、単にJTAGコマンドという)を受け付けるインターフェースが設けられる。すなわち、処理装置では、ユーザプログラムは、プロセッサ部1で実行されるプログラム中からインターフェースにJTAGコマンドを発行できる。本実施例では、新ASI空間番号で指定されるASI空間以外のアドレス空間が、第2のアドレス空間に相当する。
【0061】
その結果、新ASI空間番号と仮想アドレスの対を指定したASIコマンドをプロセッサ部1が実行すると、ASI空間内の指定の仮想アドレスの内容が、JTAGコマンドとして、JTAGコマンド制御部40に引き渡される。すなわち、ASIコマンド経由のJTAGコマンドが新たに定義される。ASIコマンド経由のJTAGコマンドの機能の一部として、ヒストリ操作が実行可能とされる。
【0062】
本実施例では、新しく割り当てられたASIコマンドは、『ASI_CMD_ACCESS_REG』、『ASI_CMD_RECEIVE_REG』と呼ばれる。『ASI_CMD_ACCESS_REG』は、JTAGコマンドを発行する命令である。また、『ASI_CMD_RECEIVE_REG』は、排他制御の処理のため、および、JTAGコマンドの結果を読み出すための命令である。
【0063】
『ASI_CMD_ACCESS_REG』は書き込み専用のコマンドであり、書き込みに伴う64ビットデータのデータパターンは次のように定義される。すなわち、新たに定義されたASI空間の第1のアドレスには、以下のデータパターンが定義される。なお、以下の説明で、data[ ]という記述は、ビットパターン中のビット位置を示す。この場
合、ビットの並び順を意識してビットパターンが定義されることもある。しかし、本実施形態では、ビットの並び順は明確には区別しない。例えば、data[62:56]という記述は、
ビット62からビット52のビットパターンということを意味する。
【0064】
data[63]=LOCK :LOCKは、JTAGコマンドの実行を要求する複数のプロセッサ部1
間の競合を回避するための排他制御時の指定である。
【0065】
data[62:56]=LOCK_ID[0:6] :LOCK_IDは、排他制御を要求するプロセッサ部1を特定
する情報である。
【0066】
data[55:48]=JIR[0:7] : JIRは、JTAGコマンドのコードである。
【0067】
data[47:36]=JSEL[0:11] : JSELは、プロセッサ部1のいずれか、あるいは、処理装置
内の装置(COREn/UNITm)を選択する選択情報である。例えば、JTAGコマンドによっ
て、ヒストリ記録を蓄積する対象のプロセッサ部1が指定される。
【0068】
data[35:32]=reserve(all="0"):これらのビットは、本実施例では未使用であるものとする。
【0069】
data[31:00]=JDR[0:31] : JTAGコマンドへの引数である。なお、本明細書中では、『ASI_CMD_ACCESS_REG』コマンドのデータパターンは、asi_cmd_access_reg.LOCK、asi_cmd_access_reg.LOCK_ID、asi_cmd_access_reg.JIR、asi_cmd_access_reg.JSEL、asi_cmd_access_reg.JDRのように記述する。また、これらを省略して、データパターンの各部が単に、acc.LOCKのように記述される場合もある。
【0070】
『ASI_CMD_RECEIVE_REG』は読み出し専用のコマンドであり、読み出しに伴う64ビットデータのデータパターンは次のように定義される。すなわち、新たに定義されたASI空間の第2のアドレスには、以下のデータパターンが定義される。
【0071】
data[63]=LOCK:このビットには、排他制御の結果、JTAGコマンドの実行権を取得
できたか否かが示される。
【0072】
data[62:56]=LOCK_ID[6:0]:このビットパターンには、排他制御の結果、JTAGコマンドの実行権を取得したプロセッサが示される。
【0073】
data[55:54]=BUSY/NACK:BUSYは、JTAGコマンド実行中であることを示す。また、NACKは、JTAGコマンドが実行できなかったことを示す。また、この値がNACK(例えば
、data[55:54]="01")のとき、エラーコードが、data[31:28](すなわち、下記JDR[0:3]
)に設定される。このとき、data[31:28]に設定される値は、NACK_code[3:0]として、図
4に記述される。
【0074】
図4は、data[55:54]=NACK(例えば、"01")が返されたときのNACK_codeの定義を例示
する表である。図4に示す表の各行は、NACK_code[3:0]の値、値の内容の説明、および備考の説明を含む。NACK_code[3:0]=0は、サービスプロセッサ100がJTAGコマンド
制御部40を使用中、言い換えればJTAGコマンドを実行中であることを示す。data[55:54]=NACKとともに、NACK_code[3:0]=0が返されたときには、プロセッサ部1で実行さ
れるユーザプログラムは、NACK_code[3:0]=0が返される前に書き込んだ『ASI_CM
D_ACCESS_REG』コマンドでリトライする。
【0075】
また、NACK_code[3:0]=1は、ASIコマンドからのJTAGコマンド実行禁止を意味
する。この値は、例えば、ASIコマンドからのJTAGコマンド実行要求があったが、JTAGコマンドの実行が許可されていない状態、あるいは実行を許可されていないユーザが検知されたことを示す。
【0076】
また、NACK_code[3:0]=2は、ASIコマンドで指定したJIR[0:7]、すなわちJTAG
コマンドが実行禁止であったことを意味する。これは、例えば、ユーザに許可されていないJTAGコマンドをJIR[0:7]に指定して『ASI_CMD_ACCESS_REG』コマンドが書き込まれたことを示す。これは、通常、ユーザプログラムの欠陥(bug)が原
因である。
【0077】
また、NACK_code[3:0]=3は、BUSY状態で新たなJTAGコマンドが起動要求されたこ
とを示す。ここで、BUSY状態は、新たに起動要求される前のJTAGコマンド、例えば、他のプロセッサ部1によるJTAGコマンドの実行がまだ完了していない状態をいう。これは、通常、ユーザプログラムの欠陥(bug)が原因である。
【0078】
また、NACK_code[3:0]=fは、ハードエラーが検知されたことを意味する。さらに、以
上説明した値以外の値(NACK_code[3:0]=4〜e)は、本実施例では未使用であるものとす
る。
【0079】
以下、さらに、読み出しに伴う64ビットデータのデータパターンの説明が継続される。
【0080】
data[53:48]=reserve(all="0")
data[47:40]=reserve(all="0")
data[39:32]=reserve(all="0")
data[31:00]=JDR[0:31] : このビットは、JTAGコマンドの返り値である。なお、本明細書中では、『ASI_CMD_RECEIVE_REG』コマンドのデータパターンは、asi_cmd_receive_reg.LOCK、asi_cmd_receive_reg.LOCK_ID、asi_cmd_receive_reg.BUSY/NACK、asi_cmd_receive_reg.JDR、asi_cmd_receive_reg.NACK_codeのように記述される。また、『ASI_CMD_RECEIVE_REG』コマンドのデータパターンが省略されて、データパターンの各部が単にrcv.LOCK、rcv.LOCK_ID、rcv.BUSY/NACK、rcv.JDR、rcv.NACK_codeのように記述される場合もある。
【0081】
さらに、処理装置は、サービスプロセッサ100経由のJTAGコマンドとASIコマンド経由のJTAGコマンドの競合を回避する機能を有する。すなわち、処理装置は、JTAGコマンド実行前にASIコマンド経由のJTAGコマンドの実行を禁止した状態で、サービスプロセッサ100経由のJTAGコマンドを実行する。このため、処理装置は、JTAGコマンドの排他制御を行うためのレジスタ『JTAG_LOCK_SP_REG』を用意する。レジスタ『JTAG_LOCK_SP_REG』は1ビットのLOCKビットを保持するレジスタである。
【0082】
data[00]=LOCK:このビットは、サービスプロセッサ100によって、JTAGコマン
ドの発行がロック中であるか否かを示すビットである。
【0083】
図5は、上記2つのASIコマンド経由のJTAGコマンドが各処理部へと受け渡され
る経路の構成を説明する図である。
【0084】
命令処理装置11から発行されたASIコマンドは、L1キャッシュ制御部20へと送られる。ASIコマンドには、命令、ASI番号および仮想アドレスが含まれる。なお、ASIコマンドが書き込み命令であれば、そのASIコマンドで使用する書き込みデータも、演算器12からL1キャッシュ制御部20のストアデータ部22へと送られる。
【0085】
図5のように、L1キャッシュ制御部20は、L2−ASI命令検出部21、ストアデータ部22、およびロードデータ部23を有している。L1キャッシュ制御部20のL2−ASI命令検出部21は、受け取ったASIコマンドのASI空間番号と仮想アドレスの下位8ビットの内5ビットを確認する。そして、L2−ASI命令検出部21は、そのASIコマンドがL2キャッシュ制御部30で実行すべきASIコマンド(以下、L2−ASIコマンドと呼ぶ)であることを確認した場合には、ASIコマンドをL2キャッシュ制御部30へと転送する。なお、ASIコマンドはASI命令の他、ASI番号、およびアドレス[40:3]を含む。ASIコマンドの転送では、ASIコマンドとともに、そのASIコマンドのASI番号と仮想アドレスの下位8ビットの内5ビットも転送される。なお、図5で、アドレス[40:3]とあるのは、処理装置が用意しているデータパターン中の仮想アドレスを引き渡す領域である。本実施例では、この領域、つまりアドレス[40:3]のうち、例えば、5ビット(アドレス[7:3])が使用される。
【0086】
また、ASIコマンドが書き込み命令であれば、ストアデータ部22は、演算器12から受け取っていたストアデータ(data[63:0])をL2キャッシュ制御部30へと送る。したがって、ストアデータ部22は、書き込みバッファとして機能する。なお、L1キャッシュ制御部20のロードデータ部23は、逆に、JTAGコマンド制御部40およびL2キャッシュ制御部30を通じて、読み出された履歴情報を出力するバッファである。
【0087】
L2キャッシュ制御部30は、ASI命令解釈部31、ストアデータ部32、およびコマンド完了通知部およびロードデータ部33を有する。L2キャッシュ制御部30内のASI命令解釈部31は、L1キャッシュ制御部20から発行されたASIコマンドを受け取る。受け取ったASIコマンドがJTAGコマンドを発行する命令である場合は、ASI命令解釈部31は、JTAGコマンド制御部40に対して、『ASI_CMD_ACCESS_REG』または『ASI_CMD_RECEIVE_REG』の実行を要求する。ここで、ASIコマンドがJTAGコマンドを発行する命令か否かは、ASI空間番号で判定される。また、『ASI_CMD_ACCESS_REG』または『ASI_CMD_RECEIVE_REG』のいずれが指定されているかは、アドレス[7:3]で判定さ
れる。
【0088】
このとき要求された動作が『ASI_CMD_ACCESS_REG』であった場合には、ストアデータ部32が、要求に付随してdata[63:0]をJTAGコマンド制御部40に送る。すなわち、L2キャッシュ制御部30は、data[63:0]により、どのようなJTAGコマンドの実行を要求するのかJTAGコマンド制御部40に指示する。ASI命令解釈部31は、実施例1に示した入力部2の他の例である。
【0089】
JTAGコマンド制御部40は、JTAGコマンド可否検証部41,JTAGコマンド実行部42、およびロードデータ部43を有する。
【0090】
JTAGコマンド制御部40のJTAGコマンド実行可否検証部41は、受け取ったJTAGコマンドが『ASI_CMD_ACCESS_REG』による書き込み要求であれば、書き込み保護制御回路により書き込み許可が与えられているかを確認する。書き込み許可が与えられていない場合とは、例えば、ASIコマンド経由での実行が許容されない
JTAGコマンド等が書き込まれた場合である。そして、書き込み許可が与えられていれば、JTAGコマンド実行可否検証部41は、『ASI_CMD_ACCESS_REG』コマンドを受け付けるレジスタCMD_ACC(図6参照)の値を更新する。そして、JTAGコマンド実行部42が、書き込まれたJTAGコマンドを実行する。
JTAGコマンド実行部42は、書き込まれたJTAGコマンドに応じて、該当する信号、つまり制御コマンドを処理装置内の各部に送る。例えば、JTAGコマンド実行部42は、ヒストリRAM51−56のヒストリ制御部へ記録開始を指示する。このような指示に対する応答として、例えば、ヒストリRAM51−56のヒストリ制御部からコマンド完了通知が返される。コマンド完了通知によって、JTAGコマンド実行部42は、コマンドの実行を完了する。なお、レジスタCMD_ACCは、例えば、JTAGコマンド制御部40内のレジスタであり(図6参照)、ASI_CMD_ACCESS_REG』コマンドが書き込まれる。
【0091】
一方、書き込み許可が与えられていない場合は、JTAGコマンド制御部40は、レジスタCMD_ACCを更新せずに、JTAGコマンドの実行を完了する。このとき、NACKおよびNACK_codeによって、エラーがL2キャッシュ制御部30、L1キャッシュ制御部
20を経由して、演算器12に返される。
【0092】
指示されたJTAGコマンドが『ASI_CMD_RECEIVE_REG』による読み出し要求である場合、JTAGコマンド制御部40は、『ASI_CMD_RECEIVE_REG』コマンドに対応するレジスタのデータフォーマットにしたがって、読み出した値(data[31:0]すなわち、JDR[0:31])をL2キャッシュ制御部30へ出力する。す
ると、L2キャッシュ制御部30は、さらに、JDR[0:31]を、L1キャッシュ制御部20
を経由して、演算器12へと送り返す。より具体的には、JTAGコマンド制御部40のロードデータ部43が、読み出した値(JDR[0:31])をL2キャッシュ制御部30のコマ
ンド完了通知およびロードデータ部33に引き渡す。さらに、コマンド完了通知およびロードデータ部33は、引き渡された値(JDR[0:31])をL1キャッシュ制御部20のロー
ドデータ部23に転送する。コマンド完了通知およびロードデータ部33は、実施例1で示した出力部3の他の例である。
【0093】
上述のように、本実施例では、新たなASI空間にアクセスするL2−ASIコマンドによって、JTAGコマンド制御部40へのインターフェースが定義される。L2−ASIコマンドは、処理装置で実行されるユーザプログラムとJTAGコマンド制御部40とのインターフェースに利用される命令として好適である。例えば、通常のロード/ストア命令のようなキャッシュメモリ、例えば、L1オペランドキャッシュ14等を経由してメモリにアクセスする命令では、読み書きされるデータがキャッシュに保持される場合があり、メモリに保持されるとは限らないからである。これに対して、上記構成では、L2−ASI命令検出部21がL2−ASIコマンドを検出し、L2キャッシュ制御部30のASI命令解釈部31に送出する。また、ASI命令解釈部31は、『ASI_CMD_ACCESS_REG』コマンドおよび『ASI_CMD_RECEIVE_REG』コマンドを検出し、JTAGコマンド制御部40に書き込むことができる。
【0094】
JTAGコマンド制御部40は、『ASI_CMD_ACCESS_REG』コマンドおよび『ASI_CMD_RECEIVE_REG』コマンドのデータパターンを受け取るためのレジスタを有する。そこで、以下では、コマンドのデータパターンを明示的に示す場合は、これらのデータは、コマンドデータasi_cmd_receive_reg.LOCKあるいはコマンドデータrcv.LOCKのように呼ぶ。一方、レジスタであることを明示する場合には、これらのレジスタは、レジスタasi_cmd_receive_reg.LOCKあるいはレジスタrcv.LOCKのように呼ぶ。他のデータパターンについても同様である。
【0095】
図6に、JTAGコマンド制御部40の詳細構成を例示する。図6のように、JTAGコマンド制御部40は、『ASI_CMD_ACCESS_REG』コマンドを受け付けるレジスタCMD_ACC、『ASI_CMD_RECEIVE_REG』コマンドを受け付けるレジスタCMD_RCV、および『ASI_CMD_ACCESS_REG』が書き込んだASI空間のデータを受け付けるレジスタACC_DATA[63:0]を有している。これらのレジスタCMD_ACC、CMD_RCV、およびACC_DATA[63:0]は、実施例1の入力インターフェースに相当する。
【0096】
これらのレジスタに書き込まれたコマンドおよびデータパターンは、JTAGコマンド制御部40の論理回路によって、それぞれ該当するレジスタに書き込まれる。以下、JTAGコマンド制御部40内のレジスタを説明する。
【0097】
JTAGコマンド制御部40内のJTAGコマンド実行可否検証部41は、レジスタJTAG_LOCK_SP_REG、レジスタrcv.LOCK、レジスタrcv.LOCK_ID、レジスタrcv.BUSY、レジスタrcv.NACK_codeおよびレジスタrcv.JIRを有している。あるいは、JTAGコマンド実行可否検証部41は、これらのレジスタを参照可能である。
【0098】
レジスタJTAG_LOCK_SP_REGは、サービスプロセッサ100による排他制御のためのフラグを格納する。レジスタrcv.LOCK、およびレジスタrcv.LOCK_IDは、複数のプロセッサ1間の排他制御のためのフラグを格納する。レジスタrcv.BUSYは、現在、JTAGコマンドが実行中か否かを示すフラグを格納する。レジスタrcv.NACK_codeには、受け付けたJTAGコマンドに対するエラーコードが設定される。
【0099】
レジスタJIRは、JTAGコマンド実行部可否検証部41とJTAGコマンド実行部42とに共有され、JTAGコマンドのコードが格納される。JTAGコマンド実行部42は、さらに、レジスタJSELおよびJDRを有する。レジスタJSELは、ヒストリ記録を蓄積する対象であるプロセッサ部1や装置を特定する情報を格納する。レジスタJDRは、JTAGコマンドへの引数を格納する。JTAGコマンド実行部42は、これらのレジスタの指定値にしたがって、対象として指定されたプロセッサ部1、あるいは装置のヒストリ制御部へ指示を送る。ヒストリ制御部に送られる指示には、動作履歴の採取条件、採取の指示、動作履歴の読み出しの指示が含まれる。図6では、ヒストリRAM51と、ヒストリRAM51を制御するヒストリ制御部51Aが例示されている。
【0100】
ロードデータ部43は、レジスタJDRを有しており、ヒストリRAM51−56から読み出された情報を格納する。『ASI_CMD_RECEIVE_REG』コマンドが実行されると、レジスタJDRのデータが、L2キャッシュ制御部30のコマンド完了通知およびロードデータ部33に引き渡される。ロードデータ部43は、実施例1の出力インターフェースに相当する。
【0101】
<コマンドの発行手順>
次にASIコマンドによるJTAGコマンドの発行手順を説明する。本実施例の処理装置は、ユーザプログラムからJTAGコマンドを実行する手段として、この手順を含むユーザプログラムを実行する。以下の説明の中で、各種排他制御のための手順が現れる。排他制御が行われるのは、JTAGコマンドの発行元が、サービスプロセッサ100および処理装置の複数のプロセッサ部1(コア)となり得るからである。すなわち、複数の発行元が同時にJTAGコマンドを発行したとき、排他制御により、単一の発行元からのJTAGコマンド要求が実行され、それ以外の発行元からの要求が待たされる。このようにして、JTAGコマンドを複数同時に実行することによる誤動作が回避される。
【0102】
また、説明の簡略化のために、『ASI_CMD_RECEIVE_REG』命令の発行、『ASI_CMD_ACCESS_REG』命令の発行という用語を用いる。『ASI_CMD_RECEIVE_REG』命令の発行は、『ASI_CMD_RECEIVE_REG』に対応するASI空間番号と仮想アドレスの下位8ビットの内の5ビットを指示してASIコマンドのロード命令を発行することに対応する。ロード命令により、相手デバイス、この例ではL2キャッシュ制御部からプロセッサ部1に、L1キャッシュ制御部20のロードデータ部23を通じてデータが引き渡される。
【0103】
また、『ASI_CMD_ACCESS_REG』命令の発行は、『ASI_CMD_ACCESS_REG』に対応するASI空間番号と仮想アドレスの下位8ビットの内の5ビットを指示してASIコマンドのストア命令を発行することに対応する。ストア命令により、プロセッサ部1の演算器12からL1キャッシュ制御部20のストアデータ部22を通じて、相手デバイスであるL2キャッシュ制御部に、データが引き渡される。これらの操作は、それぞれ、『ASI_CMD_RECEIVE_REG』命令、『ASI_CMD_ACCESS_REG』命令を、ユーザプログラムから実行する操作に対応する。例えば、プロセッサ部1が実行するプログラムのコンパイラが、以下のコマンド発行手順を実行可能形式のバイナリプログラム中に設定する。図7および図8に、コマンド発行手順のフローチャートを例示する。図7と図8は、符号(N1)で接続される。
【0104】
(処理1)まず、プロセッサ部1(例えば、プロセッサ部1−1)は、『ASI_CMD_RECEIVE_REG』命令を発行し、asi_cmd_receive_reg.LOCKビットを読み出し(F1)、読み出した値が"0"であることを確認する(F2)。読み出した値が"0"であれば、ASIコマンド経由のJTAGコマンドの実行が可能である。したがって、プロセッサ部1は、処理2のF3の手順に移ってJTAGコマンドを発行する。一方、読み出した値が"0"でなければ、プロセッサ部1−2等の他のプロセッサ部、またはサービスプロ
セッサ100がJTAGコマンドを実行中である。したがって、読み出した値が"0"でな
い場合には、プロセッサ部1は、他のプロセッサ部、またはサービスプロセッサ100によるJTAGコマンドの完了を待つ。そして、他のプロセッサ部あるいはサービスプロセッサ100によるJTAGコマンドの完了後に、プロセッサ部1は、JTAGコマンドを発行する。そのために、プロセッサ部1は、読み出した値が"0"になるまで所定の間隔を
置いて、『ASI_CMD_RECEIVE_REG』命令の発行を繰り返す。『ASI_CMD_RECEIVE_REG』命令発行が繰り返される場合には、プロセッサ部1は、asi_cmd_receive_reg.LOCKビットを繰り返して読み出す。そして、asi_cmd_recive_reg.LOCKビットが"0"になると、プロセッサ部1は、処理2のF3の手順に移る。
【0105】
(処理2)プロセッサ部1は、『ASI_CMD_ACCESS_REG』命令を発行する(F3)。このとき、プロセッサ部1は、asi_cmd_access_reg.LOCK="1"および、asi_cmd_access_reg.LOCK_IDに、プロセッサ部1ごとに異なるユニークな番号であるLOCK_IDを指示する。また、プロセッサ部1は、実行するJTAGコマンドをasi_cmd_access_reg.JDRに指示する。ただし、プロセッサ部1は、LOCK_IDに使用するユニークな番号には0
x7fを使用しない。後述するように、0x7fの番号は特別な役割を有している。したがって、プロセッサ部1が番号0x7fをコアごとのユニークな番号として使用すると、正しくLOCKが取得できなくなって誤動作が引き起こされる。
【0106】
(処理3)プロセッサ部1は、『ASI_CMD_RECEIVE_REG』命令を発行する(F4)。そして、プロセッサ部1は、asi_cmd_receive_reg.LOCK="1"であること(F5)、かつasi_cmd_recieve_reg.LOCK_IDが処理2のF3で指定したasi_cmd_access_reg.LOCK_IDと一致していることを確認する(F6)。この2つの条件が満たされている
とき、F3で発行された『ASI_CMD_ACCESS_REG』によって、プロセッ
サ部1は、排他制御を経て実行権を獲得する。したがって、プロセッサ部1によりJTAGコマンドが実行されることになる。この2つの条件が満たされた場合、つまりF5,F6がともにYESの場合には、プロセッサ部1は、制御を処理4のF7へ進める。一方、上記2つの条件のいずれかが満たされていないときは、処理2のF3で発行した『ASI_CMD_ACCESS_REG』の実行による実行権の獲得が失敗し、命令が実行されなかったことを意味する。命令が実行されなかったときは、プロセッサ部1は処理1のF1に制御を戻す。
【0107】
(処理4)プロセッサ部1は、『ASI_CMD_RECEIVE_REG』命令を発行する(図8のF7)。そして、プロセッサ部1は、asi_cmd_receive_reg.BUSY="0"であることを確認してから(F8でYESの場合)、処理5のF14に進む。asi_cmd_receive_reg.BUSY="1"であれば(F8でNOの場合)、処理2のF3で発行したJTAGコマンドをJTAGコマンド制御部40がまだ実行中であることを意味する。この場合には、プロセッサ部1は再度『ASI_CMD_RECEIVE_REG』命令を発行し、asi_cmd_receive_reg.BUSY="0"になるまでF7を繰り返す。
【0108】
(処理5)プロセッサ部1は、asi_cmd_receive_reg.NACKの値を判定する(F9)。そして、asi_cmd_receive_reg.NACK="1"のとき、プロセッサ部1は、asi_cmd_receive_reg.NACK_codeの値を判定する(F10)。asi_cmd_receive_reg.NACK="1"かつNACK_code=0x0以外のときは、これらの値は、ソフトウェアのバグが検出されたことを示す(F11)。この場合には、ソフトウェアの修正が必要である。
【0109】
一方、asi_cmd_receive_reg.NACK="1"かつNACK_code=0x0のときは、これらの値は、サ
ービスプロセッサ100からのJTAGコマンドに排他制御権を奪われたため、ASIコマンドからのJTAGコマンドが実行されなかったことを意味する。この場合には、プロセッサ部1は、処理2のF3で発行したJTAGコマンドを再度発行する(F12)。ただし、このとき、ASIコマンド間の排他制御は取得済みである。そこで、ロック獲得済みのプロセッサ部1から2回目以降のASIコマンドによるJTAGコマンドを発行したことを示すために、プロセッサ部1は、asi_cmd_access_reg.LOCK_IDに0x7fの値を使用する。そして、プロセッサ部1は、asi_cmd_access_reg.LOCK="1"で『ASI_CMD_ACC
ESS_REG』命令を発行して(F13)、処理4のF7に戻る。asi_cmd_receive_reg.NACK="0"であるときは、ASIコマンドによるJTAGコマンドが無事終了したことを意味するので、プロセッサ部1は、次の処理6に移る。
【0110】
(処理6)JTAGコマンドにはSENSEコマンドとLOADコマンドがある。SENSEコマンドは処理装置の状態を読み出すコマンドである。処理装置の状態読み取り動作をJTAG−SENSE動作という。ASIコマンドから発行されたJTAGコマンドがSENSEコマンドであった場合は(F14でYESの場合)、プロセッサ部1は、asi_cmd_receive_reg.JDRの値を読み取る(F15)。この読み取りにより、プロセッサ部
1は、ASIコマンドによるJTAG−SENSE動作を完了する。
一方、LOADコマンドは処理装置の状態を書き換える、もしくは処理装置に何らかの動作を行うことを指示するコマンドである。処理装置状態の書き換え、あるいは、処理装置への指示動作をJTAG−LOAD動作という。ASIコマンドから発行されたJTAGコマンドがLOADコマンドであった場合には(F14でNOの場合)、LOADコマンドが処理装置の状態を書き換えた段階で、JTAG−LOAD動作が完了する。例えば、F9の正常終了の判定によって、JTAG−LOAD動作の完了が確認される。
【0111】
(処理7)1つのプロセッサ部1から連続して複数のASIコマンドによるJTAGコマンドを実行する場合には(F16でYESの場合)、プロセッサ部1は、asi_cmd_access_reg.LOCK_IDに0x7fの値を使用する。そして、プロセッサ部1は、asi_cmd_access_reg
.LOCK="1"で『ASI_CMD_ACCESS_REG』命令を発行し(F17、F13
)、手順4のF7に制御を戻す。一方、1つのプロセッサ部1から単発のASIコマンドによるJTAGコマンドを発行する場合、および複数のASIコマンドによるJTAGコマンドのうちの最後のASIコマンドによるJTAGコマンドを発行する場合は、処理6(すなわち、F14、F15)まででJTAGコマンド処理が完了している。そこで、プロセッサ部1は、asi_cmd_access_reg.LOCK="0"で『ASI_CMD_ACCESS_R
EG』命令を発行する。この命令により、プロセッサ部1は、ASIコマンドによるJTAGコマンドの排他制御権を開放し、一連のJTAGコマンド処理を終了する(F18)。
【0112】
以上の手順で、ASIコマンドによるJTAGコマンドが実行される。どのJTAGコマンドを実行するかは、『ASI_CMD_ACCESS_REG』命令を発行するときにasi_cmd_access_reg.JIRで指示しており、JTAGコマンド制御部40のJTAGコマンド実行可否検証部41はこのJIRの値を見てASIコマンドからの実行を許可するかどうか判断する。JTAGコマンド制御部40が実行許可の判断をすることで、ユーザに開放するJTAGコマンドが制限され得る。例えば、JTAGコマンド実行可否検証部41が参照可能なメモリに、ユーザに開放するJTAGコマンドのコード一覧を記述したテーブルを格納しておけばよい。また、JTAGコマンド実行可否検証部41が参照可能なメモリに、ユーザに開放しないJTAGコマンドのコード一覧を記述したテーブルを格納しておけばよい。JTAGコマンド実行可否検証部41は、ユーザに開放するJTAGコマンドのコード一覧をメモリから参照して、JIRの値で指定されたJTAGコマンドが、ASIコマンドからの実行が許可されたJTAGコマンドか否かを判定すればよい。また、JTAGコマンド実行可否検証部41は、ユーザに開放しないJTAGコマンドのコード一覧をメモリから参照して、JIRの値で指定されたJTAGコマンドが、ASIコマンドからの実行が許可されたJTAGコマンドか否かを判定してもよい。
【0113】
また、OPSR(Operation Status Register)と呼ばれるハードウェアの動作設定を定義するレジスタに値を設定することによって、ユーザへのJTAGコマンドの開放が禁止できる。また、ハードウェア開発者によるデバッグのため、さらに多くの、場合によってはすべてのJTAGコマンドがASIコマンド経由で開放されてもよい。例えば、ハードウェア開発者によるデバッグ時に、JTAGコマンド制御部40は、JTAGコマンド実行可否検証部4を起動しないように制御することで、すべてのJTAGコマンドをユーザに開放してもよい。また、ASIコマンド経由のJIRで受け付けたすべてのJTAGコマンドをユーザへの開放を指示するフラグを有するレジスタをJTAGコマンド制御部40に設けてもよい。そして、ハードウェア開発者によるデバッグ時に、外部からJTAGコマンド制御部40に対して、すべてのJTAGコマンドの開放を指示するフラグが設定できるようにしてもよい。
【0114】
また、『ASI_CMD_ACCESS_REG』命令を発行するときに、asi_cmd_access_reg.COREn/UNITmに値を設定することで、ユーザプログラムは、処理装置上のどのプロセッサ部1(コア)に対して、もしくは、どのユニットに対してJTAGコマンドを発行するか、発行対象を指定することもできる。
【0115】
さらに、『ASI_CMD_ACCESS_REG』命令を発行するときに、asi_cmd_access_reg.JDRに値を設定することで、ユーザプログラムは、JTAGコマンドで処理装置に書き込む制御情報の値を設定することができる。
【0116】
これらの『ASI_CMD_ACCESS_REG』命令を発行するときの設定により、使用するJTAGコマンドの種類と、JTAGコマンドの動作を指定することができる。JTAGコマンドの結果は『ASI_CMD_RECEIVE_REG』命令により、
処理装置内部の状態が読み出される。『ASI_CMD_RECEIVE_REG』命令は、また、プロセッサ部1−1と他のプロセッサ部1−2との間といったプロセッサ部1間、あるいはプロセッサ部とサービスプロセッサ100と間の排他制御のためにも使用される。
【0117】
ASIコマンドによるJTAGコマンドの発行手順は、ユーザプログラムを作成する観点からは以上述べた通りである。JTAGコマンドの発行手順は、ユーザプログラムのコンパイル時にコンパイラが、ユーザプログラム中に組み込むようにすればよい。このような、ASIコマンドによりJTAGコマンドを発行できる処理装置のハードウェアの構成は、ハードウェア設計者には明らかである。ただし、念のため排他制御部分のハードウェアの設計についての説明が付け加えられる。『ASI_CMD_ACCESS_REG』命令を受け取ったJTAGコマンド制御部40は、以下のように、JTAGコマンドの実行・不実行を決定する。すなわち、その命令を受け取るまでのLOCKビットの値および、『ASI_CMD_ACCESS_REG』で指示するLOCKビットの値とLOCK_IDによって、JTAGコマンドの実行・不実行が決定される。さらに、JTAGコマンド制御部40は、コマンド実行後のLOCKビット、LOCK_ID、BUSY/NACKの情報を更新する。
【0118】
<プロセッサ部1からのJTAGコマンド実行要求時の排他制御>
図9に、JTAGコマンド実行依頼元が、ロックの獲得および開放の実施を試みたときのコマンドデータ『ASI_CMD_ACCESS_REG』への設定値、および、その設定値によるレジスタ『ASI_CMD_RECEIVE_REG』の状態の変化を例示する。
【0119】
JTAGコマンド制御部40は、プロセッサ部1、例えばプロセッサ部1−1がLOCKを獲得したときには、レジスタrcv.LOCK_IDをプロセッサ部1−1に割り当てられたLOCK_IDに更新する。また、他のプロセッサ部、例えばプロセッサ部1−2がロックを獲得したときは、JTAGコマンド制御部40は、プロセッサ部1−2に割り当てられたLOCK_IDにレジスタrcv.LOCK_IDを更新する。
【0120】
ここで、図9にしたがって、LOCK_ID更新の動作を説明する。図9では、ロックの獲得および開放操作前のレジスタの状態として、左端の列にレジスタrcv.LOCKの状態が示されている。この状態で、プロセッサ部1が、コマンドデータacc.LOCKおよびacc.LOCK_IDを指示してロック獲得および開放を試みる。このときのロック獲得または開放操作時のレジスタとコマンドの組み合わせパターンが、『実行前』の3列に記述される。
【0121】
そして、上記3列で分類されるそれぞれの行に対応して、操作後のrcv.LOCK、rcv.LOCK_ID、rcv.BUSY/NACKの各レジスタの値が示されている。また、JTAGコマンドが実行されるか否かが、"実行後"の"command"の列に記述され
ている。以下、各行での操作内容およびそのときの動作を説明する。なお、図9の表で、上3行は、表のそれぞれのエントリのエントリを分類するためのフィールドである。したがって、以下の説明中の第1行とは、図9の表の第4行目を意味する。すなわち、表の太枠で囲まれた上3行が除外されて、図9の表の行数が数えられる。
【0122】
図9の第1行目の操作では、レジスタrcv.LOCK=0の状態で、コマンドデータacc.LOCK=0を指定したコマンドが実行されている。この操作は、ロックされていない状態(rcv.LOCK=0)で、ロック開放(acc.LOCK=0での書き込み)を行ったことを意味する。これは意味を持たない操作である。このコマンド実行後、JTAGコマンド制御部40は、ロックされていない状態(rcv.LOCK=0)でL
OCK_IDを変更しないように制御する。また、実行結果通知(rcv.BUSY/NACK)の状態は、変更されない。また、このとき指示したJTAGコマンドは実行されない。
【0123】
図9の第2行目の操作では、レジスタrcv.LOCK=0の状態でコマンドデータacc.LOCK=1のコマンドが実行されている。この操作は、ロックされていない状態(rcv.LOCK=0)で、ロック獲得(acc.LOCK=1での書き込み)を行ったことを意味する。実行されたJTAGコマンドがロックを獲得するとき、JTAGコマンド制御部40は、レジスタrcv.LOCK=1に設定し、レジスタrcv.LOCK_IDをコマンドデータacc.LOCK_IDでの指定値に書き換える。そして、JTAGコマンド制御部40は、コマンドデータacc.JIRで指示されたJTAGコマンドの実行を開始するとともに、レジスタrcv.BUSY/NACK=1/0を設定する。レジスタrcv.BUSYは、JTAGコマンドの実行が完了した時点で0に書き換えられる。なお、ユーザプログラムは、ロックの獲得に成功したかどうかを『ASI_CMD_RECEIVE_REG』により確認できる。
【0124】
図9の3行目の操作では、レジスタrcv.LOCK=1の状態でコマンドデータacc.LOCK=0のコマンドが実行されている。この操作は、ロックされている状態(rcv.LOCK=1)で、ロック開放(acc.LOCK=0での書き込み)を行ったことを意味する。ロックを獲得しているプロセッサ部1は、ロック獲得制御によってただ一つに限られている。そこで、acc.LOCK_IDの値に関わらず、ロックの開放は成功する。このとき、JTAGコマンド制御部40は、rcv.LOCK=0とする。また、このとき、JTAGコマンド制御部40は、レジスタrcv.LOCK_IDをコマンドデータacc.LOCK_IDの値に書き換える。また、このときJTAGコマンドは実行されずに完了するため、rcv.BUSY/NACK=0/0となる。
【0125】
図9の4行目と5行目の操作では、レジスタrcv.LOCK=1の状態でコマンドデータacc.LOCK=1のコマンドが実行されている。4行目の操作は、複数の要求元からのロック要求が競合したとき、先にロックを獲得した要求元に対してだけ、JTAGコマンドの実行を許可する操作を意味する。5行目の操作は、ロックされている状態(rcv.LOCK=1)で、ロックを継続しながら(acc.LOCK=1での書き込み)、JTAGコマンドを連続実行しようとしたことを意味する。4行目と5行目の違いは、JTAGコマンド発行時のacc.LOCK_IDが0x7Fになっていないか(4行目のケース)、0x7Fになっているか(5行目のケース)である。
【0126】
4行目の操作では、acc.LOCK_IDが0x7Fになっていない。このケースは、いずれかの要求元、例えばプロセッサ部1がロックを獲得して要求元LOCK_IDをセットした後に、JTAGコマンド制御部40がそれ以外の要求元からのロック要求を受け取ったケースである。このとき、JTAGコマンド制御部40は、後の要求によるロック要求を拒絶する。このために、JTAGコマンド制御部40は、rcv.LOCK_IDは変更せず、JTAGコマンドも実行しない。他の要求元が実行中のJTAGコマンドの実行を妨げないために、JTAGコマンド制御部40は、rcv.BUSY/NACKを更新しない。
【0127】
図9の5行目の操作では、コマンドデータのacc.LOCK_IDが0x7Fになっている。このケースは、いずれかの要求元がロックを獲得して要求元LOCK_IDをセットした後、JTAGコマンド制御部40がロックを獲得したその要求元から、ロックを保持しつつ連続して実行すべきJTAGコマンドを受け取ったケースである。このとき、レジスタrcv.LOCK_IDは要求元のLOCK_IDを示している。JTAGコマンド制御部40は、この値(レジスタrcv.LOCK_ID)を更新せずに保持する。
また、JTAGコマンド制御部40は、レジスタrcv.BUSY/NACK=1/0をセットして、JTAGコマンドの実行を開始する。以上のように、要求元がプロセッサ部1で動作するユーザプログラムである場合の排他制御が行われる。
【0128】
<プロセッサ部1とサービスプロセッサ100との間の排他制御>
以上の排他制御とは別に、プロセッサ部1によるJTAGコマンドの実行と、サービスプロセッサ100によるJTAGコマンドの実行とが競合する場合もある。このような競合に対応するための排他制御について、以下に説明する。
【0129】
サービスプロセッサ100からのJTAGコマンドとASIコマンドによるJTAGコマンドによる競合に対応するために、『JTAG_LOCK_SP_REG』による制御が使用される。サービスプロセッサ100がJTAGコマンドを発行する際には、次のようにJTAG_LOCK_SP_REGに値が設定される。この設定により、ASIコマンドによるJTAGコマンドの切れ目にサービスプロセッサ100からのJTAGコマンドが実行される。
(手続1)サービスプロセッサ100は、JTAGのLOADコマンドにより、レジスタJTAG_LOCK_SP_REG="1"の設定をJTAGコマンド制御部40に要求する
(手続2)JTAGコマンド制御部40は、ASIコマンドによるJTAGコマンドを実行中であれば、JTAG_LOCK_SP_REGの更新を一時保留する。そして、実行中のASIコマンドが完了すると、すなわち、asi_cmd_receive_reg.BUSYが"1"から"0"に変わると、JTAGコマンド制御部40は、JTAG_LOCK_SP_REG="1"を設定する。
【0130】
JTAG_LOCK_SP_REG="1"の間は、JTAGコマンド制御部40は、ASIコマンドによるJTAGコマンドを受け取っても、asi_cmd_receive_reg.NACK="1"として(プロセッサ部1の処理は図7の処理5参照)、ASIコマンドによるJTAGコマンドを失敗させる。このような制御により、JTAGコマンド制御部40は、プロセッサ部1が新たなASIコマンドによるJTAGコマンドを実行することを抑止する。
(手続3)サービスプロセッサ100は、JTAGのSENSEコマンドにより、JTAG_LOCK_SP_REG="1"であることが確認できるまで待つ。
(手続4)TAG_LOCK_SP_REG="1"を確認後、サービスプロセッサ100は、実行すべきJ
TAGコマンド、例えばLOADまたはSENSEを実行する。
(手続5)JTAGコマンド実行終了後、JTAGのLOADコマンドにより、JTAG_LOCK_SP_REG="0"を設定する。
【0131】
以上が、ASIコマンド経由でJTAGコマンドを発行できるようにした仕組みである。以上の仕組みを使って、次の機構を追加することにより、処理装置のPA(Performances Analyzing、性能解析)機能が提供される。
【0132】
<性能解析の例>
まず、ヒストリRAMに記録する情報は、それぞれのプロセッサ部1、またはL1キャッシュ制御部20、L2キャッシュ制御部30等の各ユニットで毎サイクル取得することも可能である。また、記録すべきイベントが発生したときにヒストリRAMへの書き込み信号をオンにすることで、イベントが発生したときの履歴を採取することが可能となる。本実施形態では、L1キャッシュ部20にキャッシュミスが発生したときに、キャッシュミスしたアドレスとそれに付随する情報、例えばロード・ストアの区別、VIPT(Virtually Indexed Physically Tagged)方式のキャッシュであれば仮想アドレスの一部などが記録される。
【0133】
本処理装置は、ユーザプログラムを実行中に、ASIコマンド経由で、JTAGコマンドを発行し、上記イベントをヒストリRAMに記録する。本実施例では、イベントがヒス
トリRAMに記録されるときに実行中のユーザプログラムは、被解析プログラムと呼ばれる。本実施例では、被解析プログラムを実行する本処理装置が、さらに、ASIコマンド経由で、JTAGコマンドを発行し、ヒストリRAMの記録を読み出す。
【0134】
次に、本処理装置は、読み出されたヒストリRAMの記録を解析するユーザプログラムを実行する。このユーザプログラムは、解析プログラムと呼ばれる。
【0135】
被解析プログラム中に、キャッシュミス等のイベントの履歴が多数回に渡って集められる。本処理装置は、解析プログラムを実行し、多数回に渡って集められ履歴を1つの履歴として統計的に処理する。そのような処理によって、ユーザの解析プログラムを実行する処理装置は、各アドレスで頻繁にキャッシュミスしているアドレスを確定することが可能となる。具体的には、以下のような場合が想定される。
【0136】
(1)無条件にキャッシュミスの履歴を収集する場合;
採取するイベントの種類として、例えば、キャッシュミスが指定される。ただし、他の条件は指定されない。この場合には、キャッシュミス等のイベントが発生するごとに、その動作履歴がヒストリRAMに記録される。動作履歴の記録データが、ヒストリRAMの容量をオーバーフローしない限り、本処理装置(解析プログラム)は、ヒストリRAMに記録されたそれぞれのイベントをそのまま収集された履歴として解析の対象とする。
【0137】
動作履歴の記録データが、ヒストリRAMの容量をオーバーフローした場合には、最も古く記録された記録データから新しく記録する記録データで上書きしていくように制御するため、ヒストリRAMの容量に収まる最新の動作履歴の記録データが、解析の対象となる。この場合に、本処理装置(解析プログラム)は、過去に同一のユーザプログラム実行に収集した動作履歴の記録データと、最新の動作履歴の記録データとを結合して、解析の対象としてもよい。
【0138】
(2)所定の条件の満足されたときにキャッシュミスの履歴の収集を開始する場合;
この場合も、本処理装置(解析プログラム)による処理は、無条件に動作履歴の記録データを収集する場合と同様である。
【0139】
(3)所定の条件の満足されたときにキャッシュミスの履歴を停止する場合;
この場合、本処理装置がユーザプログラム(被解析プログラム)を1回実行したときに、1回の収集による動作履歴が採取される。この場合は、本処理装置(解析プログラム)が、そのような1回の収集結果を解析する。過去に同一のユーザプログラム実行に収集した動作履歴の記録データと、最新の動作履歴の記録データとを結合して、解析の対象としてもよい。
【0140】
また、ヒストリRAMに記録する情報は、他のプロセッサ部からの要求によりL1キャッシュから取り出した動作履歴であってもよい。その場合、キャッシュミスを起こしたアドレスが、他のプロセッサ部からの要求によりL1キャッシュから取り出した動作履歴とともに記録されるようにしてもよい。また、他のプロセッサ部からの要求によりL1キャッシュから取り出した履歴が単独で採取されるようにしてもよい。ここで、「単独で」とは、自プロセッサ部からの要求によりL1キャッシュにアクセスした履歴を除外するという意味である。このような情報を採取することにより、ユーザは、プロセッサ部1の間で取り合いをしているアドレスが存在するかどうか知ることができる。
【0141】
何をヒストリRAMに記録する対象とするかは、CORE_DEBUG_REG0/1,CHIP_DEBUG_REGn
といったJTAGコマンドで定義されるレジスタ(履歴指定部に相当)から指定可能である。本実施形態の処理装置では、これらのレジスタはASIコマンドからのJTAGコマ
ンド、またはサービスプロセッサ100からのJTAGコマンドにより設定可能である。
【0142】
このうち、レジスタCORE_DEBUG_REG0には、例えば、命令処理装置11に備えるヒスト
リRAM51の記録に関する制御の条件、記録するべき履歴の種類等が指定される。また、例えば、レジスタCORE_DEBUG_REG1にはL1キャッシュ制御部20に備えるヒストリR
AM52の記録に関する制御の条件、記録するべき履歴の種類等が指定される。また、レジスタCHIP_DEBUG_REGnには、L2キャッシュ制御部30の他、他CPUインターフェー
ス部62、メモリインターフェース部63、I/Oインターフェース部64にそれぞれ備えるヒストリRAM53−56の記録に関する制御の条件、記録するべき履歴の種類等が指定される。これらのレジスタの値を設定することで、ユーザは既定のヒストリ情報を選択して、指定の条件の下で採取することができる。これらのレジスタの値が記録条件に相当する。
【0143】
例えば、レジスタCORE_DEBUG_REG0は、命令処理装置11のヒストリRAM51を制御
するヒストリ制御部に入力される。このヒストリ制御部は、レジスタCORE_DEBUG_REG0に
よって指定された命令コードを検出したときに、ヒストリ記録を停止する機能を備える。このとき指定する命令コードとしては、ダイアグ命令などが好適である。ダイアグ命令自体は、実際には何もしないが、その命令の空きフィールドにユーザ所望の情報、言い換えれば解析に利用できる情報を埋め込むことができる。ここで、命令の空きフィールドとしては、例えば、直接指定形式のオペランド部分が例示される。なお、直接指定は、命令に指定されるオペランドがレジスタによって間接指定される形式ではないオペランドの指定形式である。また、例えば、ダイアグ命令の代わりに、ネバーブランチ命令、つまり分岐することのない分岐命令は、上記ダイアグ命令と同様に利用され得る。ネバーブランチ命令の分岐先を指定するフィールドが、上記ダイアグ命令の空きフィールドと同様に利用できるからである。このような命令を埋め込む位置は、例えば、画面上に表示されたソースプログラムに対して、ユーザの停止ポイント、つまりブレークポイントの設定によって決定すればよい。そして、ソースコードに対する停止ポイントの指示がなされた後、コンパイラがそのソースプログラムをコンパイルすればよい。
【0144】
したがって、例えば、コンパイラが、停止ポイントが設定されたプログラムをコンパイルするとき、そのブレークポイントに上記命令を埋め込めばよい。その場合に、複数のダイアグ命令をプログラム、例えばプロセッサ1で実行可能な実行形式のファイルに埋め込みつつ、それぞれのダイアグ命令に固有の番号を付すようにすればよい。固有の番号は、ダイアグ命令をそれぞれ区別するために使用できる。
【0145】
一方、コンパイラは、例えば、そのユーザプログラム中にて、ASIコマンド経由のJATGコマンドにより、レジスタCORE_DEBUG_REG0に、その固有の番号が埋め込まれたダ
イアグ命令を指示しておく。このレジスタCORE_DEBUG_REG0への指定は、ヒストリRAM
51のヒストリ制御部に引き渡される。このような指定によって、上記固有の番号が埋め込まれたダイアグ命令を検出したときに、ヒストリ制御部は、ヒストリRAM51の記録処理を停止する。このようにして、ユーザは、処理装置にて1つのプログラムが実行される一方、停止ポイントの命令が実行されたときにヒストリRAM51の記録処理を停止させることができる。すなわち、ユーザは、プログラム上の任意の場所をピンポイントにヒストリ停止場所に指示することができる。逆に、固有の番号が埋め込まれたダイアグ命令が実行されたときに、ヒストリRAM51の記録処理を開始することもできる。そのように動作するJTAGコマンドの仕様が定められ、ヒストリ制御部の回路が設けられている。
【0146】
また、ユーザは、ヒストリの停止ポイントの設定、一例として上記コマンドの埋め込みとJTAGコマンドによる指定の他、ヒストリの読み出し、ヒストリRAM51への記録
再開もプログラムに埋め込むことが可能である。したがって、プログラムを走行することで、所望のポイントの履歴が採取される。さらに、この指定とともに、採取するイベントの種類として、ユーザはキャッシュミスの履歴採取を指示してもよい。そのような指定により、所望の命令列におけるキャッシュミスのアドレス履歴が採取できる。さらに、ユーザが、キャッシュミスの履歴採取の他に、命令実行のヒストリ記録として、実行中のプログラムの命令アドレス(プログラムカウンタの値と等価)や命令のデコード、コミット状況など命令実行に関わる情報の採取を指示できるようにしてもよい。このような指定により、ユーザは、ユーザ所望の命令列がハードウェアでどのように実行されているかの履歴を見ることができる。
【0147】
また、ユーザがヒストリ記録停止手段として、キャッシュミス回数の閾値を指示できるようにしてもよい。この指示により、ヒストリ制御部は、一定時間内に閾値以上のキャッシュミスが発生したところで、ヒストリ記録を停止する。こうしておくと、キャッシュミスが頻発した場所での命令実行の状況およびキャッシュミスしたアドレス履歴がヒストリRAMに残ることになる。したがって、ユーザはこの指定によって採取されたヒストリRAMの内容を解析することにより、プログラム上のどの場所でどのようにしてキャッシュミスが頻発したか知ることができる。
【0148】
以下、このようなヒストリ記録制御手段の一例を説明する。ここでは、L1キャッシュ制御部20に備えるヒストリRAM52の記録方式を制御するヒストリ制御部52Aの回路構成例と、ヒストリ制御部52Aに引き渡されるパラメータを保持するレジスタCORE_DEBUG_REG1の構成例を説明する。
【0149】
図10は、L1キャッシュ制御部20のヒストリRAM52のヒストリ制御部52Aと、レジスタCORE_DEBUG_REG1のビット構成との関係を示す図である。図10のように、レ
ジスタCORE_DEBUG_REG1は、ビット0からビット21までの22ビットを有している。レ
ジスタCORE_DEBUG_REG1のそれぞれのビットによってL1キャッシュ制御部20のヒスト
リRAM52への記録が制御される。ユーザプログラム(被解析プログラム)を実行するプロセッサ1は、ASI経由のJTAGコマンドにより、レジスタCORE_DEBUG_REG1に値
を設定する。
【0150】
このレジスタのビット21(EN)は、ヒストリRAM52へのクロック供給の有無を制御し、ヒストリRAM52を使用しないときの省電力対策のために使用される。プロセッサ1(ユーザプログラム)は、ヒストリRAM52を使用するときは、このビットに値1を設定しておく。なお、図10では、ビット21(EN)に対応する、クロック供給制御の回路は省略されている。そのような回路は、例えば、一方の入力をクロックとして、他方の入力をビット21(EN)とするANDを含む回路で例示できる。
【0151】
ビット20〜ビット18(HIS_MODE[2:0])は、採取対象とするL1キャッシュ上のイ
ベントが複数設定可能である場合に、どのイベントを採取するか指示する。この指示によって、L1キャッシュ内部のパイプライン動作を観測することも可能である。図10のように、HIS_MODE[2:0]は、複数のイベント(例えば、History_event0からHistory_event4
)を採取したデータの先端回路への選択信号となる。
【0152】
例えば、本実施形態では、ユーザプログラムを実行するプロセッサ1は、ビット20〜ビット18(HIS_MODE[2:0])に、キャッシュのスラッシング検出モードを指示する。こ
の場合の指示としては、例えば、L1キャッシュへの新規キャッシュラインの登録(Move−In動作)、L1キャッシュからL2キャッシュ階層へのキャッシュラインの吐き出し(Move−Out動作)、および、L2キャッシュへのキャッシュラインのプリフェッチ(Prefetch動作)の3つのイベントのいずれかが選択して指示される。こ
の指示よって、これらのイベントが発生したときに、そのイベントが選択されて、ヒストリRAM52に記録される。
【0153】
ビット17(FRC_CYCLE)は、イベントの記録のタイミングを制御することができる。
通常のヒストリ採取ではイベントが発生したタイミングでヒストリRAMへの記録が行われる。一方、ビット17(FRC_CYCLE)が1に設定されると、ヒストリ制御部52Aは、
強制的に毎サイクルのイベントを記録する。
【0154】
ユーザがスラッシングを観測するときには、ヒストリ制御部52Aが、イベントが記録される時間間隔をヒストリ上に記録するように制御することで、ユーザが、キャッシュミスの時間間隔、すなわちキャッシュミスの頻度を観測することも可能である。また、ユーザが、毎サイクルのイベント記録を指示することにより、キャッシュミスの間に何が起きていたかのイベントを観測することも可能である。また、ユーザがL1キャッシュ制御部20のパイプライン動作を観測しているときには、パイプライン上でのイベントが発生したタイミングごとの記録を観測するよりも、ビット17(FRC_CYCLE)にて毎サイクルの
動作履歴が記録される方が好ましい場合がある。すなわち、ユーザは、毎サイクル動作した結果を観測した方が、パイプライン動作の内容が見やすくなる場合がある。ビット17(FRC_CYCLE)は、そのような制御にも利用される。
【0155】
ビット16(DIS_MI_EVENT)、ビット15(EN_MO_EVENT)、ビット14(EN_PF_EVENT)は、キャッシュのスラッシング検出モードが指示されたときに意味を持つビットである。デフォルト設定で、これらのビットが0に設定されている。これらのビットが0に設定されているとき、スラッシング検出モードでは、Move−In動作が記録される。通常のスラッシングは、Move−In動作の観測により、検出できるからである。
【0156】
ここで、EN_MO_EVENTビットが値1に設定されると、Move−Out動作が観測対象
に加えられる。このMove−Out動作が記録されると、ヒストリRAM52の記録は、プロセッサ部1間のデータの取り合いによる問題の発生を観測する用途にも用いることができる。Move−In動作の記録が残ることでMove−Out動作の記録が減ることが問題になる場合には、DIS_MI_EVENTビットが値1に設定される。この設定は、Move−In動作をヒストリRAMに記録しない指示である。
【0157】
本実施形態では、L1キャッシュおよびL2キャッシュは、インクルージョン方式を採用している。インクルージョン方式のキャッシュでは、L1キャッシュがヒットする場合には、必ずL2キャッシュにもデータが有効に残されている。したがって、プログラムチューニングにおいて、L1キャッシュへのMove−In動作では、L2キャッシュがヒットしていることが期待される。逆に、L1キャッシュへのMove−In動作時に、L2キャッシュがヒットしていないと、L2キャッシュまでのMove−In動作が問題となる。L2キャッシュまでのMove−In動作は、L1キャッシュへのMove−In動作と比較して、長い時間を要するからである。そこで、L1キャッシュへのMove−In動作のタイミングに先立って、適切なタイミングでメモリからL2キャッシュまでのMove−Inを指示するプリフェッチ命令が実行される。
【0158】
このようなプリフェッチ命令は、コンパイラによって実行されるように調整される。このプリフェッチ命令の実行タイミングが適切であるかどうかを確認するために、EN_PF_EVENTビットが値1に設定される。この設定は、Move−In動作とPrefetch動
作のタイミングを確認するためのヒストリ記録を採取する。
【0159】
ビット16(DIS_MI_EVENT)、ビット15(EN_MO_EVENT)、ビット14(EN_PF_EVENT)の各ビットは、上記のような採取するイベントをさらに細かく制御するための選択信号
となる。この選択信号は、MI_EVEVT、MO_EVENT、およびPF_EVENTを採取したデータのいずれか1つ以上を選択する選択回路に入力される。
【0160】
ビット13〜ビット4(EVENT_NUM[9:0])、ビット3〜ビット0(EVENT_INTVL[3:0])は、指示した時間内に指示したイベント回数が発生したら、ヒストリ記録を停止するためのビットである。イベントが発生した回数を観測するために、ヒストリに記録するたびに値1ずつインクリメントするカウンタとしてHISTORY_EVENT_COUNTER[9:0]が用意されている。このカウンタとは別に、イベント発生の有無に関わらず、毎サイクル値1ずつインクリメントするカウンタとして、CYCLE_COUNTER[13:0]が設けられている。さらに、CYCLE_COUNTER[13:0]のビット13〜ビット10とEVENT_INTVL[3:0]の一致を検出する比較回路521(COMPARE[3:0])が設けられている。そして、比較回路521が一致を検出したら、HISTORY_EVENT_COUNTER[9:0]がゼロクリアされるように制御される。
【0161】
こうすることで、HISTORY_EVENT_COUNTER[9:0]は、EVENT_INTVL[3:0]で指示した値の1024倍のサイクル間隔でカウント値がクリアされる。一方、HISTORY_EVENT_COUNTER[9:0]は、EVENT_NUM[9:0]と比較する比較回路522(COMPARE[9:0])に接続される。そして、その比較結果が一致したとき、比較回路522は、FREEZEラッチ523をセットする。FREEZEラッチ523がセットされると、FREEZEラッチ523の出力信号は、ヒストリRAM52への記録の停止を指示する。したがって、FREEZEラッチ523がセットされたとき以降のヒストリRAM52への記録は停止される。
【0162】
すなわち、EVENT_INTVLで指示された時間間隔に、EVENT_NUMで指示されたイベント回数以上のイベントが発生したら、その時点でヒストリRAMへの記録が停止される。こうすることで、採取対象のイベントにキャッシュミスが指示された場合、一定時間に所定値以上のキャッシュミスが発生したときに採取が停止される。すなわち、ユーザは、キャッシュミスが所定の頻度以上で発生したときに、キャッシュミスが頻発したみなすことで、キャッシュミスが頻発した時点のヒストリ履歴を採取することが可能となる。
【0163】
なお、FREEZEラッチ523は、次回のヒストリ採取のため、ヒストリ履歴のユーザプログラムへの読み出しを完了した時点でリセットされる。また、例えば、EVENT_NUMにオー
ルゼロが設定されているときは、ヒストリ制御部52Aは、FREEZEラッチ523を1にしないように制御する。この制御により、ヒストリ制御部52Aは、イベント回数の観測によるヒストリ記録の停止が不要なケースの履歴採取に備える。
【0164】
図11は、命令処理装置11のヒストリRAM51のヒストリ制御部51Aと、ヒストリ制御部51Aでの制御を指定するレジスタCORE_DEBUG_REG051Bとの関係を示す概念
図である。
【0165】
図11のように、レジスタCORE_DEBUG_REG051Bは、EN(クロック供給有無制御),HIS_MODE[2:0](ヒストリモード)、COUNT(イベント回数),OPCODE(オペレーションコー
ド)の各フィールドを有している。ENおよびHIS_MODE[2:0]の指定は、図10の場合と同
様である。OPCODEは、HIS_MODE[2:0]で指定するイベントとともに観測する命令コードの
指定である。COUNTは、その命令コードの発生回数である。
【0166】
図11のように、レジスタCORE_DEBUG_REG051BのOPCODEのビットパターンは、レジ
スタ511に格納される。一方、レジスタ512には、L1命令キャッシュ13、命令バッファ13Aを通じて、命令処理装置11にて処理される命令コードが設定される。そして、比較器513が、レジスタ511とレジスタ512とでビットパターンを比較し、比較結果が一致すると、カウンタ514がインクリメントされる。
【0167】
一方、レジスタ515に、レジスタCORE_DEBUG_REG051BのCOUNTが設定されている。比較器516は、カウンタ514の値と、レジスタ515の値を比較し、値が一致すると、ヒストリRAM51への書き込みを停止し、さらに、カウンタ514をクリアする。このようにして、OPCODEで指定される命令コードがCOUNTで指定される個数検出されまで、HIS_MODE[2:0](ヒストリモード)で指定されるイベントが記録される。COUNT=0が設定さ
れた場合は、上記ダイアグ命令が検出されるまではヒストリRAM51への記録を停止するように制御しておく。上記ダイアグ命令が検出された後は、カウンタ514の値と、レジスタ515の値が一致しなくなる。この時点から、ダイアグ命令検出後に、ヒストリRAM51への書き込みが継続するように制御する。こうすることで、ダイアグ命令の埋め込まれた位置が、イベントの採取の開始する開始ポイントとなる。
【0168】
このようにして、命令処理装置11で発生するイベントを、指定された命令の実行回数と関連づけて、ヒストリRAMに記録できる。この場合に、OPCODEで指定される命令コードとして、例えば、空き領域に識別情報を埋め込んだダイアグ命令を用いることで、ユーザは、所望の停止ポイント付近、あるいは、指定の開始ポイントで、指定のイベントを観測できる。
【0169】
上記では、OPCODEで指定される命令の実行回数がイベント記録の条件とされた。しかし、実行回数が1に設定されてもよい。その場合には、OPCODEで指定される命令の有無が、イベント記録の条件となる。また、図11のように、カウンタ514を設けることなく、ヒストリ制御部が、OPCODEで指定される命令の有無によって、ヒストリRAM51への書き込みを停止または開始するようにしてもよい。この場合には、ユーザは、所望の命令が実行された付近で記録が開始されたイベントあるいは記録が停止されたイベントの履歴を取得できる。
【0170】
なお、図10、図11は、それぞれ、L1キャッシュ制御部20のヒストリRAM52、命令処理装置11のヒストリRAM51を例に、ヒストリ制御部52A、51Aの処理例を示す。しかし、本処理装置にて、ASIコマンド経由で指定できるヒストリ制御は、図11、図12の例に限定される訳ではない。すなわち、本処理装置では、ASIコマンドから、ユーザプログラムに設定が認められる範囲で、JTAG制御部40の様々な機能が、ユーザに開放されることになる。例えば、ヒストリRAM53−56による記録も、同様にユーザプログラムから取得可能となる。
【0171】
図12は、L1キャッシュ制御部20のヒストリRAM52に記録されるデータフォーマットを例示する図である。以下、図12に示した各ビットの定義を説明する。図12のように、ヒストリRAM52の記録は、MIREQ_VALID,MOREQ_VALID,PFREQ_VALID,REQ_CODE[5:0],REQ_SRC_CODE[1:0],REQ_AADRS[40:3],REQ_LADRS[13],MIB_VALID[5:0]の各フィールドを含む。
MIREQ_VALID : このフィールドは、キャッシュミスにより、Move-In Requestを送出した
ことを示す。
MOREQ_VALID : このフィールドは、L2キャッシュからの指示により、Move-Out Requestを送出したことを示す。
PFREQ_VALID : このフィールドは、プリフェッチ要求を送出したことを示す。
REQ_CODE[5:0] : このフィールドの値は、MI/MO/PFREQ_VALIDの要求種別を示すコードで
ある。すなわち、Move-In Request、Move-Out Request、およびPrefetch Requestという
それぞれの要求の詳細分類である。
REQ_SRC_CODE[1:0] :このフィールドの値は、MI/PFREQ_VALIDの要求元を示すコードであ
る。例えば、プロセッサ部1(ユーザプログラム)、分岐予測機構等の処理装置1内の制御部を示すコードである。
REQ_AADRS[40:3] : このフィールドの値は、MI/MO/PFREQ_VALID対象の物理アドレスであ
る。
REQ_LADRS[13] : このフィールドの値は、MI/MO/PFREQ_VALID対象の論理アドレスである
。なお、論理アドレスの[12:0]は、物理アドレスと一致するため、記録されない。さらに、例えば、論理アドレスの上位7ビット[13:7]は、キャッシュのインデックスアドレスとなる。
MIB_VALID[5:0] : このフィールドの値は、MIREQ_VALID要求元のMove-In-Bufferが有効であることを示す、Bufferごとのフラグである。
【0172】
なお、図12には示されていないが、このデータフォーマット中に、ヒストリ記録間隔をコアサイクル数で表示するフィールド(INTERVAL )を備えるようにしてもよい。ヒス
トリ記録間隔から、コアサイクル単位のイベント数を算出すれば、イベントの頻度が算出できる。
【0173】
ヒストリ記録は、リングバッファ(環状記憶部に相当)として機能するヒストリRAM上にラップアラウンドして記録される。このため、ヒストリRAMに記録されるイベントの数が極端に少ないときは、前回取得した履歴が今回の履歴にも残っている。したがって、ユーザは同じ履歴を二度に渡って取得してしまう可能性がある。同一履歴の重複した取得を避けるために、例えば、ヒストリ制御部51A、52A等が、履歴を一旦クリアしてから次の履歴の採取を開始することもできる。
【0174】
本実施形態では、簡単のために履歴の採取を始めるときには、ヒストリ制御部51A、52A等が1回既定のビットパターンをヒストリRAMに記録してから、履歴の記録を開始するようにしておく。このパターンは例えば、ゼロが所定個数連続するパターン(以下、識別情報と呼ぶ)でよい。この処理を実行するヒストリ制御部が識別情報設定部に相当する。
【0175】
図13は、履歴の記録を開始するときに、識別情報を埋め込む回路構成を示す図である。図13に示す構成は、複数のイベント(hitory_event0-4の信号で示されるイベント)
のうちの1つが選択され、ヒストリRAMに書き込む回路の詳細を示している。図13では、ヒストリRAMに記録されるイベント1つ分のデータを一時的に保持するバッファが2個設けられている。この2つのバッファは、バッファBUF0とバッファBUF1で示される。
【0176】
選択信号によって選択されたイベントは、スイッチSW1によって、バッファ0またはバッファ1のいずれに交互に書き込まれる。また、ヒストリRAMには、イベントが書き込み中でない、あるいは書き込みが終了したバッファから、イベントが書き込まれる。すなわち、バッファBUF0とバッファBUF1は、ヒストリRAMに対して、2面バッファを構成している。
【0177】
このような構成において、予め、バッファBUF0には、ゼロが所定個数連続するパターンが設定される。そして、履歴の記録を開始するときに、最初のイベントは、SW1によってバッファBUF1に書き込まれる。その間、バッファBUF0から、スイッチSW2を介して、識別情報がヒストリRAMに書き込まれる。以降、イベントが取得されるごとに、バッファが切り替えられ、順次、ヒストリRAMに格納する制御が実行される。このようにして、履歴の記録を開始するときに、識別情報が埋め込まれる。
【0178】
ここで、ヒストリRAM52の場合には、所定個数のゼロを含むパターンは、ヒストリ記録イベントが発生したことを示すビットのMIREQ_VALID,MOREQ_VALID,PFREQ_VALIDがゼ
ロであることを意味する。したがって、識別情報のパターンは、イベント発生時に動作履歴を記録するモードを指示しているときには、ヒストリ記録に残ることがないデータパタ
ーンが記録されていることになる。識別情報のパターンがヒストリに残っていなければ、ユーザは、採取したヒストリに記録されたすべての情報を最新の情報とみなすことができる。識別情報のパターンがいくつか残っていれば、ユーザは、前回の履歴との差分を取るツールを処理装置にて実行することにより、過去に読み出し済みの履歴情報を除外して、最新の履歴情報を取り出すことができる。
【0179】
なお、上記では、2面バッファの一方に、初期値として、識別情報を設定する構成が示されたが、履歴の記録を開始するときに識別情報を埋め込む回路構成は、このような回路構成に限定される訳ではない。例えば、ヒストリRAMの入力ポートが2入力のアンドゲートを有するようにしてもよい。そして、第1の入力に採取された履歴が入力され、第2の入力ポートには、履歴の記録開始時だけ0のビットパターンが入力されるようにすればよい。そして、最初のイベント記録後、第2の入力ポートには、1が入力されるようにすればよい。この場合には、最初のイベントが発生したときに、最初のヒストリRAMの記録には、上記識別情報のパターンが記録される。したがって、最初のイベントは記録されないが、簡易に識別情報がヒストリRAMに設定される。また、ヒストリRAMの履歴が統計的に処理される場合には、最初のイベントが記録されなくても、解析への影響は小さい。
【0180】
<解析プログラムの処理>
以上のようなハードウェアを用いて取得した履歴情報は、OS配下で動作するユーザプログラムへと渡される。この例では、一旦被解析プログラム中で、履歴情報を取得し、処理装置の外部記憶装置のファイルに蓄積する。そして、処理装置が解析プログラムを実行し、そのようなファイル中の履歴情報を解析する。以下、本方式でキャッシュミスアドレスの履歴を取得した場合について、本処理装置で実行されるユーザプログラム、例えば性能解析プログラムでの扱いを説明する。
【0181】
図14は、本処理装置のプロセッサ部1(以下、単に本処理装置という)で実行されるユーザプログラムの処理を例示する図である。S1−S2は、被解析プログラムの処理である。また、S3−S8は、解析プログラムの処理である。被解析プログラムは、コンパイルされるときに、『ASI_CMD_ACCESS_REG』および『ASI_CMD_RECEIVE_REG』という2つのASIコマンドが組み込まれている。
【0182】
この処理では、まず、本処理装置は、被解析プログラムを実行する(S1)。被解析プログラムの実行によって、ヒストリRAMには、各種イベント、例えば、キャッシュミスが発生したアドレスを含むMove−In動作が記録される。そして、被解析プログラムの実行終了時に、被解析プログラムの『ASI_CMD_RECEIVE_REG』命令により、本処理装置は、動作履歴を取得する。なお、ここでは動作履歴として、キャッシュミスアドレスを含むものとする。この動作履歴は、例えば、被解析プログラム実行時のログファイルに格納される(S2)。
【0183】
なお、本実施形態では、ヒストリRAMには、例えば、32ビット×1024個の動作履歴、例えばキャッシュミスを起こしたアドレス1024個が1つの記録として保持されている。そして、JTAGコマンド制御部40は、処理装置、本実施例では被解析プログラムの実行環境に、その動作履歴を引き渡す。ところで、本実施形態では、本処理装置は、『ASI_CMD_RECEIVE_REG』コマンドを実行すると、JDR[0:31]の3
2ビットの領域を通じて、ヒストリRAMの値を取得する。そのため、この構成では、本処理装置は、JDR[0:31]を通じて1024回の読み出し処理を実行し、32ビット×10
24個の動作履歴を取得する。
【0184】
また、このとき、読み出される動作履歴は、処理装置が被解析プログラムを実行したと
きに、短期間、例えば数分から数時間に頻発した動作履歴であってもよい。また、この動作履歴は、長期、例えば数日から数ヶ月に渡って処理装置が被解析プログラムを実行したときに、採取された1024個の動作履歴であってもよい。
【0185】
次に、本処理装置は、採取した履歴と、過去に取得済みの履歴を結合するか否かをユーザに問い合わせる(S3)。ここで、過去に取得済みの履歴とは、S1の処理で実行された被解析プログラムと同一の被解析プログラムを処理装置が実行し、採取した履歴である。
【0186】
履歴の結合をする旨をユーザが応答した場合、その応答にしたがって、本処理装置は、S2の処理で取得した履歴と、過去に取得済みの履歴とを結合し、単一のファイルに格納する(S4)。これにより、本処理装置は、より大きなキャッシュミスアドレスの履歴とみなすための結合履歴を作成する。履歴の結合をしない旨をユーザが応答した場合、その応答にしたがって、本処理装置は、制御をS5に進める。
【0187】
上記結合履歴は、キャッシュミスを起こしたアドレスそのものである。キャッシュ上のスラッシングを解析するために、本処理装置は、キャッシュインデックスアドレスに丸めたインデックスタグを各キャッシュミスアドレスに付与する(S5)。
【0188】
キャッシュインデックスアドレスに丸めるとは、キャッシュ検索に使用するアドレス部分を取り出すことを意味する。ここでは、例えば、L1キャッシュ制御部20がキャッシュ容量32KB、2ウェイセットアソシアティブのキャッシュメモリをラインサイズ128バイトで管理しているとする。すると、1ウェイ当たりのキャッシュ容量は16KBとなる。ラインサイズが128バイトであることから、16KBのキャッシュには16KB/128=128個のキャッシュラインが入ることになる。キャッシュライン数128をインデックスするためには2進数表示で7ビットが必要となる。ライン内アドレスはキャッシュラインのインデックスに使えないことから、キャッシュライン内アドレスを除いて、その上位ビットがキャッシュインデックスアドレスに使用される。
【0189】
例えば、キャッシュミス履歴に残っているアドレスが0xfffffff8であったとき、インデックスタグは、0x00003f80となる。ここで、下位7ビットの"0000000"は、キャッシュラ
イン内のアドレス部分であり、このアドレス部分はキャッシュインデックスアドレスとしては識別されないため、いずれも0となっている。また、次の7ビット"1111111"は、キ
ャッシュインデックスアドレスを識別するビット部分である。結合履歴にあるそれぞれのアドレスに対してこの操作を行ってインデックスタグを付与することで、キャッシュインデックスアドレス表示を含んだキャッシュミスの結合履歴が作成される。
【0190】
次に、本処理装置は、キャッシュミスの結合履歴をインデックスタグの昇順もしくは降順に並べ替える(S6)。このとき、同一キャッシュインデックスアドレスは連続して複数並ぶ。さらに、本処理装置は、キャッシュミスの結合履歴を並べ替えた結果をキャッシュインデックスアドレスごとに登場回数を数えてヒストグラムを作成する(S7)。ユーザは、ヒストグラムを作成することで、キャッシュミスを頻繁に起こしたキャッシュインデックスアドレスを可視化することができる。この場合、本処理装置は、ヒストグラムを表示装置に表示してもよい。S5−S7を実行する処理装置のプロセッサ部1が、集計する手段に相当する。
【0191】
ここでヒストグラムがなだらかな曲線を描けばスラッシングは起きていないが、どこか極端なピークを持った曲線になるとき、そのピークを持ったキャッシュインデックスアドレスでスラッシングが起きていることが表示される。ユーザは、スラッシングが起きているキャッシュインデックスアドレスに着目して、結合履歴に頻繁に登場するキャッシュミ
スアドレスがスラッシングを起こしているアドレスであるとして認識できる。
【0192】
そこで、本処理装置は、例えば、ヒストグラムの変化率およびピークの高さをインデックスタグの変化の方向にサーチしてもよい。そして、本処理装置は、ヒストグラムの変化率およびピークの高さの少なくとも一方が所定の基準を超えるインデックスタグの位置をスラッシングが発生しているアドレスとして推定してもよい。本処理装置は、そのようなアドレスに割り付けられている命令列およびその命令に対応するソースコードを表示装置に表示してもよい(S8)。S8の処理を実行する処理装置のプロセッサ部1が検出する手段に相当する。なお、ヒストリRAMが、キャッシュミスを発生したアドレスとともに、キャッシュミスが発生したコアサイクルを記録するようにしておいてもよい。そして、本処理装置は、単位時間当たりのキャッシュミスの発生回数のヒストグラムを作成してもよい。そして、本処理装置は、ヒストグラムのピークの高さをインデックスタグの変化の方向にサーチしてもよい。このようにして、本処理装置は、キャッシュミスの頻度が所定の基準を超えるインデックスタグの位置を検出し、検出したインデックスタグの位置をスラッシングが発生しているアドレスとして推定してもよい。
【0193】
ここで、本処理装置は、読み取られたアドレスに対応するロード・ストア対象アドレスを発行した命令が、プログラム中のどの命令に対応するかについて、プログラムのソースコードを調べる。スラッシングを起こしているロード・ストア命令がわかれば、その命令が使用するデータ領域の割り当て位置をキャッシュラインで数ライン分ずらすことでスラッシングが解消される。例えば、コンパイラが、コンパイルオプションで、データ領域の割り当てを所定アドレス分だけずらす機能がコンパイラに設けられればよい。データ領域の割り当て位置変更によって、期待通りにスラッシングが回避されたかどうかは、本処理装置が再度被解析プログラムを実行し、再度キャッシュミス履歴を採取するようにすればよい。そして、ユーザがその結合履歴を調べることで、スラッシングが回避された否かを確認することができる。
【0194】
図15に、ユーザプログラム、例として解析プログラムおよび被解析プログラムを含むアプリケーションプログラムを実行するコンピュータの構成を例示する。このコンピュータは、上記処理装置に相当するCPU200と、メモリインターフェースを通じてCPU200に接続されるメモリ201と、I/Oインターフェースを通じてCPU200に接続される周辺装置を有している。周辺装置は、例えば、表示装置202、内蔵外部記憶装置203、着脱可能記憶媒体駆動装置204、およびLAN基板205を有している。
【0195】
メモリ201は、例えば、DRAM(Dynamic Random Access Memory)、ROM(Read
Only Memory)、フラッシュメモリである。メモリ201には、CPU200で実行されるプログラム、およびCPU200が処理するデータが格納される。プログラムには、図14に示したようなユーザプログラム、およびコンパイラ、OS(Operating System)等のシステムプログラムが含まれる。
【0196】
表示装置202は、コンピュータの処理結果を表示する。内蔵外部記憶装置203は、例えば、ハードディスクドライブであり、メモリ201に読み出される前のユーザプログラム、コンパイラ、ローディング前のOS等が格納される。
【0197】
着脱可能記憶媒体駆動装置204は、ブルーレイディスク、DVD(Digital Versatile Disk)、CD(Compact Disc)、フラッシュメモリカード等である。上記各種プログラムは、例えば、着脱可能記憶媒体駆動装置204またはLAN基板205からインストールされ、内蔵外部記憶装置203に格納される。
【0198】
<効果>
以上述べたように、本実施例の処理装置は、サービスプロセッサ100の一部機能を、特定の命令セット、以上説明した例ではASIコマンドと呼ばれるSPARC−V9命令セットで定義される体系の中の命令を経由してユーザに開放する。これにより、ユーザからのサービスプロセッサ100の機能の利用が可能となるため、ユーザプログラムからのヒストリの記録制御が可能となる。
【0199】
そして、本処理装置では、ヒストリRAMの内容をユーザ環境に読み出すインターフェースを提供する。そのようなインターフェースは、ASIコマンドによってJTAGコマンドをJTAG制御部40に書き込む制御を導入する。このような制御により、システム停止を起こすような危険なコマンドが除かれ、開放可能なJTAGコマンドの範囲で、JTAGコマンドがユーザプログラムから使用されることが可能となる。
【0200】
このような構成により、処理装置の内部で何が起きているのか、ユーザは、ユーザのコンピュータ環境から確認することが可能となる。すなわち、ユーザが見たいポイントをユーザのコンピュータ環境から指示することが可能となる。ここで、見たいポイントとは、例えば、キャッシュミスのような採取するイベントの種類、あるいは、そのイベントが発生したときに処理装置が実行しているプログラム上の位置等を含む。また、ユーザが、そのポイントを観測するときの条件を指定できるようになる。ここで、「条件」とは、例えば、指定した種類のイベントの発生回数、発生頻度、特定の命令が実行されたときとを含む条件をいう。また、この条件には、記録の開始、イベント採取の開始を指定する条件と、記録の停止、イベント採取の停止を指定する条件が含まれる。
【0201】
例えば、ユーザは、解放されたJTAGコマンドを用いて、命令コード指定のヒストリ停止機能を利用できるようになる。このため、ユーザが観測したい命令列にダイアグ命令としてブランチネバー命令とその命令の空きフィールドに識別IDを埋め込んだ特別の命令を埋め込むこともできる。そして、ユーザがそのような特別の命令をヒストリストップ対象命令として、セットすることにより、ユーザが使用するコンピュータ環境からヒストリを止める場所、つまりプログラムのアドレスの指示が可能となる。
【0202】
また、上記処理装置は、上記ASIコマンドを用いて、ユーザが見たいポイントのプログラムカウンタの値を指示し、さらに、プログラムカウンタがそのポイントを何回目に通過したときの状態を見たいのかを指示するインターフェースを備える。これにより、ユーザが、使用するコンピュータ環境からヒストリを止める場所の指示が可能となる。
【0203】
本実施形態の処理装置では、ヒストリ操作など、特定の機能を実行するために必要なJTAGコマンドの範囲でユーザに開放することが可能となる。このため、JTAGコマンドをユーザが安全に使用することが可能となる。
【0204】
さらに、上記実施例では、新たなASI空間にアクセスするL2−ASIコマンドによって、『ASI_CMD_ACCESS_REG』コマンドおよび『ASI_CMD_RECEIVE_REG』コマンドが定義された。新たなASI空間が使用されたため、既存のメモリ空間での既存レジスタ、あるいは、既存のデバイスに割り付けられているアドレスとの競合を考慮する必要がない。また、L2−ASI命令検出部21によって、L2−ASIコマンドがL2キャッシュ制御部に引き渡されるので、L1オペランドキャッシュ14等のキャッシュメモリに入出力されるデータが留まることを回避できる。そして、L2キャッシュ制御部30のASI命令解釈部31からJTAGコマンド制御部40に、データを引き渡すことができる。
【実施例3】
【0205】
上記実施例2の処理装置においては、ASIコマンドを使用してJTAG資源を使用す
る手段を提示した。しかし、本処理装置の構成は、実施例2の構成に限定される訳ではない。例えば、一般的なCPUにはASIコマンドが実装されているとは限らない。しかしながら、それぞれのCPUに固有もしくは一般的なコマンドを使用して、実施例1、2の処理装置と同様の仕組みを実装することも可能である。すなわち、ASIコマンド以外のコマンド体系において、JTAGコマンドを利用する仕組みが以下に例示される。なお、本実施例では、ASIコマンド以外のコマンド体系によってJTAGコマンドを利用する点以外の構成および作用は、実施例1および実施例2と同様である。そこで、同一の構成要素については、同一の符号を付してその説明を省略する。また、実施例1、実施例2で参照した図面に示される、ASIコマンドの処理に関する構成以外の構成は、本実施例にそのまま適用できる。
【0206】
他の一般的な方式としては、例えば、現在利用されている多くのCPUに備えるコマンドとしてノンキャッシュ空間へのアクセス命令が適用できる。ノンキャッシュ空間とは、キャッシュメモリを介在せずにアクセスされるメモリ空間をいう。ノンキャッシュ空間へのアクセス命令(以下、ノンキャッシュ命令と呼ばれる)は、キャッシュを介さないでデバイスにアクセスする。ノンキャッシュ命令によるノンキャッシュ空間へのアクセスは、ノンキャッシャブル空間として定義されたアドレス空間への読み書きとして定義される。ノンキャッシュ空間へのアクセスの動作は、レジスタの読み書きをしたり、I/O装置への動作を指示したりするものである。
【0207】
一方、通常のロード/ストア命令(以下、キャッシャブル命令と呼ばれる)は、キャッシュを介して、例えば、物理メモリ等にアクセスする。このようなキャッシュを介在させてアクセスされるメモリ空間をキャッシャブル空間という。キャッシュは、例えば、図2のL1オペランドキャッシュ14、L2キャッシュデータ部61等である。本実施例では、ノンキャッシュ空間が第1のアドレス空間に相当する。また、キャッシャブル空間が、第2のアドレス空間に相当する。
【0208】
ノンキャッシュ空間へのアクセス命令によって、入出されるデータは、キャッシュに保持されることなく、そのまま物理メモリに入出力されることになる。したがって、ノンキャッシュ空間へのアクセス命令は、プロセッサ1で実行されるユーザプログラムと、JTAGコマンド制御部40とのインターフェースとして好適である。
【0209】
キャッシュメモリを経由する可能性のあるキャッシャブル命令によって入出されるデータは、キャッシュメモリ上に維持され、物理メモリに保持されるとは限らない。このため、プロセッサ1で実行されるユーザプログラムと、JTAGコマンド制御部40とのインターフェースとしては、不確定な側面を有する。一方、ノンキャッシュ命令によって入出されるデータは、そのまま、ノンキャッシュアドレスに対応するレジスタまたはI/O装置との間で受け渡しが行われる。このため、ノンキャッシュ命令では、通常のキャッシャブル命令のように、読み書きされるデータがアドレス空間の物理メモリに存在するか否かについての不確実性がない。このような不確実性がない点は、実施例2で用いた種類のASIコマンドも同様である。この種類のASIコマンドとは、L1キャッシュ制御部20のL2−ASI命令検出部でL2キャッシュ制御部30に転送すべき命令と判定されたASIコマンドをいう。
【0210】
ただし、ノンキャッシュ空間のアドレスのうち、特定のアドレスは、既存のレジスタ、あるいは、I/O装置等に割り付けられている。したがって、JTAGコマンドをJTAGコマンド制御部40に引き渡すインターフェースは、そのような既存のデバイスに割り付けられたアドレスを回避して設定されなければならない。この点、実施例2のASIコマンドの場合には、新規なASI空間が用いられたので、そのような配慮は不要である。
このノンキャッシュ空間に本方式の2つのアドレス、つまり『ASI_CMD_ACC
ESS_REG』、『ASI_CMD_RECEIVE_REG』用のデータパターンが追加定義され得る。そして、その2つのアドレスへの書き込みが検出されたときに、上記実施例1の処理装置の動作が起動するようにすればよい。このような構成および手順によって、一般的なCPUにおいても実施例1の処理装置と同様の仕組みが、ユーザに利用可能となる。
【0211】
図16に、ノンキャッシュ空間へのアクセスを使用した処理装置の構成を例示する。図16では、ASI空間へのアクセスを利用した説明図である図5と比較して、ASI命令検出部21がノンキャッシュ命令検出部21Aに変更されている。L1キャッシュ制御部20Aのノンキャッシュ命令検出部21Aは、仮想化アドレスから物理アドレスへの変換過程でTLBを検索する。ノンキャッシュ空間へのアクセスであることが判明した場合、ノンキャッシュ命令検出部21Aは、ロード・ストアの区別とともにノンキャッシュ空間へのアクセスであることを明示して、L2キャッシュ制御部30Aへと命令を送出する。もしくは、命令処理装置11から直接ノンキャッシュ空間へのアクセスが指示された場合も、L1キャッシュ制御部20Aのノンキャッシュ命令検出部21Aがその指示を受け付ける。そして、ノンキャッシュ命令検出部21Aは、ロード・ストアの区別とともにノンキャッシュ空間へのアクセスであることを明示して、L2キャッシュ制御部30Aへと命令を送出する。
【0212】
図5のL2キャッシュ制御部30のASI命令解釈部31は、ASI番号とアドレスのビットの一部を用いてJTAG制御部40へのアクセスを割り出していた。一方、図16では、そのような制御から、ASI番号が外され、アドレスの全ビットが使用されるように変更される。あるノンキャッシュアドレスに『ASI_CMD_ACCESS_REG』、『ASI_CMD_RECEIVE_REG』と2つのコマンドが定義される。そして、このアドレスへのアクセスが発生したら、ノンキャッシュ命令解釈部31Aは、JTAG制御部40へとJTAGコマンドを渡す。すなわち、図16の処理装置は、ASIコマンドに代わって、ノンキャッシュ命令によって、JTAG制御部40へのアクセスを検出するインターフェースを有する。図16の他の構成および制御は、ASI空間を使用した図5の構成および制御と同様である。
【0213】
<変形例>
図5に示した実施例2では、プロセッサ部1内にL2−ASI命令検出部21が設けられている。そして、L2−ASI命令検出部21が検出したASIコマンドは、L2キャッシュ制御部30内のASI命令解釈部31から、JTAGコマンド制御部40のレジスタに書き込まれている。また、JTAGコマンド制御40にて読み出された動作履歴は、L2キャッシュ制御部30内のコマンド完了通知部およびロードデータ部33から、プロセッサ部1に引き渡されている。この構成は、実施例1の入力部2と出力部3とが、L2キャッシュ制御部にある構成を例示している。この構成は、実施例3の図16においても同様である。しかし、本処理装置は、このような構成に限定される訳ではない。
【0214】
例えば、入力部2、および出力部3が、プロセッサ部1内に組み込まれてもよい。例えば、L1キャッシュ制御部20がASI命令解釈部31を有するようにすればよい。より具体的には、ASI空間番号と、ASI空間内の仮想アドレスの下位ビットで指定されるレジスタを判断する回路ブロックが、L1キャッシュ制御部20に設けられればよい。そして、L1キャッシュ制御部20が『ASI_CMD_ACCESS_REG』命令と、『ASI_CMD_RECEIVE_REG』命令のいずれが入力されたかを判定すればよい。そのためには、仮想アドレスの下位ビット中の最低1ビットが、指定されればよい。
【0215】
そして、L1キャッシュ制御部20が、JTAGコマンドのデータパターンをL2キャ
ッシュ制御部30内のJTAGコマンド制御40に設けられたJTAGコマンド可否検証部41に書き込むようにすればよい。また、JTAGコマンド制御40のロードデータ部43が、L1キャッシュ制御部20内のロードデータ部23に、ヒストリRAMから読み出した動作履歴を引き渡すようにすればよい。この場合、L2キャッシュ制御部30の代わり、例えば、データ伝送路が設けられればよい。このような構成は、図16に示す実施例3においても同様に可能である。
【実施例4】
【0216】
本実施例4では、入力部2と出力部3をプロセッサ部1に含める構成例を説明する。他の構成および作用は、実施例1から3と同様である。そこで、実施例1から3と同様の構成要素については、同一の符号を付してその説明を省略する。また、実施例1から3で説明された構成要素は、可能な範囲で、本実施例4の構成に適用される。
【0217】
本実施例では、特権レジスタを参照する命令手段に、JTAGコマンド制御部40へのインターフェースが、追加割り当てされる。図17は、特権命令を用いた制御による、実施例1と同様の制御を実行する処理装置の構成例である。特権命令は、プロセッサ部1の状態、プログラムの実行状態等を制御する命令、あるいは、入出力装置とCPUあるいはメインメモリとの間で、データ転送する命令を含む。
【0218】
本実施例では、例えば、プロセッサ部1の既存の命令セットに含まれる特権命令が利用される。特権命令は、例えば特権I/O命令と定義される。この特権命令の空きフィールド(オペランドを直接指定するフィールド)に、『ASI_CMD_ACCESS_REG』、『ASI_CMD_RECEIVE_REG』の2つのコマンドを識別する2ビット(以下、識別ビット[0:1]と呼ぶ)を設ける。例えば、識別ビット[0:1]="01"は、特権
I/O命令が『ASI_CMD_ACCESS_REG』を指定すると定義する。また、例えば、識別ビット[0:1]="10"は、特権I/O命令が『ASI_CMD_RECEIVE_REG』を指定すると定義する。
【0219】
そして、特権I/O命令を検出するとともに、識別ビット[0:1]を検出する回路ブロッ
クとして、特権命令検出部11Cが命令処理装置11内に設けられる。特権命令検出部11Cは、命令処理装置11内で、特権命令を検出する既存の回路ブロックと識別ビット[0:1]を検出する回路とを含む。
【0220】
特権命令検出部11Cは、特権I/O命令に識別ビット[0:1]が設定されていると、『
ASI_CMD_ACCESS_REG』あるいは『ASI_CMD_RECEIVE_REG』として検知する。すると、特権命令検出部11Cは、『ASI_CMD_ACCESS_REG』あるいは『ASI_CMD_RECEIVE_REG』の命令コードをL1キャッシュ制御部20内のレジスタ21Cに書き込む。また、このとき、特権命令検出部11Cは、演算器12からストアデータ部に、JTAGコマンド制御部40に引き渡されるデータパターンをストアレジスタ22に書き込むように指示する。したがって、処理装置は、特権I/O命令実行前に、演算器12に、JTAGコマンド制御部40に引き渡されるデータパターンを生成し、準備しておくことになる。
【0221】
L1キャッシュ制御部20Bは、レジスタ21Cに上記命令コードが書き込まれると、その命令コードをそのままL2キャッシュ制御部30Bのレジスタ31Cに書き込む。また、ストアデータ部23は、書き込まれたデータをL2キャッシュ制御部30のストアデータ部32に送出する。
【0222】
L2キャッシュ制御部30Bは、上記命令コードが書き込まれると、その命令コードをそのままJTAGコマンド制御部40のJTAGコマンド実行可否検証部41に転送する
。また、このとき、ストアデータ部30は、書き込まれたデータをJTAGコマンド実行可否検証部41に転送する。以降の処理は、実施例1−3と同様である。
【0223】
以上のような処理をユーザプログラムから実行するために、コンパイラは、まず、演算器12にて、JTAGコマンド制御部40に引き渡すべきデータパターンを用意する。このようなデータパターンは、メモリ上に定数として設定しておき、演算器12に送出されるものでもよい。そして、コンパイラは、プログラム中に、特権I/O命令を発行するシステムコール(OSへの要求)を呼び出せばよい。そして、コンパイラは、その特権I/O命令のオペランド(空きフィールド)に、識別ビット[0:1]を設定しておけばよい。
【0224】
一般的なCPU等の処理装置はJTAGコマンドを備える。しかし、ユーザプログラムを実行する処理装置は、JTAGコマンドを直接実行することはできない。本方式によって、ユーザプログラムからのJTAGコマンドが利用できるようになる。その場合、JTAGコマンドは、ユーザに開放できるJTAGコマンドと、ユーザに開放できないJTAGコマンドとに分けられる。そして、制限された範囲でJTAGコマンドがユーザに開放される。
【0225】
上記構成では、特権命令検出部11Cが、特権I/O命令および識別ビット[0:1]を判
定し、JTAGコマンド制御部40宛にデータを送出する。この点で、実施例1の入力部2と出力部3がプロセッサ1内に含まれる例と考えることができる。
【0226】
さらに、一般的な方式として他には、プロセッサ部1の命令セットに、キャッシュを介在させないで物理メモリにアクセスする新命令コードを追加して、その命令コードにより、本方式のインターフェースを形成してもよい。すなわち、新命令コードが命令処理装置11で検出されたときに、L1キャッシュ制御部20、L2キャッシュ制御部30、さらに、JTAGコマンド制御部40に、JTAGコマンドのデータパターンが引き渡されるようにすればよい。
【実施例5】
【0227】
上記実施例1から4では、処理装置のユーザプログラムからJTAGコマンド制御部40を通じて、ヒストリRAMに記録された動作履歴を読み出すインターフェースが例示された。本実施例では、その場合に、監視対象のユーザプログラム(以下、被監視プログラム)と、その被監視プログラム実行時の動作履歴を読み出す監視プログラムとが、それぞれ異なる並行プロセスで実行される処理装置の例を説明する。被解析プログラムの実行と並行して、監視プロセスを起動した方が、処理装置での処理が簡潔となる場合がある。さらに、バイナリデータとして配布されているような被解析プログラムを調査するに当たっては、披解析プログラムの実行と平行して、監視プログラムを起動することで、任意のプログラムを監視することも可能となる。
【0228】
図18は、処理装置で実行される被監視プログラムの処理を示すフローチャートである。図18に示す処理では、まず、処理装置は、監視プログラムのプロセスを起動する(S11)。監視プログラムの詳細は、別途、図19および図20に例示される。プロセスが起動されると、起動元のプログラムとは異なる実行環境が起動されたプログラムに付与されるようにしてもよい。ここでは、例えば、起動元の被解析プログラムは、プロセッサ部1−1で実行され、起動された監視プログラムは、プロセッサ部1−2で実行されるとの仮定がなされている。
【0229】
次に、処理装置は、JTAGコマンドを、例えば実施例2に例示した『ASI_CMD_ACCESS_REG』によって書き込む(S12)。このとき、処理装置は、採取するイベントの種類、イベントを採取するときの条件をJTAGコマンドとともに指定する
。なお、JTAGコマンドの書き込みは、例えば、実施例3、4に例示したインターフェースによるものでもよい。これによって、JTAGコマンドが、JTAGコマンドに引き渡され、履歴情報が取得される。なお、JTAGコマンド書き込み時のエラー処理等は、ここでは、省略されている。ただし、S12の処理では、図7、図8に示したエラー処理の手順が実行されるようにしてもよい。
【0230】
次に、処理装置は、プログラムの処理を実行する(S13)。ここで、プログラムの処理とは、被解析プログラムが本来実行すべきアプリケーションの処理である。そして、処理装置は、プログラムの処理を終了するか否かを判定する(S14)。終了する場合としては、例えば、実行すべきデータ処理、演算等が終了した場合、あるいはユーザインターフェースを通じて、ユーザから終了の指令を受け取った場合が想定される。
【0231】
プログラム処理が終了しない場合、処理装置は、制御をS13に戻す。一方、プログラム処理が終了する場合には、処理装置は、監視プログラムを停止させる(S15)。監視プログラムは、例えば、被解析プログラムから監視プログラムへのメッセージの送信、共有メモリを通じた指示等で、監視プログラムに終了を通知することも可能である。そして、被解析プログラムは処理を終了する。
【0232】
図19は、監視プログラムの処理を例示する図である。この処理では、処理装置、例えば監視プログラムのプロセスが割り当てられたプロセッサ部1−2は、実施例2に例示した『ASI_CMD_RECEIVE_REG』コマンドを起動する(S111)。なお、実施例2のASI経由のコマンドに代えて、例えば、実施例3、4に例示したインターフェースによるコマンドが起動されてもよい。S111の処理を実行する処理装置のプロセッサ部1が取得部に相当する。
【0233】
そして、処理装置は、データパターンのJDR(ヒストリRAMに記録されていたイベントの情報)をバッファに読み出す(S112)。ここで、バッファとは、例えば32ビットのJDRを所定個数一時的に保持するメモリ上の領域である。
【0234】
次に、処理装置は、所定回数読み出しか否かを判定する(S113)。ここで、所定回数読み出すのは、データパターンのJDRのデータサイズが、ヒストリRAM容量より小さい場合があるからである。例えば、ヒストリRAMが、32ビット×1024個=1KBの容量がある場合、処理装置は、データパターンのJDR(32ビット)を通じて、1024回の読み出しを繰り返すことになる。そこで、まだ、所定回数読み出していない場合には、処理装置は、制御をS111に戻す。これにより、処理装置は、JTAGコマンド制御部40を通じて、次のデータをヒストリRAMから読み出す処理を繰り返す。
【0235】
一方、所定回数の読み出しが終了した場合には、処理装置は、バッファの内容、すなわち、ヒストリRAMに記録されていたイベントの情報を履歴ファイルに蓄積する(S114)。ここで、履歴ファイルは、例えば、図15に示した内蔵外部記憶装置203のファイルである。また、蓄積とは、追加書きすることを意味する。S114の処理を実行する処理装置のプロセッサ部1は、履歴結合部に相当する。なお、処理装置は、解析プログラム実行時に、S114の処理で作成された履歴ファイルと、過去に作成された履歴ファイルをさらに結合するようにしてもよい(図14のS4参照)。そのような解析プログラムを実行する処理装置のプロセッサ部1も、履歴結合部に相当する。
【0236】
次に、処理装置は、所定時間待つ(S115)。所定時間は、例えば、ユーザがユーザインターフェース経由で、処理装置に設定した値である。そして、所定時間が経過すると、処理装置は、プロセスを終了するか否かを判定する(S116)。プロセスの終了は、例えば、メッセージの送信、共有メモリを通じた指示等で、被監視プログラムから通知さ
れる。プロセスを終了しない場合、処理装置は、制御をS111に戻す。このようにして、所定時間間隔で、被監視プログラムから停止の指示を受けるまで、記録された動作履歴の読み出しを継続することになる。一方、被監視プロセスから終了の指示を受けると、監視プログラムは、プロセスを終了する。なお、所定時間は0であってもよい。この場合には、処理装置は、待ち時間なしでS111からS116までの処理を繰り返すことになる。ただし、待ち時間なしでも、S111からS115の処理には、処理時間が必要である。
【0237】
このように、本実施例の処理装置では、所定の時間間隔で、断続的にJTAGコマンド制御部40から、実施例1から4で説明したインターフェースを通じて、ヒストリRAMに記録されたイベントの情報が収集され、所定の履歴ファイルに蓄積される。本処理装置は、図18の被監視プログラムを実行中に、JTAGコマンド制御部40に対して、ヒストリRAMへの動作履歴の記録を指示する。そして、本処理装置は、被監視プログラムの実行と並行して、監視プログラムを実行し、所定の時間間隔で、動作履歴を読み出すことができる。
【0238】
図20に、監視プログラムの他の処理例を示す。図20では、ヒストリRAMが十分でない場合、例えばヒストリRAMが1回のイベントの発生を記録する容量を備える場合の監視プログラムの処理を例示する。図20の処理では、図19にあったS112からS114までの処理が、S112Aに変更されている。すなわち、ヒストリRAMが1回のイベントの発生を記録する容量に制限される場合には、データパターンのJDRを通じた1回の読み出し処理で、ヒストリRAMの動作履歴が読み出される。この場合には、処理装置は、読み出した動作履歴をそのまま履歴ファイルに蓄積すればよい(S112A)。そして、処理装置は、所定時間待って(S115)、S111に制御を戻し、図19と同様の動作を繰り返せばよい。
【0239】
このような監視プログラムの処理により、ヒストリRAMを備えていない、1回のイベントを記録する手段を有する処理装置においても、解析機能が実現される。すなわち、図20の監視プログラムの処理によれば、JTAGコマンド制御部40が少なくとも1回のイベントを記録し、読み出しをする手段を有していればよい。すると、上記監視プログラムによるヒストリファイルへの蓄積処理によって、十分なヒストリRAMを有する処理装置と同等の解析機能が提供される。1回のイベントを長期に渡って継続して蓄積した履歴ファイルが統計的に処理されることによって、短時間に取得された多数のイベントの記録と同様とみなされるからである。
【0240】
すなわち、処理装置が少なくとも1回のイベントを記録し、読み出しをする手段を有することができれば、パフォーマンス解析が実現できる。この場合、図20の監視プログラムの処理で、S111−S112Aの処理に要する時間、JTAGコマンド制御部40は、イベントを保持すればよい。なお、S111−S112Aの処理に要する時間に、複数回採取対象のイベントが発生した場合には、最新のイベントの記録が、JTAGコマンド制御部40から監視プログラムに引き渡されることになる。
【0241】
<その他の変形例>
様々なヒストリ情報を、どのようなタイミングで採取し、どのようにその情報を解析し、どのように性能向上にフィードバックしていくかの詳細については、上記以外に様々な手法が存在する。しかしながら、上記で述べたにように、目的に応じたヒストリ情報を選択して取得し、その結果を様々な手法で解析することで、性能向上に向けた取り組みをすることができる。
【0242】
本処理装置は、JTAGコマンドから一部分を選択してユーザに開放する。このため、
本処理装置のユーザは、JTAGコマンドが持つ豊富で強力な機能を、安全にユーザが使用することができる。ただし、ユーザがOSを通じて非公開の機能を利用できるように、そのような機能がOS経由で起動されるようにしてもよい。そのような機能は、一般には開放されないが、システム管理用途にユーザに使用され得る。そうすると、例えば、ユーザは、JTAGコマンドが備えるクロック制御機構を使って、OSからCPUのクロックを起動したり停止したり、動作周波数を変更することも可能となる。また、ユーザは、JTAGコマンドが備えるキャッシュメモリ容量の変更機能を使って、OSなどからキャッシュ容量を変更することによる電力対策を行うことも可能となる。
【0243】
さらに、本処理装置には、実装されているさらに多くのJTAGコマンドを開放する動作モードが設けられてもよい。そのような動作モードでは、ユーザは、CPUの設計検証を実動作環境で行うに当たって、プログラム上の任意の場所にJTAGコマンドを結びつけることができるようになる。これにより、デバッグ用途での設計者向けの機能が拡張可能となる。
【0244】
また別の例としては、例えば、プログラムがコンパイラ最適化により命令実行順序が入れ替えられる場合の解析に適用できる。特に、ハードウェアはアウトオブオーダ実行によりコンパイラが入れ替えた命令の実行順序を、再度ハードウェアの状況に応じて入れ替えている。このような処理のため、従来、プログラマ、コンパイラ開発者、ハードウェア発者が意図した通りに処理装置が動作しているかどうかを知ることが困難であった。すなわち、従来、チューニングの適否を確認するため、期待した性能が出ているかどうかだけが確認されていた。したがって、ユーザが、予期せぬ性能低下に遭遇したとき、問題とその原因を把握することが困難であった。上記複数の実施例で示したJTAGコマンド実行機能を用いることで、予期せぬ性能低下に遭遇したときの解析手段が提供される。
【符号の説明】
【0245】
1 プロセッサ部
2 入力部
3 出力部
4 管理部
5 履歴記録部
11 命令処理装置
12 演算器
13 L1命令キャッシュ
14 L1オペランドキャッシュ
20 L1キャッシュ制御部
21 ASI命令検出部
22,32 ストアデータ部
23 ロードデータ部
30 L2キャッシュ制御部
31 ASI命令解釈部
33 コマンド完了通知部およびロードデータ部
40 JTAGコマンド制御部
41 JTAGコマンド実行可否検証部
42 JTAGコマンド実行部
43 ロードデータ部
51,52,53,54,55,56 ヒストリRAM
51A、52A ヒストリ制御部
100 サービスプロセッサ

【特許請求の範囲】
【請求項1】
一連の命令を含む実行対象のプログラムを実行するプロセッサ部を含む処理装置であって、
前記処理装置の動作履歴を記録する履歴記録部と、
前記履歴記録部による記録処理を制御するとともに、前記履歴記録部に記録された前記動作履歴を読み出す管理部と、
前記実行対象のプログラム中の命令のうち、前記管理部宛の制御命令を前記管理部に引き渡す処理を起動する起動命令を検出し、前記起動命令にしたがって前記制御命令を前記管理部に引き渡す入力部と、
前記管理部が読み出した動作履歴を受け取る出力部と、を備える処理装置。
【請求項2】
前記動作履歴の記録対象となる動作の種類と、その動作が取得されたときに動作履歴として記録する記録条件とが指定される履歴指定部と、
前記履歴指定部への指定にしたがって前記履歴記録部への記録を制御する履歴制御部と、をさらに備え、
前記管理部には、前記制御命令とともに、前記動作の種類と前記記録条件とが入力され、
前記管理部は、前記制御命令にしたがって、前記入力された前記動作の種類と前記記録条件とを前記履歴指定部に設定し、
前記履歴記録部は、前記記録条件が満たされているときに前記指定された動作の種類の動作履歴を記録する請求項1に記載の処理装置。
【請求項3】
前記記録条件は、前記プログラム中のいずれかの命令の指定を含み、前記プロセッサ部が前記指定された命令を実行することが、記録開始の条件または記録停止の条件とされている請求項2に記載の処理装置。
【請求項4】
前記実行対象のプログラム中の命令または前記命令に指定されるデータを格納するメモリ上のアドレスでのキャッシュミスの検出回数を、前記命令またはデータをキャッシュに登録するときのインデックスアドレスごとに集計する手段をさらに備える請求項1から3のいずれか1項に記載の処理装置。
【請求項5】
前記履歴記録部は、記録容量の限界に相当する記録領域の末端まで前記動作履歴を記録した後に、記録領域の先頭から新たな動作履歴を記録する環状記録部と、
前記管理部からの制御によって前記動作履歴の記録を開始するときに、記録の開始を示す所定の識別情報を設定する識別情報設定部と、を有する請求項1から4のいずれか1項に記載の処理装置。
【請求項6】
前記プロセッサ部が前記プログラムの実行を開始した後の複数の時点で、前記出力部から動作履歴を取得する取得部と、
前記複数の時点でそれぞれ取得された動作履歴を結合し、単一のファイルに格納する履歴結合部と、をさらに備える請求項1から5のいずれか1項に記載の処理装置。
【請求項7】
前記プロセッサ部が命令および前記命令に指定されるデータにアクセスするアドレス空間は、
前記起動命令、前記管理部宛の制御命令、および前記制御命令に指定されるデータが格納される第1のアドレス空間と、
前記起動命令以外の命令およびその命令に指定されるデータが格納される少なくとも1つの第2のアドレス空間と、を含む請求項1から6のいずれか1項に記載の処理装置。
【請求項8】
一連の命令を含む実行対象のプログラムを実行するプロセッサ部含む処理装置が実行する履歴取得方法であって、前記処理装置は、
前記処理装置の動作履歴を記録する履歴記録部と、
前記履歴記録部による記録処理を制御するとともに、前記履歴記録部に記録された前記動作履歴を読み出す管理部と、を含み、
前記プロセッサ部が、前記実行対象のプログラム中の命令のうち、前記管理部宛の制御命令を前記管理部に引き渡す処理を起動する起動命令を検出し、前記起動命令にしたがって前記制御命令を前記管理部に引き渡すステップを実行し、
前記管理部が前記制御命令にしたがって前記履歴記録部に前記処理装置の動作履歴を記録させるステップを実行し、
前記管理部が前記履歴記録部から動作履歴を読み出すステップを実行し、
前記プロセッサ部が、前記管理部が読み出した前記動作履歴を前記管理部から受け取るステップを実行する履歴取得方法。

【図1】
image rotate

【図2】
image rotate

【図3A】
image rotate

【図3B】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate


【公開番号】特開2010−218367(P2010−218367A)
【公開日】平成22年9月30日(2010.9.30)
【国際特許分類】
【出願番号】特願2009−65959(P2009−65959)
【出願日】平成21年3月18日(2009.3.18)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】