(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024040922
(43)【公開日】2024-03-26
(54)【発明の名称】演算処理装置、演算処理方法及び情報処理装置
(51)【国際特許分類】
G06F 9/38 20180101AFI20240318BHJP
G06F 9/32 20180101ALI20240318BHJP
【FI】
G06F9/38 330K
G06F9/32 387
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2022145583
(22)【出願日】2022-09-13
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】尤 春▲よう▼
(72)【発明者】
【氏名】岡崎 亮平
【テーマコード(参考)】
5B013
5B033
【Fターム(参考)】
5B013AA12
5B013BB01
5B013BB18
5B033CA19
5B033EA03
5B033FA16
(57)【要約】
【課題】予測精度を維持しつつ演算性能を向上させる演算処理装置、演算処理方法及び情報処理装置を提供する。
【解決手段】分岐予測機構170は、フェッチされたコール命令から得られる予測情報をRASフェッチ171に格納し且つリターン命令で使用される予測情報をRASフェッチ171から取得して削除し、コール命令の実行の完了後に予測情報をRASコンプリート172に格納し且つリターン命令の実行の完了後にRASコンプリート172から予測情報を削除する。分岐命令処理部140は、分岐命令を実行させる複数のエントリを格納するキューを有し、分岐予測ミスを検出した分岐命令を再実行せるエントリのうち、キューの先頭に最も近い第1エントリを特定し、第1エントリより先頭に近いエントリに格納されたコール命令及びリターン命令にしたがってRASフェッチ171に対して予測情報の格納及び削除を行い、第1エントリを再実行させる。
【選択図】
図2
【特許請求の範囲】
【請求項1】
命令をフェッチして実行するパイプラインと、
前記パイプラインによりフェッチされたコール命令から得られる予測情報を第1格納部に格納し且つ前記パイプラインによりフェッチされたリターン命令で使用される前記予測情報を前記第1格納部から取得して削除し、前記パイプラインによる前記コール命令の実行の完了後に前記予測情報を第2格納部に格納し且つ前記パイプラインによる前記リターン命令の実行の完了後に前記第2格納部から前記予測情報を削除する分岐予測機構と、
前記コール命令及び前記リターン命令を含む分岐命令を前記パイプラインに実行させる複数のエントリを格納するキューを有し、前記分岐命令に対する分岐予測ミスを検出し、前記分岐予測ミスを検出した前記分岐命令を再実行せるエントリのうち、前記キューの先頭に最も近い第1エントリを特定し、前記第1エントリより前記キューの先頭に近いエントリに格納された前記コール命令及び前記リターン命令にしたがって前記第1格納部に対して前記予測情報の格納及び削除を行い、前記第1エントリを前記パイプラインに再実行させる分岐命令処理部と
を備えたことを特徴とする演算処理装置。
【請求項2】
前記分岐命令処理部は、前記第2格納部が保持する情報を前記第1格納部にコピーし、且つ、前記第1エントリより前記キューの先頭に近いエントリに格納された前記コール命令及び前記リターン命令にしたがって前記第1格納部に対して前記予測情報の格納及び削除を行うことを特徴とする請求項1に記載の演算処理装置。
【請求項3】
前記分岐命令処理部は、特定の分岐命令に対する前記分岐予測ミスを検出した場合、前記特定の分岐命令を再実行させるエントリから前記キューの先頭の間で前記第1エントリを特定することを特徴とする請求項1に記載の演算処理装置。
【請求項4】
前記分岐命令処理部は、前記第1エントリよりも前記キューの先頭に近いエントリにより実行される分岐命令を前記パイプラインから除くことを特徴とする請求項1に記載の演算処理装置。
【請求項5】
前記分岐命令処理部は、前記パイプラインに対して、前記第1エントリの再実行を要求し、且つ、前記第1格納部に対する前記予測情報の格納及び削除が完了するまで前記第1エントリの再実行を待機させることを特徴とする請求項1に記載の演算処理装置。
【請求項6】
命令をフェッチして実行するパイプラインを有する演算処理装置が、
前記パイプラインによりフェッチされたコール命令から得られる予測情報を第1格納部に格納し且つ前記パイプラインによりフェッチされたリターン命令で使用される前記予測情報を前記第1格納部から取得して削除し、
前記パイプラインによる前記コール命令の実行の完了後に前記予測情報を第2格納部に格納し且つ前記パイプラインによる前記リターン命令の実行の完了後に前記第2格納部から前記予測情報を削除し、
前記コール命令及び前記リターン命令を含む分岐命令を前記パイプラインに実行させる複数のエントリをキューに格納し、
前記分岐命令に対する分岐予測ミスを検出し、
前記分岐予測ミスを検出した前記分岐命令を再実行せるエントリのうち、前記キューの先頭に最も近い第1エントリを特定し、
前記第1エントリより前記キューの先頭に近いエントリに格納された前記コール命令及び前記リターン命令にしたがって前記第1格納部に対して前記予測情報の格納及び削除を行い、
前記第1エントリを前記パイプラインにより再実行する
ことを特徴とする演算処理方法。
【請求項7】
演算処理部を有する情報処理装置であって、
前記演算処理部は、
命令をフェッチして実行するパイプラインと、
前記パイプラインによりフェッチされたコール命令から得られる予測情報を第1格納部に格納し且つ前記パイプラインによりフェッチされたリターン命令で使用される前記予測情報を前記第1格納部から取得して削除し、前記パイプラインによる前記コール命令の実行の完了後に前記予測情報を第2格納部に格納し且つ前記パイプラインによる前記リターン命令の実行の完了後に前記第2格納部から前記予測情報を削除する分岐予測機構と、
前記コール命令及び前記リターン命令を含む分岐命令を前記パイプラインに実行させる複数のエントリを格納するキューを有し、前記分岐命令に対する分岐予測ミスを検出し、前記分岐予測ミスを検出した前記分岐命令を再実行せるエントリのうち、前記キューの先頭に最も近い第1エントリを特定し、前記第1エントリより前記キューの先頭に近いエントリに格納された前記コール命令及び前記リターン命令にしたがって前記第1格納部に対して前記予測情報の格納及び削除を行い、前記第1エントリを前記パイプラインに再実行させる分岐命令処理部とを備えた
ことを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、演算処理装置、演算処理方法及び情報処理装置に関する。
【背景技術】
【0002】
プロセッサが実行するプログラムには、分岐命令を含むものがある。分岐命令の実行では、分岐せずにプログラムカウンタにおいて分岐命令直後に続く命令から実行を続ける場合と、分岐してプログラム内の異なる位置の命令から実行を続ける場合がある。分岐命令を実行した場合に、分岐するか分岐しないかは分岐命令が実行ステージを過ぎるまで確定しない。以下では、命令が命令パイプラインの実行ステージを過ぎることを、その命令の処理が完了すると言う。
【0003】
分岐命令がある場合、それに続いて実行される命令は、分岐命令の実行結果に依存する。このため、分岐命令が実行ステージに至るまでの間、パイプラインはストールする。このストールをなくすため、一般的に採られている方策が命令の投機的実行である。命令の投機的実行とは、分岐命令の実行結果が判明する前に、分岐命令の実行結果を予測し、予測結果に基づいて分岐に続く命令の実行を開始することをいう。分岐命令の実行結果の予測は、分岐予測と呼ばれる。分岐予測が正しければ、パイプラインは分岐がなかったかのように流れ、ストールを除去することができる。
【0004】
これに対して、分岐予測が誤っていれば、プロセッサは、分岐予測に基づいてパイプラインに投入された命令を無効化し、予測結果とは反対の方向の命令を改めてパイプラインに投入する。分岐予測が予測を外した場合、プロセッサは、分岐予測ミスを検出して再命令フェッチを正しい分岐命令のアドレスからかけなおし、同時に誤ったパスの実行をパイプラインからクリアする。再命令フェッチは、分岐命令用のリザベーションステーションなどの分岐命令を処理する機構から命令フェッチに向けて発行される。ここでは、分岐命令を処理する機構として、RSBR(Reservation Station for Branch)を用いる場合で説明する。
【0005】
従来、RSBRは、分岐命令をインオーダーで処理し、分岐予測ミスが判明して再命令フェッチを行うことが明らかになっても、その分岐命令が自己の有するキューの先頭(TOQ:Top Of Que)になるまでそれ以前の分岐命令の処理の完了を待つ。そして、RSBRは、それ以前の分岐命令の処理が完了して分岐が確定し、再命令フェッチを求める分岐命令がTOQになると、その分岐命令の再命令フェッチ要求を出力する。この場合、RSBRは、分岐予測ミスが確定しても前方の分岐命令の処理が完了するまで再命令フェッチの出力を待機することになり、待機時間分処理が停止するため性能的な損失が生じる。
【0006】
このような損失に対して、RSBRは、先に再命令フェッチを出力できれば、命令フェッチまでのパイプラインの処理時間による遅延を隠すことができる。すなわち、RSBRは、分岐予測ミスが発生した場合、分岐命令に対する再命令フェッチ要求をアウトオブオーダーで実行することで、インオーダーにより再命令フェッチ要求を出す場合に比べて、待ち時間分早く再命令フェッチで取得される命令が処理可能である。
【0007】
しかし、再命令フェッチ要求をアウトオブオーダーで実行する場合、再命令フェッチの対象の分岐からTOQ間のコール命令やリターン命令が分岐予測に反映されないことが考えられる。その場合、リターンアドレススタック(RAS:Return Address Stack)による分岐予測精度が下がるという問題が生じる。
【0008】
リターンアドレススタックでは、命令フェッチを基準に更新するインストラクションフェッチ(Instruction Fetch)に基づくRASフェッチと、分岐命令の実行が完了した状態である分岐完了(Branch complete)を基準に更新する分岐処理完了に基づくRASコンプリートとが用いられる。コール命令であれば、プロセッサは、命令フェッチ段階で、その戻り先のアドレスをRASフェッチに格納する。戻り先アドレスの格納は、プッシュ(push)と呼ばれる。また、リターン命令であれば、プロセッサは、命令フェッチ段階で、対応するコール命令の戻り先アドレスをRASフェッチから取得する。戻り先アドレスの取得は、ポップ(pop)と呼ばれる。また、バックアップとして命令の処理完了の段階で、プロセッサは、コール命令であればRASコンプリートをプッシュし、リターン命令であればRASコンプリートをポップする。基本的には、プロセッサは、RASフェッチを用いてコール命令及びリターン命令のそれぞれに対してポップ及びプッシュを行いながら予測を行う。そして、再命令フェッチを行う場合、プロセッサは、RASコンプリートの情報をRASフェッチにコピーして再命令フェッチを用いる分岐命令の情報を反映させてから再命令フェッチを始める。
【0009】
こうすることで、再命令フェッチがTOQから出力される場合、分岐命令の処理はインオーダーで行われるため、RASコンプリートはTOQまでの分岐命令の情報が反映される。プロセッサは、再命令フェッチとなった分岐命令以前の全てのコール命令及びリターン命令の情報を復元してから、再命令フェッチされた命令を処理するので、リターンアドレススタックによる予測を行うことが可能となる。
【0010】
なお、分岐予測の技術として、TOQより後の最初の発行可能なエントリをアウトオブオーダーで発行を行うが、バリアマクロ命令より前のロード命令の場合、フェッチポートにキューインするまでロード命令の投機的な発行を抑止する技術が提案されている。また、プログラム識別情報及び分岐予測テーブルを基に分岐命令に対するターゲット予測情報を決定し、ターゲット予測情報に基づいて予測処理を行い、分岐命令に対する予測結果を生成する技術が提案されている。
【先行技術文献】
【特許文献】
【0011】
【特許文献1】特開2019-200523号公報
【特許文献2】特表2021-516384号公報
【発明の概要】
【発明が解決しようとする課題】
【0012】
しかしながら、アウトオブオーダーで再命令フェッチを発行する場合、アウトオブオーダーで再命令フェッチを発行したい分岐命令からTOQまでの間にコール命令やリターン命令が存在すると、その情報はRASコンプリートに反映されない。そのため、プロセッサは、RASコンプリートの情報をRASフェッチにコピーしても、それらの命令の戻り先アドレスをリターンアドレススタックの実行に反映することが困難となる。
【0013】
例えば、コール命令Aとコール命令Bとがこの順番で処理される場合で、且つ、それぞれの戻り先のアドレスがA+4及びB+4の場合で説明する。この場合に、コール命令Aが処理完了段階に達した後に、コール命令Bが完了していないままに、後ろの分岐命令で分岐予測ミスが発生し、その分岐命令の再命令フェッチ要求がアウトオブオーダーで発行されると、以下のような問題が発生する。すなわち、再命令フェッチ要求が発行される時点で、RASコンプリートには、コール命令Aの戻り先のアドレスであるA+4が反映されているが、コール命令Bの戻り先アドレスであるB+4は反映されていない。そのため、RASコンプリートの情報そのままRASフェッチにコピーすると、RASフェッチにはコール命令Bの戻り先アドレスであるB+4は反映されない。その結果、プロセッサは、リターンアドレススタックによる分岐予測に失敗する。
【0014】
このように、分岐予測ミスが一度発生した場合に、分岐に対する再命令フェッチ要求をアウトオブオーダーで実行すると、リターンアドレススタックの分岐予測に影響を及ぼし、予測精度が悪化する可能性がある。そのため、従来は、分岐予測ミスが発生した場合に分岐に対する再命令フェッチ要求をアウトオブオーダーで実行することが困難であった。そのため、従来の技術では、予測精度を維持しつつ再命令フェッチの処理を高速化することは難しく、演算処理装置の演算性能を向上させることは困難であった。
【0015】
開示の技術は、上記に鑑みてなされたものであって、予測精度を維持しつつ演算性能を向上させる演算処理装置、演算処理方法及び情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【0016】
本願の開示する演算処理装置、演算処理方法及び情報処理装置の一つの態様において、パイプラインは、命令をフェッチして実行する。分岐予測機構は、前記パイプラインによりフェッチされたコール命令から得られる予測情報を第1格納部に格納し且つ前記パイプラインによりフェッチされたリターン命令で使用される前記予測情報を前記第1格納部から取得して削除する。また、分岐予測機構は、前記パイプラインによる前記コール命令の実行の完了後に前記予測情報を第2格納部に格納し且つ前記パイプラインによる前記リターン命令の実行の完了後に前記第2格納部から前記予測情報を削除する。分岐命令処理部は、前記コール命令及び前記リターン命令を含む分岐命令を前記パイプラインに実行させる複数のエントリを格納するキューを有する。また、分岐命令処理部は、前記分岐命令に対する分岐予測ミスを検出し、前記分岐予測ミスを検出した前記分岐命令を再実行せるエントリのうち、前記キューの先頭に最も近い第1エントリを特定する。また、分岐命令処理部は、前記第1エントリより前記キューの先頭に近いエントリに格納された前記コール命令及び前記リターン命令にしたがって前記第1格納部に対して前記予測情報の格納及び削除を行い、前記第1エントリを前記パイプラインに再実行させる。
【発明の効果】
【0017】
1つの側面では、本発明は、予測精度を維持しつつ演算性能を向上させることができる。
【図面の簡単な説明】
【0018】
【
図1】
図1は、実施例に係るシステムの構成例を示す図である。
【
図2】
図2は、実施例に係るスーパースカラプロセッサの構成例を示す図である。
【
図3】
図3は、実施例に係る演算処理装置におけるアウトオブオーダーで再命令フェッチ要求を出力する場合の処理の概要を示す図である。
【
図4】
図4は、アウトオブオーダーで再命令フェッチを行う場合のRSBRキューに格納された各エントリの処理順を示す図である。
【
図5】
図5は、実施例に係る演算処理装置による再命令フェッチ処理のフローチャートである。
【発明を実施するための形態】
【0019】
以下に、本願の開示する演算処理装置、演算処理方法及び情報処理装置の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する演算処理装置、演算処理方法及び情報処理装置が限定されるものではない。
【実施例0020】
図1は、実施例に係るシステムの構成例を示す図である。本実施例に係るシステムは、例えば、
図1に示すサーバ1である。
【0021】
サーバ1は、複数のCPU(Central Processing Unit)10、複数のメモリ11及びインターコネクト制御部12を有する情報処理装置である。
【0022】
インターコネクト制御部12は、CPU10の通信を中継する。例えば、インターコネクト制御部12は、CPU10同士の通信の中継を行う。また、インターコネクト制御部12は、各CPU10と外部装置2との間の通信を中継する。
【0023】
メモリ11は、主記憶装置である。メモリ11は、例えば、DRAM(Dynamic Random Access Memory)である。
【0024】
CPU10は、それぞれが別々のメモリ11に接続される。また、CPU10は、それぞれインターコネクト制御部12に接続される。このCPU10が、「演算処理装置」及び「演算処理部」の一例にあたる。
【0025】
CPU10は、インターコネクト制御部12を介して、他のCPU10や外部装置2と通信を行う。また、CPU10は、メモリ11を用いて各種プログラムを実行する。
【0026】
また、本実施例に係るCPU10は、パイプライン処理によりプログラムを実行する。さらに、CPU10は、プログラムの実行の際に、分岐命令を処理する機構が有するキューのエントリとして分岐命令を格納して管理する。さらに、CPU10は、分岐命令に対して分岐予測を行い、プログラムを実行する。
【0027】
分岐予測ミスが発生した場合、CPU10は、分岐命令を格納するキューにおける分岐予測ミスが発生したエントリについて、正しい分岐命令のアドレスから処理を続行するための再命令フェッチをアウトオブオーダーで行う。この時、CPU10は、分岐命令を格納するキューにおいてそのエントリよりTOQに近いエントリの中に再命令フェッチを行うエントリが存在するか否かを探索し、アウトオブオーダーで再命令フェッチを行う対象となるエントリを特定する。
【0028】
そして、CPU10は、RASコンプリートからRASフェッチへ情報をコピーする。さらに、CPU10は、特定したエントリとTOQとの間に存在するコール命令及びリターン命令を探索する。コール命令を検出した場合、CPU10は、RASフェッチをプッシュする。また、リターン命令を検出した場合、CPU10は、RASフェッチをポップする。その後、CPU10は、特定したエントリで指定された分岐命令の再命令フェッチを実行する。以下に、CPU10の詳細の一例を説明する。
【0029】
図2は、実施例に係るスーパースカラプロセッサの構成例を示す図である。ここでは、CPU10が複数のパイプライン処理を並列で行うスーパースカラプロセッサである場合を例に説明する。ただし、
図2はCPU10の一例であり、CPU10は、他の構成のプロセッサでもよい。
【0030】
CPU10は、
図2に示すように、命令フェッチアドレス生成器101、1次命令キャッシュ102、2次命令キャッシュ103、命令バッファ104、命令デコーダ105、リネーミングレジスタ106を有する。また、CPU10は、RSA(Reservation Station for Address Generation)110、オペランドアドレス生成器111及び1次データキャッシュ112を有する。また、CPU10は、RSE(Reservation Station for Execution)120、演算器121、固定小数点更新バッファ122、固定小数点レジスタ123、RSF(Reservation Station for Floating Point)130、演算器131、浮動小数点更新バッファ132及び浮動小数点レジスタ133を有する。また、CPU10は、RSBR140、CSE(Commit Stack Entry)150、プログラムカウンタ(PC:Program Counter)160及び分岐予測機構170を有する。CPU10における2次命令キャッシュ103以外の各部を含む機構は、コアと呼ばれる場合がある。RSA110、RSE120、RSF130及びRSBR140などの各リザベーションステーションは、命令が実行可能になるまで保持する機構である。RSA110、RSE120、RSF130及びRSBR140は、それぞれがキューを有する。
【0031】
命令フェッチアドレス生成器101、命令バッファ104、命令デコーダ105は、命令実行のパイプラインにあたる。また、命令フェッチアドレス生成器101及び命令バッファ104が、命令フェッチ機構にあたる。
【0032】
命令フェッチアドレス生成器101は、プログラムカウンタ160からプログラムの順番にしたがった命令のフェッチアドレスの入力を受ける。また、命令フェッチアドレス生成器101は、分岐予測機構170により分岐予測されたフェッチアドレスの入力を受ける。
【0033】
命令フェッチアドレス生成器101は、分岐予測機構170からのフェッチアドレスの指定が無い場合、プログラムカウンタ160から取得した順に命令を処理する。また、命令フェッチアドレス生成器101は、分岐予測機構170からフェッチアドレスの指定を受けた場合、指定されたフェッチアドレスの命令を処理し、その後、プログラムカウンタ160から取得した順にその命令に続く命令の処理を継続する。
【0034】
命令フェッチアドレス生成器101は、以下のように各命令を処理する。命令フェッチアドレス生成器101は、指定されたフェッチアドレスの命令が1次命令キャッシュ102でキャッシュヒットした場合、1次命令キャッシュ102が保持する命令を命令バッファ104に格納させる。これに対して、1次命令キャッシュ102でキャッシュミスした場合、命令フェッチアドレス生成器101は、2次命令キャッシュ103において対象の命令を探索する。2次命令キャッシュ103でキャッシュヒットした場合、命令フェッチアドレス生成器101は、2次命令キャッシュ103が保持する命令を1次命令キャッシュ102に格納させるとともに、命令バッファ104にその命令を格納させる。2次命令キャッシュ103でキャッシュミスした場合、命令フェッチアドレス生成器101は、メモリ11から命令を取得する。その後、命令フェッチアドレス生成器101は、2次命令キャッシュ103が保持する命令を1次命令キャッシュ102に格納させるとともに、命令バッファ104にその命令を格納させる。
【0035】
命令バッファ104は、将来実行する命令列を格納するバッファである。命令バッファ104は、命令実行の状態に関わらず、最大容量まで命令を格納する。また、命令バッファ104は、命令フェッチの状態に関わらず、保持する命令を出力可能である。命令バッファ104は、命令フェッチと命令実行とを分離することで、命令実行や命令フェッチによるレイテンシを隠蔽する。
【0036】
命令デコーダ105は、命令バッファ104に格納された命令を処理順に取得する。そして、命令デコーダ105は、取得した命令をデコードする。そして、命令デコーダ105は、デコードした命令をリネーミングレジスタ106へ出力する。
【0037】
リネーミングレジスタ106は、命令の実行がコミットされてレジスタに格納されるまで一時的に保持するバッファである。リネーミングレジスタ106は、デコードされた命令の入力を命令デコーダ105から受ける。次に、リネーミングレジスタ106は、命令の実行に用いる資源を、RSA110、RSE120、RSF130及びRSBR140の中から決定する。そして、リネーミングレジスタ106は、決定した資源に空きがあるか否かを判定する。決定した資源に空きがある場合、リネーミングレジスタ106は、決定した資源をデコードされた命令に割り当る。その後、リネーミングレジスタ106は、デコードされた命令に識別子を割り当てて、その命令を割り当てたRSA110、RSE120、RSF130及びRSBR140のいずれかに発行する。
【0038】
また、リネーミングレジスタ106は、デコードされた命令のそれぞれに対して順番通りに命令識別子(Instruction Identification:IID)を割り振る。そして、リネーミングレジスタ106は、命令識別子を割り振った順番にしたがってCSE150へ送信する。
【0039】
RSA110は、ロードストア命令のアドレス計算用のリザベーションステーションである。ロードストア命令とは、ロード命令又はストア命令のいずれかである。RSA110は、オペランドアドレス生成器111による処理が可能になるまで、命令デコーダ105から取得した命令を保持する。その後、オペランドアドレス生成器111による処理が可能になると、RSA110は、命令をオペランドアドレス生成器111へ出力する。RSA110は、ロードストア命令をアウトオブオーダーで実行する。その後、RSA110は、ロードストア命令の実行が完了すると、実行命令終了をCSE150に報告する。
【0040】
オペランドアドレス生成器111は、複数存在する。オペランドアドレス生成器111は、ロードストア命令の入力をRSA110から受ける。そして、オペランドアドレス生成器111は、アドレス計算用のオペランドを生成して、生成したアドレスを用いてアドレス計算を実行して命令に応じたアドレスを生成する。その後、オペランドアドレス生成器111は、ストアデータを待ち合わせて、生成したアドレスを用いて1次データキャッシュ112にデータを書き込む。
【0041】
RSE120は、整数演算用のリザベーションステーションである。RSE120は、演算器121による演算処理が可能になるまで、命令デコーダ105から取得した命令を保持する。その後、演算器121による演算処理が可能になると、RSE120は、命令を演算器121へ出力する。RSE120は、命令をアウトオブオーダーで実行する。その後、RSE120は、演算命令の実行が完了すると、実行命令終了をCSE150に報告する。
【0042】
演算器121は、複数存在する。演算器121は、固定小数点更新バッファ122及び固定小数点レジスタ123を用いて固定小数点演算を実行する。演算完了後、結果データは、固定小数点更新バッファ122を経由して固定小数点レジスタ123に書き込まれる。その後、計算データがコミットされると、コミットされた計算データが1次データキャッシュ112に送られる。
【0043】
RSF130は、浮動小数点演算用のリザベーションステーションである。RSF130は、演算器131による演算処理が可能になるまで、命令デコーダ105から取得した命令を保持する。その後、演算器131による演算処理が可能になると、RSF130は、命令を演算器131へ出力する。RSF130は、命令をアウトオブオーダーで実行する。その後、RSF130は、演算命令の実行が完了すると、実行命令終了をCSE150に報告する。
【0044】
演算器131は、複数存在する。演算器131は、浮動小数点更新バッファ132及び浮動小数点レジスタ133を用いて浮動小数点演算を実行する。演算完了後、結果データは、浮動小数点更新バッファ132を経由して浮動小数点レジスタ133に書き込まれる。その後、計算データがコミットされると、コミットされた計算データが1次データキャッシュ112に送られる。
【0045】
CSE150は、コミット(確定)処理を実行する回路である。CSE150は、デコードされた命令を命令の実行順番通りに溜めるキュー構造のストレージであるキュー151及びキュー151の情報と各処理パイプからの完了報告をもとにコミット処理を行う完了処理回路152を有する。
【0046】
キュー151は、リネーミングレジスタ106から受信した命令を実行順番通りに格納して蓄積する。そして、CSE150は、キュー151に命令を格納した状態で、命令の処理完了の報告を待つ。
【0047】
完了処理回路152は、実行された各命令の終了報告をRSA110、RSE120及びRSF130からアウトオブオーダーで受ける。また、完了処理回路152は、インオオーダーでRSBR140から命令の処理完了の信号をインオーダーで受信する。
【0048】
そして、完了処理回路152は、実行順序にしたがって命令をリオーダーして、キュー151に蓄積された終了報告待ちの命令の中から処理完了の信号による報告に対応する命令の終了を、キュー151に通知する。これにより、完了処理回路152は、キュー151に格納された命令のうち、終了を通知した命令をコミットして資源の更新を行う。
【0049】
RSBR140は、分岐命令用のリザベーションステーションである。RSBR140は、リターンアドレススタックで用いられるRASフェッチ171及びRASコンプリート172の更新、並びに、再命令フェッチなどの信号を発行する。
【0050】
RSBR140は、分岐命令の入力を命令デコーダ105から受ける。そして、RSBR140は、自己が有するRSBRキューに分岐命令を格納する。RSBRキューは、FIFO(First In Frist Out)で動作するキューである。RSBRキューの各エントリは、分岐予測での分岐する又は分岐しないを示す予測結果や予測されたアドレスを保持する。
【0051】
RSBR140は、演算器121又は131による演算結果をRSE120又はRSF130から受け取る。そして、RSBR140は、各エントリについて取得した演算結果から分岐命令において分岐した(taken)又は分岐せず(not-taken)のいずれが発生したかを判定する。例えば、CPU10がARMベースのプロセッサの場合、RSBR140は、NZCV確定命令の演算結果に基づくNZCVレジスタに格納された値を取得して判定を行う。また、RSBR140は、各エントリについて格納された命令のターゲットアドレスを確定させる。
【0052】
RSBR140は、通常はインオーダーでRSBRキューに格納された分岐命令を処理する。すなわち、RSBR140は、RSBRキューのTOQのエントリに格納される命令を順次処理する。ただし、以下に説明するように、RSBR140は、分岐予測ミスが発生した場合の再命令フェッチ要求の出力はアウトオブオーダーで行う。
【0053】
RSBR140は、各エントリの分岐の判定結果を用いて、それぞれの分岐命令において分岐予測ミスが発生したか否かを判定する。ここでは、分岐予測ミスが発生したか否かを判定した分岐命令を、判定対象の分岐命令と呼ぶ。RSBR140は、分岐予測ミスが発生したと判定した場合、判定対象の分岐命令に対する再命令フェッチを決定する。そして、RSBR140は、判定対象の分岐命令の再命令フェッチ要求のエントリをRSBRキューに格納する。さらに、RSBR140は、パイプラインにおけるデコード以前の命令をクリアして、パイプラインのクリアを行う。
【0054】
次に、RSBR140は、判定対象の分岐命令の再命令フェッチ要求のエントリとTOQとの間のエントリを探索して、その間のエントリに他の再命令フェッチ要求のエントリが存在するか否かを判定する。
【0055】
そして、RSBR140は、判定対象の分岐命令の再命令フェッチ要求のエントリからTOQまでの間で、最もTOQに近い再命令フェッチ要求のエントリを特定する。判定対象の分岐命令よりもTOQ側に再命令フェッチ要求のエントリが無い場合、RSBR140は、判定対象の分岐命令を、最もTOQに近い再命令フェッチ要求のエントリとして特定する。以下では、RSBR140により特定したエントリを、「再命令フェッチ要求のエントリ」と呼ぶ。この再命令フェッチ要求のエントリが、「第1エントリ」の一例にあたる。
【0056】
次に、RSBR140は、再命令フェッチ要求のエントリよりもTOQから遠いエントリの有効フラグを削除して無効化する。これにより、RSBR140は、予測ミスで生じた不要なエントリを削除する。
【0057】
次に、RSBR140は、再命令フェッチ要求のエントリから取得した再命令フェッチ要求を命令フェッチアドレス生成器101及び分岐予測機構170へ出力する。ただし、RSBR140は、再命令フェッチ要求に再命令フェッチの開始を抑止するための情報を付加する。これにより、RSBR140は、再命令フェッチ要求は出力しつつ、再命令フェッチの実行を抑止する。また、RSBR140は、新規のエントリの作成を停止する。次に、RSBR140は、分岐予測機構170におけるRASコンプリート172の情報をRASフェッチ171にコピーする。さらに、RSBR140は、再命令フェッチのエントリの番号を記憶する。
【0058】
次に、RSBR140は、再命令フェッチのエントリからTOQのエントリまでを探索して、その間に存在するコール命令及びリターン命令を検出する。ここで、RSBRキューの各エントリは、自己がコール命令か否かの情報及びリターン命令であるか否かの情報をフラグとして保持する。そして、RSBR140は、コール命令を検出すると、RASフェッチ171をプッシュして、そのコール命令の戻り先のアドレスをRASフェッチ171に格納する。また、RSBR140は、リターン命令を検出すると、RASフェッチ171からポップして、そのリターン命令に対応するコール命令の戻り先アドレスを取得しRASフェッチ171から削除する。
【0059】
RSBR140は、各分岐命令の処理完了を通知する了信号をインオーダーでCSE150へ送信する。処理完了を通知する信号を送信することにより、RSBR140は、分岐命令が完了したとして分岐命令の終了を確定させる。さらに、RSBR140は、コール命令やリターン命令を、処理完了を通知する信号に対応付けて分岐予測機構170へ出力する。コール命令の処理完了を通知する信号を分岐予測機構170へ出力することで、RSBR140は、RASコンプリート172をプッシュして、そのコール命令の戻り先のアドレスをRASコンプリート172に格納する。また、リターン命令の処理完了の信号を分岐予測機構170へ出力することで、RSBR140は、RASコンプリート172をポップして、そのリターン命令に対応するコール命令の戻り先アドレスを削除する。
【0060】
その後、RSBR140は、命令フェッチアドレス生成器101に送った再命令フェッチ要求に付加した再命令フェッチの開始を抑止するための情報を除去する。これにより、RSBR140は、再命令フェッチを命令フェッチアドレス生成器101に実行させる。このRSBR140が、「分岐命令処理部」の一例にあたる。
【0061】
分岐予測機構170は、リターンアドレススタックを実行する。分岐予測機構170は、RASフェッチ171及びRASコンプリート172を有する。RASフェッチ171が「第1格納部」の一例にあたり、RASコンプリート172が「第2格納部」の一例にあたる。
【0062】
分岐予測機構170は、コール命令が命令フェッチアドレス生成器101でフェッチされると、RASフェッチ171をプッシュして、フェッチされたコール命令の戻り先アドレスをRASフェッチ171に格納する。また、リターン命令が命令フェッチアドレス生成器101でフェッチされると、分岐予測機構170は、RASフェッチ171をポップして、フェッチされたリターン命令に対応するコール命令の戻り先アドレスを取得してRASフェッチ171から削除する。
【0063】
また、分岐予測機構170は、コール命令の終了信号をRSBR140から受信すると、RASコンプリート172をプッシュして、フェッチされたコール命令の戻り先アドレスをRASコンプリート172に格納する。また、リターン命令の終了信号をRSBR140から受信すると、分岐予測機構170は、RASコンプリート172をポップして、フェッチされたリターン命令に対応するコール命令の戻り先アドレスを取得してRASコンプリート172から削除する。
【0064】
分岐予測機構170は、分岐予測ミスが発生し、RSBR140から送られた再命令フェッチ要求を受信した場合、RASコンプリート172の情報をRASフェッチ171へコピーする。その後、分岐予測機構170は、再命令フェッチ要求のエントリより前のエントリのコール命令について、RSBR140によりRASフェッチ171がプッシュされる。また、分岐予測機構170は、再命令フェッチ要求のエントリより前のエントリのリターン命令について、RSBR140によりRASフェッチ171がポップされる。
【0065】
図3は、実施例に係る演算処理装置におけるアウトオブオーダーで再命令フェッチ要求を出力する場合の処理の概要を示す図である。次に、
図3を参照して、より具体的な動作の説明とともにアウトオブオーダーで再命令フェッチ要求を出力する場合の処理の概要をまとめて説明する。
【0066】
ここでは、RSBR140は、
図3でTOP-out-ptrとして表されるポインタ141によりTOQのエントリを管理する。すなわち、ポインタ141で指定されるエントリがTOQのエントリである。
【0067】
例えば、命令リスト200は、プログラムカウンタ160に登録された順で並ぶ命令を表す。命令リスト200の順序で命令が並ぶ場合、RSBR140は、Call func X、Call func. Y、Call func. Z、Cond. Branch、Call func. Tを順にRSBRキューに格納する。ここで、RSBR140は、分岐命令が終了して確定すると、ポインタ141を次の命令に移動する。すなわち、RSBR140は、
図3の状態で、範囲142に存在するエントリの実行は終了しており、これらのエントリの命令の終了信号を分岐予測機構170に送信済みである。そのため、分岐予測機構170は、RSBRキューの範囲142に存在するコール命令やリターン命令に対応するRASコンプリート172のプッシュ又はポップを実行済みである(ステップS1)。この場合、RASコンプリート172には、Call func. Xの戻りアドレスであるA+4が格納される。
【0068】
この後、RSBR140は、矢印143の向かう方向に順にCall func. YのエントリからRSBRキューに格納された各エントリを処理する。ここで、RSBR140は、エントリ144のCond. Branchで分岐予測ミスを検出する。この時点で、Call func. Zはフェッチされているので、分岐予測機構170は、Call func. Zというコール命令の戻り先アドレスであるX+8をRASフェッチ171にプッシュ済みである。しかし、Call func. Zの処理は完了していないため、分岐予測機構170は、Call func. Zというコール命令の戻り先アドレスであるX+8をRASコンプリート172にプッシュしていない。
【0069】
RSBR140は、エントリ144のCond. Branchで分岐予測ミスを検出すると、エントリ144のreifch_conditionというフラグ145の値を1に設定する。そして、RSBR140は、各エントリのreifch_conditionの値を参照し、RSBR140にreifch_conditionの値が1のエントリが1つでも存在する場合、デコード以前のパイプラインをクリアする。
【0070】
次に、RSBR140は、reifch_conditionの値が1のエントリのうち、TOQにもっとも近いエントリを、再命令フェッチ要求のエントリとして特定する。この場合、RSBR140は、エントリ144を再命令フェッチ要求のエントリとして特定する。次に、RSBR140は、エントリ144よりもポインタ141で示されるTOQのエントリから遠いエントリの有効フラグを削除して無効化する。
【0071】
次に、RSBR140は、エントリ144に基づく再命令フェッチ要求を命令フェッチアドレス生成器101及び分岐予測機構170へ出力する。分岐予測機構170は、再命令フェッチ要求を受けると、RASコンプリート172の情報をRASフェッチ171へコピーする(ステップS2)。これにより、RASフェッチ171に反映されていたCall Fanc. Zというコール命令の戻りアドレスであるX+8が、上書されてRASフェッチ171から消える。
【0072】
さらに、RSBR140は、命令フェッチアドレス生成器101に送った再命令フェッチ要求に付加された、リターンアドレススタックを修復中であることを示すトリガであるreturn adrs stack repair tgrの値を1とする。RSBR140は、return adrs stack repair tgrの値を1とすることで、再命令フェッチ要求を出力した状態で、再命令フェッチの実行は抑止しておく。さらに、RSBR140は、新規のエントリの受付を停止する。
【0073】
次に、RSBR140は、再命令フェッチ要求のエントリのエントリ番号を記憶する。そして、RSBR140は、記憶したエントリ番号を示すRTNSTK_REPAIR_END_POINTERというポインタ146をRSBRキューに付加する。
【0074】
次に、RSBR140は、再命令フェッチ要求を出力した次のサイクルで、ポインタ141が示すTOQのエントリから、ポインタ146が示す再命令フェッチ要求のエントリ144まで順に、コール命令及びリターン命令を探索する。例えば、RSBR140は、ポインタ141からポインタ146まで順番にエントリを示していくRTNSTK-REPAIR-PTRというポインタを用意する。次に、RSBR140は、RTNSTK-REPAIR-PTRで示されたエントリのコール命令であるか又はリターン命令であるかを示すフラグを読み出し、各エントリがコール命令かリターン命令かそれ以外かを判定する。そして、コール命令を検出した場合、RSBR140は、そのコール命令でRASフェッチ171をプッシュする。また、リターン命令を検出した場合、RSBR140は、そのリターン命令でRASフェッチ171をポップする。
図3の場合、RSBR140は、ポインタ141からポインタ146の間にCall func. Zというコール命令を検出する。そこで、RSBR140は、Call func. ZでRASフェッチ171をプッシュする(ステップS3)。これにより、Call func. Zの戻り先アドレスであるx+8が、RASフェッチ171に再度反映される。
【0075】
この後、RSBR140は、命令の処理完了の信号をインオーダーでCSE150へ送信する。CSE150は、分岐命令が終了したとして分岐命令の実行終了を確定する。また、RSBR140は、命令の処理完了の信号を分岐予測機構170へ送信する。コール命令の処理が完了した場合、分岐予測機構170は、そのコール命令でRASコンプリート172をプッシュする。また、リターン命令の処理が完了した場合、分岐予測機構170は、そのリターン命令でRASコンプリート172をポップする。この時点で、ポインタ141は、終了していない先頭の分岐命令のエントリ番号を指す。すなわち、RSBR140は、ポインタ141が示すTOQのエントリから実行を開始することで、処理を再開することができる。
【0076】
図4は、アウトオブオーダーで再命令フェッチを行う場合のRSBRキューに格納された各エントリの処理順を示す図である。次に、
図4を参照して、アウトオブオーダーで再命令フェッチを行なった場合のRSBRキューに格納された各エントリの処理について説明する。
図4では、エントリ#1がRSBRキューのTOQのエントリであり、エントリ#2がエントリ#1より後のエントリである。
【0077】
エントリ#1の命令の実行の完了処理が終了していない状態で、RSBR140は、既に実行した分岐命令の分岐が確定して予測分岐ミスを検出し(ステップS11)、再命令フェッチ要求のエントリ#2をRSBRキューに格納する。
【0078】
そして、RSBR140は、エントリ#2がTOQに到達する前に、エントリ#2の分岐命令の再命令フェッチ要求を出力する(ステップS12)。すなわち、RSBR140は、エントリ#1の命令の実行を待たずに、アウトオブオーダーでエントリ#2の分岐命令の再命令フェッチを命令フェッチアドレス生成器101に行わせる。
【0079】
その後、RSBR140は、TOQに位置するエントリ#1の命令を出力する。そして、エントリ#1の命令による分岐が確定して、エントリ#1の命令の実行の処理が完了する。これらのエントリ#1の命令の実行と並行して、エントリ#2から出力された再命令フェッチ要求を受けて、命令フェッチアドレス生成器101は、再命令フェッチを実行する(ステップS13)。その後、命令デコーダ105は、フェッチされた命令をデコードする(ステップS14)。
【0080】
RSBR140は、エントリ#1の命令の処理完了を待たずに再命令フェッチ要求を出力することで、エントリ#1の命令の実行の処理完了までの待ち時間分早く、エントリ#2の命令の処理を完了することができる(ステップS15)。すなわち、RSBR140は、パイプラインにおける命令フェッチの処理による遅延時間を隠蔽することができる。
【0081】
さらに、本実施例に係るRSBR140は、RSBRキューにおいて、分岐予測ミスが発生して再命令フェッチの対象となりアウトオブオーダーで実行されるエントリより前のエントリ中のコール命令やリターン命令の結果をRSAコンプリートに反映する。これにより、パイプラインによる命令フェッチの処理時間を隠蔽しつつ、分岐予測精度を維持できる。
【0082】
図5は、実施例に係る演算処理装置による再命令フェッチ処理のフローチャートである。次に、
図5を参照して、CPU10による再命令フェッチ処理の流れを説明する。
【0083】
RSBR140は、演算器121及び131で実行された演算の演算結果を取得して、既に実行された分岐命令についての予測分岐ミスを検出する(ステップS101)。
【0084】
そして、RSBR140は、予測分岐ミスが検出された分岐命令の再命令フェッチ要求のエントリをRSBRキューに格納する。次に、RSBR140は、TOQに最も近い分岐予測ミスと判定された分岐命令のエントリを特定する(ステップS102)。
【0085】
次に、RSBR140は、RSBRキューに格納されたエントリのうち特定したエントリより若番のエントリ、すなわち、特定したエントリより後に格納されたエントリの有効フラグをクリアする。これにより、RSBR140は、命令パイプラインをクリアする(ステップS103)。
【0086】
次に、RSBR140は、新規エントリの生成を抑制するとともに、再命令フェッチを行う分岐命令が登録されたエントリのエントリ番号を記憶する(ステップS104)。
【0087】
次に、RSBR140は、特定したエントリに基づく再命令フェッチ要求を出力する(ステップS105)。
【0088】
次に、RSBR140は、再命令フェッチ要求に対して、RASフェッチ171の復元完了まで再命令フェッチを抑止するフラグを立てる(ステップS106)。
【0089】
次に、RSBR140は、RASコンプリート172からRASフェッチ171への情報のコピーを実行する(ステップS107)。
【0090】
次に、RSBR140は、特定したエントリからTOQの間のコール命令及びリターン命令を探索し、検出したコール命令及びリターン命令にしたがってRASフェッチ171をプッシュ及びポップする(ステップS108)。
【0091】
その後、RSBR140は、再命令フェッチ要求に立てた再命令フェッチを抑止するフラグを解除して、再命令フェッチを命令フェッチアドレス生成器101に実行させる(ステップS109)。
【0092】
以上に説明したように、本実施例に係る演算処理装置は、分岐予測ミスに応じて分岐命令に対する再命令フェッチの実行を決定し、その再命令フェッチよりも前のコール命令及びリターン命令による処理結果をRASフェッチに反映させる。そのうえで、演算処理装置は、アウトオブオーダーで再命令フェッチを行う。これにより、アウトオブオーダーで再命令フェッチを行う場合に、再命令フェッチよりも前にRASフェッチに格納された情報を維持することができ、リターンアドレススタックの予測精度を維持することができる。したがって、予測精度を維持しつつ演算性能を向上させることが可能となる。
【0093】
以上に説明した、分岐命令処理機構及び分岐予測機構を有するプロセッサは、スーパースカラプロセッサに限らず一般的なプロセッサでよい。また、プロセッサは、ARMベースのプロセッサに限らず、他のプロセッサでもよい。また、プロセッサは、サーバやHPC(High Performance Computing)に用いられるコンピュータに搭載可能である。