(57)【特許請求の範囲】
【請求項１】
複数のパイプラインステージを備え、所定の細粒度に複数個のスレッドを切り替えられるマルチスレッドプロセッサであって、
スレッド毎の命令流を制御するプログラムカウンタと、
前記プログラムカウンタの１つを選択するスレッド選択手段と、
前記スレッド選択手段が選択したプログラムカウンタの値に基づいて命令をフェッチする命令フェッチ手段と、
前記命令フェッチ手段から送出された前記命令を実行する命令実行手段と
を備え、
前記命令には、実行スレッドの切り替えを要求するためのスレッド切り替えフラグを命令語内部に含み、
前記スレッド切り替えフラグは、演算結果を得るのに所定値サイクルの遅延が生じる命令において、当該遅延サイクル中に存在する、当該演算結果を利用しない命令の数が、前記所定値サイクルの数よりも小さい場合に、実行スレッドの切り替えを要求することを指示するアクティブに設定され、
前記命令フェッチ手段は、フェッチした命令の命令語内部に含む、前記スレッド切り替えフラグが、アクティブに設定されている場合には、実行スレッドの切り替えを要求する指示を前記スレッド選択手段に伝達し、
前記スレッド選択手段は、該指示に基づいて、現在実行しているスレッドに対応するプログラムカウンタとは別のプログラムカウンタからのアドレスを選択して前記命令フェッチ手段に送出する
ことを特徴とするマルチスレッドプロセッサ。
【請求項２】
スレッド毎に、スレッドが実行されないサイクル数をカウントするスレッドカウンタと、
前記命令フェッチ手段がフェッチした命令をＮＯＰ命令に置き換えるＮＯＰ置換手段と
を更に備え、
前記スレッド選択手段は、実行するスレッドを切り替える際に、前記スレッドカウンタのカウンタ値が０である実行待ちのスレッドを次に実行するスレッドとして選択し、前記スレッドカウンタのカウンタ値が０である実行待ちのスレッドが１つもない場合に、ＮＯＰ命令への置き換えを前記ＮＯＰ置換手段に要求する
ことを特徴とする請求項１に記載のマルチスレッドプロセッサ。
【請求項３】
前記スレッドカウンタは、初期値として０を格納し、スレッドが切り替えられると、実行されていたスレッドに対応するスレッドカウンタは、実行されていたスレッドにおいて最後にフェッチされた命令のオペコードに基づいて決定される所定値を設定し、該所定値を、対応するスレッドが選択されていないサイクル毎に、０になるまでデクリメントし、
前記最後にフェッチされた命令のオペコードに基づいて決定される所定値は、該命令の演算結果を得るのに必要な遅延サイクル数に基づく値である
ことを特徴とする請求項２に記載のマルチスレッドプロセッサ。
【請求項４】
複数のパイプラインステージを備え、所定の細粒度に複数個のスレッドを切り替えられるマルチスレッドプロセッサとして機能させるプログラムであって、
前記マルチスレッドプロセッサを、
スレッド毎の命令流を制御するプログラムカウンタ、
前記プログラムカウンタの１つを選択するスレッド選択手段、
前記スレッド選択手段が選択したプログラムカウンタの値に基づいて命令をフェッチする命令フェッチ手段、
前記命令フェッチ手段から送出された前記命令を実行する命令実行手段
として機能させ、
前記命令には、実行スレッドの切り替えを要求するためのスレッド切り替えフラグを命令語内部に含み、
前記スレッド切り替えフラグは、演算結果を得るのに所定値サイクルの遅延が生じる命令において、当該遅延サイクル中に存在する、当該演算結果を利用しない命令の数が、前記所定値サイクルの数よりも小さい場合に、実行スレッドの切り替えを要求することを指示するアクティブに設定され、
前記命令フェッチ手段は、フェッチした命令の命令語内部に含む、前記スレッド切り替えフラグが、アクティブに設定されている場合には、実行スレッドの切り替えを要求する指示を前記スレッド選択手段に伝達し、
前記スレッド選択手段は、該指示に基づいて、現在実行しているスレッドに対応するプログラムカウンタとは別のプログラムカウンタからのアドレスを選択して前記命令フェッチ手段に送出する
ように機能させることを特徴とするプログラム。
【請求項５】
前記マルチスレッドプロセッサを、
スレッド毎に、スレッドが実行されないサイクル数をカウントするスレッドカウンタ、
前記命令フェッチ手段がフェッチした命令をＮＯＰ命令に置き換えるＮＯＰ置換手段
として更に機能させ、
前記スレッド選択手段は、実行するスレッドを切り替える際に、前記スレッドカウンタのカウンタ値が０である実行待ちのスレッドを次に実行するスレッドとして選択し、前記スレッドカウンタのカウンタ値が０である実行待ちのスレッドが１つもない場合に、ＮＯＰ命令への置き換えを前記ＮＯＰ置換手段に要求する
ように機能させることを特徴とする請求項４に記載のプログラム。
【請求項６】
前記スレッドカウンタは、初期値として０を格納し、スレッドが切り替えられると、実行されていたスレッドに対応するスレッドカウンタは、実行されていたスレッドにおいて最後にフェッチされた命令のオペコードに基づいて決定される所定値を設定し、該所定値を、対応するスレッドが選択されていないサイクル毎に、０になるまでデクリメントし、
前記最後にフェッチされた命令のオペコードに基づいて決定される所定値は、該命令の演算結果を得るのに必要な遅延サイクル数に基づく値である
ように機能させることを特徴とする請求項５に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチスレッドプロセッサ及びプログラムに関する。
【背景技術】
【０００２】
ＩＴ技術の進展に伴い、コンピュータが処理するデータ量は増加の一途にある。これら大量ののデータを高速に処理するため、様々なタイプのプロセッサが提案されている。
例えば、ＶＬＩＷ(Very Long Instruction Word)と称されるプロセッサでは、複数の命令語（例えば、演算命令、ロード命令など）を１つの超長命令（ＶＬＩＷ）にパックし、これら複数の命令語を同時に実行する。この場合、プログラムのコンパイル時に、命令間の順序関係やデータ依存関係を解析し、同時に実行することが可能な命令群を抽出する。
これにより、ランタイムオーバーヘッド無しに、複数命令の同時実行による性能向上を実現している。
【０００３】
一方、アウトオブオーダ実行型のプロセッサの場合は、同時に実行することが可能な命令群の解析を、プログラムのランタイムにおいてハードウェアで実行する。また、多数の実行前の命令を格納するバッファを持ち、実行に必要なオペランドが揃った命令から順に実行する。この方式によれば、プログラム順序に制約されることなく、同時に実行することが可能な命令群を抽出して同時に実行することができる。しかし、１つのプログラム（スレッド）において、同時に実行可能な命令数には限りがあり、平均的には、２〜３命令／１サイクルが上限とされており、これ以上に性能を向上することが困難となっていた。
【０００４】
このため、近年では、複数のスレッドを同時実行することにより、更なる性能向上を実現するマルチスレッドプロセッサが提案されている。マルチスレッドプロセッサでは、複数のスレッドにより、演算器やメモリの読み書きを行う機構を共有する、一方で、ソフトウェアから可視なレジスタや状態レジスタをスレッド毎に別々に用意することにより、１つのプロセッサ上で、複数スレッドの同時実行を可能としている。
マルチスレッドプロセッサにおけるスレッドの切り替え方式として、複数のスレッドをクロックサイクル単位に切り替える細粒度マルチスレッディング方式(Fine grained multithreading)、複数のスレッドの内から、同時に実行可能な命令を抽出して実行する同時マルチスレッディング方式(Simultaneous multithreading)、及びキャッシュミスのような長いストールが発生した場合にのみ、実行するスレッドを切り替える粗粒度マルチスレッディング(Coarse grained multithreading)方式などが提案されている。
【０００５】
この分野の公知例として、例えば、特許文献１には、粗粒度マルチスレッディング方式を採用したマルチスレッドプロセッサの例が開示されている。この特許文献１に開示された技術では、長時間のストールを発生させるキャッシュミスなどの事象の発生をハードウェアで検知し、これをトリガーとして、実行するスレッドの切り替えを行い、異なるスレッドの実行を継続する。これにより、プロセッサが長時間に渡ってストールしてしまうことを防ぎ、単位時間当たりの処理性能を向上させることができる。また、長時間に渡り、ストールなどのスレッドを切り替える事象が発生しない場合には、所定の一定時間が経過した時点で、他のスレッドに切り替える機構も実装している。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００６−４０１４１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ところで、上記背景技術にあっては、他方で、より高性能なプロセッサを実現する必要性から、プロセッサで実行する個々の命令の内容も、より複雑化しており、浮動小数演算などのような複雑な命令が出現している。これらの命令では、演算結果が得られるまでの遅延が長いため、命令のオペランド間に依存がある場合などには、依存が無い命令を遅延サイクル内に配置する工夫が考えられる。しかし、遅延が長い命令の場合には、遅延サイクルを埋めるのに十分な、依存が無い命令を確保することが困難なケースも存在する。
このため、前述の特許文献１に開示された技術と同様に、命令間の依存関係をハードウェアで検知し、この検出をトリガーとして、実行するスレッドの切り替えを行い、異なるスレッドの実行を継続する実装が考えられる（図６参照）。
【０００８】
図６は、従来のマルチスレッドプロセッサの１構成例を示す構成図である。
同図に示す従来のマルチスレッドプロセッサは、スレッドの命令流を制御するプログラムカウンタ９１(PC0〜PC3 ）と、実行するスレッドを選択するスレッド選択部９２と、命令メモリから命令を読み出す命令フェッチ部９３と、命令を実行する命令実行部９４と、命令間のオペランド依存関係を検出する依存検知部９５と、から構成される。
図６に示すプロセッサは、近年の他のプロセッサと同様に、動作周波数の向上を実現するため複数のパイプラインステージから構成されている。
【０００９】
図７は、従来のマルチスレッドプロセッサで実行されるプログラムの１例を示す説明図である。
同図に例示するプログラムは、演算結果が得られるまでの遅延が長い浮動少数点命令(fmul/fadd/fsub)を実行するものであり、fmulのデスティネーション(r[1] と、faddのソースオペランド(r[1])間に依存関係が存在する場合である。
【００１０】
図８は、従来のマルチスレッドプロセッサでプログラムを実行した場合のスレッド切り替え方法の１例を示す説明図である。
図６に示すプロセッサで、図７に例示するプログラムを実行すると、実行するスレッドは、図８に示すように切り替わる。
図６に示すプロセッサでは、命令実行部で実行中の命令（図８に示すスレッド１のfmul）のデスティネーション番号と、命令フェッチ部がフェッチ済みの命令（図８に示すスレッド１のfadd）のソースオペランド番号を、依存検知部９５（図６）が比較することにより、依存検知部９５は、命令間の依存関係を検知する。
【００１１】
依存が検知されたタイミング（図８に示す３サイクル目）では、データ依存関係が存在するために実行できない命令（図８に示すスレッド１のfadd）がフェッチ済みである。このため、図８に示す３サイクル目において、実行するスレッドを、スレッド１からスレッド２へと切り替えたとしても、スレッド２のfmovが命令フェッチ部９３（図６）からフェッチできるのは、図８の４サイクル目になってからとなる。このため、図６に示すマルチスレッドプロセッサでは、１サイクルの間、有効な命令を実行することができないことになる。  
【００１２】
図９は、図６に示す従来のマルチスレッドプロセッサを改良したマルチスレッドプロセッサの１構成例を示す構成図である。
同図に示すマルチスレッドプロセッサは、図６に示すマルチスレッドプロセッサを拡張したマルチスレッドプロセッサであり、前述のスレッド切り替えに伴って、１サイクルの間、有効な命令を実行することができなくなる状態の発生を防ぐための実装を備える。
図９に示すマルチスレッドプロセッサでは、図６に示すマルチスレッドプロセッサに、スレッド毎の命令バッファ９６と、命令選択部９７とが追加されており、依存検知部９５の接続先としては、スレッド選択部９１に加えて、命令選択部９７が追加されている。
【００１３】
図９に示すマルチスレッドプロセッサでは、命令フェッチ部９３から読み出された命令を、一旦命令バッファ９６に格納した後、このバッファ９６に格納された命令を命令選択部９７が選択し、命令実行部９４へと供給する構成となっている。このように構成することにより、スレッド切り替えが発生した際には、連続して有効な命令を実行することができる。
しかし、命令バッファ９６の、各スレッドに対応する単位バッファの各々は、２サイクル分以上の命令をバッファできるものであることが必要となる。スレッド切り替えの判断を行った時点では、命令バッファ９６からは、切り替える前のスレッドの命令が読み出されている。このため、命令バッファ９６が１サイクル分の命令のみをバッファする場合では、スレッドを切り替えた直後のサイクルでは、命令バッファ９６から、実行可能な命令を読み出すことができないことになる。
【００１４】
図１０は、従来のマルチスレッドプロセッサでプログラムを実行した場合のスレッド切り替え方法の他の１例を示す説明図である。
図９に示す従来のマルチスレッドプロセッサは、演算結果が得られるまでの遅延が長い命令の場合には、データ依存の有無に関わらず、必ずスレッドを切り替えるように制御している。しかし、こうした構成の場合は、図１０に示すような、遅延サイクルを利用したプログラミングができない。何故なら、データ依存の有無に関わらず、必ずスレッドを切り替えるように制御すると、遅延が長い命令（図１０に示すスレッド１のfmul）の遅延サイクルに、データ依存の無い命令（図１０に示すスレッド１のfadd）を配置できる場合であっても、スレッドの切り替えが行われてしまうことになるからである。
また、他に実行可能なスレッドが無い場合などには、有効な命令を継続して実行することができない。
【００１５】
本発明の目的は、上術した課題を解決するマルチスレッドプロセッサ及びプログラムを提供することにある。
【課題を解決するための手段】
【００１６】
上記課題を解決するために、本発明の第１の形態によると、複数のパイプラインステージを備え、所定の細粒度に複数個のスレッドを切り替えられるマルチスレッドプロセッサであって、スレッド毎の命令流を制御するプログラムカウンタと、プログラムカウンタの１つを選択するスレッド選択手段と、スレッド選択手段が選択したプログラムカウンタの値に基づいて命令をフェッチする命令フェッチ手段と、命令フェッチ手段から送出された命令を実行する命令実行手段とを備え、命令には、実行スレッドの切り替えを要求するためのスレッド切り替えフラグを命令語内部に含み、スレッド切り替えフラグは、演算結果を得るのに所定値サイクルの遅延が生じる命令において、当該遅延サイクル中に存在する、当該演算結果を利用しない命令の数が、所定値サイクルの数よりも小さい場合に、実行スレッドの切り替えを要求することを指示するアクティブに設定され、命令フェッチ手段は、フェッチした命令の命令語内部に含む、スレッド切り替えフラグが、アクティブに設定されている場合には、実行スレッドの切り替えを要求する指示をスレッド選択手段に伝達し、スレッド選択手段は、該指示に基づいて、現在実行しているスレッドに対応するプログラムカウンタとは別のプログラムカウンタからのアドレスを選択して命令フェッチ手段に送出する。
【００１７】
本発明の第２の形態によると、複数のパイプラインステージを備え、所定の細粒度に複数個のスレッドを切り替えられるマルチスレッドプロセッサとして機能させるプログラムであって、マルチスレッドプロセッサを、スレッド毎の命令流を制御するプログラムカウンタ、プログラムカウンタの１つを選択するスレッド選択手段、スレッド選択手段が選択したプログラムカウンタの値に基づいて命令をフェッチする命令フェッチ手段、命令フェッチ手段から送出された命令を実行する命令実行手段として機能させ、命令には、実行スレッドの切り替えを要求するためのスレッド切り替えフラグを命令語内部に含み、スレッド切り替えフラグは、演算結果を得るのに所定値サイクルの遅延が生じる命令において、当該遅延サイクル中に存在する、当該演算結果を利用しない命令の数が、所定値サイクルの数よりも小さい場合に、実行スレッドの切り替えを要求することを指示するアクティブに設定され、命令フェッチ手段は、フェッチした命令の命令語内部に含む、スレッド切り替えフラグが、アクティブに設定されている場合には、実行スレッドの切り替えを要求する指示をスレッド選択手段に伝達し、スレッド選択手段は、該指示に基づいて、現在実行しているスレッドに対応するプログラムカウンタとは別のプログラムカウンタからのアドレスを選択して命令フェッチ手段に送出するように機能させる。
【発明の効果】
【００１８】
以上説明したように、本発明のマルチスレッドプロセッサによれば、複数個のスレッドを細粒度のクロックサイクル単位で切り替えるマルチスレッドプロセッサにおいて、実行する命令の命令語内部に設けられたスレッド切り替えフラグに基づいて、実行するスレッドを切り替えることが可能となり、これにより、単位時間当たりの命令処理量を増加させると共にスループット性能を向上させることができるマルチスレッドプロセッサを提供できる効果がある。
【図面の簡単な説明】
【００１９】
【図１】本発明の実施形態に係るマルチスレッドプロセッサの基本構成を示す構成図である。
【図２】本実施形態に係るマルチスレッドプロセッサで用いられる命令形式の１例を示す命令構成図である。
【図３】本発明の実施形態に係るマルチスレッドプロセッサでプログラムを実行した場合のスレッド切り替え方法の１例を示す説明図である。
【図４】本発明の実施形態に係るマルチスレッドプロセッサが実行する命令の、命令語中に設けられたスレッド切り替えフラグ(tcf) を設定する処理の手順を説明するフローチャート図である。
【図５】本発明の実施形態に係るマルチスレッドプロセッサの１実施例としての構成を示す構成図である。
【図６】従来のマルチスレッドプロセッサの１構成例を示す構成図である。
【図７】従来のマルチスレッドプロセッサで実行されるプログラムの１例を示す説明図である。
【図８】従来のマルチスレッドプロセッサでプログラムを実行した場合のスレッド切り替え方法の１例を示す説明図である。
【図９】図６に示す従来のマルチスレッドプロセッサを改良したマルチスレッドプロセッサの１構成例を示す構成図である。
【図１０】従来のマルチスレッドプロセッサでプログラムを実行した場合のスレッド切り替え方法の他の１例を示す説明図である。
【発明を実施するための形態】
【００２０】
以下、本発明のマルチスレッドプロセッサの実施形態について、図面を参照して詳細に説明する。
但し、本発明の実施の形態は、下記の実施の形態に限定されることはなく、本発明の技術的範囲に属する限り、他の様々な形態をとり得る。  
【００２１】
図１は、本発明の実施形態に係るマルチスレッドプロセッサの基本構成を示す構成図である。
同図に示す本発明の実施形態に係るマルチスレッドプロセッサは、実行する命令の命令語内部に設けられたスレッド切り替えフラグに基づいて、実行するスレッドを切り替えることを特徴とする。
図１に示す本実施形態のマルチスレッドプロセッサは、基本構成として、スレッドの命令流を制御するプログラムカウンタ１(PC0〜PC3)と、実行するスレッドを選択するスレッド選択部２と、スレッド選択部２が選択したスレッドのプログラムカウンタ値に基づき、命令メモリ（図示は省略）から命令を読み出す命令フェッチ部３と、命令フェッチ部３が読み出した命令を実行する命令実行部４、とを備える。
【００２２】
図１に示す本実施形態のマルチスレッドプロセッサでは、４つのスレッドを切り替える構成を示しているが、一般に、本発明に係るマルチスレッドプロセッサは、必ずしも、この実施形態に限るものではなく、切り替えることができるスレッドの数は、任意である。
また、本実施形態のマルチスレッドプロセッサは、近年のプロセッサと同様、動作周波数の向上を実現するために、複数のパイプラインステージから構成されるものとする。
さらに、図１に示す本実施形態のマルチスレッドプロセッサでは、命令フェッチステージと命令実行ステージとの２つのパイプラインステージを備えた構成を示しているが、一般に、本発明に係るマルチスレッドプロセッサは、必ずしも、このような構成に限るものではなく、プロセッサを構成するパイプラインステージの数は、任意である。
【００２３】
図２は、本実施形態に係るマルチスレッドプロセッサで用いられる命令形式の１例を示す命令構成図である。
同図に示すように、本実施形態に係るマルチスレッドプロセッサで用いられる命令形式は、実行する命令の種類を指定するオペコード(Opcode)と、演算の対象データを指定するソースオペランド(r1/r2) と、演算結果の保存先を指定するデスティネーション(r3)と、実行するスレッドの切り替えを指示するスレッド切り替えフラグ(tcf)と、を含む。
【００２４】
図２に示す命令形式では、２個のソースオペランドと、１個のデスティネーションとを含む命令形式としたが、一般に、本発明に係るマルチスレッドプロセッサで用いられる命令形式は、必ずしも、これに限定されるものではなく、ソースオペランドの個数や、デスティネーションの個数は、例えば、０個の場合や、３個の場合であっても構わない。また、命令形式に、上記とは異なるフィールド( 例えば、単なる値など) を含んでいても構わない。
【００２５】
以下、本発明の実施形態に係るマルチスレッドプロセッサの機能を説明する。
まず、命令フェッチ部３は、スレッド選択部２から指定されたアドレスに従って、図２に示す命令形式の命令を、命令メモリ（図示は省略）からフェッチする。その後、命令フェッチ部３は、フェッチした命令の命令語の内部に設けられたスレッド切り替えフラグ(tcf)がアクティブである場合に、実行するスレッドの切り替えをスレッド選択部２に要求する（より具体的には、内部フラグ（図示は省略）のスレッド切り替え要求をアクティブに設定する）。
スレッド選択部２は、内部フラグのスレッド切り替え要求がアクティブであることを検知し、現在実行しているスレッドに対応するプログラムカウンタとは、別のプログラムカウンタからのアドレスを選択し、前記アドレスを命令フェッチ部３へと送出する。
【００２６】
図３は、本発明の実施形態に係るマルチスレッドプロセッサでプログラムを実行した場合のスレッド切り替え方法の１例を示す説明図である。
図３では、図１に示すマルチスレッドプロセッサにおいて、前述の図７に示すプログラムを実行した場合に、実行するスレッドがどのように切り替わるかを示している。
前述の図７に示すプログラム例の場合、fmul命令の命令語内部に設けられたスレッド切り替えフラグがアクティブに設定される。また、図３に示すIa-bは、スレッドaのb 番目の命令を示す。
【００２７】
まず、図３に示すように、２サイクル目にスレッド１のfmul(I1-2)がフェッチされた段階で、fmul(I1-2)命令の命令語内部に設けられたスレッド切り替えフラグがアクティブであることをトリガーとして、図１のスレッド選択部が、実行するスレッドを、スレッド１(PC1)からスレッド２(PC2)に切り替える。３サイクル目では、スレッド２のfmov(I2-1)命令が、命令フェッチ部からフェッチされる。同様に、４サイクル目では、スレッド２(PC2)からスレッド３(PC3)への切り替えが行われる。  
【００２８】
図４は、本発明の実施形態に係るマルチスレッドプロセッサが実行する命令の、命令語中に設けられたスレッド切り替えフラグ(tcf)を設定する処理の手順を説明するフローチャート図である。
以下、図１〜３を参照しながら、図４に示すフローチャート図を使用して、本実施形態に係るマルチスレッドプロセッサが実行する命令の、命令語中に設けられたスレッド切り替えフラグ(tcf)を設定する処理の手順を説明する。
【００２９】
なお、同図に示すスレッド切り替えフラグ(tcf)の設定は、プログラマが生成したアセンブルプログラムまたはコンパイラが生成したマシン語プログラム、若しくはマシン語プログラムに対応したコンパイラの用いる中間言語記述を対象としてオペランドの依存関係等を分析することにより行うことが可能であり、この分析は、本発明の実施形態に係るコンピュータプログラムである専用のプログラムを実行して行うことが可能である。
また、この専用のプログラムは、前記のコンパイラ自体に含ませることも可能であり、さらに、コンパイラの実行後に実行される他のベーシックソフトに含ませることも可能である。ここでは、この専用のプログラムは、前記コンパイラ等のベーシックソフトに含まれているものとして説明する。
【００３０】
なお、前述の本発明の実施形態に係る専用のプログラムを実行して作成されたプログラムも、また、本発明の実施形態に係るコンピュータプログラムである。
（ステップＳ１）
まず、入力となるアセンブルプログラム、またはマシン語プログラム、または中間言語記述における各命令に対して、各命令の演算結果を得るのに、Ｎ(>0)サイクルの遅延を生じるか否かを検査する。このため、ステップＳ１では、命令列を出力するコンパイラ等のベーシックソフトが、一時変数Ｓに１を代入し、以後、１番目の命令から順に、（一時変数Ｓの値）番目の命令を検査する用意をする。
【００３１】
（ステップＳ２）
次に、ステップＳ２では、前記コンパイラ等のベーシックソフトが、（一時変数Ｓの値）番目の命令が、演算結果を得るのにＮ(>0)サイクルの遅延が生じるか否かを検証し、演算結果を得るのにＮ(>0)サイクルの遅延が生じない場合には、一時変数Ｓの新しい値を、（一時変数Ｓの値）＋１番目とするために、ステップＳ１０に移る。他方、演算結果を得るのにＮ(>0)サイクルの遅延が生じる場合は、ステップＳ３に進む。
（ステップＳ３）
ステップＳ３では、前記コンパイラ等のベーシックソフトが、一時変数Ｔに１を代入し、かつ一時変数Ｃに０を代入し、（一時変数Ｓの値）に後続する命令間のオペランド依存関係を検証する準備を行う。
【００３２】
（ステップＳ４）
次に、ステップＳ４では、前記コンパイラ等のベーシックソフトが、（Ｓ＋１）番目から(Ｓ＋Ｎ)番目の各命令が、Ｓ番目の命令の演算結果を利用するか否かを検証し、（Ｓ＋１）番目から( Ｓ＋Ｎ)番目の各命令が、Ｓ番目の命令の演算結果を利用しない場合はステップＳ５に進む。他方、（Ｓ＋１）番目から(Ｓ＋Ｎ)番目の各命令が、Ｓ番目の命令の演算結果を利用する場合はステップＳ６に移る。
（ステップＳ５）
ステップＳ５では、前記コンパイラ等のベーシックソフトが、一時変数Ｃの値に１を加え、ステップＳ６に進む。
【００３３】
（ステップＳ６）
ステップＳ６では、前記コンパイラ等のベーシックソフトが、一時変数Ｔの値に１を加え、ステップＳ７に進む。
（ステップＳ７）
ステップＳ７では、前記コンパイラ等のベーシックソフトが、Ｔ＞Ｎか否かを検証し、Ｔ＞ＮであればステップＳ８に進む。他方、Ｔ＞Ｎでない場合はステップＳ４に戻る。
（ステップＳ８）
ステップＳ８では、前記コンパイラ等のベーシックソフトが、Ｃ＜（Ｎ／２）か否かを検証し、Ｃ＜（Ｎ／２）であればステップＳ９に進む。他方、Ｃ＜（Ｎ／２）でない場合はステップＳ１０に移る。
【００３４】
（ステップＳ９）
ステップＳ９では、前記コンパイラ等のベーシックソフトが、Ｓ番目の命令のスレッド切り替えフラグ(tcf)をアクティブに設定し、ステップＳ１０に進む。
（ステップＳ１０）
ステップＳ１０では、前記コンパイラ等のベーシックソフトが、一時変数Ｓの値に１を加え、ステップＳ１１に進む。
（ステップＳ１１）
ステップＳ１１では、前記コンパイラ等のベーシックソフトが、Ｓ≧プログラムの命令数か否かを検証し、Ｓ≧プログラムの命令数でなければステップＳ２に戻る。他方、Ｓ≧プログラムの命令数であれば直ちに処理を終了する。
【００３５】
この手順では、Ｓ番目の命令の演算結果を利用しない命令の数をカウントする。即ち、（Ｓ＋１)番目の命令から順に、（Ｓ＋Ｔ）番目の命令を検査し、（Ｓ＋Ｔ）番目の命令が、Ｓ番目の命令の演算結果を利用しない場合には、一時変数Ｃをカウントアップする。
この検査を（Ｓ＋Ｎ）番目の各命令に対して、順次行い、Ｓ番目の命令の演算結果を利用しない命令の数（Ｃ）に基づき、Ｓ番目の命令のスレッド切り替えフラグ(tcf)の設定を行うものである。また、利用しない命令の数（Ｃ）が、演算結果が得られるまでのサイクル数（Ｎ）の半分より小さければ、Ｓ番目の命令のスレッド切り替えフラグ(tcf)をアクティブに設定するのである。以上の処理を、プログラム中の全命令に対して行う。
このようにして、各命令のスレッド切り替えフラグ(tcf)を設定することができる。
【００３６】
なお、図４に示す処理手順では、スレッド切り替えフラグ(tcf)を設定するのに、演算結果を利用しない命令の数（Ｃ）が、演算結果が得られるまでのサイクル数（Ｎ）の半分より小さいことを条件としているが、一般に、本発明では、必ずしもこの条件に限るものではなく、例えば、ＣがＮより小さいことや、ＣがＮの１／４よりも小さいこと等をスレッド切り替えフラグ(tcf)を設定するための条件としてもよい。
【００３７】
図５は、本発明の実施形態に係るマルチスレッドプロセッサの１実施例としての構成を示す構成図である。
同図に示すマルチスレッドプロセッサは、実行する命令の命令語内部に設けられたスレッド切り替えフラグに基づき、実行するスレッドを切り替えるマルチスレッドプロセッサである。
図５に示すように、本発明の実施形態に係るマルチスレッドプロセッサの１実施例としてのマルチスレッドプロセッサは、スレッドの命令流を制御するプログラムカウンタ１(PC0〜PC3)と、スレッド毎に、スレッドが実行されないサイクル数をカウントするスレッドカウンタ１０(TC0〜TC3)と、実行するスレッドを選択するスレッド選択部２と、スレッド選択部が選択したスレッドのプログラムカウンタ値に基づき、命令メモリから命令を読み出す命令フェッチ部３と、後述するＮＯＰ置換部１２が送出する命令を実行する命令実行部４と、ＮＯＰ(None Operation)命令を送出するＮＯＰ１１と、スレッド選択部２の指示に基づいてフェッチされた命令をＮＯＰ命令に置き換えるＮＯＰ置換部１２と、から構成される。
【００３８】
図５に示すマルチスレッドプロセッサでは、４つのスレッドを切り替えるマルチスレッドプロセッサを示しているが、一般に、本発明に係るマルチスレッドプロセッサは、必ずしも、この実施例に限定されるものではない。また、切り替えるスレッドの数は任意である。また、図５に示すマルチスレッドプロセッサは、近年の他のマルチスレッドプロセッサと同様に、動作周波数の向上を実現するために、複数のパイプラインステージから構成されるものとする。
さらに、図５に示すマルチスレッドプロセッサでは、命令フェッチステージと命令実行ステージとの２つのステージを示しているが、一般に、本発明に係るマルチスレッドプロセッサは、必ずしも、この実施例に限定されるものではない。プロセッサを構成するパイプラインステージの数は任意である。
【００３９】
以下、図５に示したマルチスレッドプロセッサの機能を、特に、図１に示したマルチスレッドプロセッサの機能との相違点に留意して説明する。
図５に示すマルチスレッドプロセッサは、図１に示したマルチスレッドプロセッサと同様に、図２に示す命令形式の命令を実行し、フェッチされた命令の命令語内部に設けられたスレッド切り替えフラグ(tcf)がアクティブである場合に、スレッド選択部２が、実行するスレッドを切り替える。その際に、スレッド選択部２は、各スレッドに対応するスレッドカウンタ１０のカウント値に基づき、次に選択するスレッドを決定する。具体的には、スレッドカウンタ１０のカウント値が０であるスレッドを、次に実行するスレッドとして選択する。
【００４０】
スレッドカウンタ１０の各スレッドカウンタ(TC0〜TC3)には、初期値として０が格納されていて、スレッドが切り替えられると、元々実行されていたスレッドに対応するスレッドカウンタには、所定の値が格納される。そして、０以外の値が格納されるスレッドカウンタは、対応するスレッドが選択されていないサイクル毎に、０になるまでデクリメントされる。
スレッドが切り替えられる際に、スレッドカウンタ１０に格納される所定の値は、元々実行していたスレッドにおいて、最後にフェッチされた命令のオペコード(Opcode)に基づき決定される。例えば、あるオペコードに該当する命令が、演算結果を得るのにＮ(>0)サイクルの遅延が生じる場合には、所定の値として、（Ｎ−１）の値がスレッドカウンタに格納される。このため、スレッドカウンタ１０に格納される所定の値は、当該オペコードに基づいて制御されるセレクタ（図示は省略)によって選択され、該選択された値がスレッドカウンタに供給される。  
【００４１】
このようなスレッドカウンタ１０を用いることにより、スレッドＡからスレッドＢに切り替えた後、スレッドＡにおけるデータ依存関係が解消する前に、再び、スレッドＡが選択されることを防ぐことができる。
一方、ＮＯＰ置換部１２は、スレッド選択部２からの制御に基づき、命令フェッチ部３が読み出した命令を、ＮＯＰ(None OPeration)命令に置き換える。具体的には、スレッドを切り替える際に、スレッド選択部２が、他に実行可能なスレッドが無いことを検知した場合に、スレッド選択部２は、ＮＯＰ命令への置き換えを、ＮＯＰ置換部１２に対して要求する（より具体的には、ＮＯＰ置換要求を示す内部フラグをアクティブに設定する) 。なお、スレッド選択部２は、実行中のスレッド以外に、スレッドカウンタ１０のカウント値が０である実行待ちのスレッドが、１つも無い場合に、他に実行可能なスレッドが無いと判断する。  
【００４２】
この１実施例としてのマルチスレッドプロセッサでは、スレッドカウンタ１０の初期値として０を設定し、オペコードに基づいて設定された所定値をデクリメントする構成としているが、一般に、本発明に係るマルチスレッドプロセッサは、必ずしも、この実施例に限定されるものではなく、初期値は０以外の値であっても構わない。また、スレッドカウンタ１０をインクリメントする構成であっても構わない。
【産業上の利用可能性】
【００４３】
本発明は、複数個のスレッドを細粒度のクロックサイクル単位で切り替えられるマルチスレッドプロセッサの構築に適用することができる。特に、命令間のオペランド依存関係に基づくスレッド切り替え機能を、確実に（即ち、任意に深い最適化レベルで）実現できると共に、低コストのハードウェアでも実現することができるマルチスレッドプロセッサの構築に好適である。
【符号の説明】
【００４４】
１  プログラムカウンタ
２  スレッド選択部
３  命令フェッチ部
４  命令実行部
１０  スレッドカウンタ
１２  ＮＯＰ置換部
【図１】
0005573038.tif 000002
【図２】
0005573038.tif 000003
【図３】
0005573038.tif 000004
【図４】
0005573038.tif 000005
【図５】
0005573038.tif 000006
【図６】
0005573038.tif 000007
【図７】
0005573038.tif 000008
【図８】
0005573038.tif 000009
【図９】
0005573038.tif 000010
【図１０】
0005573038.tif 000011