(57)【要約】  マルチスレッドプロセッサは複数のスレッドを同時に処理するプロセッシングユニット（ＰＵ）を具える。複数のレジスタを有するレジスタファイル手段（ＲＦ）が設けられ、このレジスタファイル内の少なくとも１つの第１レジスタ（ＬＩ）がループインバリアント値を格納するために使用され、Ｎ個の第２レジスタ（ＬＶ１−ＬＶＮ）の各々がループバリアント値を格納するために使用される。更に、複数のスレッドにそれぞれ関連するＮ個のプログラムカウンタ（ＰＣ１−ＰＣＮ）が設けられ、ここでＮは処理すべきスレッドの数である。
2008529119.tif 000002
【特許請求の範囲】
【請求項１】
複数のスレッドを同時に処理するプロセッシングユニット(PU)と、
複数のレジスタ(LI,LV)を具え、少なくとも１つの第１レジスタ(LI)はループインバリアント値を格納するために使用され、Ｎ個の第２レジスタ(LVI-LVN)の各々はループバリアント値を格納するために使用されるレジスタファイル(RF)と、
複数のスレッドにそれぞれ関連するＮ個のプログラムカウンタ(PC1-PCN)とを具え、
Ｎは処理すべきスレッドの数であることを特徴とするマルチスレッドプロセッサ。
【請求項２】
前記Ｎ個の第２レジスタ(LV1-LVN)が前記複数のスレッドにそれぞれ関連し、前記少なくとも１つの第１レジスタ(LI)が前記複数のスレッドで共用されることを特徴とする請求項１記載のマルチスレッドプロセッサ。
【請求項３】
前記レジスタファイル(RF)内の複数のレジスタの、前記第１及び第２レジスタ(LI;LV1-LV3)への区分化はループごとに行われることを特徴とする請求項１又は２記載のマルチスレッドプロセッサ。
【請求項４】
一組の命令内の並列ループをコンパイルする方法であって、
レジスタファイル(RF)を有するマルチスレッドプロセッサ(PU)用の一組の命令内のループにおけるループインバリアント値及びループバリアント値を検出する手順と、
前記レジスタファイル(RF)の複数のレジスタ(LI;LV1-LVN)を、前記ループインバリアント値を格納するための少なくとも１つの第１レジスタ(LI)と、前記ループバリアント値を各々格納するためのＮ個の第２レジスタ(LV1-LVN)とに区分化する手順とを具え、
Ｎは処理すべきスレッドの数であることを特徴とするコンパイル方法。
【請求項５】
前記Ｎ個の第２レジスタ(LV1-LVN)が前記複数のスレッドにそれぞれ関連し、前記少なくとも１つの第１レジスタ(LI)が前記複数のスレッドで共用されることを特徴とする請求項４記載の方法。
【請求項６】
前記レジスタファイル(RF)内の複数のレジスタの、前記第１及び第２レジスタ(LI;LV1-LVN)への区分化は少なくとも１つのループについて行うことを特徴とする請求項４又は５記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、多数のタスクを同時に処理するプロセッシングユニットを有するマルチスレッドプロセッサ並びに並列ループをコンパイルする方法に関する。
【背景技術】
【０００２】
プロセッサは一般にスレッドからの命令を実行し、命令により参照されるデータのためのレジスタファイル並びに現在実行されている命令のアドレスのためのプログラムカウンタ、即ち命令アドレスカウンタを具える。メモリからデータ又は次の命令を待っているためにプログラムが命令を実行しない時間を低減するために、多数のスレッドがプロセッサで同時に実行される。１つのスレッドの実行がストールすると、次のスレッドにスイッチされる。このようなスイッチングはコンテキストスイッチングとも言われる。効率的で高速のスイッチングを可能にするためには、多数のスレッドのコンテキストをプロセッサに保持する必要がある。このため、マルチスレッドプロセッサは各スレッドごとにレジスタファイル及びプログラムカウンタを具える必要がある。マルチスレッドプロセッサの性能を向上させるためには、多数のコンテキストを格納するために追加のリソースが必要とされる。しかし、追加のリソースは所要のダイ面積及び高い設計複雑さに関して追加のコスト増大をまねく。
【０００３】
米国特許第６３５１８０８号明細書は複製レジスタファイル構造付きマルチスレッドプロセッサに関する。
【０００４】
米国特許第６０９２１７５号明細書は多数のコンテキスト又はスレッドをサポートするマルチスレッドプロセッサを開示する。レジスタの数を低減するために、いくつかのレジスタフィルが複数のスレッドで共用され、必要に応じ各スレッドに割り当てられる。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本発明の目的は、マルチスレッドプロセッサ及びマルチスレッドプロセッサのための並列ループコンパイル方法を低いハードウエアコストで提供することにある。
【課題を解決するための手段】
【０００６】
この目的は、請求項１に記載のマルチスレッドプロセッサにより及び請求項４に記載の並列ループコンパイル方法により解決される。
【０００７】
そのために、マルチスレッドプロセッサは複数のスレッドを同時に処理するプロセッシングユニットを具える。複数のレジスタを有するレジスタファイル手段が設けられ、このレジスタファイル内の少なくとも１つの第１レジスタがループインバリアント値を格納するために使用され、Ｎ個の第２レジスタの各々がループバリアント値を格納するために使用される。更に、複数のスレッドにそれぞれ関連するＮ個のプログラムカウンタが設けられ、ここでＮは処理すべきスレッドの数である。
【０００８】
プログラムカウンタとレジスタファイルの一部が重複化されるだけであるので、マルチスレッドプロセッサに対するハードウエア複雑さ及びハードウエアコストを低減できる。
【０００９】
本発明の特徴によれば、Ｎ個の第２レジスタの各々が複数のスレッドの一つと関連し、少なくとも１つの第１レジスタが複数のスレッドで共用される。このため、第１レジスタを複数のスレッドで共用することにより、このような第１レジスタを各スレッドごとに設ける必要がない。これは、レジスタファイル内のレジスタの利用効率の向上をもたらす。ループインバリアント値格納用の第１レジスタを各スレッドごとに割り当てる代わりに、ただ１つの第１レジスタが全てのスレッドに割り当てられ、即ち全てのスレッドで共用される。
【００１０】
本発明の他の特徴によれば、レジスタファイル内の複数のレジスタの、第１及び第２レジスタへの分配又は割り当てはループごとに実行される。要件は各ループごとに変化し得るので、ループインバリアント値及びループバリアント値のためのレジスタの分配又は割り当ては各ループごとに実行することができる。
【００１１】
本発明は一組の命令内の並列ループをコンパイルする方法にも関する。レジスタファイルを有するマルチスレッドプロセッサのための一組の命令内のループに含まれるループインバリアント値及びループバリアント値を検出する。レジスタファイルの複数のレジスタを、ループインバリアント値を格納するための少なくとも１つの第１レジスタと、ループバリアント値を各々格納するためのＮ個の第２レジスタとに分配又は割り当て、ここでＮは処理すべきスレッドの数である。
【００１２】
本発明は、ループを複数のスレッドにコンパイルするアイディアに基づくものである。それに応じて、プログラムカウンタだけを重複化し、レジスタファイルは完全には重複化しない。従来技術によればレジスタファイルはＮ個のループインバリアントレジスタとＮ個のループバリアントレジスタを必要とするが、本発明はループインバリアント値用のレジスタ（複数のスレッドで共用される）と、Ｎ個のスレッドにそれぞれ関連する又は専用されるＮ個のレジスタを必要とするのみである。レジスタファイル内の既存のレジスタがループバリアント値用のレジスタとループインバリアント値用のレジスタとに分配又は割り当てられ、即ちレジスタが互いに素な副集合に分配される。並列ループを２つ以上のループに変換（翻訳）することによりマルチスレッディングを並列ループに適用する。
【００１３】
本願発明のこれらの特徴及び他の特徴は以下に記載する次信号例を参照すると明らかになる。
【発明を実施するための最良の形態】
【００１４】
図１は本発明によるマルチスレッドプロセッサの基本アーキテクチャを示す。このプロセッサはＮ個のスレッドを同時に処理し得るプロセッシングユニットＰＵを具える。図１の実施例によれば、３つのスレッドが処理され、即ちＮ＝３である。従って、各スレッドにつき１つのプログラムカウンタユニット、即ち第１、第２及び第３のプログラムカウンタユニットＰＣ１，ＰＣ２，ＰＣ３を具えるプログラムカウンタＰＣが実装される。更に、レジスタファイルＲＦに複数のレジスタが設けられる。ここには、８個のレジスタだけ示されている。レジスタファイルＲＦの多数のレジスタから、複数のレジスタセットＬＶ１−ＬＶ３が、各スレッドに対してループバリアント値用に分配又は割り当てられる。即ち、ループバリアント値用のレジスタＬＶ１−ＬＶ３がスレッドの数に応じて重複化され、ループバリアント用の１つのレジスタセットＬＶ１−ＬＶ３がスレッドのそれぞれに関連するようにする。換言すれば、レジスタファイル内のレジスタの分配は、Ｎ個のレジスタ（各スレッドにつき１つ）をループバリアント値用に割り当てるように行われる。レジスタファイルＲＦは更にループインバリアント値用のレジスタセットＬＩを具え（１つのレジスタがインバリアント値用に割り当てられ、スレッド間で共用される）、そのためレジスタファイルＲＦはループインバリアント値用のレジスタＬＩとループバリアント値用の３（Ｎ）個のレジスタセットＬＶとを具え、残りの４個のレジスタは使用されない。Ｎの値は単に説明のためであり、本発明を限定するものではない点に留意されたい。
【００１５】
一例では、レジスタファイルＲＦは３２個のレジスタを具えることができる。１つの特定のループに対して、３２個のレジスタのうちの１０個がループインバリアント値用に割り当てられ、３×５のレジスタ（各５レジスタの３セット）がループバリアント値用に割り当てられるが、７個のレジスタは使用されない。他のループでは、４つのレジスタがループインバリアント値用に割り当てられ、３×８のレジスタがループバリアント値用に割り当てられるが、４つのレジスタは使用されない。換言すれば、既存のレジスタは、実行すべきループごとに、ループインバリアント値用及びループバリアント値用に割り当てることができる。場合によっては、レジスタファイルＲＦ内の３２個のレジスタの全てが使用されない。ループインバリアント値の格納用に割り当てられたレジスタは多数のスレッドで共用されるが、ループバリアント値の格納用に割り当てられたレジスタは、少なくともループの持続時間中、多数のスレッドの一つに独占的に関連し、専用される点に注意されたい。更に、レジスタファイルは異なる数のレジスタを具えることができる点にも注意されたい。
【００１６】
ループバリアント値用のレジスタＬＶ１−ＬＶ３の割り当てが重複化されるのみであるので、多数のスレッドに基づいて処理し得るアプリケーションが制限される。一例としては、マルチスレッディングは並列ループの処置に適用され、これはレジスタファイルに対する要件があまり厳しくないためである。この実施例では、並列ループは２つのループに変換（翻訳）される。
【００１７】
並列ループは次のコードで実現できる。
For (i=0; i<n; i++)
S;
これは、次のコードに変換される。
for kL    /*create a second thread, initial pc= */
for (i=0; i<n/2; i++)
S;
Wait      /*wait on termination of second thread*/
…….….
L:  for (i=n/2; i<n; i++)
S;
Exit       /*stop thread*/
【００１８】
並列ループは２つのループ、即ち０から＜ｎ/２までの１つのループと、ｎ/２からｎまでの１つのループとに変換される。これらの２つのループは次に２つのスレッドとして同時に処理される。ループ内のデータ値はループバリアント、即ちループの処理中に変化する値であることも、あるいは、ループインバリアント、即ちループの処理中に変化しない値であることもある。ループインバリアント値の例はアレイに対するベースポインタである。レジスタＬＩ又はレジスタＬＩのセットが全てのループインバリアント値の割り当てのために使用され、レジスタＬＶ又はレジスタＬＶのセットが全てのループバリアント値に割り当てられる。従って、上述のコードを実現するためには、２つのスレッドが存在するので、１つのレジスタＬＩと２つのレジスタＬＶが必要とされる。
【００１９】
第２の実施例では、スカラ変数ＡをベクトルＸと乗算し、その結果をベクトルＹに加算するＳＡＸＰＹループタイプ(即ちScalar A X plus Y)について考察する。次のループ：
For (i=0; i<1000; i++)
a[i] = b[i] + s*c[i]
を考察する。
【００２０】
対応するアセンブリコードは次のように実現できる。
2008529119.tif 000003
【００２１】
上述のループでは、レジスタＬＩ＝｛r10, r11, r12, r13｝はループインバリアント値を含み、これは、r10〜r12がアレイａ，ｂおよびｃのアドレスを含むからである。レジスタr13はスカラ値ｓを格納するために使用される。これらの値は全てループの実行中に一定であるから、これらの値はループインバリアント値を構成する。レジスタr14〜r16はループバリアント値を含み、これらの値はループの実行中に変化する。
【００２２】
上記のループは第２の実施例に従って次のコードに変換することができる。この場合には第１のスレッドがバリアント値用にレジスタＬＶ1＝｛r14−r16｝を使用し、第２のスレッドがバリアント値用にレジスタＬＶ2＝｛r24−r26｝を使用する。
【００２３】
2008529119.tif 000004
【００２４】
第１及び第２のループ（０から４９９までのループと、５００から１００までのループ）を実現する２つのスレッドはマルチスレッドプロセッサにより同時に実行されるので、他方のスレッドがストールしても一方のスレッドを処理できる。これにより、実行時間が短縮されるとともに、プロセッサの利用率が向上する。
【００２５】
マルチスレッディングは並列ループを２つ以上のループに変換することによって並列ループに適用される。ループバリアント値及びループインバリアント値を決定する。並列ループを複数のループに分割又は変換する。レジスタファイル内のレジスタから、スレッドの数に対応する数のレジスタをループバリアント値用に分配もしくは割り当てて、各スレッドが一つのレジスタに関連してそのバリアント値を格納するようにする。更に、レジスタファイル内のレジスタから、少なくとも１つのレジスタをループインバリアント値の格納用に割り当て、複数のスレッドで共用する。
【００２６】
上述の実施例は単に説明のためであって本発明を限定するものではなく、当業者であれば本発明の範囲から離れることなく多くの代替例を設計可能である点に注意されたい。特許請求の範囲において、「具える」は、請求項に記載の要素や手順以外の要素や手順を除外するものではない。数を特定してない要素は複数の存在を除外するものではない。また、装置の請求項に記載されている手段のいくつかは一つの同一ハードウエア要素で実現してもよい。また、いくつかの手段が互いに異なる従属請求項に記載されていることのみをもって、これらの手段の組合せの使用は有利でないことを意味するものではない。
【図面の簡単な説明】
【００２７】
【図１】本発明の第１の実施例によるマルチスレッドプロセッサの基本構成を示す。
【図１】
2008529119.tif 000005
【国際調査報告】
2008529119.tif 000006
2008529119.tif 000007
2008529119.tif 000008