(57)【特許請求の範囲】
【請求項１】
命令フェッチリクエストを出力する命令制御部と、
前記命令制御部から出力される命令フェッチリクエストをエントリするリクエストポートと、投入された前記命令フェッチリクエストに応答して、前記命令フェッチリクエストに対応する命令データを出力するキャッシュ処理回路とを有する第１のキャッシュと、
前記第１のキャッシュでキャッシュミスした場合に前記第１のキャッシュから出力されるデータ要求に応答して、前記命令データを前記第１のキャッシュに応答する第２のキャッシュを有し、
前記リクエストポートは、
複数のスレッドに共通に設けられ、各スレッドの前記命令フェッチリクエストの情報を格納する第１のポートと、
前記複数のスレッドそれぞれに設けられ、対応するスレッドの前記命令フェッチリクエストの情報を格納する前記第１のポートのエントリ番号を格納する複数の第２のポートと、
前記リクエストポート内にエントリされた前記命令フェッチリクエストのうち、前記第１のキャッシュへの投入をウエイト中の命令フェッチリクエストを優先し、且つ各スレッドの命令フェッチリクエストについては前記命令制御部が出力した順に、前記第１のキャッシュに投入する命令フェッチリクエストを決定するリクエスト決定回路とを有する演算処理装置。
【請求項２】
前記複数の第２のポートのそれぞれは、複数のエントリを有し、各エントリは、前記第１のキャッシュへの投入をウエイト中か否かを示すウエイトビットを、前記第１のポートのエントリ番号と共に格納し、
前記第１のキャッシュは、キャッシュミスした第１の命令フェッチリクエストと前記第１の命令フェッチリクエストより後に投入された同じスレッドの第２の命令フェッチリクエストとをアボートし、前記アボートした第１、第２の命令フェッチリクエストの前記第２のポート内のウエイトビットをウエイト状態にし、
前記リクエスト決定回路は、各第２のポートが有する複数のエントリから前記ウエイトビットがウエイト状態である最古のエントリを選択し、前記複数の第２のポートでそれぞれ選択されたエントリから複数のスレッドの所定の順番に基づいて前記第１のキャッシュへの投入対象エントリを選択する、請求項１に記載の演算処理装置。
【請求項３】
前記第１のキャッシュは、前記ウエイト状態の命令フェッチリクエストが前記キャッシュ処理回路に投入されると、前記投入された命令フェッチリクエストの前記ウエイトビットを非ウエイト状態に変更する、請求項２に記載の演算処理装置。
【請求項４】
前記第１のキャッシュは、前記キャッシュミスした第１の命令フェッチリクエストの命令データを前記第２のキャッシュに要求している間、前記リクエスト決定回路が前記第１の命令フェッチリクエストを選択しないように制御する禁止フラグを禁止状態に設定し、前記第１の命令フェッチリクエストの命令データを前記第２のキャッシュから受信したときに、前記禁止フラグを許可状態に変更する、請求項２に記載の演算処理装置。
【請求項５】
前記所定の順番は、前記第１のキャッシュに命令フェッチリクエストが投入された投入順である、請求項２に記載の演算処理装置。
【請求項６】
前記リクエスト決定回路は、前記複数の第２のポートでそれぞれ選択されたエントリのうち、前記複数のスレッドの投入順で最も古いスレッドを、前記第１のキャッシュへの投入対象エントリに選択する、請求項４に記載の演算回路。
【請求項７】
前記所定の順番は、複数のスレッドの固定された循環する順番内において、最近投入されたスレッドの次の順番のスレッドが最古になる順番である、請求項２に記載の演算処理装置。
【請求項８】
前記リクエスト決定回路は、前記複数の第２のポートでそれぞれ選択されたエントリのうち、前記所定の順番で最も古いスレッドを、前記第１のキャッシュへの投入対象エントリに選択する、請求項６に記載の演算回路。
【請求項９】
前記第１のキャッシュは、投入された命令フェッチリクエストを処理する複数のステージを有するパイプライン構成を有し、
前記複数の第２のポートのそれぞれは、前記第１のキャッシュのパイプラインのステージ数以上のエントリを有し、
前記第１のポートは、前記複数の第２のポートのエントリ数の合計数より少ないエントリを有する、請求項１に記載の演算処理装置。
【請求項１０】
命令フェッチリクエストを出力する命令制御部と、
前記命令制御部から出力される命令フェッチリクエストをエントリするリクエストポートと、投入された前記命令フェッチリクエストに応答して、前記命令フェッチリクエストに対応する命令データを出力するキャッシュ処理回路とを有する第１のキャッシュと、
前記第１のキャッシュでキャッシュミスした場合に前記第１のキャッシュから出力されるデータ要求に応答して、前記命令データを前記第１のキャッシュに応答する第２のキャッシュを有し、
前記リクエストポートは、
複数のスレッドに共通に設けられ、各スレッドの前記命令フェッチリクエストの情報を格納する第１のポートと、
前記複数のスレッドそれぞれに設けられ、対応するスレッドの前記命令フェッチリクエストの情報を格納する前記第１のポートのエントリ番号を格納する複数の第２のポートを有し、
前記リクエストポートは、前記リクエストポート内にエントリされた前記命令フェッチリクエストのうち、前記第１のキャッシュへの投入をウエイト中の命令フェッチリクエストを優先し、且つ各スレッドの命令フェッチリクエスト間では前記命令制御部が出力した順に、前記第１のキャッシュに投入する命令フェッチリクエストを決定する演算処理装置の制御方法。
【請求項１１】
前記複数の第２のポートのそれぞれは、複数のエントリを有し、各エントリは、前記第１のキャッシュへの投入をウエイト中か否かを示すウエイトビットを、前記第１のポートのエントリ番号と共に格納し、
さらに、
前記第１のキャッシュは、キャッシュミスした第１の命令フェッチリクエストと前記第１の命令フェッチリクエストより後に投入された同じスレッドの第２の命令フェッチリクエストとをアボートし、前記アボートした第１、第２の命令フェッチリクエストの前記第２のポート内のウエイトビットをウエイト状態にし、
前記リクエストポートは、各第２のポートが有する複数のエントリから前記ウエイトビットがウエイト状態である最古のエントリを選択し、前記複数の第２のポートでそれぞれ選択されたエントリから複数のスレッドの所定の順番に基づいて前記第１のキャッシュへの投入対象エントリを選択する、請求項１０に記載の演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
演算処理装置（またはプロセッサ、CPU（Central Processing Unit））において、プロセッサごとに複数のスレッドを実行するマルチスレッド化が進められている。マルチスレッド化に伴いキャッシュメモリ（以下、キャッシュメモリを「キャッシュ」と略す）の効率的な処理が必要になる。特に、命令キャッシュは、複数のスレッドそれぞれの命令をメモリから読み出す場合、各スレッドの命令フェッチリクエストを効率的に処理することが要求される。
【０００３】
例えば、命令キャッシュは、スレッド内の命令フェッチリクエストの順番を守りながら命令フェッチを処理しなければならず、一方で、スレッド間の命令フェッチリクエストの順番は前後して処理することができる。
【０００４】
マルチスレッド化に伴って、複数の命令キャッシュを設ける構成にすれば、各命令キャッシュがシングルスレッドと同様の方法で各スレッドの命令フェッチリクエストを処理することができる。また、複数のスレッド間で１つの命令キャッシュ制御部を共有し、命令制御部が出力する命令フェッチリクエストを保持するリクエストポートと、キャッシュミスによりアボートされた命令フェッチリクエストを管理するウエイトポートとを複数のスレッド毎に設けることが提案されている。
【０００５】
マルチスレッド化に対応して命令キャッシュを設ける構成については、以下の特許文献に記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】国際公開第２００８／１５５８２６号
【特許文献２】特表２０１１−５１１３７８
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、将来、同時実行可能なスレッド数は増加する傾向にある。そのため、リクエストポートやアボート管理用のポートをスレッド数の増加に伴って増加させることは、回路規模の増大を招くこととなる。したがって、スレッド数が増加しても回路規模の増大を抑えることが求められる。
【０００８】
そこで，実施の形態の第１の側面の目的は，マルチスレッドに対応し回路規模を抑制した演算処理装置及びその制御方法を提供することにある。
【課題を解決するための手段】
【０００９】
本実施の形態の第１の側面は，命令フェッチリクエストを出力する命令制御部と、前記命令制御部から出力される命令フェッチリクエストをエントリするリクエストポートと、投入された前記命令フェッチリクエストに応答して、前記命令フェッチリクエストに対応する命令データを出力するキャッシュ処理回路とを有する第１のキャッシュと、前記第１のキャッシュでキャッシュミスした場合に前記第１のキャッシュから出力されるデータ要求に応答して、前記命令データを前記第１のキャッシュに応答する第２のキャッシュを有し、前記リクエストポートは、複数のスレッドに共通に設けられ、各スレッドの前記命令フェッチリクエストの情報を格納する第１のポートと、前記複数のスレッドそれぞれに設けられ、対応するスレッドの前記命令フェッチリクエストの情報を格納する前記第１のポートのエントリ番号を格納する複数の第２のポートと、前記リクエストポート内にエントリされた前記命令フェッチリクエストのうち、前記第１のキャッシュへの投入をウエイト中の命令フェッチリクエストを優先し、且つ各スレッドの命令フェッチリクエストについては前記命令制御部が出力した順に、前記第１のキャッシュに投入する命令フェッチリクエストを決定するリクエスト決定回路とを有する演算処理装置である。
【発明の効果】
【００１０】
第１の側面によれば，マルチスレッドに対応し回路規模を抑制した演算処理装置及びその制御方法を提供する。
【図面の簡単な説明】
【００１１】
【図１】本実施の形態における演算処理装置（またはプロセッサ、CPU）の構成を示す図である。
【図２】本実施の形態における命令キャッシュ１３１の構成を示す図である。
【図３】キャッシュ処理回路２０の具体的な処理を説明する図である。
【図４】第１のポートの構成を示す図である。
【図５】第２のポートの構成を示す図である。
【図６】図２のリクエストポート２６内のリクエスト決定回路２７の構成を示す図である。
【図７】投入要求エントリ番号及び投入要求信号生成回路３０の真理値表を示す図である。
【図８】第１の実施の形態における命令キャッシュ１３１の動作例を示すタイミングチャート図である。
【図９】第２の実施の形態における次のスレッド決定回路３１の構成を示す図である。
【図１０】第２の実施の形態における次のスレッド決定回路３１の真理値表の一例を示す図である。
【図１１】第２の実施の形態における次のスレッド決定回路３１の真理値表の一例を示す図である。
【図１２】第３の実施の形態における次のスレッド決定回路３１の構成を示す図である。
【図１３】第３の実施の形態における次のスレッド決定回路３１の真理値表の一例を示す図である。
【発明を実施するための形態】
【００１２】
［第１の実施の形態］
図１は、本実施の形態における演算処理装置（またはプロセッサ、CPU）の構成を示す図である。CPU１０は、外部に設けられた主記憶装置（メインメモリ）１５と接続されている。CPU１０は、CPUコア１１と、メインメモリ１５へのアクセスを制御するメモリアクセスコントローラMACを有する。そして、CPUコア１１は、命令をフェッチする命令フェッチリクエストや、命令をデコードして演算リクエストを生成する命令制御部ICと、演算リクエストに基づいて演算処理を行う演算処理部EXCとを有する。
【００１３】
さらに、CPUコア１１は、プライマリキャッシュであるL1キャッシュ１３を有し、L1キャッシュ１３は、命令をデータとして記憶する命令キャッシュ１３１と、データを記憶するデータキャッシュ１３２とを有する。CPU１０は、単一または複数のCPUコア１１を有する。
【００１４】
そして、CPU１０は、セダンダリキャッシュであるL2キャッシュ１４を有する。L2キャッシュ１４は、一般に複数のCPUコア１１に共有される。
【００１５】
命令制御部ICは、命令をフェッチする命令フェッチリクエストを生成し、L1キャッシュ１３内の命令キャッシュ１３１に出力する。命令フェッチリクエストは、命令キャッシュ１３１内のパイプライン化されたキャッシュ処理回路（図示せず）に投入され、キャッシュ処理回路は、L1キャッシュ１３内の命令データを読み出し、命令制御部にその命令データを応答する。キャッシュ処理回路は、キャッシュミスした場合は、L2キャッシュ１４に命令フェッチリクエストを出力し、L2キャッシュ１４内またはメインメモリ１５内の命令データを、L1キャッシュの命令キャッシュ１３１に応答する。
【００１６】
一方、演算処理部EXCは、命令制御部ICが出力する演算リクエストを実行し、必要な場合にL1キャッシュ１３内のデータキャッシュ１３２にデータアクセスリクエストを出力し、データキャッシュ１３２からL1キャッシュ内のデータまたはL2キャッシュ内若しくはメインメモリ１５内のデータを受信する。
【００１７】
命令制御部ICは、一般に、命令フェッチリクエストを命令列の順番に発行し、命令キャッシュ１３１から同じ順番で命令データを受信する。したがって、命令キャッシュ１３１は、キャッシュミスが発生した場合、キャッシュミスした命令フェッチリクエスト以降にキャッシュ処理回路に投入された命令フェッチリクエストを全てアボートし、L2キャッシュ１４からその命令データを受信した後に、アボートした命令フェッチリクエストをキャッシュ処理回路に再投入して再度処理する。
【００１８】
一方、近年のマルチスレッド方式においては、スレッド内では、命令フェッチリクエストを命令列の順番に処理する必要があるが、スレッド間では、命令列の順番で処理する必要はない。
【００１９】
図２は、本実施の形態における命令キャッシュ１３１の構成を示す図である。図２には、L1キャッシュ内の命令キャッシュ１３１の構成と、それに加えて命令制御部IC及びL2キャッシュ１４が示されている。図２の命令キャッシュ１３１は、同時に実行可能なスレッド数が４の例である。つまり、CPUコア１１は、最大で４つのスレッドを同時に並行して実行可能である。そのため、命令制御部ICは、最大で４つのスレッド内の命令列について命令フェッチリクエストを生成し、命令キャッシュ１３１に投入（入力）する。
【００２０】
命令キャッシュ１３１は、命令制御部ICから出力される命令フェッチリクエストをエントリするリクエストポート２６と、投入された命令フェッチリクエストに応答して命令フェッチリクエストに対応する命令データを出力するキャッシュ処理回路２０と、トランスレーション・ルックアサイド・バッファTLBと、タグメモリT_RAMと、データメモリTD_RAMと、ムーブインバッファMIBとを有する。キャッシュ処理回路２０は、パイプライン構成の複数の処理部を有する処理回路である。
【００２１】
リクエストポート２６は、命令制御部ICが生成して命令キャッシュ１３１に投入する命令フェッチリクエストをエントリし、投入された命令フェッチリクエストに対する命令データが命令制御部ICに応答されたらそのエントリを無効にする。命令制御部ICが生成した命令フェッチリクエストは、図示しない制御回路により、リクエストポート２６の第１のポートPPと第２のポートSPにエントリされる。
【００２２】
リクエストポート２６は、複数（４つ）のスレッドに共通に設けられた第１のポート（プライマリポート）PPと、複数のスレッドそれぞれに設けられた複数の第２のポート（セカンダリポート）とを有する。第１のポートPPは、各スレッドの命令フェッチリクエストの情報、例えばアドレスを格納する。第２のポートSP （SP0,SP1,SP2,SP3）は、対応するスレッドの命令フェッチリクエストの情報を格納する第１のポートPP内のエントリ番号を格納する。第２のポートSP0,SP1,SP2,SP3の数は、最大で同時処理可能なスレッド数４と一致する。
【００２３】
さらに、リクエストポート２６は、次にキャッシュ処理回路２０に投入する命令フェッチリクエストを選択するリクエスト決定回路２７を有する。リクエスト決定回路２７は、リクエストポート２６内にエントリされた命令フェッチリクエストのうち、キャッシュ処理回路２０への投入をウエイト中の命令フェッチリクエストを優先し、且つ各スレッドの命令フェッチリクエストについては命令制御部ICが出力した順に、キャッシュ処理回路２０に投入する命令フェッチリクエストを決定する。
【００２４】
具体的には、リクエスト決定回路２７は、各第２のポートSP0,SP1,SP2,SP3内でL1キャッシュのキャッシュ処理回路２０への投入をウエイト中の命令フェッチリクエストのうち、最も古く生成された命令フェッチリクエストを決定し、さらに、各第２のポートからその決定により選択された各スレッドの命令フェッチリクエストの中から、所定の順番で、次に投入すべき命令フェッチリクエストを決定する。図２中には、第１のポートPPの複数のエントリのうち一つのエントリを選択するセレクタSL2が示されている。このセレクタSL2は、決定した次に投入する命令フェッチリクエストを示す次のリクエスト信号NRに基づいて、第１のポートPPの複数のエントリのうち一つを選択し、その選択されたエントリのアドレスを次リクエストレジスタ２８に格納する。
【００２５】
命令キャッシュ１３１は、投入するリクエストを選択するセレクタSL1を有する。セレクタSL1は、命令制御部ICが生成する命令フェッチリクエストを投入する外部リクエスト入力EXT_REQと、リクエストポート２６が次のリクエストとして出力する命令フェッチリクエストを投入する内部リクエスト入力INT_REQと、L2キャッシュから取得した命令データをL1キャッシュに登録するリクエストであるムーブインを投入するムーブイン入力MIのうちいずれかを、サイクルP処理部２１の選択信号に基づいて選択する。サイクルP処理部２１は、後述するキャッシュ処理回路２０が有するパイプライン構成の処理回路の一つである。
【００２６】
キャッシュ処理回路２０は、前述のサイクルP（Priority）処理部２１と、サイクルT（TLB）処理部２２と、サイクルM（Match）処理部２３と、サイクルB（Buffer）処理部２４と、サイクルR（Result）処理部２５とを有し、これらの処理部がパイプライン構成される。
【００２７】
サイクルP処理部２１は、３つの入力EXT_REQ、INT_REQ、MIのうち１つの入力を、所定の優先順位に基づいて、セレクタSL2により選択し、キャッシュ処理回路２０に投入（入力）する。サイクルT処理部２２は、TLBを参照して、投入された命令フェッチリクエストの仮想アドレスをメインメモリの物理アドレスに変換する。サイクルM処理部２３は、仮想アドレスで検索されたタグメモリT_RAMの物理アドレスと、TLBで変換された物理アドレスとが一致するか否かのマッチングを行う。このマッチングによりキャッシュヒットまたはキャッシュミスの判定が行われる。そして、サイクルB処理部２４は、キャッシュヒットの場合、データメモリD_RAMから読み出された命令データをバッファリングする。さらに、サイクルR処理部２５は、命令フェッチリクエストの処理結果RESを出力する。データメモリD_RAMから読み出された命令データは、命令制御部ICに返信される。これらの具体的な処理については、後述する。
【００２８】
命令キャッシュ１３１は、投入された命令フェッチリクエストがキャッシュ制御回路２０でキャッシュミスすると、キャッシュミスした命令フェッチリクエストと、その後に投入済みの同じスレッドの命令フェッチリクエストとをアボートし、リクエストポート２６内のアボートされた命令フェッチリクエストをウエイト状態にする。
【００２９】
命令キャッシュ１３１は、さらに、キャッシュ処理回路２０でキャッシュミスが発生した場合にL2キャッシュ１４に命令フェッチリクエストを出力するムーブインバッファMIBを有する。ムーブインバッファMIBは、L2キャッシュから命令データが応答されと、ムーブイン入力MIから命令データのキャッシュ登録リクエストをキャッシュ処理回路２０に投入する。そして、キャッシュ登録リクエストに続いて、リクエストポート２６から出力されるウエイト状態の命令フェッチリクエストが、入力INT_REQからキャッシュ処理部２０に投入される。その投入に応答して、キャッシュ処理部２０は、キャッシュヒットし、データメモリD_RAMから読み出された命令データを命令制御部ICに返信する。
【００３０】
ウエイト状態の命令フェッチリクエストがキャッシュ処理部２０に投入されると、リクエストポート２６内の命令フェッチリクエストは非ウエイト状態にされる。そして、キャッシュ処理回路２０が、投入された命令フェッチリクエストについて命令データを命令制御部ICに応答すると、リクエストポート２６内の命令フェッチリクエストは無効状態にされる。
【００３１】
図３は、キャッシュ処理回路２０の具体的な処理を説明する図である。図３は、サイクルT, M, B, Rの順に処理が分かるように構成が示されている。入力ポートEXT,INTから投入される命令フェッチリクエストは、フェッチ先の仮想アドレスを含んでいる。
【００３２】
そこで、サイクルT処理部２２では、TLBが仮想アドレスV_addを物理アドレスP_addに変換し、仮想アドレスV_addに基づいてタグメモリT_RAMとデータメモリD_RAMが検索される。
【００３３】
タグメモリT_RAMとデータメモリD_RAMは、共に複数のウエイで構成されている。タグメモリT_RAMは、キャッシュ登録されているデータの物理アドレスを仮想アドレスに対応して記憶する。そして、タグメモリT_RAMは、命令フェッチリクエストの仮想アドレスV_addに対応する物理アドレスP_addを、複数のウエイからレジスタ２０２に出力する。
【００３４】
データメモリD_RAMは、キャッシュ登録されている命令データを仮想アドレスV_addに対応して記憶する。データメモリD_RAMは、命令フェッチリクエストの仮想アドレスV_addに対応する命令データINSを、複数のウエイからレジスタ２１０に出力する。
【００３５】
次に、サイクルM処理部２３では、比較器COMPがレジスタ２０２，２０６の物理アドレスP_addを比較し、一致した場合、一致したウエイ情報Wayをレジスタ２０８に出力する。一致する場合はキャッシュヒット、一致しない場合はキャッシュミスになる。
【００３６】
そして、サイクルB処理２４では、レジスタ２０８内のウエイ情報Wayに基づいてセレクタSL3が複数のウエイから出力された命令データのうち一つを選択する。
【００３７】
図４は、第１のポートの構成を示す図である。第１のポートPPは、複数のスレッドに共通に設けられたレジスタである。第１のポートPPは複数のエントリのレジスタを有し、各エントリPP_E#のレジスタに、リクエストポート２６にエントリされた命令フェッチリクエストのアドレスADDを格納する。入力セレクタSL4は、新たにリクエストポート２６にエントリされる命令フェッチリクエストのアドレスADDを、複数のエントリPP_E#のうち無効状態の（空いている）エントリに格納する。また、出力セレクタSL2は、前述したとおり、リクエスト決定回路２７が決定した次に投入すべき命令フェッチリクエストのエントリ情報NRに基づいて、第１のポートPP内のエントリを選択し、選択したエントリのアドレスADDを出力する。
【００３８】
第１のポートのエントリ数は、任意の数にすることができるが、望ましくは、第２のポートのエントリ数の合計数より少ないことが望ましい。理由は、第１のポートには、命令フェッチリクエストのアドレスADDを格納するので、エントリ数が大きくなると回路規模が大きくなるからである。
【００３９】
図５は、第２のポートの構成を示す図である。第２のポートSPは、複数のスレッドそれぞれに対応して設けられたレジスタである。第２のポートSPは、最大同時処理可能なスレッド数が４の場合、４つのスレッドTH0-TH3それぞれに対応して第２のポートSP_TH0、SP_TH1、SP_TH2、SP_TH3を有する。各第２のポートSP_TH#は、複数のエントリのレジスタを有する。図５に示した例では、各第２のポートSP_TH#は４つのエントリのレジスタを有する。このエントリ数は、任意の複数を選択してよいが、望ましくは、キャッシュ処理回路２０内のパイプライン数以上であることが望ましい。
【００４０】
第２のポートSP_TH0は、各エントリ番号SP_TH0_E#に対し、リクエストポート２６にエントリされた命令フェッチリクエストの情報、例えばアドレスが格納された第１ポートPP内のエントリ番号PP_E#と、そのウエイトビットWと、バリッドビットVaとを格納する。
【００４１】
バリッドビットVaは、そのエントリ内の情報が有効か無効かを示すフラグである。バリッドビットVaは、命令フェッチリクエストがリクエストポート２６にエントリされると有効状態「１」に設定され、命令フェッチリクエストがキャッシュ処理回路２０で正常に処理されて命令データが命令制御部ICに返信されると無効状態「０」に設定される。
【００４２】
ウエイトビットWは、対応する命令フェッチリクエストがキャッシュ処理回路２０でキャッシュミスしてアボートされるとウエイト状態「１」に設定され、キャッシュ処理回路２０に投入される非ウエイト状態「０」に設定される。また、命令制御部ICが生成した命令フェッチリクエストが、外部リクエスト入力EXT_REQからキャッシュ処理回路２０に投入されないでリクエストポート２６にエントリされた場合も、ウエイトビットWがウエイト状態「１」に設定される。
【００４３】
また、入力セレクタSL5により、第２のポートSP_TH0内には、古い命令フェッチリクエストほど、小さいエントリ番号のエントリに格納される。したがって、常に、エントリ番号SP_TH0_0のエントリに最も古い命令フェッチリクエストの情報が格納され、エントリ番号SP_TH0_1〜3のエントリには古い順に命令フェッチリクエストの情報が格納される。
【００４４】
第２のポートは、複数のスレッドそれぞれに対応して設けられる。しかし、第２のポートの各エントリには、バリッドビットVa、ウエイトビットW、第１ポートのエントリ番号を格納するだけであるので、格納するデータ容量は小さい。したがって、複数のスレッド毎に第２のポートを設けても、回路規模の増大にはならない。
【００４５】
図６は、図２のリクエストポート２６内のリクエスト決定回路２７の構成を示す図である。リクエスト決定回路２７は、第２のポートSPのバリッドビットVaとウエイビットWを入力して、投入要求エントリ番号TH#_Xと投入要求信号R#とを出力する投入要求エントリ番号及び投入要求信号生成回路３０と、４つのスレッドのうち所定の順番に基づいて次に投入するスレッドN_THを決定する次スレッド決定回路３１とを有する。
【００４６】
投入要求エントリ番号及び投入要求信号生成回路３０は、各第２ポート毎に設けられる。但し、図６には、スレッドTH0の第２ポートSP_TH0に対応する生成回路30_TH0だけが示され、他のスレッドTH1-TH3の第２のポートに対応する生成回路３０は示されていない。
【００４７】
なお、投入要求エントリ番号TH#_Xと、投入要求信号R#の「要求」とは、キャッシュ処理回路２０への投入を要求するという意味である。一方、命令フェッチリクエストの「リクエスト」とは、命令フェッチ処理を命令キャッシュに要求するという意味である。
【００４８】
生成回路３０は、第２のポートのエントリでバリッドビットVaが「１」且つウエイトビットWが「１」のエントリのうち、最も古いエントリ番号を投入要求エントリ番号TH#_Xとして出力する。すなわち、生成回路３０は、両ビットVa,Wが共に「１」を有する最も小さいエントリ番号を選択する。そして、各第２のポートの出力セレクタSL_SP#は、投入要求エントリ番号TH#_Xが指定するエントリのPPエントリ番号を選択する。
【００４９】
これにより、各スレッドにおいて、最も古いウエイト状態のエントリがキャッシュ処理回路２０に投入すべきエントリに選択される。したがって、各スレッドにおいて、スレッド内の命令列の順番にしたがって命令フェッチリクエストが命令キャッシュに投入または再投入される。
【００５０】
さらに、生成回路３０は、第２のポート内に、バリッドビットVaが「１」で且つウエイトビットWが「１」のエントリが存在する場合に、投入要求信号R#を「１」にし、存在しない場合に投入要求信号R#を「０」にする。この投入要求信号R#（R0-R3）は、次のスレッド決定回路３１に入力される。
【００５１】
次のスレッド決定回路３１は、投入要求信号R0-R3が「１」のスレッドの中から、所定の順番で一つのスレッドを次のスレッドN_THとして決定する。そして、スレッドセレクタSL_THは、次のスレッド決定回路３１が決定した次のスレッドN_THに基づいて、決定したスレッドのPPエントリ番号PP_E#をレジスタ３２に出力する。これにより、複数のスレッド間では、ウエイト状態の命令フェッチリクエストが、所定の順番で選択される。所定の順番については、後で詳述する。
【００５２】
図７は、投入要求エントリ番号及び投入要求信号生成回路３０の真理値表を示す図である。前述のとおり、生成回路３０は、４つのスレッドTH0-TH3それぞれに対応して、４つの生成回路30_TH0、30_TH1、30_TH2、30_TH3を有する。図７には、そのうち一つの生成回路30_TH#を示している。
【００５３】
生成回路30_TH#の論理演算回路の真理値表は、第１の真理値表T1_E0、T1_E1、T1_E2、T1_E3を有する。第１の真理値表T1_E0、T1_E1、T1_E2、T1_E3は、第２のポートSP_TH#の各エントリSP_TH#_E0、SP_TH#_E1、SP_TH#_E2、SP_TH#_E3のバリッドビットVaとウエイトビットWに基づいて、各エントリの命令フェッチリクエストの投入要求フラグV0、V1、V2、V3を生成する。これによれば、バリッドビットVaが「１」且つウエイトビットWが「１」のエントリは、その命令フェッチリクエストの投入要求フラグV0、V1、V2、V3が投入要求状態の「１」にされる。
【００５４】
生成回路30_TH#の論理演算回路の真理値表は、さらに第２の真理値表T2を有する。第２の真理値表T2内の「＊」はdon't careを示す。第２の真理値表T2は、命令フェッチリクエストの投入要求フラグV0、V1、V2、V3が「１」のエントリのうち、最もエントリ番号が小さい、つまり最も古いエントリ番号を、命令フェッチリクエストを投入要求するエントリ番号TH#_Xとして出力する。さらに、第２の真理値表T2は、いずれかのエントリが投入要求フラグV0、V1、V2、V3が投入要求状態の「１」の場合に、そのスレッド＃は投入要求をしていることを示す投入要求信号R#を出力する。投入要求信号R#は、単に投入要求フラグV0、V1、V2、V3の論理和である。
【００５５】
第２の真理値表T2において、最古のエントリの投入要求フラグV0が投入要求状態の「１」の場合、他のエントリの投入要求フラグV1-V3にかかわらず、命令フェッチリクエストを投入要求するエントリ番号TH#_Xは最古のエントリ番号の「０」になる。逆に、最新のエントリの投入要求フラグV3が「１」の場合、それより古いエントリの投入要求フラグV0,V1,V2が全て「０」であれば、投入要求するエントリ番号TH#_Xは最新のエントリ番号の「３」になる。
【００５６】
前述したとおり、リクエスト決定回路２７内の次のスレッド決定回路３１は、投入要求信号R１−R3が投入要求状態の「１」のスレッドのうち、所定の順番で次のスレッドを決定する。所定の順番の具体例は、例えば、最も古いスレッドを選択するLRU（Least Recent Use）方式や、複数のスレッドを固定の循環する順番に設定し、最近選択されたスレッドを最新にする循環する順番にして最古のスレッドを選択するラウンドロビン方式や、最も投入要求信号が投入要求状態の「１」になる頻度が高いスレッドを選択するMFU（Most Frequently Used）方式などが適用できる。
【００５７】
図８は、第１の実施の形態における命令キャッシュ１３１の動作例を示すタイミングチャート図である。この動作例では、スレッドTH0が２つの命令フェッチリクエストを外部リクエスト入力EXT_REQからキャッシュ処理回路２０に投入し、１つめの命令フェッチリクエストがキャッシュミスして２つの命令フェッチリクエストがアボートする。そして、L2キャッシュにフェッチリクエストを出力し、所定クロックサイクル後に命令データが返信された後、アボートした２つの命令フェッチリクエストを順番に内部リクエスト入力INT_REQからキャッシュ処理回路２０に再投入する。また、スレッドTH0の２つの命令フェッチリクエストに続いて、スレッドTH1,TH2,TH3の命令フェッチリクエストが外部リクエスト入力EXT_REQからキャッシュ処理回路２０に投入され、正常に処理される。
【００５８】
図８中の各信号は以下のとおりである。
CYCLE：クロックサイクルの番号
TH#_EXT_REQ：命令制御部ICから直接キャッシュ処理回路に投入されたスレッドTH#の命令フェッチリクエスト
TH#_INT_REQ：リクエストポート２６からキャッシュ処理回路に投入されたスレッドTH#の命令フェッチリクエスト
MI_REQ：L2キャッシュからの命令データをL1キャッシュのデータメモリD_RAMとタグメモリT_RAMに書き込むためのリクエスト。２つのメモリへの書き込みリクエストが発生する。
MI-DATA fr L2：L2キャッシュからのデータ転送サイクルで、この例では８サイクル。
TH0_INH_INT_REQ：パイプラインにTH0_INT_REQの投入を禁止するためのフラグであり、この例では、L1キャッシュにL2キャッシュからのデータがムーブイン（書き込み）されるまで禁止状態になる。
MIB0-VALID：L1キャッシュにムーブインするために必要なバッファなどの回路資源で、L2キャッシュにデータ要求L2-REQするときにムーブインバッファMIBに確保される。
L2-REQ：L1キャッシュからL2キャッシュへのデータ要求信号。
DOW：L2キャッシュからのデータ応答信号。この信号が「１」になった後に、L2キャッシュからL1キャッシュにデータが８サイクルで転送される。
LMD：Line miss detect信号であり、本来はキャッシュミスによりデータ応答ができなかったことを示す信号である。但し、ここではすべてのアボート要因が発生した場合に「１」になり、アボートが発生する。
STV：Status valid信号であり、L1キャッシュが命令制御部に正常にデータ応答したことを示す信号。
SP_TH0_E0_Va：スレッドTH0の第２ポートSPのエントリE0のバリッドビット
SP_TH0_E1_Va：スレッドTH0の第２ポートSPのエントリE1のバリッドビット
SP_TH0_E0_W：スレッドTH0の第２ポートSPのエントリE0のウエイトビット
SP_TH0_E1-W：スレッドTH0の第２ポートSPのエントリE1のウエイトビット
【００５９】
次に、図８の動作について図２の命令キャッシュ１３１の構成を参照しながら説明する。まず、サイクル２、３において、命令制御部ICから外部リクエスト入力EXT_REQからスレッドTH0の２つの命令フェッチリクエストTH0_EXT_REQ_1,2が順に投入され、キャッシュ処理回路２０がパイプライン処理する。この２つの命令フェッチリクエストは、リクエストポート２６にエントリされ、それぞれの第２ポート内のバリッドビットVaが有効状態「１」にされている。
【００６０】
しかし、サイクル６で、サイクルR処理部２５が、最初の命令フェッチリクエストTH0_EXT_REQ_1にキャッシュミスなどが発生したことを示すLMD信号を「１」する。これに応答して、ムーブインバッファMIBがL2キャッシュにデータ要求L2-REQを出力し、ムーブインするための回路資源を確保する（MIB0-VALID=1）。また、LMD信号が「１」になる結果に応答して、スレッドTH0の命令フェッチリクエストの投入要求信号R0を投入要求状態「１」にすることを禁止する投入要求禁止フラグTH0_INH_INT_REQを禁止状態「１」にする。これにより、図６の生成回路30_TH0は、投入要求信号R0を強制的に「０」にして、スレッドTH0は投入要求していない状態にされる。
【００６１】
さらに、サイクル６で、最初の命令フェッチリクエストTH0_EXT_REQ_1に対してLMD信号が「１」になったことで、次の命令フェッチリクエストTH0_EXT_REQ_2もサイクルBでアボートされる。その結果、２つの命令フェッチリクエストに対する第２ポートのウエイトビットWが共に「１」にされる。これで、アボートされた命令フェッチリクエストはウエイト状態になり、再投入が必要になる。
【００６２】
次に、サイクル８，９，１０で、サイクルR処理部２５が、後続の３つの命令フェッチリクエストが正常に終了したことを示すSTV信号を発生する。
【００６３】
サイクル１２で、L2キャッシュへのデータリクエストL2−REQを出力したサイクル６から６サイクルのレイテンシが経過し、L2キャッシュがデータ応答信号DOWを返信し、サイクル１３から２０までの８サイクルでフェッチした命令データがL2キャッシュからL1キャッシュのムーブインバッファMIBに転送される。
【００６４】
命令データの転送が完了すると、サイクル２１と２４で、ムーブイン入力MIが、キャッシュ処理回路２０に、データメモリD_RAMとタグメモリT_RAMへのキャッシュ登録リクエスト（キャッシュ書き込みリクエスト）をそれぞれ投入する。
【００６５】
サイクル２８で命令データのキャッシュ登録が完了すると、その結果信号RESにより投入要求禁止フラグTH0_INH_INT_REQが許可状態「０」にされ、ムーブインバッファの資源MIB0-VALIDも「０」にされる。その結果、スレッドTH0の投入要求信号R0は要求状態「１」になり、リクエスト決定回路２７が、リクエストポート２６内に待機中の２つの命令フェッチリクエストTH0_INT_REQ_1,2を連続して、内部リクエスト入力INT_REQからキャッシュ処理回路２０に再投入する。再投入されたことで、その２つの命令フェッチリクエストのウエイトビットSP_TH0_E0_W、SP_TH0_E1_Wが非待機状態の「０」にされる。リクエストポート２６内の制御回路（図２に図示せず）が、このウエイトビットの変更を、結果信号RESなどに応答して行う。
【００６６】
最後に、サイクル３３，３４で再投入された２つの命令フェッチリクエストが正常に終了してSTV信号が出力され、それに応答して、それらの第２ポート内のバリッドビットVaが無効状態「０」にされる。上記のリクエストポート２６内の制御回路（図２に図示せず）が、STV信号に応答してこのバリッドの変更を行う。
【００６７】
図８の動作例のタイミングチャートにより、第１の実施の形態における命令キャッシュ１３１のリクエストポート２６の動作の概略が理解できる。図８の動作例は、スレッドTH0の命令フェッチリクエストだけがアボートされ、その後キャッシュ処理回路に再投入されている。ただし、図８の動作には、複数のスレッドの命令フェッチリクエストがアボートして、スレッド間で１つのスレッドが選択されてその命令フェッチリクエストが再投入される動作は含まれていない。
【００６８】
このように複数のスレッドの命令フェッチリクエストがアボートして待機状態になったときは、上記と同様に、L1キャッシュは、それぞれのL2キャッシュへのデータリクエストL2−REQにより命令データを取得し、更にその命令データをキャッシュ登録する。その後、リクエストポート２６内のリクエスト決定部２７内の次のスレッド決定回路３１（図６）が、複数のスレッドのいずれかを選択し、選択したスレッドの待機中の命令フェッチリクエストをキャッシュ処理回路２０に再投入する。
【００６９】
以下、次のスレッド決定回路３１の具体例を第２、第３の実施の形態で説明する。
【００７０】
［第２の実施の形態］
第２の実施の形態では、次のスレッド決定回路３１は、複数のスレッドの待機中の命令フェッチリクエストから、LRU方式の順番で、投入対象のスレッドを選択する。そのために、次のスレッド決定回路３１は、各スレッドの投入要求信号R0-R3に加えて、LRUキューの４つのスレッドTH#の古い順番の情報を入力し、投入要求信号R0-R3を要求状態「１」にしているスレッドのうち最も順番が古いスレッドを、次のスレッドに決定する。
【００７１】
図９は、第２の実施の形態における次のスレッド決定回路３１の構成を示す図である。図９の次のスレッド決定回路３１は、図６に示されるとおり、各スレッドの第２のポートSP_TH#のバリッドビットVaとウエイトビットWとに基づいて生成回路30_TH#が生成した投入要求信号R#を入力する。
【００７２】
但し、図９では、生成回路30_TH#が生成した投入要求信号R#が、アンドゲート３１１を介して入力する。そして、４つのアンドゲート３１１は、投入要求禁止フラグTH#_INHを反転して入力し、投入要求禁止フラグTH#_INHが禁止状態「１」の場合に投入要求信号R#を強制的に非投入要求状態の「０」にし、許可状態「０」の場合に投入要求信号R#をそのまま出力する。そして、ムーブインバッファMIBが、L2キャッシュへのデータリクエスト開始から、取得した命令データのキャッシュ登録リクエストの終了までの間、投入要求禁止フラグTH#_INHレジスタ３１２のフラグを禁止状態「１」にして、そのスレッドの投入要求信号R#が要求状態「１」になることを禁止する。
【００７３】
また、図９では、LRUキュー３１３とLRU更新回路３１４とを有する。LRUキュー３１３は、４つのエントリQ0-Q4内に古い順でスレッド番号TH#を格納する。そして、LRU更新回路３１４は、次のスレッド決定回路３１が出力する次のスレッドN_THに応じて、LRUキュー３１３内の順番を更新する。
【００７４】
LRU更新回路３１４の具体的な更新動作は次のとおりである。LRUキュー３１３の４つのエントリQ0-Q4には、例えば初期値としてTH0、TH1、TH2、TH3が登録されているとする。この初期状態では、スレッドTH0が最も古いスレッドであり、スレッドTH1、TH2、TH3の順に新しくなる。そして、次のスレッド決定回路３１は、投入要求信号R#が「１」のスレッドのうち、LRUキューで最も古いスレッドを、次に投入するスレッドである、次スレッドN_THに選択する。例えば、次のスレッド決定回路３１がスレッドTH0を次のスレッドN_THに選択すると、LRU更新回路３１４はLRUキュー３１３内のスレッドTH0を最古のエントリQ0から最も新しいエントリQ3に移動し、エントリQ1,Q2,Q3内のスレッド番号TH#をそれぞれエントリQ0,Q1,Q2に移動する。その結果、４つのスレッドの古い順番は、TH1,TH2,TH3,TH0の順番になる。
【００７５】
その後、次スレッドN_THとしてスレッドTH2が選択されると、エントリQ1内のスレッドTH2をエントリQ3に移動し、エントリQ2,Q3のスレッドTH3,TH0をそれぞれエントリQ1,Q2に移動する。その結果、４つのスレッドの古い順番は、TH1,TH3,TH0,TH2となる。
【００７６】
このように、LRU更新回路３１４は、LRUキュー３１３内のスレッドの順番を次のスレッド決定回路３１が次スレッドN_THを出力するたびに更新し、LRUキュー３１３のエントリQ0-Q3に、そのときの古い順番でスレッド番号を記憶する。
【００７７】
図１０、図１１は、第２の実施の形態における次のスレッド決定回路３１の真理値表の一例を示す図である。この真理値表は、LRUキューの順番の組合せ数に対応して２４個ある。例えば、図１０の右上の真理値表T11を参照して、次のスレッド決定回路の論理演算回路の動作を説明する。
【００７８】
図１０の右上の真理値表T11による論理演算回路は、LRUキューの各エントリQ0-Q3と投入要求信号R0-R3を入力し、次のスレッドN_THを出力する。すなわち、LRUキューによれば４つのスレッドTH0-TH3の古い順番はQ0,Q1,Q2,Q3に示されるとおりHT0,TH1,TH2,TH3である。したがって、最も古いスレッドTH0の投入要求信号R0が「１」の場合、他のスレッドの投入要求信号R1-R3の状態にかかわらず、次のスレッドN_THは「０」になる。同様に、最も新しいスレッドTH3の投入要求信号R3が「１」の場合、他のスレッドの投入要求信号R0-R2が全て「０」であれば、次のスレッドN_THは「３」になる。スレッドTH1,TH2の投入要求信号R1,R2が「１」の場合、それより古いスレッドの投入要求信号が全て「０」であれば、次のスレッドN_THは「１」または「２」になる。すなわち、図７の真理値表T2のTH#_Xを求める演算と類似する。
【００７９】
しかし、図９の次のスレッド決定回路３１の場合は、LRUキュー３１３の順番が動的に変化する。そのため、LRUキューが取りうる２４種類のスレッドの順番の組合せの数だけ真理値表が必要になる。ただし、LRUキューのエントリQ0-Q3の組合せに応じて、投入要求信号R0-R3の配置を変更すれば、全て右上の真理値表T11と同じなることが理解できる。
【００８０】
例えば、真理値表T12の場合は、Q0-Q3がTH0,TH1,TH3,TH2であるので、投入要求信号をR0,R1,R3,R2に並び替えると、真理値表T11と同じになる。すなわち、最も古いスレッドTH0の投入要求信号R0が「１」の場合は、真理値表T11と同様に他のスレッドの投入要求信号R1-R3がいずれであっても、次のスレッドN_THはTH0になる。また、最も新しいスレッドTH2の投入要求信号R2が「１」の場合は、他のスレッドTH10,TH1,TH3の投入要求信号R0,R1,R3が全て「０」であれば、次のスレッドN_THはTH2になる。
【００８１】
他の真理値表も同様である。
【００８２】
［第３の実施の形態］
第３の実施の形態では、次のスレッド決定回路３１は、複数のスレッドの待機中の命令フェッチリクエストから、ラウンドロビン方式の順番で、投入対象のスレッドを選択する。但し、最も最近投入対象に選ばれたスレッド（カレントスレッド）を最新とし、循環する順位で最新から最古のスレッドを決定する。そのために、次のスレッド決定回路３１は、各スレッドの投入要求信号R0-R3に加えて、カレントスレッドC_THの情報を入力し、カレントスレッドC_THに基づいて最古から最新のスレッドの順位を決定する。そして、次のスレッド決定回路３１は、投入要求信号R0-R3を要求状態「１」にしているスレッドのうち最も順番が古いスレッドを、次のスレッドに決定する。
【００８３】
図１２は、第３の実施の形態における次のスレッド決定回路３１の構成を示す図である。図１２の構成で、図９と異なるのは、次のスレッド決定回路３１が出力する次のスレッドN_THを格納するカレントスレッドレジスタ３１５を有することと、次のスレッド決定回路３１がカレントスレッドC_THに基づいてスレッド間の順番を決定することである。それ以外は、図９と同様である。
【００８４】
図１３、第３の実施の形態における次のスレッド決定回路３１の真理値表の一例を示す図である。図１３の左側にラウンドロビン方式によるスレッドTH0-TH3の間の固定された循環順位が示されている。この循環順位によれば、４つのスレッドはTH0,TH1,TH2,TH3を環状に並べた順番に固定される。そして、最新に投入されるスレッドであるカレントスレッドがTH2の場合、最古から最新のスレッドの順位はTH3,TH0,TH1,TH2となる。同様に、カレントスレッドがTH0の場合、最古から最新のスレッドの順位はTH1,TH2,TH3,TH0となる。したがって、スレッドの順位の種類は４種類であり真理値表の数も４つになり、第２の実施の形態の場合の２４種類よりかなり少ない。
【００８５】
図１３の真理値表を参照して、次のスレッド決定回路３１の論理演算回路の動作を説明する。真理値表は、カレントスレッドCが０−３に応じて４種類ある。そして、真理値表は、カレントスレッドCと各スレッドの投入要求信号R0-R3とを入力し、次のスレッド番号N_THを出力する。
【００８６】
例えば、カレントスレッドCが「３」の場合は一番下の表T23になる。この真理値表T23では、カレントスレッドCが「３」であるので、スレッド間の順位はTH0,TH1,TH2,TH3となる。したがって、真理値表T23は図１０の真理値表T11と同じなる。つまり、最も古いスレッドTH0の投入要求信号R0が「１」の場合、他のスレッドの投入要求信号R1-R3の状態にかかわらず、次のスレッドN_THは「０」になる。同様に、最も新しいスレッドTH3の投入要求信号R3が「１」の場合、他のスレッドの投入要求信号R0-R2が全て「０」であれば、次のスレッドN_THは「３」になる。スレッドTH1,TH2の投入要求信号R1,R2が「１」の場合、それより古いスレッドの投入要求信号が全て「０」であれば、次のスレッドN_THは「１」または「２」になる。すなわち、図７の真理値表T2のTH#_Xを求める演算とも類似する。
【００８７】
同様に、カレントスレッドCが「２」の場合の真理値表T22では、スレッド間の順位はTH3,TH0,TH1,TH2となる。したがって、最も古いスレッドTH3の投入要求信号R3が「１」の場合、他のスレッドの投入要求信号の状態にかかわらず、次のスレッドN_THは「３」になる。逆に、最も新しいスレッドTH2の投入要求信号R2が「１」の場合、他のスレッドの投入要求信号がすべて「０」であれば、次のスレッドN_THは「２」になる。他の真理値表T20,T21も上記と同様である。
【００８８】
第３の実施の形態によれば、真理値表の数が４個と少ないので、第２の実施の形態と比較すると、次のスレッド決定回路３１の論理回路の規模を小さくすることができる。
【００８９】
以上のとおり、本実施の形態によれば、マルチスレッド対応のプロセッサにおいて、命令フェッチリクエストをエントリするリクエストポートが、マルチスレッド間で共通に設けられ命令フェッチリクエストの情報（例えばアドレス）を格納する第１のポートと、スレッドそれぞれに設けられ第１ポートに格納された命令フェッチリクエストのインデックスとウエイトフラグとを格納する複数の第２のポートを有する。そして、リクエストポートが、スレッド内では古い順に、スレッド間では所定の順番で、次の投入する命令フェッチリクエストを選択する。したがって、小さな回路規模のリクエストポートが、マルチスレッドの命令フェッチの制御を行うことができる。
【００９０】
以上の実施の形態をまとめると，次の付記のとおりである。
【００９１】
（付記１）
命令フェッチリクエストを出力する命令制御部と、
前記命令制御部から出力される命令フェッチリクエストをエントリするリクエストポートと、投入された前記命令フェッチリクエストに応答して、前記命令フェッチリクエストに対応する命令データを出力するキャッシュ処理回路とを有する第１のキャッシュと、
前記第１のキャッシュでキャッシュミスした場合に前記第１のキャッシュから出力されるデータ要求に応答して、前記命令データを前記第１のキャッシュに応答する第２のキャッシュを有し、
前記リクエストポートは、
複数のスレッドに共通に設けられ、各スレッドの前記命令フェッチリクエストの情報を格納する第１のポートと、
前記複数のスレッドそれぞれに設けられ、対応するスレッドの前記命令フェッチリクエストの情報を格納する前記第１のポートのエントリ番号を格納する複数の第２のポートと、
前記リクエストポート内にエントリされた前記命令フェッチリクエストのうち、前記第１のキャッシュへの投入をウエイト中の命令フェッチリクエストを優先し、且つ各スレッドの命令フェッチリクエストについては前記命令制御部が出力した順に、前記第１のキャッシュに投入する命令フェッチリクエストを決定するリクエスト決定回路とを有する演算処理装置。
【００９２】
（付記２）
前記複数の第２のポートのそれぞれは、複数のエントリを有し、各エントリは、前記第１のキャッシュへの投入をウエイト中か否かを示すウエイトビットを、前記第１のポートのエントリ番号と共に格納し、
前記第１のキャッシュは、キャッシュミスした第１の命令フェッチリクエストと前記第１の命令フェッチリクエストより後に投入された同じスレッドの第２の命令フェッチリクエストとをアボートし、前記アボートした第１、第２の命令フェッチリクエストの前記第２のポート内のウエイトビットをウエイト状態にし、
前記リクエスト決定回路は、各第２のポートが有する複数のエントリから前記ウエイトビットがウエイト状態である最古のエントリを選択し、前記複数の第２のポートでそれぞれ選択されたエントリから複数のスレッドの所定の順番に基づいて前記第１のキャッシュへの投入対象エントリを選択する、付記１に記載の演算処理装置。
【００９３】
（付記３）
前記第１のキャッシュは、前記ウエイト状態の命令フェッチリクエストが前記キャッシュ処理回路に投入されると、前記投入された命令フェッチリクエストの前記ウエイトビットを非ウエイト状態に変更する、付記２に記載の演算処理装置。
【００９４】
（付記４）
前記第１のキャッシュは、前記キャッシュミスした第１の命令フェッチリクエストの命令データを前記第２のキャッシュに要求している間、前記リクエスト決定回路が前記第１の命令フェッチリクエストを選択しないように制御する禁止フラグを禁止状態に設定し、前記第１の命令フェッチリクエストの命令データを前記第２のキャッシュから受信したときに、前記禁止フラグを許可状態に変更する、付記２に記載の演算処理装置。
【００９５】
（付記５）
前記所定の順番は、前記第１のキャッシュに命令フェッチリクエストが投入された投入順である、付記２に記載の演算処理装置。
【００９６】
（付記６）
前記リクエスト決定回路は、前記複数の第２のポートでそれぞれ選択されたエントリのうち、前記複数のスレッドの投入順で最も古いスレッドを、前記第１のキャッシュへの投入対象エントリに選択する、付記４に記載の演算回路。
【００９７】
（付記７）
前記所定の順番は、複数のスレッドの固定された循環する順番内において、最近投入されたスレッドの次の順番のスレッドが最古になる順番である、付記２に記載の演算処理装置。
【００９８】
（付記８）
前記リクエスト決定回路は、前記複数の第２のポートでそれぞれ選択されたエントリのうち、前記所定の順番で最も古いスレッドを、前記第１のキャッシュへの投入対象エントリに選択する、付記６に記載の演算回路。
【００９９】
（付記９）
前記第１のキャッシュは、前記投入された命令フェッチリクエストに対する命令データを前記命令制御部に応答したとき、前記投入された命令フェッチリクエストの前記第２のポート内のエントリを無効状態に変更する、付記２に記載の演算処理装置。
【０１００】
（付記１０）
前記第１のキャッシュは、投入された命令フェッチリクエストを処理する複数のステージを有するパイプライン構成を有し、
前記複数の第２のポートのそれぞれは、前記第１のキャッシュのパイプラインのステージ数以上のエントリを有し、
前記第１のポートは、前記複数の第２のポートのエントリ数の合計数より少ないエントリを有する、付記１に記載の演算処理装置。
【０１０１】
（付記１１）
命令フェッチリクエストを出力する命令制御部と、
前記命令制御部から出力される命令フェッチリクエストをエントリするリクエストポートと、投入された前記命令フェッチリクエストに応答して、前記命令フェッチリクエストに対応する命令データを出力するキャッシュ処理回路とを有する第１のキャッシュと、
前記第１のキャッシュでキャッシュミスした場合に前記第１のキャッシュから出力されるデータ要求に応答して、前記命令データを前記第１のキャッシュに応答する第２のキャッシュを有し、
前記リクエストポートは、
複数のスレッドに共通に設けられ、各スレッドの前記命令フェッチリクエストの情報を格納する第１のポートと、
前記複数のスレッドそれぞれに設けられ、対応するスレッドの前記命令フェッチリクエストの情報を格納する前記第１のポートのエントリ番号を格納する複数の第２のポートを有し、
前記リクエストポートは、前記リクエストポート内にエントリされた前記命令フェッチリクエストのうち、前記第１のキャッシュへの投入をウエイト中の命令フェッチリクエストを優先し、且つ各スレッドの命令フェッチリクエスト間では前記命令制御部が出力した順に、前記第１のキャッシュに投入する命令フェッチリクエストを決定する演算処理装置の制御方法。
【０１０２】
（付記１２）
前記複数の第２のポートのそれぞれは、複数のエントリを有し、各エントリは、前記第１のキャッシュへの投入をウエイト中か否かを示すウエイトビットを、前記第１のポートのエントリ番号と共に格納し、
さらに、
前記第１のキャッシュは、キャッシュミスした第１の命令フェッチリクエストと前記第１の命令フェッチリクエストより後に投入された同じスレッドの第２の命令フェッチリクエストとをアボートし、前記アボートした第１、第２の命令フェッチリクエストの前記第２のポート内のウエイトビットをウエイト状態にし、
前記リクエストポートは、各第２のポートが有する複数のエントリから前記ウエイトビットがウエイト状態である最古のエントリを選択し、前記複数の第２のポートでそれぞれ選択されたエントリから複数のスレッドの所定の順番に基づいて前記第１のキャッシュへの投入対象エントリを選択する、付記１１に記載の演算処理装置の制御方法。
【０１０３】
（付記１３）
前記第１のキャッシュは、前記ウエイト状態の命令フェッチリクエストが前記キャッシュ処理回路に投入されると、前記投入された命令フェッチリクエストの前記ウエイトビットを非ウエイト状態に変更する、付記１２に記載の演算処理装置の制御方法。
【符号の説明】
【０１０４】
１０：演算処理装置、CPU
１１：CPUコア
１３：L1キャッシュ
１３１：L1命令キャッシュ
１３２：L1データキャッシュ
１４：L2キャッシュ
２０：L1命令キャッシュ処理回路
２１：サイクルP処理部
２２：サイクルT処理部
２３：サイクルM処理部
２４：サイクルB処理部
２５：サイクルR処理部
２６：リクエストポート
２７：リクエスト決定回路
PP：第１のポート、プライマリポート
SP：第２のポート、セカンダリポート
IC：命令制御部（命令デコーダなど）
EXT_REQ：外部リクエスト入力
INT_REQ：内部リクエスト入力
MI：ムーブイン入力
MIB：ムーブインバッファ
TLB：トランスレーション・ルックアサイド・バッファ
T_RAM：タグメモリ
D_RAM：データメモリ
NR：次のリクエスト
PP_E#：第1ポートのエントリ番号＃
ADD：命令フェッチリクエストのアドレス
SP_TH#：スレッド＃の第２ポート
SP_TH#_E#：スレッド＃の第２ポートのエントリ及びエントリ番号E#
Va：バリッドフラグ
WAIT、W：待機フラグ
V#：第１ポートのエントリ番号＃の投入要求フラグ
TH#_X：スレッド＃の第１ポートの投入要求エントリ番号
R#：スレッド＃の投入要求信号
N_TH：次のスレッド番号
TH#_INH：スレッド＃の投入禁止フラグ
３１２：TH#_INHレジスタ
３１３：LRUキュー
３１４：LRU更新回路
C_TH, C：カレントスレッド番号
LMD：ラインミス検出信号、キャッシュミス検出信号
【図１】
0006384380.tif 000002
【図２】
0006384380.tif 000003
【図３】
0006384380.tif 000004
【図４】
0006384380.tif 000005
【図５】
0006384380.tif 000006
【図６】
0006384380.tif 000007
【図７】
0006384380.tif 000008
【図８】
0006384380.tif 000009
【図９】
0006384380.tif 000010
【図１０】
0006384380.tif 000011
【図１１】
0006384380.tif 000012
【図１２】
0006384380.tif 000013
【図１３】
0006384380.tif 000014