以下は、マシンインテリジェンスアプリケーションに含まれる計算において生じる問題に対処するために開発されたアーキテクチャを有するプロセッサの構成要素を説明する。本明細書に記載のプロセッサは、作業アクセラレータとして使用することができる。つまり、このプロセッサは、ホストコンピュータ上で実行されているアプリケーションからワークロードを受け取る。このワークロードは、一般に、処理されるべき非常に大きなデータセット(知識モデルを学習するためにマシンインテリジェンスアルゴリズムによって使用される大きな経験データセット、又は以前に学習した知識モデルを使用して予測又は推論を実行する元のデータ)である。本明細書で提示されるアーキテクチャの目的は、これらの非常に大量のデータを非常に効率的に処理することである。このプロセッサアーキテクチャは、マシンインテリジェンスに関わるワークロードを処理するために開発されたものである。しかし、ここに開示するアーキテクチャが同様の特性を共有する他のワークロードにも適している可能性があることは明らかであろう。
図1は、本開示の実施形態によるプロセッサモジュール4の一例を示す。例えば、プロセッサモジュール4は、同じチップ上の同様のプロセッサタイルのアレイのうちの1つのタイルである、又はそれ自体のチップ上のスタンドアローンプロセッサとして実装されることができる。プロセッサモジュール4は、バレルスレッド処理ユニットの形態のマルチスレッド処理ユニット10と、ローカルメモリ11(すなわち、マルチタイルアレイの場合は同じタイル上、又はシングルプロセッサチップの場合には同じチップ上)とを含む。バレルスレッド処理ユニットは一種のマルチスレッド処理ユニットであり、そこではパイプラインの実行時間はインターリーブされたタイムスロットの繰り返しシーケンスに分割され、その各々は所与のスレッドによって所有され得る。これについては、後で詳しく説明する。メモリ11は、命令メモリ12とデータメモリ22(異なるアドレス指定可能なメモリユニット又は同じアドレス指定可能なメモリユニットの異なる領域に実装可能)とを含む。命令メモリ12は処理ユニット10によって実行されるべきマシンコードを記憶し、データメモリ22は実行されたコードによって操作されるべきデータと実行されたコードによって出力されるデータ(例えば操作の結果)との両方を記憶する。
メモリ12は、プログラムの様々な異なるスレッドを記憶し、各スレッドは、特定の1つ又は複数のタスクを実行するための命令のそれぞれのシーケンスを含む。本明細書で言う命令は、単一のオペコードと0個以上のオペランドとからなる機械コード命令、すなわちプロセッサの命令セットの基本命令のうちの1つのインスタンスを意味することに留意されたい。
本明細書に記載のプログラムは、複数のワーカースレッドと、1つ又は複数のスーパーバイザスレッドとして構成され得るスーパーバイザサブプログラムとを含む。これらについては、後で詳しく説明する。実施形態では、ワーカースレッドのいくつか又はすべてはそれぞれ、それぞれの「コードレット(codelet)」の形をとる。コードレットとは特定の種類のスレッドで、「アトミック」スレッドとも呼ばれる。コードレットは、スレッドの始めから(起動時から)実行する必要がある全ての入力情報を有している、すなわち起動後にプログラムの他の部分から又はメモリからいかなる入力も受け取ることがない。さらに、プログラムの他の部分は、そのスレッドが終了するまで(完了するまで)スレッドの出力(結果)を使用しない。これにエラーが発生しない限り、コードレットは完了することが保証されている。ただし、コードレットをステートレスと定義する文献もある。つまり、2回実行した場合、最初の実行から情報を継承できない可能性があるが、この追加定義はここでは採用しない。尚、ワーカースレッドのすべてがコードレット(アトミック)である必要はない。実施形態では、これに代わり、一部又は全部のワーカーが互いに通信する可能性がある。
処理ユニット10内では、命令メモリ12からの複数の異なるスレッドを単一の実行パイプライン13を介してインターリーブすることができる(ただし典型的には、命令メモリに記憶された全スレッドのサブセットのみを全体的なプログラム内の所与の時点でインターリーブすることができる)。マルチスレッド処理ユニット10は、同時に実行されるスレッドの異なるそれぞれ1つの状態(コンテキスト)を表すようにそれぞれ構成された複数のコンテキストレジスタファイル26と、同時に実行されるスレッドに共通の共有実行パイプライン13と、インターリーブ方式で、好ましくはラウンドロビン方式で共有パイプラインを介して実行するために並行スレッドをスケジューリングするためのスケジューラ24とを含む。処理ユニット10は、複数のスレッドに共通の共有命令メモリ12と、やはり複数のスレッドに共通の共有データメモリ22とに接続されている。
実行パイプライン13は、命令セットアーキテクチャによって定義されるように、フェッチステージ14と、デコードステージ16と、算術ロジック演算、アドレス計算、ロード及びストアオペレーション、及び他のオペレーションを実行することができる実行ユニットを含む実行ステージ18とを含む。コンテキストレジスタファイル26のそれぞれは、それぞれのスレッドのプログラム状態を表すためのそれぞれのレジスタセットを含む。
各コンテキストレジスタファイル26を構成するレジスタの一例が図2に概略的に示されている。コンテキストレジスタファイル26のそれぞれは、それぞれのスレッドのための少なくともプログラムカウンタ(PC)を含むそれぞれの1つ又は複数の制御レジスタ28(スレッドが現在実行している命令アドレスを追跡するため)及び、実施形態において、それぞれのスレッドの現在のステータスを記録する1つ又は複数のステータスレジスタ(SR)のセット(例えば、それが現在実行中であるか一時停止中であるかなど)を含む。コンテキストレジスタファイル26のそれぞれはまた、それぞれのスレッドによって実行される命令のオペランド、すなわち実行されるとそれぞれのスレッドの命令のオペコードによって定義されたオペレーションに基づいて又はその結果として生じる値を一時的に保持するためのオペランドレジスタ(OP)32のそれぞれのセットを含む。尚、コンテキストレジスタファイル26のそれぞれは、それぞれ1つ又は複数の他の種類のレジスタ(図示せず)を任意選択で含むことができることを理解されよう。また、「レジスタファイル」という用語は、共通アドレス空間内のレジスタ群を指すために使用されることがある。これは必ずしも本開示の場合である必要はなく、各ハードウェアコンテキスト26(各コンテキストを表す各レジスタセット26)はより一般的には1つ又は複数のそのようなレジスタファイルを含むことができる。
詳細は後述するが、本開示の構成は、同時に実行することができる数Mのスレッドそれぞれに対して1つのワーカーコンテキストレジスタファイルCX0・・・CX(M-1)(図示の例ではM=3であるが、これに限定されない)及び1つの追加のスーパーバイザコンテキストレジスタファイルCXSを有する。ワーカーコンテキストレジスタファイルはワーカースレッドのコンテキストを記憶するために確保されており、スーパーバイザコンテキストレジスタファイルはスーパーバイザスレッドのコンテキストを記憶するために確保されている。実施形態では、スーパーバイザコンテキストは、各ワーカーとは異なる数のレジスタを有するという点で特別であることに留意されたい。各ワーカーコンテキストは、互いに同数のステータスレジスタ及びオペランドレジスタを有することが好ましい。実施形態では、スーパーバイザコンテキストは、各ワーカーよりも少ないオペランドレジスタを有し得る。スーパーバイザが有さずワーカーコンテキストが有し得るオペランドレジスタの例として、浮動小数点レジスタ、累算レジスタ、及び/又は(ニューラルネットワークの重みを保持するための)専用重みレジスタを含まれる。実施形態では、スーパーバイザはまた、異なる数のステータスレジスタを有してもよい。さらに、実施形態では、プロセッサモジュール4の命令セットアーキテクチャは、ワーカースレッド及びスーパーバイザスレッドがいくつかの異なるタイプの命令を実行するが、いくつかの命令タイプも共有するように構成され得る。
フェッチステージ14は、スケジューラ24の制御下で、命令メモリ12から実行される命令をフェッチするように接続されている。スケジューラ24は、フェッチステージ14を制御して、1組の同時実行スレッドの各々から順番にタイムスロットの反復シーケンスで命令をフェッチし、このようにしてパイプライン13の理想を時間的にインターリーブされた複数のタイムスロットに分割するように構成される。これについては後に詳細に説明する。例えば、スケジューリング方式はラウンドロビン又は加重ラウンドロビンであり得る。この方式で動作するプロセッサの別の用語は、バレルスレッドプロセッサである。
いくつかの実施形態では、スケジューラ24は、スレッドが一時停止されているかどうかを示す各スレッドのステータスレジスタSRのうちの1つにアクセスすることができ、これによりスケジューラ24が実際にフェッチステージ14を制御して現在アクティブなスレッドの命令のみをフェッチするようにする。実施形態では、好ましくは各タイムスロット(及び対応するコンテキストレジスタファイル)は常に1つのスレッド又は他のスレッドによって所有される。すなわち、各スロットは常に何らかのスレッドによって占有され、各スロットは常にスケジューラ24のシーケンス内に含まれる。ただし、特定のスロットを占有しているスレッドがその時点で一時停止されることがあり、その場合、シーケンスがそのスロットに到達すると、それぞれのスレッドの命令フェッチが渡される。あるいは、例えば、代替のあまり好まれない実装では、いくつかのスロットが一時的に空になり、スケジュールされたシーケンスから除外され得ることもある。タイムスロットの数が参照される場合、実行ユニットはインターリーブするなどように動作可能である。これは、実行ユニットが同時に実行することができる最大スロット数、すなわち実行ユニットのハードウェアがサポートする同時スロット数を指す。
フェッチステージ14は、各コンテキストのプログラムカウンタ(PC)にアクセスを有する。それぞれのスレッドごとに、フェッチステージ14はプログラムカウンタによって示されるようにプログラムメモリ12内の次のアドレスからそのスレッドの次の命令をフェッチする。分岐命令で分岐しない限り、プログラムカウンタは各実行サイクルをインクリメントする。次に、フェッチステージ14はフェッチした命令をデコードするためにデコードステージ16に渡し、その命令が実行されるために、デコードステージ16は、その命令で指定された任意のオペランドレジスタ32のデコードされたアドレスとともにデコードされた命令の指示を実行ユニット18に送る。実行ユニット18は、算術命令の場合など、(例えば、2つのオペランドレジスタ内の値を加算、乗算、減算又は除算し、その結果をそれぞれのスレッドの別のオペランドレジスタに出力することにより)復号化されたレジスタアドレスに基づいて命令を実行する際に使用することができるオペランドレジスタ32及び制御レジスタ28へのアクセスを有する。あるいは、その命令がメモリアクセス(ロード又は記憶)を定義している場合、実行ユニット18のロード/記憶ロジックは、命令にしたがって、データメモリからの値をそれぞれのスレッドのオペランドレジスタにロードするか、又はそれぞれのスレッドのオペランドレジスタからの値をデータメモリ22に記憶する。あるいは、その命令が分岐又はステータス変更を定義する場合、実行ユニットはそれに応じてプログラムカウンタPC又はステータスレジスタSRのうちの1つの値を変更する。1つのスレッドの命令が実行ユニット18によって実行されている間、インターリーブドシーケンス内の次のタイムスロット内のスレッドからの命令は、デコードステージ16によってデコードされ得る、及び/又は、1つの命令がデコードステージ16によってデコードされている間に、その次のタイムスロット内のスレッドからの命令はフェッチステージ14によってフェッチされ得ることに留意されたい。(ただし、一般に、本開示の範囲はタイムスロットごとに1つの命令に限定されず、例えば、代替シナリオでは、タイムスロットごとに所与のスレッドから2つ以上の命令のバッチを発行することができる。)このように、インターリーブは、既知のバレルスレッド処理技術にしたがって、パイプライン13内のレイテンシを隠すのに有利である。
スケジューラ24によって実装されるインターリーブ方式の一例が図3に示されている。ここで、同時スレッドはラウンドロビン方式にしたがってインターリーブされる。これによって、スキームの各ラウンド内で、そのラウンドは、それぞれがそれぞれのスレッドを実行するための一連のタイムスロットS0、S1、S2・・・に分割される。典型的には、各スロットは1プロセッササイクル長であり、別々のスロットも均一な大きさにされる。ただし全ての可能な実施形態において必ずしもそうとは限らず、例えば加重ラウンドロビン方式も可能で、実行ラウンドごとに一部のスレッドが他のスレッドよりも多くのサイクルを取得する。一般に、バレルスレッディングは、偶数ラウンドロビン又は加重ラウンドロビンスケジュールを採用することができ、後者の場合、重み付けは固定式又は適応式でよい。
実行ラウンドごとのシーケンスが何であれ、このパターンはそれから繰り返され、各ラウンドは各タイムスロットのそれぞれのインスタンスを含む。したがって、本明細書で言及されるタイムスロットは、シーケンスの所与の繰り返しにおけるタイムスロットの特定のインスタンスではなく、シーケンス内の繰り返し割り当てられた場所を意味することに留意されたい。言い換えれば、スケジューラ24は、パイプライン13の実行サイクルを複数の時間的にインターリーブされた(時分割多重)実行チャネルに割り当て、それぞれがタイムスロットの反復シーケンスにおけるそれぞれのタイムスロットの繰り返しを含む。図示の実施形態では、4つのタイムスロットがあるが、これは単に例示目的であり、他の数も可能である。例えば好ましい一実施形態では、実際には6つのタイムスロットがある。
ラウンドロビン方式がどのタイムスロットの数に分割されても、本開示によれば、処理ユニット10は、タイムスロットよりも1つ多いコンテキストレジスタファイル26を含む。すなわち、バレルスレッドすることのできる、インターリーブされたタイムスロットの数より1多いコンテキストをサポートする。
これを図2の例により示す。図3に示すように4つのタイムスロットS0〜S3がある場合は、CX0、CX1、CX2、CX3、及びCXSのラベルを付した5つのコンテキストレジスタファイルがある。つまり、バレルスレッド方式では4つの実行タイムスロットS0〜S3しかないと4つのスレッドしか同時に実行できないが、本明細書では、第5プログラムカウンタ(PC)、第5のセットのオペランドレジスタ32、及び実施形態では第5セットの1つ又は複数のステータスレジスタ(SR)を含む第5コンテキストレジスタファイルCXSを追加することを開示する。上述のように、実施形態では、スーパーバイザコンテキストは他のものCX0〜3とは異なり得、スーパーバイザスレッドは、実行パイプライン13を動作させるための異なる命令セットをサポートし得る。
最初の4つのコンテキストCX0・・・CX3のそれぞれは、4つの実行タイムスロットS0・・・S3のうちの1つに現在割り当てられている複数の「ワーカースレッド」のそれぞれの状態を表すために使用され、プログラマによって望まれるあらゆるアプリケーション特有の計算タスクを実行する(これもまた、命令メモリ12に記憶されているプログラムのワーカースレッドの総数のサブセットでよいことに留意されたい)。ただし、5番目のコンテキストCXSは、ワーカースレッドの実行を調整する役割を有する「スーパーバイザスレッド」(SV)の状態を表す特別な機能のために確保されている。つまり少なくとも、プログラム全体のどの時点で、どのタイムスロットS0、S1、S2・・・でどのワーカースレッドWを実行するかを割り当てるという意味である。任意選択的に、このスーパーバイザスレッドは他の「スーパーバイザ」又は調整責任を有し得る。例えば、スーパーバイザスレッドは、特定の実行順序を保証するためにバリア同期を実行することを担当することができる。例えば1つ以上の第2のスレッドが、同じプロセッサモジュール4上で走る1つ以上の第1のスレッドによって出力されるデータに依存している場合などで、スーパーバイザはバリア同期を実行して、最初のスレッドが終了するまで2番目のスレッドのいずれも開始されないようにすることができる。及び/又は、スーパーバイザはバリア同期を実行して、他のタイル又はプロセッサチップなどの特定の外部データソースがそのデータを利用可能にするのに必要な処理を完了するまでプロセッサモジュール4上の1つ又は複数のスレッドが開始しないようにすることができる。このスーパーバイザスレッドはまた、複数のワーカースレッドに関する他の機能を実行するためにも使用可能である。例えば、スーパーバイザスレッドは、プロセッサモジュール4の外部にデータを通信することを担当してもよい(1つ以上のスレッドによって処理される外部データを受信するため、及び/又は1つ以上のワーカースレッドによって出力されるデータを伝送するため)。一般に、スーパーバイザスレッドは、プログラマが望む任意の種類の監視機能又は調整機能を提供するために使用され得る。例えば別の例として、スーパーバイザは、タイルローカルメモリ12と、(ディスクアレイ6の外部にある)ストレージディスクやネットワークカードなどのより広いシステム内の1つ又は複数のリソースとの間の転送を監視することができる。
当然のことながら、4つのタイムスロットは単なる一例であり、1ラウンドあたり最大M個のタイムスロット0・・・M-1がある場合、プロセッサモジュール4はM+1個のコンテキストCX・・・CX(M-1)&CXSを含むように、他の実施形態では一般に他の数があってもよい。すなわち、任意の所与の時間にインターリーブすることができるワーカースレッドごとに1つ、及びスーパーバイザのための追加のコンテキストを含み、例えば例示的な一実装形態では、6つのタイムスロットと7つのコンテキストが含まれる。
図4を参照すると、スーパーバイザスレッドSVは、インターリーブタイムスロットの方式においてそれ自体のタイムスロットをそれ自体は有していない。また、ワーカースレッドへのスロットの割り当てが柔軟に定義されるため、ワーカーもタイムスロットをそれ自体は有していない。むしろ、各タイムスロットには、ワーカーコンテキストを記憶するため、それ自体の専用コンテキストレジスタファイル(CX0・・・CX(M−1))があり、これは、スロットがワーカーに割り当てられるとそのワーカーによって使用されるが、スロットがスーパーバイザに割り当てられる場合には使用されない。所定のスロットがスーパーバイザに割り当てられると、そのスロットは代わりに、そのスーパーバイザのコンテキストレジスタファイルCXSを使用する。尚、スーパーバイザは常に自分自身のコンテキストにアクセスでき、どのワーカーもスーパーバイザコンテキストレジスタファイルCXSを占有することができない。
スーパーバイザスレッドSVは、タイムスロットS0・・・S3(より一般的にはS0・・・SM−1)のいずれか及び全てのタイムスロットで動作する能力を有する。スケジューラ24は、プログラム全体としての開始時に、スーパーバイザスレッドをすべてのタイムスロットに割り当てることによって開始するように構成されている。すなわち、スーパーバイザSVはS0・・・S3の全てにおいて動作し始める。ただし、スーパーバイザスレッドには、その後のある時点(すぐに、又は1つ以上のスーパーバイザタスクの実行後)に、実行中の各スロットを一時的にそれぞれのワーカースレッド、例えば図4に示す例では、最初はワーカーW0・・・W3に放棄するrelinquishメカニズムがある。これは、ここでは例として「RUN」と呼ばれる放棄命令を実行するスーパーバイザスレッドによって達成される。実施形態では、この命令は2つのオペランド、すなわち命令メモリ12内のワーカースレッドのアドレスと、データメモリ22内のそのワーカースレッドに関する何らかのデータのアドレスとを取る。
RUN task_addr, data_addr
ワーカースレッドは、互いに並行して実行することができるコードの一部であり、それぞれ実行されるべき1つ又は複数のそれぞれの計算タスクを表す。そのデータアドレスはワーカースレッドが作用するデータを指定することができる。あるいは、放棄命令は、ワーカースレッドのアドレスを指定する単一のオペランドのみを取り、データアドレスはワーカースレッドのコードに含まれていてもよい。又は、別の例では、単一のオペランドが、ワーカースレッド及びデータのアドレスを指定するデータ構造を指すことができる。上述のように、実施形態では、少なくともいくつかのワーカーは、コードレット、すなわち同時に実行可能なコードのアトミックユニットの形をとることができる。代替的又は追加的に、ワーカーの中にはコードレットである必要はなく、代わりに互いに通信することができるものもある。
放棄命令(「RUN」)は、この命令自体が実行される現在のタイムスロットをそのオペランドによって指定されたワーカースレッドに放棄するようにスケジューラ24に作用する。放棄されるのは、この命令が実行されるタイムスロットであることが放棄命令に暗黙的になっていることに留意されたい(機械コード命令の文脈における暗黙とは、命令コード自体から暗黙のうちに理解されるため、それを指定するオペランドが不要であることを意味する)したがって、放棄されるタイムスロットは、スーパーバイザが放棄命令を実行するタイムスロットである。別の言い方をすれば、そのスーパーバイザが放棄するのと同じスペースで実行している。スーパーバイザが「このコード部分をこの場所でrunする」と言ってから、それ以降は繰り返しスロットが関連ワーカースレッドによって(一時的に)所有される。
スーパーバイザスレッドSVは、タイムスロットのうちの1つ又は複数の他のタイムスロットのそれぞれにおいて同様の動作を実行して、(命令メモリ12内のより大きなセットW0・・・Wjから選択された)ワーカースレッドW0・・・W3のそれぞれ異なるタイムスロットにそのタイムスロットの一部又は全部を渡す。最後のスロットの実行が終わると、スーパーバイザは中断される(その後、スロットの1つがワーカーWによって引き戻されると中断したところから再開する)。
スーパーバイザスレッドSVは、このようにして異なるワーカースレッドを割り当てることができ、それぞれがインターリーブされた実行タイムスロットS0・・・S3のうちの異なるものに対してそれぞれ1つ又は複数のタスクを実行する。スーパーバイザスレッドは、ワーカースレッドを実行する時期であると判断した場合、放棄命令(「RUN」)を使用して、そのワーカーをRUN命令が実行されたタイムスロットに割り当てる。
いくつかの実施形態では、命令セットは、実行命令の変形、RUNALL(「すべて実行」)も含む。この命令は、複数のワーカーのセットをまとめて起動し、すべて同じコードを実行するために使用される。実施形態において、これは、処理ユニットのスロットS0・・・S3(又はより一般的にはS0・・・S(M-1))のすべてにおいてそれぞれワーカーを起動する。
さらに、いくつかの実施形態では、実行されると、RUN命令及び/又はRUNALL命令はまた、1つ又は複数のスーパーバイザステータスレジスタCXS(SR)から何らかのステータスを自動的にRUN又はRUNALLによって起動されたワーカースレッドの対応する1つ以上のステータスレジスタにコピーする。例えば、コピーされたステータスは、浮動小数点丸めモード(例えば、最近傍への丸め又はゼロへの丸め)及び/又はオーバーフローモード(例えば、飽和又は無限大を表す別の値の使用)などの1つ又は複数のモードを含み得る。このコピーされたステータス又はモードは、コピーされたステータス又はモードにしたがって動作するように対象のワーカーを制御する。実施形態では、ワーカーは後にそれをそれ自体のステータスレジスタに上書きすることができる(ただし、スーパーバイザのステータスを変更することはできない)。さらなる代替又は追加の実施形態では、ワーカーは、スーパーバイザの1つ又は複数のステータスレジスタからいくつかのステータスを選択して読み取ることができる(後で自分のステータスを再度変更することができる)。例えば、やはりこれも、浮動小数点モード又は丸めモードなどのスーパーバイザステータスレジスタからのモードを採用することとなり得る。しかし、実施形態では、スーパーバイザはワーカーのコンテキストレジスタCX0・・・のいずれも読むことはできない。
起動されると、現在割り当てられているワーカースレッドW0・・・W3のそれぞれは、それぞれの放棄命令によって指定されたコードで定義されている1つ又は複数の計算タスクを実行し始める。タスクの終わりに、それぞれのワーカースレッドはそれからそれが走っているタイムスロットをスーパーバイザスレッドに返す。これは、終了命令(「EXIT」)を実行することによって達成される。
EXIT命令は、終了時にそれぞれのコードレットの状態を示す(例えば、特定の条件が満たされたかどうかを示す)ためにプログラマが望む任意の目的のために使用される少なくとも1つのオペランド、好ましくは単一のオペランドexit_state(例えばバイナリ値)のみをとる。
EXIT exit_state
EXIT命令は、それが実行されるタイムスロットがスーパーバイザスレッドに戻されるようにスケジューラ24に作用する。スーパーバイザスレッドは、その後、1つ又は複数の後続のスーパーバイザタスク(例えば、バリア同期及び/又は他のタイルなどの外部リソースとのデータ交換)を実行する、及び/又は対象スロットに新しいワーカースレッド(W4など)を割り当てるために別の放棄命令を実行し続けることができる。したがって、命令メモリ12内のスレッドの総数は、バレルスレッド処理ユニット10が一度にインターリーブすることができる数よりも多くなり得ることに再び留意されたい。スケジューラ24のラウンドのロビンスケジュール方式において、命令メモリ12からのどのワーカースレッドW0・・・Wjをプログラム全体のどの段階でどのインターリーブされたタイムスロットS0・・・SMに割り当てるべきかをスケジュールすることはスーパーバイザスレッドSVの役割である。
さらに、EXIT命令には、EXIT命令のオペランドで指定された終了状態を(専用ハードウェアロジックにより)、同じプロセッサモジュール4(例えば、同じタイル)の同じパイプライン13で実行されている複数の他のワーカースレッドの終了状態に自動的にアグリゲートさせるという特別な機能が与えられている。このように、ワーカースレッドを終了させる命令には、追加の暗黙の機能が含まれている。
これを達成するための回路例を図5に示す。この例では、個々のスレッドの出口状態及びアグリゲートされた出口状態はそれぞれ単一ビット、すなわち0又は1の形をとる。プロセッサモジュール4は、そのプロセッサモジュール4のアグリゲートされた終了状態を記憶するためのレジスタ38を含む。このレジスタを、(プロセッサモジュール4が類似のプロセッサタイルのアレイの1つとして含まれるときのグローバルコンセンサスとは対照的に。これについてはより詳細に後述する)本明細書では「ローカルコンセンサス」レジスタ$LCと呼ぶことがある。実施形態では、このローカルコンセンサスレジスタ$LC38は、スーパーバイザのコンテキストレジスタファイルCXS内のスーパーバイザのステータスレジスタの1つである。アグリゲートを実行するためのロジックは、(A)EXIT命令のオペランドで指定された終了状態と(B)ローカルコンセンサスレジスタ($LC)38内の現在値とのロジック積を実行し、その結果(Q)をローカルアグリゲートの新しい値としてローカルコンセンサスレジスタ$LC38に出力するように構成されたANDゲート37を含む。
このプログラム内の適切な同期点で、ローカルコンセンサスレジスタ($LC)38に記憶されている値は最初に値1にリセットされる。すなわちこの時点以降に終了するスレッドすべては、次回のリセットまで、ローカルにアグリゲートされる終了状態$LCに寄与する。ANDゲート37の出力(Q)は、両方の入力(A、B)が1であれば1であり、そうでなく入力(A、B)のいずれかが0であれば出力Qは0になる。EXIT命令が実行されるたびに、その終了状態は(最後のリセット以降)前に実行されたものと一緒にアグリゲートされる。したがって、図5に示す構成によって、ロジックは、最後にローカルコンセンサスレジスタ($LC)38がリセットされてからEXIT命令によって終了したワーカースレッドの出口状態の実行アグリゲーションを維持する。この例における実行アグリゲーションとは、これまでのすべてのスレッドが真に終了したかどうか、つまりワーカースレッドのいずれかからの0の終了状態は、次のリセットまでレジスタ38内のアグリゲートが0にラッチされることをいう。実施形態では、スーパーバイザSVは、ローカルコンセンサスレジスタ($LC)38から現在値を取得することによって、いつでもランニングアグリゲートを読み取ることができる(読み取るためにオンタイル同期を待つ必要はない)。
ローカルコンセンサスレジスタ($LC)38内のアグリゲーションのリセットは、1つ又は複数の汎用命令を使用してローカルコンセンサスレジスタ($LC)38のレジスタアドレスにPUTを実行するスーパーバイザSVによって実行され得る。この例ではレジスタ38に1の値を入れる。あるいは、自動化機構によって、例えば本明細書で後述するSYNC命令を実行することによってトリガされることによってリセットが実行されることもあり得る。
アグリゲート回路37、この場合のANDゲートは、ブールANDの機能を形成するために電子部品の任意の適切な組み合わせを使用して、実行ステージ18の実行ユニット内の専用ハードウェア回路に実装される。専用回路又はハードウェアは、汎用コードを使用してソフトウェアでプログラムされるのではなく、ハードワイヤード機能を有する回路を意味する。ローカル終了状態の更新は、専用のEXIT命令の実行によってトリガされる。これは、プロセッサモジュール4の命令セット内の基本的な機械コード命令の1つであり、出口状態をアグリゲートするという固有の機能を有する。また、ローカルアグリゲート(local aggregate)は制御レジスタ38つまり専用ストレージ部分(実施形態では単一ビットのストレージ)に記憶され、この値は、パイプラインで実行されているコードによってアクセスできるが、どの汎用データを記憶するためにもロードストアユニット(LSU)では使用できない。代わりに、制御レジスタに保持されているデータの機能は、この場合は局所的にアグリゲートされた終了状態を記憶する機能に固定されている。好ましくは、ローカルコンセンサスレジスタ($LC)38はプロセッサモジュール4上の(例えばタイル上の)制御レジスタの1つを形成する。その値は、スーパーバイザがGET命令を実行することによってアクセスでき、PUT命令を実行することによって設定できます。
図5に示す回路はほんの一例である。等価回路は、ANDゲート37をORゲートに置き換え、ソフトウェアでの終了状態0及び1の解釈を反転する、すなわち0→真、1→偽(各同期点でレジスタ38が1ではなく0にリセットされる)ものである。同様に、ANDゲートがORゲートに置き換えられても、終了状態の解釈が反転せず、リセット値も反転していない場合、$LCにおけるアグリゲート状態は、(すべてではなく)いずれかのワーカー状態が状態1で終了したかどうかを記録する。他の実施形態では、出口状態は単一ビットである必要はない。例えば。個々のワーカーの終了状態は1ビットでもよいが、アグリゲートされた終了状態$LCは3値状態、すなわちすべてのワーカーが状態1で終了した、すべてのワーカーが状態0で終了した、又はワーカーの終了状態は混在していた、を表す2ビットで構成されてもよい。これを実現するロジックの一実施例として、3値を符号化する2つのビットのうちの1つは、個々の終了状態のブールAND(又はOR)であって、3値の他のビットは、個々の終了状態のブールORであってもよい。3番目の符号化されたケースは、ワーカーの終了状態が混在していることを示しており、これら2つのビットのXORとして形成できる。
終了状態は、プログラマが望むものは何でも表すために使用することができるが、具体的に想定される1つの実施例は、それぞれのワーカースレッドが「成功」状態又は「真」状態で抜け出たことを示すために1との終了状態を使用する一方、0の終了状態をそれぞれのワーカースレッドが「不成功」又は「偽」状態で抜け出たことを示す(アグリゲート回路37がANDの代わりにORを実行し、レジスタ$LC38が最初に0にリセットされる場合、その逆になる)ように使用できる。例えば、各ワーカースレッドが、機械知能アルゴリズムのグラフ内で個別のノードの1つ又は複数のパラメータにおけるエラーが、所定のメトリックにしたがって許容可能なレベルに収まっているかどうかを示す条件など、各ワーカースレッドが関連する条件を有する計算を実行するアプリケーションを考える。この場合、1つのロジックレベル(例えば、1)を有する個々の終了状態を条件が満たされていること(例えば、ノードの1つ又は複数のパラメータにおける1つ又は複数のエラーは、いくつかのメトリックにしたがって許容可能なレベル内にあること)を示すために用い、反対のロジックレベル(例えば、0)を有する個々の終了状態を条件が満たされないこと(例えば、エラーが当該メトリックにしたがって許容レベル内にないこと)を示すために使用することができる。条件は、例えば、単一のパラメータ又は各パラメータに置かれたエラー閾値であってもよく、ワーカースレッドによって実行されるそれぞれの計算に関連する複数のパラメータのより複雑な関数にもなり得る。
別のより複雑な実施例として、ワーカーの個々の終了状態及びアグリゲートされた終了状態は、それぞれ2つ以上のビットから構成されていてもよく、これらは、例えば、ワーカースレッドの結果に対するある程度の信頼性を表すために使用され得る。例えば、各ワーカースレッドの終了状態は、個別のワーカースレッドのアウトカムにおける確信度の尺度を表し、アグリゲーションロジック37は、ハードウェア内の個々の信頼レベルの確率的なアグリゲートを実行するためにより複雑な回路で置き換えてもよい。
プログラマが終了状態にどのような意味を与えても、次にスーパーバイザスレッドSVはローカルコンセンサスレジスタ($LC)38から集計された値を取得して、例えば、最後の同期点で、最後にリセットされてから抜け出た全てのワーカースレッドのアグリゲートされた終了状態を特定すること、例えば、全てのワーカーが成功又は真の状態で抜け出たかどうかを特定することができる。この集計値次第で、スーパーバイザスレッドはプログラマの設計にしたがってその後に決定を下してもよい。プログラマは、自身が望むローカルにアグリゲートされた終了状態をどのように使っても構わない。例えば、スーパーバイザスレッドは、ローカルアグリゲートされた終了状態を参照して、ワーカースレッドの特定のサブセットで構成されたプログラムの特定の一部が、期待どおりに又は所望どおりに完了したかどうかを特定することができる。そうでない場合(例えば、ワーカースレッドの少なくとも1つが不成功又は偽の状態で抜け出た場合)、それはホストプロセッサに報告しても、あるいは、同じワーカースレッドを含むプログラムの部分で別の反復を実行してもよいが、もし期待どおりであったならば(例えば、全てのワーカースレッドが成功又は真の状態で終了した場合)、代わりに1つ又は複数の新たなワーカーを含むプログラムの別の部分に分岐してもよい。
好ましくは、スーパーバイザスレッドは、そこに記憶された値が全て所望するスレッドの正確で最新のアグリゲート状態を表すように、当該全てのワーカースレッドが終了するまで、ローカルコンセンサスレジスタ($LC)38内の値にアクセスすべきではない。この待機をスーパーバイザスレッドによって達成されるバリア同期によって実行して、現在実行中の全てのローカルワーカースレッド(すなわち、同じプロセッサモジュール4上のもので、同じパイプライン13を介して実行中のスレッド)の終了を待機してもよい。換言すれば、スーパーバイザがローカルコンセンサスレジスタ($LC)38からアグリゲートされた終了状態を取得することを許可される前に、全ての未処理のワーカースレッドが終了するのを待機するために、スーパーバイザスレッドは、ローカルコンセンサスレジスタ($LC)38をリセットし、複数のワーカースレッドを起動して、次にローカルバリア同期(処理モジュール4に対してローカルであり、1つのタイルに対してローカルな)を開始する。
図6を参照すると、実施形態では、SYNC(同期)命令がプロセッサの命令セットに提供される。SYNC命令は、現在実行中の全てのワーカーWがEXIT命令によって終了するまでスーパーバイザスレッドSVを待機させる効果がある。実施形態では、SYNC命令はオペランド(実施形態ではその唯一のオペランド)としてモードを取り、このモードは、例えば、SYNCがその一部として実行されるスーパーバイザとしての同じタイルで、SYNCが同じプロセッサモジュール4上でローカルに動作するワーカースレッドのみに対してローカルでのみ動作するかどうか(すなわち、同じバレルスレッド処理ユニット10の同じパイプライン13を通るスレッドのみ)を指定し、あるいは代わりに、複数タイルに又は複数チップにわたって適用するかどうかを指定する。
SYNCモード//モード∈{tile、chip、zone_1、zone_2}
これについてはより詳細に後述するが、図6の目的には、ローカルSYNC(「SYNCタイル」、すなわち単一のタイル内での同期)が想定される。
バレルスレッド処理ユニット10のタイムスロットS0、S1、・・・のいずれもがワーカーに占有されなくなるまでスーパーバイザSVは自動的に待機することが暗示されるので、ワーカーはSYNC命令のオペランドとして識別される必要はない。図6に示すように、ワーカーWLnの現行のバッチそれぞれがスーパーバイザによって全て起動されると、スーパーバイザは次にSYNC命令を実行する。スーパーバイザSVがバレルスレッド処理ユニット10の全てのスロットS0、・・・3(図示の例では全て4つであるが、これは単なる一例である)でワーカーWを立ち上げると、一旦ワーカースレッドWLnの現行のバッチのうちの最初のバッチが終了してSYNCが実行されることになり、少なくとも1つのスロットの制御をスーパーバイザSVに返す。それ以外の場合、ワーカーが全てのスロットを占有しないならば、現行のバッチWLnの最後のスレッドが起動された直後にSYNCが実行されることになる。いずれにせよ、SYNCは、スーパーバイザが処理を進め得る以前にEXITを実行するために、ワーカーWLn−1の現行のバッチにおける他の全てを待機させるべくスーパーバイザSVに命じる。その後に限り、スーパーバイザはローカルコンセンサスレジスタ($LC)38のコンテンツを取得するためにGET命令を実行する。SYNCが実行されると、スーパーバイザスレッドによるこの待機はハードウェアに課される。すなわちSYNC命令のオペコードに応答して、実行ステージ18の実行ユニット(EXU)内におけるロジックは、全ての未処理のワーカースレッドがEXIT命令を実行するまで、フェッチステージ14及びスケジューラ24にスーパーバイザスレッドの命令を発することを一時停止させる。ローカルコンセンサスレジスタ($LC)38の値を得た後のある時点で(任意に、その間にいくつかのスーパーバイザコードを伴って)、スーパーバイザはPUT命令を実行してローカルコンセンサスレジスタ($LC)38をリセット(図示の例では1に)する。
図6にも示すように、SYNC命令は、ワーカースレッドの異なる相互依存レイヤーWL1、WL2、WL3、・・・の間に同期バリアを配置するために使用してもよく、各連続レイヤー内における1つ以上のスレッドは、1つ又は複数のワーカースレッドをその前のレイヤーに配置する。スーパーバイザスレッドによって実行されるローカルSYNCは、直前のレイヤーWLn内で全てのワーカースレッドが(EXIT命令を実行することによって)終了するまで、次のレイヤーWLn+1内でワーカースレッドのいずれもが実行されないことを保証する。
上述したように、実施形態では、プロセッサモジュール4は、マルチタイルプロセッサを形成する相互接続されたタイル配列の1つとして実装されてもよく、各タイルは、図1〜6に関連して上述したように構成してもよい。
これは図7にさらに図示されており、単一のチッププロセッサ2、すなわち複数のプロセッサタイル4の配列6及びタイル4間を接続するオンチップ相互接続34からなる単一のダイを示している。チップ2は、それ自体の単一チップ集積回路パッケージ上に単独で、又は同じICパッケージ内にパッケージされた複数のダイのうちの1つとして実装してもよい。オンチップ相互接続は、タイル4が相互にデータを交換することを可能にするために、本明細書では「交換ファブリック」34と呼ぶこともある。各タイル4は、バレルスレッド処理ユニット10及びメモリ11のそれぞれのインスタンスからなり、それぞれ図1〜図6に関連して上述したように構成されている。例えば、実例としてチップ2は、何百ものタイル4、さらには1000を超えるタイルから構成されてもよい。完璧を期するために、本明細書で言及される「配列」は、タイル4の任意な特定の次元数又は物理的レイアウトを必ずしも暗示してはいないことにも留意されたい。
実施形態では、各チップ2はまた、1つ以上の外部リンク8を備え、チップ2を異なるチップ上(例えば、同じチップ2の1つ又は複数の他のインスタンス)で1つ以上の他の外部プロセッサに接続することを可能にしている。これらの外部リンク8は、チップ2をホストプロセッサに接続するための1つ又は複数のチップ−ホスト間リンク、及び/又は同じICパッケージ又はカード上で、あるいは、異なるカード上でチップ2の他のインスタンスと接続するための1つ又は複数のチップ−チップ間リンクの1つ又は1以上を備えている。一実施例の構成では、チップ2は、チップ2によって処理される入力データの形態でチップ−ホスト間リンクの1つを介してチップに接続されたホストプロセッサ(図示せず)から作業を受信する。チップ2の複数のインスタンスは、チップ−チップ間リンクによってカードに相互に接続することができる。このようにしてホストは、ホストに必要な作業負荷に応じて、複数の相互接続されたカード上に場合により配置された複数の単一チッププロセッサ2として、あるいは、複数の単一チッププロセッサ2として構築されたコンピュータにアクセスすることができる。
相互接続34は、配列6内の異なるプロセッサタイル4が互いにオンチップ2で通信できるように構成されている。しかし、潜在的に同じタイル4上でスレッド間の依存性が存在するだけでなく、配列6内の異なるタイル4上で実行されるプログラムにおける部分間の依存性も存在する可能性がある。したがって、それが依存するデータに先んじて実行される1つのタイル4上のコード片が、別のタイル4上の別のコード片によって利用可能になるのを防ぐ技術が必要とされる。
実施形態では、これは、図8及び図9に概略的に示されるように、バルク同期並列(BSP)交換方式を実装することによって達成される。
BSPの1つのバージョンによれば、各タイル4は、タイル間のバリア同期30によって互いに分離された交互のサイクルで計算段階52と交換段階50を実行する。図示の場合では、各計算段階52と後続の交換段階50との間にバリア同期が行われる。計算段階52の間に、各タイル4は、タイル上でローカルに1つ以上の計算タスクを実行するが、これら計算のアウトカムをタイル4上の他のものと通信しない。交換段階50では、各タイル4は、先行する計算段階からの計算の1つ以上の結果を、群内で1つ以上の他のタイルへ、及び/又は1つ以上の他のタイルから交換することが許可されるが、そのタスク(複数可)が依存関係を有するデータを他のタイル4から受信するまでは新たな計算を実行しない。先行の計算段階で計算されたデータ以外のデータも他のタイルに送信されない。これは、交換段階において内部管理関連業務のような他の業務を行うことを排除するものではない。実施形態では、交換段階50には、非時間決定論的な計算は含まれないが、交換段階50の間に、少数の時間決定論的な計算を任意に許容してもよい。計算を実行するタイル4は、計算段階52の間に、同期されている群内の他のタイル4との通信を伴わない限り、例えば、ネットワークカード、ディスクドライブ、又はフィールドプログラマブルゲート配列(FPGA)のように同期されているタイル4の配列の外部にある他の外部システムリソースと通信することを許可されてもよいことにも留意されたい。タイル群の外部通信は、任意でBSPメカニズムを利用してもよいが、代わりにBSPを利用せず、それ自体の他の何らかの同期メカニズムを使用することができる。
BSPの原理によれば、バリア同期30は、計算段階52から交換段階50へ、又は交換段階50から計算段階52へ、あるいは、その両方へ移行する岐路に置かれる。すなわち、(a)群内のいずれかが次の交換段階50に進むことが許可される前に、全てのタイル4がそれぞれの計算段階52を完了する必要があるか、(b)群内のいずれかのタイルが次の計算段階52に進むことが許可される前に、群内の全てのタイル4がそれぞれの交換段階50を完了することが要求されるか、(c)これらの条件の両方が実行されるかのいずれかである。3つの全ての変形では、段階を交互に行うのは個々のプロセッサであり、同期するのはアセンブリ全体である。交換及び計算段階のシーケンスは、複数回にわたって繰り返されてもよい。BSP用語では、交換段階と計算段階の各繰り返しは、「スーパーステップ」と呼ばれることがある(ただし、文献では常に用語が一貫して使用されているわけではなく、時には個々の交換段階と計算段階とを個別にスーパーステップと呼ばれることも、本明細書で採用されている用語のように、交換及び計算段階はともにスーパーステップと呼ばれることもある)。
また、同様に留意されたいが、同じチップ2又は異なるチップ上でタイル4の複数の異なる独立した群が、互いに非同期的に動作する個別のそれぞれのBSP群を形成し、計算、同期、及び交換のBSPサイクルがそれぞれ所与の群内でのみ課され、他の群とは独立してそれを実行することもあり得る。すなわちマルチタイル配列6が、それぞれ他のそのような群と独立して非同期的に動作する複数の内部同期群(後により詳細に詳述する)を含むことができる。実施形態によっては、後でより詳細に論じるように、同期及び交換の階層的な群分けがある。
図9は、(a)計算段階52から交換段階50へのバリア同期(上述を参照のこと)を課す場合、配列6内のタイルのいくつか又は全ての群4i、4ii、4iiiの間で実行されるBSP原理を示している。この構成では、いくつかのタイル4は計算を開始することが許可されているが、他のタイル4はまだ交換されていることに留意されたい。
本明細書に開示された実施形態によれば、このタイプのBSPは、バリア同期、すなわちSYNC命令を実行するための機械コード命令に追加の特別な専用機能を組み込むことによって容易にすることができる。
実施形態では、SYNC関数は、オペランドとしてタイル間モード(inter−tile mode)、(例えばオンチップモード:SYNC chip)によって修飾されたときにこの機能性を取る。
これは図10に概略的に示されている。各タイル4がマルチスレッド処理ユニット10からなる場合、各タイルの計算段階52は、実際には同じタイル4上の複数のワーカースレッドWによって実行されるタスクからなっていてもよい(そして、所与のタイル4上の所与の計算段階52が、ワーカースレッドの1つ以上のレイヤーWLを含んでいてもよく、複数のレイヤーの場合、これらは上述したようにオペランドとしてのローカルオンタイルモードを有するSYNC命令を使用して内部バリア同期によって分離されてもよい)。所与のタイル4上のスーパーバイザスレッドSVが現行のBSPスーパーステップで最後のワーカースレッドを開始すると、そのタイル4上のスーパーバイザは、オペランド:SYNC chipとしてセットされたタイル間モードを有するSYNC命令を実行する。スーパーバイザが、それぞれの処理ユニット10の全てのスロット内でワーカースレッドを起動「RUN」させると、現在のBSPスーパーステップでそれ以上のワーカーを実行するためにもはや必要とされない最初のスロットがスーパーバイザに戻されてすぐに、「SYNC chip」が実行される。例えば、これは最後のレイヤーWLでEXITする最初のスレッドの後に、又は単一のレイヤーしかない場合にはEXITする最初のワーカースレッドの後に発生する可能性がある。さもなければ、現行のBSPスーパーステップでワーカーを実行するために全てのスロットを使用するわけではない場合、現行のBSPスーパーステップで実行する必要がある最後のワーカーがRUNされるとすぐに「SYNC chip」を実行することができる。これは、一旦最後のレイヤー内の全てのワーカーがRUNになると、又はレイヤーが1つしか存在しない場合には、単に全てのワーカースレッドがRUNになった後に発生することもある。
実行ステージ18の実行ユニット(EXU)は、SYNC命令のオペコードに応答して、オンチップ(タイル間)オペランドによって修飾されたときに、配列6内の全てのタイル4がワーカーの実行を終了するまで、「SYNC chip」が実行されたスーパーバイザスレッドを一時停止されるように構成されている。これは、次のBSPスーパーステップへのバリアを実装するために使用でき、すなわち、チップ2上の全てのタイル4がバリアを通過した後、全体としてクロスタイルプログラムは次の交換段階50に進むことができる。
図11は、本明細書に開示された実施形態による「SYNC chip」によってトリガされるロジックを示す概略図である。
一旦スーパーバイザがスレッドの全てを起動(RUN)すると、現行の計算サイクル52で実行することを意図し、次にオンチップのタイル間オペランド:SYNC chipを使用してSYNC命令を実行する。これにより、タイル4上の専用同期ロジック39、及びハードウェア相互接続34に実装された同期コントローラ36において、以下の機能性がトリガされる。相互接続34におけるオンタイル同期ロジック39と同期コントローラ36との両方のこの機能性は、一旦SYNC chipが実行されると、残りの機能性は、それを実行するためのさらなる命令を実行することなく進行するように専用のハードウェア回路に実装されている。
最初に、オンタイル同期ロジック39は、当該タイル4上のスーパーバイザに対する命令発行を自動的に中断させる(フェッチステージ14及びスケジューラ24にスーパーバイザの発行命令を中断させる)。ローカルタイル4上における全ての未処理のワーカースレッドがEXITを実行すると、同期ロジック39は、同期リクエスト「sync_req」を相互接続34内の同期コントローラ36に自動的に送信する。その時、ローカルのタイル4は、スーパーバイザ命令の発行が一時停止した状態で待機し続ける。配列6内の他のタイル4(それぞれが同期ロジック39のそれ自身のインスタンスを含む)の各々にも同様のプロセスが実装される。したがって、ある時点で、現行の計算段階52の最終ワーカーが全て配列6内の全てのタイル4上でEXIT(抜け出る)すると、同期コントローラ36は配列6内の全てのタイル4からそれぞれの同期要求(sync_req)を受信することになる。そのとき初めて、同期コントローラ36は、同じチップ2上の配列6内の全てのタイル4からsync_reqを受信したことに応答して、同期確認信号sync_ackを各タイル4上の同期ロジック39に送り返す。この時点まで、タイル4の各々は、同期肯定応答信号(sync_ack)を待機しているスーパーバイザ命令の発行を一時停止させている。sync_ack信号を受信すると、タイル4内の同期ロジック39は、そのタイル4上のそれぞれのスーパーバイザスレッドに関するスーパーバイザ命令発行を自動的に解除する。その後、スーパーバイザは、後続の交換段階50において相互接続34を介して他のタイル4とのデータ交換を自由に進めることができる。
好ましくは、sync_req及びsync_ack信号は、各タイル4を相互接続34内の同期コントローラ36に接続する1つ又は複数の専用同期ワイヤを介して、同期コントローラとの間でそれぞれ伝送及び受信される。
さらに、本明細書で開示される実施形態によれば、追加の機能性がSYNC命令に含まれる。すなわち、少なくともタイル間モード(例えば、SYNC chip)で実行されるとき、SYNC命令は、同期化されたタイル4の各々のローカル終了状態$LCを、相互接続34内の別の専用ハードウェア40内で自動的にアグリゲートする。図示される実施形態では、このロジックは2入力ANDゲート(配列6内の各タイル4の1つの入力)、例えば、図11に実施例として示すように、2入力ANDゲート40i、40ii、・・・のストリングから形成される形態をとる。このタイル間アグリゲーションロジック40は、配列内の各タイル4からのローカル終了状態レジスタ(ローカルコンセンサスレジスタ)$LC38の値を受信するが、実施形態ではそれぞれ単一ビットで受け取り、それらを単一の値、例えば、全てのローカルにアグリゲートされた終了状態のANDにアグリゲートする。したがって、ロジックは、配列6内の全てのタイル4上の全てのスレッドにわたってグローバルにアグリゲートした終了状態を形成する。
タイル4の各々は、グローバルアグリゲーションロジック40からのグローバル終了状態を受け取り、相互接続34内に記憶するように配列されたグローバルコンセンサスレジスタ($GC)42の個別のインスタンスを含む。実施形態では、これは、スーパーバイザのコンテキストレジスタファイルCXS内のステータスレジスタのもう1つである。配列6内の全てのタイル4から受信された同期要求(sync_req)に応答して、同期コントローラ36は、アグリゲーションロジック40の出力(例えば、ANDの出力)を各タイル4上でグローバルコンセンサスレジスタに記憶させる(図11に示す「スイッチ」は機能性の概略図であり、実際には任意の適切なデジタルロジックによって更新を実行してもよいことは理解されよう)。このレジスタ$GC42は、一旦スーパーバイザ命令発行が再開されると、各タイル4上のスーパーバイザスレッドSVによってアクセス可能である。実施形態では、グローバルコンセンサスレジスタ$GCは、制御レジスタファイル内の制御レジスタとして実装され、スーパーバイザスレッドは、グローバルコンセンサスレジスタ($GC)42内の値をGET命令によって取得することができる。尚、同期ロジック36は、グローバルコンセンサスレジスタ($GC)42のいずれかで値を更新する前に、sync_reqが全てのタイル4から受信されるまで待機し、さもなければ、計算段階52のその部分をまだ完了しておらず、したがって依然として実行中のタイル上でスーパーバイザスレッドに不正な値をアクセス可能にしてしまうことがある。
グローバルにアグリゲートされた終了状態$GCは、プログラムが、個々のタイル上で個別の各ワーカースレッドの状態を1つ1つ調べる必要なくして、複数の異なるタイル4上で実行されているプログラムのパーツの全体的なアウトカムを特定できるようにする。これは、プログラマが望む任意の目的に使用することができる。例えば、グローバルアグリゲーションがブールANDである図11に示す実施例では、これは、いずれかの入力が0ならばアグリゲーションが0になり、全ての入力が1ならばアグリゲーションが1となることを意味している。すなわち、1が真又は成功アウトカムを表すために使用される場合、これは、タイル4のいずれかのローカル終了状態のいずれかが偽又は不成功であるならば、グローバルアグリゲート状態も偽であるか又は不成功のアウトカムを表すであろうことを意味する。例えば、これは、全てのタイル上で実行されているコードのパーツが全て所定の条件を満たすかどうかを特定するために使用できる。したがって、プログラムは、個々のタイル上で個別のワーカースレッドの個々の状態を調べる必要なくして、単一のレジスタ(実施形態では単一ビット)に「何か間違っていたか?諾否は?」又は「グラフの全てのノードが許容可能なエラーレベルに達したか?諾否は?」と質問することができる(そしてまた実施形態では、スーパーバイザは、実際には終了状態レジスタ38、42を介する以外にワーカーの状態を照会することができない)。言い換えれば、EXIT及びSYNC命令はそれぞれ、複数の個々の終了状態を単一の結合状態にまとめる訳である。
1つの使用例では、1つ又は複数のタイル上のスーパーバイザは、グローバルアグリゲーションが偽又は不成功のアウトカムを示したかどうかをホストプロセッサに報告することもできる。別の実施例として、プログラムは、グローバル終了状態に応じて分岐判断を実行してもよい。例えば、プログラムはグローバルアグリゲート終了状態$GCを調べ、これに基づいてループを続行するかどうか、又は別の場所に分岐するかどうかを判定する。グローバル終了状態$GCが依然として偽であるか不成功である場合、プログラムは同じ最初のプログラム部分を反復し続けるが、一旦グローバル終了状態$GCが真であるか又は成功すると、プログラムはプログラムの第2の異なるパーツに分岐する。分岐判定は、各スーパーバイザスレッドで個別に実装されてもよいし、マスターの役割を担うスーパーバイザの1つが他のタイル上で他のスレーブスーパーバイザに指示してもよい(マスターの役割はソフトウェアで構成されている)。
図11に示すアグリゲーションロジック40は単なる一実施例に過ぎないことに留意されたい。別の等価な実施例では、ANDをORで置き換えることができ、0と1の解釈を反転することができる(0→真、1→偽)。同様に、ANDゲートがORゲートで置き換えられても終了状態の解釈が反転されず、リセット値も反転されなければ、$GCにアグリゲートされた状態は、タイルのいずれか(すべてではなく)がローカルにアグリゲートされた状態1で抜け出たかどうかを記録することになる。別の実施例では、グローバル終了状態$GCは、3値状態:全てのタイルのローカルアグリゲートされた終了状態$LCは状態1であって、全てのタイルのローカルアグリゲートされた終了状態$LCは状態0であった、又はタイルのローカルにアグリゲートされた終了状態$LCはミックスされた、を表す2ビットからなっていてもよい。別のより複雑な実施例として、タイル4のローカル終了状態及びグローバルにアグリゲートされた終了状態は、それぞれが2ビット以上からなっていてもよく、例えば、タイル4のアウトカムにおける信頼度を表すために使用することができる。例えば、個々のタイルのローカルにアグリゲートされた終了状態$LCは、個別のタイル4の結果における統計的確率的信頼度の尺度を表すことができ、グローバルアグリゲーションロジック40は、ハードウェア内における個々の信頼レベルの統計アグリゲートを実行するために、より複雑な回路に置き換えてもよい。
上述したように、実施形態では、チップ2の複数のインスタンスを互いに接続して、複数のチップ2にわたるさらに大きなタイル4の配列を形成することができる。これは、図12に図示されている。チップ2のいくつか又は全てが同じICパッケージに実装されてもよく、チップ2のいくつか又は全てが異なるICパッケージに実装されてもよい。チップ2は、外部相互接続72によって(図7に示す外部リンク8を介して)互いに接続されている。外部交換周辺装置72は、異なるチップ上のタイル4間でデータを交換するための通り道(conduit)を提供するとともに、異なるチップ2上でタイル4間のバリア同期を実行し、異なるチップ2上でタイル4のローカル終了状態をアグリゲートするハードウェアサポートも提供する。
実施形態では、SYNC命令は、そのモードオペランドのさらに可能な少なくとも1つの値をとり、外部の、すなわちチップ間同期:SYNC zone_nを指定することができ、ここではzone_nは外部同期ゾーンを表す。外部相互接続72は、図11に関連して説明されたものと同様のハードウェアロジックを含むが、外部のチップ間スケールである。そのオペランドで指定された2つ以上のチップ2の外部同期ゾーンでSYNC命令が実行されると、これにより、外部相互接続72内のロジックは、内部相互接続34に関して説明したものと同じような方法で動作するが、指定された同期ゾーン内における複数の異なるチップ2上のタイル4にわたって動作する。
すなわち、オペランドが外部同期を指定するSYNC命令のオペコードに応答して、実行ステージ18は、オペランドによって指定された同期レベルを外部相互接続72内の専用ハードウェア同期ロジック76に通知させる。これに応答して、外部相互接続内の同期ロジック76は、同期要求(sync_req)及び確認応答(sync_ack)の処理を、すべての外部タイル4、例えばグローバル同期のためにシステム内のすべてのチップ2にまたがるすべてのタイルに対してのみ実行するように誘導する。すなわち、同期要求(sync_req)がそれらのチップからの全てのタイル4から受け取られたときのみ、外部相互接続部72内の同期ロジック76は、同期確認応答信号(sync_ack)をチップ2をまたいでタイル4に戻す。外部同期ロジック76からの同期肯定応答(sycn_ack)が返されるまで、それらすべてのチップ2上のすべてのタイル4が自動的に一時停止される。
換言すれば、外部SYNCに応答して、外部同期ゾーン内の全てのチップ2で全てのタイル4がそれらの計算段階52を完了し、同期要求を提出するまで、スーパーバイザ命令の発行が一時停止される。さらに、外部相互接続72内のロジックは、当該ゾーン内の複数のチップ2にわたって、これらのタイル4の全てのローカル終了状態をアグリゲートする。外部同期ゾーン内の全てのタイル4が同期要求を行うと、外部相互接続72は同期肯定応答をタイル4に戻して通知し、当該全てのタイル4のグローバルコンセンサスレジスタ($GC)42にクロスチップグローバルアグリゲート終了状態を記憶する。上記の同期肯定応答に応答して、ゾーン内における全てのチップ2のタイル4は、スーパーバイザのために命令発行を再開する。
尚、実施形態では、相互接続72の機能性は、チップ2内に実装されてもよい、すなわち、チップ間の有線接続のみが必要となるようにロジックがチップ2間に分配されてもよい(図11及び図12は概略図である)。
上記同期ゾーン内の全てのタイル4は、それぞれの個別のSYNC命令のモードオペランドを介して同じ同期ゾーンを示すようにプログラムされている。実施形態では、外部相互接続周辺装置72の同期ロジック76は、プログラミングエラー又は他のエラー(メモリパリティエラーなど)に起因しない場合、一部又は全てのタイル4が肯定応答を受信しないように構成されており、したがって、システムは次の外部バリアで停止し、中央演算処理ユニットCPU(例えば、ホスト)がデバッグ又はシステム回復のために介入することを可能にする。しかし、好ましくはコンパイラが、同じゾーン内のタイルが全て、時間関連で同一な正しい同期ゾーンを示すように構成されている。同期ロジックはまた、外部CPUに対する例外の発生、及び/又は他の何らかのメカニズムによる実行の停止など、異なるSYNC命令によって示されたモードに不一致があれば、他の代替又は追加の措置を講じるように構成されてもよい。
図14に示すように、実施形態では、SYNC命令のモードを使用して、複数の異なる可能な外部同期ゾーン、例えば、zone_1又はzone_2のうちの1つを指定することができる。実施形態では、これらは異なる階層に対応する。すなわち、各上位階層92(例えば、ゾーン2)は、少なくとも1つの下位階層の2つ以上のゾーン91A、91Bを包含する。実施形態では、2つの階層しか存在しないが、より多くの入れ子レベルもあり得る。SYNC命令のオペランドが外部同期ゾーンの下位階層(SYNC zone_1)に設定されている場合、SYNCが実行されたタイルと同じ下位階層の外部同期ゾーン内においてチップ2上のタイル4に対して上記の同期及びアグリゲート動作が実行される。これに反して、SYNC命令のオペランドが外部同期ゾーンの上位階層(SYNC zone_2)に設定されている場合、SYNCが実行されたタイルと同じ高位階層の外部同期ゾーン内において、全てのチップ2上の全てのタイルに対して上記の同期及びアグリゲート動作が自動的に実行される。
オペランドとして外部同期ゾーンを有するSYNC命令のオペコードに応答して、実行ステージ18は、オペランドによって指定された同期レベルを外部相互接続72内の専用ハードウェア同期ロジック76にシグナリングさせる。これに応答して、外部相互接続内の同期ロジック76は、シグナリングされた群のタイル4の間でのみ実行されるべき同期要求(sync_req)及び肯定応答(sync_ack)のプロセスを実行する。すなわち、そのゾーン内のすべてのタイル4から同期要求(sync_req)が受信されたら(ただし、グローバル同期でない場合、そのゾーン外の他のタイルを待機することはない)、外部相互接続72内の同期ロジック76は、同期肯定応答信号(sync_ack)をシグナリングされた同期ゾーン内のタイルに戻す。
他の実施形態では、SYNC命令のモードによって指定することができる同期ゾーンは、性質上階層的であることが必須ではないことに留意されたい。一般に、SYNC命令は、任意な種類の群に対応するモードを備えていてよい。例えば、このモードを、非階層群のみと、又は階層群及び1つ以上の非階層群(少なくとも1つの群が別の群内に完全に入れ子にされていない)の混合とから選択することができる。これにより、プログラマ又はコンパイラにとっては有利なことに、コード密度を最小限にして、互いに非同期である内部同期群の様々なレイアウト間で選択する柔軟性が可能となる。
選択された同期群91、92の間で同期を実現するための例示的な機構が、図18に示されている。図示されているように、外部相互接続72内の外部同期ロジック76は、それぞれのチップ2に関連するそれぞれの同期ブロック95を含む。各同期ブロック95は、それぞれのゲーティングロジックと、それぞれの同期アグリゲータとを含む。このゲートロジックは、デイジーチェーントポロジーでチップ2を相互接続して、同期及び終了状態アグリゲートを目的とし、同期及び終了状態情報を以下にしたがって伝搬するハードウェア回路からなっている。同期アグリゲータは、同期要求(sync_req)及び終了状態を以下にしたがってアグリゲートするように構成されたハードウェア回路を含む。
各チップ2に関連するそれぞれの同期ブロック95は、そのチップ2によって生成された同期要求(Sync_req)及びそのチップ2の終了状態を検出することができるように、それぞれのチップ2に接続され、同期肯定応答(sync_ack)及びグローバル終了状態をそれぞれのチップ2に送信することができる。各チップ2に関連するそれぞれの同期ブロック95はまた、4本の同期ワイヤ96の束を含む外部同期インターフェースを介してチップ2のうちの少なくとも1つの他の同期ブロック95に接続されているが、その詳細は後述して説明する。これはチップ・ツー・チップ・リンク8の1つの部分であってもよい。異なるカード上のチップ2間リンクの場合、インターフェース8は、例えば、PCIインターフェースからなっていてもよく、4つの同期ワイヤ96は、PCIインターフェースの4本のワイヤを再使用することによって実装することができる。チップの同期ブロック95のいくつかは、2つの隣接するチップ2の同期ブロック95に接続され、各接続は4本の同期ワイヤ96のそれぞれのインスタンスを介してなされる。このようにして、チップ2は、それらの同期ブロック95を介して1つ以上のデイジーチェーンに接続することができる。これにより、同期要求、同期肯定応答、終了状態のアグリゲート実行、及びグローバル終了状態がチェーンの上下に伝搬されることが可能になる。
動作中、各同期群91、92について、その群内のチップ2の1つに関連する同期ブロック95が、同期及び終了状態アグリゲート目的のためのマスターとして設定され、群内の残りは、この目的のためにスレーブとなる。各スレーブ同期ブロック95は、各同期群91、92(すなわち、マスターに向かう方向)の同期要求、同期肯定応答及び終了状態を伝搬する必要がある方向(例えば、左又は右)で構成される。実施形態では、これらの設定は、ソフトウェアによって構成可能であり、例えば、初期構成段階では、システムの後続動作を通して構成が設定されたままである。例えば、これをホストプロセッサによって構成してもよい。あるいは、その構成がハードワイヤードである可能性もある。いずれにしても、異なる同期群91、92は異なるマスターを有することができ、一般に、所与のチップ2(むしろその同期ブロック95)が、1つの群のマスターであり、それがメンバーである別の群のマスターではない、又は、複数の群のマスターであることが可能である。
例えば、実例として、図18のシナリオの例を考察する。チップ2IVの同期ブロック95が、所定の同期群91Aのマスターとして設定されている実施例とする。ここで、同期ブロック95及びワイヤ96を介して最終的にチップ2IVに接続されたチップ2のチェーン内における第1のチップ2Iを考察する。第1のチップ2I上における現行の計算段階の全てのワーカースレッドがEXIT命令を実行し、全ての(参加している)タイル4上のスーパーバイザが全て同期群91Aを指定するSYNC命令を実行した場合、第1のチップ2Iは同期準備信号をその各関連の同期ブロック95へ送る。チップ2Iはまた、そのチップレベルのアグリゲートされた終了状態(各チップ2I上で参加している全てのタイル上で終了中の全てワーカーのアグリゲーション)をその各同期ブロック95に出力する。それに応答して、第1のチップ2Iの同期ブロック95は、チェーン内において次のチップ2IIの同期ブロック95に同期要求(Sync_req)を伝搬する。また、第1のチップ2Iの終了状態をこの次のチップ2IIの同期ブロック95に伝搬する。この第2のチップ2IIの同期ブロック95は、それ自身の(参加している)タイル4のスーパーバイザが全て、同期群91Aを指定するSYNC命令を実行して、第2のチップ2IIに同期準備を知らせるまで待機する。その時初めて、第2のチップの同期ブロック95は、チェーン内における次の(第3の)チップ2IIIの同期ブロック95に同期要求を伝搬させ、また、第1のチップ2Iの終了状態の実行アグリゲートを第2のチップ2IIのものとともに伝搬する。第2のチップ2IIが第1のチップ2Iの前に同期準備完了となった場合、第2のチップ2IIの同期ブロック95は、第3のチップ2IIIの同期ブロック95に同期要求を伝搬する前に、第1のチップ2Iが同期要求の信号を送るのを待つ。第3のチップ2IIIの同期ブロック95も同様に動作し、今度は第2のチップ2IIからの実行中のアグリゲートされた終了状態をアグリゲートして、次に移るための次のアグリゲーションを取得する等々である。これは、マスター同期ブロック、この実施例では、チップ2IVのマスター同期ブロックに向かって継続する。
次に、マスターの同期ブロック95は、受信した実行中のアグリゲーション及びそれ自体のチップ2IVの終了状態に基づいて、全ての終了状態のグローバルアグリゲーションを特定する。このグローバルアグリゲーションは、チェーンに沿って全てのチップ2に、同期肯定応答(sync_ack)とともに戻される。
上記の実施例のように一方の端にあるのとは対照的に、マスターがチェーンに沿って途中に存在する場合、同期状態情報及び終了状態情報は、マスターのどちらかの側で、マスターに向かって両側で反対方向に伝搬する。この場合、マスターは、両側からの同期要求が受信された時点でのみ、同期肯定応答及びグローバル終了状態を発行する。例えば、チップ2IIIが群92のマスターである場合を考察する。さらに、実施形態では、チップ2のいくつかの同期ブロック95は、3つ以上の他のチップ2の同期ブロックに接続することができ、したがって、マスターに向かってチェーンの複数のブランチを創出する。各チェーンは上記のように動作し、マスターは、全てのチェーンからの同期要求が受信された後にのみ、同期肯定応答及びグローバル終了状態を発行する。そして/又は、チップ2のうちの1つ又は複数は、ホストプロセッサ、ネットワークカード、記憶装置又はFPGAのような外部リソースに接続することも考えられる。
実施形態では、同期及び終了状態情報のシグナリングは、以下のように実施される。各対のチップ2間の4本の同期ワイヤ96の束は、2対のワイヤ、第1の対96_0及び第2の対96_1からなっている。各対は、同期要求ワイヤのインスタンスと同期肯定応答ワイヤのインスタンスとを含む。値0の実行中のアグリゲートされた終了状態を通知するために、送信チップ2の同期ブロック95は、同期要求(sync_req)を送るときに第1のワイヤ対96_0の同期要求ワイヤを使用し、あるいは、値1の実行中のアグリゲーションを通知するために、同期ブロック95は、同期要求を送るときに第2のワイヤ対96_1の同期要求ワイヤを使用する。値0のグローバルにアグリゲートされた終了状態を通知するために、送信チップ2の同期ブロック95は、同期肯定応答(sync_ack)を通知するときに第1のワイヤ対96_0の同期肯定応答ワイヤを使用し、あるいは、値1のグローバルアグリゲーションを通知するために、同期ブロック95は、同期肯定応答(sync_ack)を通知するときに第2のワイヤ対96_1の同期要求ワイヤを使用する。
上記は、同期状態と終了状態情報を伝搬するメカニズムに過ぎないことに留意されたい。実際のデータ(コンテンツ)は、例えば、図19を参照して後述するように、別のチャネルによって伝送される。さらに、これは一実施例に過ぎず、本明細書に開示されたその機能性の仕様が与えられれば、当業者は、開示された同期及びアグリゲート機能性を実現するための他の回路を構築できることが理解されよう。例えば、同期ロジック(図18の95)は、代わりに専用配線の代替として相互接続34、72を介して搬送されるパケットを使用することができるであろう。例えば、sync_req及び/又はsync_ackは、それぞれ、1つ又は複数のパケットの形態で伝送することができる。
上述したように、すべてのタイル4が必然的に同期に参加する必要はない。説明した実施形態では、参加するタイル群は、同期命令のモードオペランドによって設定することができる。しかし、これはあらかじめ定義されたタイル群の選択のみを可能にする。本明細書では、タイル単位で同期参加を選択できることが望ましいことも認識されている。したがって、実施形態では、どのタイル4がバリア同期に参加するかを選択するための代替的又は追加の機構が提供される。
特に、これは、SYNC命令の代わりに1つ又はいくつかのタイル4によって実行されるプロセッサ命令セット内で追加タイプの命令を提供することによって達成される。この命令は、「不参加(abstain)」命令、又は「SANS」命令(自動非参加同期開始(start automatic non-participatory sync))と呼ばれることがあります。実施形態では、SANSはスーパーバイザスレッドが使用するために予約されている。実施形態では、単一の即値オペランドをとる。
SANS n_barriers
SANS命令の挙動は、それが実行されるタイルを現行のバリア同期に参加させないものであるが、指定された同期群内のすべてのタイルがSYNCになるまで待機している他のタイルを保持する(holding up)ことはない。実際には「私なしで続行せよ」と命令する。SANS命令が実行されると、SANS命令のオペコードは、実行ステージ18における実行ユニット内のロジックをトリガして、同期要求信号(Sync_req)のインスタンスを内部及び/又は外部同期コントローラ36、76(モードに応じて)に送信する。実施形態では、SANSによって生成された同期要求は、SANSを実行したタイル4を包含する任意の同期群91、92に適用される。すなわち、このローカルチップ内のタイル4が次に使用する同期群が何であれ(同期群上で一致しなければならない)、SANSを実行したものからのsync_reqは常に有効である。
したがって、同期コントローラロジック36、76及び同期群内の他のタイル4の観点からすれば、SANS命令を実行するタイル4は、SYNC命令を実行するタイル4とまったく同じように現れ、同期バリア及び同期ロジック36、76からの同期肯定応答信号(Sync_ack)の送信を保持することはない。すなわち、SYNCの代わりにSANSを実行するタイル4は、当該タイルがさもなければメンバーである任意な同期群に関与するいかなる他のタイル4も保持又は停止させることはない。SANSによって実行されるハンドシェイクは、すべての同期群91、92に対して有効である。
しかし、SYNC命令とは異なり、SANS命令は、同期ロジック36、76からの同期肯定応答信号(Sync_ack)を待機するようにスーパーバイザ命令の発行を一時停止させることはない。代わりに、個別のタイルは、SYNC命令を実行した他のタイル4間で行われている現行のバリア同期によって阻害されずに継続することができる。このように、同期を模倣するが待機しないことにより、SANS命令は、そのタイル4が1つ又は複数のタスク処理を続行しながら、一方で他のタイル4は依然として同期することを可能にする。
オペランドn_barriersは、「ポステッド(posted)」同期の数、すなわち、タイルが参加しないであろう将来の同期点(バリア)の数を指定する。あるいは、他の実施形態では、SANS命令がこのオペランドを取り込まず、代わりに、SANS命令の各実行が1度限りの不参加(one−off abstention)のみを引き起こすこともあり得る。
SANS命令によって、特定のタイル4は、BSP動作スケジュールの直接範囲外のタスクを実行する役割を果たしてもよい。例えば、タイル4の大部分が一次計算タスク(複数可)で占有されている間に、ホストメモリへの及び/又はホストメモリからのデータ転送を開始(及び処理)するために、チップ2内に少数のタイル4を割り当てることが望ましい場合がある。このようなシナリオでは、一次計算に直接関与していないタイル4は、自動的な非参加同期機能(SANS)を使用して、一定の時間帯、同期メカニズムから効果的に切断されると宣言することができる。この特徴を使用する場合、タイル4は、積極的に(すなわちSYNC命令の実行を介して)同期準備ができていることをシグナリングする必要はなく(同期ゾーンのいずれかに対しても)、実施形態ではアグリゲートされた終了ステータスにいかなる寄与もさせない。
SANS命令は、それが実行されるタイル4がタイル間同期(又は、それらが同期にも関与する場合は、他の外部リソースとの同期)に積極的に関与しないようにする期間を開始又は延長する。この期間中、このタイル4は、すべてのゾーン内で、同期の準備ができたことを自動的に知らせ、また、実施形態では、グローバルアグリゲートコンセンサス$GCに全く寄与させない。この期間は、このタイル4によって自動的にいくつの将来の同期点が通知されるかを示す符号なし即値オペランド(n_barriers)として表すことができる。SANSの実行時に、オペランドで指定された値n_barriersは、それぞれのタイル4のカウントダウンレジスタ$ANS_DCOUNTに記憶される。これは、今後追加されるsync_reqの数を追跡するために使用されるアーキテクチャ状態である。自動非参加型同期メカニズムが現在非アクティブである場合、準備の最初のアサーション(同期要求、sync_req)が直ちに実行される。その後のアサーション(assertion)は、前の同期が完了すると(すなわち、同期確認のアサート、sync_ack)、バックグラウンドで行われる。自動非参加同期機構が現在アクティブな場合、カウントダウン・カウンタ・レジスタ$ANS_DCOUNTは自動的に更新され、同期肯定応答信号が未確認のまま残らないようになる。自動非参加型同期機構は、専用のハードウェアロジック、好ましくは各タイル4内のそのインスタンスに実装されるが、他の実施形態では、タイル群又は全タイルに対して中央で実装される可能性があることは排除されない。
終了状態の挙動に関しては、実際には実装に応じていくつかの可能性がある。実施形態では、グローバルにアグリゲートされた終了状態を得るために、同期ロジック36、76は、SYNC命令を実行した特定の同期群内のそれらのタイル4からローカル終了状態のみをアグリゲートするが、SANS命令を実行したそれら(不参加の単数又は複数のタイル)からはアグリゲートしない。あるいは、グローバルにアグリゲートされた終了状態は、SYNCを実行した同期群内のすべてのタイル4及びSANSを実行したそれらのもの(参加しているタイルと不参加のタイル4の両方)からローカル終了状態をアグリゲートすることによって得られる。後者の場合、グローバルアグリゲーションのための不参加タイル4によって出力されたローカル終了状態は、SYNC命令と同様に(ローカルコンセンサスレジスタ$LC38の説明を参照)、SANS実行時におけるそのタイルのワーカーの実際にローカルにアグリゲートされた終了状態であってもよい。あるいは、不参加タイル4によって出力されたローカル「終了状態」は、終了状態がバイナリである実施形態では、デフォルト値、例えば真値(例えば、ロジック1)であってもよい。これにより、あらゆる偽ローカル終了状態がグローバル終了状態を偽にする実施形態では、不参加タイル4がグローバル終了状態を妨げることが阻止される。
グローバル終了状態の復帰に関しては、残っているタイルがグローバルアグリゲーションを生成するためのローカル終了状態を提出するかどうかにかかわらず、そして、その値が実際の値であったか、デフォルト値であったかにかかわらず、これには2つの可能性が存在する。すなわち、1つの実施形態では、相互接続34、72内の同期ロジック36、76によって生成されたグローバルアグリゲート終了状態は、SYNC命令を実行した参加しているタイル4のグローバルコンセンサスレジスタ$GC42にのみ記憶され、代わりにSANS命令を実行した不参加のタイル4のレジスタには記憶されない。実施形態では、代わりにデフォルト値が、SANSを実行したタイル4(複数可)のグローバルコンセンサスレジスタ$GX42に記憶される(不参加のタイルに)。例えば、このデフォルト値は真であり得るもので、例えばバイナリグローバル終了状態の場合には、ロジック1である。しかし、別の実施形態では、同期ロジック36、76によって生成された実際のグローバルアグリゲーションは、SYNC命令を実行した参加タイル4と、代わりにSANS命令を実行した不参加タイル4の両方のグローバルコンセンサスレジスタ$GC42に記憶される。したがって、群内のすべてのタイルは、引き続きグローバルにアグリゲートされた終了状態にアクセスできる。
図13は、内部(オンチップ)同期と外部(チップ間)同期の両方を含むBSPプログラムフローの例を示す。図示のように、このフローは、(同じチップ2上のタイル4間のデータの)内部交換50と(異なるチップ2上のタイル4間のデータの)外部交換50’とを含む。
図13に示されるように、本開示によれば、(同じチップ2上のタイル4間のデータの内部交換50を含む)内部BSPスーパーステップを(異なるチップ2上のタイル4間の外部データ交換50’を含む)外部同期及び交換から分離した状態に保持することが開示される。
内部BSPと外部BSPとを別々に保つ1つの理由は、実施形態では、図16及び図17を参照してより詳細に後述するように、例えばメッセージの再伝送を必要とする損失の多い物理チャネルのため、外部相互接続72を介したデータの交換は時間的に非決定的であり得るのに対し、内部(オンチップ)相互接続34を介したデータの交換が時間決定論的になり得ることである。一般には、外部相互接続を時間決定論的にすることができるが、これは難しいか、又は、非決定論的な相互接続よりも利点が少なすぎる可能性もあるため、実際には実装されない。
そのような実施形態では、キューは相互接続34内に望ましくないシリコンフットプリントを招くので、内部相互接続34内のキューを必要とせずに実行することができるように内部通信時間を時間決定論的に保つことが望ましい。しかし、実施形態では、外部通信は時間決定論的ではない。もしすべてのBSPスーパーステップがグローバル交換であったら、時間決定論が非時間決定論的外部交換によって「汚染される」ことになる。これは、所与のタイル又はスレッドが外部交換を実行すると、時間決定論が失われ、次のバリア同期まで回復できないためである。
後にもう少し詳しく説明するように、キューなしの通信は、各タイル4がそのデータを伝送する時間を知り、伝送タイルと受信タイルとの間のオンチップタイル間遅延も知っているコンパイラによって実現できる。この所定の知識を与えれば、次に、コンパイラは、伝送タイルによる関連データの伝送後の特定の既知の時間、すなわち、伝送時間にタイル間遅延を加えた時間に伝送タイルのアドレスを問い合わせる(リスンする(listen))ように受信タイルをプログラムすることができる。伝送のタイミングは、コンパイラ自体が各スレッドのどの時点で送信命令を含めるかを選択するため、コンパイラが知っているものとなる。また、オンチップ通信のためのタイル間遅延は、所与の伝送受信タイル4ペアについての固定された既知の値である。コンパイラはこれを、送信タイルと受信タイルとの異なる可能な組み合わせについてのタイル間遅延のルックアップテーブルから知ることができる。コンパイラは、伝送命令の後に対応数のサイクルにて、送信者のアドレスを問い合わせるための対応受信命令を含めることができる。
BSPを内部段階と外部段階に分けるもう1つの理由は、複数のチップにまたがるグローバルな同期及び交換は、オンチップの同期及び交換だけのトータルコストで言うと、上述の内部同期にこれをグローバルアグリゲートに必要な追加の遅延を加えたトータルコストよりも「高価」になることである。さらに、実施形態では、同期シグナリング自体はフロー制御を必要とせず、したがって比較的高速であるが、外部同期は外部交換に同期する。外部交換では、内部交換よりもレイテンシが長くなり、不確実性が大きくなる。
第1に、チップ間で利用可能なデータ帯域幅は、通常、チップ上よりもはるかに少ない。これは、チップ間配線密度が、チップ上で利用可能な配線密度よりもはるかに低いパッケージ接続(ボール又はパッド)密度によって制限されるからである。そのため、たとえ伝送遅延が似ていても、チップ間で固定量のデータを通信することは、オンチップよりはるかに時間がかかる。また、外部とのやり取りはローカルの範囲を出る。ワイヤが届く範囲が広いため、静電容量が大きく、ノイズの影響を受けやすくなる。これは結果として損失をもたらし、物理層での再伝送を提供するフロー制御メカニズムの必要性をもたらし、スループットの低下(及び時間決定論の喪失。下記参照)につながる。さらに、より大きな物理的距離と同様に、チップ間で伝送されるシグナリング及びデータは通常、SerDes(シリアライザ−デシリアライザ)やフロー制御メカニズムなど、より多くのロジックを通過する必要があり、これらはすべて、内部通信に比べて遅延を余分に追加する。例えば、本発明者らは、従来の技術を使用すると、外部バリア同期プロセスは内部同期よりも10倍程度長い時間がかかり、プログラム実行時間の5〜10%を占めることが予想され得ることを確認した。本明細書に開示されたハードウェア同期メカニズムを使用すると、これは3倍遅い程度に低減することができるが、それでも内部同期よりも遅い。さらに、外部とのデータ交換は、例えば、ノイズによる物理層での損失や再伝送、及び/又はチップ間のシリアライゼーションやデシリアライゼーションなどの要因により遅くなる。
他の変形例では、チップ間の相互接続は、物理層及び/又はリンク層において無損失となり得るが、異なる送信元と送信先の間のネットワークレイヤフローの競合が原因でキューがオーバーフローし、パケットがドロップされるため、上位ネットワークレイヤでは実際には損失が大きくなる。これはイーサネット(登録商標)がどのように機能するかであり、代替の非時間決定論的相互接続がイーサネット(登録商標)を使用することが予想される。尚、これは、無損失であろうと損失的であろうと、どの交換プロセスでも実際には、完全な交換の失敗をもたらしていかなるハードウェア機構(例えばリンク層)によっても回復できない回復不可能なエラー(例えばアルファ放射線(alpha radiation)による)を被る場合である。時間決定論的ケース及び非時間決定論的ケースの両方において、実施形態では、システムはそのようなエラーを検出はできても訂正することはできない。検出されると、エラーをホストにシグナリングしてもよい。ホストの戦略はBSPアプリケーション状態が定期的にチェックポイントされることを要求し、致命的なハードウェアエラーが起きた場合にはアプリケーションの状態を最後のチェックポイントまでロールバックすることである。このメカニズムによって、データ交換を実行するために使用される損失の多いメカニズムであっても、ある程度のパフォーマンスを犠牲にして、ユーザーに無損失のように見せることができる。
上記の1つ以上の理由、又はその他の理由で、BSPプロセスを時間決定論的段階と非時間決定論的段階とに分けて、時間決定論的ドメイン内の少なくともいくつかの時間決定論的交換の時間決定論が、そのドメイン間の非時間決定論的交換によって汚染されるのを防ぐことが望ましい。
したがって、プログラムは、一連の同期化、交換段階、及び計算段階を以下の順序で実行するように構成することができる:(i)最初の計算段階、次に(ii)内部バリア同期30、次に(iii)内部交換段階50、次に(iv)外部バリア同期80、そして(v)外部交換段階50’。図13のチップ2IIを参照されたい。外部バリア80は、内部交換50の後でのみプログラムが外部交換50’に進むように、内部交換段階50の後に課される。また、図12のチップ2Iに関して示されるように、内部交換(iii)と外部バリア(iv)との間に計算段階が含まれてもよいことにも留意されたい。
この全体的なシーケンスはプログラムによって実施される(例えば、コンパイラによってそのように生成される)。実施形態では、このプログラムは、上述のSYNC命令によってこのように動作するようにプログラムされている。内部同期及び交換は、他のチップ2上のタイル又は他のエンティティには延伸しない。シーケンス(i)〜(v)(iiiとivの間の上述の任意選択の計算段階を有する)は、一連の全体的な反復で繰り返されてもよい。反復ごとに、外部の同期及び交換の前に、内部計算、同期及び交換(i)〜(iii)の複数のインスタンスが存在し得る。すなわち(i)〜(iii)(この順序を保持)の複数のインスタンス、すなわち複数の内部BSPスーパーステップは、(iv)〜(v)の前、すなわち外部同期及び交換の前に実施することができる。また、タイル4のうちのいずれかが、それぞれ、他のタイル4と並行して、内部同期及び交換(ii)〜(iii)の独自のインスタンスを実行している可能性があることにも留意されたい。
したがって、全体のBSPサイクル(i)〜(v)ごとに、同期が内部的にのみ、すなわちオンチップのみで実行されることに制約されるサイクル(ii)〜(iii)の少なくとも一部があることが保証される。
外部交換50の間、通信は外部のみであることに限定されないことに留意されたい。いくつかのタイルは内部交換を実行し、あるものは外部交換だけを実行し、いくつかは両方を実行する可能性もある。しかし、いくつかの実施形態で外部相互接続72に時間決定性の喪失が生じると、その実施形態では、タイルが外部通信を実行すると次の同期まで内部通信を再度実行することはできない(メッセージタイミング及びタイル間遅延についての所定の知識に依存する好ましいオンチップ通信メカニズムの以下の説明を参照されたい)。
いくつかの実施形態では、やはり図13に示されるように、いくつかのタイル4は計算段階中にローカルな入出力を実行することができ、例えばそれらはホストとデータを交換することができる。
また、図13に示されるように、任意の又はすべてのタイルが任意の所与のBSPスーパーステップにおいてヌル計算段階52又はヌル交換段階50を有することが一般的に可能であることにも留意されたい。
実施形態では、異なるレベルの同期ゾーン91、92を使用して、いくつかの外部同期及び交換動作の範囲をシステム内のチップ2のサブ群のみに制限し、完全でグローバルな同期と交換が必要なペナルティの回数を制限することができる。すなわち、全体のサイクルは以下を含むことができる:(i)最初の計算段階、(ii)内部バリア同期、(iii)内部交換段階、(iv)第1のより低レベルの同期ゾーン91のみのタイル内の外部バリア同期80、(v)第1同期ゾーン91のチップ間のみの外部交換段階、(vi)第2のより高レベルの同期ゾーン92を横断する外部バリア同期、及び(vii)第2レベル同期ゾーン92のチップ間の外部交換段階。第2レベルの交換段階に対する外部バリアは、第1レベルの外部交換段階の後に課される。これによりプログラムは、第1レベルの交換段階の後に第2レベルの外部交換に進むだけとなる。この挙動は、異なるレベルの外部モードで修飾されたSYNC命令をそのオペランドに使用してプログラムすることができる。
実施形態では、最高階層レベルの同期ゾーンは、アレイ6内のすべてのチップ2上のすべてのタイル4を包含する、すなわち、グローバル同期を実行するために使用される。複数の低レベルゾーンが使用される場合、BSPは各ゾーン内のチップ2上のタイル4の群の間で内部的に課されるが、各ゾーンは、グローバル同期が実行されるまで互いに非同期に動作することがある。
尚、下位レベルの外部同期及び交換(iv)〜(v)に関して、任意の下位ゾーン91A、91Bはそれぞれ、他の下位レベルゾーン(単数又は複数)と並行して、下位レベルの外部交換の独自のインスタンスを実行してよい。及び/又は、場合によっては、(i)〜(v)の複数のインスタンスが(vi)〜(vii)の前に実装されてもよい。すなわち、外部同期及び交換の前に、下位レベルの外部BSPスーパーステップの複数のインスタンスがあり得る。さらに、この方式は、同期ゾーンの3つ以上の階層レベルに拡張することができる。
以下は、キューを必要とせずにオンチップで通信する(内部交換)ための例示的な機構を説明する。図16を参照する。
各チップ2上で、チップ2はチップ動作のタイミングを制御するそれぞれのクロックを含む。クロックはチップのすべての回路とコンポーネントに接続されている。チップ2はまた、内部の時間決定性相互接続すなわち「スイッチングファブリック」34を含み、これにすべてのタイル及びリンクが一組の接続ワイヤによって接続されている。実施形態では、相互接続34は、ソフトウェアによって読み取り可能な状態を持たないという点で、ステートレスであり得る。接続ワイヤの各セットは端と端が固定されている。ワイヤはパイプライン化されている。この実施形態では、一組は32本のワイヤを含む。各セットは、1クロックサイクルごとに1つのデータが転送される、1つ又は複数の32ビットデータからなるパケットを伝送できる。ただし本明細書では、「パケット」という語は、1つ又は複数の有効ビットを含む、データを表すビットのセット(本明細書ではデータアイテムと呼ぶこともある)を示すことに留意されたい。「パケット」には、ヘッダーや(対象受信者を一意に識別できる)いかなる形式の宛先識別子はなく、パケットの終わり情報もない。代わりに、パケットはそれぞれ、タイルへの入力又はタイルからの出力の数値を表す。各タイルには独自のローカルメモリがある(後述)。チップには共有メモリがない。スイッチングファブリックは一連の接続ワイヤのみを構成し、いかなる状態も保持しない。同じチップ上のタイル間のデータ交換は、本明細書に記載されているように時間決定論的に行われる。パイプライン接続ワイヤは、一連の一時的な記憶装置、例えば、データを次のストアに解放する前に、そのデータをクロックサイクルの間保持するラッチ又はフリップフロップを含む。ワイヤに沿った移動時間はこれらの一時的な記憶装置によって決定され、それぞれが任意の2点間の経路内でクロックサイクルの時間を使いきる。
各タイル4は、内部相互接続34内の同期コントローラ36にその同期状態を指示する。各タイル4がデータを送信する準備が整ったことが確認されると、同期プロセス30はシステムを交換段階50に入らせる。尚、各タイルは、異なるものであるが既知の時間遅延で同期確認を受ける。スーパーバイザプログラムは必要に応じて追加のサイクル遅延を挿入し、各タイルがまったく同じサイクルで交換段階を開始するようにする。この交換段階では、データ値はタイル間(実際にはメモリ間データ移動におけるタイルのメモリ間)を移動する。交換段階では、計算は行われず(又は少なくとも別のタイル4からまだ受信されていないデータに応答する計算は行われない)、したがって並行性の危険もない。交換段階では、各データは、それがタイルを出る接続ワイヤに沿って伝送タイルからその受信側タイルに移動する。各クロックサイクルで、データはその経路に沿って(記憶装置から記憶装置へ)一定の距離をパイプライン方式で移動する。データがタイルから発行された場合、受信側のタイルを識別するヘッダーは付けられない。代わりに、受信側タイルは、特定の時間に特定の伝送側タイルからデータを予想することを認識する。したがって、本明細書に記載のコンピュータは時間決定論的である。
各タイル4は、プログラマ又はコンパイラ演習によってそれに割り当てられたプログラムの一部を実行する。ここで、プログラマ又はコンパイラ機能は、特定の時間に特定のタイルによって何が伝送されるのか、及び、特定の時間に受信側タイルによって何を受信する必要があるのかについての知識を有する。これを達成するために、SEND命令は、各タイル上でプロセッサによって実行されるローカルプログラムに含まれ、このSEND命令の実行時間は、コンピュータ内の他のタイル上で実行される他の命令のタイミングに対して予め決定される。
各タイル4はそれ自体のマルチプレクサ210と紐付けられる。各マルチプレクサは、チップ上のタイル4の数と少なくとも同数の入力を有し、各入力はスイッチングファブリック34に接続されている。スイッチングファブリックのクロスワイヤは、各タイル(ブロードキャスト交換バス)からのデータ出力セットの接続ワイヤ218に接続されている。説明を簡単にするために、すべてのクロスワイヤが図16に示されているわけではない。1組のクロスワイヤを、それが多数の組のクロスワイヤの1つであることを示すために140xとラベル付けしている。
マルチプレクサ210が220xとラベル付けされた入力に切り替えられると、それはクロスワイヤ140xに接続し、したがって伝送(送信)タイル4Tのデータバス218Tに接続する。マルチプレクサがある時間にその入力に切り替わるように制御されている場合、クロスワイヤ140xに接続されているデータバス230で受信されたデータは、ある時間にマルチプレクサ210の出力に現れる。その後、受信タイル4Rからマルチプレクサ210までの距離に応じた一定の遅延で受信タイル4Rに到達する。マルチプレクサはスイッチングファブリックの近くに配置される傾向があるので、タイルからマルチプレクサへの遅延は受信タイル4Rの位置に応じて変化し得る。
スイッチングを実装するために、タイル4上で実行されるローカルプログラムには、マルチプレクサ制御信号214を発行させ、そのタイルに紐付けられたマルチプレクサ210を制御して、特定のデータがタイルで受信されると予期される時間よりも前の一定時間において入力を切り替えるスイッチ制御命令(PUTi)が含まれる。交換段階では、マルチプレクサが切り替えられ、スイッチングファブリックを使用してタイル間でパケット(データ)が交換される。この説明から、内部相互接続34は状態を有さないことが明らかであり、各データの移動は、各マルチプレクサの入力が切り替えられる特定のワイヤセットによって予め定められる。
交換段階では、すべてのタイル4がその同期群内の他のすべてのタイルと通信することが許可される。各タイル4は、それ自体の固有の入力マルチプレクサ210の制御を有する。したがって、着信トラフィックは、チップ2内の他の任意のタイルから(又は外部交換機内の外部接続リンクのうちの1つから)選択することができる。また、マルチプレクサ210が、所与の交換段階においてヌル入力、すなわち入力なしを受信するように設定されることも可能である。
各タイル4は3つのインターフェース:スイッチングファブリック34からタイル4にデータを送る「exin」インターフェース224、ブロードキャスト交換バス218を介してタイルからスイッチングファブリックにデータを送る「exout」インターフェース226、及び、タイル4からそのマルチプレクサ210へ制御マルチプレクサ信号214(mux−select)を送る「exmux」インターフェース228と、を有する。
個々のタイルがSEND命令を実行し、適切な時間に制御命令を切り替えて正しいデータを送受信するためには、交換スケジューリングの要件は、個々のプログラムをコンピュータの個々のタイルに割り当てるプログラマ又はコンパイラによって満たされる必要がある。この機能は、好ましくはコンパイル時に交換スケジューラによって実行され、それは以下のパラメータを知っている必要がある。
パラメータI:各タイルの相対SYNC確認応答遅延、RSAK(TID送信タイル、TID受信タイル)。これは、送信タイルと受信タイルのタイルID(TID)の関数で、TILE_IDレジスタに保持されている。これは常に0以上のサイクル数であり、各タイルが他のすべてのタイルに対して同期コントローラ36から同期確認信号をいつ受信するかを示す。これは、タイルIDから計算することができ、タイルIDはそのタイルのチップ上の特定の位置を示し、したがって物理的距離を反映することに注意されたい。別の言い方をすれば、同期確認遅延は等化される。送信タイル4Tが同期コントローラ36により近く、受信タイル4Rがさらに離れている場合、結果として、同期確認応答遅延は受信タイル4Rよりも送信タイル4Tに対して短くなり、逆もまた同様である。同期確認応答遅延のために、特定の値が各タイルに紐付けられる。これらの値は、例えば遅延テーブルに保持する、又はタイルIDに基づいて毎回その場で計算することができる。
パラメータII:交換マルチプレクサ制御ループ遅延、MXP(受信タイルのTID)。これは、タイルの入力マルチプレクサの選択を変更する命令(PUTi MUXptr)を発行してから、新しいマルチプレクサ選択の結果として同じタイルがメモリに記憶された交換データに対して(仮想の)ロード命令を発行できる最も早い時点までのサイクル数である。これは、受信側タイル4Rのexmuxインターフェース228Rからそのマルチプレクサ210Rへ到達する制御信号の遅延と、マルチプレクサの出力からデータ入力exinインターフェース224へのラインの長さとを含む。
パラメータIII:タイルからタイルへの交換遅延、TT(送信タイルのTID、受信タイルのTID)。これは、1つのタイルでSEND命令が発行されてから、受信側のタイルがそれ自身のメモリ内の送信値を指す(仮想)ロード命令を発行することができる最も早い時点までのサイクル数である。これは、テーブルにアクセスすることによって、又はその場で計算することによって、送信タイル及び受信タイルのTIDから計算することができる。この遅延は、データがそのexoutインターフェース226Tからの送信タイル4Tからその交換バス218Tに沿ってスイッチングファブリック34へ、次いで受信タイル4Rの入力mux210Rを介して受信タイルのexinインターフェース224Rへ移動するのにかかる時間を含む。
IV.交換トラフィックメモリポインタ更新遅延、BNET_MMP()。これは、タイルの交換入力トラフィックメモリポインタを変更する命令(PUTi−MEMptr)を発行してから、その新たなポインタの結果としてその同じタイルがメモリに記憶された交換データの(仮想)ロード命令を発行できる最短時点までのサイクル数である。これは、小さな固定数のサイクルである。このメモリポインタ232は、データメモリ202へのポインタとして機能し、exinインターフェース224から入ってくるデータがどこに記憶されるべきかを示す。
これらのパラメータを合わせると、送信側タイル4Tからのデータの送信と受信側タイル4Rによるそのデータの受信との間に経験することになる総タイル間遅延が得られる。上記の特定の交換メカニズム及びパラメータは、一例としてのみ与えられている。交換メカニズムが異なれば正確な遅延構成が異なる場合があるが、交換が時間決定論的に保たれている限り、プログラマ又はコンパイラはそれを知ることができ、したがってキューなしで交換が可能である。
図17は、交換タイミングの例をより詳細に示している。左側には、動作するチップクロックサイクル0〜30が示されている。送信命令の発行から開始して、送信タイル4Tに対する動作がクロックサイクル0と9との間で発生する(SEND E0)。クロックサイクル10〜24では、データはスイッチングファブリック34を通ってその経路を決定する。
IPUクロックサイクル11において受信タイル4Rを見ると、タイル入力マルチプレクサの選択を変更するPUTi命令が実行される。サイクル18では、メモリポインタ命令が実行され、クロックサイクル25でロード命令が可能になる。送信タイル4Tでは、サイクル1〜9は、SEND命令の発行とexoutインターフェース上でのそのデータの出現との間の内部タイル遅延である。E1、E2などは以前のSENDインストラクターからのデータを示している。交換ファブリック34では、クロックサイクル10〜24を「交換」とラベル付けしている。これらの各サイクルで、データはパイプラインに沿って(一時記憶装置間で)「1ステップ」ずつ移動する。受信側タイル4R上のサイクル25〜29は、exinインターフェースでデータを受信してからそれをメモリに符号化するまでの遅延を示す。
簡単に言えば、受信側タイル4Rのプロセッサが、送信側タイル4Tに対する処理の出力であるデータに作用したい場合、送信側タイル4Tは、ある時点で送信命令SEND命令を実行しなければならない(例えば、図17のクロックサイクル0)。そして、受信側タイル4Rは、送信側タイル上でのSEND命令の実行に対して一定の時間だけ(クロックサイクル11におけるように)スイッチ制御命令PUT_EXCH_MXptrを実行しなければならない。これは、データが受信側タイル4Rで実行されているコードレットで使用するためにロードされるのに間に合うように受信側タイルに到着することを保証する。
受信側タイルでの受信処理は、命令PUTiMEMptrの場合のようにメモリポインタを設定することを含む必要はないことに留意されたい。代わりに、メモリポインタ232は、各データが外部インターフェース224で受信された後に自動的にインクリメントする。するとその受信データは、次に利用可能な次のメモリ位置にロードされる。ただし、メモリポインタを変更する能力により、受信側タイルはデータが書き込まれるメモリ位置を変更できるようになる。これらすべては、それらが正しく通信するように個々のプログラムを個々のタイルに書き込むコンパイラ又はプログラマによって決定され得る。これにより、内部交換(チップ上のタイル間交換)のタイミングが完全に時間決定論的になるという結果になる。この時間決定論を交換スケジューラで使用して、交換シーケンスを高く最適化することができる。
図19は、オフチップ通信(外部交換)のための例示的な機構を示す。この機構は時間に非時間決定論的である。この機構は、外部相互接続72内に専用ハードウェアロジックで実装される。データはパケットの形態で外部相互接続72を介して送信される。内部相互接続を介して送信されるパケットとは異なり、これらのパケットにはヘッダーがある。送信の順序が変わる可能性があるため、そのパケットヘッダーに宛先アドレスが含まれている必要があるからである。また実施形態では、外部相互接続72はネットワークの形態をとり、したがってルーティングの目的で追加情報が必要である。
物理層ではこの相互接続機構は損失が多いが、トランザクション層ではリンク層のアーキテクチャにより、この機構の損失は多くない。もしパケットが確認応答されなければ、相互接続72内のハードウェアによって自動的に再送されるからである。しかし、データリンク層における損失及び再送信が可能であるということは、外部相互接続を介したデータパケットの配信が時間決定論的ではないことを意味する。さらに、所与の交換のすべてのパケットは、時間的に一緒に又は別々に分かれて、しかも任意の順序で到着することが可能であるため、外部相互接続はフロー制御及びキューを必要とする。さらに、この相互接続は、ビットロックを維持するのに十分なデータ信号遷移を有する受信データストリームからクロックを推測するためにクロックデータリカバリ(CDR)技術を使用することができる。この推定クロックは、送信クロックに対して未知の位相関係にあり、したがって、非決定論のさらなる原因となる。
図示のように、外部相互接続72は外部交換ブロック(XB)78を含む。コンパイラは、外部交換要求(XREQ)を交換ブロック78に送信するようにタイル4のうちの1つを指定する(ステップS1)。XREQは、1つ又は複数の制御パケットを含むメッセージであり、どのタイル4が他のチップ2上の他の1つ又は複数のタイル4に送信すべきデータパケット(コンテンツ)を有するかを示す。これは、図19にチェックマークとクロスマークで概略的に示している。シナリオ例として、チェックマークを付したものは外部に送信するデータパケットを持ち、クロスマークを付したものは持っていない。ステップS2において、交換ブロック78は交換オン(XON)制御パケットを外部に送信するためのデータとともに第1のタイル4に送信する。これにより、第1のタイルは、そのパケットを外部相互接続78を介して関連する宛先に送信し始める(ステップS3)。いずれかの時点で(例えば、相互接続における以前のパケット損失及び再送信、又は他の多くのXB及びタイルによる外部相互接続の過剰予約により)XBが相互接続へのパケット送信を続けることができなくなった場合、XBキューがオーバーフローする前にXBはそのタイルに交換オフ(XOFF)を送信する。輻輳が解消され、XBが再びキューに十分なスペースを確保すると、XONをタイルにXONを送信して、コンテンツの伝送を続行できるようにする。このタイルがその最後のデータパケットを送信したら、ステップS4にて、交換ブロック78はこのタイルに交換オフ(XOFF)制御パケットを送信し、次にステップS5にて、送信するデータパケットとともに別のXONを次のタイル4に送信し、これを繰り返す。XON及びXOFFのシグナリングは、外部交換ブロック78の形で専用ハードウェア論理におけるハードウェア機構として実装される。
当然のことながら、これはチップ間で外部と通信するためのフロー制御機構の一例にすぎない。他の適切な機構は、それ自体、当業者にはよく知られているだろう。また、時間決定論的及び/又はキューのない外部相互接続の可能性も排除されない。
図15は、本明細書で開示されるプロセッサアーキテクチャの応用例、すなわち機械知能への応用例を示す。
機械知能の当業者には周知のように、機械知能は機械知能アルゴリズムが知識モデルを学習する学習段階から始まる。モデルは、相互接続されたノード(すなわち頂点)102及びエッジ(すなわちリンク)104のグラフを含む。ノード及びリンクは、頂点及び辺と呼ぶこともある。グラフ内の各ノード102は、1つ以上の入力エッジと1つ以上の出力エッジとを有し、いくつかのノード102の入力エッジのいくつかは、他のいくつかのノードの出力エッジであり、これにより、ノードを相互接続してグラフを形成する。さらに、1つ又は複数のノード102の1つ又は複数の入力エッジが全体としてグラフへの入力を形成し、1つ又は複数のノード102の出力エッジの1つ又は複数が、全体としてグラフの出力を形成する。時々、与えられたノードは、グラフへの入力、グラフからの出力、そして他のノードへの接続の全てを持っている場合がある。各エッジ104は、値を又はより頻繁にはテンソル(n次元行列)を伝達する。これらがそれらの入力及び出力エッジでそれぞれノード102との間で提供される入力及び出力をそれぞれ形成する。
各ノード102は、その1つ又は複数の入力エッジで受信されたその1つ又は複数の入力の関数を表し、この関数の結果は1つ又は複数の出力エッジに提供される出力である。各関数は、1つ又は複数のそれぞれのパラメータ(時には重みとも呼ばれるが、必ずしも乗算型重みである必要はない)によってパラメータ化される。一般に、異なるノード102によって表される関数は、異なる形態の関数であっても、及び/又は異なるパラメータによってパラメータ化されてもよい。
さらに、各ノードの機能の1つ又は複数のパラメータの各々は、個別のエラー値によって特徴付けられる。加えて、それぞれのエラー状態は、各ノード102のパラメータ内のエラーに関連する可能性がある。単一のパラメータによってパラメータ化された機能を表すノード102については、この条件は単純な閾値であってもよく、すなわち、この条件が指定された閾値内にあれば条件が満たされているが、条件が閾値を超えていれば満たされていない。2つ以上のそれぞれのパラメータによってパラメータ化されたノード102については、そのノード102が許容可能なレベルのエラーに達したという条件はより複雑になる可能性がある。例えば、その条件は、そのノード102の各パラメータがそれぞれの閾値内にある場合にのみ満たされ得る。別の例として、結合メトリックは、同じノード102に対する異なるパラメータ内のエラーを組み合わせて定義することができ、結合された測定基準の値が指定された閾値内に入るという条件で条件が満たされてもよいが、それ以外の場合、結合メトリックの値が閾値を超えると(又はメトリックの定義に応じてその逆)条件は満たされない。条件がどうであれ、これはノードのパラメータ(単数又は複数)のエラーがあるレベル又は許容度を下回るかどうかの尺度となる。一般に、任意の適切な測定基準を使用してよい。この条件又は測定基準は、すべてのノードに対して同じであっても、ノードのうちのそれぞれ異なるノードに対して異なっていてもよい。
学習段階では、アルゴリズムは経験データ、すなわち、グラフへの入力の異なる可能な組み合わせを表す複数のデータポイントを受け取る。より多くの経験データが受信されるにつれて、アルゴリズムは、経験データに基づいてグラフ内の様々なノード102のパラメータを徐々に調整して、パラメータの誤差を最小限に抑えるようにする。目標は、グラフの出力が所望の結果に可能な限り近づくようなパラメータ値を探し出すことである。グラフ全体がこのような状態に向かうにつれて、計算は収束すると言われる。適切な程度の収束の後、グラフは予測又は推論を実行するために、すなわちある与えられた入力に対する結果を予測するため、又はある与えられた出力に対して原因を推論するために使用されることができる。
学習段階は多くの異なる可能な形態をとることができる。例えば、教師付きアプローチでは、入力経験データは訓練データ、すなわち既知の出力に対応する入力の形をとる。各データポイントで、アルゴリズムは、出力が所与の入力に対して既知の出力にさらに近づくようにパラメータを調整することができる。その後の予測段階では、グラフを使用して、入力クエリーを近似予測出力に(又は推論する場合にはその逆で)マッピングすることができる。他のアプローチも可能である。例えば、教師なしアプローチでは、入力データごとに参照結果の概念がなく、代わりに機械知能アルゴリズムが出力データ内でそれ自体の構造を識別するために残される。あるいは、補強手法では、アルゴリズムは、入力経験データ内の各データポイントに対して少なくとも1つの可能な出力を試行し、この出力が正か負か(そして潜在的にそれが正又は負である度合い)、例えば、勝利又は敗北、報酬又は罰、又はそのようなものを通知される。多くの試行を経て、アルゴリズムは、ポジティブなアウトカムをもたらすかもしれない入力を予測し得るように、グラフのパラメータを徐々に調整することができる。グラフを学習するための様々なアプローチ及びアルゴリズムは、多分、機械学習の当業者には周知であると思われる。
本明細書に開示された技術の例示的な適用によれば、各ワーカースレッドは、機械知能グラフにおいてノード102のそれぞれ個別の1つに紐付けられた計算を実行するようにプログラムされる。この場合、ノード102間のエッジ104の少なくともその一部は、スレッド間のデータの交換に対応し、一部はタイル間の交換を伴い得る。さらに、ワーカースレッドの個々の終了状態は、それぞれのノード102がそのノードのパラメータ(単数又は複数)の収束のためのそれぞれの条件を満たしたかどうか、すなわち、1つ又は複数のパラメータのエラーが許容範囲内又は許容誤差の範囲内に収まっているかどうかを表すためにプログラマによって使用される。例えば、これは、個々の終了状態の各々が個々のビットであり、アグリゲートされた終了状態が個々の終了状態のAND(又は0が正であるとみなされる場合には同等にOR)の場合、あるいは、個々の終了状態がすべて真であるか、偽又はミックスであるかを表す3値である場合の実施形態の一使用例である。したがって、終了状態レジスタ38内の単一のレジスタ値を調べることによって、プログラムはグラフ全体又は少なくともグラフのサブ領域が許容可能な程度に収束したかどうかを特定することができる。
これの別の変形として、アグリゲーションが個々の信頼値の統計的アグリゲーションの形態をとる実施形態を使用することができる。この場合、各個々の終了状態は、それぞれのスレッドによって表されるノードのパラメータが許容エラーに達したという信頼値(例えば、百分率として)を表す。次いで、このアグリゲートされた終了状態を使用して、グラフ又はグラフのサブ領域が許容可能な程度に収束したかどうかに関する全体的な信頼度を特定することができる。
マルチタイル配列6の場合、各タイルはグラフのサブグラフを実行する。各サブグラフは、1つ以上のスーパーバイザスレッドからなるスーパーバイザサブプログラムと、ワーカーのいくつか又は全てがコードレットの形態をとることのできるワーカースレッドのセットとを含む。
上記の実施形態は例としてのみ説明されたことが理解されたい。
例えば、内部時間決定論的及び外部非時間決定論的BSP段階を分離するという概念は、上述の実施形態の専用同期命令の使用を通して実施されることに限定されない。これは特に効率的ではあるが、内部−外部BSP原理が汎用機械コード命令からなるコードで実装されることもあり得る。
また、本開示の範囲は、時間決定論的ドメインがオンチップであること、又は非時間決定論的交換が特にオフチップであることに限定されない。他の方法で、時間決定論的領域と非時間決定論的領域とを区別することも可能である。例えば、異なるマルチチップ時間決定論的ドメインが非時間決定相互接続によって接続されている状態(例えば、異なるマルチチップ時間決定論的ドメインが、異なるカード又はサーバシャーシに実装されている)で、時間決定論的ドメインを複数のチップ2にわたって拡張することもあり得る。あるいは別の例として、異なる時間決定論的ドメインを所与のチップ2上に実装し、そのドメイン間には非時間決定論的オンチップ相互接続を提供することも可能である。
さらに、時間決定論的ドメインの実装は、タイル間遅延ルックアップテーブルの使用に限定されない。代わりに、例えば解析公式を使用してタイル間遅延を決定することができる。また、タイル間遅延、送受信タイミングはコンパイラによる設定に限定されない。例えば、別法として、プログラマによって手動で構成することも可能である。
さらに、本開示の範囲は、時間決定論的領域と非時間決定論的領域との間の分割を行うためのいずれかの特定の理由に限定されるものではない。上述のように、キューイング、損失の多い伝送と無損失伝送、レイテンシ、及び/又はオンチップ/オフチップ分割など、これには多くの潜在的な要因がある。すべてのそのような場合又は他の場合において、少なくとも特定の段階では、非時間決定論的交換が時間決定論的交換段階の時間決定論を汚染することを回避することが望ましい可能性がある。本開示の範囲は、1つの可能な動機によって制限されるものではない。
さらに、本明細書で開示される技術の適用可能性は、スーパーバイザスレッドに対して別個のコンテキストが提供される、又はスーパーバイザスレッドがスロット内で実行され、次にそのスロットがワーカーに放棄される、上記のアーキテクチャに限定されない。例えば別の構成では、スーパーバイザはそれ自体の専用スロットで動作しもよい。
あるいは、1つ、いくつか又はすべてのチップ上の1つ、いくつか又はすべてのタイルが非マルチスレッド実行を採用するシナリオに、内部−外部BSPの概念を使用することもできる。
マルチスレッドタイルが使用される場合、用語「スーパーバイザ」及び「ワーカー」は、他に明示的に述べられている場合を除き、必ずしも特定の責任を暗示する必要はなく、特にそれ自体が必ずしもスーパーバイザスレッドがそのタイムスロットをワーカーに放棄するなどの上述の方式に限定されない。一般に、ワーカースレッドは、何らかの計算タスクが割り当てられている任意のスレッドを指すことができる。スーパーバイザは、ワーカーをバレルスロットに割り当てる、及び/又は、複数のスレッド間でバリア同期を実行する、及び/又は、複数のスレッドの結果に応じて制御フロー操作(分岐など)を実行するなどの行為を担う、あらゆる種類の監視又は調整するスレッドを表すことができる。
インターリーブされたタイムスロットのシーケンスなどに言及される場合、これは、参照されるシーケンスがすべての可能な又は利用可能なスロットを構成することを必ずしも暗示してはいない。例えば、対象シーケンスが可能性のあるすべてのスロットであっても、又は現在アクティブなスロットだけであってもよい。スケジュールされたシーケンスに現在含まれていない他の潜在的なスロットがあり得ることを必ずしも排除するわけではない。
本明細書で使用するタイルという用語は必ずしも特定のトポグラフィなどに限定されるものではなく、一般には、類似のモジュールの配列内、通常は同じチップ(同じダイ)上の処理ユニット10及び対応メモリ11を含む任意のモジュール型処理リソースを指すことができる。
さらに、本明細書では、タイル群、又は複数のタイルなどの間で同期又は集約を実行することについて言及しているが、明示的に述べられていない限り、これは必ずしもチップ上のすべてのタイル又はシステム内のすべてのタイルを指してはいない。例えば、SYNC及びEXIT命令は、所与のチップ上のタイル4の特定のサブセット及び/又は所与のシステム内のチップ2のサブセットのみに関してのみ同期及びアグリゲーションを実行するように構成することができ、一方、所与のチップ上のいくつかの他のタイル4、及び/又は所与のシステム内のいくつかの他のチップは、所与のBSP群に関与せず、手元の群によって行われる計算とは関係ない、何らかの全く別個のタスクセットに使用可能である。
さらに、上述の同期スキームは、実施形態において、ホストプロセッサなどのCPUプロセッサ、あるいは1つ又は複数のネットワークカード、記憶装置、及び/又はFPGAなどのプロセッサではない1つ又は複数のコンポーネントなど、マルチタイルプロセッサ以外の外部リソースの関与を排除するものではない(例えば、同期目的にのみ使用される専用のワイヤを介してではなく、より広い相互接続を介してパケットとしてグローバル同期メッセージを通信するため)。例えば、いくつかのタイルは、データ転送がそのタイルの計算上の負担となる場合には外部システムとともにそのデータ転送にあたることを選択することができる。この場合、転送は次のバリアの前に完了する必要がある。場合によっては、タイルの終了状態がその外部リソースとの通信結果に依存する可能性があるため、リソースが間接的に終了状態に影響を与える可能性がある。代替的又は追加的に、マルチタイルプロセッサ以外のリソース、例えばホスト又は1つ以上のFPGAを、同期ネットワーク自体に組み込むことができる。すなわち、バリア同期が満たされ、タイルが次の交換段階に進むためには、Sync_reqなどの同期信号がこの追加リソースには必要である。さらに、実施形態では、アグリゲートしたグローバル終了状態は、そのアグリゲーションに、FPGAからなどの外部リソースの終了状態を含むことができる。
また、特定のモードのSYNC命令について上述したが、本開示の範囲は、より一般的にはそのようなモードに限定されない。例えば、上記のモードのリストは必ずしも網羅的なものではない。あるいは他の実施形態では、SYNC命令のモードは少なくても良い。例えばSYNCは異なる階層レベルの外部同期をサポートしていなくてもよい、又はオンチップ同期とチップ間同期を区別しなくてもよい(すなわち、タイル間モードでは、オンチップであるかオフチップであるかにかかわらず、常にすべてのタイルに関して作用する)。さらに別の実施形態では、SYNC命令はオペランドとしてモードをとる必要は全くない。例えば、実施形態では、異なるレベルの同期及び終了状態アグリゲーション(タイル上の同期及びタイル間のオンチップ同期のための異なるSYNC命令など)に対して、別々のバージョンのSYNC命令(異なるオペコード)を提供することができる。あるいは他の実施形態では、専用SYNC命令をタイル間同期のためにのみ提供してもよい(必要であれば、スレッド間のタイル上同期を汎用ソフトウェアで実行するために残す)。
さらに他の変形例では、SYNC命令は、より多くの粒度又は範囲の階層的同期ゾーン91、92を収容するために、より多数の可能なモードをとることができる。あるいは、システムの階層ゾーンへの異なる分割に対応するための単純に異なるモードのセットをとることができる。例えば、内部(オンチップ)同期と外部(オフチップ)同期(あるいはこれに代わるもの)の間の選択を可能にすることができるのと同様に、SYNC命令のモードを、1チップを超えるさらに遠くの他の物理的ブレークポイント(例えば、1つのICパッケージ、1つのカード、1箱のカードなど)を認識するように構成してもよい。あるいは、専用のSYNC命令が使用されない場合でも、この分割は、汎用コードを使用してプログラマ又はコンパイラによって実装可能である。したがって、実施形態では、階層的同期ゾーンのうちの1つ(たとえばSYNC命令のモードの1つ)を、同じICパッケージ上の全チップ上の全タイル(ただしこれを超えるタイルやチップはない)で構成することができる。代替的に又は付加的に、階層的同期ゾーンのうちの1つ(例えば、SYNC命令のモードのうちの1つ)を、同じカード上の全チップ上の全タイルで構成することができる(ただし、それ以外のタイル、チップ、パッケージはない)。他の代替例又は追加例として、階層的同期ゾーンのうちの1つ(例えば、やはりSYNC命令の別の可能なモード)を、同じサーバシャーシなど、同じ物理ボックス内の全カード上の全チップ上の全タイルで構成することができる(ただし、それ以上のタイル、チップ、ボックスはない)。異なるサーバシャーシ間の通信は、同じシャーシ内に配置されているチップ(ダイ)間だけよりさらに大きなペナルティを被る傾向があるため、これは有利となる。
さらに、同期ゾーンは階層的である(つまり、あるものが別のものにネストしている)ことに限定されず、他の実施形態では、選択可能な同期ゾーンは、1つ又は複数の非階層的群からなる、又はそれを含むことができる(その群のすべてのタイルは、他の単一の選択可能な群内にネストされているわけではない)。
開示された技術の他の応用及び変形は、本明細書の開示が与えられれば当業者には明らかになるであろう。本開示の範囲は、記載された実施形態によって制限されるのではなく、添付の特許請求の範囲によってのみ限定される。