(57)【要約】  マルチスレッドパイプラインプロセッサにおいて複数のスレッドを処理する方法、及びそのようなマルチスレッドパイプラインプロセッサを提供する。本発明は、スレッドを処理する方法及びプロセッサを提供する。スレッドは、複数の逐次命令を含み、複数の逐次命令は、一部の短い待ち時間命令、及び一部の長い待ち時間命令、並びに少なくとも１つの障害命令を含み、障害命令は、この障害命令が処理される前に１つ又はそれよりも多くの先行命令が処理されることを必要とする。本方法は、ａ）各長い待ち時間命令を処理する前に、スレッドに関連付けられたカウンタを１だけ増分する段階、ｂ）各長い待ち時間命令が処理された後に、スレッドに関連付けられたカウンタを１だけ減分する段階、ｃ）各障害命令を処理する前に、スレッドに関連付けられたカウンタの値を検査する段階、及びｉ）カウンタの値がゼロであった場合に障害命令を処理する段階、又はｉｉ）カウンタの値が非ゼロであった場合に障害命令の処理を後の時点まで休止する段階を含む。プロセッサは、本方法の段階ａ）、ｂ）、及びｃ）を実行するための手段を含む。【選択図】図１
2010522920.tif 000002
【特許請求の範囲】
【請求項１】
スレッドが、複数の逐次命令を含み、該複数の逐次命令が、一部の短い待ち時間命令、及び一部の長い待ち時間命令、及び少なくとも１つの障害命令を含み、該障害命令が、該障害命令が処理される前に１つ又はそれよりも多くの先行命令が処理されることを要求する、パイプラインプロセッサにおいてスレッドを処理する方法であって、
ａ）各長い待ち時間命令を処理する前に、スレッドに関連付けられたカウンタを１だけ増分する段階、
ｂ）各長い待ち時間命令が処理された後に、前記スレッドに関連付けられた前記カウンタを１だけ減分する段階、
ｃ）各障害命令を処理する前に、前記スレッドに関連付けられた前記カウンタの値を検査する段階、及び
ｉ）前記カウンタの値がゼロであった場合に前記障害命令を処理する段階、又は
ｉｉ）前記カウンタの値が非ゼロであった場合に前記障害命令を処理する段階を後の時点まで休止する段階、
を含むことを特徴とする方法。
【請求項２】
各々にそれぞれのカウンタが関連付けられた複数のスレッドを処理するためのものであることを特徴とする請求項１に記載の方法。
【請求項３】
前記プロセッサにおける前記又は各スレッドは、いかなる一時点においても、処理されているか、又は処理されるのを待っているか、又は請求項１の段階ｃ）ｉｉ）に従って休止されているかのいずれかであることを特徴とする請求項１又は請求項２に記載の方法。
【請求項４】
いかなる一時点においても、前記複数のスレッドの部分集合が、処理されていることを特徴とする請求項３に記載の方法。
【請求項５】
前記スレッドの部分集合を該部分集合内の各スレッドから１つの命令をラウンドロビン方式で実行することによって処理する段階を更に含むことを特徴とする請求項４に記載の方法。
【請求項６】
前記部分集合内のスレッドの個数が、短い待ち時間命令を処理するのに必要とされる最大クロック刻み回数に等しいことを特徴とする請求項４又は請求項５に記載の方法。
【請求項７】
スレッドの最後の命令を処理した後に、該スレッドを前記複数のスレッドの前記部分集合から削除する段階、
を更に含むことを特徴とする請求項４から請求項６のいずれか１項に記載の方法。
【請求項８】
請求項１の段階ｃ）ｉｉ）に従って休止された命令を有するあらゆるスレッドに関連付けられた前記カウンタの前記値を定期的に検査して、スレッドの該カウンタの該値がゼロであった場合に、このスレッドを処理待ち状態へと移行する段階、
を更に含むことを特徴とする請求項３から請求項７のいずれか１項に記載の方法。
【請求項９】
前記検査する段階は、クロック刻み毎に実施されることを特徴とする請求項８に記載の方法。
【請求項１０】
前記プロセッサは、いかなる一時点においても前記複数のスレッドの位置のうちのゼロ、１つ、又はそれよりも多くが空きであるように、該複数のスレッドまでのあらゆる個数のスレッドを処理するように配置されることを特徴とする請求項２から請求項９のいずれか１項に記載の方法。
【請求項１１】
前記又は各スレッドには、複数Ｎ個のそれぞれのカウンタが関連付けられており、
段階ｃ）は、
各障害命令を処理する前に、前記スレッドに関連付けられた前記Ｎ個のカウンタのうちの少なくとも１つの前記値を検査する段階、及び
ｉ）前記少なくとも１つのカウンタの前記値の全てがゼロであった場合に前記障害命令を処理する段階、又は
ｉｉ）前記少なくとも１つのカウンタの前記値の１つ又はそれよりも多くが非ゼロであった場合に、前記障害命令を処理する段階を後の時点まで休止する段階、
を含む、
ことを特徴とする請求項１から請求項１０のいずれか１項に記載の方法。
【請求項１２】
各長い待ち時間命令は、前記少なくともＮ個のカウンタのうちのどれを該長い待ち時間命令が処理される前に増分し、かつ該長い待ち時間命令が処理された後に減分すべきであるかの指示を含むことを特徴とする請求項１１に記載の方法。
【請求項１３】
各障害命令には、該障害命令が処理される前に前記Ｎ個のカウンタのうちのどれを検査すべきであるかの指示を含む命令が先行することを特徴とする請求項１２に記載の方法。
【請求項１４】
各障害命令が、該障害命令が処理される前に前記Ｎ個のカウンタのうちのどれを検査すべきであるかの指示を含むことを特徴とする請求項１２に記載の方法。
【請求項１５】
コンピュータ手段上で実行された時に請求項１から請求項１４のいずれか１項に記載の方法を該コンピュータ手段に実施させるコンピュータプログラム。
【請求項１６】
請求項１５に記載のコンピュータプログラムを記憶した記録担体。
【請求項１７】
スレッドが、複数の逐次命令を含み、該複数の逐次命令が、一部の短い待ち時間命令、及び一部の長い待ち時間命令、及び少なくとも１つの障害命令を含み、該障害命令が、該障害命令が処理される前に１つ又はそれよりも多くの先行命令が処理されることを要求する、スレッドを処理するためのパイプラインプロセッサであって、
スレッドに関連付けられたカウンタ、
各長い待ち時間命令が処理される前に前記カウンタを１だけ増分するための手段、
各長い待ち時間命令が処理された後に前記カウンタを１だけ減分するための手段、及び
各障害命令が処理される前に前記スレッドに関連付けられた前記カウンタの値を検査して、ｉ）該カウンタの値がゼロであった場合に該障害命令を処理し、又はｉｉ）該カウンタの値が非ゼロであった場合に該障害命令の処理を後の時点まで休止するための手段、
を含むことを特徴とするプロセッサ。
【請求項１８】
前記カウンタを増分し、かつ該カウンタを減分する前記手段は、短い待ち時間命令と長い待ち時間命令の間の区別を付けることができる命令復号器を含むことを特徴とする請求項１７に記載のプロセッサ。
【請求項１９】
スレッドマネージャを更に含み、
前記カウンタは、前記命令復号器によって維持されるが、前記スレッドマネージャによってアクセスすることができる、
ことを特徴とする請求項１８に記載のプロセッサ。
【請求項２０】
障害命令が処理される前に前記スレッドに関連付けられた前記カウンタの値を検査するための前記手段は、該障害命令と残りの命令との間の区別を付けることができる前記命令復号器を含むことを特徴とする請求項１８又は請求項１９に記載のプロセッサ。
【請求項２１】
各々がそれぞれのカウンタに関連付けられた複数のスレッドを処理するのに適することを特徴とする請求項１７から請求項２０のいずれか１項に記載のプロセッサ。
【請求項２２】
プロセッサにおける前記又は各スレッドは、いかなる一時点においても、処理されているか、又は処理されるのを待っているか、又は請求項１６のｉｉ）に従って休止されているかのいずれかであることを特徴とする請求項１７から請求項２１のいずれか１項に記載のプロセッサ。
【請求項２３】
いかなる一時点においても、前記複数のスレッドの部分集合が、処理されていることを特徴とする請求項２２に記載のプロセッサ。
【請求項２４】
スレッドの前記部分集合を該部分集合内の各スレッドから１つの命令をラウンドロビン方式で実行することによって処理するための手段を更に含むことを特徴とする請求項２３に記載のプロセッサ。
【請求項２５】
前記部分集合内のスレッドの個数が、短い待ち時間命令を処理するのに要求される最大クロック刻み回数に等しいことを特徴とする請求項２３又は請求項２４に記載のプロセッサ。
【請求項２６】
スレッドの最後の命令を処理した後に、該スレッドを前記複数のスレッドの前記部分集合から削除するように配置されることを特徴とする請求項２３から請求項２５のいずれか１項に記載のプロセッサ。
【請求項２７】
請求項１７のｉｉ）に従って休止された命令を有するあらゆるスレッドに関連付けられた前記カウンタの前記値を定期的に検査して、スレッドの該カウンタの該値がゼロであった場合にこのスレッドを処理待ち状態へと移行させるように配置されることを特徴とする請求項２３から請求項２６のいずれか１項に記載のプロセッサ。
【請求項２８】
クロック刻み毎に前記カウンタの前記値を検査するように配置されることを特徴とする請求項２７に記載のプロセッサ。
【請求項２９】
いかなる一時点においても前記複数のスレッドの位置のうちのゼロ、１つ、又はそれよりも多くが空きであるように、該複数のスレッドまでのあらゆる個数のスレッドを処理するように配置されることを特徴とする請求項２１から請求項２８のいずれか１項に記載のプロセッサ。
【請求項３０】
前記又は各スレッドには、複数Ｎ個のそれぞれのカウンタが関連付けられており、該スレッドに関連付けられた該カウンタの値を検査するための前記手段は、
各障害命令が処理される前に前記スレッドに関連付けられた前記Ｎ個のカウンタのうちの少なくとも１つの前記値を検査して、ｉ）該少なくとも１つのカウンタの該値の全てがゼロであった場合に該障害命令を処理し、又はｉｉ）該少なくとも１つのカウンタの該値のうちの１つ又はそれよりも多くが非ゼロであった場合に該障害命令の処理を後の時点まで休止するための手段、
を含む、
ことを特徴とする請求項１７から請求項２９のいずれか１項に記載のプロセッサ。
【請求項３１】
各長い待ち時間命令が、前記少なくともＮ個のカウンタのうちのどれを該長い待ち時間命令が処理される前に増分し、かつ該長い待ち時間命令が処理された後に減分すべきかの指示を含むことを特徴とする請求項３０に記載のプロセッサ。
【請求項３２】
各障害命令には、該障害命令が処理される前に前記Ｎ個のカウンタのうちのどれを検査すべきかの指示を含む命令が先行することを特徴とする請求項３１に記載のプロセッサ。
【請求項３３】
各障害命令が、該障害命令が処理される前に前記Ｎ個のカウンタのうちのどれを検査すべきかの指示を含むことを特徴とする請求項３１に記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、パイプラインプロセッサにおいてスレッドを処理する方法及びそのようなパイプラインプロセッサに関する。特に、しかし、非限定的に、本発明は、マルチスレッドパイプラインプロセッサにおいて複数のスレッドを処理する方法、及びそのようなマルチスレッドパイプラインプロセッサに関する。
【背景技術】
【０００２】
コンピュータアーキテクチャでは、パイプラインプロセッサ内で発生する可能性があるデータ障害が問題である。パイプラインプロセッサにおける命令は、いかなる所定の時点においてもいくつかの命令が実行中であるように、いくつかの段で実行され、これらの命令は、望ましい順序で完了しない場合がある。データ障害は、これらの同時の場合によっては順序が狂った命令のうちの２つ又はそれよりも多くが衝突してエラーを引き起こす時に発生する。
【０００３】
データ障害は、データが修正される時に発生する。データ障害は、以下の状況で発生する可能性がある。１）書込み後の読取り（ＲＡＷ）：オペランドが修正され、その直後に読み出される。最初の命令がオペランドへの書込を終了していない場合があるから、第２の命令は、不正なデータを用いる場合がある。２）読取り後の書込み（ＷＡＲ）：オペランドを読取り、その直後にその同じオペランドに書込みを行う。読取りの前に書込みが終了している場合があるから、読取り命令は、新しい書込み値を不正に取得する場合がある。３）書込み後の書込み（ＷＡＷ）：同じオペランドに書込みを行う２つの命令が実行される。最初のものが第２のものを終了させる場合があり、従って、オペランドに不正なデータ値を残す。データ障害に係わるオペランドは、メモリ又はレジスタに常駐する可能性がある。
【０００４】
パイプラインプロセッサの命令セットは、標準の命令と比較して非常に長い待ち時間を有する特別な命令を含む場合がある。主な例は、メモリからデータを取り出す命令であろう。データ障害問題は、短い待ち時間命令、すなわち、少ないクロック刻み回数内で完了することができる命令では回避することが比較的容易であり、なぜなら、そのために特定のスレッド内の命令を出された順序で完了することを保証することが比較的容易であるからである。しかし、スレッド内に長い待ち時間命令が含まれる時には、特定のスレッド内にある命令は、出された順序で完了することにはならない可能性が高いので、データ障害問題はより重大である。
【０００５】
これらの問題は、あらゆる種類の状況、例えば、３Ｄグラフィックプロセッサにおいて、実時間入力を受け取る専用メディアＣＰＵを含む「中央演算処理装置（ＣＰＵ）」において、更にマルチプロセッサシステムとの通信において発生する。
長い待ち時間命令に対処するために、プロセッサは、理想的には、命令が完了するのを待っているスレッドをスワップアウトする機構を提供すべきである。しかし、ある一定の要件も満たす必要がある。
【０００６】
第一に、マルチスレッドプロセッサでは、多くのスレッドが、潜在的データ障害、すなわち、処理される前に先行命令が完了していることに依存する命令を有するかもしれない。
第二に、各スレッドは、全てがストリーム内で隣接する可能性がある大量の長い待ち時間命令を有するかもしれない。長い待ち時間命令からの戻りデータが、それらが送出されたものとは異なる順序で戻って来ることを許すことができなければならない。いくつかの長い待ち時間命令が一度に処理される可能性があるとすると、長い待ち時間命令からのデータ障害に起因するプロセッサの停止をできる限り低減すべきである。
【０００７】
第三に、スレッド内に分岐が存在するスレッド内のあらゆる命令、特に、処理される前に先行命令が完了していることに依存することからデータ障害を引き起こすかもしれないものを飛ばして進むことができなければならない。
第四に、書き込まれたものとは異なる順序で結果を読取ることができなければならない。第五に、宛先の複数の読取りアクセスに対するペナルティがあってはならない。第六に、同じ宛先が別の長い待ち時間命令に対する宛先として書込まれ、かつ再使用されることも同じく許されるべきである。
最後に、長い待ち時間命令及び潜在的データ障害命令を処理するのに専用又は大容量ストレージが必要とされないことが好ましい。また、ゲート費用が最小に保たれることも好ましい。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明の目的は、長い待ち時間演算におけるデータ障害問題を軽減又は克服するスレッドを処理する方法及び装置を提供することである。
【課題を解決するための手段】
【０００９】
本発明の第１の態様に従って、パイプラインプロセッサにおいてスレッドを処理する方法を提供し、スレッドは、複数の逐次命令を含み、複数の逐次命令は、一部の短い待ち時間命令、及び一部の長い待ち時間命令、並びに少なくとも１つの障害命令を含み、障害命令は、この障害命令が処理される前に１つ又はそれよりも多くの先行命令が処理されることを必要とし、本方法は、ａ）各長い待ち時間命令を処理する前に、スレッドに関連付けられたカウンタを１だけ増分する段階、ｂ）各長い待ち時間命令が処理された後に、スレッドに関連付けられたカウンタを１だけ減分する段階、ｃ）各障害命令を処理する前に、スレッドに関連付けられたカウンタの値を検査する段階、及びｉ）カウンタの値がゼロであった場合に障害命令を処理する段階、又はｉｉ）カウンタの値が非ゼロであった場合に障害命令の処理を後の時点まで休止する段階を含む。
【００１０】
従って、１つ又はそれよりも多くの長い待ち時間命令が処理中であり、依然として未処理であることを意味するカウンタが非ゼロである場合には、障害命令は、保留される。これは、いずれかの先行スレッドの前に障害命令が処理され、それによってデータ障害を引き起こす可能性がないことを意味する。短い待ち時間命令は、ある一定の所定のクロック刻み回数内で完了することができる命令である。長い待ち時間命令は、完了するのに所定のクロック刻み回数よりも多くのクロック刻み回数を必要とする命令である。
【００１１】
好ましくは、本方法は、複数のスレッドを処理するためのものであり、各スレッドは、これらのスレッドに関連付けられたそれぞれのカウンタを有する。複数のスレッドは、いかなる一時点でも常駐することができるスレッドである。好ましい実施形態では、常駐スレッドの個数は１６である。
好ましくは、プロセッサ内の上述の又は各スレッドは、いかなる一時点においても、処理されているか、又は処理されるのを待っているか、又は段階ｃ）ｉｉ）に従って休止されているかのいずれかである。好ましくは、いかなる一時点においても、複数のスレッドの部分集合が処理されている。１つの好ましい実施形態では、部分集合内のスレッドの個数は４である。好ましくは、本方法は、更に、スレッドの部分集合を、部分集合内の各スレッドからの１つの命令をラウンドロビン方式で実行することによって処理する段階を含む。
【００１２】
有利な態様においては、部分集合内のスレッドの個数は、短い待ち時間命令を処理するのに必要とされる最大クロック刻み回数に等しい。従って、短い待ち時間命令では、データ障害の可能性は存在しない。
一実施形態では、本方法は、更に、スレッドの最後の命令を処理した後に、このスレッドを複数のスレッドの部分集合から削除する段階を含む。従って、スレッドが完全に処理された状態で、部分集合内に利用可能な空間ができる。
【００１３】
好ましくは、本方法は、更に、段階ｃ）ｉｉ）に従って休止されている命令を有するあらゆるスレッドに関連付けられたカウンタの値を定期的に検査する段階、及びスレッドのカウンタの値がゼロであった場合に、このスレッドを処理待ち状態へと移行する段階を含む。従って、スレッドのカウンタがゼロまで減少した状態で、未処理のままの長い待ち時間命令が存在しないことが分る。すなわち、スレッドの休止（段階ｃ）ｉｉ）による）を解除することができる。一実施形態では、検査段階は、全てのクロック刻みにおいて実施される。
【００１４】
好ましくは、プロセッサは、いかなる一時点においても、複数のスレッド位置のうちのゼロ、１つ、又はそれよりも多くが空きであるようにこの複数のスレッドを最大数とするあらゆる個数のスレッドを処理するように構成される。
好ましくは、上述の又は各スレッドは、これらのスレッドに関連付けられた複数のＮ個のそれぞれのカウンタを有し、本方法の段階ｃ）は、各障害命令を処理する前に、スレッドに関連付けられたＮ個のカウンタのうちの少なくとも１つの値を検査する段階、及びｉ）少なくとも１つのカウンタの値の全てがゼロであった場合に障害命令を処理する段階、又はｉｉ）少なくとも１つのカウンタの値のうちの１つ又はそれよりも多くが非ゼロであった場合に障害命令の処理を後の時点まで休止する段階を含む。
【００１５】
次に、好ましくは、各長い待ち時間命令は、この長い待ち時間命令が処理される前に、少なくともＮ個のカウンタのうちのどれを増分すべきであるか、並びにこの長い待ち時間命令が処理された後に、少なくともＮ個のカウンタのうちのどれを減分すべきであるかという指示を含む。
また、好ましくは、各障害命令には、その障害命令が処理される前に、Ｎ個のカウンタのうちのどれを検査すべきであるかという指示を含む命令が先行するか、又は各障害命令自体が、その障害命令が処理される前に、Ｎ個のカウンタのうちのどれを検査すべきであるかという指示を含むかのいずれかである。
【００１６】
この構成を用いて、Ｎ個の障害カウンタの使用を最適化することができる。例えば、特定の障害命令は、最初の長い待ち時間命令が処理されることに依存するものとすることができるが、第２の長い待ち時間命令には依存しないものとすることができる。この場合には、最初の長い待ち時間命令は、この最初の命令が処理される前にｎ番目のカウンタを増分すべきであるという指示を含むことができ、第２の長い待ち時間命令は、この第２の命令が処理される前にｍ番目のカウンタを増分すべきであるという指示を含むことができる。次に、障害命令は、この障害命令が処理される前に、Ｎ個のカウンタのうちのｎ番目のカウンタを検査するだけでよいという指示を含むことができる。
また、コンピュータ手段上で実行された時に、このコンピュータ手段に本発明の第１の態様の方法を実施させるコンピュータプログラムも提供する。そのようなコンピュータプログラムが記憶された記録担体も提供する。
【００１７】
本発明の第２の態様に従って、スレッドを処理するためのパイプラインプロセッサを提供し、スレッドは、複数の逐次命令を含み、複数の逐次命令は、一部の短い待ち時間命令、及び一部の長い待ち時間命令、並びに少なくとも１つの障害命令を含み、障害命令は、この障害命令が処理される前に１つ又はそれよりも多くの先行命令が処理されることを必要とし、プロセッサは、スレッドに関連付けられたカウンタ、各長い待ち時間命令が処理される前にカウンタを１だけ増分するための手段、各長い待ち時間命令が処理された後にカウンタを１だけ減分するための手段、及び各障害命令が処理される前にスレッドに関連付けられたカウンタの値を検査して、ｉ）カウンタの値がゼロで合った場合に障害命令を処理するか、又はｉｉ）カウンタの値が非ゼロであった場合に障害命令の処理を後の時点まで休止するための手段を含む。
【００１８】
１つの好ましい実施形態では、カウンタを増分し、カウンタを減分するための手段は、短い待ち時間命令と長い待ち時間命令の間の区別を付けることができる命令復号器を含む。
１つの好ましい実施形態では、プロセッサは、更にスレッドマネージャを含み、カウンタは、命令復号器によって維持されるが、スレッドマネージャによってアクセス可能である。
【００１９】
好ましくは、障害命令が処理される前にスレッドに関連付けられたカウンタの値を検査するための手段は、障害命令と残りの命令の間の区別を付けることができる命令復号器を含む。
好ましくは、プロセッサは、複数のスレッドを処理するのに適し、各スレッドは、これらのスレッドに関連付けられたそれぞれのカウンタを有する。１つの好ましい実施形態では、複数のスレッドに１６個のスレッドが存在する。
【００２０】
好ましくは、プロセッサ内の上述の又は各スレッドは、いかなる一時点においても、処理されているか、又は処理されるのを待っているか、又はｉｉ）に従って休止されているかのいずれかである。好ましくは、スレッドマネージャは、プロセッサ内の各常駐スレッドの状態を記録する。好ましくは、いかなる一時点においても、複数のスレッドの部分集合が処理されている。１つの好ましい構成では、部分集合内のスレッドの個数は４である。一実施形態では、プロセッサは、更に、スレッドの部分集合を、部分集合内の各スレッドから１つの命令をラウンドロビン方式で実行することによって処理するための手段を含む。
【００２１】
有利な態様においては、部分集合内のスレッドの個数は、短い待ち時間命令を処理するのに必要とされる最大クロック刻み回数に等しい。従って、短い待ち時間命令では、データ障害問題は存在しないことになる。
好ましくは、プロセッサは、スレッドの最後の命令を処理した後に、このスレッドを複数のスレッドの部分集合から削除するように構成される。状態間のこの移行は、好ましくは、スレッドマネージャによって実行される。
【００２２】
好ましくは、プロセッサは、ｉｉ）に従って休止されている命令を有するあらゆるスレッドに関連付けられたカウンタの値を定期的に検査し、スレッドのカウンタの値がゼロであった場合には、このスレッドを処理待ち状態へと移行させるように構成される。ここでもまた、好ましくは、検査段階及び移行段階がスレッドマネージャによって実行される。検査段階は、クロック刻み毎に一度実施することができる。
好ましくは、プロセッサは、いかなる一時点においても、複数のスレッド位置のうちのゼロ、１つ、又はそれよりも多くが空きであるようにこの複数のスレッドを最大数とするあらゆる個数のスレッドを処理するように構成される。
【００２３】
一実施形態では、上述の又は各スレッドは、これらのスレッドに関連付けられた複数のＮ個のそれぞれのカウンタを有し、これらのスレッドに関連付けられたカウンタの値を検査するための手段は、各障害命令が処理される前に、これらのスレッドに関連付けられたＮ個のカウンタのうちの少なくとも１つの値を検査して、ｉ）少なくとも１つのカウンタの値の全てがゼロであった場合に障害命令を処理するか、又はｉｉ）少なくとも１つのカウンタの値のうちの１つ又はそれよりも多くが非ゼロであった場合に障害命令の処理を後の時点まで休止するための手段を含む。
【００２４】
その場合、各長い待ち時間命令は、長い待ち時間命令が処理される前に少なくともＮ個のカウンタのうちのどれを増分すべきであるか、並びに長い待ち時間命令が処理された後に少なくともＮ個のカウンタのうちのどれを減分すべきであるかという指示を含む。
また、各障害命令には、その障害命令が処理される前にＮ個のカウンタのうちのどれを検査すべきであるかという指示を含む命令が先行する。代替的に、各障害命令は、その障害命令が処理される前にＮ個のカウンタのうちのどれを検査すべきであるかという指示を含むことができる。
本発明の一態様に関連して説明した特徴は、本発明の他の態様にも適用可能である場合がある。
これより本発明の例示的な実施形態を添付図面を参照して以下に説明する。
【図面の簡単な説明】
【００２５】
【図１】本発明の実施形態によるマルチスレッドプロセッサの図である。
【図２】図１のスレッドマネージャ１０１の概略図である。
【図３】４つの可能なスレッド状態の間の移行を示す概略図である。
【図４】３２ビットの長い待ち時間メモリロード命令の概略図である。
【図５】３２ビットのＷＨＣ命令の概略図である。
【発明を実施するための形態】
【００２６】
図１は、本発明の一実施形態によるマルチスレッドプロセッサを示している。プロセッサ１００は、処理されるスレッドの提出を受け取るスレッドマネージャ１０１を含む。スレッドマネージャ１０１は、スレッドマネージャ１０１によって示された適切な命令を外部メモリ１０５又は内部キャッシュ１０７から取り出すことができる命令フェッチ装置１０３に接続される。次に、取り出された命令は、命令復号器１０９に行く。レジスタストア１１１は、実行に向けて命令を転送し、その結果は、レジスタストアに戻されて入力される。また、レジスタストアは、命令実行へと順送りされるソース引数を取り出す。
【００２７】
この実施形態では、マルチスレッドプロセッサは、２つの命令カテゴリを処理することができる。第１のカテゴリは、命令結果が、確定的で僅かなクロック刻み回数でレジスタストアに書き戻される低い待ち時間（又は短い待ち時間）命令を含む。これらの命令は、プロセッサ１００内で実行される。そのような命令の例は、単純な加算及び乗算である。これらの低い待ち時間命令は、扱いが比較的容易であり、図１のループ１１３に示している。
【００２８】
第２のカテゴリは、命令結果が、数十回のクロック刻み程度の長さである場合がある可変長の予測不能待ち時間で外部ユニットからレジスタストアに書き戻される高い待ち時間（又は長い待ち時間）命令を含む。図１では、これらをループ１１５で示している。これらの長い待ち時間命令は、メモリインタフェース、テクスチャサンプリングユニット、及び数値演算コプロセッサのような外部ユニット１１７に処理要求を送る。図１では、これらのユニットをプロセッサモジュール１００の外側に存在するように示しているが、これは、必ずしもそうではないことに注意されたい。これらのユニットは、プロセッサ１００と密接に結合され、同じダイ上に存在する可能性が高い。
【００２９】
ここで、図１のプロセッサ１００の演算を最初に低い待ち時間命令、次に長い待ち時間命令に対して以下に説明する。演算は、データ障害を回避するように実行される。このプロセッサでは、命令は、実行され始めると、すなわち、スレッドマネージャ１０１を離れ、命令フェッチ装置に送られた状態では、停止することができない。あらゆる障害は、データ障害がなくなるまでプロセッサパイプラインを停止させる。
【００３０】
図２は、スレッドマネージャ１０１の概略図である。マルチスレッドプロセッサ１００は、プロセッサ上に同時に存在することができるある一定個数の常駐スレッドを有するように構成される。図２に示している例では、この個数は１６である。１６個の常駐スレッドの各々は、ＩＤ２０１を有する。いかなる所定の時点でも、各スレッドは特定の状態２０５にある。４つの可能な状態は、「空き」、「待機」、「実行中」、及び「障害」であり、これらの４つの状態を更に以下に説明する。また、列２０３及び２０７における値も以下に説明する。
【００３１】
これら１６個の常駐スレッドから、スレッドの部分集合２０９は、いかなる一時点でも「実行中」状態にある。スレッドマネージャ１０１は、各実行中スレッドから１つの命令をクロック刻み単位のラウンドロビン方式で実行する。いかなる一時点でも「実行中」状態に置くことができる部分集合内のスレッドの個数は、低い待ち時間命令を処理するのに要する最大クロック刻み回数に等しい。これから、前の命令が処理し終わるまで同じスレッド内の後の命令を処理することができないように、特定の命令の処理が単一のサイクル内で完了することが保証される。図２の例では、「実行中」部分集合２０９内の個数は４に等しい。すなわち、４個の実行中常駐スレッドが存在する限り、低い待ち時間命令に対するデータ障害ペナルティは存在しないことになる。
【００３２】
再度図２を参照すると、スレッドマネージャ１０１は、各常駐スレッドの状態を記録する。既に解説したように、「実行中」状態は、現時点でスレッドが実行されていることを意味する。「空き」状態は、このＩＤ２０１に対して常駐スレッドが存在しないことを意味する。「待機」状態は、スレッドが、「実行中」部分集合２０９内に空間ができ次第実行されるのを待機していることを意味する。「障害」状態に対して以下に説明する。
【００３３】
４つの状態の間の移行を図３に略示している。
最初に、「空き」から「待機」への移行３０１を考える。この移行は、新しいスレッドが提出された時に発生し、次に、このスレッドは、「実行中」部分集合２０９に入力されるのを常駐スレッド内で待つ。
ここで、「待機」から「実行中」３０３への移行を考える。「待機」部分集合内で空間が利用可能になる時に（実行中のスレッドがその最後の命令を終了し、それによって「実行中」部分集合内の空間を解放する時に発生させることができる）、スレッドマネージャは、「待機」スレッドのうちの１つを選択し、それを「実行中」状態へと移行させる。これは、スレッドスケジューリングとして公知である。スレッドマネージャは、移行に向けて常駐待機スレッドから待機スレッドを選択するアルゴリズムを用いることができ、例えば、単純なラウンドロビン手法を用いることができる。
【００３４】
ここで、「実行中」から「空き」への移行３０５を考える。命令復号器は、特定のスレッドの最後の命令をいつ受け取るかを通知することができる。この受け取りが起こると、命令復号器は、インタフェース１１９（図１を参照されたい）に沿ってスレッドＩＤ２０１を含む指令及びスレッドを「空き」にする指令を通信することにより、スレッドマネージャに、そのスレッドの状態を「実行中」から「空き」へと移すように通知する。この通知により、次に、「実行中」部分集合内の空間が解放されることになり、それによって別の待機常駐スレッドを「実行中」へと移行させることができる（３０３）。
【００３５】
最後に、実行中から「待機」に戻る移行３０７を考える。この移行は、プロセッサが、いかなる所定のスレッドも実行中のままに留まることができるクロック刻み回数が制限されたタイマーをサポートする場合に発生させることができる。従って、スレッドがこの閾値を超えた場合には、このスレッドは、「実行中」状態から「待機」状態に移行して戻ることになる。この移行は、図１のインタフェース１１９を通じた命令復号器からスレッドマネージャへの指令を通じて達成することができ、この指令は、スレッドＩＤ２０１及びスレッドを「待機」にする指令を含む。この種のスレッド間移行は、スレッドスケジューリング解除として公知である。スレッドは完了していないので、このスレッドは、「空き」ではなく「待機」へと移行し、完了させるためには、後の時点でこのスレッドを再度スケジューリングすることが必要になる。スレッドをスケジューリング解除する行為は、「実行中」部分集合内で空間が利用可能になるので、スレッドマネージャに、「待機」スレッドのうちの１つをスケジューリングするように選択するアルゴリズムを実行させることになる。
障害状態への移行及びそこからの移行３０９及び３１１に対して以下に説明する。
【００３６】
スレッドマネージャは、スレッドが常駐のものであるから、スレッド状態を単一のクロック刻みで移行させることができることに注意されたい。
以上の説明は、「実行中」部分集合内に存在することが許されるスレッドの個数を選択することにより、データ障害を比較的容易に回避することができる短い待ち時間命令にだけに関する。これより長い待ち時間命令の処理に対して以下に説明する。
【００３７】
長い待ち時間命令の待ち時間を吸収するために、障害カウンタ及び障害状態という２つの特徴を用いる。
図２を参照すると、列２０７は、各スレッドにおける障害カウンタ値を記憶する。この例では、３個の障害カウンタが存在し、これらのカウンタは、各々０から７のいずれかの値を取ることができる。しかし、障害カウンタの個数は異なるものとすることができ、及び／又は各障害カウンタが取ることができる値の個数も異なるものとすることができる。障害カウンタ値は、実際には命令復号器に記憶されるが、スレッドマネージャは、これらの障害カウンタ値へのアクセスを有する。
【００３８】
命令復号器は、受け取ったばかりの命令が、短い待ち時間命令又は長い待ち時間命令のいずれであるのかを通知することができる。命令が長い待ち時間命令であった場合には、命令復号器は、障害カウンタのうちの１つを１だけ自動的に増分する（その後の長い待ち時間命令で更に）。次に、命令復号器は、いずれかの短い待ち時間命令に対して行うことになるのと同様に、実行に向けて命令を送る。指定された障害カウンタ及びスレッドＩＤが、これらの長い待ち時間命令に対してプロセッサパイプラインを順方向に渡され、それによってデータが宛先レジスタに最終的に書き込まれる時には、障害カウンタ及びスレッドＩＤは、インタフェース上に存在する。
【００３９】
データは、レジスタストア１１１に書き込まれているので、命令復号器は、障害カウンタ及びスレッドＩＤを調べて（図１の１２１を参照されたい）、この特定のスレッドに対する障害カウンタを減分し、それによってループが閉じる。
そのような長い待ち時間命令の例を図４に示している。図４に示している命令は、３２ビットメモリロード命令であり、２４ビットのペイロード、６ビットの演算命令、及び増分される障害カウンタを示す２ビットを含む。
【００４０】
従って、長い待ち時間命令が命令復号器に供給されると、命令復号器は、適切な障害カウンタを増分する。長い待ち時間命令が完了すると、命令復号器は、障害カウンタを減分する。従って、あらゆるスレッドの障害カウンタは、そのスレッドの長い待ち時間命令のうちの何個が現時点で実行中であるかに依存することになる。すなわち、未処理の宛先レジスタ書込みがない場合には、障害カウンタはゼロになるが、いずれか未処理の宛先レジスタ書込みがある場合には、障害カウンタは非ゼロになる。従って、図２を参照すると、スレッドＩＤ１１の障害カウンタ値は２であるから、スレッドＩＤ１１が現時点で未処理の２つの書込みを有することが分る。
【００４１】
いかなる一時点でも実行中とすることができる長い待ち時間命令の個数は、障害カウンタの個数及びこれらの障害カウンタが各々取ることができる最大値に依存する。この事例では、特定のスレッドにおいて２１（３×７）個の長い待ち時間命令を実行中とすることができる。更に、別の長い待ち時間命令が命令復号器に入力される場合には、プロセッサは、現時点で実行中の長い待ち時間命令のうちの１つが完了し、従って、障害カウンタが減少し、その時点でプロセッサが再始動することができるまで停止することになる。
【００４２】
好ましい実施形態では、ＷＨＣ（障害カウンタを待つ）命令は、正しく実施することができる前に前の命令が完了していることに依存する（すなわち、仮に先に処理された場合はデータ障害になるかもしれない）命令に先行する。（代替的手法は、命令自体の中にＷＨＣビットを含むことであると考えられ、この可能性に対しては下記で更に解説する。）命令復号器は、ＷＨＣ命令を受け取ると、ＷＨＣ命令内に示されている１つ又は複数のスレッドに対する障害カウンタを検査すべきであることを認識する。これは、ＷＨＣ命令が、前の命令が完了していることに依存する１つの命令（又は複数の命令）に先行するからである。この１つ又は複数のスレッドに対して非ゼロの障害カウンタが存在する場合には、未処理のレジスタ書込みがあることが分る。命令復号器が、このスレッドに対する障害カウンタを検査する時に、障害カウンタがゼロの場合は何も発生せず、命令復号器は、通常通りに実行に向けて次の命令へと進むことになる。（ＷＨＣ命令自体は、その目的を実行し終えているので、命令復号器内で単純に消滅する。）一方、障害カウンタが非ゼロである場合には、命令復号器は、インタフェース１１９（図１）を通じて、スレッドマネージャにこのスレッドを「障害」状態へと移行させるように通知する。
【００４３】
ＷＨＣ命令は、正しく実施することができる前に前の命令が完了していることに依存する命令の直前にある必要はない。ＷＨＣ命令が、長い待ち時間命令と、この長い待ち時間命令の完了に依存する命令との間のどこかにある限り、ＷＨＣ命令は、その目的を達成することになる。また、例えば、１つの長い待ち時間命令の結果が、後に多くの命令によって用いられる場合には、１つのＷＨＣ命令が、多くのその後の命令を「有効化」することができる。これらのその後の命令は、ＷＨＣ命令に示されることになる。
【００４４】
スレッドが「実行中」状態から「障害」状態に移された時には、「実行中」部分集合２０９内で空間が利用可能になる。従って、このスレッドが「障害」状態のままに留まる間に、このスレッドの待ち時間を吸収するように、「待機」状態にある別の常駐スレッドをスケジューリングし、すなわち、「実行中」状態へと移す移行３０３を行うことができる。常駐スレッドの個数（この事例では１６）と「実行中」部分集合内で許されるスレッドの個数（この事例では４）との間の格差が大きい程、スレッドマネージャが、「障害」スレッドの待ち時間を吸収するようにスケジューリングすることができる「待機」状態にあるスレッドを見出すことになる可能性が高くなる。
【００４５】
しかし、スレッドが障害状態に置かれた状態で、このスレッドは、如何にして障害状態から移行して抜け出す（すなわち、移行３１１）のであろうか？全てのクロック刻みにおいて、スレッドマネージャは、障害状態にあるあらゆるスレッドの障害カウンタを調べる。障害カウンタは、長い待ち時間命令が完了すると減少することになることを思い出すべきである。障害カウンタが依然非ゼロの場合には、スレッドマネージャは行為を起こさず、このスレッドを「障害」状態のままに残す。障害カウンタが既にゼロに減少している場合には、スレッドマネージャによってスレッドを「障害」状態から「待機」状態へと移行させることができる。この移行は、図３の移行３１１である。従って、障害カウンタがゼロに減少した場合には、未処理の宛先レジスタ書込みが存在しないことが分る。従って、ＷＨＣ命令が乱れた順序で処理されることになることによってデータ障害が引き起こされる可能性はない。
【００４６】
実際には、スレッドマネージャは、各全てのクロック刻みにおいて「障害」スレッドの障害カウンタを調べる必要はない。最終的にスレッドが「障害」状態から「待機」状態への移行を行う限り、数回のクロック刻み毎に検査を行うことができる。実際には、これは、高周波数で作業する時に有利になり、それによってゲート計数も低減することができるであろう。
いくつかの障害カウンタを存在させることができ、命令復号器が、各長い待ち時間命令に対して増分される障害カウンタを指定することは前に解説した。この例では、各々が０から７の値を取ることができる３個の障害カウンタが存在する。
【００４７】
図５は、ＷＨＣ命令（すなわち、前の命令に依存する命令に先行するもの）を示している。ＷＨＣ命令は、各々が１つの障害カウンタに対応する３ビットを含む。ビットのうちのいずれかが非ゼロであった場合には、これは、そのビットに対応する障害カウンタを次の命令が実施される前に検査すべきであることを示すものである。コンパイラは、どの障害カウンタを各長い待ち時間命令に割り当てるかを待ち時間の吸収性能を最適化するように選ばなければならない。
【００４８】
プロセッサによって実行される命令を生成するコンパイラは、ＷＨＣ命令を長い待ち時間命令の結果を用いる命令の直前に配置するように最適化すべきである。従って、ＷＨＣの指示は、命令が処理される前に受け取られる。また、コンパイラは、ＷＨＣ命令をスレッド内で、対応するカウンタを増分する長い待ち時間命令からできる限り遠くに位置決めするように試みなければならない。それによって障害状態にあるスレッドの個数は最小にされることになる。これは、コンパイラにより、命令の順序を再編成することによって行うことができる。
【００４９】
例えば、ＷＨＣ命令は、それが処理される前に処理された全ての長い待ち時間命令に依存せず、単にそのスレッド内の長い待ち時間命令のうちの一部に依存するかもしれない。この場合、ＷＨＣ命令が依存する長い待ち時間命令は、例えば、第１の障害カウンタを増分するように指定することができる。一方、ＷＨＣ命令が依存しない長い待ち時間命令は、例えば、第２の障害カウンタを増分するように指定することができる。次に、ＷＨＣ命令内で、第１の障害カウンタに対応するビットは非ゼロになり、これに対して他の障害カウンタに対応するビットはゼロになる。従って、命令復号器は、検査する必要がある唯一の障害カウンタが第１の障害カウンタであることを認識し、これは、他の障害カウンタが、この特定のＷＨＣ命令に関連しないからである。図４を参照すると、増分される障害カウンタがビット番号２５及び２６に示されていることが分る。
【００５０】
障害カウンタの適切な使用である下記の命令ストリームの例を考える。以下の例では「ロード」命令は、長い待ち時間命令であり、「加算」命令は、短い待ち時間命令であることに注意されたい。
１）レジスタ位置（ｒ）０をロードし、障害カウンタ（ＨＣ）０を増分する。
２）ｒ１をロードし、ＨＣ０を増分する。
３）ｒ２をロードし、ＨＣ１を増分する。
４）ｒ３をロードし、ＨＣ１を増分する。
５）ｒ４をロードし、ＨＣ２を増分する。
６）ｒ５をロードし、ＨＣ２を増分する。
７）ＨＣ０が値０に減少するのを待つ。
８）ｒ０とｒ１とを加算し、ｒ９の中に入れる。
９）ＨＣ１が値０に減少するのを待つ。
１０）ｒ２とｒ３とを加算し、ｒ１０の中に入れる。
１１）ＨＣ２が値０に減少するのを待つ。
１２）ｒ４とｒ５とを加算し、ｒ１１の中に入れる。
【００５１】
これを、障害カウンタを良好に使用していない以下の命令ストリームと比較する。
１）ｒ０をロードし、ＨＣ０を増分する。
２）ｒ１をロードし、ＨＣ０を増分する。
３）ｒ２をロードし、ＨＣ１を増分する。
４）ｒ３をロードし、ＨＣ１を増分する。
５）ｒ４をロードし、ＨＣ２を増分する。
６）ｒ５をロードし、ＨＣ２を増分する。
７）ＨＣ０、ＨＣ１、及びＨＣ２が値０に減少するのを待つ。
８）ｒ０とｒ１とを加算し、ｒ９の中に入れる。
９）ｒ２とｒ３とを加算し、ｒ１０の中に入れる。
１０）ｒ４とｒ５とを加算し、ｒ１１の中に入れる。
【００５２】
第２の例では、全ての３つの障害カウンタは、その後の命令のうちのいずれかを実施することができる前にゼロに減らさなければならない。しかし、例えば、ｒ０とｒ１の合計をｒ９の中に入れる命令は、ｒ０及びｒ１だけに依存し、他のレジスタ位置には依存しないので、上記ストリームは、特に効率的というわけではない。従って、スレッドは、より長く「障害」状態にあることになる。最初の例は、障害カウンタをより良好に使用する。利用可能な障害カウンタにわたって長い待ち時間命令を分割することにより、命令をより早く始動することができ、それによって実行中のスレッドが他のスレッドの障害を吸収することを可能にする。コンパイラは、長い待ち時間命令と短い待ち時間命令の間の差を認識し、また、どの命令がどの前の命令に依存するかも認識し、従って、障害カウンタを効率的に使用することができる。
【００５３】
図４の例では、障害カウンタは、長い待ち時間命令内で指定される。しかし、これはそうである必要はなく、代替方法は、障害カウンタ番号を宛先レジスタアドレスの最下位ビットに結び付けるものになる。従って、例えば、レジスタ位置０内へのあらゆるロードは、障害カウンタ０を増分することになるが、レジスタ位置５内へのあらゆるロードは、障害カウンタ１を増分することになる。それによって貴重な命令符号化空間は節約されるが、実際の宛先レジスタアドレスがコンパイラ又は命令復号器によって認識されない場合のインデキシングのような複雑なアドレス指定モードを実施することが困難になる。
【００５４】
この例では、ＷＨＣ命令は、１つよりも多い障害カウンタの一度での検査をサポートする。すなわち、図５の例では、３個のＷＨＣビットがＷＨＣ命令内に存在するので、ＷＨＣは、３個の障害カウンタの検査をサポートする。しかし、これは必ずしもそうである必要はなく、各ＷＨＣ命令は、単に、検査すべきである１つの障害カウンタを指定するものとすることができる。この場合には、第１のＷＨＣ命令は、ＨＣ１を検査することを指定することができ、第２のＷＨＣは、ＨＣ２を検査することを指定することができ、以降同様に続く。それによって少数のゲートを節約するであろう。
【００５５】
上述の実施形態に関していくつかの一般的な点に注意すべきである。説明した実施形態は、１６個の常駐スレッドを含み、そのうちの４つまでは、いかなる一時点においても「実行中」部分集合内にある。しかし、このシステムは、非常に高いクロック周波数にも対応する。クロック周波数が高まる時に、短い待ち時間命令及び長い待ち時間命令の両方のクロック刻みにおける待ち時間は高まる。これは、短い待ち時間命令の新しいより長い待ち時間を満たすために、「実行中」部分集合内のスレッドの個数を増すことができることを意味する。更に、補償を行うために、常駐スレッドの個数を増すことができる。
【００５６】
説明した実施形態に関する他の点は以下の通りである。
スレッドを終えることができる前に、障害カウンタは、全てゼロでなければならない。（非ゼロ障害カウンタは、未処理命令が存在することを意味するので、これは明らかである。）
命令復号器は、全てのスレッドに対する障害カウンタを記憶する。障害カウンタは、スレッドが障害状態にある時に非ゼロとすることができる。障害カウンタがゼロになると直ぐに、スレッドマネージャは、次の検査でこれらのスレッドを待機状態へと移行させることになる。
【００５７】
一部の場合には、障害カウンタは、実行中状態において非ゼロとすることができる。これは、長い待ち時間命令が実行されるが（それによって障害カウンタが増分される）、ＷＨＣ命令が到着する前に実行される時に発生する。あるいは、ＷＨＣ命令が到着している時でさえも、長い待ち時間命令がその障害カウンタに対応しない場合があり、従って、スレッドは、実行中状態に留まることになる。
図１から５を参照して上記に解説した例は、本発明の方法を実行するためのハードウエアを示している。本発明の方法は、当然ながら代替的にソフトウエアで実施することができる。
【００５８】
代替として、障害カウンタの効率的な使用は以下の通りである。ＳＩＭＤプロセッサでは、１つの長い待ち時間命令が、外部ユニットを通じていくつかのレジスタ書込みを起動するかもしれない。命令復号器は、最初に１だけ障害カウンタを単に増分するかもしれないが、終了時には各レジスタ書込みに対して一度づつ、何度か障害カウンタを減分しようと試みるかもしれないので、上述のことによって問題に遭遇する場合がある。この問題は、命令における最後のレジスタ書込みだけを示すフラグをパイプラインを巡って渡すことによって対処することができる。命令復号器がこのフラグを参照すると、命令復号器は、障害カウンタを減分することを認識することになる。従って、複数のレジスタ書込みが存在する場合であっても、各長い待ち時間命令は、１だけ障害カウンタを増分するのみである。障害カウンタを異なる方法で用いることが可能である。例えば、障害カウンタは、長い待ち時間命令全体に対して１回ではなく、各レジスタ書込みに対して１回、開始時に増分することができる。従って、命令復号器は、各レジスタ書込みが完了すると１だけ障害カウンタを減分するだけになるので、フラグを必要としないことになる。障害カウンタを用いるこの方法は、同様に有効であるが、障害カウンタがより急速に使い果たされ、パイプライン内でより少数の長い待ち時間命令しか停止しない可能性が高まることを意味しない。
【００５９】
更に、ＷＨＣ命令を若干異なる方法で用いることができる。ＷＨＣ命令の機能は、全ての「標準」命令内に統合することができ、それによって追加命令としてのＷＨＣ命令が排除される。この場合、命令符号化において、いずれか存在するとすればどの障害カウンタを待つべきかを命令復号器に通知するビットが存在する。これらのビットは、全ての命令上に存在する必要はなく、これらのビットを持たず、長い待ち時間命令からデータが戻るのを待つように構成することができないものにおいて存在すべきである。利点は、プログラム及び命令バンド幅のサイズの低減であるが、この低減は、命令符号化ビットという代償を有する。
【００６０】
序論において、本発明が問題を解決すると同時に満たさなければならないいくつかの要件を提供した。
最初に、マルチスレッドプロセッサでは、多くのスレッドが、潜在的データ障害を有する場合がある。説明した実施形態では、１６個の常駐スレッドのうちの１２つまでを障害状態におき、それと同時に４個を依然として実行中とすることができるので、この要件が満たされる。異なる実施形態（異なる個数のスレッドが常駐を許され、異なる個数を実行中部分集合内に置くことが許される）においてもこれは成り立つことになる。
【００６１】
次に、各スレッドは、大量の長い待ち時間命令を有する場合がある。ここではこの要件もまた、障害カウンタの個数及び各障害カウンタが取ることができる値の範囲によって満たされる。説明した実施形態では、ハードウエアは、各々が値０から値７にわたるものとすることができる３個の障害カウンタを設ける。従って、各常駐スレッドは、プロセッサが停止する前に、２１つの長い待ち時間命令を未処理及び被処理中とすることができることを保証することができる。長い待ち時間命令の個数が特に高いことが既知である場合には、障害カウンタの個数又は各々が取ることができる値の範囲を増すことができ、又は十分であると判断される場合には、障害カウンタの個数を低減することができる。実際に用いられる好ましい実施形態では、各々が０と１５の間の値を取る障害カウンタが２つのみ用いられる。
【００６２】
長い待ち時間命令からの戻りデータが、これらのデータが送出されたものとは異なる順序で戻ってくることも可能でなければならない。この要件は、実行することができる以下の命令ストリームによって満たされる。
１）ｒ０をロードし、ＨＣ０を増分する（長い待ち時間ロード命令）。
２）ｒ１をサンプリングし、ＨＣ０を増分する（これは、長い待ち時間サンプリング命令である）。
３）ＨＣ０が値０に減少するのを待つ。
４）ｒ０とｒ４を加算し、ｒ２の中に入れる（短い待ち時間加算命令）。
５）ｒ１とｒ５とを加算し、ｒ３の中に入れる。
【００６３】
本発明によって作動するこの例では、ｒ１は、ｒ０がメモリインタフェースによって書き込まれる前に、テクスチャサンプリングユニットによって書き込むことができる。これらの命令の両方が、ＨＣ０のみを減分し、従って、順序は重要ではない。
また、長い待ち時間命令からのデータ障害に起因するプロセッサの停止をできる限り低減すべきである。最大利得は、スレッドがＷＨＣ命令でスケジューリング解除されることに起因するものと期待され、これは、新しいスレッドがスケジューリングされることになり、確実に行けばこれらのスレッドが、それ自体いずれかのＷＨＣ命令に遭遇する前に十分に長い間実行されることになるからである。更に、ＷＨＣ命令は、長い待ち時間命令の直後にくる必要はない。ＷＨＣ命令は、データソースの直前にこなければならない。有利な命令を長い待ち時間命令とＷＨＣの間に挿入することができ、それによって待ち時間が更に吸収されることになる。複数の障害カウンタを有することにより、実際には不要な、データを待つのに費やされる時間が低減される。例えば、２つの障害カウンタ、ＨＣ０及びＨＣ１しか持たないシステムにおける以下の命令ストリームを考える。
１）ｒ０をロードし、ＨＣ０を増分する（長い待ち時間ロード命令）。
２）ｒ１をロードし、ＨＣ０を増分する。
３）ｒ２をロードし、ＨＣ１を増分する。
４）ＨＣ０が値０に減少するのを待つ（すなわち、ｒ０及びｒ１を待つ）。
５）ｒ０とｒ１０とを加算し、ｒ３の中に入れる（短い待ち時間加算命令）。
６）ｒ３とｒ１１とを加算し、ｒ４の中に入れる。
７）ｒ４とｒ１２とを加算し、ｒ５の中に入れる。
８）ｒ５とｒ１とを加算し、ｒ６の中に入れる（初めてｒ１が用いられる）。
９）ｒ６とｒ１３とを加算し、ｒ６の中に入れ戻す。
１０）ｒ６とｒ１４とを加算し、ｒ６の中に入れ戻す。
１１）ｒ６とｒ１５とを加算し、ｒ６の中に入れ戻す。
１２）ＨＣ１が値０に減少するのを待つ。
１３）ｒ２とｒ６とを加算し、ｒ６の中に入れ戻す。
【００６４】
この例では、２つのカウンタを有するためのシステムの待ち時間の吸収は、３個のカウンタを有するものよりも悪い。
分岐のようなフロー制御をサポートするように、スレッド内のあらゆる命令を飛ばして進むことができなければならない。ここではこの要件は、全ての長い待ち時間命令が、復号される時に障害カウンタを増分し、宛先レジスタに書き込まれる時に障害カウンタを減分することによって満たされる。ＷＨＣ命令が存在するか否かに関わらず、この増分及び減分は常時発生し、障害カウンタの一貫性は常時維持される。スレッドは、このスレッドに対する全ての障害カウンタがゼロになるまで終了することができない。
【００６５】
また、書き込まれたものとは異なる順序で結果を読み取ることができなければならない。以下の例は、この点を示している。
１）ｒ０をロードし、ＨＣ０を増分する。
２）ｒ１をロードし、ＨＣ０を増分する。
３）ＨＣ０が値０に減少するのを待つ。
４）４１とｒ４とを加算し、ｒ２の中に入れる。
５）ｒ０とｒ５とを加算し、ｒ３の中に入れる。
この例では、ｒ０のロードは、ｒ１のロードの前に実施されるが、ｒ０の加算は、ｒ１の加算の後に実施される。
【００６６】
また、宛先への複数の読取りアクセスができなければならない。以下の例はこの点を示している。
１）ｒ０をロードし、ＨＣ０を増分する。
２）ＨＣ０が値０に減少するのを待つ。
３）ｒ０とｒ４とを加算し、ｒ２の中に入れる。
４）ｒ０とｒ５とを加算し、ｒ３の中に入れる。
この例では、ｒ０は、命令３）及び４）の各々において２度読み出すべきである。
【００６７】
また、同じ宛先に書込みが行われ、この宛先を別の長い待ち時間命令に対する宛先として再使用することが許すべきである。以下の例はこの点を示している。
１）ｒ０をロードし、ＨＣ０を増分する。
２）ＨＣ０が値０に減少するのを待つ。
３）ｒ０とｒ４とを加算し、ｒ２の中に入れる。
４）ｒ０をロードし、ＨＣ０を増分する。
５）ＨＣ０が値０に減少するのを待つ。
６）ｒ０とｒ５とを加算し、ｒ３の中に入れる。
この例では、ｒ０は２度書き込まれる。
【００６８】
最後に、長い待ち時間命令及び潜在的データ障害命令を処理するのに、特別又は付加的なストレージが必要とされないことが好ましい。外部ユニットから戻るデータは、ＦＩＦＯのような特別ストレージへと進める必要はなく、指定の宛先レジスタ内に直接進めることができる。同じ宛先レジスタへの命令書込みがないことを保証するか、又はそうでなければ最初にＷＨＣ命令を必要とするかは、コンパイラに任される。
【００６９】
また、ゲート費用が最小限に保たれることが好ましい。システムは拡張可能であり、障害カウンタの個数は調節することができ、更に最大障害カウンタ値も同様に調節することができる。これが影響を及ぼす１つの事は、障害カウンタの飽和に起因して停止が発生する前に、スレッド毎に何個の長い待ち時間命令を送出することができるかである。常駐スレッド毎のストレージ量は最小であり、０…７の範囲に及ぶ３個の障害カウンタでは、スレッド毎に正確に１２ビットである。
【符号の説明】
【００７０】
１００  プロセッサ
１０１  スレッドマネージャ
１０３  命令フェッチ装置
１０５  外部メモリ
１０７  内部キャッシュ
【図１】
2010522920.tif 000003
【図２】
2010522920.tif 000004
【図３】
2010522920.tif 000005
【図４】
2010522920.tif 000006
【図５】
2010522920.tif 000007
【国際調査報告】
2010522920.tif 000008
2010522920.tif 000009
2010522920.tif 000010