(57)【要約】  同時マルチスレッディング方式であり、各スレッドに設けられたレジスタウィンドウ方式を採用したマスタレジスタとワークレジスタとを接続するためのデータ転送バスを、スレッド間で共有することにより、回路面積を縮小するとともに、スレッド間でのレジスタへのアクセスの競合に伴う他スレッドへの命令実行の干渉を防止するレジスタウィンドウ方式の情報処理装置及びその制御方法を提供する。  レジスタ読み出しにレジスタウィンドウ方式をとる装置において、同時マルチスレッディングを実現するため、マスタレジスタとワークレジスタをそれぞれスレッドごとに保有し、マスタレジスタからワークレジスタへのデータ転送バスをスレッド間で共有するレジスタセットを保有するレジスタウィンドウ方式の情報処理装置及びその制御方法。
2008155801.tif 000002
【特許請求の範囲】
【請求項１】
同時マルチスレッディングを実行する、ｉｎレジスタ、ｌｏｃａｌレジスタおよびｏｕｔレジスタの順序によるレジスタの組から構成されるレジスタウィンドウを複数有し構成されるマスタレジスタを備える情報処理装置であって、
複数のスレッドごとにマスタレジスタとワークレジスタを設け、前記マスタレジスタから前記ワークレジスタへのデータ転送を前記スレッド間で共有するデータ転送バスを備えるレジスタセットと、
メモリから読み出した命令をデコードする命令解析部と、
前記デコードされた命令を実行する演算部に、前記デコードされた命令を発行する制御をする命令発行制御部と、
前記演算部の命令実行結果を取得し、前記実行結果に基づいて前記レジスタセットの更新をするための制御をする命令完了制御部と、
前記マスタレジスタから前記ワークレジスタへのデータ転送を制御するデータ転送制御部と、
を具備することを特徴とする情報処理装置。
【請求項２】
データ転送制御部は、
前記命令完了制御部から、前記スレッドごとのワークレジスタのデータを書き換える処理を行うために、前記スレッドごとに出力されるワークレジスタ書き換え要求信号を受信し、前記ワークレジスタ書き換え要求信号の示す前記スレッドのワークレジスタのデータを書き換える処理の開始指示をするフラグを生成してデータ転送タイミング制御部に出力するフラグ生成部と、
前記フラグに応じてデータ転送分のサイクルをカウントするデータ転送制御カウンタと、
前記フラグと前記データ転送分のサイクルに基づいて、所定のタイミングでデータ転送を制御するデータ転送タイミング制御部と、
前記データ転送分のサイクルに基づいて、データ転送中は前記命令を抑止する命令抑止信号を出力する命令発行抑止制御部と、
を具備することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
さらに、請求項１の構成に、
前記スレッドごとにトラップを検出してトラップ情報を生成し、前記スレッドごとにて前記トラップ情報を前記データ転送制御部に出力するデータ転送要求信号生成部を設けることを特徴とする請求項１に記載の情報処理装置。
【請求項４】
前記命令完了制御部は、
同じ前記スレッドにより前記トラップと前記ワークレジスタ書き換え要求が発生すると、前記ワークレジスタ書き換え要求信号の示す前記スレッドのワークレジスタのデータを書き換える処理の開始指示をするフラグを生成してデータ転送タイミング制御部に出力することを特徴とする請求項３に情報処理装置。
【請求項５】
前記命令完了制御部は、
命令コミットの要求を発生した前記スレッドがあるとき、異なるスレッドによりワークレジスタのデータを書き換える処理をしていることを前記命令抑止信号により通知されたとき、前記異なるスレッドによるワークレジスタのデータを書き換える処理の命令が完了するまで前記命令コミットを抑止することを特徴とする請求項３に記載の情報処理装置。
【請求項６】
前記命令解析部は、
命令デコードの要求である命令デコード要求が発生したときに、前記命令デコード要求信号と同じ前記スレッドから前記命令抑止信号を受信すると、前記命令のデコードを抑止することを特徴とする請求項４に記載の情報処理装置。
【請求項７】
前記フラグ生成部は、
前記スレッドごとに前記命令完了制御部から出力されるワークレジスタ書き換え要求信号に優先順位を設けることを特徴とする請求項２に記載の情報処理装置。
【請求項８】
同時マルチスレッディングを実行するレジスタウィンドウの制御方法であって、
メモリから読み出した命令をデコードする命令解析ステップと、
前記デコードされた命令を実行する演算部に、前記デコードされた命令を発行する制御をする命令発行制御ステップと、
前記演算部の命令実行結果を取得し、前記実行結果に基づいて、複数のスレッドごとに前記レジスタウィンドウ方式のマスタレジスタとワークレジスタを設け、前記マスタレジスタから前記ワークレジスタへのデータ転送を前記スレッド間で共有するデータ転送バスを備えるレジスタセットの更新をするための制御をする命令完了制御ステップと、
前記マスタレジスタから前記ワークレジスタへのデータ転送を制御するデータ転送制御ステップと、
を有することを特徴とするレジスタウィンドウの制御方法。
【請求項９】
データ転送制御ステップは、
前記スレッドごとのワークレジスタのデータを書き換える処理を行うために、前記スレッドごとに出力されるワークレジスタ書き換え要求と、前記ワークレジスタ書き換え要求の前記スレッドのワークレジスタのデータを書き換える処理の開始指示をするフラグを生成するフラグ生成ステップと、
前記フラグに応じてデータ転送分のサイクルをカウントするデータ転送制御カウンタステップと、
前記フラグと前記データ転送分のサイクルに基づいて、所定のタイミングでデータ転送を制御するデータ転送タイミング制御ステップと、
前記データ転送分のサイクルに基づいて、データ転送中は前記命令を抑止する命令発行抑止制御ステップと、
を有することを特徴とする請求項８に記載のレジスタウィンドウの制御方法。
【請求項１０】
前記スレッドごとにトラップを検出してトラップ情報を生成し、前記スレッドごとにて前記トラップ情報を生成することを特徴とする請求項８に記載のレジスタウィンドウの制御方法。
【請求項１１】
前記命令完了制御ステップは、
同じ前記スレッドにより前記トラップと前記ワークレジスタ書き換え要求が発生すると、前記ワークレジスタ書き換え要求の前記スレッドのワークレジスタのデータを書き換える処理の開始指示をするフラグを生成することを特徴とする請求項１０に記載のレジスタウィンドウの制御方法。
【請求項１２】
前記命令完了制御ステップは、
命令コミットの要求が発生した前記スレッドがあるとき、異なるスレッドによりワークレジスタのデータを書き換える処理をしていることを通知されたとき、前記異なるスレッドによるワークレジスタのデータを書き換える処理の命令が完了するまで前記命令コミットを抑止することを特徴とする請求項１０に記載のレジスタウィンドウの制御方法。
【請求項１３】
前記命令解析ステップは、
命令デコードの要求である命令デコード要求が発生したときに、前記命令デコード要求がある前記スレッドから前記命令抑止の通知があると、前記命令のデコードを抑止することを特徴とする請求項１１に記載のレジスタウィンドウの制御方法。
【請求項１４】
前記フラグ生成ステップは、
前記スレッドごとに前記ワークレジスタ書き換え要求信号に優先順位を設けることを特徴とする請求項９に記載のレジスタウィンドウの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、同時マルチスレッディングを実行するレジスタウィンドウ方式を採用した情報処理装置とその制御方法に関する。
【背景技術】
【０００２】
近年、情報処理装置に使用される汎用レジスタの構成としてレジスタウィンドウ方式が提唱されている。これは複数のレジスタセット（ウィンドウ）をもつことで、サブルーチンのコール／リターン時などに発生するレジスタのメモリへの退避、復帰を不要にするためのものである。【０００３】
ただし、ウィンドウの数が膨大になってくると、レジスタから実行ユニットへのデータリードが高速に行えなくなるという問題がある。そこで、汎用レジスタ（General-Purpose Registers）のうちで現状参照しているウィンドウをワークレジスタとして保持し、このワークレジスタにキャッシュのような動作をさせることで、サイズなどに起因するリード・ライト時間のロスを軽減する方式が提案されている。【０００４】
ところが、現状参照している１ウィンドウのみをワークレジスタとして保持する構成とすると、ウィンドウの切り替えを行うたびにワークレジスタへのデータ転送を実行しなければならない。そして、この間に参照すべきデータが存在しないため、後続の命令はデータ転送が終了するまで実行することができなくなってしまう。【０００５】
このような構成では、命令の処理順序を入れ替えて、プログラムの実行順序に関係なく処理可能な命令から処理を行うアウトオブオーダ命令実行方式を用いた同時命令発行数の多い情報処理装置においては、非常に大きな性能低下を招くことになる。【０００６】
そこで、アウトオブオーダ命令実行方式の情報処理装置では、多くの命令をバッファに格納しておき、その中から実行可能な命令をプログラムに指定された実行順序を入れ替えて実行することで、命令のスループットを向上している。【０００７】
しかし、上記のような構成では、ウィンドウ切り替えの前後で命令順序の入れ替えは不可能であり、後続に格納してある命令は全て実行を待たなければならず、アウトオブオーダ実行方式は機能しなくなる。【０００８】
特許文献１によれば、以上のような問題を解決するために、ワークレジスタに複数のウィンドウを保持する方式が提案された。つまり、現状参照しているウィンドウに隣接しているウィンドウも合わせてワークレジスタセットとして保持することで、連続したウィンドウの切り替え時の後続命令がデータ転送を待たずに実行可能となる。【０００９】
また、近年の情報処理装置では、演算実行の処理をできるだけ並列化して各実行部の使用効率をあげることで、全体のパフォーマンスを向上させようとするスーパースカラ方式が一般に知られている。【００１０】
しかし、スーパースカラを採用した情報処理装置においても内部の実行部がすべて動作しているわけではなく、並列性が最大限に活かされていないことが問題となっている。そこで、単一スレッドでは完全には使用されない資源（周辺回路：演算器やデータ転送バスなど）を複数のスレッドに分配することで、情報処理装置が本来持つ並列性を最大限に引き出すための方式として、同時マルチスレッディング（ＳＭＴ：Simultaneous Multi-Threading）が提案されている。【００１１】
ＳＭＴを実現するひとつの解として単純に資源をスレッドと同じ数だけ増設することが考えられる。つまり、２ＳＭＴを単一スレッドの２倍の資源で構成する。この場合同一の資源に対するスレッド間のアクセス競合は発生しない。しかしながら、スレッド数の増加に伴い、必要な資源は膨大となるし、増加した分資源の使用効率はかえって悪化してしまう。これはＳＭＴ本来の目的から逸脱している。【００１２】
そこで、資源の一部を共有化することで資源増大を抑え、かつ資源の使用効率を向上させる構成が求められる。また、資源の一部の共有することでスレッド間での共有資源へのアクセスの競合に伴う他スレッドへの命令実行の干渉が問題となる。そのため、共有資源へのアクセス競合を防ぐ制御もあわせて求められる。
【特許文献１】特開２００３−１９６０８６号公報
【発明の開示】
【００１３】
本発明は上記のような実情に鑑みてなされたものであり、同時マルチスレッディング方式であり、各スレッドに設けられたレジスタウィンドウ方式を採用したマスタレジスタとワークレジスタとを接続するためのデータ転送バスを、スレッド間で共有することにより、回路面積を縮小するとともに、スレッド間でのレジスタへのアクセスの競合に伴う他スレッドへの命令実行の干渉を防止するレジスタウィンドウ方式の情報処理装置及びその制御方法を提供することを目的とする。
【００１４】
本発明の態様のひとつである同時マルチスレッディングを実行するレジスタウィンドウ方式の情報処理装置であって、複数のスレッドごとに前記レジスタウィンドウ方式のマスタレジスタとワークレジスタを設け、前記マスタレジスタから前記ワークレジスタへのデータ転送を前記スレッド間で共有するデータ転送バスを備えるレジスタセットと、メモリから読み出した命令をデコードする命令解析部と、前記デコードされた命令を実行する演算部に、前記デコードされた命令を発行する制御をする命令発行制御部と、前記演算部の命令実行結果を取得し、前記実行結果に基づいて前記レジスタセットの更新をするための制御をする命令完了制御部と、前記マスタレジスタから前記ワークレジスタへのデータ転送を制御するデータ転送制御部と、を具備する構成である。
【００１５】
好ましくは、データ転送制御部は、前記命令完了制御部から、前記スレッドごとのワークレジスタのデータを書き換える処理であるＬＯＡＤ−ＣＷＰ処理を行うために、前記スレッドごとに出力されるワークレジスタ書き換え要求信号を受信し、前記ワークレジスタ書き換え要求信号の示す前記スレッドのＬＯＡＤ−ＣＷＰ処理の開始指示をするフラグを生成してデータ転送タイミング制御部に出力するフラグ生成部と、前記フラグに応じてデータ転送分のサイクルをカウントするデータ転送制御カウンタと、前記フラグと前記データ転送分のサイクルに基づいて、所定のタイミングでデータ転送を制御するデータ転送タイミング制御部と、前記データ転送分のサイクルに基づいて、データ転送中は後続の命令の実行を抑止する命令抑止信号を出力する命令発行抑止制御部と、を具備する。
【００１６】
好ましくは、前記スレッドごとにトラップを検出してトラップ情報を生成し、前記スレッドごとにて前記ワークレジスタ書き換え要求信号を前記データ転送制御部に出力するワークレジスタ書き換え要求信号生成部を前記トラップ検出部に設ける。
【００１７】
好ましくは、前記データ転送制御部における前記フラグ生成部は、同じ前記スレッドにより前記命令完了制御部や前記トラップ検出部から前記ワークレジスタ書き換え要求が発生すると、前記ワークレジスタ書き換え要求信号に優先順位を設け、前記優先順位に応じた前記ワークレジスタ書き換え要求信号の示す前記スレッドのＬＯＡＤ−ＣＷＰ処理の開始指示をするフラグを生成してデータ転送タイミング制御部に出力する。
【００１８】
好ましくは、前記命令完了制御部は、命令コミットの要求が発生した前記スレッドがあるとき、異なるスレッドにより前記ＬＯＡＤ−ＣＷＰ処理をしていることを前記命令抑止信号により通知されたとき、前記異なるスレッドによる前記ＬＯＡＤ−ＣＷＰ命令が完了するまで前記命令コミットを抑止する。
【００１９】
好ましくは、前記命令解析部は、命令デコードの要求が発生したときに、前記命令デコード要求信号と同じ前記スレッドから前記命令抑止信号を受信すると、前記命令のデコードを抑止する。
【００２０】
本発明は、同時マルチスレッディングを実行するレジスタウィンドウ方式のデータ転送制御方法であって、命令パイプラインとして、メモリから読み出した命令をデコードする命令解析ステップと、前記デコードされた命令を実行する演算部に、前記デコードされた命令を発行する制御をする命令発行制御ステップと、前記演算部の命令実行結果を取得し、前記実行結果に基づいて、複数のスレッドごとに前記レジスタウィンドウ方式のマスタレジスタとワークレジスタを設け、前記マスタレジスタから前記ワークレジスタへのデータ転送を前記スレッド間で共有するデータ転送バスを備えるレジスタセットの更新をするための制御をする命令完了制御ステップと、前記マスタレジスタから前記ワークレジスタへのデータ転送を制御するデータ転送制御ステップと、を有する。
【００２１】
好ましくは、データ転送制御ステップは、前記スレッドごとのワークレジスタのデータを書き換える処理であるＬＯＡＤ−ＣＷＰ処理を行うために、前記スレッドごとに出力されるワークレジスタ書き換え要求を受け取り、前記ワークレジスタ書き換え要求の示す前記スレッドのＬＯＡＤ−ＣＷＰ処理の開始指示をするフラグを生成するフラグ生成ステップと、前記フラグに応じてデータ転送分のサイクルをカウントするデータ転送制御カウンタステップと、前記フラグと前記データ転送分のサイクルに基づいて、所定のタイミングでデータ転送を制御するデータ転送タイミング制御ステップと、前記データ転送分のサイクルに基づいて、データ転送中は前記命令を抑止する命令発行抑止制御ステップと、を有する。
【００２２】
好ましくは、前記スレッドごとにトラップを検出してトラップ情報を生成し、前記スレッドごとにて前記ワークレジスタ書き換え要求を生成する。
好ましくは、前記データ転送制御ステップにおけるフラグ生成ステップは、前記スレッドにより前記ワークレジスタ書き換え要求が発生すると、前記スレッドごとに優先順位を設け、前記優先順位に応じた前記ワークレジスタ書き換え要求の示す前記スレッドのＬＯＡＤ−ＣＷＰ処理の開始指示をするフラグを生成する。
【００２３】
好ましくは、前記命令完了制御ステップは、命令コミットの要求が発生した前記スレッドがあるとき、異なるスレッドにより前記ＬＯＡＤ−ＣＷＰ処理をしていることに基づき命令抑止の通知がされたとき、前記異なるスレッドによる前記ＬＯＡＤ−ＣＷＰ命令が完了するまで前記命令コミットを抑止する。
【００２４】
好ましくは、前記命令解析ステップは、命令デコードの要求が発生したときに、前記命令デコード要求がある前記スレッドから前記命令抑止の通知があると、前記命令のデコードを抑止する。
【００２５】
本発明によれば、同時マルチスレッディング方式であり、各スレッドに設けられたレジスタウィンドウ方式を採用したマスタレジスタとワークレジスタとを接続するためのデータ転送バスを、スレッド間で共有することにより、回路面積を縮小するとともに、スレッド間でのレジスタへのアクセスの競合に伴う他スレッドへの命令実行の干渉を防止することができる。
【図面の簡単な説明】
【００２６】
【図１】本発明の情報装置の構成を示すブロック図である。
【図２】命令パイプラインを示すブロック図である。
【図３】ＭＲＦとＷＲＦの関係を示す概念図である。
【図４】データ転送制御部と汎用レジスタの構成を示すブロック図である。
【図５】フラグ生成部、データ転送制御カウンタ、命令発行抑止制御部の回路構成を示した図である。
【図６】トラップ検出部のトラップによるデータ転送要求信号を生成する回路を示す図である。
【図７】命令解析部の回路を示した図である。
【図８】命令完了制御部の回路を示した図である。
【図９】ＬＯＡＤ−ＣＷＰ処理の実行時の動作を示すタイムチャートである。
【図１０】ＬＯＡＤ−ＣＷＰ処理の実行時の動作を示すフロー図である。
【発明を実施するための最良の形態】
【００２７】
以下の実施例にて説明する情報処理装置は、同時マルチスレッディング（ＳＭＴ：Simultaneous Multi-Threading）を実行するレジスタウィンドウ方式の情報処理装置を例示する。【００２８】
本実施例による情報処理装置は、演算した演算結果や演算に必要なデータを保持するためのレジスタウィンドウ方式のマスタレジスタとワークレジスタにより構成されるレジスタセット（汎用レジスタなど）を、複数のスレッドごとに備えている。【００２９】
レジスタセットは、アーキテクチャで規定された量のレジスタを各スレッドにより参照可能でなければならない。さらに、他のスレッドの命令によって、各スレッドに割り付けられたマスタレジスタの値が更新されることは許されない。そのため、マスタレジスタをスレッドごとに用意する。【００３０】
また、ワークレジスタをひとつにすると、レジスタを参照するスレッドが変わるたびにワークレジスタの切り替えが必要となり、マスタレジスタからワークレジスタへのデータ転送には、ある一定の時間がかかってしまう。そのため、レジスタ参照にかかるワークレジスタの切り替え時間のロスが大きくなってしまう。そこで、マスタレジスタと共にワークレジスタの多重化を行い、その間のワークレジスタの切り替えに必要なデータ転送バスを、スレッド間で共有化する。また、命令実行資源である演算部からワークレジスタに演算結果を反映するために必要なデータ転送も、前述のデータ転送バスを共有して実行する。【００３１】
このように構成することにより、回路面積を縮小することができる。
また、マスタレジスタからワークレジスタの転送バスを共有化することで、マスタレジスタからワークレジスタへのデータ転送は複数で同時に実施できなくなる。そこで、マスタレジスタからワークレジスタへのデータ転送要求がスレッド間で重ならないよう、制御する。【００３２】
また、演算部からワークレジスタのデータ転送バスも共有にすることによる、マスタレジスタからワークレジスタへのデータ転送と演算結果の書き込みも重ならないように制御する。【００３３】
すなわち、マスタレジスタからワークレジスタへのデータ転送が必要な動作は次の場合である。ＳＡＶＥ命令、ＲＥＳＴＯＲＥ命令、ＷＲＣＷＰ命令などのＣＷＰ切り替え命令実行時、トラップ発生時、トラップ処理終了を示すＤＯＮＥ／ＲＥＴＲＹ命令実行時である。スレッド間でこれらのケースが重ならないように制御し、データ転送処理中はこれらのケースを抑止するように制御する。また、データ転送処理中はワークレジスタへの演算結果などの書き込みも抑止するように制御する。
（実施例１）
（構成）
図１は、本実施形態におけるプロセッサなどの情報処理装置１の構成を示すブロック図である。図１に示す実施例１の情報処理装置１は、メモリ２、メモリ制御部３、命令発行制御部４、命令解析部５、演算部６、汎用レジスタ７、命令完了制御部８、トラップ検出部９、データ転送制御部１０により構成されている。【００３４】
メモリ２は、情報処理装置１内のキャッシュなどとして機能するものであり、メモリ制御部３はメモリ２、演算部６の制御をする。また、メモリ制御部３は命令解析部５にメモリ２から読み出したコード（命令）を出力する。【００３５】
命令解析部５では、メモリ制御部３から供給されたコードをデコードし、命令発行制御部４では、デコードされたコードに対応する処理を行うための資源に対する命令の発行を制御する。【００３６】
演算部６は、メモリ制御部３および命令発行制御部４から供給されたオペランドに基づいて演算等を行う。
汎用レジスタ７は、マスタレジスタ１１とワークレジスタ１２をスレッドごとに設け、データ転送制御部１０と命令完了制御部８などにより制御される。【００３７】
命令完了制御部８は、演算部６、命令発行制御部４、汎用レジスタ７およびデータ転送制御部１０と接続され、命令発行制御部４から発行されたコードに対して行われる命令実行結果を演算部６から取得し、その実行結果に基づいて汎用レジスタ７の更新、命令解析部５や命令発行制御部４における抑止条件の解除、およびデータ転送制御部１０を制御するためのＬＯＡＤ−ＣＷＰ要求を出力する。【００３８】
トラップ検出部９は、トラップを検出し、ＬＯＡＤ−ＣＷＰ要求（トラップ検出部９のトラップ情報）をデータ転送制御部１０に出力する。
データ転送制御部１０は、トラップ検出部９、命令完了制御部８、命令発行制御部４および汎用レジスタ７と接続され、汎用レジスタ７へのデータ転送を制御し、転送されるデータの種類や転送のタイミング等を制御する。【００３９】
（スレッドの命令パイプライン）
次に、情報処理装置１における各スレッドの動作を図２に示す。スレッドの命令パイプラインは、Ｆｅｔｃｈステージ、Ｄｅｃｏｄｅステージ、Ｄｉｓｐａｔｃｈステージ、Ｅｘｅｃｕｔｅステージ、Ｕｐｄａｔｅ−Ｂｕｆｆｅｒステージ、Ｃｏｍｍｉｔステージに分かれる。【００４０】
Ｆｅｔｃｈステージは、メモリ制御部３の制御に基づいてメモリ２から命令を読み出すステージである。
Ｄｅｃｏｄｅステージは、命令解析部５にてメモリ２から読み出された命令をデコードするステージである。【００４１】
Ｄｉｓｐａｔｃｈステージは、命令発行制御部４の制御に基づいて、演算部６などの命令実行資源に命令を発行するステージである。
Ｅｘｅｃｕｔｅステージは、Ｄｉｓｐａｔｃｈステージにて発行された命令に応じて、演算器６などの命令実行資源において命令を実行するステージである。【００４２】
Ｕｐｄａｔｅ−Ｂｕｆｆｅｒステージは、Ｅｘｅｃｕｔｅステージにおける命令の実行結果を待ち合わせるステージである。
Ｃｏｍｍｉｔステージは、命令完了制御部８の制御に基づいて、Ｅｘｅｃｕｔｅステージにおける命令の実行結果に応じて、命令の順序どおりにメモリ２や汎用レジスタ７の内容の更新を行うステージである。【００４３】
これらのステージのうち、Ｆｅｔｃｈステージ、Ｄｅｃｏｄｅステージ、Ｃｏｍｍｉｔステージは命令順序通りのインオーダで動作する。これに対し、Ｄｉｓｐａｔｃｈステージ、Ｅｘｅｃｕｔｅステージ、Ｕｐｄａｔｅ−Ｂｕｆｆｅｒステージは命令順序によらず、実行準備ができたものから処理するアウトオブオーダで動作する。【００４４】
（レジスタセット）
次に、汎用レジスタ７を構成するマスタレジスタ１１とワークレジスタ１２について、図３を用いて説明をする。図３はマスタレジスタ１１とワークレジスタ１２の関係を示した図である。【００４５】
マスタレジスタ１１（以後、ＭＲＦ：Master Register File と呼ぶ）は、図３に示すようにウィンドウをリング状に連結した形で構成されている。また、ＭＲＦ１１はＣＷＰ（Current-Window-Pointer）によって管理が行われる。【００４６】
ワークレジスタ１２（以後、ＷＲＦ：Working Register Fileと呼ぶ）は、ＭＲＦ１１のうち、ＣＷＰで示されるウィンドウとそれの両側に隣接したウィンドウとの３ウィンドウで構成される。【００４７】
また、ＣＷＰに関連なく使用できるｇｌｏｂａｌレジスタ（ｇｌｏｂａｌ  ｆｏｒ  ｎｏｒｍａｌ、ｇｌｏｂａｌ  ｆｏｒ  ｔｒａｐ）と、ウィンドウごとにウィンドウ固有のｌｏｃａｌレジスタ、ウィンドウ間のオーバーラップを許すｉｎレジスタ、ｏｕｔレジスタを備えている。【００４８】
ＭＲＦ１１とＷＲＦ１２はスレッドごとに設けられ、これらＭＲＦ１１とＷＲＦ１２は図１の汎用レジスタ７内に示すようなデータ転送バス１３と、図示しない制御バスとによって接続されている。また、データ転送バス１３は、セレクタ１４、１５によってバス経路を切り替えることにより制御される。セレクタの切り替え制御は、例えばデータ転送制御部１０などから制御してもよいし、図示しない回路を設けて切り替え制御をしてもよい。【００４９】
ＭＲＦ１１は、８ウィンドウ分のｌｏｃａｌレジスタ（ｌｏｃａｌ０〜ｌｏｃａｌ７）、ｉｎレジスタ（ｉｎ０〜ｉｎ７）、ｏｕｔレジスタ（ｏｕｔ０〜ｏｕｔ７）と、８ワードの通常動作時に用いるｇｌｏｂａｌレジスタ（ｇｌｏｂａｌ  ｆｏｒ  ｎｏｒｍａｌ）と８ワードのトラップ処理用ｇｌｏｂａｌレジスタ（ｇｌｏｂａｌ  ｆｏｒ  ｔｒａｐ）により構成されている。【００５０】
ＭＲＦ１１の１ウィンドウは、８ワードのｌｏｃａｌレジスタ、８ワードのｉｎレジスタ、８ワードのｏｕｔレジスタで構成するものとする。また、あるＣＷＰ＝ｘに関して、ｉｎ（ｘ）は隣接するウィンドウのｏｕｔ（ｘ＋１）とオーバーラップするように構成する。一例として、ｉｎ（７）に関してはラップアラウンドしてｏｕｔ（６）とオーバーラップするものとする。【００５１】
１スレッド当たりのＷＲＦ１２は、ＣＷＰを基点にした３ウィンドウで構成され、ＣＷＰ＝ｘに関して、ｌｏｃａｌ（ｘ−１）、ｌｏｃａｌ（ｘ）、ｌｏｃａｌ（ｘ＋１）が各８ワード、ｉｎ（ｘ−１）、ｉｎ（ｘ）、ｉｎ（ｘ＋１）が各８ワード、ｏｕｔ（ｘ−１）が８ワード、ｇｌｏｂａｌが８ワードの計６４ワードにより構成されている。【００５２】
ＭＲＦ１１からＷＲＦ１２へのデータ転送には、ｉｎ／ｏｕｔ用の８ワード、ｌｏｃａｌ／ｇｌｏｂａｌ用の８ワードの計１６ワード幅のバスを用意し、これをスレッド間で共有するものとし、必要に応じてデータ転送バス１３を占有するスレッドを切り替えてデータ転送を実行する。【００５３】
（ウィンドウ切り替え動作）
ウィンドウの切り替えは、ＣＷＰのインクリメント、デクリメントと、不連続な任意の値への書き換えなどの命令を実行したことでＣＷＰの値が変化したときに実施される。以下、ＣＷＰのインクリメントを行う命令をＳＡＶＥ命令、ＣＷＰのデクリメントを行う命令をＲＥＳＴＯＲＥ命令、ＣＷＰを不連続な任意の値へ変更する命令をＷＲＣＷＰ命令と呼ぶこととする。【００５４】
演算部６では、ＷＲＦ１２に保持されたデータを読出（read）ができるように接続され、これら保持されたデータにかかる命令、ＣＷＰをインクリメントするＳＡＶＥ命令、およびＣＷＰをデクリメントするＲＥＳＴＯＲＥ命令を実行するものである。【００５５】
ここでは、これらの命令はアウトオブオーダ実行方式により実行される。
また、演算部６は、ＭＲＦ１１およびＷＲＦ１２に対して情報の書込み（write）ができるように接続され、これらＭＲＦ１１およびＷＲＦ１２に対して同時に書込み処理を実行する。【００５６】
以下に、ＳＡＶＥ命令、ＲＥＳＴＯＲＥ命令、ＷＲＣＷＰ命令について説明する。
ＳＡＶＥ／ＲＥＳＴＯＲＥ命令実行時は、移動後のＣＷＰを基点とした３ウィンドウにより構成される。すなわち、移動前のＣＷＰが示すレジスタがｘとすると、ＳＡＶＥ時にはｘ、ｘ＋１、ｘ＋２の３ウィンドウ、ＲＥＳＴＯＲＥ時にはｘ−２、ｘ−１、ｘの３ウィンドウの構成となる。３つのウィンドウのうち２つはＷＲＦ１２に既に保持されているため、ＭＲＦ１１からＷＲＦ１２へは不足分１ウィンドウのｌｏｃａｌレジスタ、ｉｎ／ｏｕｔレジスタのデータを転送するのみでよい。このとき、移動後のＣＷＰに対するデータはＳＡＶＥ時とＲＥＳＴＯＲＥ時それぞれに対して、既にＷＲＦ１２にｘ＋１、ｘ−１のウィンドウが保持されているため、ＭＲＦ１１からのデータ転送を待つことなくタイムロスなしにデータリードが実行可能である。【００５７】
ＷＲＣＷＰ命令実行時には、移動後のＣＷＰが示すレジスタがｙである場合、ｙ−１、ｙ、ｙ＋１の３ウィンドウの構成となる。ＷＲＣＷＰの場合はＷＲＦ１２に移動後のデータが保持されているか保証されないため、ＷＲＦ１２へはウィンドウのｙを基点にした３ウィンドウを構成するために必要となるｌｏｃａｌレジスタ、ｉｎ／ｏｕｔレジスタをＭＲＦ１１より転送する。この間、ウィンドウのｙに対するデータリードは、データが参照できないため実行不可能であり、転送が完全に終了してから更新されたＷＲＦ１２に対して以後の命令実行が再開される。【００５８】
また、プロセス実行中にトラップが発生した場合には、通常動作時には依存しない値や動作が必要となるため、あるいはプロセス再開時のためにトラップ発生時点のレジスタの値を保持しておく必要があり、ｇｌｏｂａｌレジスタをトラップ処理専用のものと切り替えてトラップ処理が実行される。通常動作に依存する部分はｉｎ／ｏｕｔレジスタ、ｌｏｃａｌレジスタを参照する。【００５９】
トラップ処理時には特定の命令を実行し、再びｇｌｏｂａｌレジスタをトラップ処理用から通常動作用に切り替えなおしてプロセスを再開する。通常動作に必要な部分は、ｉｎ／ｏｕｔレジスタ、ｌｏｃａｌレジスタを通して反映される（トラップ処理終了時に実行する命令をＤＯＮＥ／ＲＥＴＲＹ命令という）。【００６０】
例えば、スレッド数を２として、同一サイクルでの命令発行、レジスタ参照、レジスタ書き込み、命令の完了に関しては1スレッドに限定し、必要に応じて各サイクルで  まず、ＳＡＶＥ／ＲＥＳＴＯＲＥ命令によりＣＷＰを変更した場合を考える。ＭＲＦ１１からＷＲＦ１２へのデータ転送は、ＳＡＶＥ／ＲＥＳＴＯＲＥ命令によってＣＷＰの変更が完了した後に実行される（コミットステージ）。このとき、ＷＲＦ１２へ転送が必要なデータはｌｏｃａｌ８ワード、ｉｎ／ｏｕｔ８ワードの計１６ワードで、１６ワード幅のデータ転送バス１３を介して、１サイクルでデータ転送が実行される。同一スレッドのＳＡＶＥ／ＲＥＳＴＯＲＥ命令の後続命令は、データ書き換え後のデータを参照する必要があるが、ＷＲＦ１２はＣＷＰが示すウィンドウと隣接したウィンドウも保持しているため、データ転送の完了を待たずに正しいデータが参照可能である。また、同一スレッドの後続に、ＣＷＰの変更を要する命令（ＳＡＶＥ／ＲＥＳＴＯＲＥ命令、ＷＲＣＷＰ命令）を含むＷＲＦ１２の更新命令が存在した場合も、データ転送が１サイクルで完了するため、命令が完了してＷＲＦ１２の更新要求を出すまでにＷＲＦ１２の更新は完了しており、転送バスの競合を防ぐことが可能である。さらに、異なるスレッドから次サイクル以降でＷＲＦ１２の更新要求が発生した場合でも、データ転送が１サイクルで完了するため、データ転送バスの競合は発生しない。【００６１】
次に、ＷＲＣＷＰ命令にてＣＷＰを変更した場合を考える。ＭＲＦ１１からＷＲＦ１２へのデータ転送は、ＷＲＣＷＰ命令にてＣＷＰ変更が完了した後に実行される。このとき、ＷＲＦ１２は全てのデータを変更後のＣＷＰを基点としてウィンドウのデータに書き換える必要があるため、転送が必要なデータ量は６４ワードであり、１６ワード幅のバスを通して４サイクルかけてデータ転送が実行される。このＷＲＦ１２全データ書き換え処理をＬＯＡＤ−ＣＷＰ処理と呼ぶこととする。【００６２】
また、ＷＲＣＷＰ命令も、同一スレッドの後続命令はＳＡＶＥ／ＲＥＳＴＯＲＥ命令の時と同様に、データ書き換え後のデータを参照する必要があるため、データ転送が完了するまでは正しいデータが参照不可能である。このときもＰＯＳＴ−ＳＹＮＣ制御することで、命令完了までは後続命令のデータ参照を防ぐことが可能である。また、同一スレッドの後続にＣＷＰの変更を要する命令を含むＷＲＦ１２の更新命令が存在した場合も、後続命令の発行から完了まで５ステージを経なければならないため、競合を防ぐことが可能である。【００６３】
しかし、ＬＯＡＤ−ＣＷＰ処理は完了までに４サイクルかかるため、命令完了後に後続の命令発行を再開すると、ＬＯＡＤ−ＣＷＰ処理の実行中である危険性があり、データ参照は保証できない。そのため、命令完了後にもデータ転送処理が完了するまで、後続の命令発行を抑止する制御が必要となる。【００６４】
トラップが発生した場合には、実行中の命令の動作を全てキャンセルした後、ＭＲＦ１１からＷＲＦ１２へのデータ転送が実行される。このとき、ＷＲＦ１２への転送が必要なデータはｇｌｏｂａｌ８ワードである。しかし、トラップが発生した場合には、通常動作の命令列を一旦全てキャンセルした後、改めてトラップ処理用の命令列をメモリ２からフェッチしてくる必要がある。通常動作の命令列をキャンセルして、新たに命令列をメモリ２からフェッチしてから更新後のレジスタを参照するまで、Ｆｅｔｃｈ、Ｄｅｃｏｄｅ、Ｄｉｓｐａｔｃｈの３ステージを経なければならず、ある程度のサイクル数が必要となる。そのため、ＷＲＦ１２の更新を急ぐ必要はないので、新規に論理を作成せず、ＬＯＡＤ−ＣＷＰ処理を流用してｇｌｏｂａｌ８ワードをＭＲＦ１１からＷＲＦ１２へ転送することで、論理の簡略化をし、資源の削減を行うことが可能である。【００６５】
また、トラップ発生時は実行中の命令の動作を全てキャンセルするため、トラップ発生によるＬＯＡＤ−ＣＷＰ処理中もしくはＬＯＡＤ−ＣＷＰ処理開始時に、同一スレッドの命令によるＭＲＦ１１からＷＲＦ１２への転送要求との競合はない。しかし、トラップは不定期に発生するので、他のＬＯＡＤ−ＣＷＰ処理中に発生する危険性が存在する。そこで、トラップによる同一スレッドでのＬＯＡＤ−ＣＷＰ処理の競合を防止する制御が必要となる。【００６６】
トラップ処理終了時のＤＯＮＥ／ＲＥＴＲＹ命令の場合も、命令完了後に通常処理用の命令列を改めてメモリ２からフェッチしてくる必要があるため、ＷＲＦ１２の更新を急ぐ必要がない。そこでこの場合もＬＯＡＤ−ＣＷＰ処理によってＷＲＦ１２の更新を実施する。【００６７】
また、ＭＲＦ１１からＷＲＦ１２へのデータ転送バス１３は、スレッド間で共有しているため、ＬＯＡＤ−ＣＷＰ処理中は片側のスレッドで転送バスを占有することとなる。そのため、あるスレッドでＬＯＡＤ−ＣＷＰ処理を実施している間は、それ以外のスレッドでＭＲＦ１１からＷＲＦ１２へのデータ転送を実施できないという制約がでてくる。そこで、ＬＯＡＤ−ＣＷＰ処理中はそれ以外のスレッドのＷＲＦ１１更新処理を保留させる制御が必要となる。【００６８】
（データ転送制御部とレジスタセット）
図４は、本実施例におけるデータ転送制御部１０を示す図である。データ転送制御部１０は、汎用レジスタ７のＭＲＦ１１からＷＲＦ１２へのデータ転送を制御し、転送されるデータの種類や転送のタイミング等を制御する。【００６９】
データ転送制御部１０は、フラグ生成部４１、データ転送制御カウンタ４２、命令発行抑止制御部４３、データ転送タイミング制御部４４、データ書き込み制御部４５から構成されている。【００７０】
また、データ転送制御部１０には、命令完了制御部８とトラップ検出部９が接続されている。
図４では、スレッドごとにＭＲＦ１１とＷＲＦ１２がｍ個（Ｔｈ０〜Ｔｈｍ）用意されており、各Ｔｈ０〜Ｔｈｍは、それぞれｌｏｃａｌ（８ワード×３）、ｉｎ／ｏｕｔ（８ワード×４）およびｇｌｏｂａｌ（８ワード）の計６４ワードから構成されている。【００７１】
また、ＭＲＦ１１からＷＲＦ１２へのデータ転送には、ｉｎ／ｏｕｔ４ワード、ｌｏｃａｌ／ｇｌｏｂａｌ４ワードの計８ワード幅のデータ転送バス１３を用意する。したがって、１サイクル毎に８ワードずつデータの転送をすることができる。【００７２】
フラグ生成部４１では、命令完了制御部８からのＳＡＶＥ命令、ＲＥＳＴＯＲＥ命令、ＷＲＣＷＰ命令、トラップ検出部９からのトラップ検出などに基づいてＬＯＡＤ−ＣＷＰ要求を受信し、フラグを生成する。【００７３】
次に、フラグ生成部４１によりフラグ（LOAD_CWP_GO_TH_m）が生成されると、命令発行抑止制御部４３により命令発行抑止制御がされ、ＭＲＦ１１からＷＲＦ１２へのデータ転送中は後続の命令の実行が抑止される。また、フラグ生成部４１によりフラグが生成されると、そのフラグを受け取ったデータ転送制御カウンタ４２では、カウント値を「０」にセットし、フラグに応じたデータ転送にかかるサイクル分カウントを開始する。【００７４】
データ転送タイミング制御部４４は、どのタイミングでスレッドごとに設けられたＭＲＦ１１からＷＲＦ１２へデータを転送するかを、フラグとデータ転送制御カウンタ４２によるカウント値に基づいて制御する（転送データセレクト）。具体的には、ＣＷＰ＝ｘに対してｉｎｘ（＝ｏｕｔｘ−１）レジスタへデータを転送するための信号、ｉｎｘ＋１（＝ｏｕｔｘ）レジスタへデータを転送するための信号、ｉｎｘ−１（＝ｏｕｔｘ−２）レジスタへデータを転送するための信号、ｉｎｘ＋２（＝ｏｕｔｘ＋１）レジスタへデータを転送するための信号、ｌｏｃａｌｘレジスタへデータを転送するための信号、ｌｏｃａｌｘ−1レジスタへデータを転送するための信号、ｌｏｃａｌｘ＋1レジスタへデータを転送するための信号、ｇｌｏｂａｌレジスタへデータを転送するための信号の出力を制御する。【００７５】
データ書き込み制御部４５では、ＷＲＦ１２へのデータ書き込みを制御する。データ書き込み制御部４５は、データ転送制御カウンタ４２によるカウント値（LOAD_CWP_COUNTER）に基づいて、ＭＲＦ１１から転送されたデータについてＷＲＦ１２への書き込み制御をするＷＥ（Write Enable）を出力する。図４に示すＷＲＦ１２のｉｎ／ｏｕｔレジスタへの書き込みを制御する信号（MOVE_I_O_WRITE_ENABLE）とｌｏｃａｌ／ｇｌｏｂａｌレジスタへの書き込みを制御する信号（MOVE_G_L_WRITE_ENABLE）である。【００７６】
（ＬＯＡＤ−ＣＷＰ処理のスレッド間競合の防止）
図５にフラグ生成部４１、データ転送制御カウンタ４２、命令発行抑止制御部４３の構成を示す。フラグ生成部４１、データ転送制御カウンタ４２、命令発行抑止制御部４３は、ＬＯＡＤ−ＣＷＰの競合を防止するためのLOAD_CWP_INTLK_ALLおよびLOAD_CWP_INTLK_OWN_TH_0、LOAD_CWP_INTLK_OWN_TH_1信号を生成する。図５に示す回路は２スレッドの２ＳＭＴの場合（スレッドＴｈ０、スレッドＴｈ１）の回路である。【００７７】
フラグ生成部４１は、ＯＲ回路５１６、５１７（２入力論理和回路）、ラッチ回路５１〜５５、ＡＮＤ回路５６（２入力論理積回路）、ＡＮＤ回路５７（３入力論理積回路）、ＯＲ回路５８（２入力論理和回路）、コンパレータ５９、ＡＮＤ回路５１０（２入力論理積回路）から構成される。【００７８】
ＯＲ回路５１６には、図４に示す命令完了制御部８からLOAD_CWP_REQ_BY_INST_TH_0が、トラップ検出部９からLOAD_CWP_REQ_BY_TRAP_TH_0が入力され、これらの入力に応じてLOAD_CWP_REQ_TH_0(スレッドＴｈ０用)を生成する。またＯＲ回路５１７にはLOAD_CWP_REQ_BY_INST_TH_1、LOAD_CWP_REQ_BY_TRAP_TH_1が入力され、LOAD_CWP_REQ_TH_1(スレッドＴｈ１用)を生成する。【００７９】
ラッチ回路５１のＳＥＴ端子にはＯＲ回路５１６の出力端子が接続され、LOAD_CWP_REQ_TH_0(スレッドＴｈ０用)が入力される。また、ラッチ回路５１のＲＳＴ端子（リセット端子）には、ＡＮＤ回路５６の出力端子が接続される。また、ラッチ回路５１の出力端子は、ＡＮＤ回路５６のａ入力端子と、ＡＮＤ回路５７の入力端子のａ入力端子（反転入力）とに接続される。【００８０】
ラッチ回路５２のＳＥＴ端子にはＯＲ回路５１７の出力端子が接続され、LOAD_CWP_REQ_TH_1（スレッドＴｈ１用）が入力される。また、ラッチ回路５２のＲＳＴ端子（リセット端子）は、ＡＮＤ回路５７の出力端子と接続される。ラッチ回路５２の出力端子はＡＮＤ回路５７のｂ入力端子と接続されている。【００８１】
ＡＮＤ回路５６のｂ入力端子（反転入力）はラッチ回路５５の出力端子と接続され、ＡＮＤ回路５７のｃ入力端子（反転入力）と、ＡＮＤ回路５１０（２入力論理積回路）のｂ入力端子とも接続される。また、ラッチ回路５５の出力端子は、カウンタ回路５１１（データ転送制御カウンタ４２）の入力端子（＋１）に接続される。ＡＮＤ回路５６の出力端子は、ラッチ回路５３のＳＥＴ端子（セット端子）に接続されている。【００８２】
ＡＮＤ回路５７の出力端子は、ラッチ回路５４のＳＥＴ端子（セット端子）と接続される。
また、ＡＮＤ回路５６の出力端子とＯＲ回路５８（論理和回路）のａ入力端子とが接続され、ＡＮＤ回路５７の出力端子とＯＲ回路５８のｂ入力端子とが接続される。ＯＲ回路５８の出力端子は、ラッチ回路５５のＳＥＴ端子（セット端子）に接続される。【００８３】
カウンタ回路５１１の出力端子は、２ビット幅のバスがコンパレータ５９の入力端子に接続される。
コンパレータ５９の出力端子は、ＡＮＤ回路５１０のａ入力端子と接続される。また、ＡＮＤ回路５１０の出力端子は、ラッチ回路５５のＲＳＴ端子（リセット端子）と接続され、ラッチ回路５３のＲＳＴ端子とラッチ回路５４のＲＳＴ端子とも接続されている。【００８４】
ラッチ回路５３の出力端子からは、信号LOAD_CWP_GO_TH_0が命令発行抑止制御部４３とデータ転送タイミング制御部４４とに出力される。ラッチ回路５４の出力端子からは、信号LOAD_CWP_GO_TH_1が命令発行抑止制御部４３とデータ転送タイミング制御部４４とに出力される。【００８５】
命令発行抑止制御部４３は、ＡＮＤ回路５１２（２入力論理積回路）、ＡＮＤ回路５１３（２入力論理積回路）、ラッチ回路５１４、ラッチ回路５１５から構成される。
ＡＮＤ回路５１２のａ入力端子は、コンパレータ５９の出力端子とＡＮＤ回路５１３のａ入力端子とに接続されている。【００８６】
ラッチ回路５１４のＳＥＴ入力端子には、信号LOAD_CWP_REQ_TH_0（スレッドＴｈ０用）が入力する。ラッチ回路５１４の出力端子はＡＮＤ回路５１２のｂ入力端子に接続され、ＡＮＤ回路５１２の出力端子はラッチ回路５１４のＲＳＴ端子（リセット）に接続される。【００８７】
ラッチ回路５１５のＳＥＴ入力端子（セット端子）には、信号LOAD_CWP_REQ_TH_1（スレッドＴｈ１用）が入力する。ラッチ回路５１５の出力端子はＡＮＤ回路５１３のｂ入力端子に接続され、ＡＮＤ回路５１３の出力端子はラッチ回路５１５のＲＳＴ端子（リセット端子）に接続される。【００８８】
図５のように構成することにより信号LOAD_CWP_INTLK_ALLと、信号LOAD_CWP_INTLK_OWN_TH_0、LOAD_CWP_INTLK_OWN_TH_1信号は、ＬＯＡＤ−ＣＷＰ処理実行中に「ｈｉｇｈ」に固定される。また、これらの信号が「ｈｉｇｈ」に固定されている間、他のＬＯＡＤ−ＣＷＰ要求を抑止することで、ＬＯＡＤ−ＣＷＰ処理の競合防止をする。【００８９】
LOAD_CWP_INTLK_ALLは、スレッド間の競合を防止する信号であり、汎用レジスタ７へのＬＯＡＤ−ＣＷＰ処理開始指示と同時に「ｈｉｇｈ」にセットされ、４サイクル後に「ｌｏｗ」にリセットされる。【００９０】
LOAD_CWP_INTLK_OWN_TH_0とLOAD_CWP_INTLK_OWN_TH_1は、スレッド内の競合を防止する信号であり、ＬＯＡＤ−ＣＷＰ要求を受け取ると「ｈｉｇｈ」にセットされ、４サイクル後に「ｌｏｗ」にリセットされる。リセットタイミングは、ＬＯＡＤ−ＣＷＰ処理の実行サイクル数が必ず固定サイクル数４であることから決定されるものであり、転送バス幅や転送データ量の違いによりＬＯＡＤ−ＣＷＰ処理実行サイクル数が異なるモデルであっても、LOAD_CWP_INTLKのリセットタイミングを変更できる。【００９１】
ＬＯＡＤ−ＣＷＰ処理のスレッド間競合は、LOAD_CWP_INTLK_ALLを使用して、図５のような論理でＬＯＡＤ−ＣＷＰ処理の開始指示を汎用レジスタ７へ送出することで実現する。【００９２】
まず、スレッドＴｈ０側からＬＯＡＤ−ＣＷＰ処理要求がだされた場合の例について説明する。
ラッチ回路５１ではLOAD_CWP_REQ_TH_0（スレッドＴｈ０のＬＯＡＤ−ＣＷＰ処理要求）を受け取り、LOAD_CWP_REQ_HOLD_TH_0を「ｈｉｇｈ」にセットし、次サイクルでLOAD_CWP_INTLK_ALLのチェックを行う。【００９３】
つまり、ラッチ回路５５の出力（LOAD_CWP_INTLK_ALL）が「ｌｏｗ」であった場合には、ＡＮＤ回路５６により制御されたラッチ回路５３の出力（LOAD_CWP_GO_TH_0）が「ｈｉｇｈ」にセットされる。そして、次サイクルでラッチ回路５３の出力端子から、LOAD_CWP_GO_TH_0を汎用レジスタ７に送出してＬＯＡＤ−ＣＷＰ処理を開始するよう制御する。【００９４】
逆に、LOAD_CWP_INTLK_ALLが「ｈｉｇｈ」であった場合には、LOAD_CWP_GO_TH_0のセットを抑止するようＡＮＤ回路５６が制御することで、ＬＯＡＤ−ＣＷＰ処理のスレッド間競合を防止する。ＡＮＤ回路５６のｂ入力端子に「ｈｉｇｈ」が入力されるため、ＡＮＤ回路５６の出力から「ｌｏｗ」が出力され、ラッチ回路５３にセットされる。【００９５】
また、ラッチ回路５３の出力であるLOAD_CWP_GO_TH_0が抑止されている間（「ｌｏｗ」）、ＡＮＤ回路５６から「ｌｏｗ」が出力されているため、LOAD_CWP_REQ_HOLD_TH_0の値をラッチ回路５１に保持される。【００９６】
実行中のＬＯＡＤ−ＣＷＰ処理が完了したら、LOAD_CWP_INTLK_ALLが「ｌｏｗ」となり、次サイクルでLOAD_CWP_GO_TH_0を「ｈｉｇｈ」にセットし、競合することなく連続してスレッド０のＬＯＡＤ−ＣＷＰ処理を実行する。【００９７】
また、ＬＯＡＤ−ＣＷＰ処理要求により選択されるスレッドに順序性を確保するために、本例ではラッチ回路５３の出力LOAD_CWP_GO_TH_0を「ｈｉｇｈ」にセットして、ＡＮＤ回路５６の出力が「ｈｉｇｈ」になることによりラッチ回路５１の出力LOAD_CWP_REQ_HOLD_TH_0を「ｌｏｗ」にリセットする。このようにすることでスレッドＴｈ０側が優先される（図９参照）。【００９８】
続いて、スレッドＴｈ１側からＬＯＡＤ−ＣＷＰ処理要求がだされた場合の例について説明する。
ラッチ回路５２ではLOAD_CWP_REQ_TH_1（スレッドＴｈ１からのＬＯＡＤ−ＣＷＰ処理要求）を受け取り、LOAD_CWP_REQ_HOLD_TH_1を「ｈｉｇｈ」にセットし、次サイクルでLOAD_CWP_INTLK_ALLのチェックを行う。LOAD_CWP_INTLK_ALLが「ｌｏｗ」であった場合には、ラッチ回路５４にLOAD_CWP_GO_TH_1を「ｈｉｇｈ」にセットする。次サイクルでLOAD_CWP_GO_TH_1を汎用レジスタ７に送出して、ＬＯＡＤ−ＣＷＰ処理を開始するよう制御する。【００９９】
逆に、LOAD_CWP_INTLK_ALLが「ｈｉｇｈ」であった場合には、LOAD_CWP_GO_TH_1のセットを抑止するよう制御することで、ＬＯＡＤ−ＣＷＰ処理のスレッド間競合を防止する。
また、LOAD_CWP_GO_TH_1のセットが抑止されている間、LOAD_CWP_REQ_HOLD_TH_1の値をラッチ回路５２に保持しておく。実行中のＬＯＡＤ−ＣＷＰ処理が完了したらLOAD_CWP_INTLK_ALLが「ｌｏｗ」となるので、次サイクルでLOAD_CWP_GO_TH_1を「ｈｉｇｈ」にセットし、競合することなく連続してスレッドＴｈ１のＬＯＡＤ−ＣＷＰ処理を実行することが可能となる。【０１００】
LOAD_CWP_GO_TH_1を「ｈｉｇｈ」にセットすると同時に、ＡＮＤ回路５７によってLOAD_CWP_REQ_HOLD_TH_1を「ｌｏｗ」にリセットすることで、スレッド間のＬＯＡＤ−ＣＷＰ処理要求の順序性を確保する。【０１０１】
また、LOAD_CWP_REQ_TH_0とLOAD_CWP_REQ_TH_1を２つ同時に受け取る場合も存在する。これは、LOAD_CWP_REQ_HOLD_TH_0とLOAD_CWP_REQ_HOLD_TH_1とが共に「ｈｉｇｈ」となる場合である。この場合は順序性が存在しないため、スレッドＴｈ０側を優先してLOAD_CWP_GO_TH_0を「ｈｉｇｈ」にセットすることでスレッド間競合の防止を実現する。上記のように、論理を簡略化することで実装面積の縮小が可能である。【０１０２】
本実施例ではスレッド数が２つの場合について提案したが、スレッド数が増加した場合（Ｔｈ０〜Ｔｈｍ）でもLOAD_CWP_REQ_HOLD_TH_0〜LOAD_CWP_REQ_HOLD_TH_mの順序性を確保する構成にすることで、ＬＯＡＤ−ＣＷＰ処理のスレッド間競合を防止することが可能である。【０１０３】
（同一スレッド内でＬＯＡＤ−ＣＷＰ処理の競合の防止）
次に、同一スレッド内でＬＯＡＤ−ＣＷＰ処理の要求が競合する可能性があるのは、前述のとおり、ＬＯＡＤ−ＣＷＰ処理中にトラップによるＬＯＡＤ−ＣＷＰ処理が発生する場合である。トラップによるスレッド内のＬＯＡＤ−ＣＷＰ処理の競合の防止は、LOAD_CWP_INTLK_OWN_TH_0、LOAD_CWP_INTLK_OWN_TH_1を使用して、図６に示すトラップ検出部９の有するデータ転送要求信号生成部６１により、ＬＯＡＤ−ＣＷＰ処理の要求を命令完了制御部８へ送出することで実現する。【０１０４】
まず、スレッドＴｈ０側でトラップが発生した場合について説明する。
図６に示すスレッドＴｈ０側のデータ転送要求信号生成部６１は、ラッチ回路６２、ＡＮＤ回路６３（２入力論理積回路）、フリップフロップ回路６４から構成されている。【０１０５】
トラップ検出部９がトラップを検出するとTRAP_DETECT_TH_0を生成し、データ転送要求信号生成部６１に入力する。
ラッチ回路６２のＳＥＴ端子には、TRAP_DETECT_TH_0信号が入力されるように構成されている。ラッチ回路６２の出力端子は、ＡＮＤ回路６３のａ入力端子に接続されている。また、ＡＮＤ回路６３のｂ入力端子（反転入力）には、命令発行抑止制御部４３の出力信号LOAD_CWP_INTLK_OWN_TH_0が入力される。ＡＮＤ回路６３の出力端子は、フリップフロップ回路６４の入力端子（Ｄ）と接続される。フリップフロップ回路６４の出力端子は、ラッチ回路６２のＲＳＴ端子（リセット）と接続される。【０１０６】
ラッチ回路６２ではTRAP_DETECT_TH_0（スレッド０からのトラップ検出）を受け取り、CANCEL_OPERATION_TH_0をセットする。ＡＮＤ回路６３ではCANCEL_OPERATION_TH_0が「ｈｉｇｈ」となったサイクルでスレッドＴｈ０側により実行中の命令を全てキャンセルし、LOAD_CWP_INTLK_OWN_TH_0のチェックを行う。【０１０７】
フリップフロップ回路６４では、LOAD_CWP_INTLK_OWN_TH_0が「ｌｏｗ」であった場合には、LOAD_CWP_REQ_BY_TRAP_TH_0を「ｈｉｇｈ」にセットし、データ転送制御部１０へ送出する。フリップフロップ回路６４は同時にRE_I_FETCH_REQ_TH_0を出力し、改めてメモリ２から命令列のフェッチを開始する。逆に、LOAD_CWP_INTLK_OWN_TH_0が「ｈｉｇｈ」であった場合には、LOAD_CWP_REQ_BY_TRAP_TH_0のセットを抑止するよう制御することで、同一スレッドで既に実行中のＬＯＡＤ−ＣＷＰ処理との競合の防止を実現する。【０１０８】
LOAD_CWP_REQ_BY_TRAP_TH_0の抑止にLOAD_CWP_INTLK_ALLよりセットタイミングの早いLOAD_CWP_INTLK_OWN_TH_0を用いることで、LOAD_CWP_REQ_HOLD_TH_0のセット間隔を空けて、１スレッドのみでＬＯＡＤ−ＣＷＰ処理の実行を占有しないよう制御をしている。本実施例ではスレッド数が２つの場合について提案したが、スレッド数が増加した場合でも、LOAD_CWP_REQ_HOLD_TM_mの順序性を確保可能な構成にすることで、あるスレッドのＬＯＡＤ−ＣＷＰ処理がいつまでも実行不可能となるのを防止することが可能である。【０１０９】
また、スレッドＴｈ１側におけるトラップによるスレッド内のＬＯＡＤ−ＣＷＰ処理の競合の防止は、上記スレッドＴｈ０と同様の回路構成を用い、入力信号としてスレッドＴｈ１側のLOAD_CWP_INTLK_OWN_TH_1とTRAP_DETECT_TH_1に基づいて制御することにより、ＬＯＡＤ−ＣＷＰ処理の要求LOAD_CWP_REQ_BY_TRAP_TH_1をデータ転送制御部１０へ送出することで実現する。【０１１０】
（ＬＯＡＤ−ＣＷＰ実行中の同一スレッドの後続命令のＷＲＦ参照防止）
次に、ＬＯＡＤ−ＣＷＰ実行中の同一スレッドの後続命令のＷＲＦ参照防止は、LOAD_CWP_INTLK_OWN_TH_0、LOAD_CWP_INTLK_OWN_TH_1を用いて、図７に示す命令解析部５によって、命令デコードを制御することで実現する。【０１１１】
図7に示すスレッドＴｈ０側の命令解析部５は、ラッチ回路７１、ＡＮＤ回路７２（３入力論理積回路）、フリップフロップ回路７３から構成される。
ラッチ回路７１のＳＥＴ入力端子は命令解析部５によってデコードした結果、命令がＷＲＣＷＰ命令など、後続命令のデコードを抑止する必要のある命令であると解析された場合に「ｈｉｇｈ」となる、命令解析部５の内部信号POST_SYNC_REQ_TH_0を入力する。また、ラッチ回路７１のＲＳＴ端子には、命令完了制御部８の出力であるCOMMIT_OPERATION_TH_0が入力される。ラッチ回路７１の出力端子はＡＮＤ回路７２のｃ入力端子（反転入力）に接続される。ａ入力端子には、命令解析部５の内部信号であるDECODE_OPERATION_REQ_TH_0信号を入力し、ｂ入力端子（反転入力）にはデータ転送制御部１０の出力であるLOAD_CWP_INTLK_OWN_TH_0信号を入力する。ＡＮＤ回路７２の出力端子は、フリップフロップ回路７３の入力端子（Ｄ）に接続される。フリップフロップ回路７３の出力端子は、命令発行制御部４に入力される。【０１１２】
スレッドＴｈ０側のＡＮＤ回路７２では、命令デコード要求（DECODE_OPERATION_REQ_TH_0）が発生したとき、LOAD_CWP_INTLK_OWN_TH_0が「ｌｏｗ」だった場合は、そのまま命令をデコードする。逆にLOAD_CWP_INTLK_OWN_TH_0が「ｈｉｇｈ」だった場合は、命令デコードを抑止することで、Ｄｉｓｐａｔｃｈステージへの移行を防ぎ、ＬＯＡＤ−ＣＷＰ処理を要する命令が完了してから、ＬＯＡＤ−ＣＷＰ処理が完了するまで同一スレッドの後続命令によるＷＲＦ１２の参照防止を実現する。【０１１３】
スレッドＴｈ１側についても同様に、スレッドＴｈ１のPOST_SYNC_REQ_TH_1、COMMIT_OPERATION_TH_1、DECODE_OPERATION_REQ_TH_1、LOAD_CWP_INTLK_OWN_TH_1を用いて制御を行うことにより、ＬＯＡＤ−ＣＷＰ処理実行中の同一スレッドの後続命令のＷＲＦ参照防止をすることができる。【０１１４】
（ＬＯＡＤ−ＣＷＰ処理と他のスレッドのＷＲＦの更新命令との競合防止）
次に、ＬＯＡＤ−ＣＷＰ処理と他のスレッドのＷＲＦ１２の更新命令との競合防止は、LOAD_CWP_INTLK_OWN_TH_0、LOAD_CWP_INTLK_OWN_TH_1を使用して、命令完了制御部８により命令コミットを制御することで実現する。【０１１５】
命令完了制御部８は、ＡＮＤ回路８１（２入力論理積回路）、フリップフロップ回路８２、ＡＮＤ回路８３（２入力論理積回路）、ＡＮＤ回路８４（２入力論理積回路）、ＯＲ回路８５（２入力論理和回路）から構成されている。【０１１６】
スレッドＴｈ０側のＡＮＤ回路８１のａ入力端子には、演算部６の出力であるコミット要求COMMIT_OPERATION_REQ_TH_0信号が入力される。また、ＡＮＤ回路８１のｂ入力端子（反転入力）には、データ転送制御部１０の出力であるLOAD_CWP_INTLK_OWN_TH_1信号が入力される。ＡＮＤ回路８１の出力端子はフリップフロップ回路８２の入力端子（Ｄ）に接続される。【０１１７】
フリップフロップ回路８２の出力端子は、ＡＮＤ回路８３のａ入力端子とＡＮＤ回路８４のa入力端子に接続される。
ＡＮＤ回路８３のｂ入力端子には、命令発行制御部４からＳＡＶＥ命令、ＲＥＳＴＯＲＥ命令、ＷＲＣＷＰ命令などが実行中の命令の中で最も古い命令、すなわち次にコミットするべき命令であることを示すLOAD_CWP_INST_EQ_OLDEST_TH_0が入力される。ＡＮＤ回路８３の出力LOAD_CWP_REQ_BY_INST_TH_0はデータ転送制御部１０に出力される。【０１１８】
ＡＮＤ回路８４のｂ入力端子には、命令発行制御部４からＧＰＲの更新を行う命令、例えばＡＤＤ命令（加算）、ＳＵＢ命令（減算）、ＬＯＡＤ命令（メモリからのデータ読み出し）が次にコミットするべき命令であることを示す信号（WRITE_GPR_INST_EQ_OLDEST_TH_0）が入力される。ＡＮＤ回路８４の出力（WRITE_GPR_ENABLE_BY_INST_TH_0）は、汎用レジスタ７のスレッドＴｈ０用のＷＲＦ１２に接続されるライトイネーブル用の信号である。【０１１９】
ＡＮＤ回路８４では、スレッドＴｈ０側で汎用レジスタ７の書き換えが必要な命令（WRITE_GPR_INST_EQ_OLDEST_TH_0）とコミット要求（COMMIT_OPERATION_REQ_TH_0）が発生したとき、LOAD_CWP_INTLK_OWN_TH_1が「ｌｏｗ」だった場合は、そのまま命令をコミットしてWRITE_GPR_ENABLE_BY_INST_TH_0が発行され汎用レジスタ７の書き換えを行う。【０１２０】
ＡＮＤ回路８３では、LOAD_CWP_INST_EQ_OLDEST_TH_0によって命令のコミット要求が発生した場合であり、LOAD_CWP_INTLK_OWN_TH_1が「ｌｏｗ」だった場合、そのまま命令をコミットしてLOAD_CWP_REQ_BY_INST_TH_0が発行される。その後、LOAD_CWP_REQ_BY_INST_TH_0とLOAD_CWP_REQ_BY_TRAP_TH_0とのＯＲ（論理和）であるLOAD_CWP_REQ_TH_が命令完了制御部８から出力され、ＬＯＡＤ＿ＣＷＰ処理が開始される。【０１２１】
逆に、ＡＮＤ回路８１でLOAD_CWP_INTLK_OWN_TH_1が「ｈｉｇｈ」だった場合は、命令コミットを抑止することで、ＬＯＡＤ−ＣＷＰ処理を要する命令が完了してから、ＬＯＡＤ−ＣＷＰ処理が完了するまで他のスレッドの命令によるＷＲＦ１２の書き換え防止を実現する。【０１２２】
スレッドＴｈ１側についても同様に、COMMIT_OPERATION_REQ_TH_1信号、LOAD_CWP_INTLK_OWN_TH_0を用いることで、ＬＯＡＤ−ＣＷＰ処理と他のスレッドのＷＲＦ１２の更新命令との競合を防止することができる。【０１２３】
ここで、LOAD_CWP_INTLK_OWN_TH_0が「ｈｉｇｈ」だった場合には、後続命令のデコードを抑止するためスレッドＴｈ０で汎用レジスタ７の書き換えが必要な命令がコミットすることはありえない。そこで、LOAD_CWP_INTLK_OWN_TH_0とLOAD_CWP_INTLK_OWN_TH_1のＯＲ（論理和）で両スレッドのコミットを抑止しても動作は変わらないことから、スレッド数が増加した場合でもコミットの抑止論理を全スレッドのLOAD_CWP_INTLK_OWN_TH_mのＯＲ（論理和）に簡略化して構成することができる。【０１２４】
（ＬＯＡＤ−ＣＷＰ処理時の動作タイミング）
図９にＬＯＡＤ−ＣＷＰ処理時の動作を示すタイムチャートを示す。
図９において、縦軸に（１）LOAD_CWP_REQ_TH_0、（２）LOAD_CWP_REQ_HOLD_TH_0、（３）LOAD_CWP_GO_TH_0、（４）LOAD_CWP_REQ_TH_1、（５）LOAD_CWP_REQ_HOLD_TH_1、（６）LOAD_CWP_GO_TH_1、（７）LOAD_CWP_INTLK_ALL、（８）LOAD_CWP_COUNTER、（９）データ転送バス（ＭＲＦ→ＷＲＦ）、（１０）ＷＲＦ（Ｔｈ０）、（１１）ＷＲＦ（Ｔｈ１）、（１２）LOAD_CWP_INTLK_OWN_TH_0、（１３）LOAD_CWP_INTLK_OWN_TH_1、（１４）LOAD_CWP_REQ_BY_TRAP_TH_0、（１５）DECODE_OPERATION_TH_0、（１６）COMMIT_OPERATION_TH_0、（１７）LOAD_CWP_REQ_BY_TRAP_TH_1、（１８）DECODE_OPERATION_TH_1の波形を示し、横軸に時間軸（サイクル数）を示す。【０１２５】
１サイクルでは（９）データ転送バス１３がどのスレッドにも占有されていない状態である。また（１０）ＷＲＦ（Ｔｈ０）と（１１）ＷＲＦ（Ｔｈ１）の現在保持されているデータが参照可能である。【０１２６】
２サイクルにおいては、命令完了制御部８で同時に（１）LOAD_CWP_REQ_TH_0と（４）LOAD_CWP_REQ_TH_1が発生し、その信号がデータ転送制御部１０に出力される。
３サイクルでは、データ転送制御部１０のフラグ生成部４１のラッチ回路５１に（１）LOAD_CWP_REQ_TH_0「ｈｉｇｈ」とラッチ回路５２に（４）LOAD_CWP_REQ_TH_1「ｈｉｇｈ」を取得してラッチされ、（２）LOAD_CWP_REQ_HOLD_TH_0と（５）LOAD_CWP_REQ_HOLD_TH_1が「ｈｉｇｈ」になる。このとき、（７）LOAD_CWP_INTLK_ALLが「ｌｏｗ」である。【０１２７】
（２）LOAD_CWP_REQ_HOLD_TH_0「ｈｉｇｈ」と（７）LOAD_CWP_INTLK_ALL「ｌｏｗ」がＡＮＤ回路５６に入力され、ＡＮＤ回路５６の出力端子から「ｈｉｇｈ」が出力され、ラッチ回路５３に「ｈｉｇｈ」がセットされる。【０１２８】
また、ＡＮＤ回路５７の入力端子には（２）LOAD_CWP_REQ_HOLD_TH_0「ｈｉｇｈ」、（５）LOAD_CWP_REQ_HOLD_TH_1「ｈｉｇｈ」、（７）LOAD_CWP_INTLK_ALL「ｌｏｗ」が入力され、ＡＮＤ回路５７の出力端子から「ｌｏｗ」が出力され、ラッチ回路５２のＲＳＴ端子に入力され、（５）LOAD_CWP_REQ_HOLD_TH_1「ｈｉｇｈ」が保持される。【０１２９】
ＯＲ回路５８はＡＮＤ回路５６の出力が「ｈｉｇｈ」であるのでラッチ回路５５のＳＥＴ端子に「ｈｉｇｈ」が出力される。
ラッチ回路５１４には（１）LOAD_CWP_REQ_TH_0「ｈｉｇｈ」が入力される。また、ラッチ回路５１５には（４）LOAD_CWP_REQ_TH_1「ｈｉｇｈ」が入力される。【０１３０】
４サイクルでは、（７）LOAD_CWP_INTLK_ALLが「ｈｉｇｈ」になり、（２）LOAD_CWP_REQ_HOLD_TH_0が「ｌｏｗ」になっているため、ＡＮＤ回路５６の出力が「ｌｏｗ」になる。このとき、カウンタ回路５１１は（８）LOAD_CWP_COUNTERが「０」にリセットされる。【０１３１】
５サイクル〜７サイクルでは、カウンタ回路５１１は（８）LOAD_CWP_COUNTERが「３」になるまでカウントがされ、カウント値が０〜２の間はコンパレータ５９の出力は「ｌｏｗ」を出力し、カウント値が３になるとコンパレータ５９の出力は「ｈｉｇｈ」になる。ラッチ回路５３とラッチ回路５５の出力は「ｈｉｇｈ」のまま保持されている。データ転送バス１３はスレッドＴｈ０のＭＲＦ１１からＷＲＦ１２に占有される。【０１３２】
また、カウント値が「３」になるとＡＮＤ回路５１０の出力は「ｈｉｇｈ」になり（７）LOAD_CWP_INTLK_ALLの出力が「ｌｏｗ」になる。
８サイクルでは、データ転送バス１３はスレッドＴｈ０から開放される。【０１３３】
９サイクルでは、（７）LOAD_CWP_INTLK_ALLの出力が「ｌｏｗ」なることで（５）LOAD_CWP_REQ_HOLD_TH_1が「ｌｏｗ」になる。このとき、カウンタ回路５１１は（８）LOAD_CWP_COUNTERが「０」にリセットされる。【０１３４】
また、図６により説明したようにスレッドＴｈ０でトラップによるデータ転送要求信号（１４）LOAD_CWP_REQ_BY_TRAP_TH_0がトラップ検出部９で生成されるのは、最短で９サイクルのタイミングとなる。【０１３５】
また、図７により説明したように同一スレッドの後続命令の（１５）DECODE_OPERATION_TH_0が命令解析部５により生成され、ＷＲＦの参照を行うのは、最短で９サイクルのタイミングとなる。【０１３６】
１０サイクル〜１２サイクルでは、カウンタ回路５１１は（８）LOAD_CWP_COUNTERが「３」になるまでカウントがされ、カウント値が０〜２の間はコンパレータ５９の出力は「ｌｏｗ」になり、カウント値が３になるとコンパレータ５９の出力は「ｈｉｇｈ」になる。ラッチ回路５４とラッチ回路５５の出力は「ｈｉｇｈ」のまま保持されている。データ転送バス１３はスレッドＴｈ１のＭＲＦ１１からＷＲＦ１２に占有される。【０１３７】
また、カウント値が「３」になるとＡＮＤ回路５１０の出力は「ｈｉｇｈ」になり（７）LOAD_CWP_INTLK_ALLの出力が「ｌｏｗ」になる。
１３サイクルでは、カウンタ回路５１１は（８）LOAD_CWP_COUNTERが「０」にリセットされる。データ転送バス１３はスレッドＴｈ１から開放される。【０１３８】
また、図８により説明したように（１６）COMMIT_OPERATION_TH_0が命令完了制御部８で生成され、ＬＯＡＤ−ＣＷＰ処理と他のスレッドのＷＲＦ更新の要求が出力されるのは、最短で１４サイクルのタイミングとなる。【０１３９】
また、図６により説明したようにスレッドＴｈ１でトラップによるデータ転送要求信号（１４）LOAD_CWP_REQ_BY_TRAP_TH_1がトラップ検出部９で生成されるのは、最短で１４サイクルのタイミングとなる。【０１４０】
また、図７で説明したように同一スレッドの後続命令の（１５）DECODE_OPERATION_TH_1が命令解析部５により生成され、ＷＲＦの参照を行うのは、最短で１４サイクルのタイミングである。【０１４１】
（ＬＯＡＤ−ＣＷＰ処理の動作フロー）
次に、図１０に示すＬＯＡＤ−ＣＷＰ処理の動作フローについて説明する。
ステップＳ１０１では命令をフェッチする（Ｆｅｔｃｈステージ）。つまり、メモリ２から命令を読み出す。【０１４２】
ステップＳ１０２ではＰＯＳＴ−ＳＹＮＣ制御の要求信号POST_SYNC_REQ_TH_mがあり、LOAD_CWP_INTLK_OWN_mが有効であるかを判定する。判定結果が有効であればステップＳ１０２でループする。そうでない場合はステップＳ１０３に移行する。例えば、スレッドＴｈ０において命令解析部５でPOST_SYNC_REQ_TH_0信号とLOAD_CWP_INTLK_OWN_0信号に基づいて判定をする。【０１４３】
ステップＳ１０３（命令解析ステップ）では命令を命令解析部５でデコードする（Ｄｅｃｏｄｅステージ）。このとき、ＷＲＣＷＰ命令であればステップＳ１０５に移行する。ＷＲＣＷＰ命令以外であればステップＳ１０４に移行する。【０１４４】
ステップＳ１０４では命令の発行と実行をする。つまり、Ｄｉｓｐａｔｃｈステージにより演算部６（命令実行資源）などに命令を発行する（命令発行ステップ）。また、Ｅｘｅｃｕｔｅステージでは演算部６にて命令を実行する。また、命令完了制御部８ではで実行結果を待ち合わせるなどをする（Ｕｐｄａｔｅ−Ｂｕｆｆｅｒステージ）。【０１４５】
ステップＳ１０５では同一スレッドの命令デコード抑止をする（ＰＯＳＴ−ＳＹＮＣ制御）。
ステップＳ１０６では他のスレッドでLOAD_CWP_INTLK_OWN_mが発生したかを判定し、発生していなければステップＳ１０７に移行する。発生していればループする。【０１４６】
ステップＳ１０７以降に命令完了制御ステップについて説明する。
ステップＳ１０７では実行結果に応じてメモリ２や汎用レジスタ７の更新を行う（Ｃｏｍｍｉｔステージ）。ＳＡＶＥ命令、ＲＥＳＴＯＲＥ命令、ＷＲＣＷＰ命令以外（通常の命令）であればステップＳ１０８に移行する。ＳＡＶＥ命令、ＲＥＳＴＯＲＥ命令であればステップＳ１０９に移行する。ＷＲＣＷＰ命令であればステップＳ１０１１に移行する。【０１４７】
ステップＳ１０８では資源の更新をする。
ステップＳ１０９ではＣＷＰの更新をし、ステップＳ１０１０では対応スレッドのＭＲＦ１１からＷＲＦ１２へデータを転送を行う。【０１４８】
ステップＳ１０１１ではＰＯＳＴ−ＳＹＮＣ制御の解除をして、ＣＷＰの更新を行う。
ステップＳ１０１２では同一スレッドの命令デコード抑止を行う。
ステップＳ１０１３ではLOAD_CWP_INTLK_ALLが有効であるかを判定する。判定結果が有効であれループする。有効でない場合はステップＳ１０１４に移行する。【０１４９】
ステップＳ１０１４ではＬＯＡＤ−ＣＷＰ処理を開始し、他のスレッドのＬＯＡＤ−ＣＷＰ処理を抑止する。
ステップＳ１０１５では対応するスレッドのＭＲＦ１１からＷＲＦ１２へデータを転送する。【０１５０】
ステップＳ１０１６では、上記データ転送制御カウンタ４２（５１１）のカウント値LOAD_CWP_COUNTERが「３」であるかを判定する。「３」であればステップＳ１０１７に移行する。【０１５１】
ステップＳ１０１７ではLOAD_CWP処理を終了する。つまり、LOAD_CWP_INTLK_ALL、LOAD_CWP_INTLK_OWN_TH_0とLOAD_CWP_INTLK_OWN_TH_1が解除される。
ステップＳ１０１８ではトラップが発生した場合、ステップＳ１０１９で実行中および同一スレッドの後続命令のキャンセルをし、ステップＳ１０２０ではLOAD_CWP_INTLK_OWN_TH_mがあるかを判定する。上記例では２ＳＭＴであるのでスレッドＴｈ０であるLOAD_CWP_INTLK_OWN_TH_0が発生しているかを判定する。発生していればステップＳ１０１２に移行する。発生していなければステップＳ１０１９に移行する。【０１５２】
以上、詳細にわたって述べた本発明の手法を用いることにより、レジスタウィンドウ方式を採用した汎用レジスタにおいてＳＭＴを実現するために、転送バスの共有をすることにより実装面積の軽減、および共有した資源での処理の競合回避をハードウェアで実現した。【０１５３】
また、本発明は、上記実施の形態に限定されるものでなく、本発明の要旨を逸脱しない範囲内で種々の改良、変更が可能である。
【図１】
2008155801.tif 000003
【図２】
2008155801.tif 000004
【図３】
2008155801.tif 000005
【図４】
2008155801.tif 000006
【図５】
2008155801.tif 000007
【図６】
2008155801.tif 000008
【図７】
2008155801.tif 000009
【図８】
2008155801.tif 000010
【図９】
2008155801.tif 000011
【図１０】
2008155801.tif 000012
【国際調査報告】
2008155801.tif 000013
2008155801.tif 000014
2008155801.tif 000015
2008155801.tif 000016