(57)【要約】【課題】反復するシーケンスのそれぞれにおいて個別のスレッドを実行する実行ユニットと、個別のスレッドの状態を表すためにレジスタの個別のセットを含む複数のコンテキストレジスタセットとを備えるプロセッサに関する。【解決手段】コンテキストレジスタセットは、実行ユニットがインターリーブするように動作可能な数のタイムスロットの各々に対して個別のワーカーコンテキストレジスタセットと、少なくとも１つの追加コンテキストレジスタセットとを備える。ワーカーコンテキストレジスタセットはワーカースレッドの個別の状態を表し、追加コンテキストレジスタセットはスーパーバイザスレッドの状態を表す。プロセッサは、各タイムスロットでスーパーバイザスレッドの実行を開始すると、次にスーパーバイザスレッドは、それが実行しているタイムスロットの各々をワーカースレッドの個別の１つに個々に放棄することができるように構成されている。【選択図】図４
2019079530.tif 000002
【特許請求の範囲】
【請求項１】
異なるタイムスロットの反復シーケンスのそれぞれにおいて個別のスレッドを実行するように構成された実行ユニットであって、前記シーケンスは実行ロジックが個別の前記スレッドの実行をインターリーブするように動作可能な複数のタイムスロットからなる前記実行ユニットと、
それぞれが個別のスレッドの個別の状態を表すためのレジスタの個別のセットからなる複数のコンテキストレジスタセットと、を備えたプロセッサであって、
前記コンテキストレジスタセットは、前記実行ユニットが前記シーケンス内でインターリーブするように動作可能な数のタイムスロットと、少なくとも１つの追加コンテキストレジスタセットとの各々に対する個別のワーカーコンテキストレジスタセットを含み、
前記コンテキストレジスタセットの数は、前記実行ユニットがインターリーブするように動作可能な前記タイムスロットの数より少なくとも１つ多くなるように備えられており、
前記ワーカーコンテキストレジスタセットは、計算タスクを実行する個別のワーカースレッドの個別の状態を表すように構成され、
前記追加コンテキストレジスタセットは、前記ワーカースレッドによって実行される前記タスクの実行をスケジュールするスーパーバイザスレッドの状態を表すように構成され、
前記プロセッサは、前記タイムスロットの各々において前記スーパーバイザスレッドを実行し始め、次に前記スーパーバイザスレッドが、実行中の前記タイムスロットの各々を前記ワーカースレッドの個別の１つに個別に放棄できるように構成されているプロセッサ。
【請求項２】
前記プロセッサは、前記スーパーバイザスレッドが、実行中の前記タイムスロット内の１つ又は複数の放棄命令を実行することによって前記放棄を実行できるように構成されている、請求項１に記載のプロセッサ。
【請求項３】
前記１つ以上の放棄命令は、単一の放棄命令である、請求項２に記載のプロセッサ。
【請求項４】
前記実行ユニットは、前記プロセッサによって認識される機械コード命令のタイプを定義する命令セットに従って動作するように構成されており、各機械コード命令は個別のオペコードによって定義され、
前記１つ又は複数の放棄命令の少なくとも１つは、実行されたときに前記放棄をトリガするオペコードを有する前記命令セットの専用命令である、請求項２又は３に記載のプロセッサ。
【請求項５】
前記少なくとも１つの放棄命令の前記オペコードでは、放棄されている前記タイムスロットが前記少なくとも１つの放棄命令が実行される前記タイムスロットであることが暗黙的になっている、請求項４に記載のプロセッサ。
【請求項６】
前記少なくとも１つの放棄命令を含む前記命令セットの１つ又は複数の命令は、前記スーパーバイザスレッドが使用するために予約され、前記ワーカースレッドによって実行可能ではない、請求項４又は５に記載のプロセッサ。
【請求項７】
前記１つ又は複数の放棄命令は、前記放棄されたタイムスロットがこれに対して放棄されている前記ワーカースレッドのアドレスをオペランドとして指定する、請求項１〜６のいずれか１項に記載のプロセッサ。
【請求項８】
前記プロセッサは、前記タイムスロットの１つがそのために放棄された前記ワーカースレッドが、自身が動作している前記タイムスロットにおいて終了命令を実行することによって、自身が動作している前記タイムスロットを前記スーパーバイザスレッドに戻すことができるように構成されている、請求項１〜７のいずれか１項に記載のプロセッサ。
【請求項９】
前記実行ユニットは、前記プロセッサによって認識される機械コード命令のタイプを定義する命令セットに従って動作するように構成されており、各機械コード命令は個別のオペコードによって定義され、
前記終了命令は、実行されたときに前記放棄されたタイムスロットを前記スーパーバイザスレッドへ前記戻すことを実行するオペコードを有する前記命令セットの専用命令である、請求項８に記載のプロセッサ。
【請求項１０】
前記終了命令の前記オペコードでは、前記戻されるタイムスロットが前記終了命令が実行される前記タイムスロットであることが暗黙的になっている、請求項９に記載のプロセッサ。
【請求項１１】
前記終了命令の前記オペコードでは、前記戻されるタイムスロットが戻される前記スレッドが前記スーパーバイザスレッドであることが暗黙的になっている、請求項９又は１０に記載のプロセッサ。
【請求項１２】
少なくとも前記終了命令を含む前記命令セットの１つ又は複数の命令は、前記ワーカースレッドによって使用されるために予約され、前記スーパーバイザスレッドによって実行可能ではない、請求項８〜１１のいずれか１項に記載のプロセッサ。
【請求項１３】
前記スーパーバイザスレッドは、前記ワーカースレッドを同期させるためのバリア同期を実行するように構成されている、請求項１〜１２のいずれか１項に記載のプロセッサ。
【請求項１４】
前記スーパーバイザスレッドは、前記ワーカースレッドの１つ又は複数に代わって外部リソースとの通信を実行するように構成されている、請求項１〜１３のいずれか１項に記載のプロセッサ。
【請求項１５】
前記放棄命令は、前記スーパバイザコンテキストレジスタセットの１つ又は複数のステータスレジスタから、前記放棄命令によって起動された前記ワーカーの対応する１つ又は複数のステータスレジスタに、１つ又は複数のモードをさらにコピーして、前記ワーカーが前記１つ以上のモードを採用するように制御する、請求項２又はこれに従属する請求項のいずれか１項に記載のプロセッサ。
【請求項１６】
前記プロセッサは、前記スロットの１つで、同じ前記コードを実行する全てのワーカースレッドのセットを一緒に起動する命令を実行するようにさらに構成されている、請求項１〜１５のいずれか１項に記載のプロセッサ。
【請求項１７】
前記プロセッサが実行するように構成された前記命令セットは、前記スロットの１つと一緒に複数のワーカースレッドを起動するマルチラン命令をさらに含み、前記複数のワーカースレッドは３つ以上であり、
前記ワーカースレッドの１つは、前記マルチラン命令のオペランドによって指定される第１のアドレスからフェッチされたコードを含み、前記複数のワーカースレッドの他のワーカースレッドは、前記第１のアドレスに対してストライド値だけ離れた個別のアドレスからフェッチされたコードを含み、前記ストライド値は前記マルチラン命令の別のオペランドによって指定される、請求項４又はこれに従属する請求項のいずれか１項に記載のプロセッサ。
【請求項１８】
前記ワーカースレッドの数は、前記タイムスロットの数と等しい、請求項１７に記載のプロセッサ。
【請求項１９】
プロセッサを動作させる方法であって、
異なるタイムスロットの反復シーケンスの各々において個別のスレッドを実行するために実行ユニットを使用することを含み、前記シーケンスは、その実行ロジックが個別の前記スレッドの実行をインターリーブするように動作可能な複数のタイムスロットからなり、
前記プロセッサは、各々が個別のスレッドの個別の状態を表すためのレジスタの個別のセットを含む複数のコンテキストレジスタセットを備え、
前記コンテキストレジスタセットは、前記実行ユニットが前記シーケンス内でインターリーブするように動作可能な数のタイムスロットと少なくとも１つの追加コンテキストレジスタセットとのそれぞれについて個別のワーカーコンテキストレジスタセットを備え、
前記コンテキストレジスタセットの数は、前記実行ユニットがインターリーブするように動作可能なタイムスロットの数より少なくとも１つ多くなっており、
前記ワーカーコンテキストレジスタセットは、計算タスクを実行する個別のワーカースレッドの個別の状態を表すために使用され、
前記追加コンテキストレジスタセットは、前記ワーカースレッドによって実行される前記タスクの実行をスケジュールするスーパーバイザスレッドの状態を表すために使用され、
前記方法はさらに、前記タイムスロットの各々において前記スーパーバイザスレッドの実行を開始し、次に、前記スーパーバイザスレッドは、それが実行している前記タイムスロットの各々を前記ワーカースレッドの１つに個々に放棄することを含む、方法。
【請求項２０】
コンピュータ可読媒体上に具現化され、且つ請求項１〜１８のいずれか１項に記載の前記プロセッサ上で実行されるように構成されたコードを含むコンピュータプログラムであって、前記コードが、前記スーパーバイザスレッド及び前記ワーカースレッドを含む、コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、マルチスレッドプロセッサにおける異なる同時スレッドによって実行されるタスクのスケジューリングに関する。
【背景技術】
【０００２】
マルチスレッドプロセッサは、互いに並行して複数のプログラムスレッドを実行することができるプロセッサである。プロセッサは、複数の異なるスレッドに共通のいくつかのハードウェア（例えば、共通命令メモリ、データメモリ及び／又は実行ユニット）を備え得るが、マルチスレッドをサポートするために、プロセッサは各スレッドに固有の専用ハードウェアも備えている。
【０００３】
専用ハードウェアは、一度に実行可能なスレッド数の各々に対して少なくとも１つの個別のコンテキストレジスタファイルを備える。「コンテキスト」は、マルチスレッドプロセッサについて言及するとき、互いに並行して実行されるスレッドの個別のプログラム状態（例えば、プログラムカウンタ値、ステータス及び現行のオペランド値）を指す。コンテキストレジスタファイルは、各スレッドにおけるこのプログラム状態を表すためのレジスタの個別の集合を指す。レジスタファイル内のレジスタは汎用メモリとは異なり、レジスタアドレスは命令語のビットとして固定されるが、メモリアドレスは命令を実行することによって計算することができる。所与のコンテキストレジスタは、典型的には、個別のスレッドのための個別のプログラムカウンタと、そのスレッドによって実行される計算中に個別のスレッドに作用して出力されるデータを一時的に保持するためのオペランドレジスタの個別のセットを備える。各コンテキストは、個別のスレッドの状態（例えば、一時停止中であるか実行中であるか）を記憶するために個別のステータスレジスタを有していてもよい。従って、現在実行中のスレッドの各々は、それ自体の個別のプログラムカウンタと、任意にオペランドレジスタ及びステータスレジスタとを有している。
【０００４】
マルチスレッドの１つの可能な形態は並列処理である。すなわち複数のコンテキストと同様に、複数の実行パイプライン、すなわち並列に実行されるべき命令の各ストリームのために別の実行パイプラインが提供される。しかし、これにはハードウェアの点で多量の重複を必要とする。
【０００５】
その代わりに、マルチスレッドプロセッサの別の形態では、並列処理ではなく同時処理を用いて、スレッドが共通実行パイプライン（又は少なくともパイプラインの共通部分）を共有し、異なるスレッドはこの同じ共有実行パイプラインを介してインターリーブされる。マルチスレッドプロセッサのパフォーマンスは、パイプラインレイテンシを隠す機会が増えるため、同時処理がない場合、あるいは、並列処理に比べてさらに改善され得る。また、このアプローチでは、複数の実行パイプラインを備えた完全並列プロセッサとして各スレッド専用のハードウェアを余分に必要とせず、従って、沢山の余分なシリコンを必要としない。
【０００６】
マルチスレッドプロセッサはまた、異なる同時スレッドの実行を調整するための手段を必要とする。例えば、どの計算タスクをどのスレッドに割り当てるかを判定する必要がある。別の例として、同時スレッドの第１の１つ以上は、同時スレッドの１つ以上の他のスレッドによる計算の結果に依存する計算を含んでいてもよい。この場合、当該スレッドを実行の共通ポイントに持っていく（bring）ためにバリア同期を実行する必要があり、１つ以上の他のスレッドはそれらが依存する計算を実行する前に、１つ以上の第１のスレッドがこれらの依存する計算を実行しようとすることはない。代わりに、バリア同期では、最初のスレッドが処理できるようになる前に、他のスレッドが指定されたポイントに到達する必要がある。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
同時スレッドの実行を調整するための１つ又は複数のこのような機能は、専用ハードウェアで実施することができる。しかし、これはプロセッサのシリコン占有面積を増加させ、プログラム的なソフトウェアアプローチほど柔軟なものではない。一方、完全にプログラム的なソフトウェアアプローチは、コード密度の面で効率的ではない。これらの２つのアプローチのバランスを取って、スレッドを調整するためのより巧妙なアプローチを見出すことが望ましい。
【課題を解決するための手段】
【０００８】
本明細書で開示される１つの態様によれば、
異なるタイムスロットの反復シーケンスのそれぞれにおいて個別のスレッドを実行するように構成された実行ユニットであって、シーケンスは実行ロジックが個別のスレッドの実行をインターリーブするように動作可能な複数のタイムスロットからなる実行ユニットと、
それぞれが個別のスレッドの個別の状態を表すためのレジスタの個別のセットからなる複数のコンテキストレジスタセットと、を備え、ここでコンテキストレジスタセットは、実行ユニットが前記シーケンス内でインターリーブするように動作可能なタイムスロットの数と、少なくとも１つの追加コンテキストレジスタセットとの各々に対して個別のワーカーコンテキストレジスタセットから構成され、コンテキストレジスタセットの数は、実行ユニットがインターリーブするように動作可能なタイムスロットの数より少なくとも１つ多くなるように備えられており、ワーカーコンテキストレジスタセットは、計算タスクを実行する個別のワーカースレッドの個別の状態を表すように構成され、追加コンテキストレジスタセットは、ワーカースレッドによって実行されるタスクの実行をスケジュールするスーパーバイザスレッドの状態を表すように構成され、
ここでプロセッサは、タイムスロットの各々においてスーパーバイザスレッドを実行し始め、次にスーパーバイザスレッドが、実行中のタイムスロットの各々をワーカースレッドに個別の１つに放棄できるように構成されるプロセッサが提供される。
【０００９】
実施形態では、プロセッサは、スーパーバイザスレッドが、実行中のタイムスロット内の１つ又は複数の放棄命令を実行することによって前記放棄を実行できるように構成されてもよい。
【００１０】
実施形態では、前記１つ以上の放棄命令は、単一の放棄命令である。
【００１１】
実施形態では、実行ユニットは、プロセッサによって認識される機械コード命令のタイプを定義する命令セットに従って動作するように構成されてもよく、各機械コード命令は個別のオペコードによって定義され、ここで１つ又は複数の放棄命令の少なくとも１つは、実行されたときに前記放棄をトリガするオペコードを有する命令セットの専用命令であってもよい。
【００１２】
実施形態では、少なくとも１つの前記放棄命令のオペコードには、放棄されているタイムスロットが少なくとも１つの前記放棄命令が実行される前記タイムスロットであることが暗黙的に含まれている。
【００１３】
実施形態では、前記少なくとも１つの放棄命令を含む命令セットの前記１つ又は複数の命令は、スーパーバイザスレッドが使用するために確保され、ワーカースレッドによって実行可能ではなくてもよい。
【００１４】
実施形態では、１つ又は複数の放棄命令は、放棄されたタイムスロットがこれに対して放棄されているワーカースレッドのアドレスをオペランドとして指定してもよい。
【００１５】
実施形態では、プロセッサは、タイムスロットの１つが放棄されたワーカースレッドが、これに対して実行されているタイムスロットを、これが実行されているタイムスロットで終了命令を実行することによってスーパーバイザスレッドに戻すことができるように構成してもよい。
【００１６】
実施形態では、実行ユニットは、プロセッサによって認識される機械コード命令のタイプを定義する命令セットに従って動作するように構成されてもよく、各機械コード命令は個別のオペコードによって定義され、ここで終了命令は、実行されたときに放棄されたタイムスロットをスーパーバイザスレッドへ復帰させるオペコードを有する命令セットの専用命令であってもよい。
【００１７】
実施形態では、戻されるタイムスロットが終了命令が実行されるタイムスロットであることが前記終了命令のオペコードに暗黙的となっている。
【００１８】
実施形態では、タイムスロットが戻されるスレッドがスーパーバイザスレッドであることが前記終了命令のオペコードに暗黙的となっている。
【００１９】
実施形態では、少なくとも前記終了命令を含む命令セットの１つ又は複数の命令は、ワーカースレッドによって使用されるために確保され、スーパーバイザスレッドによって実行可能ではなくてもよい。
【００２０】
実施形態では、スーパーバイザスレッドは、ワーカースレッドを同期させるためのバリア同期を実行してもよい。
【００２１】
実施形態では、スーパーバイザスレッドは、１つ又は複数のワーカースレッドに代わって外部リソースとの通信を実行してもよい。
【００２２】
実施形態では、放棄命令は、スーパバイザコンテキストレジスタセットの１つ又は複数のステータスレジスタから、放棄命令によって起動されたワーカーの対応する１つ又は複数のステータスレジスタに、１つ又は複数のモードをさらにコピーして、ワーカーが前記１つ以上のモードを採用するように制御してもよい。
【００２３】
実施形態では、プロセッサは、前記スロットの１つで一緒に複数のワーカースレッドのセットを起動する命令を実行し、すべてが同じコードを実行するようにさらに構成されてもよい。
【００２４】
実施形態では、プロセッサが実行するように構成された命令セットは、前記スロットの１つと一緒に複数のワーカースレッドを起動するマルチラン命令をさらに含んでもよく、複数のワーカースレッドが３つ以上であり、ここでワーカースレッドの１つは、マルチラン命令のオペランドによって指定される第１のアドレスからフェッチされたコードを含み、複数のワーカースレッドのうちの他のワーカースレッドは、第１のアドレスに対するストライド（stride）値のステップだけ離れたアドレスからフェッチされたコードを含み、ストライド値はマルチラン命令の別のオペランドによって指定される。すなわち、複数のワーカースレッドのそれぞれが、ストライド値の整数倍だけ前記第１のアドレスからオフセットされたアドレスからフェッチされたコードを含み、この整数倍は、自然数の列（１，２，３、・・・）、すなわち１から始まり１のインクリメントで間隔を置いて（各タイムスロットで１ずつ増加する）正の整数の列を形成する。
【００２５】
実施形態では、前記ワーカースレッドの数は、前記タイムスロットの数と等しくてもよく、すなわちマルチラン命令は、それぞれがマルチラン命令の第１アドレス及びストライド値オペランドによって指定されたストライドアドレスのセットの異なる個別の１つから、タイムスロットの各々でスレッドを起動する。
【００２６】
本明細書で開示される別の態様によれば、プロセッサを動作させる方法であって、
異なるタイムスロットの反復シーケンスの各々において個別のスレッドを実行する実行ユニットを使用することを含み、このシーケンスは実行ロジックが個別のスレッドの実行をインターリーブするように動作可能な複数のタイムスロットからなり、
そのプロセッサは複数のコンテキストレジスタセットを備え、各々が個別のスレッドの個別の状態を表すためのレジスタの個別のセットを備え、コンテキストレジスタセットは、実行ユニットが前記シーケンス内でインターリーブするように動作可能なタイムスロットの数と、少なくとも１つの追加コンテキストレジスタセットとのそれぞれについて個別のワーカーコンテキストレジスタセットを備え、
コンテキストレジスタセットの数は、実行ユニットがインターリーブするように動作可能なタイムスロットの数より少なくとも１つ多くなっており、ワーカーコンテキストレジスタセットは、計算タスクを実行する個別のワーカースレッドの個別の状態を表すために使用され、追加コンテキストレジスタセットは、ワーカースレッドによって実行されるタスクの実行をスケジュールするスーパーバイザスレッドの状態を表すために使用され、
この方法はさらに、タイムスロットの各々においてスーパーバイザスレッドの実行を開始すると、そのスーパーバイザスレッドが、それが実行しているタイムスロットの各々をワーカースレッドの個別の１つに個々に放棄することを含む方法が提供される。
【００２７】
本明細書で開示される別の態様によれば、コンピュータ可読記憶装置に具現化されたコードを含み、本明細書で開示される任意の実施形態のプロセッサ上で実行するように構成され、コードがスーパーバイザスレッドとワーカースレッドからなるコンピュータプログラムが提供される。
【００２８】
本開示の理解を支援し、実施形態がどのように実施され得るかを示すために、実施例として添付の図面を参照する。
【図面の簡単な説明】
【００２９】
【図１】マルチスレッドプロセッサの概略ブロック図。
【図２】複数のスレッドコンテキストの概略ブロック図。
【図３】インターリーブされたスロットのスキームを概略的に示す。
【図４】スーパーバイザスレッド及び複数のインターリーブされたタイムスロットで動作する複数のワーカースレッドを概略的に示す。
【図５】構成プロセッサのアレイを含むプロセッサの概略ブロック図。
【図６】機械知能アルゴリズムで使用されるグラフの概略図。
【発明を実施するための形態】
【００３０】
図１は、本開示の実施形態によるプロセッサモジュール４の一実施例を示す。例えば、プロセッサモジュール４は、同じチップ上の同様なプロセッサタイルアレイの１つであってもよく、又はそれ自体のチップ上に実装されてもよい。プロセッサ４は、バレルスレッド処理ユニットの形態をしたマルチスレッド処理ユニット１０と、ローカルメモリ１１（すなわち、マルチタイルアレイの場合は同じタイル上の、又はシングルプロセッサチップの場合は同じチップ上の）を備えている。バレルスレッド処理ユニットは、パイプラインの実行時間がインターリーブされたタイムスロットの反復シーケンスに分割され、これらの各々が所与のスレッドによって所有され得るマルチスレッド処理ユニットの一種である。これについては後ほど詳しく説明する。メモリ１１は、命令メモリ１２及びデータメモリ２２（異なるアドレス可能なメモリユニットに、又は同一のアドレス可能なメモリユニットの異なる領域に実装することができる）を備えている。命令メモリ１２は、処理ユニット１０によって実行される機械コードを記憶する一方、データメモリ２２は、実行されたコードによって操作されるべきデータと、実行されたコードによって出力されるデータ（例えば、そのような操作の結果として）の両方を記憶する。
【００３１】
メモリ１２は、プログラムの様々な異なるスレッドを記憶し、各スレッドは、特定のタスクの実行を命令する個別のシーケンスを含む。本明細書で言及される命令は、機械コード命令、すなわち、プロセッサの命令セットにおける基本命令の１つのインスタンスであって、単一のオペコード及び０個以上のオペランドからなるものを意味していることに留意されたい。
【００３２】
本明細書で説明するプログラムは、複数のワーカースレッドと、１つ又は複数のスーパーバイザスレッドとして構成することができる監視サブプログラムとを含む。これらについては後ほど詳しく説明する。実施形態では、ワーカースレッドの一部又は全部の各々は、それぞれ「コードレット（codelet）」の形態をとる。コードレットは特定のタイプのスレッドであり、時には「アトミック」スレッドとも呼ばれている。これはスレッドの開始から（起動時から）実行する必要があるすべての入力情報を有し、すなわち、プログラムの他の部分又は起動後のメモリからの入力を全く取り込まない。さらに、プログラムの他の部分は、スレッドが終了する（完了する）までスレッドのいかなる出力（アウトカム）を使用しないことがある。エラーが発生しない限り、終了することが保証される。但し、いくつかの文献では、コードレットはステートレスであると定義されていて、２回実行すると最初の実行から情報を継承できなかったが、本明細書ではこのような追加の定義は採用していない。また、ワーカースレッドのすべてがコードレット（アトミック）である必要はなく、実施形態によっては、ワーカーの一部又はすべてが代わりに相互に通信することができることにも留意されたい。
【００３３】
処理ユニット１０内で、命令メモリ１２からの複数の異なるスレッドは、単一の実行パイプライン１３を介してインターリーブされ得る（典型的には、命令メモリに記憶された全スレッドのサブセットのみが、プログラム全体の任意の時点でインターリーブされ得るのであるが）。マルチスレッドの処理ユニット１０は、同時に実行される異なるスレッドの状態（コンテキスト）をそれぞれ表すように配列された複数のコンテキストレジスタファイル２６と、同時に実行されるスレッドに共通の共有実行パイプライン１３、インターリーブされた態様で、好ましくはラウンドロビン方式で共有パイプラインを介して実行するための同時スレッドをスケジューリングするためのスケジューラ２４とを備えている。処理ユニット１０は、複数のスレッドに共通の共有命令メモリ１２と、複数のスレッドに同様に共通な共有データメモリ２２とに接続されている。
【００３４】
実行パイプライン１３は、フェッチステージ１４、デコードステージ１６、及び命令セットアーキテクチャによって定義されるような算術及び論理演算、アドレス計算、ロード及びストア演算、及び他の演算を実行する実行ユニットからなる実行ステージ１８を含む。コンテキストレジスタファイル２６の各々は、個別のスレッドのプログラム状態を表すためのレジスタの個別のセットからなっている。
【００３５】
コンテキストレジスタファイル２６の各々を構成するレジスタの一実施例が図２に概略的に示されている。コンテキストレジスタファイル２６の各々は、それぞれのスレッドについて（スレッドが現在実行中の命令アドレスを追跡するため）少なくとも１つのプログラムカウンタ（ＰＣ）からなるそれぞれ１つ以上の制御レジスタ２８を備え、実施形態では各スレッドの現在の状態（例えば、エラーに遭遇したために、現在実行中であるか一時停止中であるかなど）を記録する１つ又は複数のステータスレジスタ（ＳＲ）のセットも備えている。コンテキストレジスタファイル２６の各々は、また、オペランドレジスタ（ＯＰ）３２の個別のセットを備えており、それぞれのスレッドによって実行される命令のオペランド、すなわちオペレーション実行時に、各スレッドの命令のオペコードによって定義されたオペレーションで操作される値又はオペレーションによって生じる値を一時的に保持する。コンテキストレジスタファイル２６の各々は、任意に、それぞれ１つ以上の他のタイプのレジスタ（図示せず）からなっていてもよいことが理解されよう。また、用語「レジスタファイル」は、時には共通アドレス空間内のレジスタの群を言うために使用されるが、必ずしも本開示で当てはまる必要はなく、各ハードウェアコンテキスト２６（コンテキストの各々が各レジスタセット２６を表している）は、より一般的には、１つ又は複数のこのようなレジスタファイルから構成されていてもよい。
【００３６】
詳細は後述するが、開示された構成は、並行して実行可能なＭ個のスレッド（図示の例ではＭ＝３であるが、限定するものではない）のそれぞれについて１つのワーカーコンテキストレジスタファイルＣＸ０・・・ＣＸ（Ｍ−１）と、１つの追加スーパーバイザコンテキストレジスタファイルＣＸＳを有している。ワーカーコンテキストレジスタファイルは、ワーカースレッドのコンテキストを記憶するために別にしてあって、スーパーバイザコンテキストレジスタファイルは、スーパーバイザスレッドのコンテキストを記憶するために別にしてある。実施形態では、スーパーバイザコンテキストは、各ワーカーと異なる数のレジスタを有する点で特殊であることに留意されたい。ワーカーコンテキストの各々は、好ましくは、互いに同じ数のステータスレジスタ及びオペランドレジスタを有している。実施形態では、スーパーバイザコンテキストは、ワーカーの各々より少ないオペランドレジスタを有していてもよい。オペランドレジスタの実施例では、ワーカーコンテキストは有するがスーパーバイザが含まないオペランドレジスタの例は、浮動小数点レジスタ、累算レジスタ、及び／又は専用のウェイトレジスタ（ニューラルネットワークの重みを保持するための）である。実施形態では、スーパーバイザは、異なる数のステータスレジスタを有していてもよい。さらに、実施形態では、プロセッサモジュール４の命令セットアーキテクチャは、ワーカースレッド及びスーパーバイザスレッドがいくつかの異なるタイプの命令を実行するが、いくつかの命令タイプを共有するように構成されてもよい。
【００３７】
フェッチステージ１４は、スケジューラ２４の制御の下で、命令メモリ１２から実行すべき命令をフェッチするように接続されている。スケジューラ２４は、フェッチステージ１４を制御して、一組の同時実行スレッドのそれぞれからの命令を、時間スロットの反復シーケンスで順番に取り出し、パイプライン１３のリソースを時間的にインターリーブして複数のタイムスロットに分割するように構成されているが、これについては後ほど詳しく説明する。例えば、スケジューリング方式は、ラウンドロビン方式又は重み付けラウンドロビン方式とすることができる。このように動作するプロセッサの別の用語はバレルスレッドプロセッサである。
【００３８】
いくつかの実施形態では、スケジューラ２４は、スレッドが一時停止しているかどうかを示す各スレッドの状態レジスタＳＲの１つにアクセスして、スケジューラ２４が実際にフェッチステージ１４を制御して、現在アクティブであるスレッドの命令のみをフェッチするようにする。実施形態では、好ましくは、各タイムスロット（及び対応するコンテキストレジスタファイル）が常に１つのスレッド又は他のスレッドによって所有される。すなわち、各スロットが常にスレッドによって占有され、各スロットは常にスケジューラ２４のシーケンスに含まれる。しかし、任意で所与のスロットを占有するスレッドは、その時点で一時停止してもよいが、この場合、そのスロットにシーケンスが回ってくると、それぞれのスレッドの命令フェッチが渡される。代替的に、あまり好ましくない実施例では、いくつかのスロットは一時的に空いており、スケジュールされたシーケンスから除外することができる。実行ユニットがインターリーブするように動作可能なタイムスロットの数などに言及する場合、これは、実行ユニットが同時に実行できるスロットの最大数、すなわち、実行ユニットのハードウェアがサポートする同時スロットの数をいう。
【００３９】
フェッチステージ１４は、各コンテキストのプログラムカウンタ（ＰＣ）にアクセスする。それぞれのスレッドについて、フェッチステージ１４は、プログラムカウンタによって示されるように、プログラムメモリ１２内の次のアドレスからそのスレッドの次の命令をフェッチする。プログラムカウンタは、分岐命令によって分岐されない限り、各実行サイクルをインクリメントする。その後、フェッチステージ１４はフェッチされた命令をデコードステージ１６に渡してデコードされ、デコードステージ１６はその命令で指定された任意のオペランドレジスタ３２のデコードされたアドレスとともに、デコードされた命令の指示を実行ユニット１８に渡す命令が実行されるようにする。実行ユニット１８は、オペランドレジスタ３２及び制御レジスタ２８へのアクセスを有する。実行ユニット１８は、オペランドレジスタ３２及び制御レジスタ２８を、算術命令の場合（例えば、２つのオペランドレジスタ内の値を加算、乗算、減算又は除算し、そのアウトカムをそれぞれのスレッドの別のオペランドレジスタに出力することによって）のように、復号されたレジスタアドレスに基づいて命令を実行する際に使用することができる。あるいは、命令がメモリアクセス（ロード又はストア）を定義する場合、実行ユニット１８のロード／ストアロジックは、その命令に従ってデータメモリからの値を個別のスレッドのオペランドレジスタにロードするか、各スレッドのオペランドレジスタからの値をデータメモリ２２に記憶する。あるいは、命令が分岐又は状態変化を定義する場合、実行ユニットはプログラムカウンタＰＣ又は状態レジスタＳＲの１つの値をそれに応じて変更する。１つのスレッドの命令が実行ユニット１８によって実行されている間に、インターリーブされたシーケンスにおける次のタイムスロットのスレッドからの命令は、デコードステージ１６によってデコードされることが可能であり、及び／又は１つの命令がデコードステージ１６によってデコードされている間に、その次のタイムスロットのスレッドからの命令をフェッチステージ１４によってフェッチすることができる（一般に、本開示の範囲は、タイムスロットごとに１つの命令に限定されないし、例えば、別のシナリオでは、２つ以上の命令のバッチを、タイムスロットごとに所与のスレッドから発することができることもあり得る）。従って、インターリーブは、既知のバレルスレッド処理技術に従って、パイプライン１３のレイテンシを効果的に隠す。
【００４０】
スケジューラ２４によって実行されるインターリーブ方式の実施例が図３に示されている。ここでは、同時スレッドは、ラウンドロビン方式に従ってインターリーブされ、スキームの各ラウンド内で、ラウンドはタイムスロットＳ０、Ｓ１、Ｓ２・・・のシーケンスに分割され、各々が個別のスレッドを実行する。典型的に、各スロットは１プロセッササイクルであり、異なるスロットは均等なサイズであるが、すべての可能な実施形態では必ずしもそうではなく、例えば、重み付けラウンドロビン方式も可能であり、これにより、いくつかのスレッドは、実行ラウンドごとに他のスレッドより多くのサイクルが得られる。一般に、バレルスレッドは、偶数ラウンドロビン又は重み付けラウンドロビンスケジュールのいずれかを使用することができ、後者の場合、重み付けを固定又は適応化させてもよい。
【００４１】
実行ラウンドごとのシーケンスが何であれ、このパターンが繰り返され、各ラウンドは各タイムスロットのそれぞれのインスタンスを含む。従って、本明細書で言及されるタイムスロットは、シーケンスの所与の反復におけるタイムスロットの特定の例ではなく、シーケンスにおける反復割り当てされた場所を意味することに留意されたい。別の言い方をすれば、スケジューラ２４は、パイプライン１３の実行サイクルを複数の時間的にインターリーブされた（時分割多重化された）実行チャネルに振り分けるとともに、各々がタイムスロットの反復シーケンスにおける個別のタイムスロットの繰り返しを含む。図示された実施形態では、４つのタイムスロットが存在するが、これは例示のためのものであり、他の数も可能である。例えば、１つの好ましい実施形態では、実際には６つのタイムスロットが存在する。
【００４２】
ラウンドロビン方式で分割されるタイムスロットの数が何であっても、本開示によれば、処理ユニット１０は、タイムスロットが存在する数よりも１つ多いコンテキストレジスタファイル２６を備えていて、インターリーブされたタイムスロットの数よりも１つ多いコンテキストをサポートし、バレルスレッディングが可能である。
【００４３】
これは、図２の実施例として示されており、図３に示すように４つのタイムスロットＳ０・・・Ｓ３がある場合、ここではＣＸ０、ＣＸ１、ＣＸ２、ＣＸ３及びＣＸＳという５つのコンテキストレジスタファイルが存在する。すなわち、バレルスレッド方式の実行時間スロットＳ０・・・Ｓ３が４つしかなく、同時に４つのスレッドしか実行できないとしても、本明細書では、第５のプログラムカウンタ（ＰＣ）と、オペランドレジスタ３２の第５のセットからなり、実施形態では１つ以上のステータスレジスタ（ＳＲ）の第５のセットも含む第５のコンテキストレジスタファイルＣＸＳを追加することが開示されている。上述したように留意されたいが、実施形態では、スーパーバイザコンテキストは他のコンテキストＣＸ０・・・３と異なる場合があり、スーパーバイザスレッドは、実行パイプライン１３を動作させるための命令の異なるセットをサポートすることができる。
【００４４】
第１の４つのコンテキストＣＸ０・・・ＣＸ３の各々は、プログラマが望むアプリケーション固有の計算タスクを何でも実行するために、４つの実行タイムスロットＳ０・・・Ｓ３のうちの１つに現在割り当てられている複数の「ワーカースレッド」の対応する１つの状態を表すために使用される（これは、命令メモリ１２に記憶されたプログラムのワーカースレッド総数のサブセットでしかないことに今一度留意されたい）。しかし、第５のコンテキストＣＸＳは、特別な機能のために予約されており、全体プログラムのどのポイントにおいてＳ０、Ｓ１、Ｓ２、・・・のどのタイムスロットでどのワーカースレッドＷを実行すべきかを割り当てるという点において少なくとも、ワーカースレッドの実行を調整する役割を果たす「スーパーバイザスレッド」（ＳＶ）の状態を表すものである。任意に、スーパーバイザスレッドは、他の「スーパーバイザ」又は調整責任を有していてもよい。例えば、スーパーバイザスレッドは、特定の実行順序を保証するためにバリア同期を実行する責任を負うことがある。例として、１つ又は複数の第２のスレッドが同じプロセッサモジュール４上で実行される１つ又は複数の第１のスレッドによって出力されるデータに依存する場合、スーパーバイザは、第１のスレッドが終了するまで第２のスレッドのいずれも開始しないようにバリア同期を実行してもよい。及び／又は、スーパーバイザは、別のタイル又はプロセッサチップなどの特定の外部データソースがそのデータを利用可能にするために必要な処理を完了するまで、プロセッサモジュール４上の１つ又は複数のスレッドが開始しないことを保証するためにバリア同期を実行することができる。スーパーバイザスレッドは、複数のワーカースレッドに関する他の機能を実行するためにも使用できる。例えば、スーパーバイザスレッドは、プロセッサモジュール４に対して外的にデータを通信する責任を負ってもよい（１つ以上のスレッドによって作用される外部データを受信し、及び／又は１つ以上のワーカースレッドによって出力されたデータを送信する）。一般に、スーパーバイザスレッドは、プログラマが望むあらゆる種類のスーパーバイザ機能又は調整機能を提供するために使用されてもよい。例えば、別の実施例として、スーパーバイザは、タイルローカルメモリ１２と記憶ディスク又はネットワークカードのようなより広範なシステム（アレイ６の外部）の１つ又は複数のリソースとの間の転送を管理することができる。
【００４５】
当然のことながら、４つのタイムスロットは一実施例に過ぎず、一般に他の実施形態では、１ラウンドあたり最大Ｍ個のタイムスロット０・・・Ｍ−１が存在する場合、プロセッサモジュール４は、Ｍ＋１個のコンテキストＣＸ・・・ＣＸ（Ｍ−１）とＣＸＳ、つまり任意の時点でインターリーブされ得る各ワーカースレッドためのコンテキストと、スーパーバイザのための追加コンテキストとを備えてもよい。例えば、１つの例示的な実施形態では、６つのタイムスロットと７つのコンテキストが存在する。
【００４６】
図４を参照すると、本明細書の教示に従うと、スーパーバイザスレッドＳＶは、インターリーブされた実行タイムスロットのスキームにおいてそれ自体のタイムスロットを有さない。ワーカースレッドへのスロット割り当ては柔軟に定義されるので、ワーカーもそれ自体のタイムスロットを有さない。むしろ、各タイムスロットは、ワーカーコンテキストを記憶するための独自の専用コンテキストレジスタファイル（ＣＸ０・・・ＣＸＭ−１）を有しており、スロットがワーカーに割り当てられたときにワーカーによって使用されるが、スロットがスーパーバイザに割り当てられると使用されない。所与のスロットがスーパーバイザに割り当てられると、そのスロットは代わりにスーパーバイザのコンテキストレジスタファイルＣＶＳを使用する。スーパーバイザは常に独自のコンテキストにアクセスでき、ワーカーはスーパーバイザコンテキストレジスタファイルＣＸＳを占有することはできないことに留意されたい。
【００４７】
スーパーバイザスレッドＳＶは、任意の時間スロットＳ０・・・Ｓ３（又は、より一般的にはＳ０・・・ＳＭ−１）及びこれらの時間スロットすべてにおいて動作する能力を有する。スケジューラ２４は、全体としてプログラムが起動すると、すべてのタイムスロットにスーパーバイザスレッドを割り当てること、すなわちスーパーバイザＳＶがＳ０・・・Ｓ３のすべてで実行を開始するように構成されている。しかし、スーパーバイザスレッドには、後続のあるポイント（１つ又は複数のスーパーバイザタスクを実行した直後又はその後のいずれか）で、実行中のスロットのそれぞれをワーカースレッドのそれぞれの１つに一時的に放棄するメカニズムが提供される。例えば、図４に示す実施例では、最初はワーカーＷ０・・・Ｗ３に放棄する。これは、スーパーバイザスレッドが本明細書の一実施例として「ＲＵＮ」と呼ばれる放棄命令を実行することによって達成される。実施形態では、この命令は、命令メモリ１２内のワーカースレッドのアドレスと、データメモリ２２内のそのワーカースレッド用のいくつかのデータのアドレスの２つのオペランドを取る。すなわち、ＲＵＮ  ｔａｓｋ＿ａｄｄｒ，ｄａｔａ＿ａｄｄｒ。
【００４８】
ワーカースレッドは、互いに並行して実行することができるコードの部分であり、それぞれが実行されるべき１つ以上の個別の計算タスクを表す。データアドレスは、ワーカースレッドによって実行されるいくつかのデータを指定してもよい。あるいは、放棄命令はワーカースレッドのアドレスを指定する単一のオペランドのみを取り、データアドレスはワーカースレッドのコードに含めることもでき、別の実施例では、単一オペランドが、ワーカースレッド及びデータのアドレスを指定するデータ構造を指し示すこともできる。上述したように、実施形態では、ワーカーの少なくとも一部は、コードレットの形態、すなわち同時に実行可能なコードの原子単位をとることができる。代替的に又は追加的に、ワーカーのいくつかはコードレットである必要はなく、代わりに相互に通信することができてもよい。
【００４９】
放棄命令（「ＲＵＮ」）は、スケジューラ２４に対して作用し、この命令自体が実行される現行のタイムスロットを、オペランドによって指定されたワーカースレッドに放棄する。放棄されるのがこの命令が実行されるタイムスロットであることが放棄命令で暗示されていることに留意されたい（マシンコード命令の文脈において暗黙の意味は、これを指定するためのオペランドを必要としないことを意味するもので、オペコード自体から暗黙的に理解されるものである）。従って、放棄されるタイムスロットは、スーパーバイザが放棄命令を実行するタイムスロットである。別の言い方をすれば、スーパーバイザは、それが放棄するのと同じ空間で実行している。スーパーバイザは「この場所でこのコード部分を実行する」と言うと、その時点以降、反復スロットは関連するワーカースレッドによって（一時的に）所有される。
【００５０】
スーパーバイザスレッドＳＶは、１つ又は複数のタイムスロットの各々において同様の動作を実行して、そのタイムスロットの一部又は全部をワーカースレッドＷ０・・・Ｗ３（命令メモリ１２内のより大きなセットＷ０・・・Ｗｊから選択されたワーカースレッド）の異なるそれぞれに放棄する。最後のスロットでそれが実行されると、スーパーバイザは中断される（その後、スロットの１つがワーカーＷによって戻されたとき中断したところから再開する）。
【００５１】
このように、スーパーバイザスレッドＳＶは、インターリーブされた実行時間スロットＳ０・・・Ｓ３の異なるスレッドに、１つ又は複数のタスクを実行する異なるワーカースレッドを割り当てることができる。スーパーバイザスレッドがワーカースレッドを実行する時間であると決定すると、放棄命令（ＲＵＮ）を使用して、このワーカーをＲＵＮ命令が実行されたタイムスロットに割り当てる。
【００５２】
いくつかの実施形態では、命令セットはまた、実行命令ＲＵＮＡＬＬ（「すべて実行」）の変形を含む。この命令は、複数のワーカーをまとめて起動し、すべて同じコードを実行する。実施形態では、これは、処理ユニットのスロットＳ０・・・Ｓ３（又は、より一般的にはＳ０・・・Ｓ（Ｍ−１））の全てにおいてワーカーを立ち上げる。
【００５３】
ＲＵＮＡＬＬ命令の代わりに、又はＲＵＮＡＬＬ命令に加えて、いくつかの実施形態では、命令セットは、「マルチラン」命令、ＭＵＬＴＩＲＵＮを含んでいてもよい。この命令はまた、タイムスロットの個別の１つにそれぞれ複数のワーカースレッドを起動する。好ましい実施形態では、すべてのスロットＳ０・・・Ｓ（Ｍ−１）（すなわち、起動されたワーカースレッドの総数はハードウェアワーカーコンテキストの数Ｍに等しい）の各々において個別のワーカースレッドＷを起動する。ただし、ＭＵＬＴＩＲＵＮは、複数の起動されたスレッドがすべて同じタスクアドレスから取得した同じコードで構成されているわけではない点で、ＲＵＮＡＬＬ命令と異なるものである。むしろ、ＭＵＬＴＩＲＵＮは、少なくとも２つのオペランド、すなわち第１の明示的なタスクアドレス、及びストライド値を取る。すなわち、ＭＵＬＴＩＲＵＮ  ｔａｓｋ＿ａｄｄｒ、ｓｔｒｉｄｅ。
【００５４】
複数の起動されたスレッドのうちの最初のスレッドは、ＭＵＬＴＩＲＵＮ命令のアドレスオペランドによって指定されたアドレスｔａｓｋ＿ａｄｄｒから得られる。複数の起動された他のスレッドのそれぞれが、第１のスレッドのアドレスに等しいアドレスからストライド値の対応する増分整数倍を加えたアドレスから得られ、その倍数は１から始まる正の整数の列であり、倍数は、１から始まり各タイムスロットで１ずつ増加する正の整数の列である。言い換えれば、起動されたワーカースレッドは、最初のアドレスに対してストライド値のステップだけ離れている。すなわち、スレッドの第２のものは、ｔａｓｋ＿ａｄｄｒ＋ｓｔｒｉｄｅのアドレスから取り込まれ、スレッドの第３のものはｔａｓｋ＿ａｄｄｒ＋２＊ｓｔｒｉｄｅのアドレスから取り込まれ、スレッドの第４のものはｔａｓｋ＿ａｄｄｒ＋３＊ｓｔｒｉｄｅのアドレスから取り込まれようになる（起動されたスレッドの数に応じて以下同様、実施形態ではスロットＳの数に等しい）。ＭＵＬＴＩＲＵＮ命令の実行は、Ｍ個の複数のワーカーの各々がスロットＳ０・・・Ｓ（Ｍ−１）の１つで起動されるようにトリガし、それぞれが上記のように判定された個別のアドレス値によって定義されるプログラムカウンタで開始する。
【００５５】
さらに、いくつかの実施形態では、ＲＵＮ、ＲＵＮＡＬＬ及び／又はＭＵＬＴＩＲＵＮ命令はまた、これが実行されると、１つ又は複数のスーパーバイザステータスレジスタＣＸＳ（ＳＲ）からのいくつかの状態を、ＲＵＮ又はＲＵＮＡＬＬによって起動されたワーカースレッド（複数可）の対応する１つ又は複数にコピーする。例えば、コピーされた状態は、浮動小数点丸めモード（例えば、最近傍への丸め又はゼロへの丸め）及び／又はオーバーフローモード（例えば、飽和又は無限大を表す別個の値の使用）などの１つ又は複数のモードからなっていてもよい。次に、コピーされた状態又はモードは、コピーされた状態又はモードに従って動作するように当該ワーカーを制御する。実施形態では、ワーカーは後でこれを自身のステータスレジスタに上書きすることができる（ただし、スーパーバイザの状態を変更することはできない）。更なる代替又は追加の実施形態では、ワーカーは、スーパーバイザの１つ又は複数のステータスレジスタからいくつかの状態を読み出すことを選択することができる（そしてさらに、後で自身の状態を変更することもできる）。例えば、ここでもスーパーバイザステータスレジスタから浮動小数点モードや丸めモードなどのモードを採用することができる。しかし、実施形態では、スーパーバイザは、ワーカーのコンテキストレジスタＣＸ０・・・のいずれも読み取ることができない。
【００５６】
一旦起動されると、現在割り当てられているワーカースレッドＷ０・・・Ｗ３のそれぞれは、個別の放棄命令によって指定されたコードで定義された１つ又は複数の計算タスクを実行する。最後に、それぞれのワーカースレッドは、実行中のタイムスロットをスーパーバイザスレッドに戻す。これは、終了命令（「ＥＸＩＴ」）を実行することによって達成される。いくつかの実施形態では、これはオペランドを取らない。すなわち、ＥＸＩＴ。
【００５７】
あるいは、他の実施形態では、ＥＸＩＴ命令は、終了時にそれぞれのコードレットの状態（例えば、一定の端末条件が条件に満たされたか、エラーが発生したなど）を示すために、プログラマが望む任意の目的に使用される単一のオペランドｅｘｉｔ＿ｓｔａｔｅ（例えばバイナリ値）を取る。すなわち、ＥＸＩＴ  ｅｘｉｔ＿ｓｔａｔｅ。
【００５８】
どちらにしても、ＥＸＩＴ命令はスケジューラ２４に作用し、命令が実行されたタイムスロットがスーパーバイザスレッドに返ってくるようにする。その後、スーパーバイザスレッドは、１つ又は複数の継続するスーパーバイザタスク（例えば、バリア同期及び／又は他のタイルのような外部リソースとのデータ交換）を実行し、及び／又は、新たなワーキングスレッド（Ｗ４など）を当該スロットに割り当てるための別の放棄命令を実行し続けることができる。従って、命令メモリ１２内のスレッドの総数は、バレルスレッド処理ユニット１０がいつでもインターリーブすることができる数よりも大きくてよいことに再度留意されたい。スーパーバイザスレッドＳＶの役割は、スケジューラ２４のラウンドロビンスケジュール内でインターリーブされたタイムスロットＳ０・・・ＳＭのどれに、プログラム全体のどの段階で命令メモリ１２からのワーカースレッドＷ０・・・Ｗｊのどれを割り当てるかをスケジュールすることである。
【００５９】
実施形態では、ワーカースレッドがそのタイムスロットをスーパーバイザスレッドに戻す別の方法もある。すなわち、実行ユニット１８は、ワーカースレッドが例外に遭遇したときに自動的にそのタイムスロットをスーパーバイザに返すように構成された例外機構を備える。この場合、個々の終了状態はデフォルト値に設定されてもよいし、そのまま残されてもよい。
【００６０】
さらに、実施形態では、処理ユニット１０は、命令セットの１つ又は複数の命令が、ワーカースレッドではなくスーパーバイザスレッドの使用のために予約され、及び／又は、命令セットの１つ又は複数の命令がスーパーバイザスレッドではなくワーカースレッドの使用のために予約される。例えば、（ＲＵＮ）命令及び終了（ＥＸＩＴ）命令が関連するステージで動作して、どのタイプのスレッドが当該スロットを現在占有しているかを通知すると仮定すれば、これは実行ステージ１８、デコードステージ１６又はフェッチステージ１４において実行されてもよい。そのような場合、スーパーバイザ特有の命令は、少なくとも放棄命令を含むが、処理ユニット１０がバリア同期を実行するための専用ロジックを含む場合には、１つ以上のバリア同期命令など他の命令も含むこともあり得る。また、ワーカー特有の命令には、少なくとも終了命令が含まれるが、浮動小数点演算（エラーが発生しやすい）などの他の命令を含んでいてもよい。
【００６１】
上述したプロセッサ４は、処理ユニット１０及びメモリ１１の単一のインスタンスを含む単一の独立型プロセッサとして使用されてもよい。しかし、図５に示すように、いくつかの実施形態では、プロセッサ４は、アレイ６内の複数のプロセッサのうちの１つであってもよく、同じチップ上に統合されてもよく、複数のチップにまたがってもよい。この場合、プロセッサ４は、適切な相互接続３４を介して互いに接続されており、アレイにわたって異なるワーカースレッドのうちの１つ、いくつか、又はすべてによって実行される１つ又は複数の計算結果などを、互いにデータ通信することができる。例えば、プロセッサ４は、単一のチップ上に実装されたより幅広いマルチタイルプロセッサ内の複数のタイルのうちの１つであってもよく、各タイルは、図１〜図４に関連して上述したように構成されたバレルスレッド処理ユニット１０及び関連メモリ１１のそれ自体の個別のインスタンスを含んでもよい。完全を期すため、本明細書で言及する「アレイ」は、タイル又はプロセッサ４の任意な特定の数の次元又は物理的レイアウトを必ずしも意味しないことにも留意されたい。いくつかのそのような実施形態では、スーパーバイザは、タイル間の交換を実行する責任があり得る。
【００６２】
いくつかの実施形態では、ＥＸＩＴ命令には特別な機能、すなわち、ＥＸＩＴ命令のオペランドに指定された終了状態を同じパイプライン１３を介して実行される複数の他のワーカースレッドの終了状態に自動的に集合させる（専用のハードウェアロジックによって）機能を与えられる。そのような各ワーカーは、ＥＸＩＴ命令の自身のインスタンスのオペランドとして指定される対応する終了状態を有する。これは、指定された終了状態を、同じプロセッサモジュール４によって（すなわち、所与の処理ユニット１０の同じパイプライン１３を介して）実行されているすべてのワーカースレッドの終了状態に、又は少なくとも指定された段階におけるすべてのワーカースレッドの終了状態に集合させることであってもよい。いくつかの実施形態では、アレイ６（同じチップ上の他のタイルにあってもよく、又は他のチップ上にあってもよい）内の１つ以上の他のプロセッサ上で実行されるワーカースレッドの終了状態を集合するさらなる命令が実行されてもよい。いずれにしても、プロセッサ４は、プロセッサ４のローカルに集合された終了状態を記憶するように特に構成された少なくとも１つのレジスタ３８を備える。実施形態では、これは、スーパーバイザのコンテキストレジスタファイルＣＸＳにおけるスーパーバイザのステータスレジスタの１つである。個別のスレッドによって各ＥＸＩＴ命令が実行されると、専用アグリゲーションロジックは、ＥＸＩＴ命令のオペランドで指定された終了状態を、終了状態レジスタ３８に格納された集約終了状態に寄与させる。いつでも、例えば着目ワーカーのすべてが個別の終了命令によって終了すると、スーパーバイザスレッドは終了状態レジスタ３８から終了状態にアクセスすることができる。これは、それ自体のステータスレジスタＳＲにアクセスすることを含んでもよい。
【００６３】
集合ロジックは、実行ユニット１８の専用ハードウェア回路に実装される。従って、ワーカースレッドを終了させる命令には、追加で暗黙的な機能が含まれている。専用回路又はハードウェアとは、汎用コードを使用してソフトウェアでプログラムされるのではなく、ハードワイヤード機能を有する回路を意味する。ローカルに集合された終了状態の更新（レジスタ３８における）は、プロセッサ４の命令セット内における基本的な機械コード命令の１つである特別なＥＸＩＴ命令のオペコードの実行によってトリガされ、終了状態を集合する固有の機能性を有する。また、ローカルに集合された終了状態はレジスタ３８に記憶され、その値はパイプライン上で実行されるコードによってアクセスすることができる専用の記憶装置（実施形態では単一ビットの記憶装置）を意味する。好ましくは、終了状態レジスタ３８は、スーパーバイザの状態レジスタの１つを形成する。
【００６４】
一実施例として、個々のスレッドの終了状態及び集合された終了状態は、それぞれ単一のビット、すなわち０又は１の形態をとることができ、集合ロジックは、個々のワーカー終了状態の論理積を取るように構成することができる。つまり、０である入力は０の集合をもたらすが、すべての入力が１の場合、集合は１となる。すなわち真又は成功のアウトカムを表すために１が使用された場合、これは、ワーカースレッドのいずれかのローカル終了状態のいずれかが偽又は不成功である場合、集合された全体の終了状態も偽であるか、不成功のアウトカムを表すことを意味する。例えば、これは、ワーカーがすべて終端条件を満たしているかどうかを判定するために使用することができる可能性がある。従って、スーパーバイザサブプログラムは、単一のレジスタ（実施形態では単一ビット）に「何かが間違っているか」と質問することができ、個々のタイル上で個々のワーカースレッドの個々の状態を調べる必要はなくなる。実際に実施形態では、スーパーバイザは、任意の時点でワーカーに問い合わせることができず、且つワーカーの状態にアクセスすることができず、終了状態レジスタ３８をワーカースレッドのアウトカムを判定する唯一の手段にする。スーパーバイザは、どのコンテキストレジスタファイルがどのワーカースレッドに対応するかを識別せず、ワーカーのＥＸＩＴ後にワーカー状態が消失する。スーパーバイザがワーカースレッドの出力を判断する他の唯一の方法は、ワーカーが汎用データメモリ２２にメッセージを残すということになる。
【００６５】
上記のロジックに相当するのは、ＡＮＤをＯＲゲートで置き換え、ソフトウェアにおける終了状態０及び１の解釈を反転することであろう、すなわち０→真、１→偽である。同様に、ＡＮＤゲートがＯＲゲートで置き換えられるが終了状態の解釈は反転もされずリセット値も反転されない場合、＄ＬＣ内の集合状態は、ワーカー状態のいずれかが（すべてではなく）が状態１で終了したかどうかを記録することになる。他の実施形態では、終了状態は単一ビットである必要はない。例えば、個々のワーカーの終了状態は１ビットであってもよいが、集合された終了状態は、３値の状態、すなわち、すべてのワーカーが状態１で終了した、すべてのワーカーが状態０で終了した、又はワーカーの終了状態が混合であったかを表す２ビットからなっていてもよい。これを実現するロジックの一実施例として、３値を符号化する２つのビットのうちの１つは、個々の終了状態のブールＡＮＤ（又はＯＲ）であって、３値の他のビットは、個々の終了状態のブールＯＲであってもよい。次いで、これらの２つのビットの排他的論理和として、ワーカーの終了状態が混在していることを示す第３の符号化されたケースを形成することができる。
【００６６】
終了状態は、プログラマが望むものは何でも表すために使用することができるが、具体的に想定される１つの実施例は、それぞれのワーカースレッドが「成功」状態又は「真」状態で抜け出たことを示すために１の終了状態を使用する一方、０の終了状態はそれぞれのワーカースレッドが「不成功」又は「偽」状態で抜け出たことを示す（アグリゲーション回路がＡＮＤの代わりにＯＲを実行し、レジスタ＄ＬＣ３８が最初に０にリセットされる場合、その逆になる）。例えば、各ワーカースレッドが、機械知能アルゴリズムのグラフ内で個別のノードの１つ又は複数のパラメータにおけるエラーが、所定のメトリックに従って許容可能なレベルに収まっているかどうかを示す条件など、各ワーカースレッドが関連する条件を有する計算を実行するアプリケーションを考える。この場合、１つの論理レベル（例えば、１）の個々の終了状態を使用して、条件が満たされている（例えば、ノードの１つ又は複数のパラメータにおける１つ又は複数のエラーが、いくつかのメトリックに従って許容可能なレベル内にある）ことを示してもよいが、一方では反対の論理レベル（例えば、０）の個々の終了状態は、条件が満たされなかったこと（例えば、エラーが当該メトリックに従って許容レベル内にないこと）を示すために使用することができる。条件は、例えば、単一のパラメータ又は各パラメータに置かれたエラー閾値であってもよく、ワーカースレッドによって実行されるそれぞれの計算に関連する複数のパラメータのより複雑な関数にもなり得る。
【００６７】
別のより複雑な実施例として、ワーカーの個々の終了状態及び集合された終了状態は、それぞれ２つ以上のビットから構成されていてもよく、これらは、例えば、ワーカースレッドのアウトカムにおける信頼度を表すために使用され得る。例えば、各ワーカースレッドの終了状態は、個別のワーカースレッドのアウトカムにおける確信度の尺度を表し、アグリゲーションロジック３７は、ハードウェア内の個々の信頼レベルの確率的な集合を実行するためにより複雑な回路で置き換えてもよい。
【００６８】
プログラマが終了状態にどのような意味を与えても、次に、スーパーバイザスレッドＳＶは終了状態レジスタ３８から集計された値を取得して、例えば、最後の同期点で、最後にリセットされてから抜け出たすべてのワーカースレッドの集合された終了状態を特定すること、例えば、すべてのワーカーが成功又は真の状態で抜け出たかどうかを特定することができる。この集合された値に依存して、スーパーバイザスレッドはプログラマの設計に従ってその後に判定を下してもよい。プログラマは、自身が望むローカルに集合された終了状態をどのように使っても構わず、例えば、例外を発生させるか、集合された終了状態に依存して分岐決定を実行するかを判定する。例えば、スーパーバイザスレッドは、ローカル集合された終了状態を参照して、複数のワーカースレッドで構成されたプログラムの特定の一部が、期待どおりに又は所望どおりに完了したかどうかを特定することができる。そうでない場合（例えば、ワーカースレッドの少なくとも１つが不成功又は偽の状態で抜け出たとき）、それはホストプロセッサに報告してもよく、あるいは、同じワーカースレッドを含むプログラムの部分で別の反復を実行してもよいが、もしそうであれば（例えば、すべてのワーカースレッドが成功又は真の状態で終了した場合）、代わりに１つ又は複数の新たなワーカーを含むプログラムの別の部分に分岐してもよい。
【００６９】
好ましくは、スーパーバイザスレッドは、そこに記憶された値がすべて所望するスレッドの正確で最新の集合状態を表すように、当該すべてのワーカースレッドが終了するまで、終了状態レジスタ３８内の値にアクセスすべきではない。これを待機することは、現在実行中のすべてのローカルワーカースレッド（すなわち、同じプロセッサモジュール４上のもので、同じパイプライン１３を介して実行中のスレッド）が終了するのを待機するために、スーパーバイザスレッドによって達成されるバリア同期によって実行されてもよい。換言すれば、スーパーバイザが終了状態レジスタ３８から集合された終了状態を取得することを許可される前に、すべての未処理のワーカースレッドが終了するのを待機するために、スーパーバイザスレッドは、終了状態レジスタ３８リセットして、複数のワーカースレッドを起動し、次に、バリア同期を開始する。
【００７０】
図６は、本明細書で開示されるプロセッサアーキテクチャの応用例、すなわち機械知能への適用例を示す。
【００７１】
機械知能の分野の当業者にはよく知られているように、機械知能は、機械知能アルゴリズムが知識モデルを学習する学習段階から始まる。このモデルは、相互接続されたノード（すなわち、頂点）１０２とエッジ（すなわち、リンク）１０４のグラフからなっている。グラフ内の各ノード１０２は、１つ又は複数の入力エッジ及び１つ又は複数の出力エッジを有する。ノード１０２のいくつかの入力エッジのいくつかは、ノードのいくつかの他の出力エッジであり、それにより、ノードを一緒に接続してグラフを形成する。さらに、１つ又は複数のノード１０２の１つ又は複数の入力エッジが全体としてグラフへの入力を形成し、１つ又は複数のノード１０２の出力エッジの１つ又は複数が全体としてグラフの出力を形成する。時には、所与のノードが、グラフへの入力、グラフからの出力、及び他のノードへの接続など、これらのすべてを有している場合もある。各エッジ１０４は、値又はより頻繁にテンソル（ｎ次元行列）を伝達し、これらは入力エッジ及び出力エッジでノード１０２に且つノードから提供される入力及び出力をそれぞれ形成する。
【００７２】
各ノード１０２は、その１つ又は複数の入力エッジで受信されたその１つ又は複数の入力の関数を表し、この関数の結果は１つ又は複数の出力エッジに提供される出力である。各関数は、１つ又は複数の個別のパラメータ（乗算型重みである必要はないが、時には重みとも呼ばれる）によってパラメータ化される。一般に、異なるノード１０２によって表される関数は、異なる形態の関数であってもよく、及び／又は異なるパラメータによってパラメータ化されてもよい。
【００７３】
さらに、各ノード関数の１以上のパラメータの各々は、それぞれのエラー値によって特徴付けられる。さらに、それぞれの条件は、各ノード１０２のパラメータ内のエラーに関連付けされてもよい。単一のパラメータによってパラメータ化された関数を表すノード１０２については、条件は単純な閾値であってもよく、すなわち、エラーが指定された閾値内にある場合に条件が満たされるが、エラーが閾値を超えている場合には満たされない。２つ以上の個別のパラメータによってパラメータ化されたノード１０２については、許容可能なエラーレベルに達したそのノード１０２に対する条件がより複雑であり得る。例えば、条件は、そのノード１０２の各パラメータがそれぞれの閾値内にある場合にのみ満たすことができる。別の実施例として、結合されたメトリックは、同じノード１０２に対する異なるパラメータにおけるエラーを組み合わせて定義され、結合されたメトリックの値が指定された閾値内にあるという条件で満たすことができるが、さもなければ、結合されたメトリックの値が閾値を超えている場合（メトリックの定義に応じてその逆も可）、条件は満足されない。条件が何であっても、これは、ノードのパラメータにおけるエラーが一定のレベル又は受容度以下になるかどうかの尺度を与える。一般に、任意の適切なメトリックを使用してもよい。条件又はメトリックは、すべてのノードについて同じであってもよく、ノードの各々について異なるものであってもよい。
【００７４】
学習段階では、アルゴリズムは経験データ、すなわち、グラフへの入力の異なる可能な組み合わせを表す複数のデータポイントを受信する。より多くの経験データが受信されるにつれて、アルゴリズムは、経験データに基づいてグラフ内の様々なノード１０２のパラメータを徐々に調整して、パラメータの誤差を最小限に抑えるように試行する。目標は、グラフの出力が所与の入力に対する所望の出力に可能な限り近づくようにパラメータの値を探し出すことである。グラフ全体がこのような状態に向かうにつれて、グラフは収束すると言われる。適切な収束度の後に、グラフを使用して、予測又は推論を実行する、すなわち、いくつか所与の入力に対するアウトカムを予測するか、又はいくつか所与の出力についての原因を推測することができる。
【００７５】
学習段階は、さまざまな可能な形態をとることができる。例えば、教師付きアプローチでは、入力経験データはトレーニングデータ、すなわち既知の出力に対応する入力の形をとる。各データポイントで、アルゴリズムは、出力が与えられた入力の既知の出力にさらに近づくようにパラメータを調整することができる。その後の予測段階では、グラフを使用して、入力クエリーを近似予測出力に（又は推論する場合、その逆も可）マッピングすることができる。他のアプローチも可能である。例えば、教師なしのアプローチでは、入力データごとに参照アウトカムの概念がなく、代わりに機械知能アルゴリズムが出力データ内で独自の構造を識別するために残される。あるいは、補強アプローチでは、アルゴリズムは、入力経験データ内の各データポイントに対して少なくとも１つの可能な出力を試行し、この出力が正か負か（そして潜在的にそれが正又は負である可能性の度合い）、勝ち負け、報酬又は罰、又はそのようなものを通知される。多くの試行を経て、アルゴリズムは、ポジティブなアウトカムをもたらすであろう入力を予測することができるように、グラフのパラメータを徐々に調整することができる。グラフを学習するための様々なアプローチ及びアルゴリズムは、多分、機械学習の当業者には周知であると思われる。
【００７６】
本明細書に開示された技術の例示的な適用によれば、各ワーカースレッドは、機械知能グラフにおいてノード１０２のそれぞれ個別の１つに関連付けられた計算を実行するようにプログラムされる。この場合、ノード１０２間のエッジ１０４の少なくとも一部は、スレッド間のデータの交換に対応し、一部は、タイル間の交換を伴い得る。さらに、ワーカースレッドの個別の終了状態は、個別のノード１０２がそのノードのパラメータの収束のために個別の条件を満たしているかどうか、すなわち、誤差空間内の許容可能なレベル又は領域内に収まる１つのパラメータ又は複数のパラメータにエラーを有しているかどうかを表すためにプログラマによって使用される。例えば、これは、個々の終了状態の各々が個々のビットであり、集合された終了状態が個々の終了状態のＡＮＤ（又は０が正であるとみなされる場合には同等にＯＲ）の場合、あるいは、個々の終了状態がすべて真であるか、偽又はミックスであるかを表す３値である場合の実施形態の一使用例である。従って、終了状態レジスタ３８内の単一のレジスタ値を調べることによって、プログラムはグラフ全体又は少なくともグラフのサブ領域が許容可能な程度に収束したかどうかを特定することができる。
【００７７】
これの別の変形として、集合体が個々の信頼値の統計的集合体の形態をとる実施形態を使用することができる。この場合、個々の終了状態は、それぞれのスレッドによって表されるノードのパラメータが許容誤差に達したという確信度（例えば、百分率のような）を表す。次いで、集合された終了状態を使用して、グラフ又はグラフのサブ領域が許容可能な程度に収束したかどうかに関する全体的な信頼度を特定することができる。
【００７８】
マルチタイルアレイ６の場合、各タイルはグラフのサブグラフを実行する。各サブグラフは、１つ以上のスーパーバイザスレッドからなるスーパーバイザサブプログラムと、ワーカーのいくつか又はすべてがコードレットの形態をとるワーカースレッドのセットとを含む。
【００７９】
そのような適用、又は実際には、グラフ内の各ノードを表すために各ワーカースレッドが使用されるグラフベースの適用では、各ワーカーに含まれる「コードレット」は、持続状態及び１つの頂点の入力及び／出力で動作するソフトウェア手順として定義することができ、ここでコードレットは：
・１つのワーカースレッドレジスタコンテキストで起動され、「実行」命令を遂行するスーパーバイザスレッドによって１つのバレルスロットで実行され、
・他のコードレット又はスーパーバイザとの通信なしで完了し（コードレットが終了したときのスーパーバイザへの返信を除く）、
・「実行」命令によって提供されるメモリポインタを介して頂点の持続状態と、そのバレルスロットに固有のメモリ内の非持続的な作業領域とにアクセスし、
・その最後の命令として「ＥＸＩＴ」を実行すると、使用していたバレルスロットがスーパーバイザに返され、終了命令で指定された終了状態がスーパーバイザで可視なタイルのローカル終了状態に集合される。
【００８０】
グラフ（又はサブグラフ）を更新するとは、エッジによって定義される因果関係と一致する順序で、各構成要素の頂点を一度更新することを意味する。頂点を更新するとは、頂点状態でコードレットを実行することを意味する。コードレットは、頂点の更新手順であって、通常、１つのコードレットは多くの頂点に関連付けられている。スーパーバイザは頂点ごとに１つのＲＵＮ命令を実行し、そのような各命令は頂点状態アドレス及びコードレットアドレスを指定する。
【００８１】
上記の実施形態はほんの一例として記載されていることが理解されよう。
【００８２】
例えば、本開示の適用可能性は、図２及び図３に関連して概説された特定のプロセッサアーキテクチャに限定されず、一般に、本明細書で開示される概念は、見込まれるタイムスロットが存在するよりも少なくとも１つ多くのコンテキストを追加することにより、複数の実行タイムスロットを有する任意のプロセッサアーキテクチャに適用可能である。
【００８３】
また、タイムスロットの数を超えたさらなるコンテキストが他の目的のために含まれる可能性は排除されないことにも留意されたい。例えば、一部のプロセッサは、実際に実行中のスレッドを決して表わすことがないデバッグコンテキストを含むが、デバッグ目的のために後にプログラム開発者によって解析されるべき誤ったスレッドのプログラム状態を記憶するためにエラーに遭遇したときスレッドによって使用される。
【００８４】
さらに、スーパーバイザスレッドの役割は、バリア同期及び／又はスレッド間のデータ交換にのみ限定されず、他の実施形態では、これに代えて又はそれに加えて、２つ以上のワーカースレッドの可視性を含む任意の他の機能性を担うことがあり得る。例えば、プログラムがグラフの複数回の反復を含む実施形態では、スーパーバイザスレッドは、グラフの反復を何回実行すべきかを決定する役割を果たしてもよく、これを前の反復に依存させてもよい。
【００８５】
開示された技術の他の変形及び応用は、本明細書の開示が与えられると当業者には明らかになるであろう。本開示の範囲は、記載された実施形態によって制限されるのではなく、添付の特許請求の範囲によってのみ限定される。
【図１】
2019079530.tif 000003
【図２】
2019079530.tif 000004
【図３】
2019079530.tif 000005
【図４】
2019079530.tif 000006
【図５】
2019079530.tif 000007
【図６】
2019079530.tif 000008
【外国語明細書】
2019079530000001.pdf