(57)【要約】【課題】ユーザプログラム実行時の処理装置の内部の動作状況を確認する技術を提供する。【解決手段】処理装置は、一連の命令を含む実行対象のプログラムを実行するプロセッサ部を含む処理装置であって、処理装置の動作履歴を記録する履歴記録部と、履歴記録部による記録処理を制御するとともに、履歴記録部に記録された動作履歴を読み出す管理部と、実行対象のプログラム中の命令のうち、管理部宛の制御命令を管理部に引き渡す処理を起動する起動命令を検出し、起動命令にしたがって制御命令を管理部に引き渡す入力部と、管理部が読み出した動作履歴を管理部から受け取る出力部とを備える。【選択図】図１
2010218367.tif 000002
【特許請求の範囲】
【請求項１】
一連の命令を含む実行対象のプログラムを実行するプロセッサ部を含む処理装置であって、
前記処理装置の動作履歴を記録する履歴記録部と、
前記履歴記録部による記録処理を制御するとともに、前記履歴記録部に記録された前記動作履歴を読み出す管理部と、
前記実行対象のプログラム中の命令のうち、前記管理部宛の制御命令を前記管理部に引き渡す処理を起動する起動命令を検出し、前記起動命令にしたがって前記制御命令を前記管理部に引き渡す入力部と、
前記管理部が読み出した動作履歴を受け取る出力部と、を備える処理装置。
【請求項２】
前記動作履歴の記録対象となる動作の種類と、その動作が取得されたときに動作履歴として記録する記録条件とが指定される履歴指定部と、
前記履歴指定部への指定にしたがって前記履歴記録部への記録を制御する履歴制御部と、をさらに備え、
前記管理部には、前記制御命令とともに、前記動作の種類と前記記録条件とが入力され、
前記管理部は、前記制御命令にしたがって、前記入力された前記動作の種類と前記記録条件とを前記履歴指定部に設定し、
前記履歴記録部は、前記記録条件が満たされているときに前記指定された動作の種類の動作履歴を記録する請求項１に記載の処理装置。
【請求項３】
前記記録条件は、前記プログラム中のいずれかの命令の指定を含み、前記プロセッサ部が前記指定された命令を実行することが、記録開始の条件または記録停止の条件とされている請求項２に記載の処理装置。
【請求項４】
前記実行対象のプログラム中の命令または前記命令に指定されるデータを格納するメモリ上のアドレスでのキャッシュミスの検出回数を、前記命令またはデータをキャッシュに登録するときのインデックスアドレスごとに集計する手段をさらに備える請求項１から３のいずれか１項に記載の処理装置。
【請求項５】
前記履歴記録部は、記録容量の限界に相当する記録領域の末端まで前記動作履歴を記録した後に、記録領域の先頭から新たな動作履歴を記録する環状記録部と、
前記管理部からの制御によって前記動作履歴の記録を開始するときに、記録の開始を示す所定の識別情報を設定する識別情報設定部と、を有する請求項１から４のいずれか１項に記載の処理装置。
【請求項６】
前記プロセッサ部が前記プログラムの実行を開始した後の複数の時点で、前記出力部から動作履歴を取得する取得部と、
前記複数の時点でそれぞれ取得された動作履歴を結合し、単一のファイルに格納する履歴結合部と、をさらに備える請求項１から５のいずれか１項に記載の処理装置。
【請求項７】
前記プロセッサ部が命令および前記命令に指定されるデータにアクセスするアドレス空間は、
前記起動命令、前記管理部宛の制御命令、および前記制御命令に指定されるデータが格納される第１のアドレス空間と、
前記起動命令以外の命令およびその命令に指定されるデータが格納される少なくとも１つの第２のアドレス空間と、を含む請求項１から６のいずれか１項に記載の処理装置。
【請求項８】
一連の命令を含む実行対象のプログラムを実行するプロセッサ部含む処理装置が実行する履歴取得方法であって、前記処理装置は、
前記処理装置の動作履歴を記録する履歴記録部と、
前記履歴記録部による記録処理を制御するとともに、前記履歴記録部に記録された前記動作履歴を読み出す管理部と、を含み、
前記プロセッサ部が、前記実行対象のプログラム中の命令のうち、前記管理部宛の制御命令を前記管理部に引き渡す処理を起動する起動命令を検出し、前記起動命令にしたがって前記制御命令を前記管理部に引き渡すステップを実行し、
前記管理部が前記制御命令にしたがって前記履歴記録部に前記処理装置の動作履歴を記録させるステップを実行し、
前記管理部が前記履歴記録部から動作履歴を読み出すステップを実行し、
前記プロセッサ部が、前記管理部が読み出した前記動作履歴を前記管理部から受け取るステップを実行する履歴取得方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ等の処理装置の動作状況を収集し、解析するための技術に関する。
【背景技術】
【０００２】
コンピュータ等の処理装置において、ハードウェアの動作状況を解析するため、様々な技術が提案されている。
【０００３】
例えば、パフォーマンス・モニタ回路（ＰＭ回路）および中央演算装置（ＣＰＵ）、入出力（Ｉ／Ｏ）装置等の複数のデバイスをデータバスに接続したシステムが例示される。このようなシステムでは、ＰＭ回路がモニタ対象である事象の検出を行い、モニタした結果をＰＭ回路内部の記録領域に格納することが提案されている。また、カウンタが比較値と一致したときプロセッサが割り込まれるように、比較レジスタと割り込みラインを有するシステムが例示される。さらに、情報処理装置内の命令プロセッサに組み込まれている、ハードウェアモニタと呼ばれるＣＰＵ性能プロファイリングにおいて、ある一定の閾値を超える回数の測定イベントが発生した際に割込みを発生する機能が提案されている。
【０００４】
ハードウェアの動作状況解析に関する技術を開示する文献として、例えば以下のものがあげられる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特表２００６−５２４３７５号公報
【特許文献２】特開２００５−３３９１０７号公報
【特許文献３】特開平０８−３０４９４号公報
【特許文献４】特開２００５−２１５８１６号公報
【特許文献５】特開２００７−２４９５３４号公報
【特許文献６】特開２００７−２７２６９２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
従来、コンピュータ等の処理装置は、パフォーマンスアナライザ、パフォーマンス・モニタ等によって、命令実行時間およびキャッシュミス回数を観測することで、期待した性能が出ているか否かを確認することができた。しかし、従来のパフォーマンスアナライザ等は、ユーザプログラム実行時に期待した性能が出ていないときは、その性能向上のための解決手段としては十分ではなかった。例えば、上記技術によるイベント回数等の観測結果からは、ユーザは、なぜ処理装置が期待した動作をしていないのかを知ることはできなかった。
【０００７】
開示の実施形態の目的は、ユーザプログラム実行時の処理装置の内部の動作状況を確認する技術を提供することである。
【課題を解決するための手段】
【０００８】
開示の実施形態の一態様は、一連の命令を含む実行対象のプログラムを実行するプロセッサ部を含む処理装置であって、処理装置の動作履歴を記録する履歴記録部と、履歴記録部による記録処理を制御するとともに、履歴記録部に記録された動作履歴を読み出す管理部と、実行対象のプログラム中の命令のうち、管理部宛の制御命令を管理部に引き渡す処
理を起動する起動命令を検出し、起動命令にしたがって制御命令を管理部に引き渡す入力部と、管理部が制御命令にしたがって読み出した動作履歴を管理部から受け取る出力部と、を備える処理装置として例示される。
【発明の効果】
【０００９】
開示の技術によれば、ユーザは、ユーザプログラム実行時の処理装置の内部の動作状況を確認することができる。
【図面の簡単な説明】
【００１０】
【図１】実施例１に係る処理装置の構成図である。
【図２】実施例２に係る処理装置の構成を例示する図である。
【図３Ａ】ＡＳＩ空間直接指定コマンドの例である。
【図３Ｂ】ＡＳＩ空間間接指定コマンドの例である。
【図４】NACK_codeの定義を例示する図である。
【図５】ＡＳＩコマンド経由でＪＴＡＧコマンドが各処理部へと受け渡される経路の構成を説明する図である。
【図６】ＪＴＡＧコマンド制御部の詳細構成を例示する図である。
【図７】コマンド発行手順のフローチャートを例示する図（その１）である
【図８】コマンド発行手順のフローチャートを例示する図（その２）である
【図９】ロックの獲得および開放の実施を試みたときのコマンドデータへの設定値、および、その設定値によるレジスタの状態の変化を例示する図である。
【図１０】Ｌ２キャッシュ制御部のヒストリＲＡＭのヒストリ制御部と、レジスタCORE_DEBUG_REG1のビット構成との関係を示す図である。
【図１１】命令処理装置のヒストリＲＡＭのヒストリ制御部と、ヒストリ制御部での制御を指定する制御レジスタとの関係を示す概念図である。
【図１２】Ｌ２キャッシュ制御部のヒストリＲＡＭに記録されるデータフォーマットを例示する図である。
【図１３】履歴の記録を開始するときに、識別情報を埋め込む回路構成を例示する図である。
【図１４】本処理装置で実行されるユーザプログラムの処理を例示する図である。
【図１５】ユーザプログラムを実行するコンピュータの構成を例示する図である。
【図１６】ノンキャッシュ空間へのアクセスを使用した処理装置の構成例である。
【図１７】特権命令を用いた制御による、処理装置の構成例である。
【図１８】処理装置で実行される被監視プログラムの処理を示すフローチャートである。
【図１９】監視プログラムの処理を例示する図である。
【図２０】他の監視プログラムの処理を例示する図である。
【発明を実施するための形態】
【００１１】
以下、図面を参照して本開示の技術の一態様（以下、実施形態という）に係る処理装置を説明する。本実施形態の構成は例示であり、本処理装置は実施形態の構成には限定されない。
【実施例１】
【００１２】
コンピュータの性能解析には、パフォーマンスアナライザと呼ばれる解析ツールが用いられる。コンピュータのユーザは、パフォーマンスアナライザによって、例えば、コンピュータがプログラムを実行するときの命令実行時間およびキャッシュミス回数等のイベント回数を観測することができる。このような観測結果を基に、ユーザは、コンピュータで実行されるプログラムのチューニングを行う。
【００１３】
例えば、コンピュータで本来想定した以上にキャッシュミスが頻繁に起きている場合を仮定する。そして、キャッシュミスの原因が、異なる物理アドレスに格納されたデータによるスラッシングにあったとする。例えば、キャッシュラインの同一インデックスアドレスへ登録されるデータが、キャッシュＷＡＹ数を超えて同時期に使用されているとスラッシングが発生する。
【００１４】
このようなとき、ユーザは、コンピュータ上でキャッシュミス回数を観測することはできる。しかし、キャッシュミスの原因がスラッシングによるものか、あるいは、キャッシュメモリの容量不足に起因するものかを特定することが困難である。また、仮にスラッシングがキャッシュミスの原因であることが分かったとしても、どのアドレスのデータによってスラッシングが発生しているかを知ることは困難である。このため、ユーザは、プログラムによるチューニングを行うための要点、あるいは、原因解明の手がかりをつかめないことがある。そして、このような問題がコンピュータの性能向上のためのチューニングの妨げとなっている。
【００１５】
ユーザがスラッシングやプログラム実行状況を把握できるようにするために、コンピュータのハードウェアは、履歴記録部（ヒストリＲＡＭ（Random Access Memory）ともいう）を備えている。しかし、履歴記録部の操作体系（コマンドともいう）、およびその操作体系を受け付けるインターフェースは、管理用プロセッサからの操作を受け付けるが、ユーザのコンピュータからの操作は受け付けないようになっている。管理用プロセッサは、サービスプロセッサ、あるいは、システム制御装置とも呼ばれ、コンピュータシステムの内部の状況を監視し、あるいは、コンピュータ内部を制御する機能を有する。
【００１６】
しかし、サービスプロセッサへのアクセスは、ユーザに開放されていない。このため、ユーザは、サービスプロセッサを操作することはできない。したがって、ユーザは、ユーザプログラムの実行と同期させて、履歴記録部を利用することができない。例えば、ユーザは、ユーザプログラムの所望の命令列が実行されたタイミングの近傍で、履歴記録部による履歴の蓄積を開始、あるいは、停止することができない。したがって、ユーザが所望の命令列実行のタイミング近傍の履歴を取得するのは困難である。
【００１７】
サービスプロセッサは、ユーザが使用するコンピュータから独立したシステムに存在し、特別な処理体系を持つシステムである。このため、ユーザがサービスプロセッサを使用することは想定されていない。一方、ユーザがサービスプロセッサを使用すると、ユーザは、コンピュータの内部に対する操作、あるいはコンピュータ内部の操作によるコンピュータの各部への限度を超えたアクセスが可能となる。そのため、サービスプロセッサをユーザに開放することには危険が伴い、ユーザに履歴記録部への操作を開放することによって発生する問題への対処が極めて困難であった。
【００１８】
そのため、安全上の配慮から、サービスプロセッサによる履歴記録部からの読み出し結果は、サービスプロセッサおよびサービスプロセッサに接続されたシステムにて利用されている。そして、サービスプロセッサは、ユーザのコンピュータが認識できない独立したシステムである。このような環境では、履歴情報をユーザに提供するために、ネットワークを介してしてサービスプロセッサからユーザのコンピュータシステムへ履歴情報が転送される。このため、履歴情報提供の利便性に問題がある。例えば、ユーザプログラムの実行時に、ユーザ所望の条件下で、コンピュータ内部の動作を履歴記録部に記録することは困難である。
【００１９】
そこで、本実施例では、サービスプロセッサの機能に代えて、ユーザのコンピュータシステムに履歴記録部に蓄積された情報を提供することが可能な技術を例示する。本実施例では、履歴記録部の履歴情報は、安全に、かつ、ユーザのコンピュータの処理と連携して
取得され、ユーザのコンピュータに提供される。ここで、「安全に」とは、例えば、ユーザのコンピュータからコンピュータの障害につながる可能性のあるアクセスがあった場合に、そのようなアクセスを検出し、そのようなアクセスを禁止できる状態をいう。また、「ユーザのコンピュータシステムの処理と連携して取得」とは、例えば、ユーザのコンピュータで、ユーザ指定の処理が実行されたときにコンピュータで発生したイベントを蓄積でき、ユーザに提供できることをいう。すなわち、本実施例では、ユーザのコンピュータがユーザ指定の処理を実行したときに、コンピュータの内部で何が発生したかを示す情報を提供できるようにする。
【００２０】
以下、本実施形態では、コンピュータをコンピュータシステムともいう。コンピュータシステムという用語が使用されるときは、特に、複数のプロセッサ、プロセッサ間を結合するバス、メモリ等を含むものが想定されている場合もある。ただし、本実施形態では、コンピュータとコンピュータシステムとが厳密に区別される訳ではない。
【００２１】
図１に基づいて、実施例１に係る処理装置を説明する。図１は、処理装置の構成図を示す。図１の処理装置は、プロセッサ部１と、入力部２と、出力部３と、管理部４と、履歴記録部５とを含む。図１の処理装置は、例えば、コンピュータのＣＰＵ（Central Processing Unit）、あるいは、ＣＰＵを含むコンピュータシステムとして例示される。
【００２２】
プロセッサ部１は、ユーザプログラムを実行する。ユーザプログラムは、プロセッサ部１が実行可能な命令コードの列を含む。ユーザプログラムは、例えば、仮想アドレスで指定される仮想アドレス空間に対応するメモリ上の位置に格納される。この場合、メモリには、１または複数階層に渡るキャッシュメモリが含まれてもよい。
【００２３】
プロセッサ部１は、ユーザプログラムを実行することで、様々な機能を実現する。その場合に、プロセッサ部１は、メモリ上のユーザプログラムから次に実行すべき命令を読み出し、読み出した命令をデコードして実行し、命令の実行結果をメモリに格納する。
【００２４】
履歴記録部５は、処理装置内の様々なイベント、あるいは動作状況を動作履歴として記録する。処理装置内の様々なイベントとは、プロセッサ部１がアクセスしたメモリのアドレス、キャッシュメモリのヒットまたはミスの状況、特定の命令の実行の開始、完了、特定命令の実行回数等を含む。
【００２５】
管理部４は、処理装置内の各部の監視、あるいは、各部を診断する診断機能を提供する。例えば、管理部４は、履歴記録部５に、動作履歴の取得の開始、および動作履歴取得の停止を指示する。また、管理部４は、履歴記録部５に、動作履歴の取得の開始、あるいは動作履歴取得の停止の条件を指定する。そのような条件が管理部４により指定された場合、履歴記録部５は指定された条件が満足されたときに、動作履歴の取得を開始し、あるいは停止する。例えば、処理装置内で指定のイベントが発生したときに、履歴記録部５は処理装置内部の動作履歴を取得し、あるいは、取得を停止する。また、履歴記録部５により、管理部４から指定されたイベントの回数が計数される。そして、管理部４から指定されたイベント回数が所定値に達したときに、履歴記録部５による処理装置内部の動作履歴の記録が開始され、あるいは、記録が停止される。このように、管理部４は、履歴記録部５での動作履歴の記録処理を制御する。
【００２６】
処理装置には、例えば、サービスプロセッサ１００が接続される。サービスプロセッサ１００は、管理部４との間でデータを授受するインターフェースを有する。サービスプロセッサ１００は、インターフェースを通じて管理部４にコマンドを送り、処理装置内の動作状況の監視、動作履歴の取得の開始、あるいは停止等を管理部４に要求する。サービスプロセッサ１００による要求にしたがって、管理部４は、処理装置内の各部の監視、診断
機能、動作履歴の取得等を実行する。そして、管理部４は、監視結果、診断結果、あるいは、動作履歴を、インターフェースを通じてサービスプロセッサ１００に引き渡す。サービスプロセッサ１００は、管理部４とのインターフェースによって、処理装置の監視、診断機能を実行する。サービスプロセッサ１００による監視や診断の機能は、通常、ユーザには開放されない。サービスプロセッサ１００の処理では、処理装置の内部がアクセスされるため、サービスプロセッサ１００の機能がユーザにそのまま開放されると、処理装置の動作が影響を受ける場合もあるからである。
【００２７】
そこで、本実施例の処理装置は、プロセッサ部１から管理部４にアクセスするための入力部２、および処理装置内部で取得された情報を管理部４から受け取る出力部３を有している。管理部４は、入力部２から制御命令を受け取り、受け取った制御命令による要求を受け付け、処理装置内の各部の監視、診断機能、動作履歴の取得等を実行する。この場合、サービスプロセッサ１００からの要求とは異なり、プロセッサ部１から受け付け可能な要求が限定できればよい。すなわち、管理部４は、プロセッサ部１からの特定の要求を受け付けなければよい。ここで、特定の要求には、例えば、処理装置の動作への影響が大きいと考えられるものが含まれる。
【００２８】
プロセッサ部１が実行する命令には、通常の演算命令のようにプロセッサ部１自身が実行する第１の種類の命令と、入力部２に引き渡される第２の種類の命令が含まれる。入力部２は、第２の種類の命令の中から起動命令と呼ばれる命令を検出する。起動命令は、管理部４で実行される制御命令を管理部４へ引き渡すよう、入力部２に指示する命令である。起動命令には、入力部２に書き込むべき制御命令および制御命令に伴うデータが指定される。
【００２９】
入力部２は、管理部４からの起動命令を検出すると、検出した起動命令に指定されている制御命令およびデータを取得する。そして、入力部２は、取得した制御命令とデータとを、管理部４の入力インターフェース４Ａに引き渡す。入力部２は、管理部４内のレジスタなどの格納先に制御命令とデータとを格納し、管理部４の処理を起動する。
【００３０】
管理部４は、入力部２から制御命令を入力インターフェース４Ａで受け取ると、まず、サービスプロセッサ１００からの要求による処理が実行中でないことを確認する。サービスプロセッサ１００からの要求による処理が実行中である場合、入力部２からの制御命令は実行されない。すなわち、管理部４は、サービスプロセッサ１００からの処理を優先する。
【００３１】
一方、サービスプロセッサ１００から要求された処理が実行中でない場合、管理部４は、入力部２から引き渡された制御命令が、プロセッサ部１からの要求として許容される制御命令か否かを判定する。そして、管理部４は、プロセッサ部１からの要求として許容されない制御命令については、出力インターフェース４Ｂを介して出力部３にエラーを返す。この場合、出力部３はプロセッサ部１にエラーを報告する。
【００３２】
また、管理部４は、プロセッサ部１からの要求として許容される制御命令については、その制御命令にしたがった処理を実行する。例えば、管理部４は、履歴記録部５に動作履歴の取得の開始、あるいは終了を指示し、記録処理を制御する。また、管理部４は、動作状況の監視、動作履歴の取得の開始、あるいは停止等の条件を、制御命令に伴うデータによって指定する。この制御命令に伴うデータは、入力部２を通じてプロセッサ部１で実行されるプログラムから入力されたものである。したがって、プログラムの動作と連係して、処理装置内部のイベント、状態が、履歴記録部５に記録され得る。イベントは、処理装置内部の各装置の動作ということもできる。
【００３３】
また、制御命令には、履歴記録部５からの読み出しを指定する命令が含まれる。そのような制御命令によって管理部４に読み出しが指定されると、管理部４は、履歴記録部５に記録された情報を読み出し、出力インターフェース４Ｂを通じて出力部３に引き渡す。そして、出力部３は、引き渡された履歴記録部５からの情報をプロセッサ部１で実行されるプログラムに引き渡す。
【００３４】
以上述べたように、本実施例の処理装置では、プロセッサ部１は、通常の情報処理で実行される第１の種類の命令と、制御命令を管理部４に引き渡す処理を起動するための起動命令を含む第２の種類の命令とを実行可能である。したがって、ユーザがユーザプログラム中に、第１の種類の命令の他に起動命令を含めることで、ユーザは、プロセッサ部１がユーザプログラムを実行中に、ユーザの所望のタイミングで管理部４での監視、診断機能の実行を要求することができる。したがって、例えば、処理装置内がユーザプログラムを実行したときに、所望の性能が達成されないような場合の処理装置内部の状況に関する情報取得手段が提供される。すなわち、ユーザは、管理部４への診断処理を要求する制御命令を指定して、ユーザプログラム中に起動命令を組み込むことができる。コンパイラがソースプログラムをコンパイルするときに、ユーザプログラムに制御命令および起動命令が組み込まれる。このような管理部４宛の制御命令を指定して、起動命令を埋め込んだプログラムを処理装置に実行させることで、ユーザは、ユーザ所望のタイミングで、ユーザプログラム実行中の処理装置の内部状態を取得できる。
【００３５】
すなわち、本実施例では、サービスプロセッサ１００の機能に代えて、ユーザが利用するコンピュータシステムからの指示に応じて、履歴記録部５が、コンピュータシステムの内部の動作状況を、安全に、かつ、ユーザのコンピュータシステムの処理と連携して採取できる。そして、管理部４が、履歴記録部５で採取された情報をユーザのコンピュータシステムに提供することが可能となる。
【００３６】
なお、図１では、入力部２および出力部３が、プロセッサ部１と異なる回路ブロックに設けられている。しかし、本処理装置の構成がこのような構成に限定される訳ではない。例えば、入力部２および出力部３が、プロセッサ部１内に設けられてもよい。
【実施例２】
【００３７】
実施例２では、処理装置がキャッシュメモリを含む場合を例にして、性能解析を説明する。本実施例２では、履歴記録部の記録処理を制御し、記録された処理装置の動作履歴をユーザに提供するためのさらに具体的な技術を説明する。
【００３８】
＜装置の構成＞
図２は、本実施例に係る処理装置の構成を例示する図である。図２の処理装置は、例えば、コンピュータのＣＰＵ、あるいは、ＣＰＵを含むコンピュータシステムである。本実施例では、処理装置は、複数のプロセッサ部１と、プロセッサ部１からのメモリアクセス等の要求を受け取るＬ２キャッシュ制御部３０と、Ｌ２キャッシュ制御部３０からアクセスされるＬ２（Ｌｅｖｅｌ−２）キャッシュデータ部６１と、各種のインターフェースとを有する。本実施形態では、複数のプロセッサ部１は、個々に示す場合にはプロセッサ部１−１、１−２、１−Ｎ等のように呼ばれる。また、複数のプロセッサ部は、総称してプロセッサ部１と呼ばれる。プロセッサ部１は、プロセッサコア、あるいは、単にコアとも呼ばれる。
【００３９】
プロセッサ部１は、命令処理装置１１と、演算器１２と、Ｌ１（Ｌｅｖｅｌ−１）命令キャッシュ１３と、Ｌ１オペランドキャッシュ１４と、Ｌ１キャッシュ制御部２０とを有する。
【００４０】
命令処理装置１１は、Ｌ１命令キャッシュ１３から取り出した命令をデコードし、デコードした命令の実行を管理する。デコードした命令が演算命令であれば、命令処理装置１１は、演算器１２を使用して演算する。デコードした命令が演算に使用するオペランドデータのロード命令・ストア命令などであれば、命令処理装置１１は、演算器１２を使用してオペランドアドレスを計算する。そして、命令処理装置１１は、計算したオペランドアドレスをＬ１オペランドキャッシュ１４へと送って、所望のアドレスのデータを読み書きする。
【００４１】
Ｌ１キャッシュ制御部２０は、命令処理装置１１から、Ｌ１命令キャッシュ１３へのフェッチ要求や、Ｌ１オペランドキャッシュ１４へのロード・ストア要求を受け取る。そして、Ｌ１キャッシュ制御部２０は、受け取った要求中の仮想アドレスを物理アドレスへとＴＬＢ（Translation Lookaside Buffer）を用いて変換する。アドレスの変換とともに、Ｌ１キャッシュ制御部２０は、キャッシュタグを検索し、所望のアドレスのデータがＬ１キャッシュ上に存在するかどうかを検査する。以下、Ｌ１命令キャッシュ１３、Ｌ１オペランドキャッシュ１４の両方を指していうときには、Ｌ１キャッシュという言葉が用いられる。
【００４２】
要求されたアドレスのデータがＬ１キャッシュ上に存在しているとき、その要求が命令フェッチであれば、Ｌ１キャッシュ制御部２０は、Ｌ１命令キャッシュ１３から取り出したデータを命令処理装置１１へと送る。また、その要求がオペランドフェッチであれば、Ｌ１キャッシュ制御部２０は、Ｌ１オペランドキャッシュ１４から取り出したデータを演算器１２へと送る。また、その要求がストア要求であれば、Ｌ１キャッシュ制御部２０は、演算器１２からストアデータが届くのを待つ。そして、Ｌ１キャッシュ制御部２０は、ストアデータが演算器１２から届いてストア対象アドレスがＬ１キャッシュ上に存在しているのを確認した後、命令実行順序にしたがってストアデータをＬ１オペランドキャッシュへ１４と書き込む。このように、Ｌ１キャッシュは、処理装置内の階層的なキャッシュの構造中で、プロセッサ部１に最も近い階層のキャッシュメモリをいう。また、Ｌ２ャッシュは、Ｌ１キャッシュの次の階層に位置するキャッシュメモリをいう。通常、Ｌ２キャッシュのデータ転送時間は、Ｌ１キャッシュよりも長いが、Ｌ２キャッシュの容量は、Ｌ１キャッシュよりも大きい。
【００４３】
命令フェッチ要求、オペランドのロード要求・ストア要求で使用するアドレスのデータがＬ１キャッシュ上に存在していないとき、すなわちＬ１キャッシュミスが発生したとき、Ｌ１キャッシュ制御部２０は、対象アドレスをＬ２キャッシュ制御部３０へと送る。これにより、Ｌ１キャッシュ制御部２０は、対象データのＬ１キャッシュへの転送をＬ２キャッシュ制御部３０に要求する。
【００４４】
Ｌ２キャッシュ制御部３０は、Ｌ２キャッシュデータ部６１と、他ＣＰＵインターフェース６２と、メモリインターフェース６３と、Ｉ／Ｏインターフェース６４と、ＪＴＡＧインターフェース６５へと接続されている。
【００４５】
Ｌ２キャッシュデータ部６１は、データを格納するキャッシュメモリである。他ＣＰＵインターフェース６２は、図２の処理装置が他の処理装置と通信するためのインターフェースである。メモリインターフェース６３は、主記憶装置（物理メモリともいう）との間でデータを授受するためのインターフェースである。Ｉ／Ｏインターフェース６４は、入出力装置を処理装置と接続するインターフェースである。入出力装置は、例えば、内蔵外部記憶装置、着脱可能記憶装置、ＬＡＮ（Local Area Network）基板等である。ＪＴＡＧインターフェース６５は、サービスプロセッサ１００と接続するためのインターフェースである。
【００４６】
Ｌ２キャッシュ制御部３０は、Ｌ１キャッシュ制御部２０から要求されたアドレスがＬ２キャッシュ上に存在するかどうかを検査する。そして、要求されたアドレスがＬ２キャッシュ上に存在していれば、Ｌ２キャッシュ制御部３０は、要求されたデータをＬ２キャッシュデータ部６１から取り出して、Ｌ１キャッシュへと転送する。
【００４７】
要求されたデータがＬ２キャッシュ上に存在していないとき、Ｌ２キャッシュ制御部３０は、要求されたデータを取り出すために、他ＣＰＵインターフェース６２またはメモリインターフェース６３へと要求を送る。そして、Ｌ２キャッシュ制御部３０は、要求されたアドレスにおいて必要とされるデータを要求先から転送してもらう。さらに、Ｌ２キャッシュ制御部３０は、受け取ったデータをＬ２キャッシュデータ部６１に書き込むとともに、Ｌ１キャッシュへと転送する。
【００４８】
また、図２のように、処理装置は、ファイルシステムなどのＩ／Ｏ装置からの要求を受け取るＩ／Ｏインターフェース６４を備える。Ｉ／Ｏインターフェース６４から要求を受け取ると、Ｌ２キャッシュ制御部３０は、要求されたデータがＬ２キャッシュ上に存在するかどうかを検査する。そして、要求されたデータがＬ２キャッシュ上に存在すれば、Ｌ２キャッシュ制御部３０は、Ｌ２キャッシュデータ部６１またはＬ１オペランドキャッシュ１４から最新のデータを取り出す。そして、Ｌ２キャッシュ制御部３０は、Ｉ／Ｏインターフェース６４を経由して、取り出したデータをＩ／Ｏ装置へと送り返す。
【００４９】
さらに、処理装置は、サービスプロセッサ１００から発行されるＪＴＡＧコマンドを受け取るＪＴＡＧインターフェース６５を備える。ＪＴＡＧ（Joint Test Action Group）
コマンドは、ＣＰＵなどＬＳＩチップを制御するためのコマンド体系が定義されたコマンドである。ＪＴＡＧコマンドは、ＬＳＩの動作を起動し、あるいは、停止する他、ＣＰＵ内部のスキャンチェーンや特定のレジスタの読み出しなど、ＣＰＵの動作を制御する特殊な処理を実行することができる。ＪＴＡＧインターフェース６５から受け取ったコマンドは、Ｌ２キャッシュ制御部３０に備えるＪＴＡＧコマンド制御部４０へと送られる。ＪＴＡＧコマンド制御部４０は、実施例１の管理部４に相当する。ＪＴＡＧコマンド制御部４０は、受け取ったＪＴＡＧコマンドをデコードし、実行する。必要があれば、ＪＴＡＧコマンド制御部４０は、ＪＴＡＧインターフェース６５を通じて実行結果をサービスプロセッサ１００へ送り返す。
【００５０】
また、本実施例では、処理装置は、内部の各装置、例えば、命令処理装置１１、Ｌ１キャッシュ制御部２０、Ｌ２キャッシュ制御部３０、他ＣＰＵインターフェース６２、メモリインターフェース６３、Ｉ／Ｏインターフェース６４等に履歴記録部５１−５６（図２では「ヒストリＲＡＭ」と表記。以下、「ヒストリＲＡＭ」という）を備える。ヒストリＲＡＭ５１−５６は、それぞれの装置で実行した処理の履歴を記録する。なお、以下において、ヒストリＲＡＭ５１−５６を総称する場合には、符号を付さずに単に「ヒストリＲＡＭ」という。
命令処理装置１１が備えるヒストリＲＡＭ５１は、現在実行中の命令アドレスと仕掛かり中の命令のいくつかを記録する機能を有する。仕掛かり中とは、命令フェッチ後、まだ命令のデコードあるいは命令の実行が完了していない状態をいう。Ｌ１キャッシュ制御部２０のヒストリＲＡＭ５２およびＬ２キャッシュ制御部３０のヒストリＲＡＭ５３は、キャッシュパイプラインの動作状況、キャッシュがヒットしたアドレス、ヒットしたときの要求の種別、キャッシュミスしたアドレス、ミスしたときの要求の種別等を記録する機能を有する。他ＣＰＵインターフェース６２のヒストリＲＡＭ５４、メモリインターフェース６３のヒストリＲＡＭ５５、Ｉ／Ｏインターフェース６４のヒストリＲＡＭ５６は、それぞれのインターフェースに届いた要求を記録する機能を有する。
【００５１】
また、ヒストリＲＡＭ５１−５６等を制御するヒストリ制御部が、それぞれのヒストリ
ＲＡＭ５１−５６に付随して設けられている。ヒストリ制御部として、図６のヒストリ制御部５１Ａが例示される。ヒストリ制御部は、ＪＴＡＧコマンド制御部４０からの指示にしたがって、ヒストリＲＡＭ５１−５６に蓄積する履歴情報を複数種類の情報の中から選択できる。ヒストリ制御部は、ＲＡＭ読み書き論理ユニットとも呼ばれる。ヒストリ制御部は、ＪＴＡＧコマンド制御部４０からの要求に応じて、記録する履歴情報を選択し、あるいは、記録するタイミングを指定し、履歴情報をヒストリＲＡＭに記録することができる。なお、「履歴情報の記録」は、以下「記憶」あるいは「採取」とも称する。ヒストリ制御部は、履歴制御部に相当する。
【００５２】
命令処理装置１１およびＪＴＡＧコマンド制御部４０は、履歴記録の開始・停止・読み出し・記録の再開を指示する機能、および採取対象の履歴情報の選択機能を備える。命令処理装置１１およびＪＴＡＧコマンド制御部４０は、ヒストリ制御部のレジスタに、履歴記録の開始・停止・読み出し・記録の再開、各種処理再開のタイミング、および採取対象の履歴情報を指示する。これにより、命令処理装置１１およびＪＴＡＧコマンド制御部４０は、処理装置内のそれぞれの装置で発生した事象の履歴情報を、指定の条件で採取することができる。ヒストリ記録の停止・再開は通常、ＪＴＡＧコマンド制御部４０がＪＴＡＧコマンドでヒストリ制御部に指示する。ただし、特殊な用途として、命令処理装置１１が履歴記録の停止または再開をヒストリ制御部に指示することもできる。
【００５３】
＜コマンドインターフェース＞
本実施例の処理装置では、ＪＴＡＧコマンドのうち、ヒストリ操作に関わるコマンドがユーザに開放される。ここで、ヒストリ操作としては、例えば、ヒストリ記録の開始・停止・読み出し・記録の再開・履歴情報の選択機能が例示できる。そのような装置を実現するため、処理装置は、プロセッサ部１が実行する命令から、ヒストリ操作に関わるコマンドをＪＴＡＧコマンド制御４０に引き渡すインターフェースを有する。以下では、処理装置として、ＳＰＡＲＣ（登録商標）チップを例に説明する。
【００５４】
ＳＰＡＲＣ−Ｖ９命令セットは、ＡＳＩ（Ａｄｄｒｅｓｓ  Ｓｐａｃｅ  Ｉｄｅｎｔｉｆｉｅｒ）コマンドと呼ばれる命令体系を備えている。ＡＳＩコマンドは、通常のロード・ストア命令に付随する情報として、８ビットのＡＳＩ空間番号と呼ばれるＩＤを指示する手段を備える。ＡＳＩ空間番号は、ロード・ストア命令が参照するアドレス空間、例えば、プライマリ・アドレス空間、セカンダリ・アドレス空間、ニュークリアス・アドレス空間等を指定する。ＡＳＩコマンドが入力、すなわちフェッチされると、入力されたＡＳＩコマンドのオペランドに指定された仮想アドレスは、ＴＬＢにより物理アドレスに変換される。すなわち、Ｌ１キャッシュ制御部２０などのプロセッサ部１は、ＡＳＩ空間番号で指定されたアドレス空間に定義された仮想アドレスと物理アドレスとの対に対応する情報をＴＬＢから取り出す。そして、プロセッサ部１は、ＡＳＩコマンドのオペランドに指定された仮想アドレスを物理アドレスに変換する。
【００５５】
ＡＳＩ空間番号は８ビットのＩＤであるため、論理的には２５６個の異なるアドレス空間を指示することが可能である。しかし、実際には、２５６ものアドレス空間は定義されておらず、アドレス空間番号には、割り付けが未定義の番号も存在する。割り付けされていないＡＳＩ空間番号は、既存のＡＳＩ空間以外の用途のために、新たな別の空間の定義に使用されることがある。ＡＳＩ空間番号の新たな定義によって、ＡＳＩ空間番号は、例えば、仮想アドレスそのものを物理アドレスとして扱うアドレス変換動作を指示するために使用される。また、ＡＳＩ空間番号は、処理装置内の制御レジスタを読み書きすることに使用されている。
【００５６】
さらに、処理装置内の制御レジスタのいくつかは、予め特定のＡＳＩ空間番号を指示することによって、そのレジスタの値が読み出され、または、書き換えられる。すなわち、
処理装置にはそのようなＡＳＩ空間が定義されている。また、処理装置内の制御レジスタが読み書きされる場合には、制御レジスタの読み書きに使用される仮想アドレスの下位８ビット中の一部、例えば５ビットが使用される。そして、１つのＡＳＩ空間番号に対して、３２種類のレジスタのいずれか１つが選択されるようにしてもよい。このようにして、レジスタアクセスの実行対象が拡張され得る。
【００５７】
以上のように、ＡＳＩコマンドにより、所望の空間を使用して仮想アドレスから物理アドレスへとアドレスを変換することや、処理装置内のレジスタの読み書きを実施することができるように、ＡＳＩコマンドの体系が定義されている。
【００５８】
図３Ａ、図３Ｂに、ＡＳＩコマンドのデータパターン例を示す。図３Ａは、ＡＳＩ空間直接指定コマンドの例である。図３Ａのコマンド例では、先頭２ビット（'11'固定）と、ＯＰ３（ビット24:19）がオペレーションコードを指定する。オペレーションコードには
、ロード命令とストア命令とを識別するコードが指定される。Register Destination（ビット29:25）には、ロードまたはストアされるデータを保持するプロセッサ部１のレジス
タが指定される。ＲＳ１（ビット18:14）とＲＳ２（ビット4:0）とによって、メモリの仮想アドレスが指定される。例えば、ＲＳ１がベースアドレスであり、ＲＳ２がディスプレースメントアドレスである。Ｉ＝０（ビット13）は、ＡＳＩ空間番号を直接指定するコマンドであることを示す。直接指定では、レジスタを介さずに、コマンドのオペランド中に、ＡＳＩ空間番号が指定される。すなわち、データパターン中のＩＭＭ＿ＡＳＩ（ビット12:5）に、ＡＳＩ空間番号が指定される。
【００５９】
図３Ｂは、ＡＳＩ空間間接指定コマンドの例である。図３Ｂのコマンド例は、Ｉ＝１（ビット13）によって、ＡＳＩ空間を間接的に指定するＡＳＩ空間間接指定コマンドであることを示している。間接指定では、ＡＳＩ空間番号が、所定のレジスタ（ＡＳＩレジスタと呼ぶレジスタ）に設定される。このとき、ＲＳ１（ビット18:14）およびＳＩＭＭ１３
（ビット12:0）によって、メモリの仮想アドレスが指定される。
【００６０】
本実施例の処理装置では、ＡＳＩ空間番号が新たに１つ定義されている。そして、ＡＳＩ空間番号で指定されるＡＳＩ空間において、２つの仮想アドレスが割り当てられる。なお、ＡＳＩ空間番号で指定されるＡＳＩ空間は、第１のアドレス空間に相当する。新ＡＳＩ空間番号と仮想アドレスの対において、サービスプロセッサ１００から発行されるＪＴＡＧコマンドに準拠したコマンド（以下、単にＪＴＡＧコマンドという）を受け付けるインターフェースが設けられる。すなわち、処理装置では、ユーザプログラムは、プロセッサ部１で実行されるプログラム中からインターフェースにＪＴＡＧコマンドを発行できる。本実施例では、新ＡＳＩ空間番号で指定されるＡＳＩ空間以外のアドレス空間が、第２のアドレス空間に相当する。
【００６１】
その結果、新ＡＳＩ空間番号と仮想アドレスの対を指定したＡＳＩコマンドをプロセッサ部１が実行すると、ＡＳＩ空間内の指定の仮想アドレスの内容が、ＪＴＡＧコマンドとして、ＪＴＡＧコマンド制御部４０に引き渡される。すなわち、ＡＳＩコマンド経由のＪＴＡＧコマンドが新たに定義される。ＡＳＩコマンド経由のＪＴＡＧコマンドの機能の一部として、ヒストリ操作が実行可能とされる。
【００６２】
本実施例では、新しく割り当てられたＡＳＩコマンドは、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』と呼ばれる。『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』は、ＪＴＡＧコマンドを発行する命令である。また、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』は、排他制御の処理のため、および、ＪＴＡＧコマンドの結果を読み出すための命令である。
【００６３】
『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』は書き込み専用のコマンドであり、書き込みに伴う６４ビットデータのデータパターンは次のように定義される。すなわち、新たに定義されたＡＳＩ空間の第１のアドレスには、以下のデータパターンが定義される。なお、以下の説明で、data[ ]という記述は、ビットパターン中のビット位置を示す。この場
合、ビットの並び順を意識してビットパターンが定義されることもある。しかし、本実施形態では、ビットの並び順は明確には区別しない。例えば、data[62:56]という記述は、
ビット６２からビット５２のビットパターンということを意味する。
【００６４】
data[63]=LOCK  ：LOCKは、ＪＴＡＧコマンドの実行を要求する複数のプロセッサ部１
間の競合を回避するための排他制御時の指定である。
【００６５】
data[62:56]=LOCK_ID[0:6]  ：LOCK_IDは、排他制御を要求するプロセッサ部１を特定
する情報である。
【００６６】
data[55:48]=JIR[0:7] : JIRは、ＪＴＡＧコマンドのコードである。
【００６７】
data[47:36]=JSEL[0:11] : JSELは、プロセッサ部１のいずれか、あるいは、処理装置
内の装置（COREn/UNITm）を選択する選択情報である。例えば、ＪＴＡＧコマンドによっ
て、ヒストリ記録を蓄積する対象のプロセッサ部１が指定される。
【００６８】
data[35:32]=reserve(all="0")：これらのビットは、本実施例では未使用であるものとする。
【００６９】
data[31:00]=JDR[0:31] : ＪＴＡＧコマンドへの引数である。なお、本明細書中では、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドのデータパターンは、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のように記述する。また、これらを省略して、データパターンの各部が単に、ａｃｃ．ＬＯＣＫのように記述される場合もある。
【００７０】
『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』は読み出し専用のコマンドであり、読み出しに伴う６４ビットデータのデータパターンは次のように定義される。すなわち、新たに定義されたＡＳＩ空間の第２のアドレスには、以下のデータパターンが定義される。
【００７１】
data[63]=LOCK：このビットには、排他制御の結果、ＪＴＡＧコマンドの実行権を取得
できたか否かが示される。
【００７２】
data[62:56]=LOCK_ID[6:0]：このビットパターンには、排他制御の結果、ＪＴＡＧコマンドの実行権を取得したプロセッサが示される。
【００７３】
data[55:54]=BUSY/NACK：BUSYは、ＪＴＡＧコマンド実行中であることを示す。また、NACKは、ＪＴＡＧコマンドが実行できなかったことを示す。また、この値がNACK（例えば
、data[55:54]="01"）のとき、エラーコードが、data[31:28]（すなわち、下記JDR[0:3]
）に設定される。このとき、data[31:28]に設定される値は、NACK_code[3:0]として、図
４に記述される。
【００７４】
図４は、data[55:54]=NACK（例えば、"01"）が返されたときのNACK_codeの定義を例示
する表である。図４に示す表の各行は、NACK_code[3:0]の値、値の内容の説明、および備考の説明を含む。NACK_code[3:0]=０は、サービスプロセッサ１００がＪＴＡＧコマンド
制御部４０を使用中、言い換えればＪＴＡＧコマンドを実行中であることを示す。data[55:54]=NACKとともに、NACK_code[3:0]=０が返されたときには、プロセッサ部１で実行さ
れるユーザプログラムは、NACK_code[3:0]=０が返される前に書き込んだ『ＡＳＩ＿ＣＭ
Ｄ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドでリトライする。
【００７５】
また、NACK_code[3:0]=１は、ＡＳＩコマンドからのＪＴＡＧコマンド実行禁止を意味
する。この値は、例えば、ＡＳＩコマンドからのＪＴＡＧコマンド実行要求があったが、ＪＴＡＧコマンドの実行が許可されていない状態、あるいは実行を許可されていないユーザが検知されたことを示す。
【００７６】
また、NACK_code[3:0]=２は、ＡＳＩコマンドで指定したJIR[0:7]、すなわちＪＴＡＧ
コマンドが実行禁止であったことを意味する。これは、例えば、ユーザに許可されていないＪＴＡＧコマンドをJIR[0:7]に指定して『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドが書き込まれたことを示す。これは、通常、ユーザプログラムの欠陥（bug）が原
因である。
【００７７】
また、NACK_code[3:0]=３は、BUSY状態で新たなＪＴＡＧコマンドが起動要求されたこ
とを示す。ここで、BUSY状態は、新たに起動要求される前のＪＴＡＧコマンド、例えば、他のプロセッサ部１によるＪＴＡＧコマンドの実行がまだ完了していない状態をいう。これは、通常、ユーザプログラムの欠陥（bug）が原因である。
【００７８】
また、NACK_code[3:0]=ｆは、ハードエラーが検知されたことを意味する。さらに、以
上説明した値以外の値（NACK_code[3:0]=4〜e）は、本実施例では未使用であるものとす
る。
【００７９】
以下、さらに、読み出しに伴う６４ビットデータのデータパターンの説明が継続される。
【００８０】
data[53:48]=reserve(all="0")
data[47:40]=reserve(all="0")
data[39:32]=reserve(all="0")
data[31:00]=JDR[0:31] : このビットは、ＪＴＡＧコマンドの返り値である。なお、本明細書中では、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドのデータパターンは、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のように記述される。また、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドのデータパターンが省略されて、データパターンの各部が単にｒｃｖ．ＬＯＣＫ、ｒｃｖ．ＬＯＣＫ＿ＩＤ、ｒｃｖ．ＢＵＳＹ／ＮＡＣＫ、ｒｃｖ．ＪＤＲ、ｒｃｖ．ＮＡＣＫ＿ｃｏｄｅのように記述される場合もある。
【００８１】
さらに、処理装置は、サービスプロセッサ１００経由のＪＴＡＧコマンドとＡＳＩコマンド経由のＪＴＡＧコマンドの競合を回避する機能を有する。すなわち、処理装置は、ＪＴＡＧコマンド実行前にＡＳＩコマンド経由のＪＴＡＧコマンドの実行を禁止した状態で、サービスプロセッサ１００経由のＪＴＡＧコマンドを実行する。このため、処理装置は、ＪＴＡＧコマンドの排他制御を行うためのレジスタ『ＪＴＡＧ＿ＬＯＣＫ＿ＳＰ＿ＲＥＧ』を用意する。レジスタ『ＪＴＡＧ＿ＬＯＣＫ＿ＳＰ＿ＲＥＧ』は１ビットのＬＯＣＫビットを保持するレジスタである。
【００８２】
data[00]=LOCK：このビットは、サービスプロセッサ１００によって、ＪＴＡＧコマン
ドの発行がロック中であるか否かを示すビットである。
【００８３】
図５は、上記２つのＡＳＩコマンド経由のＪＴＡＧコマンドが各処理部へと受け渡され
る経路の構成を説明する図である。
【００８４】
命令処理装置１１から発行されたＡＳＩコマンドは、Ｌ１キャッシュ制御部２０へと送られる。ＡＳＩコマンドには、命令、ＡＳＩ番号および仮想アドレスが含まれる。なお、ＡＳＩコマンドが書き込み命令であれば、そのＡＳＩコマンドで使用する書き込みデータも、演算器１２からＬ１キャッシュ制御部２０のストアデータ部２２へと送られる。
【００８５】
図５のように、Ｌ１キャッシュ制御部２０は、Ｌ２−ＡＳＩ命令検出部２１、ストアデータ部２２、およびロードデータ部２３を有している。Ｌ１キャッシュ制御部２０のＬ２−ＡＳＩ命令検出部２１は、受け取ったＡＳＩコマンドのＡＳＩ空間番号と仮想アドレスの下位８ビットの内５ビットを確認する。そして、Ｌ２−ＡＳＩ命令検出部２１は、そのＡＳＩコマンドがＬ２キャッシュ制御部３０で実行すべきＡＳＩコマンド（以下、Ｌ２−ＡＳＩコマンドと呼ぶ）であることを確認した場合には、ＡＳＩコマンドをＬ２キャッシュ制御部３０へと転送する。なお、ＡＳＩコマンドはＡＳＩ命令の他、ＡＳＩ番号、およびアドレス［40:3］を含む。ＡＳＩコマンドの転送では、ＡＳＩコマンドとともに、そのＡＳＩコマンドのＡＳＩ番号と仮想アドレスの下位８ビットの内５ビットも転送される。なお、図５で、アドレス［40:3］とあるのは、処理装置が用意しているデータパターン中の仮想アドレスを引き渡す領域である。本実施例では、この領域、つまりアドレス［40:3］のうち、例えば、５ビット（アドレス[7:3]）が使用される。
【００８６】
また、ＡＳＩコマンドが書き込み命令であれば、ストアデータ部２２は、演算器１２から受け取っていたストアデータ（data[63:0]）をＬ２キャッシュ制御部３０へと送る。したがって、ストアデータ部２２は、書き込みバッファとして機能する。なお、Ｌ１キャッシュ制御部２０のロードデータ部２３は、逆に、ＪＴＡＧコマンド制御部４０およびＬ２キャッシュ制御部３０を通じて、読み出された履歴情報を出力するバッファである。
【００８７】
Ｌ２キャッシュ制御部３０は、ＡＳＩ命令解釈部３１、ストアデータ部３２、およびコマンド完了通知部およびロードデータ部３３を有する。Ｌ２キャッシュ制御部３０内のＡＳＩ命令解釈部３１は、Ｌ１キャッシュ制御部２０から発行されたＡＳＩコマンドを受け取る。受け取ったＡＳＩコマンドがＪＴＡＧコマンドを発行する命令である場合は、ＡＳＩ命令解釈部３１は、ＪＴＡＧコマンド制御部４０に対して、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』または『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』の実行を要求する。ここで、ＡＳＩコマンドがＪＴＡＧコマンドを発行する命令か否かは、ＡＳＩ空間番号で判定される。また、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』または『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』のいずれが指定されているかは、アドレス[7:3]で判定さ
れる。
【００８８】
このとき要求された動作が『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』であった場合には、ストアデータ部３２が、要求に付随してdata[63:0]をＪＴＡＧコマンド制御部４０に送る。すなわち、Ｌ２キャッシュ制御部３０は、data[63:0]により、どのようなＪＴＡＧコマンドの実行を要求するのかＪＴＡＧコマンド制御部４０に指示する。ＡＳＩ命令解釈部３１は、実施例１に示した入力部２の他の例である。
【００８９】
ＪＴＡＧコマンド制御部４０は、ＪＴＡＧコマンド可否検証部４１，ＪＴＡＧコマンド実行部４２、およびロードデータ部４３を有する。
【００９０】
ＪＴＡＧコマンド制御部４０のＪＴＡＧコマンド実行可否検証部４１は、受け取ったＪＴＡＧコマンドが『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』による書き込み要求であれば、書き込み保護制御回路により書き込み許可が与えられているかを確認する。書き込み許可が与えられていない場合とは、例えば、ＡＳＩコマンド経由での実行が許容されない
ＪＴＡＧコマンド等が書き込まれた場合である。そして、書き込み許可が与えられていれば、ＪＴＡＧコマンド実行可否検証部４１は、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドを受け付けるレジスタＣＭＤ＿ＡＣＣ（図６参照）の値を更新する。そして、ＪＴＡＧコマンド実行部４２が、書き込まれたＪＴＡＧコマンドを実行する。
ＪＴＡＧコマンド実行部４２は、書き込まれたＪＴＡＧコマンドに応じて、該当する信号、つまり制御コマンドを処理装置内の各部に送る。例えば、ＪＴＡＧコマンド実行部４２は、ヒストリＲＡＭ５１−５６のヒストリ制御部へ記録開始を指示する。このような指示に対する応答として、例えば、ヒストリＲＡＭ５１−５６のヒストリ制御部からコマンド完了通知が返される。コマンド完了通知によって、ＪＴＡＧコマンド実行部４２は、コマンドの実行を完了する。なお、レジスタＣＭＤ＿ＡＣＣは、例えば、ＪＴＡＧコマンド制御部４０内のレジスタであり（図６参照）、ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドが書き込まれる。
【００９１】
一方、書き込み許可が与えられていない場合は、ＪＴＡＧコマンド制御部４０は、レジスタＣＭＤ＿ＡＣＣを更新せずに、ＪＴＡＧコマンドの実行を完了する。このとき、NACKおよびNACK_codeによって、エラーがＬ２キャッシュ制御部３０、Ｌ１キャッシュ制御部
２０を経由して、演算器１２に返される。
【００９２】
指示されたＪＴＡＧコマンドが『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』による読み出し要求である場合、ＪＴＡＧコマンド制御部４０は、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドに対応するレジスタのデータフォーマットにしたがって、読み出した値（data[31:0]すなわち、JDR[0:31]）をＬ２キャッシュ制御部３０へ出力する。す
ると、Ｌ２キャッシュ制御部３０は、さらに、JDR[0:31]を、Ｌ１キャッシュ制御部２０
を経由して、演算器１２へと送り返す。より具体的には、ＪＴＡＧコマンド制御部４０のロードデータ部４３が、読み出した値（JDR[0:31]）をＬ２キャッシュ制御部３０のコマ
ンド完了通知およびロードデータ部３３に引き渡す。さらに、コマンド完了通知およびロードデータ部３３は、引き渡された値（JDR[0:31]）をＬ１キャッシュ制御部２０のロー
ドデータ部２３に転送する。コマンド完了通知およびロードデータ部３３は、実施例１で示した出力部３の他の例である。
【００９３】
上述のように、本実施例では、新たなＡＳＩ空間にアクセスするＬ２−ＡＳＩコマンドによって、ＪＴＡＧコマンド制御部４０へのインターフェースが定義される。Ｌ２−ＡＳＩコマンドは、処理装置で実行されるユーザプログラムとＪＴＡＧコマンド制御部４０とのインターフェースに利用される命令として好適である。例えば、通常のロード／ストア命令のようなキャッシュメモリ、例えば、Ｌ１オペランドキャッシュ１４等を経由してメモリにアクセスする命令では、読み書きされるデータがキャッシュに保持される場合があり、メモリに保持されるとは限らないからである。これに対して、上記構成では、Ｌ２−ＡＳＩ命令検出部２１がＬ２−ＡＳＩコマンドを検出し、Ｌ２キャッシュ制御部３０のＡＳＩ命令解釈部３１に送出する。また、ＡＳＩ命令解釈部３１は、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドおよび『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドを検出し、ＪＴＡＧコマンド制御部４０に書き込むことができる。
【００９４】
ＪＴＡＧコマンド制御部４０は、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドおよび『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドのデータパターンを受け取るためのレジスタを有する。そこで、以下では、コマンドのデータパターンを明示的に示す場合は、これらのデータは、コマンドデータasi_cmd_receive_reg.LOCKあるいはコマンドデータｒｃｖ．ＬＯＣＫのように呼ぶ。一方、レジスタであることを明示する場合には、これらのレジスタは、レジスタasi_cmd_receive_reg.LOCKあるいはレジスタｒｃｖ．ＬＯＣＫのように呼ぶ。他のデータパターンについても同様である。
【００９５】
図６に、ＪＴＡＧコマンド制御部４０の詳細構成を例示する。図６のように、ＪＴＡＧコマンド制御部４０は、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドを受け付けるレジスタＣＭＤ＿ＡＣＣ、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドを受け付けるレジスタＣＭＤ＿ＲＣＶ、および『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』が書き込んだＡＳＩ空間のデータを受け付けるレジスタＡＣＣ＿ＤＡＴＡ[63:0]を有している。これらのレジスタＣＭＤ＿ＡＣＣ、ＣＭＤ＿ＲＣＶ、およびＡＣＣ＿ＤＡＴＡ[63:0]は、実施例１の入力インターフェースに相当する。
【００９６】
これらのレジスタに書き込まれたコマンドおよびデータパターンは、ＪＴＡＧコマンド制御部４０の論理回路によって、それぞれ該当するレジスタに書き込まれる。以下、ＪＴＡＧコマンド制御部４０内のレジスタを説明する。
【００９７】
ＪＴＡＧコマンド制御部４０内のＪＴＡＧコマンド実行可否検証部４１は、レジスタＪＴＡＧ＿ＬＯＣＫ＿ＳＰ＿ＲＥＧ、レジスタｒｃｖ．ＬＯＣＫ、レジスタｒｃｖ．ＬＯＣＫ＿ＩＤ、レジスタｒｃｖ．ＢＵＳＹ、レジスタｒｃｖ．ＮＡＣＫ＿ｃｏｄｅおよびレジスタｒｃｖ．ＪＩＲを有している。あるいは、ＪＴＡＧコマンド実行可否検証部４１は、これらのレジスタを参照可能である。
【００９８】
レジスタＪＴＡＧ＿ＬＯＣＫ＿ＳＰ＿ＲＥＧは、サービスプロセッサ１００による排他制御のためのフラグを格納する。レジスタｒｃｖ．ＬＯＣＫ、およびレジスタｒｃｖ．ＬＯＣＫ＿ＩＤは、複数のプロセッサ１間の排他制御のためのフラグを格納する。レジスタｒｃｖ．ＢＵＳＹは、現在、ＪＴＡＧコマンドが実行中か否かを示すフラグを格納する。レジスタｒｃｖ．ＮＡＣＫ＿ｃｏｄｅには、受け付けたＪＴＡＧコマンドに対するエラーコードが設定される。
【００９９】
レジスタＪＩＲは、ＪＴＡＧコマンド実行部可否検証部４１とＪＴＡＧコマンド実行部４２とに共有され、ＪＴＡＧコマンドのコードが格納される。ＪＴＡＧコマンド実行部４２は、さらに、レジスタＪＳＥＬおよびＪＤＲを有する。レジスタＪＳＥＬは、ヒストリ記録を蓄積する対象であるプロセッサ部１や装置を特定する情報を格納する。レジスタＪＤＲは、ＪＴＡＧコマンドへの引数を格納する。ＪＴＡＧコマンド実行部４２は、これらのレジスタの指定値にしたがって、対象として指定されたプロセッサ部１、あるいは装置のヒストリ制御部へ指示を送る。ヒストリ制御部に送られる指示には、動作履歴の採取条件、採取の指示、動作履歴の読み出しの指示が含まれる。図６では、ヒストリＲＡＭ５１と、ヒストリＲＡＭ５１を制御するヒストリ制御部５１Ａが例示されている。
【０１００】
ロードデータ部４３は、レジスタＪＤＲを有しており、ヒストリＲＡＭ５１−５６から読み出された情報を格納する。『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドが実行されると、レジスタＪＤＲのデータが、Ｌ２キャッシュ制御部３０のコマンド完了通知およびロードデータ部３３に引き渡される。ロードデータ部４３は、実施例１の出力インターフェースに相当する。
【０１０１】
＜コマンドの発行手順＞
次にＡＳＩコマンドによるＪＴＡＧコマンドの発行手順を説明する。本実施例の処理装置は、ユーザプログラムからＪＴＡＧコマンドを実行する手段として、この手順を含むユーザプログラムを実行する。以下の説明の中で、各種排他制御のための手順が現れる。排他制御が行われるのは、ＪＴＡＧコマンドの発行元が、サービスプロセッサ１００および処理装置の複数のプロセッサ部１（コア）となり得るからである。すなわち、複数の発行元が同時にＪＴＡＧコマンドを発行したとき、排他制御により、単一の発行元からのＪＴＡＧコマンド要求が実行され、それ以外の発行元からの要求が待たされる。このようにして、ＪＴＡＧコマンドを複数同時に実行することによる誤動作が回避される。
【０１０２】
また、説明の簡略化のために、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令の発行、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令の発行という用語を用いる。『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令の発行は、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』に対応するＡＳＩ空間番号と仮想アドレスの下位８ビットの内の５ビットを指示してＡＳＩコマンドのロード命令を発行することに対応する。ロード命令により、相手デバイス、この例ではＬ２キャッシュ制御部からプロセッサ部１に、Ｌ１キャッシュ制御部２０のロードデータ部２３を通じてデータが引き渡される。
【０１０３】
また、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令の発行は、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』に対応するＡＳＩ空間番号と仮想アドレスの下位８ビットの内の５ビットを指示してＡＳＩコマンドのストア命令を発行することに対応する。ストア命令により、プロセッサ部１の演算器１２からＬ１キャッシュ制御部２０のストアデータ部２２を通じて、相手デバイスであるＬ２キャッシュ制御部に、データが引き渡される。これらの操作は、それぞれ、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令を、ユーザプログラムから実行する操作に対応する。例えば、プロセッサ部１が実行するプログラムのコンパイラが、以下のコマンド発行手順を実行可能形式のバイナリプログラム中に設定する。図７および図８に、コマンド発行手順のフローチャートを例示する。図７と図８は、符号（Ｎ１）で接続される。
【０１０４】
（処理１）まず、プロセッサ部１（例えば、プロセッサ部１−１）は、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令を発行し、asi_cmd_receive_reg.LOCKビットを読み出し（Ｆ１）、読み出した値が"0"であることを確認する（Ｆ２）。読み出した値が"0"であれば、ＡＳＩコマンド経由のＪＴＡＧコマンドの実行が可能である。したがって、プロセッサ部１は、処理２のＦ３の手順に移ってＪＴＡＧコマンドを発行する。一方、読み出した値が"0"でなければ、プロセッサ部１−２等の他のプロセッサ部、またはサービスプロ
セッサ１００がＪＴＡＧコマンドを実行中である。したがって、読み出した値が"0"でな
い場合には、プロセッサ部１は、他のプロセッサ部、またはサービスプロセッサ１００によるＪＴＡＧコマンドの完了を待つ。そして、他のプロセッサ部あるいはサービスプロセッサ１００によるＪＴＡＧコマンドの完了後に、プロセッサ部１は、ＪＴＡＧコマンドを発行する。そのために、プロセッサ部１は、読み出した値が"0"になるまで所定の間隔を
置いて、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令の発行を繰り返す。『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令発行が繰り返される場合には、プロセッサ部１は、asi_cmd_receive_reg.LOCKビットを繰り返して読み出す。そして、asi_cmd_recive_reg.LOCKビットが"0"になると、プロセッサ部１は、処理２のＦ３の手順に移る。
【０１０５】
（処理２）プロセッサ部１は、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令を発行する（Ｆ３）。このとき、プロセッサ部１は、asi_cmd_access_reg.LOCK="1"および、asi_cmd_access_reg.LOCK_IDに、プロセッサ部１ごとに異なるユニークな番号であるLOCK_IDを指示する。また、プロセッサ部１は、実行するＪＴＡＧコマンドをasi_cmd_access_reg.JDRに指示する。ただし、プロセッサ部１は、LOCK_IDに使用するユニークな番号には０
ｘ７ｆを使用しない。後述するように、０ｘ７ｆの番号は特別な役割を有している。したがって、プロセッサ部１が番号０ｘ７ｆをコアごとのユニークな番号として使用すると、正しくＬＯＣＫが取得できなくなって誤動作が引き起こされる。
【０１０６】
（処理３）プロセッサ部１は、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令を発行する（Ｆ４）。そして、プロセッサ部１は、asi_cmd_receive_reg.LOCK="1"であること（Ｆ５）、かつasi_cmd_recieve_reg.LOCK_IDが処理２のＦ３で指定したasi_cmd_access_reg.LOCK_IDと一致していることを確認する（Ｆ６）。この２つの条件が満たされている
とき、Ｆ３で発行された『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』によって、プロセッ
サ部１は、排他制御を経て実行権を獲得する。したがって、プロセッサ部１によりＪＴＡＧコマンドが実行されることになる。この２つの条件が満たされた場合、つまりＦ５，Ｆ６がともにＹＥＳの場合には、プロセッサ部１は、制御を処理４のＦ７へ進める。一方、上記２つの条件のいずれかが満たされていないときは、処理２のＦ３で発行した『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』の実行による実行権の獲得が失敗し、命令が実行されなかったことを意味する。命令が実行されなかったときは、プロセッサ部１は処理１のＦ１に制御を戻す。
【０１０７】
（処理４）プロセッサ部１は、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令を発行する（図８のＦ７）。そして、プロセッサ部１は、asi_cmd_receive_reg.BUSY="0"であることを確認してから（Ｆ８でＹＥＳの場合）、処理５のＦ１４に進む。asi_cmd_receive_reg.BUSY="1"であれば（Ｆ８でＮＯの場合）、処理２のＦ３で発行したＪＴＡＧコマンドをＪＴＡＧコマンド制御部４０がまだ実行中であることを意味する。この場合には、プロセッサ部１は再度『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令を発行し、asi_cmd_receive_reg.BUSY="0"になるまでＦ７を繰り返す。
【０１０８】
（処理５）プロセッサ部１は、asi_cmd_receive_reg.NACKの値を判定する（Ｆ９）。そして、asi_cmd_receive_reg.NACK="1"のとき、プロセッサ部１は、asi_cmd_receive_reg.NACK_codeの値を判定する（Ｆ１０）。asi_cmd_receive_reg.NACK="1"かつNACK_code=0x0以外のときは、これらの値は、ソフトウェアのバグが検出されたことを示す（Ｆ１１）。この場合には、ソフトウェアの修正が必要である。
【０１０９】
一方、asi_cmd_receive_reg.NACK="1"かつNACK_code=0x0のときは、これらの値は、サ
ービスプロセッサ１００からのJTAGコマンドに排他制御権を奪われたため、ＡＳＩコマンドからのＪＴＡＧコマンドが実行されなかったことを意味する。この場合には、プロセッサ部１は、処理２のＦ３で発行したＪＴＡＧコマンドを再度発行する（Ｆ１２）。ただし、このとき、ＡＳＩコマンド間の排他制御は取得済みである。そこで、ロック獲得済みのプロセッサ部１から２回目以降のＡＳＩコマンドによるＪＴＡＧコマンドを発行したことを示すために、プロセッサ部１は、asi_cmd_access_reg.LOCK_IDに0x7fの値を使用する。そして、プロセッサ部１は、asi_cmd_access_reg.LOCK="1"で『ＡＳＩ＿ＣＭＤ＿ＡＣＣ
ＥＳＳ＿ＲＥＧ』命令を発行して（Ｆ１３）、処理４のＦ７に戻る。asi_cmd_receive_reg.NACK="0"であるときは、ＡＳＩコマンドによるＪＴＡＧコマンドが無事終了したことを意味するので、プロセッサ部１は、次の処理６に移る。
【０１１０】
（処理６）ＪＴＡＧコマンドにはＳＥＮＳＥコマンドとＬＯＡＤコマンドがある。ＳＥＮＳＥコマンドは処理装置の状態を読み出すコマンドである。処理装置の状態読み取り動作をＪＴＡＧ−ＳＥＮＳＥ動作という。ＡＳＩコマンドから発行されたＪＴＡＧコマンドがＳＥＮＳＥコマンドであった場合は（Ｆ１４でＹＥＳの場合）、プロセッサ部１は、asi_cmd_receive_reg.JDRの値を読み取る（Ｆ１５）。この読み取りにより、プロセッサ部
１は、ＡＳＩコマンドによるＪＴＡＧ−ＳＥＮＳＥ動作を完了する。
一方、ＬＯＡＤコマンドは処理装置の状態を書き換える、もしくは処理装置に何らかの動作を行うことを指示するコマンドである。処理装置状態の書き換え、あるいは、処理装置への指示動作をＪＴＡＧ−ＬＯＡＤ動作という。ＡＳＩコマンドから発行されたＪＴＡＧコマンドがＬＯＡＤコマンドであった場合には（Ｆ１４でＮＯの場合）、ＬＯＡＤコマンドが処理装置の状態を書き換えた段階で、ＪＴＡＧ−ＬＯＡＤ動作が完了する。例えば、Ｆ９の正常終了の判定によって、ＪＴＡＧ−ＬＯＡＤ動作の完了が確認される。
【０１１１】
（処理７）１つのプロセッサ部１から連続して複数のＡＳＩコマンドによるＪＴＡＧコマンドを実行する場合には（Ｆ１６でＹＥＳの場合）、プロセッサ部１は、asi_cmd_access_reg.LOCK_IDに0x7fの値を使用する。そして、プロセッサ部１は、asi_cmd_access_reg
.LOCK="1"で『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令を発行し（Ｆ１７、Ｆ１３
）、手順４のＦ７に制御を戻す。一方、１つのプロセッサ部１から単発のＡＳＩコマンドによるＪＴＡＧコマンドを発行する場合、および複数のＡＳＩコマンドによるＪＴＡＧコマンドのうちの最後のＡＳＩコマンドによるＪＴＡＧコマンドを発行する場合は、処理６（すなわち、Ｆ１４、Ｆ１５）まででＪＴＡＧコマンド処理が完了している。そこで、プロセッサ部１は、asi_cmd_access_reg.LOCK="0"で『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿Ｒ
ＥＧ』命令を発行する。この命令により、プロセッサ部１は、ＡＳＩコマンドによるＪＴＡＧコマンドの排他制御権を開放し、一連のＪＴＡＧコマンド処理を終了する（Ｆ１８）。
【０１１２】
以上の手順で、ＡＳＩコマンドによるＪＴＡＧコマンドが実行される。どのＪＴＡＧコマンドを実行するかは、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令を発行するときにasi_cmd_access_reg.JIRで指示しており、ＪＴＡＧコマンド制御部４０のＪＴＡＧコマンド実行可否検証部４１はこのＪＩＲの値を見てＡＳＩコマンドからの実行を許可するかどうか判断する。ＪＴＡＧコマンド制御部４０が実行許可の判断をすることで、ユーザに開放するＪＴＡＧコマンドが制限され得る。例えば、ＪＴＡＧコマンド実行可否検証部４１が参照可能なメモリに、ユーザに開放するＪＴＡＧコマンドのコード一覧を記述したテーブルを格納しておけばよい。また、ＪＴＡＧコマンド実行可否検証部４１が参照可能なメモリに、ユーザに開放しないＪＴＡＧコマンドのコード一覧を記述したテーブルを格納しておけばよい。ＪＴＡＧコマンド実行可否検証部４１は、ユーザに開放するＪＴＡＧコマンドのコード一覧をメモリから参照して、ＪＩＲの値で指定されたＪＴＡＧコマンドが、ＡＳＩコマンドからの実行が許可されたＪＴＡＧコマンドか否かを判定すればよい。また、ＪＴＡＧコマンド実行可否検証部４１は、ユーザに開放しないＪＴＡＧコマンドのコード一覧をメモリから参照して、ＪＩＲの値で指定されたＪＴＡＧコマンドが、ＡＳＩコマンドからの実行が許可されたＪＴＡＧコマンドか否かを判定してもよい。
【０１１３】
また、ＯＰＳＲ（Ｏｐｅｒａｔｉｏｎ  Ｓｔａｔｕｓ  Ｒｅｇｉｓｔｅｒ）と呼ばれるハードウェアの動作設定を定義するレジスタに値を設定することによって、ユーザへのＪＴＡＧコマンドの開放が禁止できる。また、ハードウェア開発者によるデバッグのため、さらに多くの、場合によってはすべてのＪＴＡＧコマンドがＡＳＩコマンド経由で開放されてもよい。例えば、ハードウェア開発者によるデバッグ時に、ＪＴＡＧコマンド制御部４０は、ＪＴＡＧコマンド実行可否検証部４を起動しないように制御することで、すべてのＪＴＡＧコマンドをユーザに開放してもよい。また、ＡＳＩコマンド経由のＪＩＲで受け付けたすべてのＪＴＡＧコマンドをユーザへの開放を指示するフラグを有するレジスタをＪＴＡＧコマンド制御部４０に設けてもよい。そして、ハードウェア開発者によるデバッグ時に、外部からＪＴＡＧコマンド制御部４０に対して、すべてのＪＴＡＧコマンドの開放を指示するフラグが設定できるようにしてもよい。
【０１１４】
また、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令を発行するときに、asi_cmd_access_reg.COREn/UNITmに値を設定することで、ユーザプログラムは、処理装置上のどのプロセッサ部１（コア）に対して、もしくは、どのユニットに対してＪＴＡＧコマンドを発行するか、発行対象を指定することもできる。
【０１１５】
さらに、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令を発行するときに、asi_cmd_access_reg.JDRに値を設定することで、ユーザプログラムは、ＪＴＡＧコマンドで処理装置に書き込む制御情報の値を設定することができる。
【０１１６】
これらの『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令を発行するときの設定により、使用するＪＴＡＧコマンドの種類と、ＪＴＡＧコマンドの動作を指定することができる。ＪＴＡＧコマンドの結果は『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令により、
処理装置内部の状態が読み出される。『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令は、また、プロセッサ部１−１と他のプロセッサ部１−２との間といったプロセッサ部１間、あるいはプロセッサ部とサービスプロセッサ１００と間の排他制御のためにも使用される。
【０１１７】
ＡＳＩコマンドによるＪＴＡＧコマンドの発行手順は、ユーザプログラムを作成する観点からは以上述べた通りである。ＪＴＡＧコマンドの発行手順は、ユーザプログラムのコンパイル時にコンパイラが、ユーザプログラム中に組み込むようにすればよい。このような、ＡＳＩコマンドによりＪＴＡＧコマンドを発行できる処理装置のハードウェアの構成は、ハードウェア設計者には明らかである。ただし、念のため排他制御部分のハードウェアの設計についての説明が付け加えられる。『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令を受け取ったＪＴＡＧコマンド制御部４０は、以下のように、ＪＴＡＧコマンドの実行・不実行を決定する。すなわち、その命令を受け取るまでのＬＯＣＫビットの値および、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』で指示するＬＯＣＫビットの値とＬＯＣＫ＿ＩＤによって、ＪＴＡＧコマンドの実行・不実行が決定される。さらに、ＪＴＡＧコマンド制御部４０は、コマンド実行後のＬＯＣＫビット、ＬＯＣＫ＿ＩＤ、ＢＵＳＹ／ＮＡＣＫの情報を更新する。
【０１１８】
＜プロセッサ部１からのＪＴＡＧコマンド実行要求時の排他制御＞
図９に、ＪＴＡＧコマンド実行依頼元が、ロックの獲得および開放の実施を試みたときのコマンドデータ『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』への設定値、および、その設定値によるレジスタ『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』の状態の変化を例示する。
【０１１９】
ＪＴＡＧコマンド制御部４０は、プロセッサ部１、例えばプロセッサ部１−１がＬＯＣＫを獲得したときには、レジスタｒｃｖ．ＬＯＣＫ＿ＩＤをプロセッサ部１−１に割り当てられたＬＯＣＫ＿ＩＤに更新する。また、他のプロセッサ部、例えばプロセッサ部１−２がロックを獲得したときは、ＪＴＡＧコマンド制御部４０は、プロセッサ部１−２に割り当てられたＬＯＣＫ＿ＩＤにレジスタｒｃｖ．ＬＯＣＫ＿ＩＤを更新する。
【０１２０】
ここで、図９にしたがって、ＬＯＣＫ＿ＩＤ更新の動作を説明する。図９では、ロックの獲得および開放操作前のレジスタの状態として、左端の列にレジスタｒｃｖ．ＬＯＣＫの状態が示されている。この状態で、プロセッサ部１が、コマンドデータａｃｃ．ＬＯＣＫおよびａｃｃ．ＬＯＣＫ＿ＩＤを指示してロック獲得および開放を試みる。このときのロック獲得または開放操作時のレジスタとコマンドの組み合わせパターンが、『実行前』の３列に記述される。
【０１２１】
そして、上記３列で分類されるそれぞれの行に対応して、操作後のｒｃｖ．ＬＯＣＫ、ｒｃｖ．ＬＯＣＫ＿ＩＤ、ｒｃｖ．ＢＵＳＹ／ＮＡＣＫの各レジスタの値が示されている。また、ＪＴＡＧコマンドが実行されるか否かが、"実行後"の"command"の列に記述され
ている。以下、各行での操作内容およびそのときの動作を説明する。なお、図９の表で、上３行は、表のそれぞれのエントリのエントリを分類するためのフィールドである。したがって、以下の説明中の第１行とは、図９の表の第４行目を意味する。すなわち、表の太枠で囲まれた上３行が除外されて、図９の表の行数が数えられる。
【０１２２】
図９の第１行目の操作では、レジスタｒｃｖ．ＬＯＣＫ＝０の状態で、コマンドデータａｃｃ．ＬＯＣＫ＝０を指定したコマンドが実行されている。この操作は、ロックされていない状態（ｒｃｖ．ＬＯＣＫ＝０）で、ロック開放（ａｃｃ．ＬＯＣＫ＝０での書き込み）を行ったことを意味する。これは意味を持たない操作である。このコマンド実行後、ＪＴＡＧコマンド制御部４０は、ロックされていない状態（ｒｃｖ．ＬＯＣＫ＝０）でＬ
ＯＣＫ＿ＩＤを変更しないように制御する。また、実行結果通知（ｒｃｖ．ＢＵＳＹ／ＮＡＣＫ）の状態は、変更されない。また、このとき指示したＪＴＡＧコマンドは実行されない。
【０１２３】
図９の第２行目の操作では、レジスタｒｃｖ．ＬＯＣＫ＝０の状態でコマンドデータａｃｃ．ＬＯＣＫ＝１のコマンドが実行されている。この操作は、ロックされていない状態（ｒｃｖ．ＬＯＣＫ＝０）で、ロック獲得（ａｃｃ．ＬＯＣＫ＝１での書き込み）を行ったことを意味する。実行されたＪＴＡＧコマンドがロックを獲得するとき、ＪＴＡＧコマンド制御部４０は、レジスタｒｃｖ．ＬＯＣＫ＝１に設定し、レジスタｒｃｖ．ＬＯＣＫ＿ＩＤをコマンドデータａｃｃ．ＬＯＣＫ＿ＩＤでの指定値に書き換える。そして、ＪＴＡＧコマンド制御部４０は、コマンドデータａｃｃ．ＪＩＲで指示されたＪＴＡＧコマンドの実行を開始するとともに、レジスタｒｃｖ．ＢＵＳＹ／ＮＡＣＫ＝１／０を設定する。レジスタｒｃｖ．ＢＵＳＹは、ＪＴＡＧコマンドの実行が完了した時点で０に書き換えられる。なお、ユーザプログラムは、ロックの獲得に成功したかどうかを『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』により確認できる。
【０１２４】
図９の３行目の操作では、レジスタｒｃｖ．ＬＯＣＫ＝１の状態でコマンドデータａｃｃ．ＬＯＣＫ＝０のコマンドが実行されている。この操作は、ロックされている状態（ｒｃｖ．ＬＯＣＫ＝１）で、ロック開放（ａｃｃ．ＬＯＣＫ＝０での書き込み）を行ったことを意味する。ロックを獲得しているプロセッサ部１は、ロック獲得制御によってただ一つに限られている。そこで、ａｃｃ．ＬＯＣＫ＿ＩＤの値に関わらず、ロックの開放は成功する。このとき、ＪＴＡＧコマンド制御部４０は、ｒｃｖ．ＬＯＣＫ＝０とする。また、このとき、ＪＴＡＧコマンド制御部４０は、レジスタｒｃｖ．ＬＯＣＫ＿ＩＤをコマンドデータａｃｃ．ＬＯＣＫ＿ＩＤの値に書き換える。また、このときＪＴＡＧコマンドは実行されずに完了するため、ｒｃｖ．ＢＵＳＹ／ＮＡＣＫ＝０／０となる。
【０１２５】
図９の４行目と５行目の操作では、レジスタｒｃｖ．ＬＯＣＫ＝１の状態でコマンドデータａｃｃ．ＬＯＣＫ＝１のコマンドが実行されている。４行目の操作は、複数の要求元からのロック要求が競合したとき、先にロックを獲得した要求元に対してだけ、ＪＴＡＧコマンドの実行を許可する操作を意味する。５行目の操作は、ロックされている状態（ｒｃｖ．ＬＯＣＫ＝１）で、ロックを継続しながら（ａｃｃ．ＬＯＣＫ＝１での書き込み）、ＪＴＡＧコマンドを連続実行しようとしたことを意味する。４行目と５行目の違いは、ＪＴＡＧコマンド発行時のａｃｃ．ＬＯＣＫ＿ＩＤが０ｘ７Ｆになっていないか（４行目のケース）、０ｘ７Ｆになっているか（５行目のケース）である。
【０１２６】
４行目の操作では、ａｃｃ．ＬＯＣＫ＿ＩＤが０ｘ７Ｆになっていない。このケースは、いずれかの要求元、例えばプロセッサ部１がロックを獲得して要求元ＬＯＣＫ＿ＩＤをセットした後に、ＪＴＡＧコマンド制御部４０がそれ以外の要求元からのロック要求を受け取ったケースである。このとき、ＪＴＡＧコマンド制御部４０は、後の要求によるロック要求を拒絶する。このために、ＪＴＡＧコマンド制御部４０は、ｒｃｖ．ＬＯＣＫ＿ＩＤは変更せず、ＪＴＡＧコマンドも実行しない。他の要求元が実行中のＪＴＡＧコマンドの実行を妨げないために、ＪＴＡＧコマンド制御部４０は、ｒｃｖ．ＢＵＳＹ／ＮＡＣＫを更新しない。
【０１２７】
図９の５行目の操作では、コマンドデータのａｃｃ．ＬＯＣＫ＿ＩＤが０ｘ７Ｆになっている。このケースは、いずれかの要求元がロックを獲得して要求元ＬＯＣＫ＿ＩＤをセットした後、ＪＴＡＧコマンド制御部４０がロックを獲得したその要求元から、ロックを保持しつつ連続して実行すべきＪＴＡＧコマンドを受け取ったケースである。このとき、レジスタｒｃｖ．ＬＯＣＫ＿ＩＤは要求元のＬＯＣＫ＿ＩＤを示している。ＪＴＡＧコマンド制御部４０は、この値（レジスタｒｃｖ．ＬＯＣＫ＿ＩＤ）を更新せずに保持する。
また、ＪＴＡＧコマンド制御部４０は、レジスタｒｃｖ．ＢＵＳＹ／ＮＡＣＫ＝１／０をセットして、ＪＴＡＧコマンドの実行を開始する。以上のように、要求元がプロセッサ部１で動作するユーザプログラムである場合の排他制御が行われる。
【０１２８】
＜プロセッサ部１とサービスプロセッサ１００との間の排他制御＞
以上の排他制御とは別に、プロセッサ部１によるＪＴＡＧコマンドの実行と、サービスプロセッサ１００によるＪＴＡＧコマンドの実行とが競合する場合もある。このような競合に対応するための排他制御について、以下に説明する。
【０１２９】
サービスプロセッサ１００からのＪＴＡＧコマンドとＡＳＩコマンドによるＪＴＡＧコマンドによる競合に対応するために、『ＪＴＡＧ＿ＬＯＣＫ＿ＳＰ＿ＲＥＧ』による制御が使用される。サービスプロセッサ１００がＪＴＡＧコマンドを発行する際には、次のようにＪＴＡＧ＿ＬＯＣＫ＿ＳＰ＿ＲＥＧに値が設定される。この設定により、ＡＳＩコマンドによるＪＴＡＧコマンドの切れ目にサービスプロセッサ１００からのＪＴＡＧコマンドが実行される。
（手続１）サービスプロセッサ１００は、ＪＴＡＧのＬＯＡＤコマンドにより、レジスタJTAG_LOCK_SP_REG="1"の設定をＪＴＡＧコマンド制御部４０に要求する
（手続２）ＪＴＡＧコマンド制御部４０は、ＡＳＩコマンドによるＪＴＡＧコマンドを実行中であれば、JTAG_LOCK_SP_REGの更新を一時保留する。そして、実行中のＡＳＩコマンドが完了すると、すなわち、asi_cmd_receive_reg.BUSYが"1"から"0"に変わると、ＪＴＡＧコマンド制御部４０は、JTAG_LOCK_SP_REG="1"を設定する。
【０１３０】
JTAG_LOCK_SP_REG="1"の間は、ＪＴＡＧコマンド制御部４０は、ＡＳＩコマンドによるＪＴＡＧコマンドを受け取っても、asi_cmd_receive_reg.NACK="1"として（プロセッサ部１の処理は図７の処理５参照）、ＡＳＩコマンドによるＪＴＡＧコマンドを失敗させる。このような制御により、ＪＴＡＧコマンド制御部４０は、プロセッサ部１が新たなＡＳＩコマンドによるＪＴＡＧコマンドを実行することを抑止する。
（手続３）サービスプロセッサ１００は、ＪＴＡＧのＳＥＮＳＥコマンドにより、JTAG_LOCK_SP_REG="1"であることが確認できるまで待つ。
（手続４）TAG_LOCK_SP_REG="1"を確認後、サービスプロセッサ１００は、実行すべきＪ
ＴＡＧコマンド、例えばＬＯＡＤまたはＳＥＮＳＥを実行する。
（手続５）ＪＴＡＧコマンド実行終了後、ＪＴＡＧのＬＯＡＤコマンドにより、JTAG_LOCK_SP_REG="0"を設定する。
【０１３１】
以上が、ＡＳＩコマンド経由でＪＴＡＧコマンドを発行できるようにした仕組みである。以上の仕組みを使って、次の機構を追加することにより、処理装置のＰＡ（Performances Analyzing、性能解析）機能が提供される。
【０１３２】
＜性能解析の例＞
まず、ヒストリＲＡＭに記録する情報は、それぞれのプロセッサ部１、またはＬ１キャッシュ制御部２０、Ｌ２キャッシュ制御部３０等の各ユニットで毎サイクル取得することも可能である。また、記録すべきイベントが発生したときにヒストリＲＡＭへの書き込み信号をオンにすることで、イベントが発生したときの履歴を採取することが可能となる。本実施形態では、Ｌ１キャッシュ部２０にキャッシュミスが発生したときに、キャッシュミスしたアドレスとそれに付随する情報、例えばロード・ストアの区別、ＶＩＰＴ（Ｖｉｒｔｕａｌｌｙ  Ｉｎｄｅｘｅｄ  Ｐｈｙｓｉｃａｌｌｙ  Ｔａｇｇｅｄ）方式のキャッシュであれば仮想アドレスの一部などが記録される。
【０１３３】
本処理装置は、ユーザプログラムを実行中に、ＡＳＩコマンド経由で、ＪＴＡＧコマンドを発行し、上記イベントをヒストリＲＡＭに記録する。本実施例では、イベントがヒス
トリＲＡＭに記録されるときに実行中のユーザプログラムは、被解析プログラムと呼ばれる。本実施例では、被解析プログラムを実行する本処理装置が、さらに、ＡＳＩコマンド経由で、ＪＴＡＧコマンドを発行し、ヒストリＲＡＭの記録を読み出す。
【０１３４】
次に、本処理装置は、読み出されたヒストリＲＡＭの記録を解析するユーザプログラムを実行する。このユーザプログラムは、解析プログラムと呼ばれる。
【０１３５】
被解析プログラム中に、キャッシュミス等のイベントの履歴が多数回に渡って集められる。本処理装置は、解析プログラムを実行し、多数回に渡って集められ履歴を１つの履歴として統計的に処理する。そのような処理によって、ユーザの解析プログラムを実行する処理装置は、各アドレスで頻繁にキャッシュミスしているアドレスを確定することが可能となる。具体的には、以下のような場合が想定される。
【０１３６】
（１）無条件にキャッシュミスの履歴を収集する場合；
採取するイベントの種類として、例えば、キャッシュミスが指定される。ただし、他の条件は指定されない。この場合には、キャッシュミス等のイベントが発生するごとに、その動作履歴がヒストリＲＡＭに記録される。動作履歴の記録データが、ヒストリＲＡＭの容量をオーバーフローしない限り、本処理装置（解析プログラム）は、ヒストリＲＡＭに記録されたそれぞれのイベントをそのまま収集された履歴として解析の対象とする。
【０１３７】
動作履歴の記録データが、ヒストリＲＡＭの容量をオーバーフローした場合には、最も古く記録された記録データから新しく記録する記録データで上書きしていくように制御するため、ヒストリＲＡＭの容量に収まる最新の動作履歴の記録データが、解析の対象となる。この場合に、本処理装置（解析プログラム）は、過去に同一のユーザプログラム実行に収集した動作履歴の記録データと、最新の動作履歴の記録データとを結合して、解析の対象としてもよい。
【０１３８】
（２）所定の条件の満足されたときにキャッシュミスの履歴の収集を開始する場合；
この場合も、本処理装置（解析プログラム）による処理は、無条件に動作履歴の記録データを収集する場合と同様である。
【０１３９】
（３）所定の条件の満足されたときにキャッシュミスの履歴を停止する場合；
この場合、本処理装置がユーザプログラム（被解析プログラム）を１回実行したときに、１回の収集による動作履歴が採取される。この場合は、本処理装置（解析プログラム）が、そのような１回の収集結果を解析する。過去に同一のユーザプログラム実行に収集した動作履歴の記録データと、最新の動作履歴の記録データとを結合して、解析の対象としてもよい。
【０１４０】
また、ヒストリＲＡＭに記録する情報は、他のプロセッサ部からの要求によりＬ１キャッシュから取り出した動作履歴であってもよい。その場合、キャッシュミスを起こしたアドレスが、他のプロセッサ部からの要求によりＬ１キャッシュから取り出した動作履歴とともに記録されるようにしてもよい。また、他のプロセッサ部からの要求によりＬ１キャッシュから取り出した履歴が単独で採取されるようにしてもよい。ここで、「単独で」とは、自プロセッサ部からの要求によりＬ１キャッシュにアクセスした履歴を除外するという意味である。このような情報を採取することにより、ユーザは、プロセッサ部１の間で取り合いをしているアドレスが存在するかどうか知ることができる。
【０１４１】
何をヒストリＲＡＭに記録する対象とするかは、CORE_DEBUG_REG0/1,CHIP_DEBUG_REGn
といったＪＴＡＧコマンドで定義されるレジスタ（履歴指定部に相当）から指定可能である。本実施形態の処理装置では、これらのレジスタはＡＳＩコマンドからのＪＴＡＧコマ
ンド、またはサービスプロセッサ１００からのＪＴＡＧコマンドにより設定可能である。
【０１４２】
このうち、レジスタCORE_DEBUG_REG0には、例えば、命令処理装置１１に備えるヒスト
リＲＡＭ５１の記録に関する制御の条件、記録するべき履歴の種類等が指定される。また、例えば、レジスタCORE_DEBUG_REG1にはＬ１キャッシュ制御部２０に備えるヒストリＲ
ＡＭ５２の記録に関する制御の条件、記録するべき履歴の種類等が指定される。また、レジスタCHIP_DEBUG_REGnには、Ｌ２キャッシュ制御部３０の他、他ＣＰＵインターフェー
ス部６２、メモリインターフェース部６３、Ｉ／Ｏインターフェース部６４にそれぞれ備えるヒストリＲＡＭ５３−５６の記録に関する制御の条件、記録するべき履歴の種類等が指定される。これらのレジスタの値を設定することで、ユーザは既定のヒストリ情報を選択して、指定の条件の下で採取することができる。これらのレジスタの値が記録条件に相当する。
【０１４３】
例えば、レジスタCORE_DEBUG_REG0は、命令処理装置１１のヒストリＲＡＭ５１を制御
するヒストリ制御部に入力される。このヒストリ制御部は、レジスタCORE_DEBUG_REG0に
よって指定された命令コードを検出したときに、ヒストリ記録を停止する機能を備える。このとき指定する命令コードとしては、ダイアグ命令などが好適である。ダイアグ命令自体は、実際には何もしないが、その命令の空きフィールドにユーザ所望の情報、言い換えれば解析に利用できる情報を埋め込むことができる。ここで、命令の空きフィールドとしては、例えば、直接指定形式のオペランド部分が例示される。なお、直接指定は、命令に指定されるオペランドがレジスタによって間接指定される形式ではないオペランドの指定形式である。また、例えば、ダイアグ命令の代わりに、ネバーブランチ命令、つまり分岐することのない分岐命令は、上記ダイアグ命令と同様に利用され得る。ネバーブランチ命令の分岐先を指定するフィールドが、上記ダイアグ命令の空きフィールドと同様に利用できるからである。このような命令を埋め込む位置は、例えば、画面上に表示されたソースプログラムに対して、ユーザの停止ポイント、つまりブレークポイントの設定によって決定すればよい。そして、ソースコードに対する停止ポイントの指示がなされた後、コンパイラがそのソースプログラムをコンパイルすればよい。
【０１４４】
したがって、例えば、コンパイラが、停止ポイントが設定されたプログラムをコンパイルするとき、そのブレークポイントに上記命令を埋め込めばよい。その場合に、複数のダイアグ命令をプログラム、例えばプロセッサ１で実行可能な実行形式のファイルに埋め込みつつ、それぞれのダイアグ命令に固有の番号を付すようにすればよい。固有の番号は、ダイアグ命令をそれぞれ区別するために使用できる。
【０１４５】
一方、コンパイラは、例えば、そのユーザプログラム中にて、ＡＳＩコマンド経由のＪＡＴＧコマンドにより、レジスタCORE_DEBUG_REG0に、その固有の番号が埋め込まれたダ
イアグ命令を指示しておく。このレジスタCORE_DEBUG_REG0への指定は、ヒストリＲＡＭ
５１のヒストリ制御部に引き渡される。このような指定によって、上記固有の番号が埋め込まれたダイアグ命令を検出したときに、ヒストリ制御部は、ヒストリＲＡＭ５１の記録処理を停止する。このようにして、ユーザは、処理装置にて１つのプログラムが実行される一方、停止ポイントの命令が実行されたときにヒストリＲＡＭ５１の記録処理を停止させることができる。すなわち、ユーザは、プログラム上の任意の場所をピンポイントにヒストリ停止場所に指示することができる。逆に、固有の番号が埋め込まれたダイアグ命令が実行されたときに、ヒストリＲＡＭ５１の記録処理を開始することもできる。そのように動作するＪＴＡＧコマンドの仕様が定められ、ヒストリ制御部の回路が設けられている。
【０１４６】
また、ユーザは、ヒストリの停止ポイントの設定、一例として上記コマンドの埋め込みとＪＴＡＧコマンドによる指定の他、ヒストリの読み出し、ヒストリＲＡＭ５１への記録
再開もプログラムに埋め込むことが可能である。したがって、プログラムを走行することで、所望のポイントの履歴が採取される。さらに、この指定とともに、採取するイベントの種類として、ユーザはキャッシュミスの履歴採取を指示してもよい。そのような指定により、所望の命令列におけるキャッシュミスのアドレス履歴が採取できる。さらに、ユーザが、キャッシュミスの履歴採取の他に、命令実行のヒストリ記録として、実行中のプログラムの命令アドレス（プログラムカウンタの値と等価）や命令のデコード、コミット状況など命令実行に関わる情報の採取を指示できるようにしてもよい。このような指定により、ユーザは、ユーザ所望の命令列がハードウェアでどのように実行されているかの履歴を見ることができる。
【０１４７】
また、ユーザがヒストリ記録停止手段として、キャッシュミス回数の閾値を指示できるようにしてもよい。この指示により、ヒストリ制御部は、一定時間内に閾値以上のキャッシュミスが発生したところで、ヒストリ記録を停止する。こうしておくと、キャッシュミスが頻発した場所での命令実行の状況およびキャッシュミスしたアドレス履歴がヒストリＲＡＭに残ることになる。したがって、ユーザはこの指定によって採取されたヒストリＲＡＭの内容を解析することにより、プログラム上のどの場所でどのようにしてキャッシュミスが頻発したか知ることができる。
【０１４８】
以下、このようなヒストリ記録制御手段の一例を説明する。ここでは、Ｌ１キャッシュ制御部２０に備えるヒストリＲＡＭ５２の記録方式を制御するヒストリ制御部５２Ａの回路構成例と、ヒストリ制御部５２Ａに引き渡されるパラメータを保持するレジスタCORE_DEBUG_REG1の構成例を説明する。
【０１４９】
図１０は、Ｌ１キャッシュ制御部２０のヒストリＲＡＭ５２のヒストリ制御部５２Ａと、レジスタCORE_DEBUG_REG1のビット構成との関係を示す図である。図１０のように、レ
ジスタCORE_DEBUG_REG1は、ビット０からビット２１までの２２ビットを有している。レ
ジスタCORE_DEBUG_REG1のそれぞれのビットによってＬ１キャッシュ制御部２０のヒスト
リＲＡＭ５２への記録が制御される。ユーザプログラム（被解析プログラム）を実行するプロセッサ１は、ＡＳＩ経由のＪＴＡＧコマンドにより、レジスタCORE_DEBUG_REG1に値
を設定する。
【０１５０】
このレジスタのビット２１（ＥＮ）は、ヒストリＲＡＭ５２へのクロック供給の有無を制御し、ヒストリＲＡＭ５２を使用しないときの省電力対策のために使用される。プロセッサ１（ユーザプログラム）は、ヒストリＲＡＭ５２を使用するときは、このビットに値１を設定しておく。なお、図１０では、ビット２１（ＥＮ）に対応する、クロック供給制御の回路は省略されている。そのような回路は、例えば、一方の入力をクロックとして、他方の入力をビット２１（ＥＮ）とするＡＮＤを含む回路で例示できる。
【０１５１】
ビット２０〜ビット１８（HIS_MODE[2:0]）は、採取対象とするＬ１キャッシュ上のイ
ベントが複数設定可能である場合に、どのイベントを採取するか指示する。この指示によって、Ｌ１キャッシュ内部のパイプライン動作を観測することも可能である。図１０のように、HIS_MODE[2:0]は、複数のイベント（例えば、History_event0からHistory_event4
）を採取したデータの先端回路への選択信号となる。
【０１５２】
例えば、本実施形態では、ユーザプログラムを実行するプロセッサ１は、ビット２０〜ビット１８（HIS_MODE[2:0]）に、キャッシュのスラッシング検出モードを指示する。こ
の場合の指示としては、例えば、Ｌ１キャッシュへの新規キャッシュラインの登録（Ｍｏｖｅ−Ｉｎ動作）、Ｌ１キャッシュからＬ２キャッシュ階層へのキャッシュラインの吐き出し（Ｍｏｖｅ−Ｏｕｔ動作）、および、Ｌ２キャッシュへのキャッシュラインのプリフェッチ（Ｐｒｅｆｅｔｃｈ動作）の３つのイベントのいずれかが選択して指示される。こ
の指示よって、これらのイベントが発生したときに、そのイベントが選択されて、ヒストリＲＡＭ５２に記録される。
【０１５３】
ビット１７（FRC_CYCLE）は、イベントの記録のタイミングを制御することができる。
通常のヒストリ採取ではイベントが発生したタイミングでヒストリＲＡＭへの記録が行われる。一方、ビット１７（FRC_CYCLE）が１に設定されると、ヒストリ制御部５２Ａは、
強制的に毎サイクルのイベントを記録する。
【０１５４】
ユーザがスラッシングを観測するときには、ヒストリ制御部５２Ａが、イベントが記録される時間間隔をヒストリ上に記録するように制御することで、ユーザが、キャッシュミスの時間間隔、すなわちキャッシュミスの頻度を観測することも可能である。また、ユーザが、毎サイクルのイベント記録を指示することにより、キャッシュミスの間に何が起きていたかのイベントを観測することも可能である。また、ユーザがＬ１キャッシュ制御部２０のパイプライン動作を観測しているときには、パイプライン上でのイベントが発生したタイミングごとの記録を観測するよりも、ビット１７（FRC_CYCLE）にて毎サイクルの
動作履歴が記録される方が好ましい場合がある。すなわち、ユーザは、毎サイクル動作した結果を観測した方が、パイプライン動作の内容が見やすくなる場合がある。ビット１７（FRC_CYCLE）は、そのような制御にも利用される。
【０１５５】
ビット１６（DIS_MI_EVENT）、ビット１５（EN_MO_EVENT）、ビット１４（EN_PF_EVENT）は、キャッシュのスラッシング検出モードが指示されたときに意味を持つビットである。デフォルト設定で、これらのビットが０に設定されている。これらのビットが０に設定されているとき、スラッシング検出モードでは、Ｍｏｖｅ−Ｉｎ動作が記録される。通常のスラッシングは、Ｍｏｖｅ−Ｉｎ動作の観測により、検出できるからである。
【０１５６】
ここで、EN_MO_EVENTビットが値１に設定されると、Ｍｏｖｅ−Ｏｕｔ動作が観測対象
に加えられる。このＭｏｖｅ−Ｏｕｔ動作が記録されると、ヒストリＲＡＭ５２の記録は、プロセッサ部１間のデータの取り合いによる問題の発生を観測する用途にも用いることができる。Ｍｏｖｅ−Ｉｎ動作の記録が残ることでＭｏｖｅ−Ｏｕｔ動作の記録が減ることが問題になる場合には、DIS_MI_EVENTビットが値１に設定される。この設定は、Ｍｏｖｅ−Ｉｎ動作をヒストリＲＡＭに記録しない指示である。
【０１５７】
本実施形態では、Ｌ１キャッシュおよびＬ２キャッシュは、インクルージョン方式を採用している。インクルージョン方式のキャッシュでは、Ｌ１キャッシュがヒットする場合には、必ずＬ２キャッシュにもデータが有効に残されている。したがって、プログラムチューニングにおいて、Ｌ１キャッシュへのＭｏｖｅ−Ｉｎ動作では、Ｌ２キャッシュがヒットしていることが期待される。逆に、Ｌ１キャッシュへのＭｏｖｅ−Ｉｎ動作時に、Ｌ２キャッシュがヒットしていないと、Ｌ２キャッシュまでのＭｏｖｅ−Ｉｎ動作が問題となる。Ｌ２キャッシュまでのＭｏｖｅ−Ｉｎ動作は、Ｌ１キャッシュへのＭｏｖｅ−Ｉｎ動作と比較して、長い時間を要するからである。そこで、Ｌ１キャッシュへのＭｏｖｅ−Ｉｎ動作のタイミングに先立って、適切なタイミングでメモリからＬ２キャッシュまでのＭｏｖｅ−Ｉｎを指示するプリフェッチ命令が実行される。
【０１５８】
このようなプリフェッチ命令は、コンパイラによって実行されるように調整される。このプリフェッチ命令の実行タイミングが適切であるかどうかを確認するために、EN_PF_EVENTビットが値１に設定される。この設定は、Ｍｏｖｅ−Ｉｎ動作とＰｒｅｆｅｔｃｈ動
作のタイミングを確認するためのヒストリ記録を採取する。
【０１５９】
ビット１６（DIS_MI_EVENT）、ビット１５（EN_MO_EVENT）、ビット１４（EN_PF_EVENT）の各ビットは、上記のような採取するイベントをさらに細かく制御するための選択信号
となる。この選択信号は、MI_EVEVT、MO_EVENT、およびPF_EVENTを採取したデータのいずれか１つ以上を選択する選択回路に入力される。
【０１６０】
ビット１３〜ビット４（EVENT_NUM[9:0]）、ビット３〜ビット０（EVENT_INTVL[3:0]）は、指示した時間内に指示したイベント回数が発生したら、ヒストリ記録を停止するためのビットである。イベントが発生した回数を観測するために、ヒストリに記録するたびに値１ずつインクリメントするカウンタとしてHISTORY_EVENT_COUNTER[9:0]が用意されている。このカウンタとは別に、イベント発生の有無に関わらず、毎サイクル値１ずつインクリメントするカウンタとして、CYCLE_COUNTER[13:0]が設けられている。さらに、CYCLE_COUNTER[13:0]のビット１３〜ビット１０とEVENT_INTVL[3:0]の一致を検出する比較回路５２１（COMPARE[3:0]）が設けられている。そして、比較回路５２１が一致を検出したら、HISTORY_EVENT_COUNTER[9:0]がゼロクリアされるように制御される。
【０１６１】
こうすることで、HISTORY_EVENT_COUNTER[9:0]は、EVENT_INTVL[3:0]で指示した値の1024倍のサイクル間隔でカウント値がクリアされる。一方、HISTORY_EVENT_COUNTER[9:0]は、EVENT_NUM[9:0]と比較する比較回路５２２（COMPARE[9:0]）に接続される。そして、その比較結果が一致したとき、比較回路５２２は、FREEZEラッチ５２３をセットする。FREEZEラッチ５２３がセットされると、FREEZEラッチ５２３の出力信号は、ヒストリＲＡＭ５２への記録の停止を指示する。したがって、FREEZEラッチ５２３がセットされたとき以降のヒストリＲＡＭ５２への記録は停止される。
【０１６２】
すなわち、EVENT_INTVLで指示された時間間隔に、EVENT_NUMで指示されたイベント回数以上のイベントが発生したら、その時点でヒストリＲＡＭへの記録が停止される。こうすることで、採取対象のイベントにキャッシュミスが指示された場合、一定時間に所定値以上のキャッシュミスが発生したときに採取が停止される。すなわち、ユーザは、キャッシュミスが所定の頻度以上で発生したときに、キャッシュミスが頻発したみなすことで、キャッシュミスが頻発した時点のヒストリ履歴を採取することが可能となる。
【０１６３】
なお、FREEZEラッチ５２３は、次回のヒストリ採取のため、ヒストリ履歴のユーザプログラムへの読み出しを完了した時点でリセットされる。また、例えば、EVENT_NUMにオー
ルゼロが設定されているときは、ヒストリ制御部５２Ａは、FREEZEラッチ５２３を１にしないように制御する。この制御により、ヒストリ制御部５２Ａは、イベント回数の観測によるヒストリ記録の停止が不要なケースの履歴採取に備える。
【０１６４】
図１１は、命令処理装置１１のヒストリＲＡＭ５１のヒストリ制御部５１Ａと、ヒストリ制御部５１Ａでの制御を指定するレジスタCORE_DEBUG_REG0５１Ｂとの関係を示す概念
図である。
【０１６５】
図１１のように、レジスタCORE_DEBUG_REG0５１Ｂは、EN（クロック供給有無制御）,HIS_MODE[2:0]（ヒストリモード）、COUNT（イベント回数）,OPCODE（オペレーションコー
ド）の各フィールドを有している。ENおよびHIS_MODE[2:0]の指定は、図１０の場合と同
様である。OPCODEは、HIS_MODE[2:0]で指定するイベントとともに観測する命令コードの
指定である。COUNTは、その命令コードの発生回数である。
【０１６６】
図１１のように、レジスタCORE_DEBUG_REG0５１ＢのOPCODEのビットパターンは、レジ
スタ５１１に格納される。一方、レジスタ５１２には、Ｌ１命令キャッシュ１３、命令バッファ１３Ａを通じて、命令処理装置１１にて処理される命令コードが設定される。そして、比較器５１３が、レジスタ５１１とレジスタ５１２とでビットパターンを比較し、比較結果が一致すると、カウンタ５１４がインクリメントされる。
【０１６７】
一方、レジスタ５１５に、レジスタCORE_DEBUG_REG0５１ＢのCOUNTが設定されている。比較器５１６は、カウンタ５１４の値と、レジスタ５１５の値を比較し、値が一致すると、ヒストリＲＡＭ５１への書き込みを停止し、さらに、カウンタ５１４をクリアする。このようにして、OPCODEで指定される命令コードがCOUNTで指定される個数検出されまで、HIS_MODE[2:0]（ヒストリモード）で指定されるイベントが記録される。COUNT=0が設定さ
れた場合は、上記ダイアグ命令が検出されるまではヒストリＲＡＭ５１への記録を停止するように制御しておく。上記ダイアグ命令が検出された後は、カウンタ５１４の値と、レジスタ５１５の値が一致しなくなる。この時点から、ダイアグ命令検出後に、ヒストリＲＡＭ５１への書き込みが継続するように制御する。こうすることで、ダイアグ命令の埋め込まれた位置が、イベントの採取の開始する開始ポイントとなる。
【０１６８】
このようにして、命令処理装置１１で発生するイベントを、指定された命令の実行回数と関連づけて、ヒストリＲＡＭに記録できる。この場合に、OPCODEで指定される命令コードとして、例えば、空き領域に識別情報を埋め込んだダイアグ命令を用いることで、ユーザは、所望の停止ポイント付近、あるいは、指定の開始ポイントで、指定のイベントを観測できる。
【０１６９】
上記では、OPCODEで指定される命令の実行回数がイベント記録の条件とされた。しかし、実行回数が１に設定されてもよい。その場合には、OPCODEで指定される命令の有無が、イベント記録の条件となる。また、図１１のように、カウンタ５１４を設けることなく、ヒストリ制御部が、OPCODEで指定される命令の有無によって、ヒストリＲＡＭ５１への書き込みを停止または開始するようにしてもよい。この場合には、ユーザは、所望の命令が実行された付近で記録が開始されたイベントあるいは記録が停止されたイベントの履歴を取得できる。
【０１７０】
なお、図１０、図１１は、それぞれ、Ｌ１キャッシュ制御部２０のヒストリＲＡＭ５２、命令処理装置１１のヒストリＲＡＭ５１を例に、ヒストリ制御部５２Ａ、５１Ａの処理例を示す。しかし、本処理装置にて、ＡＳＩコマンド経由で指定できるヒストリ制御は、図１１、図１２の例に限定される訳ではない。すなわち、本処理装置では、ＡＳＩコマンドから、ユーザプログラムに設定が認められる範囲で、ＪＴＡＧ制御部４０の様々な機能が、ユーザに開放されることになる。例えば、ヒストリＲＡＭ５３−５６による記録も、同様にユーザプログラムから取得可能となる。
【０１７１】
図１２は、Ｌ１キャッシュ制御部２０のヒストリＲＡＭ５２に記録されるデータフォーマットを例示する図である。以下、図１２に示した各ビットの定義を説明する。図１２のように、ヒストリＲＡＭ５２の記録は、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 : このフィールドは、Ｌ２キャッシュからの指示により、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の要求元を示すコードであ
る。例えば、プロセッサ部１（ユーザプログラム）、分岐予測機構等の処理装置１内の制御部を示すコードである。
REQ_AADRS[40:3] : このフィールドの値は、MI/MO/PFREQ_VALID対象の物理アドレスであ
る。
REQ_LADRS[13] : このフィールドの値は、MI/MO/PFREQ_VALID対象の論理アドレスである
。なお、論理アドレスの[12:0]は、物理アドレスと一致するため、記録されない。さらに、例えば、論理アドレスの上位７ビット[13:7]は、キャッシュのインデックスアドレスとなる。
MIB_VALID[5:0] : このフィールドの値は、MIREQ_VALID要求元のMove-In-Bufferが有効であることを示す、Bufferごとのフラグである。
【０１７２】
なお、図１２には示されていないが、このデータフォーマット中に、ヒストリ記録間隔をコアサイクル数で表示するフィールド（INTERVAL ）を備えるようにしてもよい。ヒス
トリ記録間隔から、コアサイクル単位のイベント数を算出すれば、イベントの頻度が算出できる。
【０１７３】
ヒストリ記録は、リングバッファ（環状記憶部に相当）として機能するヒストリＲＡＭ上にラップアラウンドして記録される。このため、ヒストリＲＡＭに記録されるイベントの数が極端に少ないときは、前回取得した履歴が今回の履歴にも残っている。したがって、ユーザは同じ履歴を二度に渡って取得してしまう可能性がある。同一履歴の重複した取得を避けるために、例えば、ヒストリ制御部５１Ａ、５２Ａ等が、履歴を一旦クリアしてから次の履歴の採取を開始することもできる。
【０１７４】
本実施形態では、簡単のために履歴の採取を始めるときには、ヒストリ制御部５１Ａ、５２Ａ等が１回既定のビットパターンをヒストリＲＡＭに記録してから、履歴の記録を開始するようにしておく。このパターンは例えば、ゼロが所定個数連続するパターン（以下、識別情報と呼ぶ）でよい。この処理を実行するヒストリ制御部が識別情報設定部に相当する。
【０１７５】
図１３は、履歴の記録を開始するときに、識別情報を埋め込む回路構成を示す図である。図１３に示す構成は、複数のイベント（hitory_event0-4の信号で示されるイベント）
のうちの１つが選択され、ヒストリＲＡＭに書き込む回路の詳細を示している。図１３では、ヒストリＲＡＭに記録されるイベント１つ分のデータを一時的に保持するバッファが２個設けられている。この２つのバッファは、バッファＢＵＦ０とバッファＢＵＦ１で示される。
【０１７６】
選択信号によって選択されたイベントは、スイッチＳＷ１によって、バッファ０またはバッファ１のいずれに交互に書き込まれる。また、ヒストリＲＡＭには、イベントが書き込み中でない、あるいは書き込みが終了したバッファから、イベントが書き込まれる。すなわち、バッファＢＵＦ０とバッファＢＵＦ１は、ヒストリＲＡＭに対して、２面バッファを構成している。
【０１７７】
このような構成において、予め、バッファＢＵＦ０には、ゼロが所定個数連続するパターンが設定される。そして、履歴の記録を開始するときに、最初のイベントは、ＳＷ１によってバッファＢＵＦ１に書き込まれる。その間、バッファＢＵＦ０から、スイッチＳＷ２を介して、識別情報がヒストリＲＡＭに書き込まれる。以降、イベントが取得されるごとに、バッファが切り替えられ、順次、ヒストリＲＡＭに格納する制御が実行される。このようにして、履歴の記録を開始するときに、識別情報が埋め込まれる。
【０１７８】
ここで、ヒストリＲＡＭ５２の場合には、所定個数のゼロを含むパターンは、ヒストリ記録イベントが発生したことを示すビットのMIREQ_VALID,MOREQ_VALID,PFREQ_VALIDがゼ
ロであることを意味する。したがって、識別情報のパターンは、イベント発生時に動作履歴を記録するモードを指示しているときには、ヒストリ記録に残ることがないデータパタ
ーンが記録されていることになる。識別情報のパターンがヒストリに残っていなければ、ユーザは、採取したヒストリに記録されたすべての情報を最新の情報とみなすことができる。識別情報のパターンがいくつか残っていれば、ユーザは、前回の履歴との差分を取るツールを処理装置にて実行することにより、過去に読み出し済みの履歴情報を除外して、最新の履歴情報を取り出すことができる。
【０１７９】
なお、上記では、２面バッファの一方に、初期値として、識別情報を設定する構成が示されたが、履歴の記録を開始するときに識別情報を埋め込む回路構成は、このような回路構成に限定される訳ではない。例えば、ヒストリＲＡＭの入力ポートが２入力のアンドゲートを有するようにしてもよい。そして、第１の入力に採取された履歴が入力され、第２の入力ポートには、履歴の記録開始時だけ０のビットパターンが入力されるようにすればよい。そして、最初のイベント記録後、第２の入力ポートには、１が入力されるようにすればよい。この場合には、最初のイベントが発生したときに、最初のヒストリＲＡＭの記録には、上記識別情報のパターンが記録される。したがって、最初のイベントは記録されないが、簡易に識別情報がヒストリＲＡＭに設定される。また、ヒストリＲＡＭの履歴が統計的に処理される場合には、最初のイベントが記録されなくても、解析への影響は小さい。
【０１８０】
＜解析プログラムの処理＞
以上のようなハードウェアを用いて取得した履歴情報は、ＯＳ配下で動作するユーザプログラムへと渡される。この例では、一旦被解析プログラム中で、履歴情報を取得し、処理装置の外部記憶装置のファイルに蓄積する。そして、処理装置が解析プログラムを実行し、そのようなファイル中の履歴情報を解析する。以下、本方式でキャッシュミスアドレスの履歴を取得した場合について、本処理装置で実行されるユーザプログラム、例えば性能解析プログラムでの扱いを説明する。
【０１８１】
図１４は、本処理装置のプロセッサ部１（以下、単に本処理装置という）で実行されるユーザプログラムの処理を例示する図である。Ｓ１−Ｓ２は、被解析プログラムの処理である。また、Ｓ３−Ｓ８は、解析プログラムの処理である。被解析プログラムは、コンパイルされるときに、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』および『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』という２つのＡＳＩコマンドが組み込まれている。
【０１８２】
この処理では、まず、本処理装置は、被解析プログラムを実行する（Ｓ１）。被解析プログラムの実行によって、ヒストリＲＡＭには、各種イベント、例えば、キャッシュミスが発生したアドレスを含むＭｏｖｅ−Ｉｎ動作が記録される。そして、被解析プログラムの実行終了時に、被解析プログラムの『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令により、本処理装置は、動作履歴を取得する。なお、ここでは動作履歴として、キャッシュミスアドレスを含むものとする。この動作履歴は、例えば、被解析プログラム実行時のログファイルに格納される（Ｓ２）。
【０１８３】
なお、本実施形態では、ヒストリＲＡＭには、例えば、３２ビット×１０２４個の動作履歴、例えばキャッシュミスを起こしたアドレス１０２４個が１つの記録として保持されている。そして、ＪＴＡＧコマンド制御部４０は、処理装置、本実施例では被解析プログラムの実行環境に、その動作履歴を引き渡す。ところで、本実施形態では、本処理装置は、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドを実行すると、JDR[0:31]の３
２ビットの領域を通じて、ヒストリＲＡＭの値を取得する。そのため、この構成では、本処理装置は、JDR[0:31]を通じて１０２４回の読み出し処理を実行し、３２ビット×１０
２４個の動作履歴を取得する。
【０１８４】
また、このとき、読み出される動作履歴は、処理装置が被解析プログラムを実行したと
きに、短期間、例えば数分から数時間に頻発した動作履歴であってもよい。また、この動作履歴は、長期、例えば数日から数ヶ月に渡って処理装置が被解析プログラムを実行したときに、採取された１０２４個の動作履歴であってもよい。
【０１８５】
次に、本処理装置は、採取した履歴と、過去に取得済みの履歴を結合するか否かをユーザに問い合わせる（Ｓ３）。ここで、過去に取得済みの履歴とは、Ｓ１の処理で実行された被解析プログラムと同一の被解析プログラムを処理装置が実行し、採取した履歴である。
【０１８６】
履歴の結合をする旨をユーザが応答した場合、その応答にしたがって、本処理装置は、Ｓ２の処理で取得した履歴と、過去に取得済みの履歴とを結合し、単一のファイルに格納する（Ｓ４）。これにより、本処理装置は、より大きなキャッシュミスアドレスの履歴とみなすための結合履歴を作成する。履歴の結合をしない旨をユーザが応答した場合、その応答にしたがって、本処理装置は、制御をＳ５に進める。
【０１８７】
上記結合履歴は、キャッシュミスを起こしたアドレスそのものである。キャッシュ上のスラッシングを解析するために、本処理装置は、キャッシュインデックスアドレスに丸めたインデックスタグを各キャッシュミスアドレスに付与する（Ｓ５）。
【０１８８】
キャッシュインデックスアドレスに丸めるとは、キャッシュ検索に使用するアドレス部分を取り出すことを意味する。ここでは、例えば、Ｌ１キャッシュ制御部２０がキャッシュ容量３２ＫＢ、２ウェイセットアソシアティブのキャッシュメモリをラインサイズ１２８バイトで管理しているとする。すると、１ウェイ当たりのキャッシュ容量は１６ＫＢとなる。ラインサイズが１２８バイトであることから、１６ＫＢのキャッシュには１６ＫＢ／１２８＝１２８個のキャッシュラインが入ることになる。キャッシュライン数１２８をインデックスするためには２進数表示で７ビットが必要となる。ライン内アドレスはキャッシュラインのインデックスに使えないことから、キャッシュライン内アドレスを除いて、その上位ビットがキャッシュインデックスアドレスに使用される。
【０１８９】
例えば、キャッシュミス履歴に残っているアドレスが0xfffffff8であったとき、インデックスタグは、0x00003f80となる。ここで、下位７ビットの"0000000"は、キャッシュラ
イン内のアドレス部分であり、このアドレス部分はキャッシュインデックスアドレスとしては識別されないため、いずれも０となっている。また、次の７ビット"1111111"は、キ
ャッシュインデックスアドレスを識別するビット部分である。結合履歴にあるそれぞれのアドレスに対してこの操作を行ってインデックスタグを付与することで、キャッシュインデックスアドレス表示を含んだキャッシュミスの結合履歴が作成される。
【０１９０】
次に、本処理装置は、キャッシュミスの結合履歴をインデックスタグの昇順もしくは降順に並べ替える（Ｓ６）。このとき、同一キャッシュインデックスアドレスは連続して複数並ぶ。さらに、本処理装置は、キャッシュミスの結合履歴を並べ替えた結果をキャッシュインデックスアドレスごとに登場回数を数えてヒストグラムを作成する（Ｓ７）。ユーザは、ヒストグラムを作成することで、キャッシュミスを頻繁に起こしたキャッシュインデックスアドレスを可視化することができる。この場合、本処理装置は、ヒストグラムを表示装置に表示してもよい。Ｓ５−Ｓ７を実行する処理装置のプロセッサ部１が、集計する手段に相当する。
【０１９１】
ここでヒストグラムがなだらかな曲線を描けばスラッシングは起きていないが、どこか極端なピークを持った曲線になるとき、そのピークを持ったキャッシュインデックスアドレスでスラッシングが起きていることが表示される。ユーザは、スラッシングが起きているキャッシュインデックスアドレスに着目して、結合履歴に頻繁に登場するキャッシュミ
スアドレスがスラッシングを起こしているアドレスであるとして認識できる。
【０１９２】
そこで、本処理装置は、例えば、ヒストグラムの変化率およびピークの高さをインデックスタグの変化の方向にサーチしてもよい。そして、本処理装置は、ヒストグラムの変化率およびピークの高さの少なくとも一方が所定の基準を超えるインデックスタグの位置をスラッシングが発生しているアドレスとして推定してもよい。本処理装置は、そのようなアドレスに割り付けられている命令列およびその命令に対応するソースコードを表示装置に表示してもよい（Ｓ８）。Ｓ８の処理を実行する処理装置のプロセッサ部１が検出する手段に相当する。なお、ヒストリＲＡＭが、キャッシュミスを発生したアドレスとともに、キャッシュミスが発生したコアサイクルを記録するようにしておいてもよい。そして、本処理装置は、単位時間当たりのキャッシュミスの発生回数のヒストグラムを作成してもよい。そして、本処理装置は、ヒストグラムのピークの高さをインデックスタグの変化の方向にサーチしてもよい。このようにして、本処理装置は、キャッシュミスの頻度が所定の基準を超えるインデックスタグの位置を検出し、検出したインデックスタグの位置をスラッシングが発生しているアドレスとして推定してもよい。
【０１９３】
ここで、本処理装置は、読み取られたアドレスに対応するロード・ストア対象アドレスを発行した命令が、プログラム中のどの命令に対応するかについて、プログラムのソースコードを調べる。スラッシングを起こしているロード・ストア命令がわかれば、その命令が使用するデータ領域の割り当て位置をキャッシュラインで数ライン分ずらすことでスラッシングが解消される。例えば、コンパイラが、コンパイルオプションで、データ領域の割り当てを所定アドレス分だけずらす機能がコンパイラに設けられればよい。データ領域の割り当て位置変更によって、期待通りにスラッシングが回避されたかどうかは、本処理装置が再度被解析プログラムを実行し、再度キャッシュミス履歴を採取するようにすればよい。そして、ユーザがその結合履歴を調べることで、スラッシングが回避された否かを確認することができる。
【０１９４】
図１５に、ユーザプログラム、例として解析プログラムおよび被解析プログラムを含むアプリケーションプログラムを実行するコンピュータの構成を例示する。このコンピュータは、上記処理装置に相当するＣＰＵ２００と、メモリインターフェースを通じてＣＰＵ２００に接続されるメモリ２０１と、Ｉ／Ｏインターフェースを通じてＣＰＵ２００に接続される周辺装置を有している。周辺装置は、例えば、表示装置２０２、内蔵外部記憶装置２０３、着脱可能記憶媒体駆動装置２０４、およびＬＡＮ基板２０５を有している。
【０１９５】
メモリ２０１は、例えば、ＤＲＡＭ（Dynamic Random Access Memory）、ＲＯＭ（Read
Only Memory）、フラッシュメモリである。メモリ２０１には、ＣＰＵ２００で実行されるプログラム、およびＣＰＵ２００が処理するデータが格納される。プログラムには、図１４に示したようなユーザプログラム、およびコンパイラ、ＯＳ（Operating System）等のシステムプログラムが含まれる。
【０１９６】
表示装置２０２は、コンピュータの処理結果を表示する。内蔵外部記憶装置２０３は、例えば、ハードディスクドライブであり、メモリ２０１に読み出される前のユーザプログラム、コンパイラ、ローディング前のＯＳ等が格納される。
【０１９７】
着脱可能記憶媒体駆動装置２０４は、ブルーレイディスク、ＤＶＤ（Digital Versatile Disk）、ＣＤ（Compact Disc）、フラッシュメモリカード等である。上記各種プログラムは、例えば、着脱可能記憶媒体駆動装置２０４またはＬＡＮ基板２０５からインストールされ、内蔵外部記憶装置２０３に格納される。
【０１９８】
＜効果＞
以上述べたように、本実施例の処理装置は、サービスプロセッサ１００の一部機能を、特定の命令セット、以上説明した例ではＡＳＩコマンドと呼ばれるＳＰＡＲＣ−Ｖ９命令セットで定義される体系の中の命令を経由してユーザに開放する。これにより、ユーザからのサービスプロセッサ１００の機能の利用が可能となるため、ユーザプログラムからのヒストリの記録制御が可能となる。
【０１９９】
そして、本処理装置では、ヒストリＲＡＭの内容をユーザ環境に読み出すインターフェースを提供する。そのようなインターフェースは、ＡＳＩコマンドによってＪＴＡＧコマンドをＪＴＡＧ制御部４０に書き込む制御を導入する。このような制御により、システム停止を起こすような危険なコマンドが除かれ、開放可能なＪＴＡＧコマンドの範囲で、ＪＴＡＧコマンドがユーザプログラムから使用されることが可能となる。
【０２００】
このような構成により、処理装置の内部で何が起きているのか、ユーザは、ユーザのコンピュータ環境から確認することが可能となる。すなわち、ユーザが見たいポイントをユーザのコンピュータ環境から指示することが可能となる。ここで、見たいポイントとは、例えば、キャッシュミスのような採取するイベントの種類、あるいは、そのイベントが発生したときに処理装置が実行しているプログラム上の位置等を含む。また、ユーザが、そのポイントを観測するときの条件を指定できるようになる。ここで、「条件」とは、例えば、指定した種類のイベントの発生回数、発生頻度、特定の命令が実行されたときとを含む条件をいう。また、この条件には、記録の開始、イベント採取の開始を指定する条件と、記録の停止、イベント採取の停止を指定する条件が含まれる。
【０２０１】
例えば、ユーザは、解放されたＪＴＡＧコマンドを用いて、命令コード指定のヒストリ停止機能を利用できるようになる。このため、ユーザが観測したい命令列にダイアグ命令としてブランチネバー命令とその命令の空きフィールドに識別ＩＤを埋め込んだ特別の命令を埋め込むこともできる。そして、ユーザがそのような特別の命令をヒストリストップ対象命令として、セットすることにより、ユーザが使用するコンピュータ環境からヒストリを止める場所、つまりプログラムのアドレスの指示が可能となる。
【０２０２】
また、上記処理装置は、上記ＡＳＩコマンドを用いて、ユーザが見たいポイントのプログラムカウンタの値を指示し、さらに、プログラムカウンタがそのポイントを何回目に通過したときの状態を見たいのかを指示するインターフェースを備える。これにより、ユーザが、使用するコンピュータ環境からヒストリを止める場所の指示が可能となる。
【０２０３】
本実施形態の処理装置では、ヒストリ操作など、特定の機能を実行するために必要なＪＴＡＧコマンドの範囲でユーザに開放することが可能となる。このため、ＪＴＡＧコマンドをユーザが安全に使用することが可能となる。
【０２０４】
さらに、上記実施例では、新たなＡＳＩ空間にアクセスするＬ２−ＡＳＩコマンドによって、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』コマンドおよび『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドが定義された。新たなＡＳＩ空間が使用されたため、既存のメモリ空間での既存レジスタ、あるいは、既存のデバイスに割り付けられているアドレスとの競合を考慮する必要がない。また、Ｌ２−ＡＳＩ命令検出部２１によって、Ｌ２−ＡＳＩコマンドがＬ２キャッシュ制御部に引き渡されるので、Ｌ１オペランドキャッシュ１４等のキャッシュメモリに入出力されるデータが留まることを回避できる。そして、Ｌ２キャッシュ制御部３０のＡＳＩ命令解釈部３１からＪＴＡＧコマンド制御部４０に、データを引き渡すことができる。
【実施例３】
【０２０５】
上記実施例２の処理装置においては、ＡＳＩコマンドを使用してＪＴＡＧ資源を使用す
る手段を提示した。しかし、本処理装置の構成は、実施例２の構成に限定される訳ではない。例えば、一般的なＣＰＵにはＡＳＩコマンドが実装されているとは限らない。しかしながら、それぞれのＣＰＵに固有もしくは一般的なコマンドを使用して、実施例１、２の処理装置と同様の仕組みを実装することも可能である。すなわち、ＡＳＩコマンド以外のコマンド体系において、ＪＴＡＧコマンドを利用する仕組みが以下に例示される。なお、本実施例では、ＡＳＩコマンド以外のコマンド体系によってＪＴＡＧコマンドを利用する点以外の構成および作用は、実施例１および実施例２と同様である。そこで、同一の構成要素については、同一の符号を付してその説明を省略する。また、実施例１、実施例２で参照した図面に示される、ＡＳＩコマンドの処理に関する構成以外の構成は、本実施例にそのまま適用できる。
【０２０６】
他の一般的な方式としては、例えば、現在利用されている多くのＣＰＵに備えるコマンドとしてノンキャッシュ空間へのアクセス命令が適用できる。ノンキャッシュ空間とは、キャッシュメモリを介在せずにアクセスされるメモリ空間をいう。ノンキャッシュ空間へのアクセス命令（以下、ノンキャッシュ命令と呼ばれる）は、キャッシュを介さないでデバイスにアクセスする。ノンキャッシュ命令によるノンキャッシュ空間へのアクセスは、ノンキャッシャブル空間として定義されたアドレス空間への読み書きとして定義される。ノンキャッシュ空間へのアクセスの動作は、レジスタの読み書きをしたり、Ｉ／Ｏ装置への動作を指示したりするものである。
【０２０７】
一方、通常のロード／ストア命令（以下、キャッシャブル命令と呼ばれる）は、キャッシュを介して、例えば、物理メモリ等にアクセスする。このようなキャッシュを介在させてアクセスされるメモリ空間をキャッシャブル空間という。キャッシュは、例えば、図２のＬ１オペランドキャッシュ１４、Ｌ２キャッシュデータ部６１等である。本実施例では、ノンキャッシュ空間が第１のアドレス空間に相当する。また、キャッシャブル空間が、第２のアドレス空間に相当する。
【０２０８】
ノンキャッシュ空間へのアクセス命令によって、入出されるデータは、キャッシュに保持されることなく、そのまま物理メモリに入出力されることになる。したがって、ノンキャッシュ空間へのアクセス命令は、プロセッサ１で実行されるユーザプログラムと、ＪＴＡＧコマンド制御部４０とのインターフェースとして好適である。
【０２０９】
キャッシュメモリを経由する可能性のあるキャッシャブル命令によって入出されるデータは、キャッシュメモリ上に維持され、物理メモリに保持されるとは限らない。このため、プロセッサ１で実行されるユーザプログラムと、ＪＴＡＧコマンド制御部４０とのインターフェースとしては、不確定な側面を有する。一方、ノンキャッシュ命令によって入出されるデータは、そのまま、ノンキャッシュアドレスに対応するレジスタまたはＩ／Ｏ装置との間で受け渡しが行われる。このため、ノンキャッシュ命令では、通常のキャッシャブル命令のように、読み書きされるデータがアドレス空間の物理メモリに存在するか否かについての不確実性がない。このような不確実性がない点は、実施例２で用いた種類のＡＳＩコマンドも同様である。この種類のＡＳＩコマンドとは、Ｌ１キャッシュ制御部２０のＬ２−ＡＳＩ命令検出部でＬ２キャッシュ制御部３０に転送すべき命令と判定されたＡＳＩコマンドをいう。
【０２１０】
ただし、ノンキャッシュ空間のアドレスのうち、特定のアドレスは、既存のレジスタ、あるいは、Ｉ／Ｏ装置等に割り付けられている。したがって、ＪＴＡＧコマンドをＪＴＡＧコマンド制御部４０に引き渡すインターフェースは、そのような既存のデバイスに割り付けられたアドレスを回避して設定されなければならない。この点、実施例２のＡＳＩコマンドの場合には、新規なＡＳＩ空間が用いられたので、そのような配慮は不要である。
このノンキャッシュ空間に本方式の２つのアドレス、つまり『ＡＳＩ＿ＣＭＤ＿ＡＣＣ
ＥＳＳ＿ＲＥＧ』、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』用のデータパターンが追加定義され得る。そして、その２つのアドレスへの書き込みが検出されたときに、上記実施例１の処理装置の動作が起動するようにすればよい。このような構成および手順によって、一般的なＣＰＵにおいても実施例１の処理装置と同様の仕組みが、ユーザに利用可能となる。
【０２１１】
図１６に、ノンキャッシュ空間へのアクセスを使用した処理装置の構成を例示する。図１６では、ＡＳＩ空間へのアクセスを利用した説明図である図５と比較して、ＡＳＩ命令検出部２１がノンキャッシュ命令検出部２１Ａに変更されている。Ｌ１キャッシュ制御部２０Ａのノンキャッシュ命令検出部２１Ａは、仮想化アドレスから物理アドレスへの変換過程でＴＬＢを検索する。ノンキャッシュ空間へのアクセスであることが判明した場合、ノンキャッシュ命令検出部２１Ａは、ロード・ストアの区別とともにノンキャッシュ空間へのアクセスであることを明示して、Ｌ２キャッシュ制御部３０Ａへと命令を送出する。もしくは、命令処理装置１１から直接ノンキャッシュ空間へのアクセスが指示された場合も、Ｌ１キャッシュ制御部２０Ａのノンキャッシュ命令検出部２１Ａがその指示を受け付ける。そして、ノンキャッシュ命令検出部２１Ａは、ロード・ストアの区別とともにノンキャッシュ空間へのアクセスであることを明示して、Ｌ２キャッシュ制御部３０Ａへと命令を送出する。
【０２１２】
図５のＬ２キャッシュ制御部３０のＡＳＩ命令解釈部３１は、ＡＳＩ番号とアドレスのビットの一部を用いてＪＴＡＧ制御部４０へのアクセスを割り出していた。一方、図１６では、そのような制御から、ＡＳＩ番号が外され、アドレスの全ビットが使用されるように変更される。あるノンキャッシュアドレスに『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』と２つのコマンドが定義される。そして、このアドレスへのアクセスが発生したら、ノンキャッシュ命令解釈部３１Ａは、ＪＴＡＧ制御部４０へとＪＴＡＧコマンドを渡す。すなわち、図１６の処理装置は、ＡＳＩコマンドに代わって、ノンキャッシュ命令によって、ＪＴＡＧ制御部４０へのアクセスを検出するインターフェースを有する。図１６の他の構成および制御は、ＡＳＩ空間を使用した図５の構成および制御と同様である。
【０２１３】
＜変形例＞
図５に示した実施例２では、プロセッサ部１内にＬ２−ＡＳＩ命令検出部２１が設けられている。そして、Ｌ２−ＡＳＩ命令検出部２１が検出したＡＳＩコマンドは、Ｌ２キャッシュ制御部３０内のＡＳＩ命令解釈部３１から、ＪＴＡＧコマンド制御部４０のレジスタに書き込まれている。また、ＪＴＡＧコマンド制御４０にて読み出された動作履歴は、Ｌ２キャッシュ制御部３０内のコマンド完了通知部およびロードデータ部３３から、プロセッサ部１に引き渡されている。この構成は、実施例１の入力部２と出力部３とが、Ｌ２キャッシュ制御部にある構成を例示している。この構成は、実施例３の図１６においても同様である。しかし、本処理装置は、このような構成に限定される訳ではない。
【０２１４】
例えば、入力部２、および出力部３が、プロセッサ部１内に組み込まれてもよい。例えば、Ｌ１キャッシュ制御部２０がＡＳＩ命令解釈部３１を有するようにすればよい。より具体的には、ＡＳＩ空間番号と、ＡＳＩ空間内の仮想アドレスの下位ビットで指定されるレジスタを判断する回路ブロックが、Ｌ１キャッシュ制御部２０に設けられればよい。そして、Ｌ１キャッシュ制御部２０が『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』命令と、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』命令のいずれが入力されたかを判定すればよい。そのためには、仮想アドレスの下位ビット中の最低１ビットが、指定されればよい。
【０２１５】
そして、Ｌ１キャッシュ制御部２０が、ＪＴＡＧコマンドのデータパターンをＬ２キャ
ッシュ制御部３０内のＪＴＡＧコマンド制御４０に設けられたＪＴＡＧコマンド可否検証部４１に書き込むようにすればよい。また、ＪＴＡＧコマンド制御４０のロードデータ部４３が、Ｌ１キャッシュ制御部２０内のロードデータ部２３に、ヒストリＲＡＭから読み出した動作履歴を引き渡すようにすればよい。この場合、Ｌ２キャッシュ制御部３０の代わり、例えば、データ伝送路が設けられればよい。このような構成は、図１６に示す実施例３においても同様に可能である。
【実施例４】
【０２１６】
本実施例４では、入力部２と出力部３をプロセッサ部１に含める構成例を説明する。他の構成および作用は、実施例１から３と同様である。そこで、実施例１から３と同様の構成要素については、同一の符号を付してその説明を省略する。また、実施例１から３で説明された構成要素は、可能な範囲で、本実施例４の構成に適用される。
【０２１７】
本実施例では、特権レジスタを参照する命令手段に、ＪＴＡＧコマンド制御部４０へのインターフェースが、追加割り当てされる。図１７は、特権命令を用いた制御による、実施例１と同様の制御を実行する処理装置の構成例である。特権命令は、プロセッサ部１の状態、プログラムの実行状態等を制御する命令、あるいは、入出力装置とＣＰＵあるいはメインメモリとの間で、データ転送する命令を含む。
【０２１８】
本実施例では、例えば、プロセッサ部１の既存の命令セットに含まれる特権命令が利用される。特権命令は、例えば特権Ｉ／Ｏ命令と定義される。この特権命令の空きフィールド（オペランドを直接指定するフィールド）に、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』、『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』の２つのコマンドを識別する２ビット（以下、識別ビット[0:1]と呼ぶ）を設ける。例えば、識別ビット[0:1]="01"は、特権
Ｉ／Ｏ命令が『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』を指定すると定義する。また、例えば、識別ビット[0:1]="10"は、特権Ｉ／Ｏ命令が『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』を指定すると定義する。
【０２１９】
そして、特権Ｉ／Ｏ命令を検出するとともに、識別ビット[0:1]を検出する回路ブロッ
クとして、特権命令検出部１１Ｃが命令処理装置１１内に設けられる。特権命令検出部１１Ｃは、命令処理装置１１内で、特権命令を検出する既存の回路ブロックと識別ビット[0:1]を検出する回路とを含む。
【０２２０】
特権命令検出部１１Ｃは、特権Ｉ／Ｏ命令に識別ビット[0:1]が設定されていると、『
ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』あるいは『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』として検知する。すると、特権命令検出部１１Ｃは、『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』あるいは『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』の命令コードをＬ１キャッシュ制御部２０内のレジスタ２１Ｃに書き込む。また、このとき、特権命令検出部１１Ｃは、演算器１２からストアデータ部に、ＪＴＡＧコマンド制御部４０に引き渡されるデータパターンをストアレジスタ２２に書き込むように指示する。したがって、処理装置は、特権Ｉ／Ｏ命令実行前に、演算器１２に、ＪＴＡＧコマンド制御部４０に引き渡されるデータパターンを生成し、準備しておくことになる。
【０２２１】
Ｌ１キャッシュ制御部２０Ｂは、レジスタ２１Ｃに上記命令コードが書き込まれると、その命令コードをそのままＬ２キャッシュ制御部３０Ｂのレジスタ３１Ｃに書き込む。また、ストアデータ部２３は、書き込まれたデータをＬ２キャッシュ制御部３０のストアデータ部３２に送出する。
【０２２２】
Ｌ２キャッシュ制御部３０Ｂは、上記命令コードが書き込まれると、その命令コードをそのままＪＴＡＧコマンド制御部４０のＪＴＡＧコマンド実行可否検証部４１に転送する
。また、このとき、ストアデータ部３０は、書き込まれたデータをＪＴＡＧコマンド実行可否検証部４１に転送する。以降の処理は、実施例１−３と同様である。
【０２２３】
以上のような処理をユーザプログラムから実行するために、コンパイラは、まず、演算器１２にて、ＪＴＡＧコマンド制御部４０に引き渡すべきデータパターンを用意する。このようなデータパターンは、メモリ上に定数として設定しておき、演算器１２に送出されるものでもよい。そして、コンパイラは、プログラム中に、特権Ｉ／Ｏ命令を発行するシステムコール（ＯＳへの要求）を呼び出せばよい。そして、コンパイラは、その特権Ｉ／Ｏ命令のオペランド（空きフィールド）に、識別ビット[0:1]を設定しておけばよい。
【０２２４】
一般的なＣＰＵ等の処理装置はＪＴＡＧコマンドを備える。しかし、ユーザプログラムを実行する処理装置は、ＪＴＡＧコマンドを直接実行することはできない。本方式によって、ユーザプログラムからのＪＴＡＧコマンドが利用できるようになる。その場合、ＪＴＡＧコマンドは、ユーザに開放できるＪＴＡＧコマンドと、ユーザに開放できないＪＴＡＧコマンドとに分けられる。そして、制限された範囲でＪＴＡＧコマンドがユーザに開放される。
【０２２５】
上記構成では、特権命令検出部１１Ｃが、特権Ｉ／Ｏ命令および識別ビット[0:1]を判
定し、ＪＴＡＧコマンド制御部４０宛にデータを送出する。この点で、実施例１の入力部２と出力部３がプロセッサ１内に含まれる例と考えることができる。
【０２２６】
さらに、一般的な方式として他には、プロセッサ部１の命令セットに、キャッシュを介在させないで物理メモリにアクセスする新命令コードを追加して、その命令コードにより、本方式のインターフェースを形成してもよい。すなわち、新命令コードが命令処理装置１１で検出されたときに、Ｌ１キャッシュ制御部２０、Ｌ２キャッシュ制御部３０、さらに、ＪＴＡＧコマンド制御部４０に、ＪＴＡＧコマンドのデータパターンが引き渡されるようにすればよい。
【実施例５】
【０２２７】
上記実施例１から４では、処理装置のユーザプログラムからＪＴＡＧコマンド制御部４０を通じて、ヒストリＲＡＭに記録された動作履歴を読み出すインターフェースが例示された。本実施例では、その場合に、監視対象のユーザプログラム（以下、被監視プログラム）と、その被監視プログラム実行時の動作履歴を読み出す監視プログラムとが、それぞれ異なる並行プロセスで実行される処理装置の例を説明する。被解析プログラムの実行と並行して、監視プロセスを起動した方が、処理装置での処理が簡潔となる場合がある。さらに、バイナリデータとして配布されているような被解析プログラムを調査するに当たっては、披解析プログラムの実行と平行して、監視プログラムを起動することで、任意のプログラムを監視することも可能となる。
【０２２８】
図１８は、処理装置で実行される被監視プログラムの処理を示すフローチャートである。図１８に示す処理では、まず、処理装置は、監視プログラムのプロセスを起動する（Ｓ１１）。監視プログラムの詳細は、別途、図１９および図２０に例示される。プロセスが起動されると、起動元のプログラムとは異なる実行環境が起動されたプログラムに付与されるようにしてもよい。ここでは、例えば、起動元の被解析プログラムは、プロセッサ部１−１で実行され、起動された監視プログラムは、プロセッサ部１−２で実行されるとの仮定がなされている。
【０２２９】
次に、処理装置は、ＪＴＡＧコマンドを、例えば実施例２に例示した『ＡＳＩ＿ＣＭＤ＿ＡＣＣＥＳＳ＿ＲＥＧ』によって書き込む（Ｓ１２）。このとき、処理装置は、採取するイベントの種類、イベントを採取するときの条件をＪＴＡＧコマンドとともに指定する
。なお、ＪＴＡＧコマンドの書き込みは、例えば、実施例３、４に例示したインターフェースによるものでもよい。これによって、ＪＴＡＧコマンドが、ＪＴＡＧコマンドに引き渡され、履歴情報が取得される。なお、ＪＴＡＧコマンド書き込み時のエラー処理等は、ここでは、省略されている。ただし、Ｓ１２の処理では、図７、図８に示したエラー処理の手順が実行されるようにしてもよい。
【０２３０】
次に、処理装置は、プログラムの処理を実行する（Ｓ１３）。ここで、プログラムの処理とは、被解析プログラムが本来実行すべきアプリケーションの処理である。そして、処理装置は、プログラムの処理を終了するか否かを判定する（Ｓ１４）。終了する場合としては、例えば、実行すべきデータ処理、演算等が終了した場合、あるいはユーザインターフェースを通じて、ユーザから終了の指令を受け取った場合が想定される。
【０２３１】
プログラム処理が終了しない場合、処理装置は、制御をＳ１３に戻す。一方、プログラム処理が終了する場合には、処理装置は、監視プログラムを停止させる（Ｓ１５）。監視プログラムは、例えば、被解析プログラムから監視プログラムへのメッセージの送信、共有メモリを通じた指示等で、監視プログラムに終了を通知することも可能である。そして、被解析プログラムは処理を終了する。
【０２３２】
図１９は、監視プログラムの処理を例示する図である。この処理では、処理装置、例えば監視プログラムのプロセスが割り当てられたプロセッサ部１−２は、実施例２に例示した『ＡＳＩ＿ＣＭＤ＿ＲＥＣＥＩＶＥ＿ＲＥＧ』コマンドを起動する（Ｓ１１１）。なお、実施例２のＡＳＩ経由のコマンドに代えて、例えば、実施例３、４に例示したインターフェースによるコマンドが起動されてもよい。Ｓ１１１の処理を実行する処理装置のプロセッサ部１が取得部に相当する。
【０２３３】
そして、処理装置は、データパターンのＪＤＲ（ヒストリＲＡＭに記録されていたイベントの情報）をバッファに読み出す（Ｓ１１２）。ここで、バッファとは、例えば３２ビットのＪＤＲを所定個数一時的に保持するメモリ上の領域である。
【０２３４】
次に、処理装置は、所定回数読み出しか否かを判定する（Ｓ１１３）。ここで、所定回数読み出すのは、データパターンのＪＤＲのデータサイズが、ヒストリＲＡＭ容量より小さい場合があるからである。例えば、ヒストリＲＡＭが、３２ビット×１０２４個＝１ＫＢの容量がある場合、処理装置は、データパターンのＪＤＲ（３２ビット）を通じて、１０２４回の読み出しを繰り返すことになる。そこで、まだ、所定回数読み出していない場合には、処理装置は、制御をＳ１１１に戻す。これにより、処理装置は、ＪＴＡＧコマンド制御部４０を通じて、次のデータをヒストリＲＡＭから読み出す処理を繰り返す。
【０２３５】
一方、所定回数の読み出しが終了した場合には、処理装置は、バッファの内容、すなわち、ヒストリＲＡＭに記録されていたイベントの情報を履歴ファイルに蓄積する（Ｓ１１４）。ここで、履歴ファイルは、例えば、図１５に示した内蔵外部記憶装置２０３のファイルである。また、蓄積とは、追加書きすることを意味する。Ｓ１１４の処理を実行する処理装置のプロセッサ部１は、履歴結合部に相当する。なお、処理装置は、解析プログラム実行時に、Ｓ１１４の処理で作成された履歴ファイルと、過去に作成された履歴ファイルをさらに結合するようにしてもよい（図１４のＳ４参照）。そのような解析プログラムを実行する処理装置のプロセッサ部１も、履歴結合部に相当する。
【０２３６】
次に、処理装置は、所定時間待つ（Ｓ１１５）。所定時間は、例えば、ユーザがユーザインターフェース経由で、処理装置に設定した値である。そして、所定時間が経過すると、処理装置は、プロセスを終了するか否かを判定する（Ｓ１１６）。プロセスの終了は、例えば、メッセージの送信、共有メモリを通じた指示等で、被監視プログラムから通知さ
れる。プロセスを終了しない場合、処理装置は、制御をＳ１１１に戻す。このようにして、所定時間間隔で、被監視プログラムから停止の指示を受けるまで、記録された動作履歴の読み出しを継続することになる。一方、被監視プロセスから終了の指示を受けると、監視プログラムは、プロセスを終了する。なお、所定時間は０であってもよい。この場合には、処理装置は、待ち時間なしでＳ１１１からＳ１１６までの処理を繰り返すことになる。ただし、待ち時間なしでも、Ｓ１１１からＳ１１５の処理には、処理時間が必要である。
【０２３７】
このように、本実施例の処理装置では、所定の時間間隔で、断続的にＪＴＡＧコマンド制御部４０から、実施例１から４で説明したインターフェースを通じて、ヒストリＲＡＭに記録されたイベントの情報が収集され、所定の履歴ファイルに蓄積される。本処理装置は、図１８の被監視プログラムを実行中に、ＪＴＡＧコマンド制御部４０に対して、ヒストリＲＡＭへの動作履歴の記録を指示する。そして、本処理装置は、被監視プログラムの実行と並行して、監視プログラムを実行し、所定の時間間隔で、動作履歴を読み出すことができる。
【０２３８】
図２０に、監視プログラムの他の処理例を示す。図２０では、ヒストリＲＡＭが十分でない場合、例えばヒストリＲＡＭが１回のイベントの発生を記録する容量を備える場合の監視プログラムの処理を例示する。図２０の処理では、図１９にあったＳ１１２からＳ１１４までの処理が、Ｓ１１２Ａに変更されている。すなわち、ヒストリＲＡＭが１回のイベントの発生を記録する容量に制限される場合には、データパターンのＪＤＲを通じた１回の読み出し処理で、ヒストリＲＡＭの動作履歴が読み出される。この場合には、処理装置は、読み出した動作履歴をそのまま履歴ファイルに蓄積すればよい（Ｓ１１２Ａ）。そして、処理装置は、所定時間待って（Ｓ１１５）、Ｓ１１１に制御を戻し、図１９と同様の動作を繰り返せばよい。
【０２３９】
このような監視プログラムの処理により、ヒストリＲＡＭを備えていない、１回のイベントを記録する手段を有する処理装置においても、解析機能が実現される。すなわち、図２０の監視プログラムの処理によれば、ＪＴＡＧコマンド制御部４０が少なくとも１回のイベントを記録し、読み出しをする手段を有していればよい。すると、上記監視プログラムによるヒストリファイルへの蓄積処理によって、十分なヒストリＲＡＭを有する処理装置と同等の解析機能が提供される。１回のイベントを長期に渡って継続して蓄積した履歴ファイルが統計的に処理されることによって、短時間に取得された多数のイベントの記録と同様とみなされるからである。
【０２４０】
すなわち、処理装置が少なくとも１回のイベントを記録し、読み出しをする手段を有することができれば、パフォーマンス解析が実現できる。この場合、図２０の監視プログラムの処理で、Ｓ１１１−Ｓ１１２Ａの処理に要する時間、ＪＴＡＧコマンド制御部４０は、イベントを保持すればよい。なお、Ｓ１１１−Ｓ１１２Ａの処理に要する時間に、複数回採取対象のイベントが発生した場合には、最新のイベントの記録が、ＪＴＡＧコマンド制御部４０から監視プログラムに引き渡されることになる。
【０２４１】
＜その他の変形例＞
様々なヒストリ情報を、どのようなタイミングで採取し、どのようにその情報を解析し、どのように性能向上にフィードバックしていくかの詳細については、上記以外に様々な手法が存在する。しかしながら、上記で述べたにように、目的に応じたヒストリ情報を選択して取得し、その結果を様々な手法で解析することで、性能向上に向けた取り組みをすることができる。
【０２４２】
本処理装置は、ＪＴＡＧコマンドから一部分を選択してユーザに開放する。このため、
本処理装置のユーザは、ＪＴＡＧコマンドが持つ豊富で強力な機能を、安全にユーザが使用することができる。ただし、ユーザがＯＳを通じて非公開の機能を利用できるように、そのような機能がＯＳ経由で起動されるようにしてもよい。そのような機能は、一般には開放されないが、システム管理用途にユーザに使用され得る。そうすると、例えば、ユーザは、ＪＴＡＧコマンドが備えるクロック制御機構を使って、ＯＳからＣＰＵのクロックを起動したり停止したり、動作周波数を変更することも可能となる。また、ユーザは、ＪＴＡＧコマンドが備えるキャッシュメモリ容量の変更機能を使って、ＯＳなどからキャッシュ容量を変更することによる電力対策を行うことも可能となる。
【０２４３】
さらに、本処理装置には、実装されているさらに多くのＪＴＡＧコマンドを開放する動作モードが設けられてもよい。そのような動作モードでは、ユーザは、ＣＰＵの設計検証を実動作環境で行うに当たって、プログラム上の任意の場所にＪＴＡＧコマンドを結びつけることができるようになる。これにより、デバッグ用途での設計者向けの機能が拡張可能となる。
【０２４４】
また別の例としては、例えば、プログラムがコンパイラ最適化により命令実行順序が入れ替えられる場合の解析に適用できる。特に、ハードウェアはアウトオブオーダ実行によりコンパイラが入れ替えた命令の実行順序を、再度ハードウェアの状況に応じて入れ替えている。このような処理のため、従来、プログラマ、コンパイラ開発者、ハードウェア発者が意図した通りに処理装置が動作しているかどうかを知ることが困難であった。すなわち、従来、チューニングの適否を確認するため、期待した性能が出ているかどうかだけが確認されていた。したがって、ユーザが、予期せぬ性能低下に遭遇したとき、問題とその原因を把握することが困難であった。上記複数の実施例で示したＪＴＡＧコマンド実行機能を用いることで、予期せぬ性能低下に遭遇したときの解析手段が提供される。
【符号の説明】
【０２４５】
１  プロセッサ部
２  入力部
３  出力部
４  管理部
５  履歴記録部
１１  命令処理装置
１２  演算器
１３  Ｌ１命令キャッシュ
１４  Ｌ１オペランドキャッシュ
２０  Ｌ１キャッシュ制御部
２１  ＡＳＩ命令検出部
２２，３２  ストアデータ部
２３  ロードデータ部
３０  Ｌ２キャッシュ制御部
３１  ＡＳＩ命令解釈部
３３  コマンド完了通知部およびロードデータ部
４０  ＪＴＡＧコマンド制御部
４１  ＪＴＡＧコマンド実行可否検証部
４２  ＪＴＡＧコマンド実行部
４３  ロードデータ部
５１，５２，５３，５４，５５，５６  ヒストリＲＡＭ
５１Ａ、５２Ａ  ヒストリ制御部
１００  サービスプロセッサ
【図１】
2010218367.tif 000003
【図２】
2010218367.tif 000004
【図３Ａ】
2010218367.tif 000005
【図３Ｂ】
2010218367.tif 000006
【図４】
2010218367.tif 000007
【図５】
2010218367.tif 000008
【図６】
2010218367.tif 000009
【図７】
2010218367.tif 000010
【図８】
2010218367.tif 000011
【図９】
2010218367.tif 000012
【図１０】
2010218367.tif 000013
【図１１】
2010218367.tif 000014
【図１２】
2010218367.tif 000015
【図１３】
2010218367.tif 000016
【図１４】
2010218367.tif 000017
【図１５】
2010218367.tif 000018
【図１６】
2010218367.tif 000019
【図１７】
2010218367.tif 000020
【図１８】
2010218367.tif 000021
【図１９】
2010218367.tif 000022
【図２０】
2010218367.tif 000023