(57)【要約】  スレッド間の負荷バランスを定性的に判断し、スレッド間の性能負荷バランスを調停する同時マルチスレッド方式の情報処理装置と制御方法を提供する。  メモリから命令を取得し、命令に基づいた演算を実行する演算部に、命令を投入する制御を、スレッド間で共有する命令投入制御部と、命令をデコードした情報を保持するスレッドごとに設けられるコミットスタックエントリと、命令投入制御部から投入された命令の順番に従い演算部により演算された演算結果に応じて、メモリと汎用レジスタの更新をする命令完了順序制御部と、コミットスタックエントリに登録された情報を検知し、検知結果に基づいて命令投入制御部を制御する性能負荷バランス解析部と、を具備する同時マルチスレッディング方式の情報処理装置とスレッド間性能負荷調停制御方法である。
2008155807.tif 000002
【特許請求の範囲】
【請求項１】
同時マルチスレッディングを実行可能な情報処理装置であって、
メモリから命令を取得し、前記命令に基づいた演算を実行する演算部に前記命令を投入する制御を、複数のスレッド間で共有する命令投入制御部と、
前記命令をデコードした情報を保持する、前記スレッドごとに設けられるコミットスタックエントリと、
前記命令投入制御部から投入された前記命令の順番に従い、前記演算部により演算された演算結果に応じて、前記メモリと汎用レジスタの更新をする命令完了順序制御部と、
前記コミットスタックエントリに登録された前記情報を検知し、前記検知の結果に基づいて前記命令投入制御部を制御する性能負荷バランス解析部と、
を具備することを特徴とする情報処理装置。
【請求項２】
命令完了順序制御部は、
前記コミットスタックエントリに前記情報が登録されていない時間を、前記スレッドが命令処理を実行していない時間であるとし、前記情報が登録されていない前記コミットスタックエントリのみが空であることを示すエンプティフラグを生成することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
性能負荷バランス解析部は、
前記コミットスタックエントリごとに予め命令投入優先要求閾値を設定し、
前記コミットスタックエントリごとに生成された前記エンプティフラグが発生している時間を計測し、
前記コミットスタックエントリに対応する前記計測の結果である優先スレッド値と前記命令投入優先要求閾値を比較して、前記優先スレッド値が前記命令投入優先要求閾値を越えた場合、前記エンプティフラグが発生している前記コミットスタックエントリに対応する前記スレッドに切り替えるため命令投入優先要求フラグを生成することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
性能負荷バランス解析部は、
前記コミットスタックエントリごとに予め前記命令投入優先要求フラグを解除するための解除閾値を設定し、
他の前記命令投入優先要求フラグが発生している前記コミットスタックエントリごとに生成された前記エンプティフラグが発生している前記スレッドの時間を計測した第２の優先スレッド値と前記優先スレッド値との差分である差分値を算出し、前記差分値と解除閾値を比較して、前記差分値が前記解除閾値を越えた場合、前記エンプティフラグが発生している前記コミットスタックエントリに対応する前記スレッドに切り替えるため命令投入優先要求フラグを解除することを特徴とする請求項３に記載の情報処理装置。
【請求項５】
前記命令完了順序制御部は、
抑制された側の前記スレッドの前記命令の処理が一定時間停滞した場合に、前記命令を投入している側の前記スレッドを解除するために、強制的に前記スレッドを固定することによるハングを回避するハング警告を前記命令投入制御部に出力する命令継続時間監視部を具備することを特徴とする請求項１に記載の情報処理装置。
【請求項６】
命令投入制御部は、
全ての前記スレッド前記命令が投入可能なタイミングであるときにはサイクルごとに前記スレッドを切り替え、ひとつの前記スレッドのみ前記命令が投入可能なタイミングであるときは前記命令が投入可能な前記スレッドを選択することを特徴とする請求項１に記載の情報処理装置。
【請求項７】
スレッド間の負荷調停制御方法であって、
メモリから命令を取得し、
スレッドごとに前記命令に基づいた演算を実行するために、前記命令の投入タイミングを制御し、
前記命令をデコードした情報を保持する、前記スレッドごとに設けられる前記コミットスタックエントリに登録された前記情報を検知し、
前記検知の結果に基づいて前記命令の投入を制御することを特徴とする負荷調停制御方法。
【請求項８】
前記負荷調停制御方法において、
前記コミットスタックエントリに登録された情報の検知結果に応じて、前記コミットスタックエントリに前記情報が登録されていない時間を前記スレッドが命令処理を実行していない時間であるとし、前記情報が登録されていない前記コミットスタックエントリのみが空であることを示すエンプティフラグを取得することを特徴とする請求項７に記載の負荷調停制御方法。
【請求項９】
前記負荷調停制御方法において、
前記コミットスタックエントリごとに予め命令投入優先要求閾値を設定し、
前記コミットスタックエントリごとに生成された前記エンプティフラグが発生している時間を計測し、
前記コミットスタックエントリに対応する前記計測の結果である優先スレッド値と前記命令投入優先要求閾値を比較し、
前記優先スレッド値が前記命令投入優先要求閾値を越えた場合、前記エンプティフラグが発生している前記コミットスタックエントリに対応する前記スレッドに切り替えるため命令投入優先要求フラグを生成することを特徴とする請求項８に記載の負荷調停制御方法。
【請求項１０】
前記負荷調停制御方法において、
前記コミットスタックエントリごとに、予め前記命令投入優先要求フラグを解除するための解除閾値を設定し、
他の前記命令投入優先要求フラグが発生している前記コミットスタックエントリごとに生成された前記エンプティフラグが発生している前記スレッドの時間を計測した第２の優先スレッド値と前記優先スレッド値との差分である差分値を算出し、
前記差分値と解除閾値を比較し、
前記差分値が前記解除閾値を越えた場合、前記エンプティフラグが発生している前記コミットスタックエントリに対応する前記スレッドに切り替えるため命令投入優先要求フラグを解除することを特徴とする請求項９に記載の負荷調停制御方法。
【請求項１１】
抑制された側の前記スレッドの前記命令の処理が一定時間停滞した場合に、前記命令を投入している側の前記スレッドを解除することを特徴とする請求項７に記載の負荷調停制御方法。
【請求項１２】
前記負荷調停制御方法において、
全ての前記スレッド前記命令が投入可能なタイミングであるときにはサイクルごとに前記スレッドを切り替え、
ひとつの前記スレッドのみ前記命令が投入可能なタイミングであるときは前記命令が投入可能な前記スレッドを選択することを特徴とする請求項７に記載の負荷調停制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、特に同時マルチスレッド方式の情報処理装置に関する。また、本発明は、複数のスレッドの間の性能負荷バランスの調停を行う負荷調停制御方法に関する。
【背景技術】
【０００２】
近年、情報処理装置では演算実行の処理をできるだけ並列化して各実行部の使用効率をあげるスーパースカラ方式や、依存関係にない複数の命令をプログラム中での出現順序に関係なく次々と実行することにより実行部の使用効率を向上するアウトオブオーダ命令実行方式などが全体のパフォーマンスを向上させる手段として一般に知られている。【０００３】
ところが、前述した方式を採用した情報処理装置においても内部の実行部（演算部など）がすべて動作しているわけではなく、並列性が最大限に活かされていない。
そこで、単一スレッドでは完全には使用されない内部資源を複数のスレッドに分配し、各々のスレッドで相互に関連性のない命令列を処理することで、情報処理装置が本来持つ並列性を最大限に引き出そうという方式、同時マルチスレッディング（ＳＭＴ：Simultaneous Multi-Threading）が提案されている。【０００４】
しかしながら、ＳＭＴでは複数のスレッドの命令列である資源を共有してその使用効率を向上することを目的とするが、ひとつのスレッドである共有資源を使用しているときには別のスレッドでその資源を使用できないため、ひとつのスレッドで共有資源を長時間占有してしまうと、別のスレッドの処理が進まないというアンバランスな状況が発生してしまうという問題がある。
【発明の開示】
【０００５】
本発明は上記のような実情に鑑みてなされたものであり、スレッド間の負荷バランスを定性的に判断し、スレッド間の性能負荷バランスを調停する同時マルチスレッド方式の情報処理装置とスレッド間性能負荷調停制御方法を提供することを目的とする。
【０００６】
本発明の態様のひとつである同時マルチスレッディング方式の情報処理装置であって、メモリから命令を取得し、前記命令に基づいた演算を実行する演算部に、前記命令を投入する制御を、スレッド間で共有する命令投入制御部と、前記命令をデコードした情報を保持する前記スレッドごとに設けられるコミットスタックエントリと、前記命令投入制御部から投入された前記命令の順番に従い前記演算部により演算された演算結果に応じて、前記メモリと汎用レジスタの更新をする命令完了順序制御部と、前記コミットスタックエントリに登録された前記情報を検知し、前記検知の結果に基づいて前記命令投入制御部を制御する性能負荷バランス解析部と、を具備する構成である。
【０００７】
好ましくは、命令完了順序制御部は、前記コミットスタックエントリに前記情報が登録されていない時間を、前記スレッドが命令処理を実行していない時間であるとし、前記情報が登録されていない前記コミットスタックエントリのみが空であることを示すエンプティフラグを生成する。
【０００８】
好ましくは、性能負荷バランス解析部は、前記コミットスタックエントリごとに予め命令投入優先要求閾値を設定し、前記コミットスタックエントリごとに生成された前記エンプティフラグが発生している時間を計測し、前記コミットスタックエントリに対応する前記計測の結果である優先スレッド値と前記命令投入優先要求閾値を比較して、前記優先スレッド値が前記命令投入優先要求閾値を越えた場合、前記エンプティフラグが発生している前記コミットスタックエントリに対応する前記スレッドに切り替えるため命令投入優先要求フラグを生成する。
【０００９】
好ましくは、性能負荷バランス解析部は、前記コミットスタックエントリごとに予め前記命令投入優先要求フラグを解除するための解除閾値を設定し、他の前記命令投入優先要求フラグが発生している前記コミットスタックエントリごとに生成された前記エンプティフラグが発生している前記スレッドの時間を計測した第２の優先スレッド値と前記優先スレッド値との差分である差分値を算出し、前記差分値と解除閾値を比較して、前記差分値が前記解除閾値を越えた場合、前記エンプティフラグが発生している前記コミットスタックエントリに対応する前記スレッドに切り替えるため命令投入優先要求フラグを解除する。
【００１０】
好ましくは、前記命令完了順序制御部は、抑制された側の前記スレッドの前記命令の処理が一定時間停滞した場合に、前記命令を投入している側の前記スレッドの命令投入優先を解除するために、強制的に前記スレッドを固定することによるハングを回避するハング警告を前記命令投入制御部に出力する命令継続時間監視部を具備する。
【００１１】
好ましくは、命令投入制御部は、全ての前記スレッド前記命令が投入可能なタイミングであるときにはサイクルごとに前記スレッドを切り替え、ひとつの前記スレッドのみ前記命令が投入可能なタイミングであるときは前記命令が投入可能な前記スレッドを選択する。
【００１２】
本発明は、同時マルチスレッディング方式のスレッド間性能負荷調停制御方法であって、メモリから命令を取得し、スレッドごとに前記命令に基づいた演算を実行するために、前記命令の投入タイミングを制御する命令投入制御ステップと、前記命令をデコードした情報を保持する前記スレッドごとに設けられる前記コミットスタックエントリに登録された前記情報を検知し、前記検知の結果に基づいて前記命令の投入を制御する性能負荷バランス解析ステップと、を有する。
【００１３】
好ましくは、性能負荷バランス解析ステップは、前記コミットスタックエントリに前記情報が登録されていない時間を、前記スレッドが命令処理を実行していない時間であるとし、前記情報が登録されていない前記コミットスタックエントリのみが空であることを示すエンプティフラグを取得する。
【００１４】
好ましくは、性能負荷バランス解析ステップは、前記コミットスタックエントリごとに予め命令投入優先要求閾値を設定し、前記コミットスタックエントリごとに生成された前記エンプティフラグが発生している時間を計測し、前記コミットスタックエントリに対応する前記計測の結果である優先スレッド値と前記命令投入優先要求閾値を比較して、前記優先スレッド値が前記命令投入優先要求閾値を越えた場合、前記エンプティフラグが発生している前記コミットスタックエントリに対応する前記スレッドに切り替えるため命令投入優先要求フラグを生成する。
【００１５】
好ましくは、性能負荷バランス解析ステップは、前記コミットスタックエントリごとに予め前記命令投入優先要求フラグを解除するための解除閾値を設定し、他の前記命令投入優先要求フラグが発生している前記コミットスタックエントリごとに生成された前記エンプティフラグが発生している前記スレッドの時間を計測した第２の優先スレッド値と前記優先スレッド値との差分である差分値を算出し、前記差分値と解除閾値を比較して、前記差分値が前記解除閾値を越えた場合、前記エンプティフラグが発生している前記コミットスタックエントリに対応する前記スレッドに切り替えるため命令投入優先要求フラグを解除する。
【００１６】
好ましくは、抑制された側の前記スレッドの前記命令の処理が一定時間停滞した場合に、前記命令を投入している側の前記スレッドの命令投入優先を解除する。
好ましくは、命令投入制御ステップは、全ての前記スレッド前記命令が投入可能なタイミングであるときにはサイクルごとに前記スレッドを切り替え、ひとつの前記スレッドのみ前記命令が投入可能なタイミングであるときは前記命令が投入可能な前記スレッドを選択する。
【００１７】
本発明によれば、スレッド間の負荷バランスを定性的に判断し、スレッド間の性能負荷バランスを調停することができる。
【図面の簡単な説明】
【００１８】
【図１】本発明である情報処理装置の構成を示すブロック図である。
【図２】命令パイプラインを示すブロック図である。
【図３】性能負荷バランス解析部の構成を示すブロック図である。
【図４】命令投入制御部の構成を示すブロック図である。
【図５】命令継続時間監視部の構成を示すブロック図である。
【図６】本発明である情報処理装置の動作を示す動作タイミングを示すタイムチャートである。
【図７】本発明である情報処理装置の動作を示す動作フロー図である。
【発明を実施するための最良の形態】
【００１９】
（原理説明）
以下に説明する一実施形態による情報処理装置は、スーパースカラ方式およびアウトオブオーダ命令実行方式で動作し、かつ同時マルチスレッディングを実現する情報処理装置である。そして、メモリから演算部への命令投入を制御する命令投入制御部をスレッド間で共有し、また命令完了順序を管理する命令完了順序管理部をスレッドごとに多重化する構成をもつ情報処理装置である。また、情報処理装置は、各スレッドの命令実行サイクル数のバランスに偏りが生じていることを命令完了順序部の使用状況によって検知する性能負荷バランス解析部を備えている。【００２０】
上記のように構成した情報処理装置により、性能負荷バランスの偏りが検知された場合、命令投入を実行するスレッドを固定する。また、各スレッドの性能負荷バランスを調停する。また、優先度を低くしたスレッドの処理を阻害しすぎないように命令投入のスレッド固定を抑止する。【００２１】
以下図面に基づいて、本発明の実施形態について詳細を説明する。
（実施例１）
（構成）
図１は同時マルチスレッド方式の情報処理装置１の構成図である。本実施例では、情報処理装置１は、メモリ２、命令取得制御部３、命令投入制御部４、命令解析部５、命令発行制御部６、命令完了順序制御部７、演算部８、性能負荷バランス解析部９により構成される。【００２２】
メモリ２は、情報処理装置１内のキャッシュなどとして機能する。命令取得制御部３は、命令バッファ１０を備え、メモリ２から演算を行うために命令を取得するための制御を行い、取得した命令を命令バッファ１０に保持する。【００２３】
命令投入制御部４は、命令バッファ１０に保持されている命令を読み出し、命令解析部５に転送する。また、命令投入制御部４は、命令バッファ１０に保持された命令に関して同一サイクルでの処理を１スレッドに限定し、必要に応じて各サイクルでスレッドを切り替えながら一方のスレッドの命令を命令解析部５へ投入する。【００２４】
命令解析部５は、命令投入制御部４から転送された命令をデコードする。命令発行制御部６は、命令解析部５でデコードされたそれぞれのコードに対応する処理を行うための命令の発行を制御する。演算部８は、命令発行制御部６から供給されたオペランドに基づいて演算等を行う。【００２５】
命令完了順序制御部７は、命令解析部５によってデコードされた命令の情報を保持するコミットスタックエントリ１２Ａ（ＣＳＥ０）、コミットスタックエントリ１２Ｂ（ＣＳＥ１）をスレッドごとに用意し、コミットスタックエントリ１２Ａ、コミットスタックエントリ１２Ｂに登録された情報に基づいて、命令が完了可能かどうかの判断を行い、命令完了と同時にその命令に関する情報をリセットする構成とする。すなわち、コミットスタックエントリ１２Ａ、コミットスタックエントリ１２Ｂに情報が登録されるのは、ＤｉｓｐａｔｃｈステージからＣｏｍｍｉｔステージの間であり、その間は何らかの命令処理を実行中であることを示す。【００２６】
また、命令完了順序制御部７は、命令継続時間監視部１１を備えている。命令継続時間監視部１１はハングの監視を行う回路である。
ここで、コミットスタックエントリ（ＣＳＥ：Commit Stack Entry）はバッファであり、コミットスタックエントリは、命令ごとに１エントリが割り当てられ、実行中の命令の進捗状況の監視に用いる。また、コミットスタックエントリのエントリは、プログラムの命令の順番に従い、インオーダにより実施される命令コミット時に、無効化される。【００２７】
なお、図１では２ＳＭＴであるため２個のコミットスタックエントリだけ設けられているが、コミットスタックエントリを２個以上用意してもかまわない。また、命令完了順序制御部７は、命令解析部５と接続され、コミットスタックエントリ１２Ａ、コミットスタックエントリ１２Ｂに登録された情報に基づいて、命令が完了可能かどうかの判断を行う。そして、命令完了と同時にその命令に関する情報をリセットする。【００２８】
性能負荷バランス解析部９は命令完了順序制御部７と接続され、コミットスタックエントリ１２Ａ、コミットスタックエントリ１２Ｂの内容を検知して、その検知の結果に基づいて、命令投入制御部４を制御する。【００２９】
なお、本情報処理装置はＳＭＴ動作をするものとし、各スレッドはスーパースカラ、アウトオブオーダ方式で動作する。
（スレッドの命令パイプライン）
図２に示すように情報処理装置１は、命令パイプラインにおいて、Ｆｅｔｃｈステージ、Ｐｒｅｓｅｎｔステージ、Ｄｅｃｏｄｅステージ、Ｄｉｓｐａｔｃｈステージ、Ｅｘｅｃｕｔｅステージ、Ｕｐｄａｔｅ−Ｂｕｆｆｅｒステージ、Ｃｏｍｍｉｔステージに分かれるものとする。【００３０】
Ｆｅｔｃｈステージは、命令取得制御部３の制御に基づいてメモリ２から命令の実行をする演算部８に命令を実行させるために、命令バッファ１０へ命令を読み出すステージである。【００３１】
Ｐｒｅｓｅｎｔステージは、命令投入制御部４の制御に基づき命令バッファ１０から命令解析部５に対して命令を投入するステージである。
Ｄｅｃｏｄｅステージは、命令解析部５にて命令をデコードするステージである。【００３２】
Ｄｉｓｐａｔｃｈステージは、命令発行制御部６に基づき演算部８などの命令実行資源に命令を発行するステージである。
Ｅｘｅｃｕｔｅステージは、演算部８などの命令実行資源にて命令を実行するステージである。【００３３】
Ｕｐｄａｔｅ−Ｂｕｆｆｅｒステージは、実行結果を待ち合わせるステージである。
Ｃｏｍｍｉｔステージは、命令完了順序制御部７の制御に基づいて命令順序どおりに実行結果に応じたメモリ２や汎用レジスタ（図示しないが演算部８、データ転送バスと制御バスにより接続されている）の更新を行うステージである。【００３４】
これらのステージのうち、Ｆｅｔｃｈステージ、Ｐｒｅｓｅｎｔステージ、Ｄｅｃｏｄｅステージ、Ｃｏｍｍｉｔステージは命令順序通りのインオーダで動作する。また、Ｄｉｓｐａｔｃｈステージ、Ｅｘｅｃｕｔｅステージ、Ｕｐｄａｔｅ−Ｂｕｆｆｅｒステージは命令順序によらず、実行準備ができたものから処理するアウトオブオーダで動作する。【００３５】
（性能負荷バランス解析部）
図３は性能負荷バランス解析部９の回路を示す図である。性能負荷バランス解析部９は、命令投入制御部４と命令完了順序制御部７に接続されている。【００３６】
性能負荷バランス解析部９は、コミットスタックエントリごとに予め命令投入優先要求閾値を設定する。そして、性能負荷バランス解析部９は、コミットスタックエントリごとに生成されたエンプティフラグが発生している時間を計測し、コミットスタックエントリに対応する計測の結果である優先スレッド値と命令投入優先要求閾値を比較する。その後、優先スレッド値が命令投入優先要求閾値を越えた場合、命令処理バランスがエンプティフラグが発生しているスレッドと逆のスレッドに偏っている判断し、命令処理バランスの調停をするため、エンプティフラグが発生しているスレッドの命令投入優先要求フラグを生成する。【００３７】
また、性能負荷バランス解析部９は、コミットスタックエントリごとに予め命令投入優先要求フラグを解除するための解除閾値を設定する。性能負荷バランス解析部９は、他の命令投入優先要求フラグが発生しているコミットスタックエントリごとに生成されたエンプティフラグが発生しているスレッドの時間を計測した第２の優先スレッド値と、優先スレッド値との差分である差分値を算出する。その後、差分値と解除閾値を比較して、差分値が解除閾値を越えた場合、命令処理バランスの偏りが解消されたと判断し、エンプティフラグが発生しているスレッドの命令投入優先要求フラグを解除する。【００３８】
本実施例では、簡単のため、スレッド数を２とするＳＭＴについて説明する。
あるスレッドのコミットスタックエントリに情報がひとつも登録されていないサイクルを、そのスレッドが命令処理を実行していない時間であるとみなし、片側のコミットスタックエントリのみが空であるという命令投入優先要求フラグ（BARANCE_PRIORTY_REQ_TH_0）を発生させる（負荷バランス解析要素と定義）。【００３９】
性能負荷バランス解析部９は、カウンタ回路３１、コンパレータ３２（スレッド０用）、コンパレータ３３（スレッド１用）、コンパレータ３４（スレッド０用）、コンパレータ３５（スレッド１用）、ラッチ回路３６（スレッド０用）、ラッチ回路３７（スレッド１用）から構成される。【００４０】
カウンタ回路３１は、スレッド０のコミットスタックエントリ１２Ａのみが空であるということを示すエンプティフラグを取得するため、命令完了順序制御部７と接続されている。また、カウンタ回路３１はコンパレータ３２、コンパレータ３３、コンパレータ３４、コンパレータ３５の入力端子と接続されている。【００４１】
また、カウンタ回路３１は、命令完了順序制御部７のコミットスタックエントリ１２Ａから、スレッド０のみが空であるということを示すエンプティフラグ（CSE_EMPTY_TH_0_ONLY）、コミットスタックエントリ１２Ｂからスレッド１のみが空であるということを示すエンプティフラグ（CSE_EMPTY_TH_1_ONLY）を取得し、これらのエンプティフラグが「ｈｉｇｈ」のときにカウントするカウンタである。【００４２】
ラッチ回路３６のセット端子（ＳＥＴ）は、コンパレータ３２の出力端子と接続される。ラッチ回路３６のリセット端子（ＲＥＳＥＴ）は、コンパレータ３３の出力端子と接続される。ラッチ回路３６の出力信号は命令投入制御部４に出力される。【００４３】
ラッチ回路３７のセット端子（ＳＥＴ）は、コンパレータ３４の出力端子と接続される。ラッチ回路３７のリセット端子（ＲＥＳＥＴ）は、コンパレータ３５の出力端子と接続される。ラッチ回路３７の出力信号は命令投入制御部４に出力される。【００４４】
本実施例では２ＳＭＴを想定しているため、２ＳＭＴに特化したカウンタの構成とすることで、面積軽減を考える。
カウンタ回路３１は、片側のスレッドのコミットスタックエントリのみが空であるサイクルの差が判別できればよいため、CSE_EMPTY_TH_0_ONLYのレベルが「ｈｉｇｈ」のときに−１を、CSE_EMPTY_TH_1_ONLYのレベルが「ｈｉｇｈ」のときに＋１を、加算するカウンタとして構成する。つまり、１つのカウンタによってどちらか一方のみの命令処理が実行されていることがわかる。【００４５】
例えば、スレッド１側のコミットスタックエントリ１２Ｂのみが空である状態が続いてスレッド０側の命令処理に偏っている場合は、CSE_EMPTY_TH_1_ONLYによってカウンタの値を加算して「＋」の値で偏りの度合いを表し、CSE_EMPTY_TH_0_ONLYによって値を減算することで偏りの解消を表現している。逆にスレッド１側に偏っている場合は「−」の値で偏りを表す。【００４６】
スレッド１側ではコンパレータ３４には「＋」の命令投入優先要求閾値（＋Ａ）、スレッド０側ではコンパレータ３２には「−」の命令投入優先要求閾値（−Ａ）を設定する。
カウンタ回路３１のカウンタの値（差分値）が「−Ａ」より小さくなった場合はスレッド１への偏りが大きいと判断し、スレッド０の命令投入優先要求（BALANCE_PRIORITY_REQ_TH_0）を行う。【００４７】
ラッチ回路３６のセット端子を「ｈｉｇｈ」にセットして命令投入制御部４へ出力する。
逆にカウンタ回路３１のカウンタの値が「＋Ａ」を超えた場合はスレッド０への偏りが大きいと判断し、スレッド１の命令投入優先要求（BALANCE_PRIORITY_REQ_TH_1）を「ｈｉｇｈ」にセットして命令投入制御部４へ出力する。【００４８】
また、偏りの解消に関しては別途閾値「＋Ｂ」／「−Ｂ」である解除閾値を設定し、カウンタ回路３１の値（差分値）が「＋Ｂ」より小さくなったらスレッド１側の偏りが解消されたと判断し、BALANCE_PRIORITY_REQ_TH_1を「ｌｏｗ」にし、偏りが大きい間のみBALANCE_PRIORITY_REQ_TH_1が「ｈｉｇｈ」となるように制御する。【００４９】
また、カウンタ回路３１の値（差分値）が「−Ｂ」より大きくなったらスレッド０側の偏りが解消されたと判断し、BALANCE_PRIORITY_REQ_TH_0を「ｌｏｗ」にし、偏りが大きい間のみBALANCE_PRIORITY_REQ_TH_0が「ｈｉｇｈ」となるように制御する。【００５０】
ここで、BALANCE_PRIORITY_REQ_TH_0とBALANCE_PRIORITY_REQ_TH_1とは共通するカウンタの値がそれぞれ「−Ａ」以下、「＋Ａ」以上のときにセットされるため、同時に「ｈｉｇｈ」になることはない。【００５１】
また、本実施例では上記のようなカウンタ回路３１を用いた場合について説明したが、スレッドごとにカウンタを用意してその値を比較する方式であってもよい。
（命令投入制御部）
図４は命令投入制御部４の回路を示す図である。命令投入制御部４は、あるタイミングごとにスレッドを切り替えながら命令解析部５へ命令を出力する。全てのスレッドが命令投入可能なタイミングなら毎サイクルスレッドを切り替え、ひとつのスレッドのみが命令投入可能なタイミングなら命令投入可能なスレッドを選択して命令解析部５へ命令を出力することで、ロスの少ない命令投入動作ができる。【００５２】
命令投入制御部４のスレッド０用の回路は、ＡＮＤ回路４１（３入力論理積回路）、ＡＮＤ回路４２（２入力論理積回路）、ＡＮＤ回路４３（２入力論理積回路）、ＡＮＤ回路４４（３入力論理積回路）、ＡＮＤ回路４５（２入力論理積回路）、ＯＲ回路４６（３入力論理和回路）、ＯＲ回路４７（３入力論理和回路）、ラッチ回路４８から構成される。【００５３】
命令投入制御部４のスレッド１用の回路は、ＡＮＤ回路４４（３入力論理積回路）、ＡＮＤ回路４１０（２入力論理積回路）、ＡＮＤ回路４１１（２入力論理積回路）、ＡＮＤ回路４１（３入力論理積回路）、ＡＮＤ回路４１３（２入力論理積回路）、ＯＲ回路４１４（３入力論理和回路）、ＯＲ回路４１５（３入力論理和回路）、ラッチ回路４１６から構成される。【００５４】
スレッド０用の回路について説明する。
ＡＮＤ回路４１のａ入力端子は、スレッド命令投入優先要求が発生した場合にBALANCE_PIRORITY_REQ_TH_0を取得するために、性能負荷バランス解析部９と接続されている。ＡＮＤ回路４１のｂ入力端子は、命令バッファ１０から命令解析部５に対してスレッド０側に命令の投入が可能であることを示す命令投入可能要求（ENABLE_PRESENT_OPERATION_TH_0）を取得する。また、ＡＮＤ回路４１のｂ入力端子は、ＡＮＤ回路４２のａ入力端子、ＡＮＤ回路４３のａ入力端子、ＯＲ回路４７のａ入力端子（反転入力）と接続されている。【００５５】
ＡＮＤ回路４１のｃ入力端子は、命令継続時間監視部１１と接続され、後述するハング警告（WARNING_TO_HUNG_OPERATION）を取得する。また、ＡＮＤ回路４１のｃ入力端子（反転入力）は、ＡＮＤ回路４４のｃ入力端子（反転入力）に接続されている。ＡＮＤ回路４１の出力端子（FORCE_THREAD_TO_0）は、ＯＲ回路４６のａ入力端子に接続される。【００５６】
ＡＮＤ回路４２のｂ入力端子には、後述する命令投入制御部４のスレッド１用のPRESENT_OPERATION_TH_1）が入力される。ＡＮＤ回路４２の出力端子は、ＯＲ回路４６のｂ入力端子に接続される。【００５７】
ＡＮＤ回路４３のｂ入力端子（反転入力）には、命令バッファ１０から命令解析部５に対してスレッド０側に命令の投入が可能であることを示す命令投入可能要求（ENABLE_PRESENT_OPERATION_TH_1）が入力する。また、ＡＮＤ回路４３のｂ入力端子は、ＡＮＤ回路４４のｂ入力端子、ＡＮＤ回路４５のａ入力端子と接続されている。ＡＮＤ回路４３の出力端子はＯＲ回路４６のｃ入力端子に接続される。【００５８】
ＡＮＤ回路４４のａ入力端子は、BALANCE_PIRORITY_REQ_TH_1を取得するために性能負荷バランス解析部９と接続されている。ＡＮＤ回路４４の出力端子（FORCE_THREAD_TO_1）は、ＯＲ回路４７のｂ入力端子に接続される。ＡＮＤ回路４５の出力端子は、ＯＲ回路４７のｃ入力端子に接続されている。【００５９】
ＯＲ回路４６の出力端子は、ラッチ回路４８のセット端子（ＳＥＴ）と接続され、ＯＲ回路４７の出力は、ラッチ回路４８のリセット端子（ＲＳＴ）と接続される。
ラッチ回路４８の出力端子（PRESENT_OPERATION_TH_0）は、ＡＮＤ回路４５のｂ入力端子と接続されている。【００６０】
スレッド１用の回路について説明する。
ＯＲ回路４１４のa入力端子は、スレッド０用の回路で前述したＡＮＤ回路４４の出力FORCE_THREAD_TO_1が接続される。【００６１】
また、ＯＲ回路４１５のｂ入力端子には、スレッド０用の回路で前述したＡＮＤ回路４１の出力FORCE_THREAD_TO_0が接続される。
ＡＮＤ回路４１０のｂ入力端子には、後述する命令投入制御部４のスレッド０用のPRESENT_OPERATION_TH_0）が入力する。ＡＮＤ回路４１０の出力端子は、ＯＲ回路４１４のｂ入力端子に接続される。【００６２】
ＡＮＤ回路４１１のｂ入力端子（反転入力）には、命令バッファ１０から命令解析部５に対してスレッド０側に命令の投入が可能であることを示す命令投入可能要求（ENABLE_PRESENT_OPERATION_TH_0）が入力する。また、ＡＮＤ回路４１１のｂ入力端子は、ＡＮＤ回路４１３のａ入力端子と接続されている。ＡＮＤ回路４１１の出力端子は、ＯＲ回路４１４のｃ入力端子に接続される。【００６３】
ＡＮＤ回路４１３の出力端子は、ＯＲ回路４１５のｃ入力端子に接続されている。
ＯＲ回路４１４の出力端子は、ラッチ回路４１６のセット端子（ＳＥＴ）と接続され、ＯＲ回路４１５の出力は、ラッチ回路４１６のリセット端子（ＲＳＴ）と接続される。【００６４】
ラッチ回路４１６の出力端子（PRESENT_OPERATION_TH_1）は、ＡＮＤ回路４１３のｂ入力端子と接続されている。
上記構成の命令投入制御部４は、性能負荷バランスに偏りが生じた場合には、BALANCE_PIRORITY_REQ_TH_0が「ｈｉｇｈ」のときにスレッド０側を優先し、BALANCE_PRIORITY_REQ_TH_1が「ｈｉｇｈ」のときにスレッド１側を優先し、命令解析部５に出力する命令のスレッドを選択することにより、性能負荷バランスの調停を実現する。【００６５】
しかし、命令投入を優先させたスレッドがなんらかの原因で停滞している場合は、命令を投入しても、それ以降の処理が実行できないため、最悪両側のスレッドの処理が止まってしまう危険性も有している。そこで、優先したいスレッドが命令投入可能なタイミング（ENABLE_PRESENT_OPERATION_TH_1）のときのみに優先したい側にスレッドの選択を固定することで、逆スレッドの命令投入の抑制によるハング（WARNING_TO_HUNG_OPERATION）の危険性を減少させることが可能である。【００６６】
つまり、ＡＮＤ回路４１において、スレッド０側のスレッド命令投入優先要求が発生した場合、BALANCE_PIRORITY_REQ_TH_0が「ｈｉｇｈ」になり、ENABLE_PRESENT_OPERATION_TH_0が「ｈｉｇｈ」で命令投入可能なタイミングで、WARNING_TO_HUNG_OPERATIONが「ｌｏｗ」でハングが発生していなければ、出力をFORCE_THREAD_TO_0を「ｈｉｇｈ」にする。このとき、ＯＲ回路４６の他の入力端子のレベルにかかわらずラッチ回路４８には「ｈｉｇｈ」がセットされる。【００６７】
ＡＮＤ回路４２は、スレッド０とスレッド１が命令投入可能であれば2サイクルに1回の間隔でラッチ回路４８に「ｈｉｇｈ」をセットする。つまり、前サイクルでスレッド１側で命令を投入していればPRESENT_OPERATION_TH_1が「ｈｉｇｈ」になり、ENABLE_PRESENT_OPERATION_TH_0が「ｈｉｇｈ」であるので、ＡＮＤ回路４２の出力は「ｈｉｇｈ」になる。【００６８】
ＡＮＤ回路４３は、スレッド０だけが命令投入可能であれば、ラッチ回路４８に「ｈｉｇｈ」をセットする。ENABLE_PRESENT_OPERATION_TH_0が「ｈｉｇｈ」で、ENABLE_PRESENT_OPERATION_TH_1が「ｌｏｗ」であるので、ＡＮＤ回路４３の出力は「ｈｉｇｈ」になる。【００６９】
上記、ＡＮＤ回路４１、ＡＮＤ回路４２とＡＮＤ回路４３によって決まる条件により、ラッチ回路４８に「ｈｉｇｈ」がセットされる。
ＡＮＤ回路４４の出力は、スレッド１側が強制されているときに「ｈｉｇｈ」になる。つまり、スレッド０側のスレッド命令投入優先要求が発生した場合、BALANCE_PIRORITY_REQ_TH_1が「ｈｉｇｈ」になる。また、ENABLE_PRESENT_OPERATION_TH_1が「ｈｉｇｈ」で命令投入可能なタイミングで、WARNING_TO_HUNG_OPERATIONが「ｌｏｗ」でハングが発生していなければ、ＡＮＤ回路４４はその出力FORCE_THREAD_TO_1を「ｈｉｇｈ」にする。このとき、ＯＲ回路４７の他の入力端子のレベルにかかわらず、ラッチ回路４８は「ｌｏｗ」にリセットされる。【００７０】
ＡＮＤ回路４５は、スレッド０とスレッド１が命令投入可能であれば、2サイクルに1回の間隔でラッチ回路４８を「ｌｏｗ」にリセットする。つまり、前サイクルでスレッド０側で命令を投入していればPRESENT_OPERATION_TH_0が「ｈｉｇｈ」になり、ENABLE_PRESENT_OPERATION_TH_1が「ｈｉｇｈ」であるので、ＡＮＤ回路４５の出力は「ｈｉｇｈ」になる。【００７１】
上記、ＡＮＤ回路４４、ＡＮＤ回路４５、およびENABLE_PRESENT_OPERATION_TH_0によって決まる条件により、ラッチ回路４８は「ｌｏｗ」にリセットされる。
スレッド１用の回路についても、スレッド０側同様に制御をする。【００７２】
つまり、ＡＮＤ回路４４において、スレッド１側のスレッド命令投入優先要求が発生して、FORCE_THREAD_TO_1が「ｈｉｇｈ」になったとき、ＯＲ回路４１４の他の入力端子のレベルにかかわらずラッチ回路４１６には「ｈｉｇｈ」がセットされる。【００７３】
ＡＮＤ回路４１０は、スレッド０とスレッド１が命令投入可能であれば、2サイクルに一回の間隔でラッチ回路４１６に「ｈｉｇｈ」をセットする。つまり、前サイクルでスレッド０側で命令を投入していればPRESENT_OPERATION_TH_0が「ｈｉｇｈ」になり、ENABLE_PRESENT_OPERATION_TH_1が「ｈｉｇｈ」であるので、ＡＮＤ回路４１０の出力は「ｈｉｇｈ」になる。【００７４】
ＡＮＤ回路４１１は、スレッド０だけが命令投入可能であれば、ラッチ回路４１６に「ｈｉｇｈ」をセットする。ENABLE_PRESENT_OPERATION_TH_1が「ｈｉｇｈ」で、ENABLE_PRESENT_OPERATION_TH_0が「ｌｏｗ」であるので、ＡＮＤ回路４１１の出力は「ｈｉｇｈ」になる。【００７５】
上記、ＡＮＤ回路４４、ＡＮＤ回路４１０とＡＮＤ回路４１１によって決まる条件により、ラッチ回路４１６に「ｈｉｇｈ」がセットされる。
ＡＮＤ回路４１において、スレッド０側のスレッド命令投入優先要求が発生して、FORCE_THREAD_TO_0が「ｈｉｇｈ」になったとき、ＯＲ回路４１５の他の入力短資のレベルにかかわらずラッチ回路４１６は「ｌｏｗ」にリセットされる。【００７６】
ＡＮＤ回路４１３は、スレッド０とスレッド１が命令投入可能であれば、２サイクルに1回の間隔でラッチ回路４１６を「ｌｏｗ」にリセットする。前サイクルでスレッド１側で命令を投入していればPRESENT_OPERATION_TH_1が「ｈｉｇｈ」になり、ENABLE_PRESENT_OPERATION_TH_0が「ｈｉｇｈ」であるので、ＡＮＤ回路４１３の出力は「ｈｉｇｈ」になる。【００７７】
上記、ＡＮＤ回路４１、ＡＮＤ回路４１３、およびENABLE_PRESENT_OPERATION_TH_0によって決まる条件により、ラッチ回路４１６は「ｌｏｗ」にリセットされる。
（命令継続時間監視部）
さらに、抑制された側のスレッドの命令処理が一定時間停滞した場合には命令投入のスレッドの固定を解除することにより、強制的にスレッドを固定することによるハングの危険の回避することができる。【００７８】
命令継続時間監視部１１は、ハングの監視を行う回路である。命令継続時間監視部１１は、毎サイクルカウントアップして命令の処理が完了したら値をリセットするカウンタをスレッドごとに用意する。カウンタは命令が完了しない間カウントし続けるので、Ｃｏｍｍｉｔまでのいずれかのステージに、そのスレッドの命令が停滞している時間を示す。本例では、命令継続時間監視部１１はカウンタの閾値「Ｃ」を設定し、いずれかのスレッドでカウンタの値が閾値「Ｃ」を超えたら、ハング警告（WARNING_TO_HUNG_OPERATION）を命令投入制御部４へ出力して性能負荷バランス調停の停止を要求する。【００７９】
本実施例では２ＳＭＴの場合について記述したが、スレッドが増加した場合についても、各スレッドのコミットスタックエントリが空となっているサイクルをカウントし、あるスレッドのカウンタの値を他のスレッドと比較した差が大きくなったときに、そのスレッドの命令投入を優先する構成を実現できる。また、このように構成することにより性能負荷バランスの調停が可能である。【００８０】
図５は命令継続時間監視部１１の回路を示す図である。
命令継続時間監視部１１は、カウンタ回路５１、カウンタ回路５２、コンパレータ５３、コンパレータ５４、ＯＲ回路５５（２入力論理和回路）から構成されている。【００８１】
カウンタ回路５１は、入力端子（＋）からクロック（ＣＬＫ）を入力してカウントをする。また、命令完了順序制御部７から出力されるスレッド０側の命令完了通知であるCOMMIT_OPERATION_TH_0をリセット端子（ＲＳＴ）で受信する。【００８２】
カウンタ回路５２は、入力端子（＋）からクロック（ＣＬＫ）を入力してカウントをする。また、命令完了順序制御部７から出力されるスレッド１側の命令完了通知であるCOMMIT_OPERATION_TH_1をリセット端子（ＲＳＴ）で受信する。【００８３】
コンパレータ５３は、カウンタの閾値として予め「Ｃ」を設定し、カウンタ回路５１のカウント値が「Ｃ」を超えたら出力端子から「ｈｉｇｈ」を出力する。
コンパレータ５４は、カウンタの閾値として予め「Ｃ」を設定し、カウンタ回路５１のカウント値が「Ｃ」を超えたら出力端子から「ｈｉｇｈ」を出力する。【００８４】
ＯＲ回路５５（２入力論理和回路）は、コンパレータ５３とコンパレータ５４の出力を、それぞれａ入力端子とｂ入力端子に入力し、ハング警告（WARNING_TO_HUNG_OPERATION）を出力する。【００８５】
（情報処理装置の動作）
図６は本実施例による情報処理装置の動作を示すタイムチャートである。上記説明した回路の動作をタイムチャートにより説明する。【００８６】
縦軸に（１）CSE_EMPTY_TH_0_ONLY、（２）CSE_EMPTY_TH_1_ONLY、（３）BALANCE_COUNTER、（４）BALANCE_PRIORITY_REQ_TH_0、（５）BALANCE_PRIORITY_REQ_TH_1、（６）HUNG_COUNTER、（７）WARNING_TO_HUNG_OPERATION、（８）FORCE_THREAD_TO_0、（９）FORCE_THREAD_TO_1を示し、横軸に時間軸（クロック）を示す。【００８７】
期間１から期間２では、コミットスタックエントリ１２Ａのみが空であることを示すエンプティフラグである（１）CSE_EMPTY_TH_0_ONLYが「ｌｏｗ」から「ｈｉｇｈ」に変化する。【００８８】
性能負荷バランス解析部９のカウンタ回路３１に入力された（１）CSE_EMPTY_TH_0_ONLYが「ｈｉｇｈ」の間、カウンタ回路３１ではカウントがされ、カウント値（３）BALANCE_COUNTERがカウンタ回路３１の出力端子から出力される。【００８９】
期間３からは、カウンタ回路３１により「−１」の加算がクロックごとに行われる。カウント値が加算され、予め設定した値「−Ａ」になる期間５まで加算がされる。
期間６では、コンパレータ３２の出力が「ｈｉｇｈ」に変化し、ラッチ回路３６に「ｈｉｇｈ」がセットされる。その結果、ラッチ回路３６の出力（４）BALANCE_PRIORITY_REQ_TH_0が「ｈｉｇｈ」に変化する。このとき、命令投入制御部４にBALANCE_PRIORITY_REQ_TH_0が入力され、ＡＮＤ回路４１のａ端子に入力され、命令投入可能要求であるENABLE_PRESENT_OPERATION_TH_0が「ｈｉｇｈ」であるならば、（７）WARNING_TO_HUNG_OPERATIONが「ｌｏｗ」であるので、ＡＮＤ回路４１の出力（８）FORCE_THREAD_TO_0は「ｈｉｇｈ」になる。ラッチ回路４８に「ｈｉｇｈ」がセットされる。【００９０】
期間７では、さらにスレッド０側の加算が進み「−Ｘ」になり、期間８ではコミットスタックエントリ１２Ａが空でなくなるためエンプティフラグ（１）CSE_EMPTY_TH_0_ONLYが「ｈｉｇｈ」から「ｌｏｗ」に変化する。CSE_EMPTY_TH_0_ONLYおよびCSE_EMPTY_TH_1_ONLYが共に「ｌｏｗ」であるため期間９まではカウンタ回路３１の出力としてカウント値は変化しない。【００９１】
期間１０では、今度はコミットスタックエントリ１２Ｂのみが空であることを示すエンプティフラグである（２）CSE_EMPTY_TH_1_ONLYが「ｌｏｗ」から「ｈｉｇｈ」に変化する。【００９２】
期間１１では、「−Ｘ」に「１」が加算され、その後クロックごとにカウント値が加算され、予め設定した値「−Ｂ」になる期間１６まで加算がされる。
ここで、期間１４で、（６）HUNG_COUNTERの値が予め設定した閾値「Ｃ」を超えて（７）WARNING_TO_HUNG_OPERATIONが「ｈｉｇｈ」となると、ＡＮＤ回路４１のｃ入力端子に「ｈｉｇｈ」が入力されＡＮＤ回路４１の出力FORCE_THREAD_TO_0が「ｌｏｗ」になる。このとき、スレッド０の命令投入の強制が解除される。【００９３】
期間１６では、カウンタ回路３１のカウント値が「−Ｂ」より大きくなり、これによりスレッド間の命令処理バランスの偏りが解消されたと判断され、コンパレータ３３の出力が「ｈｉｇｈ」を出力し、ラッチ回路３６がリセットされてBALANCE_PRIORITY_REQ_TH_0が「ｌｏｗ」になる。【００９４】
期間１７から期間１８では、そのままCSE_EMPTY_TH_1_ONLYが「ｈｉｇｈ」のままクロックが進み、予め設定した値「＋Ａ」になるまで加算がされると、今度は逆に（５）BALANCE_PRIORITY_REQ_TH_1が「ｈｉｇｈ」になる。このときは、（７）WARNING_TO_HUNG_OPERATIONが「high」のままであるので命令投入するスレッドを強制選択はキャンセルされる。【００９５】
（本実施例の動作フロー）
図７に本実施例のスレッド０側の動作についてフロー図を用いて説明する。
ステップＳ７１〜ステップＳ７９（性能負荷バランス解析ステップ）について説明する。【００９６】
ステップＳ７１では、スレッド０側のコミットスタックエントリが空であるかを判定する。スレッド０側のコミットスタックエントリが空であればステップＳ７２に移行し、空でなければステップＳ７６に移行する。【００９７】
ステップＳ７２では、スレッド１側のコミットスタックエントリが空であるかを判定する。スレッド１側のコミットスタックエントリが空であればステップＳ７１０に移行し、空でなければステップＳ７３に移行する。スレッド０側のコミットスタックエントリ１２Ａから出力されるCSE_EMPTY_TH_0_ONLYが「ｈｉｇｈ」である場合ステップＳ７３に移行する。【００９８】
ステップＳ７３ではバランス監視をするカウンタに、CSE_EMPTY_TH_0_ONLYが「ｈｉｇｈ」である間、クロックごとに「−１」を加算する。つまり、図３に示すカウンタ回路３１の入力端子（−１）に「ｈｉｇｈ」が入力されている間、クロック毎に「−１」を加算する。【００９９】
ステップＳ７４では、バランス監視をするカウンタのカウント値が予め設定した命令投入優先要求閾値「−Ａ」より大きいかを判定する。「−Ａ」より大きければステップＳ７１０に移行する。「−Ａ」以下であればステップＳ７５に移行する。【０１００】
カウンタ回路３１の出力BALANCE_COUNTERの値を、コンパレータ３２に設定した命令投入優先要求閾値と比較して出力する。
ステップＳ７５では、BALANCE_PRIORITY_REQ_TH_0を「ｈｉｇｈ」にセットする。このとき、ラッチ回路３６のＲＳＴ入力端子は「ｌｏｗ」である。【０１０１】
ステップＳ７６では、スレッド１側のコミットスタックエントリが空であるかを判定する。スレッド１側のコミットスタックエントリが空であればステップＳ７１０に移行し、空でなければステップＳ７７に移行する。スレッド１側のコミットスタックエントリ１２Ａから出力されるCSE_EMPTY_TH_1_ONLYが「ｈｉｇｈ」である場合ステップＳ７７に移行する。【０１０２】
ステップＳ７７では、バランス監視をするカウンタに「＋１」を加算する。CSE_EMPTY_TH_0_ONLYが「ｌｏｗ」になり、CSE_EMPTY_TH_1_ONLYが「ｈｉｇｈ」である間、クロックごとに「＋１」を加算する。つまり、図３に示すカウンタ回路３１の入力端子（＋１）に「ｈｉｇｈ」が入力されている間クロックごとに「＋１」を加算する。【０１０３】
ステップＳ７８では、バランス監視カウンタのカウント値が予め設定した解除閾値「−Ｂ」より小さいかを判定する。「−Ｂ」より小さければステップＳ７１０に移行する。「−Ｂ」以上であればステップＳ７９に移行する。【０１０４】
カウンタ回路３１の出力BALANCE_COUNTERの値を、コンパレータ３３に設定した解除閾値と比較し、解除閾値をカウンタ値（差分値）が越えていたら「ｈｉｇｈ」を出力する。
ステップＳ７１０、ステップＳ７１１、ステップＳ７１３〜ステップＳ７１８（命令取得制御ステップ）とステップＳ７１２（命令継続時間監視ステップ）について説明する。【０１０５】
ステップＳ７１０では、スレッド０側の命令が投入可能であるか判定する。投入可能であればステップＳ７１１に移行する。投入できない状態であればステップＳ７１７に移行する。命令取得制御部３からスレッド０側の命令投入可能であることを示すENABL_PRESENT_OPERATION_TH_0が「ｈｉｇｈ」であるかを判定する。【０１０６】
ステップＳ７１１では、BALANCE_PRIORITY_REQ_TH_0が「ｈｉｇｈ」であるかを判定する。「ｈｉｇｈ」であればステップＳ７１２に移行する。「ｌｏｗ」であればステップＳ７１３に移行する。【０１０７】
ステップＳ７１２では、両スレッドの命令継続時間が予め設定したハング閾値「Ｃ」より小さければステップＳ７１６に移行する。ハング閾値「Ｃ」より大きければステップＳ７１３に移行する。つまり、WARNING_TO_HUNG_OPERATIONが「ｌｏｗ」であればスレッド０側の命令を投入可能である。【０１０８】
ステップＳ７１３では、前のサイクルでスレッド１の命令を投入しているかを判断する。投入していればステップＳ７１６に移行する。投入されていなければステップＳ７１４に移行する。PRESENT_OPERATION_TH_1が「ｈｉｇｈ」であるかを判定する。【０１０９】
ステップＳ７１４とステップＳ７１７では、スレッド１の命令が投入可能かを判定する。投入可能であればステップＳ７１５に移行する。ENABLE_PRESENT_OPERATION_TH_1が「ｈｉｇｈ」であるかを判定する。【０１１０】
ステップＳ７１５ではスレッド１の命令を投入する。ステップＳ７１６ではスレッド０の命令を投入する。ステップＳ７１８では命令を投入しない。
スレッド１側の動作についてもスレッド０側と同様に動作する。ステップＳ７１´〜７１８´はステップＳ７１〜７１８に対応している。【０１１１】
ステップＳ７１´では、スレッド１側のコミットスタックエントリが空であるかを判定する。スレッド１側のコミットスタックエントリが空であればステップＳ７２´に移行し、空でなければステップＳ７６´に移行する。【０１１２】
ステップＳ７２´では、スレッド０側のコミットスタックエントリが空であるかを判定する。スレッド０側のコミットスタックエントリが空であればステップＳ７１０´に移行し、空でなければステップＳ７３´に移行する。スレッド１側のコミットスタックエントリ１２Ｂから出力されるCSE_EMPTY_TH_1_ONLYが「ｈｉｇｈ」である場合ステップＳ７３´に移行する。【０１１３】
ステップＳ７３´では、バランス監視をするカウンタにCSE_EMPTY_TH_1_ONLYが「ｈｉｇｈ」である間、クロックごとに「＋１」を加算する。つまり、図３に示すカウンタ回路３１の入力端子（＋１）に「ｈｉｇｈ」が入力されている間クロック毎に「＋１」を加算する。【０１１４】
ステップＳ７４´では、バランス監視をするカウンタのカウント値が予め設定した命令投入優先要求閾値「＋Ａ」より小さいかを判定する。「＋Ａ」より小さければステップＳ７１０´に移行する。「＋Ａ」以下であればステップＳ７５´に移行する。【０１１５】
カウンタ回路３１の出力BALANCE_COUNTERの値を、コンパレータ３４に設定した命令投入優先要求閾値と比較して出力する。
ステップＳ７５´では、BALANCE_PRIORITY_REQ_TH_1を「ｈｉｇｈ」にセットする。このとき、ラッチ回路３７のＲＳＴ入力端子は「ｌｏｗ」である。【０１１６】
ステップＳ７６´では、スレッド０側のコミットスタックエントリが空であるかを判定する。スレッド０側のコミットスタックエントリが空であればステップＳ７１０´に移行し、空でなければステップＳ７７´に移行する。スレッド０側のコミットスタックエントリ１２Ｂから出力されるCSE_EMPTY_TH_0_ONLYが「ｈｉｇｈ」である場合ステップＳ７７´に移行する。【０１１７】
ステップＳ７７´ではバランス監視をするカウンタに「−１」を加算する。CSE_EMPTY_TH_1_ONLYが「ｌｏｗ」になり、CSE_EMPTY_TH_0_ONLYが「ｈｉｇｈ」である間、クロックごとに「−１」を加算する。つまり、図３に示すカウンタ回路３１の入力端子（−１）に「ｈｉｇｈ」が入力されている間クロックごとに「−１」を加算する。【０１１８】
ステップＳ７８´では、バランス監視カウンタのカウント値が予め設定した解除閾解除値「＋Ｂ」より大きいかを判定する。「＋Ｂ」より大きければステップＳ７１０´に移行する。「＋Ｂ」以下であればステップＳ７９´に移行する。【０１１９】
カウンタ回路３１の出力BALANCE_COUNTERの値を、コンパレータ３５に設定した閾値と比較し、解除閾値をカウンタ値（差分値）が越えていたら「ｈｉｇｈ」を出力する。
ステップＳ７１０´では、スレッド１側の命令が投入可能であるか判定する。投入可能であればステップＳ７１１´に移行する。投入できない状態であればステップＳ７１７´に移行する。命令取得制御部３からスレッド１側の命令投入可能であることを示すENABL_PRESENT_OPERATION_TH_1が「ｈｉｇｈ」であるかを判定する。【０１２０】
ステップＳ７１１´では、BALANCE_PRIORITY_REQ_TH_1が「ｈｉｇｈ」であるかを判定する。「ｈｉｇｈ」であればステップＳ７１２´に移行する。「ｌｏｗ」であればステップＳ７１３´に移行する。【０１２１】
ステップＳ７１２´では、両スレッドの命令継続時間が予め設定したハング閾値「Ｃ」より小さければステップＳ７１６´に移行する。ハング閾値「Ｃ」より大きければステップＳ７１３´に移行する。つまり、WARNING_TO_HUNG_OPERATIONが「ｌｏｗ」であればスレッド１側の命令を投入可能である。【０１２２】
ステップＳ７１３´では、前のサイクルでスレッド０の命令を投入しているかを判断する。投入していればステップＳ７１６´に移行する。投入されていなければステップＳ７１４´に移行する。PRESENT_OPERATION_TH_0が「ｈｉｇｈ」であるかを判定する。【０１２３】
ステップＳ７１４´とステップＳ７１７´では、スレッド０の命令が投入可能かを判定する。投入可能であればステップＳ７１５´に移行する。ENABL_PRESENT_OPERATION_TH_1が「ｈｉｇｈ」であるかを判定する。【０１２４】
ステップＳ７１５´ではスレッド０の命令を投入する。ステップＳ７１６´ではスレッド１の命令を投入する。ステップＳ７１８´では命令を投入しない。
なお、本発明は上記実施の形態に限定されるものでなく、本発明の要旨を逸脱しない範囲内で種々の改良、変更が可能である。
【図１】
2008155807.tif 000003
【図２】
2008155807.tif 000004
【図３】
2008155807.tif 000005
【図４】
2008155807.tif 000006
【図５】
2008155807.tif 000007
【図６】
2008155807.tif 000008
【図７】
2008155807.tif 000009
【国際調査報告】
2008155807.tif 000010
2008155807.tif 000011
2008155807.tif 000012