(57)【要約】  マルチスレッド化されたマイクロプロセッサで実行され、かつ単一の命令発行スロットを占めるｆｏｒｋ命令が開示される。このｆｏｒｋ命令は、親スレッド内で実行されるとともに、新規スレッドの最初の命令アドレスを指定する第１のオペランドと、第２のオペランドとを有する。マイクロプロセッサは、新規スレッドのためにコンテキストを割り振り、第１のオペランドを新規スレッドコンテキストのプログラムカウンタにコピーし、第２のオペランドを新規スレッドコンテキストのレジスタにコピーし、実行のために新規スレッドをスケジューリングすることによって、ｆｏｒｋ命令を実行する。割り振りに関して空いている新規スレッドコンテキストがない場合には、マイクロプロセッサは、ｆｏｒｋ命令に対する例外を送出する。ｆｏｒｋ命令は、親スレッドの汎用レジスタを新規スレッドにコピーしないので効率的である。第２のオペランドは、通常、新規スレッド用の最初の汎用レジスタセット値を含むメモリ内のデータ構造へのポインタとして使用される。
2007504535.tif 000002
【特許請求の範囲】
【請求項１】
並行プログラムスレッドを実行するように構成されたマイクロプロセッサで実行される命令であって、
新規スレッドのためにリソースを割り振り、かつマイクロプロセッサ上での前記新規スレッドの実行をスケジューリングするように、マイクロプロセッサに指示するオペコードを含み、前記リソースが、プログラムカウンタおよびレジスタセットを含み、前記命令がさらに、
前記新規スレッドのために割り振られた前記プログラムカウンタに保管される最初の命令フェッチアドレスを指定する第１のオペランドと、
前記新規スレッドに対する準備のための第２のオペランドとを含む、命令。
【請求項２】
前記第２のオペランドが、前記新規スレッドのために割り振られた前記レジスタセットのレジスタへの保管のために、前記新規スレッドに提供される、請求項１に記載の命令。
【請求項３】
マイクロプロセッサが命令を実行する時に、前記新規スレッドのための前記リソースが、割り振りに使用可能でない場合に、マイクロプロセッサが、命令に対する例外を送出する、請求項１に記載の命令。
【請求項４】
前記第２のオペランドが保管される前記新規スレッドに関連する複数のストレージ位置のうちの１つを指定する第３のオペランドをさらに含む、請求項１に記載の命令。
【請求項５】
前記レジスタセットが、複数の汎用レジスタを含み、前記第３のオペランドによって指定される前記複数のストレージ位置のうちの前記１つが、前記新規スレッドのために割り振られた前記レジスタセットの前記複数の汎用レジスタのうちの１つを含む、請求項４に記載の命令。
【請求項６】
前記レジスタセットが、スタックメモリを指定するスタックポインタレジスタを含み、前記第３のオペランドによって指定される前記複数のストレージ位置のうちの前記１つが、前記スタックメモリ内のストレージ位置を含む、請求項４に記載の命令。
【請求項７】
前記新規スレッドが最初に必要とする状態のサイズが、前記第２のオペランドのサイズを超え、マイクロプロセッサが、命令に応答して、命令を含むスレッドのレジスタセットから前記新規スレッドに割り振られた前記レジスタセットに自動的に前記状態をコピーするのではなく、命令の後の１つまたは複数の命令が、前記第２のオペランドに基づいて前記新規スレッドに割り振られる前記レジスタセットに前記状態をコピーするように実行される、請求項１に記載の命令。
【請求項８】
マイクロプロセッサが、命令に応答して、命令を含むスレッドのレジスタセットから前記新規スレッドに割り振られた前記レジスタセットに内容をコピーすることなしで済ませる、請求項１に記載の命令。
【請求項９】
前記第２のオペランドが、前記新規スレッドによって使用されるデータのメモリ内のアドレスを指定する、請求項１に記載の命令。
【請求項１０】
命令が、マイクロプロセッサ内の単一の命令発行スロットを占める、請求項１に記載の命令。
【請求項１１】
命令が、ユーザ特権レベルでマイクロプロセッサによって実行可能である、請求項１に記載の命令。
【請求項１２】
並行プログラムスレッドを実行するように構成されたマイクロプロセッサで実行される命令であって、
新規スレッドのためにリソースを割り振り、かつマイクロプロセッサ上での前記新規スレッドの実行をスケジューリングするように、マイクロプロセッサに指示するオペコードを含み、前記リソースが、プログラムカウンタおよびレジスタセットを含み、前記命令がさらに、
前記新規スレッドのために割り振られた前記プログラムカウンタに保管される最初の命令フェッチアドレスを指定するオペランドを含み、
マイクロプロセッサが命令を実行する時に、前記新規スレッドのための前記リソースが割り振りに使用可能でない場合に、マイクロプロセッサが、命令に対する例外を送出する、命令。
【請求項１３】
前記新規スレッドに提供される第２のオペランドをさらに含む、請求項１２に記載の命令。
【請求項１４】
命令が、マイクロプロセッサ内の単一の命令発行スロットを占める、請求項１２に記載の命令。
【請求項１５】
命令が、ユーザ特権レベルでマイクロプロセッサによって実行可能である、請求項１２に記載の命令。
【請求項１６】
マルチスレッド化されたマイクロプロセッサであって、
複数のスレッドコンテキストを含み、スレッドコンテキストそれぞれが、スレッドの状態を保管し、かつ前記スレッドコンテキストが割り振りに使用可能であるかどうかを示すように構成され、前記マルチスレッド化されたマイクロプロセッサがさらに、
前記複数のスレッドコンテキストに結合され、現在実行中のスレッドの単一の命令に応答して、新規スレッドに前記複数のスレッドコンテキストのうちの１つを割り振り、かつ実行のために前記新規スレッドをスケジューリングする、スケジューラを含み、
前記複数のスレッドコンテキストのどれもが、割り振りに使用可能でない場合に、マルチスレッド化されたマイクロプロセッサが、前記単一の命令に対する例外を行う、マルチスレッド化されたマイクロプロセッサ。
【請求項１７】
前記複数のスレッドコンテキストのそれぞれが、プログラムカウンタを含む、請求項１６に記載のマイクロプロセッサ。
【請求項１８】
前記単一の命令が、前記新規スレッドに割り振られた前記複数のスレッドコンテキストのうちの前記１つの前記プログラムカウンタに前記命令の第１のオペランドを保管するように、マイクロプロセッサを指示する、請求項１７に記載のマイクロプロセッサ。
【請求項１９】
前記単一の命令が、前記命令の第２のオペランドを前記新規スレッドによってアクセス可能なストレージ位置に保管するように、マイクロプロセッサを指示する、請求項１８に記載のマイクロプロセッサ。
【請求項２０】
前記複数のスレッドコンテキストのそれぞれが、複数の汎用レジスタを含み、前記単一の命令が、前記第２のオペランドを、前記新規スレッドに割り振られた前記複数のスレッドコンテキストのうちで前記１つの前記複数の汎用レジスタのうちの１つに保管するように、マイクロプロセッサを指示する、請求項１９に記載のマイクロプロセッサ。
【請求項２１】
前記複数の汎用レジスタのうちの前記１つが、前記命令の第３のオペランドによって指定される、請求項２０に記載のマイクロプロセッサ。
【請求項２２】
前記複数のスレッドコンテキストのそれぞれが、スタックメモリを指定するスタックポインタレジスタを含み、前記単一の命令が、前記第２のオペランドを前記スタックメモリ内の位置に保管するように、マイクロプロセッサを指示する、請求項１９に記載のマイクロプロセッサ。
【請求項２３】
前記スタックメモリ内の前記位置が、前記命令の第３のオペランドによって指定される、請求項２２に記載のマイクロプロセッサ。
【請求項２４】
マイクロプロセッサは、前記命令が、前記複数のスレッドコンテキストのうちの１つを前記新規スレッドに割り振ることと、かつ前記現在実行中のスレッドがユーザ特権レベルで実行されつつある場合であっても、実行のために前記新規スレッドをスケジューリングすることとを可能にする、請求項１６に記載のマイクロプロセッサ。
【請求項２５】
前記命令が、マイクロプロセッサ内の単一の命令発行スロットを占める、請求項１６に記載のマイクロプロセッサ。
【請求項２６】
前記レジスタセットのそれぞれが、２つの読み取りポートおよび１つの書き込みポートを含む、請求項１６に記載のマイクロプロセッサ。
【請求項２７】
ｆｏｒｋ命令が、多くとも２つのソースレジスタオペランドおよび１つの宛先レジスタオペランドを指定する、請求項１６に記載のマイクロプロセッサ。
【請求項２８】
マルチスレッド化されたマイクロプロセッサであって、
第１のプログラムスレッド内の命令のフェッチアドレスを保管する、第１のプログラムカウンタと、
それぞれ第１および第２のオペランドを保管するために、前記命令によって指定される第１および第２のレジスタを含む、第１のレジスタセットとを含み、前記第１のオペランドが、第２のプログラムスレッドのフェッチアドレスを指定し、前記マルチスレッド化されたマイクロプロセッサがさらに、
前記第１のレジスタセットに結合され、前記命令に応答して前記第１のレジスタから前記第１のオペランドを受け取る第２のプログラムカウンタと、
前記第１のレジスタセットに結合され、前記命令に応答して前記第２のレジスタから前記第２のオペランドを受け取る第３レジスタを含む第２のレジスタセットと、
前記第１および第２のレジスタセットに結合され、マイクロプロセッサに、前記命令に応答して、前記第２のプログラムカウンタに保管された前記第２のプログラムスレッドフェッチアドレスから命令をフェッチさせかつ実行させるスケジューラとを含む、マルチスレッド化されたマイクロプロセッサ。
【請求項２９】
前記スケジューラに結合され、前記命令に応答して、前記第２のプログラムカウンタおよびレジスタセットが、前記第１および第２のオペランドを受け取るのに使用可能でない場合に、マイクロプロセッサに、前記命令に対する例外を行わせる例外インジケータをさらに含む、請求項２８に記載のマイクロプロセッサ。
【請求項３０】
前記スケジューラに結合され、前記命令に応答して、前記第２のプログラムカウンタおよびレジスタが、別のスレッドによって既に使用されている場合に、マイクロプロセッサに前記命令に対する例外を行わせる例外インジケータ
をさらに含む、請求項２８に記載のマイクロプロセッサ。
【請求項３１】
前記第３のレジスタが、前記命令によって指定される、請求項２８に記載のマイクロプロセッサ。
【請求項３２】
前記第１および第２のレジスタセットが、汎用レジスタセットを含み、前記命令に応答して、前記第２の汎用レジスタセットが、前記第１の汎用レジスタセットから前記第２のオペランドだけを受け取る、請求項２８に記載のマイクロプロセッサ。
【請求項３３】
マルチスレッド化されたマイクロプロセッサで新規の実行のスレッドを作成する方法であって、
第１のプログラムスレッドで実行される単一の命令をデコードすることと、
前記デコードに応答して、マイクロプロセッサのプログラムカウンタおよびレジスタセットを第２のプログラムスレッドのために割り振ることと、
前記割り振りに応答して、レジスタセットのレジスタに命令の第１のオペランドを保管することと、
前記割り振りに応答して、プログラムカウンタに命令の第２のオペランドを保管することと、
前記第１および第２のオペランドの前記保管後に、マイクロプロセッサでの実行のために第２のプログラムスレッドをスケジューリングすることとを含む、方法。
【請求項３４】
前記デコードに応答して、プログラムカウンタおよびレジスタセットが、割り振りに使用可能であるかどうかを判定することをさらに含む、請求項３３に記載の方法。
【請求項３５】
プログラムカウンタおよびレジスタセットが割り振りに使用可能でない場合に、命令に対する例外を送出することをさらに含む、請求項３４に記載の方法。
【請求項３６】
前記割り振ること、第１および第２のオペランドを前記保管すること、ならびに前記スケジューリングすることのすべてが、マイクロプロセッサの単一のクロックサイクルに実行される、請求項３３に記載の方法。
【請求項３７】
マルチスレッド化されたマイクロプロセッサで新規の実行のスレッドを作成する方法であって、
第１のプログラムスレッドで実行される単一の命令をデコードすることと、
前記デコードに応答して、プログラムカウンタを第２のプログラムスレッドのために割り振ることと、
前記割り振りが成功であったかどうかを判定することと、
前記割り振りが成功であった場合に、命令のオペランドをプログラムカウンタに保管し、かつマイクロプロセッサでの実行のために第２のプログラムスレッドをスケジューリングすることと、
前記割り振りが成功でなかった場合に、命令に対する例外を送出することとを含む、方法。
【請求項３８】
前記割り振りが成功であった場合に、命令の第２のオペランドを第２のスレッドに提供することをさらに含む、請求項３７に記載の方法。
【請求項３９】
前記デコードに応答して、第２のプログラムスレッドのためにレジスタセットを割り振ることをさらに含み、
命令の第２のオペランドを第２のスレッドに前記提供することが、第２のプログラムスレッドのために割り振られた前記レジスタセットのレジスタに第２のオペランドを保管することを含む、請求項３８に記載の方法。
【請求項４０】
前記デコードに応答して、第２のプログラムスレッドのためにスタックポインタを割り振ることをさらに含み、スタックポインタが、第２のスレッドに関連するスタックメモリを指定し、
命令の第２のオペランドを第２のスレッドに前記提供することが、スタックメモリに第２オペランドを保管することを含む、請求項３８に記載の方法。
【請求項４１】
マルチスレッド化された処理システムであって、
第１のスレッドのｆｏｒｋ命令およびデータ構造を保管するように構成されたメモリを含み、前記ｆｏｒｋ命令が、前記データ構造のメモリアドレスおよび第２のスレッドの最初の命令アドレスを保管するレジスタを指定し、前記データ構造が、前記第２のスレッドの最初の汎用レジスタ値を含み、前記マルチスレッド化された処理システムがさらに、
前記メモリに結合されたマイクロプロセッサを含み、該マイクロプロセッサが、前記ｆｏｒｋ命令に応答して、（１）前記第２のスレッドのために空きスレッドコンテキストを割り振り、（２）前記第２のスレッドの最初の命令アドレスを前記スレッドコンテキストのプログラムカウンタに保管し、（３）前記データ構造メモリアドレスを前記スレッドコンテキストのレジスタに保管し、（４）実行のために前記第２のスレッドをスケジューリングするように構成される、マルチスレッド化された処理システム。
【請求項４２】
前記データ構造に含まれる前記第２のスレッドの前記最初のレジスタ値の個数が、前記スレッドコンテキストの汎用レジスタの個数より少ない、請求項４１に記載の処理システム。
【請求項４３】
前記第２のスレッドに割り振られる前記スレッドコンテキストが、前記第１のスレッドのスレッドコンテキストと別個である、請求項４１に記載の処理システム。
【請求項４４】
前記メモリが、さらに、前記データ構造の前記最初のレジスタ値を、前記メモリから前記スレッドコンテキストの汎用レジスタにコピーするために、前記第２のスレッドのプログラム命令を保管するようにさらに構成され、これによって、前記マイクロプロセッサが、前記ｆｏｒｋ命令に応答して、前記第２のスレッドの前記スレッドコンテキストに、前記第１のスレッドのスレッドコンテキスト全体をコピーすることなしで済ませることが可能になる、請求項４３に記載の処理システム。
【請求項４５】
前記マイクロプロセッサが、さらに、前記第２のスレッドへの割り振りに使用可能な空きスレッドコンテキストがない場合に、前記ｆｏｒｋ命令に対する例外を送出するように構成される、請求項４１に記載の処理システム。
【請求項４６】
コンピューティングデバイスと共に使用されるコンピュータプログラム製品であって、
コンピュータ使用可能媒体を含み、該コンピュータ使用可能媒体が、マルチスレッド化されたマイクロプロセッサをもたらすために、前記コンピュータ使用可能媒体で実施されるコンピュータ可読プログラムコードを有し、前記コンピュータ可読プログラムコードが、
第１のプログラムスレッド内に命令のフェッチアドレスを保管するために、第１のプログラムカウンタを提供する第１のプログラムコードと、
それぞれ第１および第２のオペランドを保管するために、前記命令によって指定される第１および第２のレジスタを含む第１のレジスタセットを提供する第２のプログラムコードとを含み、前記第１のオペランドが、第２のプログラムスレッドのフェッチアドレスを指定し、前記コンピュータ可読プログラムコードがさらに、
前記命令に応答して前記第１のレジスタから前記第１のオペランドを受け取るために、前記第１のレジスタセットに結合された、第２のプログラムカウンタを提供する第３のプログラムコードと、
前記命令に応答して前記第２のレジスタから前記第２のオペランドを受け取るために、第３のレジスタを含む、前記第１のレジスタセットに結合された、第２のレジスタセットを提供する第４のプログラムコードと、
前記命令に応答して、マイクロプロセッサを、前記第２のプログラムカウンタに保管された前記第２のプログラムスレッドの最初のフェッチアドレスから、命令をフェッチさせかつ実行させるために、前記第１および第２のレジスタセットに結合された、スケジューラを提供する第５のプログラムコードとを含む、コンピュータプログラム製品。
【請求項４７】
前記コンピュータ可読プログラムコードが、さらに、
前記命令に応答して、前記第２のプログラムスレッドからアドレス空間識別子を受け取るために、状況レジスタを提供する第６のプログラムコードを含む、請求項４６に記載のコンピュータプログラム製品。
【請求項４８】
前記コンピュータ可読プログラムコードが、さらに、
前記命令に応答して、前記第２のプログラムスレッドから実行特権レベル識別子を受け取るために、状況レジスタを提供する第６のプログラムコードを含む、請求項４６に記載のコンピュータプログラム製品。
【請求項４９】
伝送媒体で実施されるコンピュータデータ信号であって、
ｆｏｒｋ命令を実行するために、マルチスレッド化されたマイクロプロセッサを提供するコンピュータ可読プログラムコードを含み、前記コンピュータ可読プログラムコードが、
新規スレッドのためにプログラムカウンタおよびレジスタセットを含むリソースを割り振り、かつマイクロプロセッサ上での前記新規スレッドの実行をスケジューリングするように、マイクロプロセッサを指示するために、オペコードを提供する第１のプログラムコードと、
前記新規スレッドのために割り振られた前記プログラムカウンタに保管される最初の命令フェッチアドレスを指定するために、第１のオペランドを提供する第２のプログラムコードと、
前記新規スレッドのために割り振られた前記レジスタセットのレジスタに保管するために、第２のオペランドを提供する第３のプログラムコードとを含む、コンピュータデータ信号。
【請求項５０】
前記コンピュータ可読プログラムコードが、さらに、
前記レジスタセットのうちのどの前記レジスタに、前記第２のオペランドが保管されるかを指定するために、第３のオペランドを提供する第４のプログラムコードを含む、請求項４９に記載のコンピュータデータ信号。
【請求項５１】
前記コンピュータ可読プログラムコードが、さらに、
前記新規スレッドに割り振られた前記レジスタセットに関連する状況レジスタを提供する第４のプログラムコードをさらに含み、前記状況レジスタが、前記新規スレッドの割り振り以降に、前記レジスタセットが書き込まれたかどうかを示すインジケータを含む、請求項４９に記載のコンピュータデータ信号。
【請求項５２】
前記コンピュータ可読プログラムコードが、さらに、
プログラムカウンタおよびレジスタセットが、前記新規スレッドへの割り振りのために空いていない場合に、ｆｏｒｋ命令に対する例外を送出する例外インジケータを提供する第４のプログラムコードを含む、請求項４９に記載のコンピュータプログラム製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、すべての目的のために参照により本明細書に組み込まれる、次の同時係属の米国非仮特許出願の一部継続出願（ＣＩＰ）である。
【表１】
2007504535.tif 000003
【０００２】
上記の同時係属の米国非仮特許出願が、次の米国仮特許出願の恩恵を主張するものであり、次の米国仮特許出願のそれぞれは、その恩恵を主張するものであり、すべての目的のために参照により本明細書に組み込まれている。
【表２】
2007504535.tif 000004
【０００３】
本願は、それぞれがすべての目的のために参照により本明細書に組み込まれている、次の米国非仮特許出願に関連し、これらと同時に出願された。
【表３】
2007504535.tif 000005
【０００４】
本発明は、全般的にマルチスレッド化されたプロセッサ（ｍｕｌｔｉｔｈｒｅａｄｅｄ  ｐｒｏｃｅｓｓｏｒ）の分野に関し、具体的には、マルチスレッド化されたプロセッサで新しい実行のスレッドを生成する命令に関する。
【背景技術】
【０００５】
マイクロプロセッサ設計者は、多数の技術を使用して性能を高めている。ほとんどのマイクロプロセッサが、固定された周波数で動作するクロック信号を使用して動作する。各クロックサイクルで、マイクロプロセッサの回路が、それぞれの機能を実行する。ヘネシ（Ｈｅｎｎｅｓｓｙ）およびパターソン（Ｐａｔｔｅｒｓｏｎ）によれば、マイクロプロセッサの性能の真の尺度は、１つのプログラムまたはプログラムの集合を実行するのに必要な時間である。この観点から、マイクロプロセッサの性能は、そのクロック周波数、１つの命令を実行するのに必要なクロックサイクル数の平均値（言い換えると、クロックサイクルあたりに実行される命令の個数の平均値）、およびプログラムまたはプログラムの集合で実行される命令の個数に応じる。半導体の科学者およびエンジニアは、主にトランジスタサイズを縮小し、より高速のスイッチング時間をもたらすことによって、マイクロプロセッサがより高いクロック周波数で動作することを可能にすることを絶えず行っている。実行される命令の個数は、主に、プログラムによって実行されるタスクによって固定されているが、マイクロプロセッサの命令セットアーキテクチャによっても影響を受ける。大きい性能向上が、クロックサイクルあたりの命令を改善するアーキテクチャ的概念および編成概念、特に並列性という概念によって実現されてきた。
【０００６】
マイクロプロセッサのクロックサイクルあたりの命令、ならびにクロック周波数を改善した並列性という概念の１つが、マイクロプロセッサのパイプラインステージ内で複数の命令の実行をオーバーラップさせるパイプライン化である。理想的な状況で、各クロックサイクルで、１つの命令が、パイプラインで新しいステージに移動し、この新しいステージは、その命令に対して異なる機能を実行する。したがって、各個々の命令は、完了に複数のクロックサイクルを要するが、個々の命令の複数のサイクルがオーバーラップしているので、命令ごとの平均クロック数が減る。パイプライン化の性能改善は、プログラム内の命令がそれを許容する範囲まで、すなわち、命令が実行のためにその先行命令に依存せず、したがってその先行命令と並列に実行できる（一般に、これを命令レベル並列性と称する）範囲まで実現することができる。命令レベル並列性が、現代のマイクロプロセッサによって活用されるもう１つの形が、一般にスーパースカラマイクロプロセッサと称する、クロックサイクルごとに実行のために複数の命令を発行することである。
【０００７】
上で述べたことは、個々の命令レベルでの並列性に関する。しかし、命令レベル並列性の活用を介して達成できる性能改善は、制限されている。制限された命令レベル並列性によって課せられるさまざまな制約、および他の性能を制約する問題が、最近、一般にスレッドレベル並列性と称する、命令のブロック、シーケンス、またはストリームのレベルでの並列性活用への関心を復活させた。スレッドとは、単に、プログラム命令のシーケンスまたはストリームである。マルチスレッド化されたマイクロプロセッサは、インターリーブマルチスレッディング、ブロックドマルチスレッディング、または同時マルチスレッディングなど、さまざまなスレッドの命令のフェッチおよび発行を指示する、あるスケジューリングポリシに従って、複数のスレッドを並行して実行する。マルチスレッド化されたマイクロプロセッサは、通常、複数のスレッドが、並行した形でマイクロプロセッサの機能ユニット（たとえば、命令フェッチおよびデコードユニット、キャッシュ、分岐予測ユニット、およびロード／ストア、整数、浮動小数点、ＳＩＭＤなどの実行ユニット）を共用することを可能にする。しかし、マルチスレッド化されたマイクロプロセッサは、命令をフェッチするスレッドと命令を発行するスレッドとの間で、すばやく切り替える能力を促進するために、複数のプログラムカウンタおよび汎用レジスタセットなど、各スレッドの独自の状態を保管する、リソースまたはコンテキストの複数の組を含む。
【０００８】
マルチスレッディングマイクロプロセッサによって対処される、性能を制約する問題の一例が、キャッシュミスに起因して、実行されなければならないマイクロプロセッサの外部のメモリへのアクセスが、通常は比較的長い待ち時間を有するという事実である。現代のマイクロプロセッサベースのコンピュータシステムのメモリアクセス時間が、キャッシュヒットアクセス時間より１桁から２桁長くなることが一般的である。その結果、パイプラインが、メモリからのデータを待って失速している間に、シングルスレッド式マイクロプロセッサのパイプラインステージの一部またはすべてが、アイドルになり、多数のクロックサイクルの間に有用な作業を実行しない場合がある。マルチスレッド化されたマイクロプロセッサは、メモリフェッチ待ち時間中に他のスレッドからの命令を発行し、これによって、ページフォールト時にタスク切り替えを実行するオペレーティングシステムに多少似ているが、それより微細な細分性レベルで、パイプラインステージが有用な作業を実行して前進することを可能にすることによって、この問題を解決することができる。他の例が、分岐誤予測および付随するパイプラインフラッシュに起因する、データ依存性に起因する、または除算命令などの長い待ち時間の命令に起因する、パイプライン失速およびそれに付随するアイドルサイクルである。やはり、そうでなければアイドルになるはずのパイプラインステージに、他のスレッドからの命令を発行するマルチスレッド化されたマイクロプロセッサの能力は、スレッドを含むプログラムまたはプログラムの集合を実行するのに必要な時間を大きく減らすことができる。もう１つの問題、特に組込みシステムにおける問題が、割込みサービスに関連する、浪費されるオーバーヘッドである。通常、入出力デバイスが、マイクロプロセッサに割込みイベントを信号で伝える時に、そのマイクロプロセッサは、割込みサービスルーチンに制御を切り替えるが、この切り替えは、現在のプログラム状態を保存し、割込みをサービスし、かつ割込みがサービスされた後に、現在のプログラム状態を復元することを必要とする。マルチスレッド化されたマイクロプロセッサは、イベントサービスコードが、それ自体のコンテキストを有するそれ自体のスレッドになる能力を提供する。その結果、入出力デバイスがイベントを信号で伝えることに応答して、マイクロプロセッサは、すばやく（おそらく単一のクロックサイクルで）イベントサービススレッドに切り替えることができ、これによって、従来の割込みサービスルーチンオーバーヘッドをこうむらなくなる。
【０００９】
命令レベル並列性の度合が、マイクロプロセッサがパイプライン化およびスーパースカラ命令発行の利益を利用できる範囲を指定するのと同様に、スレッドレベル並列性の度合は、マイクロプロセッサがマルチスレッド化された実行を利用できる範囲を指定する。スレッドの重要な特性が、マルチスレッド化されたマイクロプロセッサで実行される他のスレッドとは無関係であることである。スレッドは、その命令が他のスレッドの命令に依存しない範囲まで、別のスレッドから無関係である。スレッドの独立の特性は、マイクロプロセッサが、さまざまなスレッドの命令を並行して実行することを可能にする。すなわち、マイクロプロセッサは、他のスレッドの発行される命令にかかわりなく、あるスレッドの命令を実行ユニットに発行することができる。スレッドが共通のデータにアクセスする範囲まで、スレッド自体は、互いにデータアクセスを同期化するようにプログラムされて、正しい動作を保証し、マイクロプロセッサ命令発行ステージが、依存性を気にかける必要をなくさなければならない。
【発明の開示】
【発明が解決しようとする課題】
【００１０】
前述から観察できるように、複数のスレッドを並行して実行するプロセッサは、複数のスレッドを含むプログラムまたはプログラムの集合を実行するのに必要な時間を減らすことができる。しかし、実行の新しいスレッドの作成およびディスパッチに関連するオーバーヘッドがある。すなわち、マイクロプロセッサは、新規スレッドを作成するのに必要な機能（通常は、新規スレッドのコンテキストを割り振り、および親スレッドのコンテキストを新規スレッドのコンテキストにコピーすること）を実行し、かつ実行のために新規スレッドをスケジューリングし、すなわち、マイクロプロセッサが、新規スレッドからの命令のフェッチおよび発行をいつ開始するかを判定して、有用な時間を費やさなければならない。オーバーヘッド時間は、マルチタスキングオペレーティングシステムのタスク切り替えオーバーヘッドに類似し、行列乗算、ネットワークから受信したパケットの処理、またはイメージのレンダリングなど、プログラムまたはプログラムの集合によって達成されなければならない実際のタスクの実行に寄与しない。その結果、理論的には、複数のスレッドを並列に実行することによって、マイクロプロセッサの性能を改善することができるが、性能向上の範囲は、新規スレッド作成のオーバーヘッドによって制限される。言い換えると、スレッド作成オーバーヘッドが大きいほど、スレッド作成のコストを償却するために新規スレッドによって実行されなければならない有用な作業の量が増える。比較的長い実行時間を有するスレッドについて、スレッド作成オーバーヘッドは、本質的に性能に無関係である場合がある。しかし、一部のアプリケーションは、比較的頻繁に作成され、比較的短い実行時間を有するスレッドから利益を得る場合があり、この場合に、スレッド作成オーバーヘッドは、マルチスレッディングからの実質的な性能向上を実現するために、小さくしなければならない。したがって、必要なものは、その命令セットに軽量スレッド作成命令を有する、マルチスレッド化されたマイクロプロセッサである。
【課題を解決するための手段】
【００１１】
本発明は、実行された時に、新規スレッドのためにスレッドコンテキストを割り振り、かつ新規スレッドの実行をスケジューリングする、マルチスレッド化されたマイクロプロセッサ命令セットに単一の命令を提供する。一実施形態で、この命令は、マイクロプロセッサ内の単一の命令発行スロットをＲＩＳＣ様の形で占める。この命令は、コンテキストが順次コピーされる場合に長い時間を必要とし、または並列にコピーされる場合に大量のデータパスおよび多重化論理を必要とする、新規スレッドへの親スレッドコンテキスト全体のコピーなしで済ませるので、非常に小さいオーバーヘッドを有する。その代わりに、この命令は、新規スレッドコンテキストのプログラムカウンタに保管される最初の命令フェッチアドレスである第１のオペランドと、汎用レジスタのうちの１つなど、新規スレッドコンテキストのレジスタセットのレジスタのうちの１つに保管される第２のオペランドとを含む。第２のオペランドは、新規スレッドによって、最初の汎用レジスタセット値などの新規スレッドが必要とする情報を含むメモリ内のデータ構造へのポインタとして、使用することができる。第２のオペランドは、そのデータ構造からロードすることによって、新規スレッドが、新規スレッドによって必要とするレジスタだけに投入することを可能にする。多くの新規スレッドが、１個と５個との間のレジスタだけに投入することを必要とすることに、本発明人が気付いたので、これは有利である。多くの現代のマイクロプロセッサは、たとえば３２個の汎用レジスタを含み、したがって、通常の場合に、本発明のマイクロプロセッサは、新規スレッドのレジスタセットに親スレッドレジスタセット全体をコピーするむだな努力を回避する。
【００１２】
一実施形態で、この命令は、新規スレッドコンテキストのどのレジスタが第２のオペランドを受け取るかを指定する、第３のオペランドを含む。一実施形態で、この命令は、ユーザモードコードによって実行可能であり、通常の場合に、オペレーティングシステムが関与してスレッドを作成する必要を有利になくす。新規スレッドコンテキスト割り振りおよび新規スレッドスケジューリングを実行する単一の命令を有することのもう１つの利点は、新規スレッドの作成およびスケジューリングに複数の命令を必要とする実装に対して、命令セット内の貴重なオペコードスペースが節約されることである。本発明の命令は、命令が実行された時に、空きスレッドコンテキストが割り振りに使用可能でない場合に、命令に対する例外を送出することによって、単一命令で両方の機能を実行することができる。
【００１３】
一態様で、本発明は、並行プログラムスレッドを実行するように構成されたマイクロプロセッサで実行される命令を提供する。この命令は、新規スレッドのためにリソースを割り振り、かつマイクロプロセッサで新規スレッドの実行をスケジューリングするように、マイクロプロセッサに指示するオペコードを含む。リソースは、プログラムカウンタおよびレジスタセットを含む。この命令は、新規スレッドのために割り振られたプログラムカウンタに保管される最初の命令フェッチアドレスを指定するために、第１のオペランドをも含む。この命令は、新規スレッドのために割り振られたレジスタセットのレジスタに保管するために、第２のオペランドをも含む。
【００１４】
もう１つの態様で、本発明は、マルチスレッド化されたマイクロプロセッサを提供する。このマイクロプロセッサは、複数のスレッドコンテキストを含み、それぞれスレッドコンテキストが、スレッドの状態を保管し、かつスレッドコンテキストが割り振りに使用可能であるかどうかを示すように構成される。このマイクロプロセッサは、現在実行中のスレッドの単一の命令に応答して、新規スレッドに複数のスレッドコンテキストのうちの１つを割り振り、かつ実行のために新規スレッドをスケジューリングするために、複数のスレッドコンテキストに結合された、スケジューラをも含む。このマイクロプロセッサは、複数のスレッドコンテキストのどれもが割り振りに使用可能でない場合に、単一の命令に対する例外を行う。
【００１５】
もう１つの態様で、本発明は、マルチスレッド化されたマイクロプロセッサを提供する。このマイクロプロセッサは、第１のプログラムスレッド内に命令のフェッチアドレスを保管するために、第１のプログラムカウンタを含む。このマイクロプロセッサは、それぞれ第１および第２のオペランドを保管するために、命令によって指定される第１および第２のレジスタを含む、第１のレジスタセットをも含む。第１のオペランドは、第２のプログラムスレッドのフェッチアドレスを指定する。このマイクロプロセッサは、命令に応答して第１のレジスタから第１のオペランドを受け取るために、第１のレジスタセットに結合された、第２のプログラムカウンタをも含む。このマイクロプロセッサは、命令に応答して第２のレジスタから第２のオペランドを受け取るために第３のレジスタを含む、第１のレジスタセットに結合された、第２のレジスタセットをも含む。このマイクロプロセッサは、マイクロプロセッサに、命令に応答して第２のプログラムカウンタに保管された第２のプログラムスレッドの最初のフェッチアドレスから命令をフェッチさせかつ実行させるために、第１および第２のレジスタセットに結合された、スケジューラをも含む。
【００１６】
もう１つの態様で、本発明は、マルチスレッド化されたマイクロプロセッサで新規の実行のスレッドを作成する方法を提供する。この方法は、第１のプログラムスレッドで実行する単一の命令をデコードすることと、命令のデコードに応答して、マイクロプロセッサのプログラムカウンタおよびレジスタセットを第２のプログラムスレッドのために割り振ることを含む。この方法は、第２のプログラムスレッドのためのプログラムカウンタおよびレジスタセットの割り振りに応答して、レジスタセットのレジスタに命令の第１のオペランドを保管することを含む。この方法は、第２のプログラムスレッドのためのプログラムカウンタおよびレジスタセットの割り振りに応答して、プログラムカウンタに命令の第２のオペランドを保管することを含む。この方法は、第１および第２のオペランドを保管した後に、マイクロプロセッサでの実行のために第２のプログラムスレッドをスケジューリングすることをも含む。
【００１７】
もう１つの態様で、本発明は、マルチスレッド化された処理システムを提供する。このシステムは、第１のスレッドのｆｏｒｋ命令およびデータ構造を保管するように構成されたメモリを含む。ｆｏｒｋ命令は、データ構造のメモリアドレスを保管するレジスタおよび第２のスレッドの最初の命令アドレスを指定する。このデータ構造は、第２のスレッドの最初の汎用レジスタ値を含む。このシステムは、メモリに結合されたマイクロプロセッサをも含む。このマイクロプロセッサは、ｆｏｒｋ命令に応答して、第２のスレッドに空きスレッドコンテキストを割り振り、第２のスレッドの最初の命令アドレスをスレッドコンテキストのプログラムカウンタに保管し、データ構造メモリアドレスをスレッドコンテキストのレジスタに保管し、実行のために第２のスレッドをスケジューリングする。
【００１８】
もう１つの態様で、本発明は、コンピューティングデバイスと共に使用されるコンピュータプログラム製品を提供する。このコンピュータプログラム製品は、コンピュータ使用可能媒体を含み、このコンピュータ使用可能媒体は、マルチスレッド化されたマイクロプロセッサをもたらす、コンピュータ使用可能媒体で実施されたコンピュータ可読プログラムコードを含む。このコンピュータ可読プログラムコードは、第１のプログラムスレッドに命令のフェッチアドレスを保管するために、第１のプログラムカウンタを提供する第１のプログラムコードを含む。このコンピュータ可読プログラムコードは、それぞれ第１および第２のオペランドを保管するために、命令によって指定される第１および第２のレジスタを含む第１のレジスタセットを提供する第２のプログラムコードをも含む。第１のオペランドは、第２のプログラムスレッドのフェッチアドレスを指定する。このコンピュータ可読プログラムコードは、命令に応答して第１のレジスタから第１のオペランドを受け取るために、第１のレジスタセットに結合された、第２のプログラムカウンタを提供する第３のプログラムコードをも含む。このコンピュータ可読プログラムコードは、命令に応答して第２のレジスタから第２のオペランドを受け取るために、第３のレジスタを含む、第１のレジスタセットに結合された、第２のレジスタセットを提供する第４のプログラムコードをも含む。このコンピュータ可読プログラムコードは、命令に応答して、マイクロプロセッサに、第２のプログラムカウンタに保管された第２のプログラムスレッドの最初のフェッチアドレスから命令をフェッチさせかつ実行させるために、第１および第２のレジスタセットに結合された、スケジューラを提供する第５のプログラムコードをも含む。
【００１９】
もう１つの態様で、本発明は、ｆｏｒｋ命令を実行するマルチスレッド化されたマイクロプロセッサを提供するコンピュータ可読プログラムコードを含む、伝送媒体内で実施されるコンピュータデータ信号を提供する。このプログラムコードは、新規スレッドのためにリソースを割り振り、かつマイクロプロセッサで新規スレッドの実行をスケジューリングするようにマイクロプロセッサに指示するために、オペコードを提供する第１のプログラムコードを含む。リソースに、プログラムカウンタおよびレジスタセットが含まれる。このプログラムコードは、新規スレッドのために割り振られたプログラムカウンタに保管される最初の命令フェッチアドレスを指定するために、第１のオペランドを提供する第２のプログラムコードをも含む。このプログラムコードは、新規スレッドのために割り振られたレジスタセットのレジスタに保管するために、第２のオペランドを提供する第３のプログラムコードをも含む。
【発明を実施するための最良の形態】
【００２０】
図１を参照すると、本発明によるコンピュータシステム１００を示すブロック図が示されている。コンピュータシステム１００は、システムインターフェースコントローラ１０４に結合されたマルチスレッド化されたマイクロプロセッサ１０２を含む。システムインターフェースコントローラは、システムメモリ１０８および複数の入出力（Ｉ／Ｏ）デバイス１０６に結合される。Ｉ／Ｏデバイス１０６のそれぞれは、マイクロプロセッサ１０２に割込み要求ライン１１２を提供する。コンピュータシステム１００は、汎用プログラマブルコンピュータシステム、サーバコンピュータ、ワークステーションコンピュータ、パーソナルコンピュータ、ノートブックコンピュータ、携帯情報端末（ＰＤＡ）、または、ネットワークルータ、もしくはネットワークスイッチ、プリンタ、マスストレージコントローラ、カメラ、スキャナ、自動車コントローラ、および類似物を含むがこれらに制限されない組込みシステムとすることができるが、これらに制限はされない。
【００２１】
システムメモリ１０８は、マイクロプロセッサ１０２での実行のためにプログラム命令を保管し、プログラム命令に従ってマイクロプロセッサ１０２によって処理されるデータを保管する、ＲＡＭメモリおよびＲＯＭメモリなどのメモリを含む。プログラム命令は、マイクロプロセッサ１０２が並行して実行する複数のプログラムスレッドを含むことができる。プログラムスレッドまたはスレッドは、実行されるプログラム命令のシーケンスまたはストリームと、命令のシーケンスの実行に関連するマイクロプロセッサ１０２での状態変化の関連するシーケンスとを含む。命令のシーケンスは、必ずではないが通常、分岐命令など、１つまたは複数のプログラム制御命令を含む。その結果、命令は、連続するメモリアドレスを有する場合とそうでない場合がある。１つのスレッドを含む命令のシーケンスは、単一のプログラムからのものである。具体的に言うと、マイクロプロセッサ１０２は、下で詳細に説明するように、新規プログラムスレッドを作成するため、すなわち、スレッドを実行するために必要なマイクロプロセッサ１０２のリソースを割り振り、かつマイクロプロセッサ１０２での実行のためにスレッドをスケジューリングするために、ＦＯＲＫ命令を実行するように構成される。
【００２２】
システムインターフェースコントローラ１０４は、マイクロプロセッサ１０２をシステムインターフェースコントローラ１０４に結合するプロセッサバスを介して、マイクロプロセッサ１０２とインターフェースする。一実施形態で、システムインターフェースコントローラ１０４は、システムメモリ１０８を制御するメモリコントローラを含む。一実施形態で、システムインターフェースコントローラ１０４は、Ｉ／Ｏデバイス１０６が結合される、たとえばＰＣＩバスなどのローカルバスを提供するローカルバスインターフェースコントローラを含む。  Ｉ／Ｏデバイス１０６は、キーボード、マウス、スキャナ、および類似物などのユーザ入力デバイスと、モニタ、プリンタ、および類似物などのディスプレイデバイスと、ディスクドライブ、テープドライブ、光ドライブ、および類似物などのストレージデバイスと、ダイレクトメモリアクセスコントローラ（ＤＭＡＣ）、クロック、タイマ、Ｉ／Ｏポート、および類似物などのシステム周辺デバイスと、Ｅｔｈｅｒｎｅｔ（登録商標）、ＦｉｂｒｅＣｈａｎｎｅｌ、Ｉｎｆｉｎｉｂａｎｄ、または他の高速ネットワークインターフェース用のメディアアクセスコントローラ（ＭＡＣ）などのネットワークデバイスと、アナログ−ディジタル（Ａ／Ｄ）変換器およびディジタル−アナログ変換器などのデータ変換デバイスなどとを含むことができるが、これらに制限はされない。Ｉ／Ｏデバイス１０６は、サービスを要求するためにマイクロプロセッサ１０２への割込み信号１１２を生成する。有利なことに、マイクロプロセッサ１０２は、マイクロプロセッサ１０２の状態保存に関連する従来のオーバーヘッドを必要とせずに、割込み要求ライン１１２で示されたイベントを処理する複数のプログラムスレッドを並行に実行し、制御を割込みサービスルーチンに転送し、かつ割込みサービスルーチンの完了時に状態を復元することができる。
【００２３】
一実施形態で、コンピュータシステム１００は、複数のマルチスレッド化されたマイクロプロセッサ１０２を含むマルチプロセッシングシステムを含む。一実施形態で、各マイクロプロセッサ１０２は、２つの別個であるが相互に排他的なマルチスレッディング機能を提供する。第１に、各マイクロプロセッサ１０２は、マイクロプロセッサ１０２内のリソースの共用を介して、本明細書で仮想処理要素（ＶＰＥ）と称する、オペレーティングシステムからはそれぞれが独立の処理要素に見える、複数の論理プロセッサコンテキストを含む。オペレーティングシステムにとって、Ｎ個のＶＰＥマイクロプロセッサ１０２は、Ｎウェイ対称マルチプロセッサ（ＳＭＰ）に見え、これによって、既存のＳＭＰ対応オペレーティングシステムが、複数のＶＰＥを管理できるようになる。第２に、各ＶＰＥは、複数のスレッドを同時に実行するための複数のスレッドコンテキストを含むことができる。その結果、マイクロプロセッサ１０２は、通常の場合に、オペレーティングシステム介入なしでスレッドを作成できかつ破棄でき、外部条件（たとえば、入出力サービスイベント信号）に応答して、０の割込み待ち時間でシステムサービススレッドをスケジューリングできる、マルチスレッド化されたプログラミングモデルをも提供する。
【００２４】
図２を参照すると、本発明による図１のコンピュータシステム１００のマルチスレッド化されたマイクロプロセッサ１０２を示すブロック図が示されている。マイクロプロセッサ１０２は、複数のパイプラインステージを含むパイプライン化されたマイクロプロセッサである。マイクロプロセッサ１０２は、複数のスレッドに関連する状態を保管する複数のスレッドコンテキスト２２８を含む。スレッドコンテキスト２２８は、スレッドの実行の状態を記述する、マイクロプロセッサ１０２のレジスタおよび／またはレジスタ内のビットの集合を含む。一実施形態で、スレッドコンテキスト２２８は、レジスタセット２２４（汎用レジスタ（ＧＰＲ）のセットなど）、プログラムカウンタ（ＰＣ）２２２、およびスレッドごとの制御レジスタ２２６を含む。スレッドごとの制御レジスタ２２６の諸部分の内容を、下で詳細に説明する。図２の実施形態には、それぞれが、プログラムカウンタ２２２、レジスタセット２２４、およびスレッドごとの制御レジスタ２２６を含む、４つのスレッドコンテキスト２２８が示されている。一実施形態で、スレッドコンテキスト２２８は、乗算器結果レジスタをも含む。一実施形態で、レジスタセット２２４のそれぞれが、単一クロックサイクル中のレジスタセット２２４内の２つのレジスタのそれぞれからの読み取り、および１つのレジスタへの書き込みをサポートするために、２つの読み取りポートおよび１つの書き込みポートを有する。下で説明するように、ＦＯＲＫ命令３００は、２つのソースオペランドおよび１つの宛先オペランドを含む。その結果、マイクロプロセッサ１０２は、単一クロックサイクルでＦＯＲＫ命令３００を実行することができる。
【００２５】
スレッドコンテキスト２２８と対照的に、マイクロプロセッサ１０２は、またプロセッサコンテキストを維持し、このプロセッサコンテキストは、マイクロプロセッサ１０２の状態のより大きい集合である。図２の実施形態では、プロセッサコンテキストが、プロセッサごとの制御レジスタ２１８に保管される。各ＶＰＥは、プロセッサごとの制御レジスタ２１８のそれ自体の組が含まれる。一実施形態で、プロセッサごとの制御レジスタ２１８のうちの１つに、例外信号２３４によって送出された最も最近にディスパッチされたスレッド例外を指定するフィールドを有する状況レジスタが含まれる。具体的に言うと、ＶＰＥが、現在のスレッドのＦＯＲＫ命令３００を発行するが、新規スレッドに割り振られる、空いている割り振り可能なスレッドコンテキスト２２８がない場合に、例外フィールドが、スレッドオーバーフロー状態を示す。一実施形態で、マイクロプロセッサ１０２は、ＭＩＰＳ３２またはＭＩＰＳ６４の命令セットアーキテクチャ（ＩＳＡ）に実質的に準拠し、プロセッサごとの制御レジスタ２１８は、仮想メモリ、キャッシュ、例外、およびユーザコンテキストなどのマイクロプロセッサ１０２のリソースをオペレーティングシステムが管理するのに必要な機構など、ＭＩＰＳ  Ｐｒｉｖｉｌｅｇｅｄ  Ｒｅｓｏｕｒｃｅ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＰＲＡ）のプロセッサコンテキストを保管するレジスタに実質的に準拠する。
【００２６】
マイクロプロセッサ１０２は、マイクロプロセッサ１０２によって並行に実行されるさまざまなスレッドの実行をスケジューリングするスケジューラ２１６が含まれる。スケジューラ２１６は、スレッドごとの制御レジスタ２２６およびプロセッサごとの制御レジスタ２１８に結合される。具体的に言うと、スケジューラ２１６は、下で説明するように、さまざまなスレッドのプログラムカウンタ２２２からの命令のフェッチをスケジューリングし、マイクロプロセッサ１０２の実行ユニットへのフェッチされた命令の発行をスケジューリングする責任を負う。スケジューラ２１６は、マイクロプロセッサ１０２のスケジューリングポリシに基づいてスレッドの実行をスケジューリングする。スケジューリングポリシは、次のスケジューリングポリシのどれであっても含むことができるが、これらに制限はされない。一実施形態で、スケジューラ２１６は、各準備のできているスレッドに、回転する順序で所定の個数のクロックサイクルまたは命令発行スロットを割り振る、ラウンドロビン、時分割多重、またはインターリーブ式のスケジューリングポリシを使用する。ラウンドロビンポリシは、公平さが重要であり、リアルタイムアプリケーションプログラムスレッドなど、最小量のサービスがあるスレッドについて必要である応用例に有用である。一実施形態で、スケジューラ２１６は、ブロッキングスケジューリングポリシを使用し、この場合に、スケジューラ２１６は、キャッシュミス、分岐誤予測、データ依存性、または長い待ち時間の命令など、スレッドのそれ以上の進行をブロックするイベントが発生するまで、現在実行されているスレッドのフェッチおよび発行のスケジューリングを続ける。一実施形態で、マイクロプロセッサ１０２に、スーパースカラパイプライン化マイクロプロセッサが含まれ、スケジューラ２１６は、一般に同時マルチスレッディングと称する、クロックサイクルごとに複数の命令の発行、具体的には、クロックサイクルごとに複数のスレッドからの命令の発行をスケジューリングする。
【００２７】
マイクロプロセッサ１０２は、図３のＦＯＲＫ命令３００など、図１のシステムメモリ１０８からフェッチされたプログラム命令をキャッシングする命令キャッシュ２０２を含む。一実施形態で、マイクロプロセッサ１０２は、仮想メモリ機能を提供し、フェッチユニット２０４は、物理メモリページから仮想メモリページへの変換をキャッシングする変換ルックアサイドバッファを含む。一実施形態で、マイクロプロセッサ１０２で実行されるプログラムまたはタスクのそれぞれは、一意のタスクＩＤまたはアドレス空間ＩＤ（ＡＳＩＤ）が割り当てられ、これは、メモリアクセス、具体的にはメモリアドレス変換に使用され、スレッドコンテキスト２２８も、そのスレッドに関連するＡＳＩＤ用のストレージを含む。一実施形態で、親スレッドが、新規スレッドを作成するためにＦＯＲＫ命令３００を実行する時に、新規スレッドは、親スレッドのＡＳＩＤおよびアドレス空間を継承する。一実施形態で、マイクロプロセッサ１０２で実行されるさまざまなスレッドが、命令キャッシュ２０２および変換ルックアサイドバッファを共用する。もう１つの実施形態で、各スレッドは、それ自体の変換ルックアサイドバッファが含まれる。
【００２８】
マイクロプロセッサ１０２は、命令キャッシュ２０２およびシステムメモリ１０８からＦＯＲＫ命令３００などのプログラム命令をフェッチするために、命令キャッシュ２０２に結合されたフェッチユニット２０４をも含む。フェッチユニット２０４は、マルチプレクサ２４４によって供給される命令フェッチアドレスの命令をフェッチする。マルチプレクサ２４４は、対応する複数のプログラムカウンタ２２２から複数の命令フェッチアドレスを受け取る。プログラムカウンタ２２２のそれぞれは、異なるプログラムスレッドの現在の命令フェッチアドレスを保管する。図２の実施形態は、４つの異なるスレッドに関連する４つの異なるプログラムカウンタ２２２を示る。マルチプレクサ２４４は、スケジューラ２１６によって供給される選択入力に基づいて、４つのプログラムカウンタ２２２のうちの１つを選択する。一実施形態で、マイクロプロセッサ１０２で実行されるさまざまなスレッドが、フェッチユニット２０４を共用する。
【００２９】
マイクロプロセッサ１０２は、ＦＯＲＫ命令３００など、フェッチユニット２０４によってフェッチされたプログラム命令をデコードするために、フェッチユニット２０４に結合された、デコードユニット２０６をも含む。デコードユニット２０６は、命令のオペコード、オペランド、および他のフィールドをデコードする。一実施形態で、マイクロプロセッサ１０２で実行されるさまざまなスレッドが、デコードユニット２０６を共用する。
【００３０】
マイクロプロセッサ１０２は、命令を実行する実行ユニット２１２をも含む。実行ユニット１１２は、整数算術、ブール演算、シフト演算、ローテート演算、および類似物を実行する１つまたは複数の整数ユニットと、浮動小数点演算を実行する浮動小数点ユニットと、メモリアクセス、具体的には実行ユニット２１２に結合されたデータキャッシュ２４２へのアクセスを実行するロード／ストアユニットと、分岐命令の結果およびターゲットアドレスを解決する分岐解決ユニットとを含むことができるが、これらに制限はされない。一実施形態で、データキャッシュ２４２は、物理メモリページから仮想メモリページへの変換をキャッシングする変換ルックアサイドバッファを含む。データキャッシュ２４２から受け取られるオペランドの他に、実行ユニット２１２は、レジスタセット２２４のレジスタからもオペランドを受け取る。具体的に言うと、実行ユニット２１２は、命令が属するスレッドに割り振られたスレッドコンテキスト２２８のレジスタセット２２４からオペランドを受け取る。マルチプレクサ２４８は、実行ユニット２１２によって実行される命令のスレッドコンテキスト２２８に基づいて、実行ユニット２１２に供給される適当なレジスタセット２２４からオペランドを選択する。一実施形態で、さまざまな実行ユニット２１２が、複数の並行スレッドからの命令を並行に実行することができる。
【００３１】
実行ユニット２１２のうちの１つが、ＦＯＲＫ命令３００を実行する責任を負い、ＦＯＲＫ命令３００を発行されたことに応答して、スケジューラ２１６に供給されるｎｅｗ＿ｔｈｒｅａｄ＿ｒｅｑｕｅｓｔ信号２３２で真の値を生成する。ｎｅｗ＿ｔｈｒｅａｄ＿ｒｅｑｕｅｓｔ信号２３２は、スケジューラ２１６に、新規スレッドコンテキスト２２８を割り振り、かつその新規スレッドコンテキスト２２８に関連する新規スレッドの実行をスケジューリングするように要求する。下で詳細に説明するように、新規スレッドコンテキスト２２８が、割り振りについて要求されたが、使用可能な空いている割り振り可能なスレッドがない場合に、スケジューラ２１６は、例外信号２３４で真の値を生成して、ＦＯＲＫ命令３００に対する例外を送出する。一実施形態で、スケジューラ２１６は、空いている割り振り可能なスレッドコンテキスト２２８の個数のカウントを維持し、ｎｅｗ＿ｔｈｒｅａｄ＿ｒｅｑｕｅｓｔ  ２３２が作られた時に、その個数が０未満である場合に、スケジューラ２１６は、ＦＯＲＫ命令３００に対する例外２３４を送出する。もう１つの実施形態では、スケジューラ２１６は、ｎｅｗ＿ｔｈｒｅａｄ＿ｒｅｑｕｅｓｔ  ２３２が作られた時に、スレッドごとの制御レジスタ２２６内の状況ビットを検査して、空いている割り振り可能なスレッドコンテキスト２２８が使用可能であるかどうかを判定する。
【００３２】
マイクロプロセッサ１０２は、スケジューラ２１６による指示に従い、かつデコードユニット２０６によってデコードされた命令に関する情報に応答して、実行ユニット２１２に命令を発行するために、スケジューラ２１６に結合され、かつデコードユニット２０６と実行ユニット２１２との間に結合された、命令発行ユニット２０８をも含む。具体的に言うと、命令発行ユニット２０８は、命令が、前に実行ユニット２１２に発行された他の命令に対するデータ依存性を有する場合に、それらの命令が、実行ユニット２１２に発行されないことを保証する。一実施形態で、命令キューが、実行ユニット２１２の枯渇の可能性を下げるために、実行ユニット２１２への発行を待っている命令をバッファリングするために、デコードユニット２０６と命令発行ユニット２０８との間に置かれる。一実施形態で、マイクロプロセッサ１０２で実行されるさまざまなスレッドが、命令発行ユニット２０８を共用する。
【００３３】
マイクロプロセッサ１０２は、完了した命令の結果をレジスタセット２２４にライトバックするために、実行ユニット２１２に結合されたライトバックユニット２１４をも含む。デマルチプレクサ２４６は、ライトバックユニット２１４から命令結果を受け取り、その命令結果を、完了した命令のスレッドに関連する適当なレジスタセット２２４に保管する。
【００３４】
図３を参照すると、本発明による図２のマイクロプロセッサ１０２によって実行されるＦＯＲＫ命令３００を示すブロック図が示されている。ＦＯＲＫ命令３００のニーモニックは、図示のようにｆｏｒｋ  ｒｄ，ｒｓ，ｒｔであり、ここで、ｒｄ、ｒｓ、およびｒｔは、ＦＯＲＫ命令３００の３つのオペランドである。図３に、ＦＯＲＫ命令３００のさまざまなフィールドが示されている。ビット２６〜３１は、オペコードフィールド３０２であり、ビット０〜５は、機能フィールド３１４である。一実施形態で、オペコードフィールド３０２は、この命令が、ＭＩＰＳ  ＩＳＡ内のＳＰＥＣＩＡＬ３命令であることを示し、機能フィールド３１４は、その機能がＦＯＲＫ命令であることを示す。したがって、図２のデコードユニット２０６は、オペコードフィールド３０２および機能フィールド３１４を検査して、命令がＦＯＲＫ命令３００であることを判定する。ビット６〜１０は、０として予約済みである。
【００３５】
ビット２１〜２５、１６〜２０、および１１〜１５は、それぞれｒｓフィールド３０４、ｒｔフィールド３０６、およびｒｄフィールド３０８であり、これらは、それぞれ、図２のレジスタセット２２４のうちの１つの、ｒｓレジスタ３２４、ｒｔレジスタ３２６、およびｒｄレジスタ３２８を指定する。一実施形態で、ｒｓレジスタ３２４、ｒｔレジスタ３２６、およびｒｄレジスタ３２８のそれぞれが、ＭＩＰＳ  ＩＳＡの３２個の汎用レジスタのうちの１つである。ｒｓレジスタ３２４およびｒｔレジスタ３２６は、それぞれ、親スレッド、ｆｏｒｋするスレッド、または現在のスレッドと称する、ＦＯＲＫ命令３００が含まれるスレッドに割り振られた、レジスタセット２２４内のレジスタの１つである。ｒｄレジスタ３２８は、新規スレッドまたは子スレッドと称する、ＦＯＲＫ命令３００が作成するスレッドに割り振られた、レジスタセット２２４のレジスタのうちの１つである。
【００３６】
図３からわかるように、ＦＯＲＫ命令３００は、親スレッドのｒｓレジスタ３２４からの値を新規スレッドのプログラムカウンタ２２２にコピーするように、マイクロプロセッサ１０２に指示する。新規スレッドのプログラムカウンタ２２２は、新規スレッドの最初の命令フェッチアドレスとして使用される。
【００３７】
さらに、ＦＯＲＫ命令３００は、親スレッドのｒｔレジスタ３２６からの値を新規スレッドのｒｄレジスタ３２８にコピーするように、マイクロプロセッサ１０２に指示する。通常のプログラム動作では、プログラムは、新規スレッドのデータ構造のメモリアドレスとしてｒｄレジスタ３２８値を使用する。これによって、ＦＯＲＫ命令３００が、親スレッドのレジスタセット２２４全体の内容を新規スレッドのレジスタセット２２４にコピーすることなしで済ませることが可能になり、これによって、ＦＯＲＫ命令３００が、有利なことに、より軽量で効率的になり、単一プロセッサクロックサイクル内で実行可能になる。その代わりに、新規スレッドに、データ構造からレジスタ値をロードすることによって、新規スレッドが必要とするレジスタだけを投入する命令が含まれ、このデータ構造は、データキャッシュ２４２内に存在する高い確率を有する。多くの新規スレッドが、通常、ＭＩＰＳ  ＩＳＡの３２個の汎用レジスタなど、多数の現在のマイクロプロセッサで通常見出される多数のレジスタではなく、１個と５個との間のレジスタだけに投入することを必要とすることが判定されたので、これは有利である。単一クロックサイクルでレジスタセット２２４全体をコピーすることは、マイクロプロセッサ１０２内のさまざまなスレッドコンテキスト２２８のそれぞれ間の非現実的に幅広いデータパスを必要とし、レジスタセット２２４全体を順次（すなわち、クロックサイクルごとに１つまたは２つのレジスタを）コピーすることは、はるかに時間がかかり、マイクロプロセッサ１０２のより高い複雑さを必要とする。しかし、ＦＯＲＫ命令３００は、ＲＩＳＣ様の単一クロックサイクルで有利に実行される。
【００３８】
有利なことに、マイクロプロセッサ１０２で実行されるオペレーティングシステムソフトウェアが、ＦＯＲＫ命令３００を使用して、新規スレッドのためにリソースを割り振り、かつ新規スレッドの実行をスケジューリングできるだけではなく、ユーザレベルスレッドも、それを行うことができる。この事実は、比較的短いスレッドを比較的頻繁に作成し、かつ終了させる可能性があるプログラムに特に有利である。たとえば、短いループ本体を有する多数のループを含み、反復の間にデータ依存性がないプログラムは、ＦＯＲＫ命令３００の小さいスレッド作成オーバーヘッドから利益を得ることができる。次のコードループがあると仮定する。
ｆｏｒ（ｉ  ＝  ０；  ｉ＜Ｎ；  ｉ＋＋）  ｛
ｒｅｓｕｌｔ［ｉ］  ＝  ＦＵＮＣＴＩＯＮ（ｘ［ｉ］，ｙ［ｉ］）；
｝
スレッド作成および破棄のオーバーヘッドが小さいほど、ＦＵＮＣＴＩＯＮ命令シーケンスを小さくすることができ、なおかつ複数のスレッドに有用に並列化することができる。新規スレッドの作成および破棄に関連するオーバーヘッドが、従来のスレッド作成機構の場合のように、１００命令程度である場合には、このループを複数のスレッドに並列化することからの利益があるとしても、それを得るために、ＦＵＮＣＴＩＯＮの長さは、多数の命令でなければならない。しかし、ＦＯＲＫ命令３００のオーバーヘッドが非常に小さく、一実施形態では単一クロックサイクルだけであるという事実は、すべての非常に短いコード領域でも、複数のスレッドに有益に並列化できることを有利に暗示する。
【００３９】
図３に、親スレッドコンテキスト２２８から新規スレッドコンテキスト２２８への、ｒｔレジスタ３２６値およびｒｓレジスタ３２４値のコピーだけが示されているが、図４に関して下で説明するように、他の状態またはコンテキストを、ＦＯＲＫ命令３００に応答してコピーすることもできる。
【００４０】
図４を参照すると、本発明による、図２のスレッドごとの制御レジスタ２２６のうちの１つである、ＴＣＳｔａｔｕｓレジスタ４００を示すブロック図が示されている。すなわち、各スレッドコンテキスト２２８は、ＴＣＳｔａｔｕｓレジスタ４００を含む。ＴＣＳｔａｔｕｓレジスタ４００のさまざまなフィールドが、図４の表で説明されているが、ＦＯＲＫ命令３００に明確に関連する特定のフィールドを、これから詳細に説明する。
【００４１】
ＴＣＳｔａｔｕｓレジスタ４００は、ＴＣＵフィールド４０２を含む。一実施形態で、マイクロプロセッサ１０２は、ＭＩＰＳ  ＩＳＡおよびＰＲＡによる、別個のプロセッサコアおよび１つまたは複数のコプロセッサを含む。ＴＣＵフィールド４０２は、スレッドが特定のコプロセッサへのアクセスを有し、これに束縛されるかどうかを制御する。図４の実施形態では、ＴＣＵフィールド４０２は、４つまでのコプロセッサの制御を可能にする。一実施形態で、ＦＯＲＫ命令３００は、親スレッドのＴＣＵフィールド４０２の値を、そのＦＯＲＫ命令３００によって作成される新規スレッドのＴＣＵフィールド４０２にコピーするように、マイクロプロセッサ１０２に指示する。
【００４２】
ＴＣＳｔａｔｕｓレジスタ４００は、ＤＴビット４０６をも含み、これは、スレッドコンテキスト２２８がダーティであるか否かを示す。ＤＴビット４０６は、異なるプログラムの間のセキュリティを保証するために、オペレーティングシステムによって使用することができる。たとえば、複数のスレッドコンテキスト２２８が、異なるセキュリティドメイン内で、すなわち複数のアプリケーションによって、またはオペレーティングシステムとアプリケーションプログラムの両方によって、同時に、ＦＯＲＫ命令３００を使用して動的に割り振られ、かつマイクロプロセッサ１０２のＹＩＥＬＤ命令を使用して割り振り解除される場合に、アプリケーションによって継承されるレジスタ値の形での情報漏れの危険性が存在し、これは、セキュアオペレーティングシステムによって管理されなければならない。各スレッドコンテキスト２２８に関連するＤＴビット４０６は、ソフトウェアによってクリアすることができ、スレッドコンテキスト２２８が変更された時に必ず、マイクロプロセッサ１０２によってセットされる。オペレーティングシステムは、タスクをスケジューリングする前に、すべてのスレッドコンテキスト２２８を既知のクリーンな状態に初期化し、すべての関連するＤＴビット４０６をクリアすることができる。タスク切り替えが発生する時に、そのＤＴビット４０６をセットされているスレッドコンテキスト２２８は、他のタスクがそれらを割り振り、かつ使用することを許可される前に、クリーンな状態にスクラブされなければならない。セキュアオペレーティングシステムが、特権サービススレッドのために動的にスレッド作成および割り振りを利用したい場合には、関連するスレッドコンテキスト２２８は、アプリケーションによる潜在的な使用のために解放される前に、スクラブされなければならない。本明細書の始めで参照された、ＹＩＥＬＤ命令を詳細に説明した、同時係属であり同時に出願された米国特許出願、名称「ＩＮＴＥＧＲＡＴＥＤ  ＭＥＣＨＡＮＩＳＭ  ＦＯＲ  ＳＵＳＰＥＮＳＩＯＮ  ＡＮＤ  ＤＥＡＬＬＯＣＡＴＩＯＮ  ＯＦ  ＣＯＭＰＵＴＡＴＩＯＮＡＬ  ＴＨＲＥＡＤＳ  ＯＦ  ＥＸＥＣＵＴＩＯＮ  ＩＮ  Ａ  ＰＲＯＣＥＳＳＯＲ」（弁理士整理番号ＭＩＰＳ．０１８９−０１  ＵＳ）を参照されたい。
【００４３】
ＴＣＳｔａｔｕｓレジスタ４００は、スレッドコンテキスト２２８が、ＦＯＲＫ命令３００によって動的に割り振り可能かつスケジュール可能であり、ＹＩＥＬＤ命令によって動的に割り振り解除可能であるか否かを示す、ＤＡ状況ビット４１２をも含む。一実施形態で、スレッドコンテキスト２２８の一部が、ＦＯＲＫ命令３００によって動的割り振り可能であり、スレッドコンテキスト２２８の一部が、ＦＯＲＫ命令３００によって動的割り振り可能でないが、その代わりに、スレッドコンテキスト２２８が、プログラムの永久スレッドに静的に割り当てられる。たとえば、１つまたは複数のスレッドコンテキスト２２８を、ＦＯＲＫ命令３００によって動的に割り振るのではなく、オペレーティングシステムの一部に静的に割り当てることができる。もう１つの例で、組込み応用例で、１つまたは複数のスレッドコンテキスト２２８が、特権サービススレッドに静的に割り当てられることができ、特権サービススレッドは、従来のプロセッサにおいて、その応用例の特に重要な部分であることがわかっている、割込み供給源をサービスする割込みサービスルーチンに似た形で機能する。たとえば、ネットワークルータ内で、１つまたは複数のスレッドコンテキスト２２８が、Ｉ／Ｏポートの組によって信号が伝えられるイベントを処理するスレッドに静的に割り当てられることができ、それは、本明細書に記載のマイクロプロセッサ１０２の単一サイクルスレッド切り替えによって、効率的に処理されることができるイベントを極度に大量に生成する可能性があるが、極端に大量の割込みとそれに関連する状態保存および割込みサービスルーチンへの制御の転送とに関連するオーバーヘッドをこうむらなければならない、別のマイクロプロセッサを圧倒する可能性がある。
【００４４】
一実施形態で、ＤＡビット４１２は、オペレーティングシステムによって使用されて、アプリケーションプログラムの間でのスレッドコンテキスト２２８の共用を処理することができる。たとえば、ＦＯＲＫ命令３００が、割り振りに関して空いているスレッドコンテキスト２２８がない時に、スレッドコンテキスト２２８の割り振りを試みる場合があり、その場合に、マイクロプロセッサ１０２は、そのＦＯＲＫ命令３００に対するスレッドオーバーフロー例外２３４を送出する。それに応答して、オペレーティングシステムは、現在の値のコピーを保存し、その後、すべてのスレッドコンテキスト２２８のＤＡビット４１２をクリアすることができる。次にスレッドコンテキスト２２８が、アプリケーションプログラムによって割り振り解除される時に、スレッドアンダーフロー例外２３４が送出され、これに応答して、オペレーティングシステムは、スレッドオーバーフロー例外に応答して保存されたＤＡビット４１２を復元し、最初のスレッドオーバーフロー例外を生成したＦＯＲＫ命令３００のやり直しをスケジューリングすることができる。
【００４５】
ＴＣＳｔａｔｕｓレジスタ４００は、スレッドコンテキスト２２８に関連するスレッドが、アクティブ化された状態であるかどうかを示す、Ａビット４１４をも含む。スレッドがアクティブ化された状態である時には、スケジューラ２１６は、スケジューラ２１６のスケジューリングポリシに従って、そのプログラムカウンタ２２２から命令をフェッチしかつ発行するようにスケジューリングされる。スケジューラ２１６は、ＦＯＲＫ命令３００が、スレッドコンテキスト２２８を動的に割り振る時に、Ａビット４１４を自動的にセットし、かつＹＩＥＬＤ命令が、スレッドコンテキスト２２８を動的に割り振り解除する時に、Ａビット４１４を自動的にクリアする。一実施形態で、マイクロプロセッサ１０２がリセットされた時に、スレッドコンテキスト２２８のうちの１つが、マイクロプロセッサ１０２の初期化スレッドを実行するために、リセットスレッドコンテキスト２２８として指定される。リセットスレッドコンテキスト２２８のＡビット４１４は、マイクロプロセッサ１０２のリセットに応答して自動的にセットされる。
【００４６】
ＴＣＳｔａｔｕｓレジスタ４００は、スレッドコンテキスト２２８の特権状態または特権レベルを示す、ＴＫＳＵフィールド４１６をも含む。一実施形態で、特権は、カーネル、スーパーバイザ、およびユーザという３つのレベルのうちの１つとすることができる。一実施形態で、ＦＯＲＫ命令３００は、親スレッドのＴＫＳＵフィールド４１６の値を、そのＦＯＲＫ命令３００によって作成される新規スレッドのＴＫＳＵフィールド４１６にコピーするように、マイクロプロセッサ１０２に指示する。
【００４７】
ＴＣＳｔａｔｕｓレジスタ４００は、スレッドコンテキスト２２８のアドレス空間ＩＤ（ＡＳＩＤ）または一意のタスクＩＤを指定する、ＴＡＳＩＤフィールド４２２をも含む。一実施形態で、ＦＯＲＫ命令３００は、親スレッドおよび新規スレッドが同一のアドレス空間を共用するように、親スレッドのＴＡＳＩＤフィールド４２２の値を、そのＦＯＲＫ命令３００によって作成される新規スレッドのＴＡＳＩＤフィールド４２２にコピーするように、マイクロプロセッサ１０２に指示する。
【００４８】
一実施形態で、スレッドごとの制御レジスタ２２６は、停止された（ｈａｌｔｅｄ）ビットをセットすることによって、ソフトウェアがスレッドを停止させるすなわち、スレッドコンテキスト２２８を停止された状態にすることを可能にするために、停止されたビットを保管するレジスタをも含む。
【００４９】
図５を参照すると、本発明による図３のＦＯＲＫ命令３００を実行する、図２のマイクロプロセッサ１０２の動作を示す流れ図が示されている。流れは、ブロック５０２で開始される。
【００５０】
ブロック５０２では、フェッチユニット２０４が、現在のスレッドのプログラムカウンタ２２２を使用してＦＯＲＫ命令３００をフェッチし、デコードユニット２０６が、そのＦＯＲＫ命令３００をデコードし、命令発行ユニット２０８が、図２の実行ユニット２１２にそのＦＯＲＫ命令３００を発行する。流れは、ブロック５０４に進む。
【００５１】
ブロック５０４では、実行ユニット２１２が、ｎｅｗ＿ｔｈｒｅａｄ＿ｒｅｑｕｅｓｔ信号２３２を介して、ＦＯＲＫ命令３００が、新規スレッドコンテキスト２２８の割り振りおよびスケジューリングを要求していることを示す。流れは、判断ブロック５０６に進む。
【００５２】
判断ブロック５０６では、スケジューラ２１６が、スレッドコンテキスト２２８が割り振りのために空いているかどうかを判定する。一実施形態で、スケジューラ２１６は、空いている割り振り可能なスレッドコンテキスト２２８の個数を示すカウンタを維持し、このカウンタは、ＹＩＥＬＤ命令が、スレッドコンテキスト２２８を割り振り解除するたびに増分され、かつＦＯＲＫ命令３００が、スレッドコンテキスト２２８を割り振るたびに減分される。スケジューラ２１６は、そのカウンタ値が０以上であるかどうかを判定することによって、スレッドコンテキスト２２８が、割り振りのために空いているかどうかを判定する。もう１つの実施形態で、スケジューラ２１６は、図４のＴＣＳｔａｔｕｓレジスタ４００のＤＡビット４１２およびＡビット４１４、ならびに停止されたビットなどの、スレッドごとの制御レジスタ２２６内の状態ビットを検査して、スレッドコンテキスト２２８が割り振りのために空いているかどうかを判定する。スレッドコンテキスト２２８が、割り振りのために空いているのは、それが、アクティブ化された状態でも停止された状態でもなく、静的に割り当てられたスレッドコンテキスト２２８でもない場合である。スレッドコンテキスト２２８が、割り振りのために空いている場合には、流れはブロック５０８に進み、そうでない場合には、流れはブロック５２２に進む。
【００５３】
ブロック５０８では、スケジューラ２１６が、ＦＯＲＫ命令３００に応答して、空いている割り振り可能なスレッドコンテキスト２２８を新規スレッドのために割り振る。流れは、ブロック５１２に進む。
【００５４】
ブロック５１２では、図３に示されているように、親スレッドコンテキスト２２８のｒｓレジスタ３２４値を、新規スレッドコンテキスト２２８のプログラムカウンタ２２２にコピーし、親スレッドコンテキスト２２８のｒｔレジスタ３２６値を、新規スレッドコンテキスト２２８のｒｄレジスタ３２８にコピーし、図４に関して説明したように、ＦＯＲＫ命令３００に関連する他のコンテキストも、親スレッドコンテキスト２２８から新規スレッドコンテキスト２２８にコピーされる。流れは、ブロック５１４に進む。
【００５５】
ブロック５１４では、スケジューラ２１６が、実行のために新規スレッドコンテキスト２２８をスケジューリングする。すなわち、スケジューラ２１６は、現在実行の準備ができているスレッドコンテキスト２２８のリストに、スレッドコンテキスト２２８を追加し、フェッチユニット２０４が、スケジューリングポリシの制約に従う、スレッドコンテキスト２２８のプログラムカウンタ２２２からの命令のフェッチおよび実行を開始できるようにする。流れは、ブロック５１６に進む。
【００５６】
ブロック５１６では、フェッチユニット２０４が、新規スレッドコンテキスト２２８のプログラムカウンタ２２２にある命令のフェッチを開始する。流れは、ブロック５１８に進む。
【００５７】
ブロック５１８では、新規スレッドの命令が、必要なように新規スレッドコンテキスト２２８のレジスタセット２２４のレジスタに投入する。上で説明したように、通常、新規スレッドのプログラム命令は、ｒｄレジスタ３２８値によって指定されるメモリ内のデータ構造からレジスタセット２２４に投入する。流れは、ブロック５１８で終了する。
【００５８】
ブロック５２２では、スケジューラ２１６が、ＦＯＲＫ命令３００に対するスレッドオーバーフロー例外２３４を送出して、ＦＯＲＫ命令３００が実行された時に、割り振り用に空いていたスレッドコンテキスト２２８がなかったことを示す。流れは、ブロック５２４に進む。
【００５９】
ブロック５２４では、オペレーティングシステムの例外ハンドラが、たとえば図４のＤＡビット４１２に関して上で説明したように、割り振り可能なスレッドコンテキスト２２８をＦＯＲＫ命令３００のために解放できる状態を作成する。流れは、ブロック５２６に進む。
【００６０】
ブロック５２６では、オペレーティングシステムが、ブロック５２２で例外２３４を引き起こしたＦＯＲＫ命令３００を再発行し、このＦＯＲＫ命令３００は、たとえば図４のＤＡビット４１２に関して上で説明したように、空いている割り振り可能なスレッドコンテキスト２２８の可用性に起因して、今度は成功する。流れは、ブロック５２６で終了する。
【００６１】
本発明とその目的、特徴、および利点を、詳細に説明したが、他の実施形態が、本発明によって包含されている。たとえば、新規スレッドコンテキスト２２８が、親スレッドコンテキストと同一のＶＰＥで割り振られる実施形態を説明したが、もう１つの実施形態では、空いている割り振り可能なスレッドコンテキストがそのＶＰＥで使用可能でないことを、親ＶＰＥが検出した場合に、そのＶＰＥは、別のＶＰＥでのリモートＦＯＲＫ命令を試みる。具体的には、そのＶＰＥは、別のＶＰＥが空いている割り振り可能スレッドコンテキストを有し、親スレッドコンテキストと同一のアドレス空間を有するかどうかを判定し、そうである場合には、他方のＶＰＥにＦＯＲＫ命令情報パケットを送って、他方のＶＰＥが、空きスレッドコンテキストを割り振りかつスケジューリングすることを可能にする。さらに、本明細書で説明したＦＯＲＫ命令は、特定の待ち時間イベントを解決するために複数のスレッドを並行して実行するマイクロプロセッサでの使用に制限されるのではなく、キャッシュミス、誤予測された分岐、長い待ち時間の命令などでマルチスレッディングされるマイクロプロセッサで実行されることができる。さらに、本明細書で説明したＦＯＲＫ命令は、スカラマイクロプロセッサまたはスーパースカラマイクロプロセッサで実行することができる。さらに、本明細書で説明したＦＯＲＫ命令は、さまざまなスケジューリングポリシのいずれかを有するマイクロプロセッサで実行することができる。さらに、ｒｔ値が、新規スレッドコンテキストのレジスタにコピーされるＦＯＲＫ命令の実施形態を説明したが、ｒｔ値が、メモリを介するなど、他の手段を介して新規スレッドコンテキストに供給される他の実施形態が考えられる。最後に、ＦＯＲＫ命令のオペランドが汎用レジスタに保管される実施形態を説明したが、他の実施形態では、オペランドを、メモリまたは非汎用レジスタを介するなど、他の手段を介して保管することができる。たとえば、マイクロプロセッサがレジスタベースプロセッサである実施形態を説明したが、プロセッサが、Ｊａｖａ（登録商標）仮想マシンコードを効率的に実行するように構成されたプロセッサなど、スタックベースプロセッサである他の実施形態が考えられる。そのような実施形態では、ＦＯＲＫ命令のオペランドを、レジスタではなくメモリ内のオペランドスタックで指定することができる。たとえば、各スレッドコンテキストに、スタックポインタレジスタを含めることができ、ＦＯＲＫ命令のフィールドが、マイクロプロセッサのレジスタ空間内のレジスタを指定するのではなく、スタックポインタレジスタ値に対するスタックメモリ内のＦＯＲＫオペランドのオフセットを指定することができる。
【００６２】
ハードウェアを使用する本発明の実装に加えて、本発明は、たとえばコンピュータ使用可能（たとえば可読）媒体に配置されたソフトウェア（たとえば、コンピュータ可読コード、プログラムコード、命令、および／またはデータ）で実施されることができる。そのようなソフトウェアは、本明細書で説明した装置および方法の機能、製造、モデル化、シミュレーション、記述、および／またはテストを可能にする。たとえば、これを、一般的なプログラミング言語（たとえば、Ｃ、Ｃ＋＋、Ｊａｖａ（登録商標）など）、ＧＤＳＩＩデータベース、Ｖｅｒｉｌｏｇ  ＨＤＬ、ＶＨＤＬなどを含むハードウェア記述言語（ＨＤＬ）など、または他の使用可能なプログラム、データベース、および／もしくは回路（すなわち、概略）キャプチャツールの使用を介して達成することができる。そのようなソフトウェアは、半導体メモリ、磁気ディスク、光ディスク（たとえば、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭなど）を含むすべての知られているコンピュータ使用可能（たとえば可読）媒体に配置することができ、コンピュータ使用可能（たとえば可読）伝送媒体（たとえば、搬送波またはディジタル媒体、光媒体、もしくはアナログベースの媒体を含む他のすべての媒体）で実施されるコンピュータデータ信号として配置することができる。したがって、ソフトウェアを、インターネットおよびイントラネットを含む通信ネットワークを介して伝送することができる。本発明は、ソフトウェアで（たとえば、マイクロプロセッサコアなどの半導体知的所有権コアの一部として、またはシステムオンチップすなわちＳＯＣなどのシステムレベル設計としてＨＤＬで）実施され、集積回路製造の一部としてハードウェアに変換できることを理解されたい。また、本発明は、ハードウェアとソフトウェアの組み合わせとして実施されることができる。
【００６３】
最後に、当業者は、特許請求の範囲によって規定される本発明の趣旨および範囲から逸脱せずに、本発明と同一の目的を実行する他の構造を設計または変更する基礎として、開示された概念および特定の実施形態をたやすく使用できることを理解されたい。
【図面の簡単な説明】
【００６４】
【図１】本発明によるコンピュータシステムを示すブロック図である。
【図２】本発明による図１のコンピュータシステムのマルチスレッド化されたマイクロプロセッサを示すブロック図である。
【図３】本発明による図２のマイクロプロセッサによって実行されるＦＯＲＫ命令を示すブロック図である。
【図４】本発明による、図２のスレッドごとの制御レジスタのうちの１つである、ＴＣＳｔａｔｕｓレジスタを示すブロック図である。
【図５】本発明による図３のＦＯＲＫ命令を実行する、図２のマイクロプロセッサの動作を示す流れ図である。
【図１】
2007504535.tif 000006
【図２】
2007504535.tif 000007
【図３】
2007504535.tif 000008
【図４】
2007504535.tif 000009
【図５】
2007504535.tif 000010
【国際調査報告】
2007504535.tif 000011
2007504535.tif 000012
2007504535.tif 000013