(57)【特許請求の範囲】
【請求項１】
複数のスレッドの命令を並列実行するマルチスレッドプロセッサであって、
各々、命令を実行する複数の演算器と、
スレッド毎に、当該スレッドに含まれる命令を、前記複数の演算器で同時実行可能な命令からなるグループにグループ化するグループ化部と、
前記複数のスレッドの命令の実行頻度を制御することにより、前記マルチスレッドプロセッサの実行サイクル毎に、前記複数のスレッドの中から、前記複数の演算器に発行される命令を含むスレッドを選択するスレッド選択部と、
前記マルチスレッドプロセッサの実行サイクル毎に、前記スレッド選択部で選択された前記スレッドに含まれる命令のうち、前記グループ化部でグループ化されたグループの命令を、前記複数の演算器に発行する命令発行部と、
スレッド毎に、前記グループ化部によりグループ化される前記グループに含まれる命令の最大個数を指定する命令数指定部とを備え、
前記グループ化部は、前記命令数指定部で指定された前記命令の最大個数を超えないように、命令をグループ化し、
前記スレッド選択部は、前記複数のスレッドの各々について、前記複数の演算器での命令の実行サイクル間隔を指定する実行間隔指定部を有し、前記実行間隔指定部により指定された実行サイクル間隔を周期として、当該サイクルに前記スレッドの命令を発行するよう前記スレッドを選択する
ことを特徴とするマルチスレッドプロセッサ。
【請求項２】
前記実行間隔指定部は、レジスタに設定された値に従い、前記実行サイクル間隔を指定する
請求項１記載のマルチスレッドプロセッサ。
【請求項３】
前記実行間隔指定部は、前記複数のスレッドに含まれる前記実行サイクル間隔を指定するための命令に従い、前記実行サイクル間隔を指定する
請求項１記載のマルチスレッドプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のスレッドを並列実行するマルチスレッドプロセッサに関し、特に、各スレッドに含まれる命令の実行タイミングを制御する事により、各スレッドの実行効率を向上させるマルチスレッドプロセッサに関する。
【背景技術】
【０００２】
近年、ＡＶ（Audio/Visual）処理の分野では、新たなコーデックや新規格等が継続的に発表され、ソフトウェアによるＡＶ処理ニーズは高まる一方である。そのため、ＡＶシステム等で求められるプロセッサ性能も飛躍的に高まっている。また、実行されるソフトウェアがマルチタスク化するのに合わせ、複数のスレッドを同時実行するマルチスレッディング技術を用いたマルチスレッドプロセッサが数多く開発されている。
【０００３】
従来のマルチスレッドプロセッサにおいて、プロセッサの実行サイクル毎に実行するスレッドを切り替える細粒度マルチスレッディング（Fine-Grained Multithreading）（例えば、特許文献１）や、Ｉｎｔｅｌ社のハイパースレッディング・テクノロジーに代表されるような実行サイクル内で同時に複数のスレッドを実行する同時マルチスレッディング（Simultaneous Multithreading; SMT）（例えば、非特許文献１）などがよく知られている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００８−１２３０４５号公報（第６図等）
【非特許文献】
【０００５】
【非特許文献１】Ｉｎｔｅｌ社ハイパースレッディング・テクノロジー［平成２１年２月１６日検索］、インターネット＜ＵＲＬ：http://www.intel.com/jp/technology/hyperthread/＞
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来のマルチスレッドプロセッサにおいては、スレッド間で演算資源が競合した場合は、ユーザ指定やプロセッサ実装上のスレッドの優先度において、劣勢となる他のスレッドの実行効率が局所的に著しく落ちることがある。
【０００７】
また、各スレッドの命令数と演算器資源数のバランスが悪い場合には、マルチスレッド動作で期待していたような実行効率が得られない可能性がある。例えば、同時に４命令実行可能な演算器資源を有するプロセッサに対し、２つのスレッドにそれぞれ含まれる２命令及び３命令を継続的に発行しようとすると、この２スレッドは同時実行できずどちらか一方のスレッドの命令のみが実行される。このため、１つまたは２つの演算器資源は使用されず無駄になり、スレッドの実行効率が低下するという課題がある。
【０００８】
本発明は、上述の課題を解決するためになされたものであり、スレッドの実行効率が高いマルチスレッドプロセッサを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明のある局面に係るマルチスレッドプロセッサは、複数のスレッドの命令を並列実行するマルチスレッドプロセッサであって、各々、命令を実行する複数の演算器と、スレッド毎に、当該スレッドに含まれる命令を、前記複数の演算器で同時実行可能な命令からなるグループにグループ化するグループ化部と、前記複数のスレッドの命令の実行頻度を制御することにより、前記マルチスレッドプロセッサの実行サイクル毎に、前記複数のスレッドの中から、前記複数の演算器に発行される命令を含むスレッドを選択するスレッド選択部と、前記マルチスレッドプロセッサの実行サイクル毎に、前記スレッド選択部で選択された前記スレッドに含まれる命令のうち、前記グループ化部でグループ化されたグループの命令を、前記複数の演算器に発行する命令発行部と、スレッド毎に、前記グループ化部によりグループ化される前記グループに含まれる命令の最大個数を指定する命令数指定部とを備え、前記グループ化部は、前記命令数指定部で指定された前記命令の最大個数を超えないように、命令をグループ化し、前記スレッド選択部は、前記複数のスレッドの各々について、前記複数の演算器での命令の実行サイクル間隔を指定する実行間隔指定部を有し、前記実行間隔指定部により指定された実行サイクル間隔を周期として、当該サイクルに前記スレッドの命令を発行するよう前記スレッドを選択することを特徴とする。
【００１０】
かかる構成により、複数のスレッドの実行頻度を制御することにより、ユーザ指定やプロセッサ実装上のスレッド間の優先度において劣勢となるスレッドの実行効率が局所的に著しく落ちることを防ぐ事ができる。また、演算器資源が有効に利用できるように複数のスレッドの実行頻度を制御することができ、各スレッドの命令数と演算器資源数のバランスをとり、演算器資源を効率よく使用することができる。これにより、スレッドの実行効率が高いマルチスレッドプロセッサを提供することができる。
【００１１】
好ましくは、上述のマルチスレッドプロセッサは、さらに、スレッド毎に、前記グループ化部によりグループ化される前記グループに含まれる命令の最大個数を指定する命令数指定部を備え、前記グループ化部は、前記命令数指定部で指定された前記命令の最大個数を超えないように、命令をグループ化する。
【００１２】
かかる構成により、各スレッドの命令数と演算器資源数のバランスをとり、演算器資源を効率よく使用することができる。
【００１４】
また、命令セット体系を維持したまま、プログラムによりレジスタの設定値を更新することで、プログラムの任意の範囲ごとで上記最大個数を制御し実行効率を最適化することができる。
【００１８】
また、優先度の高いスレッドが長時間資源を占有することを抑止でき、低優先度のスレッドの実行が局所的に停止してしまうことを防止できる。
【００１９】
好ましくは、前記実行間隔指定部は、レジスタに設定された値に従い、前記実行サイクル間隔を指定する。
【００２０】
かかる構成により、命令セット体系を維持したまま、プログラムによりレジスタの設定値を更新することで、プログラムの任意の範囲ごとに資源占有を抑止し、他スレッドの実行効率を向上させることができる。
【００２１】
また、前記実行間隔指定部は、前記複数のスレッドに含まれる前記実行サイクル間隔を指定するための命令に従い、前記実行サイクル間隔を指定してもよい。
【００２２】
かかる構成により、レジスタに設定された値に従い実行サイクル間隔を指定する場合に比べ、アドレス設定やメモリアクセスを削減できる分、より高速に設定を変更できる。また、高速に設定を変更できる分、オーバーヘッドロスを気にせずプログラムのより詳細な任意の範囲ごとで資源占有を抑止し、他スレッドの実行効率を向上させることができる。
【００２９】
なお、本発明は、このような特徴的な処理部を備えるマルチスレッドプロセッサとして実現することができるだけでなく、マルチスレッドプロセッサに含まれる特徴的な処理部をステップとする情報処理方法として実現することができる。また、情報処理方法に含まれる特徴的なステップをコンピュータに実行させるプログラムとして実現することもできる。そして、そのようなプログラムは、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
【発明の効果】
【００３０】
本発明に係るマルチスレッドプロセッサによれば、スレッド間で演算資源が競合した場合でも、ユーザ指定やプロセッサ実装上のスレッド間の優先度において劣勢となるスレッドの実行効率が局所的に著しく落ちることを防ぐ事ができる。また、各スレッドの命令数と演算器資源数のバランスをとり、演算器資源を効率よく使用することができる。これにより、スレッドの実行効率が高いマルチスレッドプロセッサを提供することができる。
【図面の簡単な説明】
【００３１】
【図１】本発明の実施の形態１に係るマルチスレッドプロセッサのブロック図である。
【図２】本発明の実施の形態１に係るスレッド選択部のブロック図である。
【図３】本発明の実施の形態１に係るマルチスレッドプロセッサの動作を示すフローチャートである。
【図４】本発明の実施の形態１に係るスレッド選択処理のフローチャートである。
【図５】本発明の実施の形態２に係るコンパイラの構成を示すブロック図である。
【図６】本発明の実施の形態２に係るコンパイラが受理できるマルチスレッドの制御のための指示の一覧を示す図である。
【図７】「注力区間指示」を用いたソースプログラムの一例を示す図である。
【図８】「非注力区間指示」を用いたソースプログラムの一例を示す図である。
【図９】「命令並列度指示」を用いたソースプログラムの一例を示す図である。
【図１０】「マルチスレッド実行モード指示」を用いたソースプログラムの一例を示す図である。
【図１１】「応答性確保区間指示」を用いたソースプログラムの一例を示す図である。
【図１２】「ストール挿入頻度指示」を用いたソースプログラムの一例を示す図である。
【図１３】「演算器開放頻度指示」を用いたソースプログラムの一例を示す図である。
【図１４】「逼迫度検出指示」を用いたソースプログラムの一例を示す図である。
【図１５】「実行サイクル期待値指示」を用いたソースプログラムの一例を示す図である。
【図１６】本発明の実施の形態２に係るオペレーティングシステムの構成を示すブロック図である。
【発明を実施するための形態】
【００３２】
以下、マルチスレッドプロセッサ等の実施形態について図面を参照して説明する。なお、実施の形態において同じ符号を付した構成要素は同様の動作を行うので、再度の説明を省略する場合がある。
【００３３】
（実施の形態１）
本実施の形態において、命令実行制御により命令実行効率を向上させるマルチスレッドプロセッサ、命令数の制限、制限する命令数のレジスタによる指定、制限する命令数の命令による指定、実行サイクル数間隔の指定、実行サイクル数間隔のレジスタによる指定、実行サイクル数間隔の命令による指定、資源制約のある命令の発行間隔の抑制について説明する。
【００３４】
図１は、本実施の形態におけるマルチスレッドプロセッサの構成を示すブロック図である。なお、本実施の形態では３つのスレッドを並列実行可能なマルチスレッドプロセッサを想定する。
【００３５】
マルチスレッドプロセッサ１は、命令メモリ１０１、第１命令デコーダ１０２、第２命令デコーダ１０３、第３命令デコーダ１０４、第１命令数指定部１０５、第２命令数指定部１０６、第３命令数指定部１０７、第１命令グループ化部１０８、第２命令グループ化部１０９、第３命令グループ化部１１０、第１レジスタ１１１、第２レジスタ１１２、第３レジスタ１１３、スレッド選択部１１４、命令発行制御部１１５、スレッドセレクタ１１６、スレッド用レジスタセレクタ１１７〜１１８、及び演算器群１１９を備える。
【００３６】
命令メモリ１０１は、マルチスレッドプロセッサ１において実行される命令を保持するメモリであり、３本の独立に実行されるスレッドの命令流を保持している。
【００３７】
第１命令デコーダ１０２、第２命令デコーダ１０３及び第３命令デコーダ１０４は、命令メモリ１０１から、それぞれ異なるスレッドの命令を読み出し、読み出した命令をデコードする処理部である。
【００３８】
第１命令数指定部１０５、第２命令数指定部１０６及び第３命令数指定部１０７は、それぞれ第１命令デコーダ１０２、第２命令デコーダ１０３及び第３命令デコーダ１０４でデコードされた命令を、同時実行可能な命令グループにグループ化する際の、同時実行可能な命令数を指定する処理部である。本実施の形態では、命令数の上限を３として説明する。命令数を指定する方法は、命令数を指定するための専用命令を各スレッドの命令流に含め、当該専用命令の実行により命令数を指定するようにしても良い。または、命令数を設定する専用レジスタを設け、各スレッドの命令流で専用レジスタの値を変更し命令数を指定するようにしても良い。
【００３９】
専用命令の実行により命令数を指定する場合には、アドレス設定やレジスタアクセスによるオーバーヘッドロスがない。このため、高速に命令数の変更が可能となる。また、スレッドの複数の箇所に、上記専用命令を挿入しておくことにより、スレッド内の複数の命令範囲において、異なる命令数を指定することが可能である。専用レジスタに命令数を設定する場合には、命令セットの体系を維持したまま、同時実行される命令数を制御することができる。
【００４０】
命令数の指定を、演算器資源の数や同時実行可能なスレッド数のバランスに合わせて変更することにより、命令実行効率を高められる。たとえば、演算器が４つあり、同時実行可能なスレッド数が２つある場合、命令数の上限を２としておくと、２つのスレッドが演算器を２つずつ使用することとなる。しかし、命令数の上限を３としておくと、各スレッドについて、最大３つの命令が１つの命令グループにグループ化される。このため、例えば、２つのスレッドのうち、一方のスレッドの命令グループに含まれる命令数が３であり、他方のスレッドの命令グループに含まれる命令数が２であった場合には、どちらか一方のスレッドのみしか実行することができず、未使用の演算器が生じるため、スレッドの実行効率が低下してしまう。
【００４１】
第１命令グループ化部１０８、第２命令グループ化部１０９及び第３命令グループ化部１１０は、第１命令デコーダ１０２、第２命令デコーダ１０３及び第３命令デコーダ１０４でそれぞれデコードされた命令を、同時実行可能な命令グループにグループ化する処理部である。なお、グループ化の際には、第１命令数指定部１０５、第２命令数指定部１０６及び第３命令数指定部１０７で設定された命令数を超えないように、命令のグループ化が行なわれる。
【００４２】
第１レジスタ１１１、第２レジスタ１１２及び第３レジスタ１１３は、各スレッドの命令による演算時に使用されるレジスタファイルである。
【００４３】
スレッド選択部１１４は、スレッド優先度に関する設定情報を保持し、スレッドの実行状況によって、実行するスレッドを選択する処理部である。スレッド優先度は、予め定められているものとする。
【００４４】
命令発行制御部１１５は、スレッド選択部１１４により選択されたスレッドを演算器群１１９に発行するために、スレッドセレクタ１１６、スレッド用レジスタセレクタ１１７及び１１８を制御する処理部である。また、命令発行制御部１１５は、演算器群１１９に発行したスレッドに関する発行命令情報をスレッド選択部１１４へ通知する。なお、本実施の形態では、同時実行可能なスレッド数は２とする。
【００４５】
スレッドセレクタ１１６は、命令発行制御部１１５の指示通りに実行スレッド（演算器群１１９で命令が実行されるスレッド）を選択するセレクタである。
【００４６】
スレッド用レジスタセレクタ１１７〜１１８は、スレッドセレクタ１１６と同様に、命令発行制御部１１５の指示通りに実行スレッドとセットとなるレジスタを選択するセレクタである。
【００４７】
演算器群１１９は、加算器や乗算器等の複数の演算器を含む処理部である。本実施の形態では、同時実行可能な演算器数は４とする。
【００４８】
図２は、図１に示したスレッド選択部１１４の詳細な構成を示すブロック図である。
【００４９】
スレッド選択部１１４は、第１発行間隔抑制部２０１、第２発行間隔抑制部２０２、第３発行間隔抑制部２０３、第１実行間隔指定部２０４、第２実行間隔指定部２０５、及び第３実行間隔指定部２０６を備える。
【００５０】
第１発行間隔抑制部２０１、第２発行間隔抑制部２０２及び第３発行間隔抑制部２０３の各々は、演算器群１１９の演算器数制限等により同時実行できない命令が、割り当てられたスレッドから発行された場合に、そのスレッドに対しその後一定期間だけ、その命令を発行させないよう抑制する処理部である。
【００５１】
第１実行間隔指定部２０４、第２実行間隔指定部２０５及び第３実行間隔指定部２０６の各々は、割り当てられたスレッドを一定間隔で実行するように、スレッドの実行間隔を指定する処理部である。実行間隔を指定する方法は、実行間隔を指定するための専用命令を各スレッドの命令流に含め、当該専用命令の実行により実行間隔を指定するようにしても良い。または、実行間隔を設定する専用レジスタを設け、各スレッドの命令流で専用レジスタの値を変更し実行間隔を指定するようにしても良い。実行間隔を指定することにより、優先度の高いスレッドが長時間資源を占有することを抑止でき、低優先度のスレッドの実行が局所的に停止してしまうことを防止できる。専用命令の実行により実行間隔を指定する場合には、アドレス設定やレジスタアクセスによるオーバーヘッドロスがない。また、スレッドの複数の箇所に、上記専用命令を挿入しておくことにより、スレッド内の複数の命令範囲において、異なる実行間隔を指定することが可能である。専用レジスタに実行間隔を設定する場合には、命令セットの体系を維持したまま、実行間隔を制御することができる。
【００５２】
なお、本実施の形態では、第１発行間隔抑制部２０１、第２発行間隔抑制部２０２、第３発行間隔抑制部２０３、第１実行間隔指定部２０４、第２実行間隔指定部２０５及び第３実行間隔指定部２０６は、それぞれ、実行サイクルが経過するごとに、値を１つデクリメントするダウンカウンタを含むものとする。
【００５３】
以降では、便宜上３つのスレッドをスレッドＡ、スレッドＢ、スレッドＣと呼称することとする。スレッドＡは、第１命令デコーダ１０２、第１命令数指定部１０５、第１命令グループ化部１０８、第１レジスタ１１１、第１発行間隔抑制部２０１及び第１実行間隔指定部２０４を利用して実行される。スレッドＢは、第２命令デコーダ１０３、第２命令数指定部１０６、第２命令グループ化部１０９、第２レジスタ１１２、第２発行間隔抑制部２０２及び第２実行間隔指定部２０５を利用して実行される。スレッドＣは、第３命令デコーダ１０４、第３命令数指定部１０７、第３命令グループ化部１１０、第３レジスタ１１３、第３発行間隔抑制部２０３及び第３実行間隔指定部２０６を利用して実行される。
【００５４】
次に、マルチスレッドプロセッサ１の動作について説明する。
【００５５】
図３は、マルチスレッドプロセッサ１の動作を示すフローチャートである。
【００５６】
第１命令デコーダ１０２、第２命令デコーダ１０３及び第３命令デコーダ１０４は、命令メモリ１０１に記憶されているスレッドＡ、Ｂ及びＣの命令流を、それぞれデコードする（ステップＳ００１）。
【００５７】
第１命令グループ化部１０８は、第１命令数指定部１０５で指定されている命令数を上限として、第１命令デコーダ１０２において認識されたスレッドＡの命令流を、演算器群１１９で同時実行可能な命令からなる命令グループにグループ化する。同様に、第２命令グループ化部１０９は、第２命令数指定部１０６で指定されている命令数を上限として、第２命令デコーダ１０３において認識されたスレッドＢの命令流を、演算器群１１９で同時実行可能な命令からなる命令グループにグループ化する。また、第３命令グループ化部１１０は、第３命令数指定部１０７で指定されている命令数を上限として、第３命令デコーダ１０４において認識されたスレッドＣの命令流を、演算器群１１９で同時実行可能な命令からなる命令グループにグループ化する（ステップＳ００２）。
【００５８】
命令発行制御部１１５は、スレッド選択部１１４が保持するスレッド優先度に関する設定情報と、ステップＳ００２の処理によりグループ化された命令の情報とに基づいて、実行可能なスレッドを２つ決定する（ステップＳ００３）。ここでは、スレッドＡ及びＣが、実行可能なスレッドとして決定されたものとして以降説明する。
【００５９】
スレッドセレクタ１１６は、スレッドＡ及びＣを、実行スレッドとして選択する。また、スレッド用レジスタセレクタ１１７は、スレッドＡ及びＣに対応する第１レジスタ１１１及び第３レジスタ１１３を選択する。演算器群１１９は、スレッドセレクタ１１６で選択されたスレッド（スレッドＡ及びＣ）の演算を、スレッド用レジスタセレクタ１１７で選択されたレジスタ（第１レジスタ１１１及び第３レジスタ１１３）に記憶されているデータを用いて実行する（ステップＳ００４）。
【００６０】
スレッド用レジスタセレクタ１１８は、スレッド用レジスタセレクタ１１７が選択したのと同じレジスタ（第１レジスタ１１１及び第３レジスタ１１３）を選択する。演算器群１１９は、スレッド（スレッドＡ及びＣ）の演算結果を、スレッド用レジスタセレクタ１１８が選択したレジスタ（第１レジスタ１１１及び第３レジスタ１１３）に書込む（ステップＳ００５）。
【００６１】
次に、スレッド選択部１１４及び命令発行制御部１１５によるスレッド選択処理について、図４のフローチャートを用いて説明する。
【００６２】
なお本説明では、第１発行間隔抑制部２０１は、スレッドＡより後述する発行間隔抑制命令が発行された場合には、その後、その発行間隔抑制命令を２マシンサイクルの間、発行するのを抑制する（禁止する）。ここで、発行間隔抑制命令とは、複数のスレッド間で演算器の競合を起こす命令のことである。同様に、第２発行間隔抑制部２０２は、スレッドＢより発行間隔抑制命令が発行された場合には、その後、その発行間隔抑制命令を２マシンサイクルの間、発行するのを抑制する（禁止する）。また、第３発行間隔抑制部２０３は、スレッドＣより発行間隔抑制命令が発行された場合には、その後、その発行間隔抑制命令を２マシンサイクルの間、発行するのを抑制する（禁止する）。このように、必要最小限の命令に対してのみ抑制をかけることができる。このため、実行効率を低下させること無く、他のスレッドへ資源を効率的に明け渡すことができる。
【００６３】
また、第１実行間隔指定部２０４は、演算器群１１９でスレッドＡの命令が２マシンサイクルに１回実行できるように実行サイクル間隔を指定しているものとする。同様に、第２実行間隔指定部２０５は、演算器群１１９でスレッドＢの命令が２マシンサイクルに１回実行できるように実行サイクル間隔を指定しているものとする。また、第３実行間隔指定部２０６は、演算器群１１９でスレッドＣの命令が２マシンサイクルに１回実行できるように実行サイクル間隔を指定しているものとする。
【００６４】
また、スレッドの優先度は、スレッドＡが一番高く、次にスレッドＢが高く、スレッドＣが一番優先度が低いものとする。
【００６５】
以下では、着目しているマシンサイクルの１つ前のマシンサイクルにおいて、スレッドＡ及びＣが実行され、スレッドＡにより発行間隔抑制命令が発行されたものとして、着目するマシンサイクルの動作について説明する。なお、説明する動作が１順目の動作であり、後述する２順目の動作と区別するために、各ステップのステップ番号に１順目であることを示すため“−１”を付与する。１順目の開始時には、第１発行間隔抑制部２０１、第２発行間隔抑制部２０２及び第３発行間隔抑制部２０３のダウンカウンタには０が設定されているものとする。また、第１実行間隔指定部２０４、第２実行間隔指定部２０５及び第３実行間隔指定部２０６のダウンカウンタには０が設定されているものとする。
【００６６】
スレッド選択部１１４は、命令発行制御部１１５から、前マシンサイクルにおいて実行されたスレッドＡ及びＣの実行状況を取得する（ステップＳ１０１−１）。つまり、スレッドＡ及びＣの実行された（発行された）命令が、発行間隔抑制命令であるか否かを示す情報を取得する。ここで、スレッド選択部１１４は、スレッドＡの実行された命令が、発行間隔抑制命令であることを示す情報を取得したものとする。
【００６７】
スレッドＡの発行間隔抑制命令が実行されたので、第１発行間隔抑制部２０１は、その発行間隔抑制命令を発行するのを抑制するサイクル数として、第１発行間隔抑制部２０１のダウンカウンタに２を設定する（ステップＳ１０２−１）。また、スレッドＡ及びＣが実行されたので、第１実行間隔指定部２０４及び第３実行間隔指定部２０６は、それらのダウンカウンタの値に１を設定する。
【００６８】
スレッド選択部１１４は、第１実行間隔指定部２０４及び第３実行間隔指定部２０６のダウンカウンタの値が１であり０ではないため、スレッドＡ及びＣを実行することができないと判断する。また、スレッド選択部１１４は、第２実行間隔指定部２０５のダウンカウンタの値が０であるため、スレッドＢを実行することができると判断する。このため、スレッド選択部１１４は、スレッドＢのみを実行対象スレッドとして選択し、命令発行制御部１１５へ通知する。また、スレッド選択部１１４は、選択したスレッドＢが最も優先度が高いことを合わせて通知する（ステップＳ１０３−１）。
【００６９】
命令発行制御部１１５は、スレッド選択部１１４から受けたスレッドＢの優先度情報と、第２命令グループ化部１０９によるスレッドＢの命令のグループ化の結果を示す情報とからスレッドＢを実行スレッドに決定する（ステップＳ１０４−１）。
【００７０】
命令発行制御部１１５は、スレッドセレクタ１１６、並びにスレッド用レジスタセレクタ１１７及び１１８を操作することにより、スレッドＢの命令を第２命令グループ化部１０９から演算器群１１９に送り、演算器群１１９がスレッドＢの命令を実行する（ステップＳ１０５−１）。
【００７１】
第１発行間隔抑制部２０１、第２発行間隔抑制部２０２、第３発行間隔抑制部２０３、第１実行間隔指定部２０４、第２実行間隔指定部２０５及び第３実行間隔指定部２０６の各々は、ダウンカウンタの値をそれぞれ１つデクリメントする（ステップＳ１０６−１）。このとき、ダウンカウンタの値が０の場合には、デクリメントは行なわずに、０が設定されたままとする。
【００７２】
以上のステップＳ１０１〜Ｓ１０６の処理を毎マシンサイクル実施する。上記説明の次のマシンサイクルについて引き続きステップを追って説明する。なお各ステップのステップ番号に２順目であることを示すため“−２”を付与する。なお、スレッドＡは再度、発行間隔抑制命令を実行しようとしているものとして説明する。
【００７３】
スレッド選択部１１４は、命令発行制御部１１５から、前マシンサイクルにおいて実行されたスレッドＢの実行状況を取得する（ステップＳ１０１−２）。つまり、スレッドＢの実行された命令には、発行間隔抑制命令は含まれていないことを示す情報を取得したものとする。
【００７４】
スレッドＢが実行されたので、第２実行間隔指定部２０５は、ダウンカウンタに１を設定する（ステップＳ１０２−２）。
【００７５】
スレッド選択部１１４は、第２実行間隔指定部２０５のダウンカウンタの値が１であり０ではないため、スレッドＢを実行することができないと判断する。また、スレッド選択部１１４は、第１実行間隔指定部２０４及び第３実行間隔指定部２０６のダウンカウンタの値が０であるため、スレッドＡ及びＣを実行することができると判断する。このため、スレッド選択部１１４は、スレッドＡ及びＣを実行対象スレッドとして選択し、命令発行制御部１１５に通知する。また、スレッド選択部１１４は、命令発行制御部１１５に、スレッドＡの優先度の方がスレッドＢの優先度よりも高いことをあわせて通知する。また、第１発行間隔抑制部２０１のダウンカウンタの値が１である。このため、スレッドＡの発行間隔抑制命令が発行されないようにするため、スレッド選択部１１４は、優先度情報に加えて、スレッドＡが発行間隔抑制命令の実行権がない事を命令発行制御部１１５へ通知する（ステップＳ１０３−２）。
【００７６】
命令発行制御部１１５は、スレッド選択部１１４から受けたスレッドＡ及びＣの優先度情報および発行間隔抑制命令の情報と、第１命令グループ化部１０８及び第３命令グループ化部１１０によるスレッドＡ及びＣの命令のグループ化の結果を示す情報とから、スレッドＡは発行間隔抑制命令の制限によって実行できないスレッドと判断し、スレッドＣを実行スレッドに決定する（ステップＳ１０４−２）。
【００７７】
命令発行制御部１１５は、スレッドセレクタ１１６、並びにスレッド用レジスタセレクタ１１７及び１１８を操作することにより、スレッドＣの命令を第３命令グループ化部１１０から演算器群１１９に送り、演算器群１１９がスレッドＣの命令を実行する（ステップＳ１０５−２）。
【００７８】
第１発行間隔抑制部２０１、第２発行間隔抑制部２０２、第３発行間隔抑制部２０３、第１実行間隔指定部２０４、第２実行間隔指定部２０５及び第３実行間隔指定部２０６の各々は、ダウンカウンタの値をそれぞれ１つデクリメントする（ステップＳ１０６−２）。このとき、ダウンカウンタの値が０の場合には、デクリメントは行なわずに、０が設定されたままとする。
【００７９】
なお、図４のフローチャートにおいて、マルチスレッドプロセッサ１の電源オフやリセットにより処理が終了する。
【００８０】
以上説明したように、実施の形態１に係るマルチスレッドプロセッサ１によると、スレッド間で演算資源が競合した場合でも、ユーザ指定やプロセッサ実装上のスレッド間の優先度において劣勢となるスレッドの実行効率が局所的に著しく落ちることを防ぐ事ができる。また、各スレッドの命令数と演算器資源数のバランスをとり、演算器資源を効率よく使用することができる。
【００８１】
なお、本実施の形態によれば、スレッド数を３としたがこの値に限定されることはなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【００８２】
また、本実施の形態によれば、同時命令発行数上限を３としたがこの値に限定されることはなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【００８３】
また、本実施の形態によれば、同時実行可能なスレッド数の上限を２としたがこの値に限定されることはなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【００８４】
また、本実施の形態によれば、同時実行可能な演算器数の上限を４としたがこの値に限定されることはなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【００８５】
（実施の形態２）
以下、図面を参照しながら本発明の実施の形態２に係るコンパイラおよびオペレーティングシステムについて説明する。
【００８６】
図５は、本発明の実施の形態２に係るコンパイラ３の構成を示すブロック図である。
【００８７】
コンパイラ３は、プログラマがＣ言語で記述したソースプログラム３０１を入力として受け、内部的な中間表現（中間コード）に変換して最適化や資源の割付を実施した後、ターゲットプロセッサ向けの実行形式コード３０２を生成する。コンパイラ３がターゲットとするプロセッサは実施の形態１にて説明したマルチスレッドプロセッサ１である。
【００８８】
以下で本発明に係るコンパイラ３の各構成要素の詳細な構成とその動作について説明していく。なお、コンパイラ３は、プログラムであり、プロセッサとメモリとを備えるコンピュータ上で、コンパイラ３の各構成要素を実現するためのプログラムを実行することにより、その機能を果たす。
【００８９】
コンパイラ３は、パーサ部３１と、最適化部３２と、コード生成部３３とを備える。
【００９０】
パーサ部３１は、コンパイラ３に入力されたソースプログラム３０１に対して、予約語（キーワード）等を抽出して字句解析および構文解析を行い、各ステートメントを一定規則に基づいて中間コードに変換する処理部である。
【００９１】
最適化部３２は、入力された中間コードに対して、冗長性の除去や命令スケジューリングやレジスタ割り付けといった最適化処理を実施する。
【００９２】
コード生成部３３は、最適化部３２から出力された中間コードに対して、内部に保持する変換テーブル等を参照することにより、全てのコードを機械語コードに置き換える。これにより、実行形式コード３０２を生成する。
【００９３】
最適化部３２は、マルチスレッド実行制御指示解釈部３２１と、命令スケジューリング部３２２と、実行状態検出コード生成部３２３と、実行制御コード生成部３２４とを備える。命令スケジューリング部３２２は、応答性確保スケジューリング部３２２１を備える。
【００９４】
マルチスレッド実行制御指示解釈部３２１は、プログラマによるマルチスレッド実行を制御するための指示を、コンパイルオプション、プラグマ指令（＃ｐｒａｇｍａ）、又は組み込み関数として受理する。マルチスレッド実行制御指示解釈部３２１は、受理した指示を、中間コードに格納して後段の命令スケジューリング部３２２等に引き渡す。
【００９５】
図６は、マルチスレッド実行制御指示解釈部３２１が受理するマルチスレッド実行制御のための指示の一覧を示す図である。以下、図６に示す各指示について、当該指示を用いたソースプログラム３０１の例を参照しながら説明する。
【００９６】
図７を参照して、「注力区間指示」とは、他のスレッドと比べて注力すべきソースプログラム３０１中の区間を“＃ｐｒａｇｍａ  ＿ｆｏｃｕｓ  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｆｏｃｕｓ  ｅｎｄ”とで囲むことにより指定する指示である。この指示に基づいて、コンパイラ３は、この区間にプロセッササイクルや演算資源を重点的に割くよう制御する。
【００９７】
図８を参照して、「非注力区間指示」とは、他のスレッドと比べてそれほど注力する必要のないソースプログラム３０１中の区間を、“＃ｐｒａｇｍａ  ＿ｕｎｆｏｃｕｓ  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｕｎｆｏｃｕｓ  ｅｎｄ”とで囲むことにより指定する指示である。この指示に基づいて、コンパイラ３は、この区間にはプロセッササイクルや演算資源をそれほど割かないように制御する。
【００９８】
図９を参照して、「命令並列度指示」とは、ソースプログラム３０１中の“＃ｐｒａｇｍａ  ＩＬＰ＝‘ｎｕｍ’  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＩＬＰ  ｅｎｄ”とで囲んだ区間の命令並列度を指定するための指示である。‘ｎｕｍ’の部分には１〜３のいずれかの数字が指定され、コンパイラ３は、指定された動作モードを設定するコードを生成するとともに、指定された命令並列度を想定した命令スケジューリングを実施する。図９には、‘ｎｕｍ’として「３」を指定した命令並列度指示が示されている。つまり、“＃ｐｒａｇｍａ  ＩＬＰ＝３  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＩＬＰ  ｅｎｄ”とで囲んだ区間の命令並列度として「３」が指定されている。
【００９９】
図１０を参照して、「マルチスレッド実行モード指示」とは、ソースプログラム３０１中の“＃ｐｒａｇｍａ  ＿ｓｉｎｇｌｅ＿ｔｈｒｅａｄ  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｓｉｎｇｌｅ＿ｔｈｒｅａｄ  ｅｎｄ”とで囲んだ区間を自スレッドのみのシングルスレッドモードで動作させるための指示である。この指示に基づき、コンパイラ３は、動作モードを設定するコード、つまり上記区間においてスレッドの実行数を１つとするコードを生成する。
【０１００】
図１１を参照して、「応答性確保区間指示」とは、ソースプログラム３０１中の“＃ｐｒａｇｍａ  ＿ｒｅｓｐｏｎｓｅ＝‘ｎｕｍ’  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｒｅｓｐｏｎｓｅ  ｅｎｄ”とで囲んだ区間について、他方のスレッドが最低限応答可能とする頻度を指定するための指示である。‘ｎｕｍ’の部分には、最低限何サイクルに１回は他方のスレッドが実行できるようにすべきかの数値が指定され、コンパイラ３は指定条件を満たすよう自スレッドの生成コードを調整する。図１１には、‘ｎｕｍ’として「１０」を指定した応答性確保区間指示が示されている。つまり、“＃ｐｒａｇｍａ  ＿ｒｅｓｐｏｎｓｅ＝１０  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｒｅｓｐｏｎｓｅ  ｅｎｄ”とで囲んだ区間においては、１０サイクルに１サイクルは、他方のスレッドが実行されるようにするための指示であり、この指示を満たすようにコードが生成される。例えば、一定頻度でストールサイクルが挿入されるコードや、一定頻度で演算器資源を解放するコードが生成される。
【０１０１】
図１２を参照して、「ストール挿入頻度指示」とは、ソースプログラム３０１中の“＃ｐｒａｇｍａ  ＿ｓｔａｌｌ＿ｆｒｅｑ＝‘ｎｕｍ’  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｓｔａｌｌ＿ｆｒｅｑ  ｅｎｄ”とで囲んだ区間について、最低限１つのストールサイクルが発生する頻度を指定するための指示である。‘ｎｕｍ’の部分には最低限何サイクルに１回はストールが発生するようにすべきかの数値が指定され、コンパイラ３は、指定条件を満たすように適宜ストールサイクルを挿入する。図１２には、‘ｎｕｍ’として「１０」を指定したストール挿入頻度指示が示されている。つまり、“＃ｐｒａｇｍａ  ＿ｓｔａｌｌ＿ｆｒｅｑ＝１０  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｓｔａｌｌ＿ｆｒｅｑ  ｅｎｄ”とで囲んだ区間においては、１０サイクルに１サイクルはストールサイクルが発生するようにコード生成される。
【０１０２】
図１３を参照して、「演算器開放頻度指示」とは、ソースプログラム３０１中の“＃ｐｒａｇｍａ  ＿ｒｅｌｅａｓｅ＿ｆｒｅｑ＝‘ｒｅｓ’：‘ｎｕｍ’  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｒｅｌｅａｓｅ＿ｆｒｅｑ  ｅｎｄ”とで囲んだ区間について、指定された演算器について最低限１回は未使用のサイクルが発生する頻度を指定するための指示である。‘ｒｅｓ’の部分には演算器の種類として‘ｍｕｌ’もしくは‘ｍｅｍ’が指定でき、‘ｍｕｌ’は乗算器を、“ｍｅｍ”はメモリアクセス装置をそれぞれ示している。‘ｎｕｍ’の部分には最低限、何サイクルに１回は指定された演算器の未使用サイクルが発生するようにすべきかの数値が指定され、コンパイラ３は指定条件を満たすように生成コードを調整する。図１３には、‘ｒｅｓ’として「ｍｕｌ」を指定し、‘ｎｕｍ’として「１０」を指定した演算器開放頻度指示が示されている。つまり、“＃ｐｒａｇｍａ  ＿ｒｅｌｅａｓｅ＿ｆｒｅｑ＝ｍｕｌ：１０  ｂｅｇｉｎ”と“＃ｐｒａｇｍａ  ＿ｒｅｌｅａｓｅ＿ｆｒｅｑ  ｅｎｄ”とで囲んだ区間においては、１０サイクルに１サイクルは指定された演算器である乗算器が使用されないサイクルが発生するようにコード生成される。
【０１０３】
図１４を参照して、「逼迫度検出指示」とは、期待される実行サイクル数に対してどの程度逼迫しているかを検出するための組み込み関数のセットである。関数＿ｇｅｔ＿ｔｉｇｈｔｎｅｓｓ＿ｓｔａｒｔ（）にてソースプログラム３０１中のサイクル数計測区間の起点を指定する。関数＿ｇｅｔ＿ｔｉｇｈｔｎｅｓｓ（ｎｕｍ）にて逼迫度を得ることができる。引数の“ｎｕｍ”には起点からの実行サイクル数の期待値もしくは保証すべき値が指定され、本関数は指定された数値に対する実際の実行サイクル数の比を返す。図１４には、‘ｎｕｍ’として「１０００」を指定した逼迫度検出指示が示されている。これにより、実際の実行サイクル数がｎであれば、関数＿ｇｅｔ＿ｔｉｇｈｔｎｅｓｓ（１０００）は、ｎ／１０００を返すことになる。
【０１０４】
また、この関数によりプログラマは処理の逼迫度を得ることができ、逼迫度に応じた制御をプログラムすることが可能である。例えば、逼迫度が１よりも大きい場合には、演算器資源を減少させたり、命令並列度を減少させたりするコードを生成してもよい。また、逼迫度が１よりも小さい場合には、演算器資源を増加させたり、命令並列度を増加させたりするコードを生成してもよい。
【０１０５】
図１５を参照して、「実行サイクル期待値指示」とは、期待される実行サイクル数を指示するための組み込み関数のセットである。関数＿ｅｘｐｅｃｔｅｄ＿ｃｙｃｌｅ＿ｓｔａｒｔ（）にてソースプログラム３０１中のサイクル計測区間の起点を指定する。関数＿ｅｘｐｅｃｔｅｄ＿ｃｙｃｌｅ（ｎｕｍ）にて実行サイクル数の期待値を指定する。引数の“ｎｕｍ”には起点からの実行サイクル数の期待値もしくは保証すべき値が指定さる。この関数によりプログラマが指定した期待値から、コンパイラ３もしくはオペレーティングシステム４が実際の処理の逼迫度を導出し、自動的に適切な実行サイクル数の制御を実施することが可能である。
【０１０６】
「自動制御指示」とは、自動的なマルチスレッド実行制御を実施することを指示するコンパイルオプションである。−ａｕｔｏ−ＭＴ−ｃｏｎｔｒｏｌ＝ＯＳオプションにてオペレーティングシステム４による自動制御を指示し、−ａｕｔｏ−ＭＴ−ｃｏｎｔｒｏｌ＝ＣＯＭＰＩＬＥＲオプションにてコンパイラ３による自動制御を指示する。
【０１０７】
再度、図５を参照して、命令スケジューリング部３２２は、入力された命令群の間の依存関係を保ちつつ適宜命令の並び替えを行うことにより、実行効率を向上させる最適化を実施する。なお、命令の並べ替えにあたっては、命令レベルの並列度を想定して並べ替えを実施する。前述の指示の中で、「注力区間指示」のされている区間については並列度３を想定し、「非注力区間指示」のされている区間については並列度１を想定し、「命令並列度指示」のされている区間については指示に従った並列度を想定する。デフォルトでは並列度３を想定する。
【０１０８】
また「マルチスレッド実行モード指示」のされている区間については、他方のスレッドが存在せず自スレッドのみがプロセッサ上で動作していることを想定して命令スケジューリングを実施する。
【０１０９】
命令スケジューリング部３２２は、応答性確保スケジューリング部３２２１を備える。
【０１１０】
応答性確保スケジューリング部３２２１は、前述の「応答性確保区間指示」もしくは「ストール挿入頻度指示」のされている区間について、先頭から順にサイクルを探索していき、指定された数値のサイクル数分ストールが発生しないサイクルが連続した場合には、ストールを発生させる“ｎｏｐ”命令を挿入し、また次の命令から探索を継続する。これによって、他方のスレッドが指定されたサイクルにつき１サイクルは確実に命令実行できることになる。
【０１１１】
また、前述の「演算器開放頻度指示」のされている区間については、命令スケジューリングの際に、指定された演算器を使用するサイクルをカウントしていき、指定された数値にカウンタが達した場合には、次のサイクルでは当該演算器は使用できないものとしてスケジューリングを行う。当該演算器が使用されないサイクルが発生すればカウントをリセットする。これによって、他方のスレッドは指定されたサイクルにつき１サイクルは当該演算器を使用することができることになる。
【０１１２】
実行状態検出コード生成部３２３は、前述の指示に対応して実行状態を検出するためのコードを挿入する。
【０１１３】
具体的には、前述の「逼迫度検出指示」に対応して、関数＿ｇｅｔ＿ｔｉｇｈｔｎｅｓｓ＿ｓｔａｒｔ（）が記述された部分に、プロセッサのサイクルカウントを開始するためのシステムコールを挿入する。そして、関数＿ｇｅｔ＿ｔｉｇｈｔｎｅｓｓ（ｎｕｍ）が記述された部分でプロセッサのサイクルカウントを読み出すシステムコールと、読み出したカウント値をｎｕｍとして与えられた期待値で除算した値を逼迫度として返すコードとを挿入する。この返り値によってプログラマが処理の逼迫度を知ることができる。
【０１１４】
また、前述の「実行サイクル期待値指示」に対応して、関数＿ｅｘｐｅｃｔｅｄ＿ｃｙｃｌｅ＿ｓｔａｒｔ（）が記述された部分に、プロセッサのサイクルカウントを開始するためのシステムコールを挿入する。それぞれの指示に対応して独立にサイクルカウントすることができる。
【０１１５】
そして、自動制御指示のコンパイルオプション−ａｕｔｏ−ＭＴ−ｃｏｎｔｒｏｌとしてＯＳが指定されている場合には、関数＿ｅｘｐｅｘｔｅｄ＿ｃｙｃｌｅ（ｎｕｍ）が記述された部分に、ｎｕｍで指示された実行サイクル数の期待値をオペレーティングシステム４に伝達して実行制御を促すためのシステムコールを挿入する。これに応じてオペレーティングシステム４にて実行制御を実施することができる。
【０１１６】
また自動制御指示のコンパイルオプション−ａｕｔｏ−ＭＴ−ｃｏｎｔｒｏｌとしてＣＯＭＰＩＬＥＲが指定されている場合には、関数＿ｅｘｐｅｘｔｅｄ＿ｃｙｃｌｅ（ｎｕｍ）が記述された部分に、プロセッサのサイクルカウントを読み出すシステムコールを挿入し、読み出したカウント値をｎｕｍとして与えられた期待値で除算して逼迫度を算出し、逼迫度が０．８以上の場合には後述の「注力区間」に対応した制御を、逼迫度が０．８未満の場合には後述の「非注力区間」に対応した制御を行うコードを挿入する。これによって、逼迫度に応じたマルチスレッド実行制御を実施するコードをコンパイラにて自動生成することができる。
【０１１７】
実行制御コード生成部３２４は、前述の指示に対応して実行を制御するためのコードを挿入する。
【０１１８】
具体的には、「注力区間指示」に対応して、区間のｂｅｇｉｎの部分に命令並列度を３に設定するシステムコールを挿入し、区間のｅｎｄの部分に元の設定に戻すシステムコールを挿入する。
【０１１９】
また「非注力区間指示」に対応して、区間のｂｅｇｉｎの部分に命令並列度を１に設定するシステムコールと他方のスレッドのサイクルが割り込まない実行モードに設定するコードを挿入し、区間のｅｎｄの部分に元の設定に戻すシステムコールを挿入する。
【０１２０】
さらに「命令並列度指示」に対応して、区間のｂｅｇｉｎの部分に命令並列度を指定された値に設定するシステムコールを挿入し、区間のｅｎｄの部分に元の設定に戻すシステムコールを挿入する。
【０１２１】
また「マルチスレッド実行モード指示命令並列度指示」に対応して、区間のｂｅｇｉｎの部分に単一スレッドモードに移行するためのシステムコールを挿入し、区間のｅｎｄの部分に元の設定に戻すシステムコールを挿入する。
【０１２２】
そして「実行サイクル期待値指示」および「自動制御指示」に対応して、前述のように検出した逼迫度に応じて「非注力区間」もしくは「注力区間」と同様の制御を行うコードを挿入する。
【０１２３】
以上のようなコンパイラ３の構成をとることにより、マルチスレッドプロセッサ１において、自スレッドの実行モードおよびプロセッサ資源の使用状況を制御できるようになり、必要に応じて自スレッドの処理に注力したり、他方のスレッドにプロセッサ資源を分け与えることができるようになる。また、自スレッドの処理に注力している場合でも、他方のスレッドにて所定の応答性を保証することが可能となる。また、実行時の実行サイクル数の情報を獲得して、それに基づいて逼迫度に応じて上記制御を行うことができ、きめ細かい性能チューニングおよびプロセッサ利用効率向上を図ることが可能となる。
【０１２４】
図１６は、本発明の実施の形態２に係るオペレーティングシステム４の構成を示すブロック図である。
【０１２５】
オペレーティングシステム４は、システムコール処理部４１と、プロセス管理部４２と、メモリ管理部４３と、ハードウェア制御部４４とを備える。なお、オペレーティングシステム４は、プログラムであり、プロセッサとメモリとを備えるコンピュータ上で、オペレーティングシステム４の各構成要素を実現するためのプログラムを実行することにより、その機能を果たす。なお、オペレーティングシステム４が動作するプロセッサは、実施の形態１に示したマルチスレッドプロセッサ１である。
【０１２６】
プロセス管理部４２は、オペレーティングシステム４上で動作する複数のプロセスについて優先度を与え、それに基づいて各プロセスに配分する時間を決定し、プロセスの切り替え等を制御する。
【０１２７】
メモリ管理部４３は、メモリの利用可能な部分の管理、メモリの割り当ておよび開放、主記憶と二次記憶との間でのスワップ等の制御を実施する。
【０１２８】
システムコール処理部４１は、アプリケーションプログラムへのカーネルのサービスであるシステムコールに対応した処理を提供する。
【０１２９】
システムコール処理部４１は、マルチスレッド実行制御システムコール処理部４１１と逼迫度検出システムコール処理部４１２を備える。
【０１３０】
マルチスレッド実行制御システムコール処理部４１１は、プロセッサのマルチスレッド動作を制御するためのシステムコールを処理する。
【０１３１】
具体的には、前述のコンパイラ３の実行制御コード生成部３２４の命令並列度を設定するシステムコールを受理して、プロセッサの動作命令並列度を設定するとともに元の命令並列度を保存しておく。そして、元の命令並列度に戻すシステムコールを受理して、保存しておいた元の命令並列度にプロセッサを設定する。さらに、単一スレッドモードに移行するシステムコールを受理して、プロセッサの動作モードを単一スレッドモードに設定するとともに元のスレッドモードを保存しておく。そして、元のスレッドモードに戻すシステムコールを受理して、保存しておいた元のスレッドモードにプロセッサを設定する。
【０１３２】
逼迫度検出システムコール処理部４１２は、処理の逼迫度を検出して対応するためのシステムコールを処理する。
【０１３３】
具体的には、前述のコンパイラ３の実行状態検出コード生成部３２３のプロセッサのサイクルカウントを開始するためのシステムコールを受理して、プロセッサのカウンタを獲得してカウントを開始する設定をする。また、現在のサイクルカウントを読み出すシステムコールを受理して、プロセッサの該当するカウンタの現在のカウント値を読み出し、その値を返す。さらに、実行サイクル数の期待値を伝達して実行制御を促すシステムコールを受理して、プロセッサの該当するカウンタの現在のカウント値を読み出し、その値と伝達された実行サイクル数の期待値から逼迫度を導出し、逼迫度に応じた実行制御を実施する。逼迫度が高い場合には当該プロセスの優先度を上げ、前述の「注力区間」に対応する制御を実施する。一方、逼迫度が低い場合には当該プロセスの優先度を下げ、前述の「非注力区間」に対応する制御を実施する。
【０１３４】
ハードウェア制御部４４は、システムコール処理部４１等で必要とされるハードウェアの制御のためのレジスタ設定および読み出しを実施する。
【０１３５】
具体的には、前述の命令並列度の設定および復帰、マルチスレッド動作モードの設定および復帰、サイクルカウンタの初期化、サイクルカウンタの読み出しに対応したハードウェアのレジスタ設定および読み出しを実施する。
【０１３６】
以上のようなオペレーティングシステム４の構成をとることにより、プログラムからのマルチスレッドプロセッサの動作制御が可能となり、各プログラムにプロセッサ資源を適切に配分することが可能となる。また、入力されたプログラマの想定する実行サイクル数の期待値とハードウェアから読み出した実際の実行サイクルの情報から逼迫度を検出して適切な制御を自動的に実施することも可能であり、プログラマのチューニング負担を軽減することができる。
【０１３７】
本発明は、以上の実施の形態に限定されることなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。例えば、以下のような変形が考えられる。
【０１３８】
（１）上記実施の形態２のコンパイラでは、Ｃ言語向けのコンパイラシステムを想定していたが、本発明はＣ言語のみに限定されるものではない。他のプログラミング言語を採用した場合でも本発明の有意性は保たれる。
【０１３９】
（２）上記実施の形態２のコンパイラでは、高級言語向けのコンパイラシステムを想定していたが、本発明はこれに限定されるものではない。例えば、アセンブラプログラムを入力とするアセンブラにも本発明を同様に適用することができる。
【０１４０】
（３）上記実施の形態２では、ターゲットプロセッサとして１サイクルに３命令発行可能で、同時に３スレッドを並行動作可能なプロセッサを想定していたが、本発明はこの同時発行命令数、スレッド数に限定されるものではない。
【０１４１】
（４）上記実施の形態２では、ターゲットプロセッサとしてスーパースカラプロセッサを想定していたが、本発明はこれに限定されるものではない。ＶＬＩＷ（Very Long Instruction Word）プロセッサに対しても本発明を適用することができる。
【０１４２】
（５）上記実施の形態２では、マルチスレッド実行制御指示解釈部への指示の方法としてプラグマ指令、組み込み関数、コンパイルオプションをそれぞれ規定していたが、本発明はこの規定に限定されるものではない。プラグマ指令としているものを組み込み関数で実現してもよいし、その逆も可能である。またアセンブラプログラムの場合には疑似命令として指示することも可能である。
【０１４３】
（６）上記実施の形態２では、マルチスレッド実行制御指示解釈部へ与える命令並列度指示として、プロセッサとして最小の１や最大の３を想定していたが、本発明はこの指定に限定されるものではない。プロセッサの能力の中間にあたる２などの並列度を指定してもよい。
【０１４４】
（７）上記実施の形態２では、マルチスレッド実行制御指示解釈部へ与える応答確保区間指示、ストール挿入頻度指示および演算器開放指示として、サイクル数としての頻度を与えていたが、本発明はこの指定に限定されるものではない。ミリ秒等の時間で指定してもよいし、高・中・低のように程度で指定するようにしてもよい。
【０１４５】
（８）上記実施の形態２では、マルチスレッド実行制御指示解釈部へ与える演算器開放頻度指示の演算器として乗算器およびメモリアクセスを想定していたが、本発明はこの指定に限定されるものではない。他の演算器を指定してもよいし、ロードとストアを分けるなどのようにより細かい単位で指定するようにしてもよい。
【０１４６】
（９）上記実施の形態２では、マルチスレッド実行制御指示解釈部へ与える逼迫度検出指示および実行サイクル期待値指示では、期待値をサイクル数で与えていたが、本発明はこの指定に限定されるものではない。ミリ秒等の時間で指定してもよいし、大・中・小のように程度で指定するようにしてもよい。
【０１４７】
（１０）上記実施の形態２のオペレーティングシステムでは、プロセス管理およびメモリ管理を伴う汎用オペレーティングシステムを想定していたが、機能を絞り込んだデバイスドライバのようなものでもよい。このような形態であってもＡＰＩを通してハードウェアの適切な制御を行うことが可能である。
【０１４８】
さらに、上記実施の形態及び上記変形例をそれぞれ組み合わせるとしても良い。
【０１４９】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味及び範囲内でのすべての変更が含まれることが意図される。
【産業上の利用可能性】
【０１５０】
以上のように、本発明にかかるマルチスレッドプロセッサは、スレッド間で演算資源が競合した場合でも、ユーザ指定やプロセッサ実装上のスレッド間の優先度において劣勢となるスレッドの実行効率が局所的に著しく落ちることを防ぎ、また各スレッドの命令数と演算器資源数のバランスを取り効率的な複数スレッド実行ができるという効果を有し、マルチスレッドプロセッサ及び当該マルチプロセッサを用いたアプリケーションソフトウェア等として有用である。
【符号の説明】
【０１５１】
１  マルチスレッドプロセッサ
３  コンパイラ
４  オペレーティングシステム
３１  パーサ部
３２  最適化部
４１  システムコール処理部
４２  プロセス管理部
４３  メモリ管理部
４４  ハードウェア制御部
１０１  命令メモリ
１０２  第１命令デコーダ
１０３  第２命令デコーダ
１０４  第３命令デコーダ
１０５  第１命令数指定部
１０６  第２命令数指定部
１０７  第３命令数指定部
１０８  第１命令グループ化部
１０９  第２命令グループ化部
１１０  第３命令グループ化部
１１１  第１レジスタ
１１２  第２レジスタ
１１３  第３レジスタ
１１４  スレッド選択部
１１５  命令発行制御部
１１６  スレッドセレクタ
１１７、１１８  スレッド用レジスタセレクタ
１１９  演算器群
２０１  第１発行間隔抑制部
２０２  第２発行間隔抑制部
２０３  第３発行間隔抑制部
２０４  第１実行間隔指定部
２０５  第２実行間隔指定部
２０６  第３実行間隔指定部
３０１  ソースプログラム
３０２  実行形式コード
３２１  マルチスレッド実行制御指示解釈部
３２２  命令スケジューリング部
３２３  実行状態検出コード生成部
３２４  実行制御コード生成部
４１１  マルチスレッド実行制御システムコール処理部
４１２  逼迫度検出システムコール処理部
３２２１  応答性確保スケジューリング部
【図１】
0005463076.tif 000002
【図２】
0005463076.tif 000003
【図３】
0005463076.tif 000004
【図４】
0005463076.tif 000005
【図５】
0005463076.tif 000006
【図６】
0005463076.tif 000007
【図７】
0005463076.tif 000008
【図８】
0005463076.tif 000009
【図９】
0005463076.tif 000010
【図１０】
0005463076.tif 000011
【図１１】
0005463076.tif 000012
【図１２】
0005463076.tif 000013
【図１３】
0005463076.tif 000014
【図１４】
0005463076.tif 000015
【図１５】
0005463076.tif 000016
【図１６】
0005463076.tif 000017