(58)【調査した分野】(Int.Cl.,DB名)
命令セットにおいて定義される命令タイプのインスタンスを実行するように構成された実行ユニットであって、インターリーブされた時間スロットの繰り返しシーケンスのうち対応するシーケンスにおいて複数の並列スレッドの各々を実行するように構成されたバレルスレッド実行ユニットである実行ユニットと、
前記スレッドのうち1つによって現在要求されているか否かを記録する関連状態を有する繰り返しキャッシュと、
を含むプロセッサであって、
前記命令セットにおいて定義される前記命令タイプは、繰り返し回数オペランドを取る繰り返し命令のタイプを含み、前記実行ユニットは、
a)前記繰り返しキャッシュが前記状態に従って現在要求されておらず、前記繰り返し命令のインスタンスが実行されるときは、最初のスレッドの前記繰り返し命令により指定されたコードの部分を前記繰り返しキャッシュにキャッシュし、前記状態を前記繰り返しキャッシュが要求されていると記録して修正し、前記繰り返しキャッシュから前記コードの部分を取り出し、当該コードの部分を前記最初のスレッドの前記繰り返し命令の前記繰り返し回数オペランドに指定された回数だけ実行することと、
b)前記繰り返しキャッシュが前記状態に従って現在要求されており、繰り返しキャッシュが要求されていないと前記状態が次にリセットされるまでの間に前記繰り返し命令の別のインスタンスが別のスレッドにおいて実行されるときは、前記コードのすでにキャッシュされた部分を前記繰り返しキャッシュから取り出し、当該コードの部分を前記別のスレッドの前記繰り返し命令の前記繰り返し回数オペランドに指定された回数だけ実行することと、
を行うように構成され、
前記繰り返し回数オペランドが、前記コードの部分を実行する前記回数を表す正の整数値を指定することができる、プロセッサ。
前記繰り返し命令は、前記コードの部分のサイズを指定するための繰り返しサイズオペランドを取り、前記コードの部分は、前記最初のスレッドの前記繰り返し命令に続く事前に定義されたポイントから、前記最初のスレッドの前記繰り返し命令の前記繰り返しサイズオペランドによって定義された後続のポイントまでに含まれる、請求項2に記載のプロセッサ。
前記繰り返し回数オペランドは、さらにゼロの値を取ることができ、前記繰り返し回数オペランドがゼロを取る場合は、前記繰り返し命令は、前記実行ユニットに、前記コードの部分の実行をスキップさせる、請求項1〜3のいずれか一項に記載のプロセッサ。
前記繰り返し回数オペランドが1を取る場合は、前記繰り返し命令は、前記実行ユニットに、前記コードの部分を1度だけ実行させる、請求項1〜4のいずれか一項に記載のプロセッサ。
前記実行ユニットが前記最初のおよびさらなるスレッドのうちの少なくとも1つの前記繰り返し命令の前記繰り返し回数オペランドに指定された回数だけ前記コードのキャッシュされた部分の実行を完了した時点で、前記繰り返しキャッシュが再び要求されていないと記録して前記状態を自動的にリセットするハードウェアメカニズムを含む、請求項1〜7のいずれか一項に記載のプロセッサ。
前記メカニズムは、前記実行ユニットが前記最初のスレッドの前記繰り返し命令の前記繰り返し回数オペランドに指定された回数だけ前記コードのキャッシュされた部分の実行を完了したときに、前記状態を自動的にリセットするように構成される、請求項8に記載のプロセッサ。
前記メカニズムは、前記実行ユニットが最初のおよびさらなる全てのスレッドの前記繰り返し命令の前記繰り返し回数オペランドに指定された回数だけ前記コードのキャッシュされた部分の実行を完了したときに、前記繰り返しキャッシュに対する前記要求を自動的にクリアするように構成される、請求項8に記載のプロセッサ。
前記複数の並列スレッドには複数のワーカースレッドが含まれ、前記実行ユニットは、少なくともいくつかの時間に、前記ワーカースレッドを管理するように構成された少なくとも1つのスーパーバイザスレッドを含むスーパーバイザサブプログラムを実行するようにさらに構成される、請求項11に記載のプロセッサ。
前記コンテキストレジスタの複数のセットは、並列に実行することができる前記ワーカースレッドの各々に対するコンテキストレジスタの前記セットのうち対応するセットと、前記スーパーバイザサブプログラムのプログラム状態を保持するように構成されたコンテキストレジスタの追加のセットとを含む、請求項12に記載のプロセッサ。
前記スーパーバイザサブプログラムは、最初に前記スロットのすべてにおいて動作することによって開始し、次いで、前記スーパーバイザサブプログラムが最初に動作していた前記スロットのいくつかまたはすべてを対応する前記ワーカースレッドに委ねることによって前記ワーカースレッドを起動するように構成される、請求項13に記載のプロセッサ。
前記コードの部分の前記命令のうち少なくとも1つは、前記実行ユニットによって、i)コンテキストレジスタのセットに含まれる少なくとも1つのレジスタからのオペランド値と、ii)前記並列スレッドに含まれるワーカースレッドに共通のオペランドレジスタのセットに含まれる少なくとも1つのレジスタからのオペランド値と、の組合せに基づいて実行される、請求項11〜16のいずれか一項に記載のプロセッサ。
コンピュータ可読記憶装置上で具体化され、請求項1〜18のいずれか一項に記載のプロセッサによって実行される繰り返し命令を含むコードを有するコンピュータプログラムであって、
前記プロセッサが、前記繰り返し命令のあるインスタンスをあるスレッドにおいて実行するときに、コードの部分を繰り返しキャッシュにキャッシュし、
前記プロセッサが、前記繰り返し命令の別のインスタンスを別のスレッドにおいて実行するときに、前記繰り返しキャッシュにキャッシュされた前記コードの部分を再利用する、
コンピュータプログラム。
【発明の概要】
【課題を解決するための手段】
【0007】
ここでは、複数の異なるスレッドが同じコードを実行することが望ましい状況が起こり得ると認識される。そのような例としては、各スレッドが異なるそれぞれのノードの処理を実行する機械学習アプリケーションがある。この場合、いくつかのノードは、実際に、同じ演算のいくつかを実行することができると認識される。そのようなすべてのノードのスレッドによってこのコードをメモリから別々にフェッチする必要がなくなれば、電力消費量を節約できると考えられる。同様の論点は、異なる並列プロセスが同じ動作のいくつかまたはすべてを含む他のアプリケーションでも起こり得る。
【0008】
本明細書で開示される一態様によれば、命令セットにおいて定義される命令タイプのインスタンスを実行するように構成された実行ユニットであって、インターリーブされた時間スロットの繰り返しシーケンスのそれぞれにおいて複数の並列スレッドの各々を実行するように構成されたバレルスレッド実行ユニットである実行ユニットと、繰り返しキャッシュがスレッドのうち1つによって現在要求されているか否かを記録する関連状態を有する繰り返しキャッシュと、を含むプロセッサが提供される。命令セットにおいて定義される命令のタイプは、繰り返し回数オペランドを取る繰り返し(repeat)命令を含み、実行ユニットは、a)繰り返しキャッシュが上記状態に従って現在要求されておらず、繰り返し命令の各インスタンスが上記スレッドのうち最初の対応するスレッドにおいて実行されるときは、当該最初のスレッドから繰り返しキャッシュにコードの部分をキャッシュし、上記の状態を繰り返しキャッシュが要求されていると記録して修正し、繰り返しキャッシュから各連続繰り返しを取り出して対応する回数だけ上記コードの部分を実行することと、b)繰り返しキャッシュが上記状態に従って現在要求され、再びその後、繰り返しキャッシュが再度要求されていないと上記の状態が次にリセットされるまで、繰り返し命令が上記スレッドのうちのさらなる対応するスレッドの一部として実行されるときは、コードのすでにキャッシュされた部分を、毎回繰り返しキャッシュから対応する回数だけ実行することと、を実行するように構成される。最初のおよびさらなる命令の各々に対し、それぞれの命令の繰り返し回数オペランドは、コードの部分が実行されるそれぞれの回数を指定し、繰り返し回数オペランドは、コードの部分を実行するそれぞれの回数に対して複数の正の整数値のいずれかを指定することができる。
【0009】
従って、現在開示されているプロセッサは、有利には、あるメカニズムを提供し、そのメカニズムにより、最初のスレッドは、繰り返しキャッシュに基づいてそれ自体のコードを複数回再利用できるのみならず、さらなるスレッドもまた、最初のスレッドによって既にキャッシュされている同じコードを、メモリから別々にその同じコードをフェッチする必要なく、再利用することができる。
【0010】
実施形態では、上記コードの部分は、最初のスレッドの繰り返し命令のインスタンスに続く部分であり得る。
【0011】
実施形態では、繰り返し命令は、上記コードの部分のサイズを指定するための繰り返しサイズオペランドを取ることができ、上記コードの部分は、最初のスレッドの繰り返し命令のインスタンスに続く事前に定義されたポイントから、最初のスレッドの繰り返し命令のインスタンスのサイズオペランドによって定義された後続のポイントまで実行することができる。
【0012】
繰り返しサイズオペランドは、上記事前に定義されたポイントに続く個々の命令の数の観点から、または、上記事前に定義されたポイントに続く命令バンドルの数の観点から(各バンドルは、多数の命令(例えば、1つの命令当たり2つまたは4つの命令)を含む)、サイズを指定することができる。
【0013】
実施形態では、繰り返し回数オペランドは、ゼロの値を取ることができ、繰り返し回数がゼロの場合は、繰り返し命令は、最初のスレッドの場合を含めて、実行ユニットに対し、対応するスレッドのコードの部分の実行をスキップさせる。
【0014】
実施形態では、繰り返し回数が1の場合、繰り返し命令は、実行ユニットに対して、繰り返すことなく一度だけ、対応するスレッドの一部として、コードの部分を実行させる。
【0015】
実施形態では、繰り返し回数オペランドは即値オペランドであってもよい。および/または、繰り返しサイズオペランドは即値オペランドであってもよい。
【0016】
実施形態では、繰り返し回数オペランドは、それぞれの回数を読み取る対象となるレジスタを参照することによって、コードの部分を実行する回数を指定することができる。および/または、繰り返しサイズオペランドは、サイズを読み取る対象となるレジスタを参照することによって、サイズを指定することができる。
【0017】
実施形態では、プロセッサは、最初のおよびさらなるスレッドのうちの少なくとも1つが対応する回数だけコードのキャッシュされた部分の実行を完了した時点で、繰り返しキャッシュが再び要求されていないと記録して上記状態を自動的にリセットするハードウェアメカニズムを含んでもよい。
【0018】
実施形態では、メカニズムは、最初のスレッドが対応する回数だけコードのキャッシュされた部分の実行を完了したときに、上記状態を自動的にリセットするように構成することができる。
【0019】
あるいは、メカニズムは、最初のおよびさらなる全スレッドが対応する回数だけコードのキャッシュされた部分の実行を完了したときに、繰り返しキャッシュに対する要求を自動的にクリアするように構成することができる。
【0020】
繰り返しキャッシュが要求されているかどうかを記録する繰り返しキャッシュの状態は、例えば、繰り返しキャッシュもしくは実行ユニットの内部状態(内部回路の1つもしくは複数のラッチ)として実装することができるか、またはその代替として、レジスタファイルのレジスタ(例えば、第1のスレッドもしくはスーパーバイザのコンテキストレジスタのうちの1つ、以下を参照)において実装することができる。
【0021】
いくつかの場合、複数の異なるスレッドが同じコードを実行するが、異なるデータに基づいて動作することが望ましい場合がある。この場合もやはり、そのような例は、機械学習アプリケーションにおいて起こり得る。例えば、各スレッドが異なるそれぞれのノードの処理を実行する場合を再び考える。多くのノードは、実際に、同じプロセスを含み得るが、それ自体の対応する入力データに基づいて動作することが分かる。例えば、問題のノードが全く同じ機能を表すが、グラフの異なる入力接続(エッジ)を有する。
【0022】
従って、実施形態では、プロセッサは、コンテキストレジスタの複数のセットを含んでもよく、各セットは、並列スレッドのうち対応するスレッドのプログラム状態を保持するように構成され、実行ユニットは、最初のおよびさらなるスレッドのうち各々のスレッドの繰り返し命令に応答して、コードの上記同じ部分を実行するが、対応するスレッドの対応するコンテキストレジスタの1つ又は複数のセットにおいて保持されている対応する1又は複数の対応するオペランドの値に基づいて動作するように構成することができる。
【0023】
実施形態では、上記並列スレッドは、複数のワーカースレッドを含んでもよく、実行ユニットは、少なくともいくつかの時間に、ワーカースレッドを管理するように構成された少なくとも1つのスーパーバイザスレッドを含むスーパーバイザサブプログラムを実行するようにさらに構成することができる。
【0024】
実施形態では、コンテキストレジスタは、並列に実行することができるワーカースレッドの各々に対するコンテキストレジスタのセットを含んでもよく、コンテキストレジスタの追加のセットは、スーパーバイザサブプログラムのプログラム状態を保持するように構成される。
【0025】
実施形態では、スーパーバイザサブプログラムは、最初にスロットのすべてにおいて動作することによって開始し、次いで、スーパーバイザサブプログラムが最初に動作していたスロットのいくつかまたはすべてを対応するワーカースレッドに委ねることによってワーカースレッドを起動するように構成することができる。
【0026】
実施形態では、命令セットは、実行(run)命令を含んでもよく、実行命令は、スーパーバイザサブプログラムの一部として実行されると、実行命令が実行されたスロットをワーカースレッドのうちの1つに委ね、スーパーバイザサブプログラムの代わりに、ワーカースレッドがそのスロットにおいて起動される。
【0027】
実施形態では、命令セットは、終了(exit)命令を含んでもよく、終了命令は、ワーカースレッドのうちの1つの一部として実行されると、終了命令が実行されたスロットをスーパーバイザサブプログラムに返すようにし、ワーカースレッドの代わりに、スーパーバイザサブプログラムがそのスロットにおいて再び動作を続ける。
【0028】
いくつかの場合、スレッドが実際にいくつかの同一のオペランド値だけでなく、別個のスレッドに特有のいくつかの他のオペランドに基づいても動作する応用が発生しうる。そのような例としては、各スレッドの命令が共通の重みのセット(スレッド間で共有される)と、別個のスレッドに特有の入力データとを乗算する畳み込みの一部として実行されるベクトルまたは行列乗算がある。この特定の例は、多くのノードが実際に同一の重みを有するが異なる接続を有する畳み込みニューラルネットワークで発生する場合がある。例えば、ある特徴を検出するためにそれぞれの入力データに共通の重みのカーネルを畳み込むなど、ニューラルネットワークの異なるノードの処理を実行するように各スレッドが構成されるシナリオを考える。そのようなシナリオでは、所定の算術命令を、スレッド間で共有される1つまたは複数の共通の重みオペランドと個々のスレッドに特有の1つまたは複数のオペランドとの組合せに基づいて動作、可能とするメカニズムを提供することが有利である。その論点は、決してニューラルネットワークに特有ではなく、いくつかの共有されたオペランド値およびいくつかのスレッド特有のオペランドを使用することになるいかなるアプリケーションにおいても生じ得る。
【0029】
実施形態では、上記コードの部分の命令のうちの少なくとも1つは、i)コンテキストレジスタの対応するセットにおける少なくとも1つのレジスタからのオペランド値と、ii)ワーカースレッドに共通のオペランドレジスタのセットにおける少なくとも1つのレジスタからのオペランド値との組合せに基づいて動作するタイプのものであってもよい。
【0030】
実施形態では、共有されたレジスタファイルのセットは、スーパーバイザサブプログラムのみが共通のレジスタのセットに値を書き込むことができ、ワーカースレッドは、共通のレジスタのセットから読み取ることしかできないように構成することができる。
【0031】
本発明の別の態様によれば、コンピュータ可読記憶装置上で具体化されるコンピュータプログラムであって、上記または本明細書の他の場所の任意の実施形態のプロセッサ上で実行するように構成されたコードであって、上記スレッドを含むコードであり、上記スレッドの少なくともいくつかが、スレッドのうちの少なくとも1つがスレッドのうちの別のものによって繰り返しキャッシュにキャッシュされたコードの部分を再利用するように構成された繰り返し命令のインスタンスを含む、コードを含む、コンピュータプログラムが提供される。
【0032】
本発明の別の態様によれば、実行ユニットを通じてプロセッサ上で上記スレッドを含むプログラムを実行するステップを含む方法であって、スレッドの少なくともいくつかが、スレッドのうちの少なくとも1つがスレッドのうちの別のものによって繰り返しキャッシュにキャッシュされたコードの部分を再利用するように構成された繰り返し命令のインスタンスを含む、方法が提供される。
【0033】
実施形態では、プログラムは、本明細書で開示される構成のいずれかに従って動作するようにさらに構成することができる。
【0034】
本開示の実施形態を理解することを支援するため、および、そのような実施形態をどのように実施するかを示すため、単なる例示として、添付の図面を参照する。
【発明を実施するための形態】
【0036】
実施形態の詳細な説明
図1は、本開示の実施形態によるプロセッサ4の例を示す。プロセッサ4は、バレルスレッド処理装置の形態のマルチスレッド処理装置10と、ローカルメモリ11(すなわち、マルチタイルアレイの場合は同じタイル上、または、単一プロセッサチップの場合は同じチップ上)とを含む。バレルスレッド処理装置は、パイプラインの実行時間が、インターリーブされた時間スロットの繰り返しシーケンス(その各々は、所定のスレッドによって占有される)に分割されるタイプのマルチスレッド処理装置である。また、これは、間もなくさらに詳細に論じられるように、並列実行と呼ぶこともできる。メモリ11は、命令メモリ12およびデータメモリ22(異なるアドレス可能メモリユニットまたは同じアドレス可能メモリユニットの異なる領域において実装することができる)を含む。命令メモリ12は、処理装置10によって実行される機械語を格納し、データメモリ22は、実行コードによって処理されるデータと、実行コードによって出力されたデータ(例えば、そのような処理の結果として)の両方を格納する。
【0037】
メモリ12は、プログラムの複数の異なるスレッドを格納し、各スレッドは、所定の1つまたは複数のタスクを実行するための命令の対応するシーケンスを含む。本明細書で言及される命令は、単一のオペコードおよび0またはそれ以上のオペランドからなる機械語命令(すなわち、プロセッサの命令セットの基本命令のうちの1つのインスタンス)を意味することに留意されたい。実施形態では、プログラムは、多数のワーカースレッドと、1つまたは複数のスーパーバイザスレッドとして構造化することができるスーパーバイザサブプログラムとを含む。これらについては、間もなくさらに詳細に論じる。
【0038】
マルチスレッドプロセッサは、典型的には並列的に、互いに並んで配置された複数のプログラムスレッドの実行が可能なプロセッサである。並列実行は、スレッドが、共通の実行パイプライン(またはパイプラインの少なくとも共通部分)を共有し、異なるスレッドが、繰り返しサイクルの異なるインターリーブされた時間スロットにおいて、この同じ共有された実行パイプラインを通じてインターリーブされることを意味する。これにより、パイプライン遅延を隠蔽する機会が増大するので、性能が向上する。プロセッサは、複数の異なるスレッドに共通の何らかのハードウェア(例えば、共通の命令メモリ、データメモリおよび/または実行ユニット)を含むが、マルチスレッドをサポートするため、プロセッサは、各スレッドに特有の何らかの専用ハードウェアも含む。
【0039】
専用ハードウェアは、並列に実行することができるスレッドの少なくとも各々に対するコンテキストレジスタ26の個別のセット(すなわち、サイクルの1スロット当たり1セット)を含む。マルチスレッドプロセッサについて述べる際、「コンテキスト」は、互いに並んで実行されている複数のスレッドのそれぞれのスレッドのプログラム状態(例えば、プログラムカウンタ値、ステータスおよび現在のオペランド値)を指す。コンテキストレジスタは、それぞれのスレッドのこのプログラム状態を表すためのそれぞれのレジスタを指す。レジスタファイルのレジスタは、レジスタアドレスが命令語においてビットとして固定されるという点で、一般的なメモリとは別個のものであり、メモリアドレスは、命令を実行することによって演算することができる。
【0040】
処理装置10内では、命令メモリ12からのスレッドの複数の異なるスレッドを、単一の実行パイプライン13を通じてインターリーブできる(ただし、典型的には、命令メモリに格納された全スレッドのサブセットのみが全プログラムの任意の所定のポイントにおいてインターリーブされうる)。マルチスレッド処理装置10は、コンテキストレジスタ26の多数のセットを含み、各セット26は、並列に実行することができる複数のスレッドのうちの異なるそれぞれのスレッドの状態(コンテキスト)を表すように構成される。また、マルチスレッド処理装置10は、並列に実行されるスレッドに共通の共有された実行パイプライン13や、インターリーブ方法で(例えば、ラウンドロビン方法で)共有されたパイプラインを通じて実行するための並列スレッドをスケジュールするためのスケジューラ24も含む。処理装置10は、多数のスレッドに共通の共有された命令メモリ12と、これもまた多数のスレッドに共通の共有されたデータメモリ22とに接続される。
【0041】
実行パイプライン13は、フェッチステージ14と、復号ステージ16と、命令セットアーキテクチャによって定義されるような、算術および論理演算、アドレス計算、ロードおよびストア操作ならびに他の動作を実行することができる実行ユニットを含む実行ステージ18とを含む。
【0042】
コンテキストレジスタ26の各セットは、対応する1つまたは複数の制御レジスタを含み、制御レジスタは、それぞれのスレッドに対する少なくともプログラムカウンタ(PC)を含み(スレッドが現在実行し命令アドレスを追跡するため)、また、実施形態では、対応するスレッドの現在の状態(スレッドが現在実行されているかまたは一時停止しているかなど)を記録する1つまたは複数の制御状態レジスタ(CSR)のセットも含む。また、コンテキストレジスタファイル26の各セットは、それぞれのスレッドによって実行される命令のオペランド(すなわち、実行される際にそれぞれのスレッドの命令のオペコードによって定義された動作に基づいて操作される値または定義された動作から生じる値)を一時的に保持するためのオペランドレジスタのそれぞれのセットも含む。レジスタ26の各セットは、1つまたは複数のレジスタファイルにおいて実装することができる。
【0043】
フェッチステージ14は、複数のコンテキストの各々のコンテキストのプログラムカウンタ(PC)へアクセスできる。対応するスレッドのそれぞれに対し、フェッチステージ14は、プログラムカウンタによって示されたプログラムメモリ12の次のアドレスからそのスレッドの次の命令をフェッチする。プログラムカウンタは、分岐命令によって分岐されない限り、各実行サイクルを自動的にインクリメントする。次いで、フェッチステージ14は、フェッチした命令を復号のために復号ステージ16に渡し、次いで、復号ステージ16は、命令を実行するために、命令において指定されたいかなるオペランドレジスタの復号化されたアドレスと共に、復号化された命令を実行ユニット18に渡す。実行ユニット18は、オペランドレジスタおよび制御状態レジスタへアクセスできる。実行ユニットは、算術命令の場合のように、復号化されたレジスタアドレスに基づいて命令を実行するときに、そのオペランドレジスタおよび制御状態レジスタを用いてもよい(例えば、2つのオペランドレジスタの値の加算、乗算、減算または除算を行い、対応するスレッドの別のオペランドレジスタに結果を出力する)。あるいは、命令がメモリアクセス(ロードまたはストア)を定義する場合は、実行ユニット18のロード/ストアロジックは、命令に従って、データメモリからそれぞれのスレッドのオペランドレジスタに値をロードするか、または、それぞれのスレッドのオペランドレジスタからデータメモリ22に値を格納する。
【0044】
フェッチステージ14は、スケジューラ24の制御の下で、実行される命令を命令メモリ12からフェッチ可能に接続される。スケジューラ24は、時間スロットの繰り返しシーケンスにおいて次々と並列に実行しているスレッドのセットの各々から命令をフェッチするようにフェッチステージ14を制御するように構成され、従って、間もなくさらに詳細に論じられるように、パイプライン13のリソースを多数の時間的にインターリーブされた時間スロットに分割する。例えば、スケジューリングスキームは、ラウンドロビンまたは重み付けラウンドロビンであり得る。そのような方法で動作するプロセッサに対する別の用語は、バレルスレッドプロセッサである。
【0045】
スケジューラ24によって実装されるインターリーブスキームの例は、
図2に示されている。ここでは、並列スレッドは、ラウンドロビンスキームに従ってインターリーブされ、それにより、スキームの各ラウンド内では、ラウンドは、時間スロットのシーケンスS0、S1、S2…SJ−1(例えば、J=4またはJ=6)に分割され、各スロットは、それぞれのスレッドを実行するためのものである。典型的には、各スロットは、1つの実行サイクルの長さであり、異なるスロットが均等にサイズ指定されるが、すべての可能な実施形態において必ずしもそうであるとは限らず、例えば、1回の実行ラウンド当たりいくつかのスレッドが他のスレッドより多くのサイクルを獲得する重み付けラウンドロビンスキームも可能である。一般に、バレルスレッドは、均一なラウンドロビンまたは重み付けラウンドロビンスケジュールを採用することができ、後者の場合、重み付けは、固定することも、適応化させることもできる。
【0046】
1回の実行ラウンド当たりのシーケンスが何であれ、このパターンは繰り返され、各ラウンドは、複数の時間スロットの各々の対応するインスタンスを含む。従って、本明細書で言及される場合は、時間スロットは、シーケンスにおける繰り返し割り当てられる場所を意味し、シーケンスの特定の繰り返しにおける時間スロットの特定のインスタンスを意味しないことに留意されたい。別の言い方をすれば、スケジューラ24は、パイプライン13の実行サイクルを多数の時間的にインターリーブされた(時分割多重化)実行チャネルに分配し、各実行チャネルは、時間スロットの繰り返しシーケンスにおけるそれぞれの時間スロットの再現を含む。示される実施形態では、4つの時間スロットが存在しているが、これは単なる例示を目的としており、他の数も可能である。例えば、好ましい一実施形態では、実際に、6つの時間スロットが存在する。
【0047】
実施形態では、コンテキストレジスタ26は、並列に実行することができるJ個の数のスレッド(示される例では、J=3であるが、これに限定されない)の各々に対するワーカーコンテキストレジスタCX0…CX(J−1)のそれぞれのセットと、1つの追加のスーパーバイザコンテキストレジスタファイルCXSとを含む。ワーカーコンテキストレジスタファイルは、ワーカースレッドのコンテキストを保持し、スーパーバイザコンテキストレジスタファイルは、スーパーバイザスレッドのコンテキストを保持する。実施形態では、スーパーバイザコンテキストは、ワーカーの各々とは異なる数のレジスタを有することに留意されたい。従って、処理装置10は、時間スロットよりも1つ多いコンテキストレジスタファイル26を含む(すなわち、処理装置10は、バレルスレッドが可能なインターリーブされた時間スロットの数よりも1つ多いコンテキストをサポートする)。
【0048】
ワーカーコンテキストCX0…CXJ−1の各々は、プログラマが望むアプリケーション特有の演算タスクは何でも実行するために、J(例えば、4)個の実行時間スロットS0…SJ−1のうちの1つに現在割り当てられている複数のワーカースレッドのそれぞれの状態を表すために使用される(この場合もやはり、このワーカーコンテキストは、命令メモリ12に格納されるようなプログラムのワーカースレッドの総数の単なるサブセットであってもよいことに留意されたい)。追加のコンテキストCXSは、「スーパーバイザスレッド」(SV)の状態を表すために使用される。スーパーバイザスレッドの役割は、実行しようとするワーカースレッドWを、全プログラムのどのポイントにおいて、どの時間スロットS0、S1、S2・・・に割り当てるかという意味で少なくとも、ワーカースレッドの実行を調整することにある。その他、スーパーバイザスレッドは、外部の交換またはバリア同期の実行などのような他の「オーバーシーア(overseer)」または調整責任を有してもよい。当然ながら、J=4の上記事例は、例示を目的とする実装形態の単なる一例であることに留意されたい。例えば、別の実装形態では、J=6(6つの時間スロット、6つのワーカーコンテキストおよび1つのスーパーバイザコンテキスト)である。
【0049】
図3を参照すると、実施形態では、スーパーバイザスレッドSVは、インターリーブされた実行時間スロットのスキームにそれ自体の時間スロットを有さない。また、ワーカースレッドへのスロットの割り当ては柔軟に定義されるため、ワーカーも同様である。むしろ、各時間スロットは、ワーカーコンテキストを格納するためのコンテキストレジスタのそれ自体のセットを有し、そのセットは、ワーカーによって、スロットがワーカーに割り当てられる際に使用されるが、スロットがスーパーバイザに割り当てられる際には使用されない。所定のスロットがスーパーバイザに割り当てられる際は、そのスロットは代わりに、スーパーバイザのコンテキストレジスタファイルCXSを使用する。スーパーバイザは、常に、それ自体のコンテキストへのアクセスを有し、ワーカーは、スーパーバイザコンテキストレジスタファイルCXSを占有することはできない。
【0050】
スーパーバイザスレッドSVは、ありとあらゆる時間スロットS0…S3(またはより一般的にはS0…SJ−1)において動作する能力を有する。スケジューラ24は、プログラムが全体として開始されると、スーパーバイザスレッドを時間スロットのすべてに割り当てることで開始するよう、すなわち、スーパーバイザSVがS0…SJ−1のすべてにおいて動作を開始するように構成される。しかし、スーパーバイザスレッドには、後続のある時点で(すぐにまたは1つもしくは複数のスーパーバイザタスクを実行した後に)、実行しているスロットの各々をワーカースレッドのそれぞれに(例えば、
図3に示される例では、最初にワーカーW0…W3(またはより一般的にはW0…WJ−1)に)一時的に委ねるためのメカニズムが提供される。これは、命令メモリ12のワーカースレッドのアドレスをオペランドとして少なくとも取る実行(run)命令を実行するスーパーバイザスレッドによって達成される。ワーカースレッドは、互いに並列に実行することができるコードの部分であり、その各々は、実行される1つまたは複数のそれぞれの演算タスクを表す。
【0051】
実行命令は、この命令自体が実行されている現在の時間スロットを、オペランドによって指定されたワーカースレッドに委ねるように、スケジューラ24に作用する。実行命令では、委ねられるものが、この命令が実行される時間スロットであることは暗黙的であることに留意されたい(機械語命令の文脈では、暗黙的であるということは、オペランドがこれを指定する必要がないということ、すなわち、オペコード自体から暗黙のうちに理解されていることを意味する)。従って、渡される時間スロットは、スーパーバイザが実行命令を実行する時間スロットである。
【0052】
スーパーバイザスレッドSVは、ワーカースレッドW0…WJ−1の異なるそれぞれのワーカースレッド(命令メモリ12の可能なワーカースレッドのより大きなセットから選択される)にその時間スロットのいくつかまたはすべてを渡すために、複数の時間スロットのうちの1つまたは複数の他の時間スロットの各々において同様の動作を実行する。最後のスロットに対してそのように行われた時点で、スーパーバイザは、中断される(次いで、後に、スロットのうちの1つがワーカーWから返された際に、中断したところから再開される)。従って、スーパーバイザスレッドSVは、各々が1つまたは複数のタスクを実行する異なるワーカースレッドを、インターリーブされた実行時間スロットS0…SJ−1(例えば、示されるようにJ=4、または、J=6)の異なるインターリーブされた実行時間スロットに割り当てることができる。ワーカースレッドを実行する時間であるとスーパーバイザスレッドが決定すると、スーパーバイザスレッドは、実行命令を使用して、実行命令が実行された時間スロットにこのワーカーを割り当てる。
【0053】
いくつかの実施形態では、命令セットは、「すべてを実行する(run-all)」という実行命令の変形形態も含み得る。この命令は、複数のワーカーのセットを共に起動するために使用され、すべてが同じコードを実行する。実施形態では、この命令は、処理装置のスロットS0…S3(またはより一般的にはS0…S(J−1))内のワーカーを1つ残らず起動する。
【0054】
いったん起動されると、現在割り当てられているワーカースレッドW0…WJ−1の各々は、それぞれの実行命令によって指定されたコードにおいて定義された1つまたは複数の演算タスクの実行に進む。次いで、この実行の終了時には、それぞれのワーカースレッドは、実行している時間スロットをスーパーバイザスレッドに返す。これは、それぞれのワーカースレッドにおいて終了(exit)命令を実行することによって達成される。終了命令は、この命令自体が実行されている現在の時間スロットをスーパーバイザスレッドに戻すように、スケジューラ24に作用する。それに応答して、スケジューラ24は、そのスロットにおいてスーパーバイザの実行を続ける。
【0055】
図4は、実行ユニット18およびコンテキストレジスタ26の詳細を含むプロセッサ4のさらなる例示的な詳細を示す。コンテキストレジスタ26は、ワーカーMコンテキストおよびスーパーバイザコンテキストの各々に対するそれぞれのメインレジスタファイル(MRF)26Mを含む。コンテキストレジスタは、ワーカーコンテキストの各々に対する対応する補助レジスタファイル(ARF)26Aをさらに含む。コンテキストレジスタ26は、共通の重みレジスタファイル(WRF)26Wをさらに含み、共通の重みレジスタファイル(WRF)26Wは、現在実行しているワーカースレッドのすべてがアクセスして読み出すことができる。WRFは、スーパーバイザスレッドがWRFに書き込むことができる唯一のスレッドであるという点で、スーパーバイザコンテキストと関連付けることができる。また、コンテキストレジスタ26は、スーパーバイザおよびワーカーコンテキスト(図示せず)の各々に対する制御状態レジスタの対応するグループも含んでいてもよい。実行ユニット18は、ロード/ストアユニット(LSU)55、整数演算論理ユニット(IALU)56および浮動小数点演算ユニット(FPU)59を含む。
【0056】
J個のインターリーブされた時間スロットS0…SJ−1の各々では、スケジューラ24は、命令メモリ12から、現在の時間スロットに対応するJ個の命令バッファ(図示せず)のそれぞれに、対応するスレッドの少なくとも1つの命令をフェッチするようにフェッチステージ14を制御する。実施形態では、各時間スロットは、プロセッサの1つの実行サイクルであるが、他のスキーム(例えば、重み付けラウンドロビン)も除外されない。プロセッサ4の各実行サイクル(すなわち、プログラムカウンタ時間を記録するプロセッサクロックの各サイクル)では、フェッチステージ14は、実装形態に応じて、単一の命令または小さな「命令バンドル」(例えば、2命令バンドルまたは4命令バンドル)をフェッチする。次いで、各命令が、復号ステージ16を介して、命令がメモリアクセス命令であるか、整数演算命令であるか、浮動小数点演算命令であるかに応じてそれぞれ(そのオペコードに従って)、LSU 55、IALU 56またはFPU 59のうちの1つに発行される。実施形態では、LSU 55およびIALU 56は、MRF 26Mからのレジスタを使用してそれらの命令を実行し、MRF 26M内の特定のレジスタは、命令のオペランドによって指定される。FPU 59は、ARF 26AおよびWRF 26Wのレジスタを使用して演算を実行し、ARF内の特定のレジスタは、命令のオペランドによって指定される。実施形態では、WRFのレジスタは、命令タイプにおいて暗黙的であってもよい(すなわち、その命令タイプに対して事前に決定される)。
【0057】
各ワーカースレッドコンテキストは、メインレジスタファイル(MRF)26Mおよび補助レジスタファイル(ARF)26Aのインスタンス(すなわち、バレルスレッドスロットの各々に対して1つのMRFおよび1つのARF)を有する。MRFまたはARFに関連してここで説明される機能は、コンテキスト別に動作するものと理解されたい。しかし、実施形態では、スレッド間で共有される単一の共有の重みレジスタファイル(WRF)が存在する。各スレッドは、コンテキスト26のMRFおよびARFのみにアクセスすることができる。しかし、現在実行しているワーカースレッドはすべて、共通のWRFにアクセスすることができる。従って、WRFは、すべてのワーカースレッドによる使用のための重みの共通のセットを提供する。実施形態では、スーパーバイザのみがWRFに書き込むことができ、ワーカーは、WRFから読み取ることしかできない。
【0058】
プロセッサ4の命令セットは、少なくとも1つのタイプのロード(load)命令を含む。その命令のオペコードは、実行されると、LSU55に対して、データメモリ22からロード命令が実行されていたスレッドの対応するARF26Aにデータをロードさせる。ARF内の送信先は、ロード命令のオペランドによって指定される。ロード命令の別のオペランドは、それぞれのMRF 26Mのアドレスレジスタを指定し、それぞれのMRF 26Mのアドレスレジスタは、データをロードするためのデータメモリ22のアドレスへのポインタを保持する。また、プロセッサ4の命令セットは、少なくとも1つのタイプのストア(store)命令も含む。ストア命令のオペコードは、実行されると、LSU55に対して、ストア命令が実行されていたスレッドの対応するARFからデータメモリ22へデータを格納させる。ARF内のストアの送信元は、ストア命令のオペランドによって指定される。ストア命令の別のオペランドは、MRFのアドレスレジスタを指定し、MRFのアドレスレジスタは、データを格納するためのデータメモリ22のアドレスへのポインタを保持する。一般に、命令セットは、別個のロードおよびストア命令タイプ、ならびに/あるいは、1つもしくは複数のロード操作および/または1つもしくは複数のストア操作を組み合わせて単一の命令にした少なくとも1つのロード/ストア命令タイプを含んでいてもよい。
【0059】
また、プロセッサ4の命令セットは、算術演算を実行するための1つまたは複数のタイプの算術命令も含む。例えば、これらの命令のタイプは、加算および乗算命令、ブール論理命令などを含んでいてもよい。各算術命令は、それぞれのスレッドのレジスタファイル26のうち1つまたは複数の送信元レジスタを指定する1つまたは複数の送信元オペランドと、対応するスレッドのレジスタファイル26のうち1つまたは複数の送信先レジスタを指定する1つまたは複数の送信先オペランドとを取る。算術命令は、実行されると、1つまたは複数の送信元レジスタからの1つまたは複数の送信元オペランド値に基づいて算術演算を実行し、結果を送信先レジスタに入れる。送信元オペランド値は、1つまたは複数の以前のロードまたはロード/ストア命令によって送信元オペランドレジスタにロードされている。結果は、1つまたは複数の後続のストアまたはロード/ストア命令によって送信先レジスタから保存される。算術命令は、好ましくは、1つまたは複数の浮動小数点演算命令を含み、その命令の1つまたは複数の送信元オペランド値は、浮動小数点値であり、その命令の1つまたは複数の結果は、浮動小数点値である。浮動小数点演算命令は、FPU 59によって実行される。実施形態では、FPU 59は、算術命令の送信元および送信先レジスタに対してARF 26Aを使用するように構成される。すなわち、送信元および送信先オペランドによるARF内のレジスタの場所の指定は暗黙的である(事前に決定される)。また、実施形態では、命令セットは、IALU 56によって実行される1つまたは複数の整数演算命令も含み得る。実施形態では、これらの整数演算命令は、MRF 26Mの送信元および送信先レジスタを使用する。
【0060】
本明細書で開示されるある実施形態によれば、浮動小数点演算命令は、共通の重みレジスタファイルWRF 26Wを利用する少なくとも1つのタイプを含んでもよい。このタイプの命令は、算術命令が実行されたスレッドの対応するARF 26Aの対応する算術演算の少なくとも1つの送信元を指定する少なくとも1つのオペランドを取る。しかし、算術命令の少なくとも1つの他の送信元は、共通のWRFにあり、すべてのワーカースレッドに共通である。好ましくは、この送信元は、問題の算術命令において暗黙的である(すなわち、このタイプの算術命令に対して暗黙的である)。機械語命令の意味において、暗黙的であるということは、オペランドが指定する必要がないことを意味する。すなわち、この事例では、WRFの送信元の場所は、オペコードに固有のものである(その特定のオペコードに対して事前に決定される)。オペコードに応答して、FPU 59は、オペコードによって指定されたように算術演算を実行し、算術演算は、スレッドのそれぞれのARFの指定された送信元レジスタおよびWRFの暗黙的な送信元レジスタの値に基づいて演算することを含む。また、算術ユニットは、算術命令の送信先オペランドによって明示的に指定されるように、スレッドのそれぞれのARFの送信先レジスタへの算術演算の結果の出力も行う。
【0061】
共通のWRF 26Wの暗黙的な送信元を採用することができる算術命令の例示的なタイプは、1つもしくは複数のベクトル乗算命令タイプ、1つもしくは複数の行列乗算命令タイプ、1つもしくは複数の累積ベクトル乗算命令タイプおよび/または累積行列乗算命令タイプ(命令のあるインスタンスから次のインスタンスまで乗算の結果を累計する)ならびに/あるいは1つもしくは複数の畳み込み命令タイプを含んでいてもよい。例えば、ベクトル乗算命令タイプは、ARF 26Aからの明示的な入力ベクトルにWRFからの既定の重みベクトルを乗じることができる。あるいは、行列乗算命令タイプは、ARFからの明示的な入力ベクトルにWRFからの既定の重み行列を乗じることができる。別の例として、畳み込み命令タイプは、ARFからの入力行列にWRFからの既定の行列を畳み込むことができる。多数のスレッドに共通の共有の重みレジスタファイルWRFを有することにより、各スレッドは、それ自体の対応するデータに共通のカーネルを乗じるかまたは畳み込むことができる。これは機械学習アプリケーションにおいて、例えば、各スレッドがニューラルネットワークの異なるノードを表し、共通のカーネルが検索または訓練されている特徴(例えば、グラフィカルデータのエリアまたはボリュームのエッジまたは特定の形状)を表す場合に、多く現れるシナリオであるため、これは有益である。
【0062】
実施形態では、WRF 26Wの値は、スーパーバイザスレッドによって書き込むことができる。スーパーバイザ(実施形態では、すべてのスロットS0・・・SMにおいて実行することによって開始される)は、最初に、いくつかの共通の重み値をWRFの既定の場所に書き込むために、一連のプット(put)命令を実行する。次いで、スーパーバイザは、スロットS0…SJ−1のうちのいくつかまたはすべてのそれぞれのワーカーを起動するための命令を実行する(またはすべての命令を実行する)。次いで、各ワーカーは、上記で論じられるタイプの1つまたは複数の算術命令の1つまたは複数のインスタンスを含み、それにより、対応するARF 26Aにロードされると、対応する入力データに対して対応する算術演算を実行する(ただし、スーパーバイザによってWRF 26Wに書き込まれた共通の重みを使用して)。各スレッドがそのそれぞれのタスクを終了すると、各ワーカーは、そのスロットをスーパーバイザに返すために、終了命令を実行する。起動されたすべてのスレッドがそれらの対応するタスクを終了すると、スーパーバイザは、新しい値をWRFに書き込み、新しいスレッドセットを起動することができる(または、新しいセットを起動して、WRFの既存の値の使用を続けることができる)。
【0063】
「メイン」、「補助」および「重み」という修飾語は必ずしも限定的でないことが理解されよう。実施形態では、それらの修飾語は、最初のレジスタファイル(1つのワーカーコンテキスト当たり)、2番目のレジスタファイル(1つのワーカーコンテキスト当たり)および共有された3番目のレジスタファイル(例えば、スーパーバイザコンテキストの一部であるが、すべてのワーカーがアクセス可能である)のいずれかであってもよい。ARF 26Aおよび補助実行ユニット18Aは、算術命令(または少なくとも浮動小数点演算)のために使用されるため、算術レジスタファイルおよび算術実行ユニットと呼ぶこともできる。MRF 26Mおよびメイン実行ユニット18Mは、それらの使用のうちの1つがメモリにアクセスするためのものであるため、メモリアドレスレジスタファイルおよびロード/ストアユニットと呼ぶこともできる。重みレジスタファイル(WRF)26Wは、間もなくさらに詳細に論じられるように、一定の1つまたは複数のタイプの算術命令で使用される乗法重みを保持するために使用されるため、そのように呼ばれる。例えば、これらの重みレジスタファイル(WRF)26Wは、ニューラルネットワークのノードの重みを表すために使用することができる。別の方法で見ると、MRFは、整数オペランドを保持するために使用されるため、整数レジスタファイルと呼ぶことができ、ARFは、浮動小数点オペランドを保持するために使用されるため、浮動小数点レジスタファイルと呼ぶことができる。しかし、代替の実施形態では、レジスタ空間26は、必ずしもこれらの異なる目的のためにこれらの別個のレジスタファイルに分割されるとは限らないことに留意されたい。代わりに、メインおよび補助実行ユニットを通じて実行される命令は、同じ共有されたレジスタファイルの中から、レジスタを指定することができる場合がある(マルチスレッドプロセッサの場合には、1つのコンテキスト当たり1つのレジスタファイル)。
【0064】
実施形態では、プロセッサ4は、プロセッサの1つもしくは複数の他の例および/またはネットワークインタフェースもしくはネットワーク接続記憶装置(NAS)デバイスなどの外部のデバイスと共に接続することができる。
図5に示されるように、実施形態では、プロセッサ4は、相互接続プロセッサタイルのアレイ6のうち1つを形成することができ、各タイルは、より広いプログラムの一部を実行する。従って、個々のプロセッサ4(タイル)は、より広いプロセッサまたは処理システム6の一部を形成する。タイル4は、相互接続サブシステム34を介して、共に接続することができる。タイル4は、同じチップ(すなわち、ダイ)上、異なるチップ上またはそれらの組合せ(すなわち、アレイは、各々が複数のタイル4を含む複数のチップにて形成することができる)で実装することができる。従って、相互接続システム34および交換インタフェース51は、内部(オンチップ)相互接続メカニズムおよび/または外部(インターチップ)交換メカニズムを相応に含んでいてもよい。
【0065】
マルチスレッドおよび/またはマルチタイルプロセッサまたはシステムの例示的なアプリケーションの1つでは、複数のスレッドおよび/またはタイル4にわたって実行されるプログラムは、ニューラルネットワークの訓練および/またはニューラルネットワークに基づく推論の実行を行うように構成されたアルゴリズムなどの機械知能アルゴリズムを含む。そのような実施形態では、各ワーカースレッド、各タイル上で実行されるプログラムの一部または各タイル上の各ワーカースレッドは、ニューラルネットワーク(グラフのタイプ)の異なるノード102を表すために使用され、それに従って、スレッド間および/またはタイル間の通信は、グラフのノード102間のエッジ104を表す。これは、
図6に示されている。
【0066】
機械知能は、機械知能アルゴリズムが知識モデルを学習する学習段階から始まる。モデルは、相互接続ノード(すなわち、頂点)102およびエッジ(すなわち、リンク)104のグラフを含む。グラフの各ノード102は、1つまたは複数の入力エッジと、1つまたは複数の出力エッジとを有する。ノード102のいくつかの入力エッジのいくつかは、ノード102の他のいくつかの出力エッジであり、それにより、ノードが互いに接続され、グラフが形成される。さらに、ノード102の1つまたは複数の入力エッジの1つまたは複数は、全体としてのグラフへの入力を形成し、ノード102の1つまたは複数の出力エッジの1つまたは複数は、全体としてのグラフの出力を形成する。さらに、所定のノードは、グラフへの入力、グラフからの出力および他のノードとの接続のすべてを有するものであってもよい。各エッジ104は、値又はテンソル(n次元行列)を伝達し、これらは、ノード102の入力エッジに提供される入力を形成するか、又は、出力エッジから提供される出力を形成する。
【0067】
各ノード102は、その1つまたは複数の入力エッジにおいて受信される1つまたは複数の入力についての関数を表し、この関数の結果は、1つまたは複数の出力エッジにおいて提供される出力である。各関数は、1つまたは複数の対応するパラメータ(重みと呼ばれる場合もあるが、必ずしも乗法重みである必要はない)によってパラメータ化される。一般に、異なるノード102によって表される関数は、関数の異なる形態であることおよび/または異なるパラメータによってパラメータ化することが可能である。
【0068】
さらに、各ノードの関数の1つまたは複数のパラメータの各々は、対応する誤差値によって特徴付けられる。さらに、対応する条件は、各ノード102のパラメータの誤差と関連付けることができる。単一のパラメータによってパラメータ化された関数を表すノード102の場合、条件は、簡単な閾値であってもよく、すなわち、条件は、誤差が指定閾値内にある場合に満たされるが、誤差が閾値を超える場合には満たされない。複数の対応するパラメータによってパラメータ化されたノード102の場合、誤差の許容レベルに達したそのノード102に対する条件は、より複雑なものであってもよい。例えば、条件は、そのノード102のパラメータの各々がそれぞれの閾値内に収まる場合にのみ満たされてもよい。別の例として、同じノード102に対する異なるパラメータの誤差を組み合わせた組合せ計量を定義することができ、条件は、組合せ計量の値が指定閾値内に収まるという条件によって満たされてもよいが、そうでなければ、条件は、組合せ計量の値が閾値を超える場合は満たされない(あるいは、計量の定義に応じて、その逆も同様である)。条件が何であれ、これにより、ノードのパラメータの誤差が許容度の一定のレベルまたは程度を下回るかどうかの尺度が得られる。一般に、任意の適切な計量を使用することができる。条件または計量は、すべてのノードに対して同じものでも、異なるそれぞれのノードに対して異なるものでもよい。
【0069】
学習段階では、アルゴリズムは、経験データ(すなわち、グラフへの入力の異なる可能な組合せを表す複数のデータポイント)を受信する。多くの経験データが受信されるにつれて、アルゴリズムは、パラメータの誤差をできうる限り最小化するよう、経験データに基づいて、グラフの様々なノード102のパラメータを段階的に調節する。目標は、所定の入力に対してグラフの出力が所望の出力にできる限り近くなるようなパラメータの値を見出すことである。グラフが全体としてそのような状態に向かう傾向となったときに、グラフは収束したと言える。適切な収束度が得られた後、グラフは、予測または推論を実行するため(すなわち、何らかの所定の入力に対する結果を予測するかまたは何らかの所定の出力に対する原因を推論するため)に使用することができる。
【0070】
学習段階は、多くの異なる可能な形態を取ることができる。例えば、教師ありアプローチ(supervised approach)では、入力経験データは、訓練データ(すなわち、既知の出力に対応する入力)の形態を取る。各データポイントを用いて、アルゴリズムは、所定の入力に対して出力が既知の出力により近くなるように、パラメータを調節することができる。後続の予測段階では、グラフは、入力クエリを近似予測出力にマッピングするために使用することができる(または、推論する場合は、その逆も同様である)。また、他の手法も可能である。例えば、教師なしアプローチ(unsupervised approach)では、1つの入力データ当たり1つの参照結果という概念は存在せず、代わりに、機械知能アルゴリズムは、出力データにおけるそれ自体の構造の識別を任される。あるいは、強化学習アプローチ(reinforcement approach)では、アルゴリズムは、入力経験データの各データポイントに対して少なくとも1つの可能な出力を試し、この出力が、正か否か(および、潜在的には、正または否の度合い)(例えば、勝つか負けるか、利益か損失かまたは同様のもの)が知らされる。多くの試行にわたり、アルゴリズムは、正の結果をもたらす入力を予測することができるように、グラフのパラメータを徐々に調節することができる。グラフを学習するための様々な手法およびアルゴリズムは、機械学習の当業者に知られている。
【0071】
本明細書で開示される技法の例示的なアプリケーションによれば、各ワーカースレッドは、ニューラルネットワークなどの機械知能グラフのノード102のそれぞれの個々のノードと関連付けられた演算を実行するようにプログラムされる。この場合、ノード102間のエッジ104の少なくともいくつかは、スレッド間のデータの交換に相当するものであってもよいし、タイル間の交換に関与するものであってもよい。1つのタイル4当たり複数のスレッドを有するマルチタイル構成6の場合、各タイル4は、グラフのサブグラフを実行する。各サブグラフは、1つまたは複数のスーパーバイザスレッドを含むスーパーバイザサブプログラムと、それぞれのサブグラフのノード102を表すワーカースレッドのセットとを含む。
【0072】
図7は、本開示の実施形態による、有利な繰り返しキャッシュメカニズムの例示的な実装形態を示す。このメカニズムは、機械学習アプリケーションにおいて見出すことができるが、そのようなアプリケーションに限定されない。メカニズムは、プロセッサ4の命令セットの繰り返し命令(「rpt」)を提供することに基づく。繰り返し命令の機能は、a)繰り返し命令を実行する最初のスレッドが、それ自体のコードの部分をキャッシュし、このコードの部分を繰り返すのみならず、b)繰り返し命令を実行する次のスレッドもまた、最初のスレッドからキャッシュされたコードの部分を繰り返すように構成される。従って、メモリ12から再フェッチすることなく、複数のスレッドにわたって同じコードを再利用し、複製することができる。実施形態では、複数の異なるスレッドにおいて同じコードが再利用され、各スレッドは、対応するレジスタファイル26(例えば、それ自体のそれぞれのARF 26A)の対応するオペランド値に基づいて動作する。
【0073】
本発明者は、機械学習およびニューラルネットワークの分野では、各スレッドがグラフ(例えば、ニューラルネットワーク)の異なるノードを表し、ノードのいくつかが同じ演算プロセスのいくつかまたはすべてを実行する場合において、スレッド間でコードを再利用する機会が生じることを確認した。例えば、いくつかのノードを表すスレッドは、それぞれの入力データに基づいて1つまたは複数の同じ動作を実行することができる。実際に、いくつかの場合、いくつかのノードのスレッドは、互いにいくつかの同じオペランド値に基づいて同じ動作を実行することができるが、個々のスレッドに特有の他のオペランドに基づいて動作することもできる。そのような例は、畳み込みの一部として実行されるベクトルまたは行列乗算であり、各スレッドの命令は、個々のスレッドに特有の入力データに、共通の重みのセット(スレッド間で共有される)を乗じる。この例は、畳み込みニューラルネットワークで発生しうる。多くのノードは、実際に、同じ重みを含むが、異なる接続を有する。各スレッドは、ある特徴を検出するためにそれぞれの入力データに共通の重みのカーネルを畳み込むなど、ニューラルネットワークの異なるノードの処理を実行するように構成することができる。
【0074】
そのようなシナリオでは、各スレッドがメモリから別々に再フェッチする必要なく、あるスレッドからのコードの部分を1つまたは複数の他のスレッドにおいて再利用することができるメカニズムを提供することが有利であり、それにより、スレッドが同じ動作のいくつかまたはすべてを実行するシナリオにおいて電力消費量が低減される。例えば、このメカニズムは、スレッド間で共有される1つまたは複数の共通の重みオペランドと個々のスレッドに特有の1つまたは複数のオペランドとの組合せに基づいて、同じ動作が各スレッドによって実行される予定のシナリオにおいて使用することができる。
【0075】
そのようなシナリオにおける繰り返しキャッシュの利点は、メモリ12からの命令フェッチはエネルギー消費が多いことである。例えば、ニューラルネットワークなどのアプリケーションにおける多くの内部ループ(例えば、それらのループは畳み込みのために使用される)は小さく(ほんの一握りの命令またはバンドル)、また、ワーカーは共通にそれら同じループを実行するため、小型、ローカル、かつエネルギー効率のよいキャッシュ31をタイル4内に実装することにより、これは、電力消費の機会を与えることになる。従って、すべてのワーカーは、同じコードに対し、エネルギー消費の多いフェッチをメモリに対して実行するのではなく、むしろ、その代わりによりエネルギー効率のよいキャッシュを使用できる。
【0076】
図7に示されるように、本開示によれば、プロセッサ4は、少なくとも繰り返しキャッシュ31を含む命令キャッシュを含む。繰り返しキャッシュ31は、多数のキャッシュされた命令を順番に一時的に保持するための一時的な格納エリア33を含む。また、繰り返しキャッシュ31は、キャッシュの状態を記録するための関連手段35も有し、状態は、キャッシュがスレッドの1つによって現在「要求されている(claimed)」(または「所有されている(owned)」)か否かの記録を少なくとも含む。この意味は、間もなく明らかになるであろう。状態35は、繰り返しキャッシュ31の内部状態(すなわち、1つまたは複数の内部ラッチの形態のハードウェア回路)として実装することができる。あるいは、状態35は、レジスタファイルのレジスタとして(例えば、スーパーバイザコンテキストなどのコンテキストのうちの1つの制御状態レジスタ28として)実装することができる。
【0077】
パイプライン13の命令フェッチステージ14は、命令メモリ12または繰り返しキャッシュ31のいずれかから命令をフェッチするように動作可能である。任意の所定の時間にどちらの命令供給源を使用するかは、間もなくさらに詳細に論じられるように、繰り返し命令およびそのオペランドに依存する。
【0078】
図7に示されるように、並列に実行することができるJ個のワーカースレッドの各々は、複数のJ個のセットのコンテキストレジスタ26(CX0…CXJ−1)のうちの対応するコンテキストレジスタ26に割り当てられ、各セットは、そのそれぞれのワーカーのプログラム状態を保持するように構成される。実施形態では、コンテキストレジスタ26の追加のセット(CXS)は、スーパーバイザスレッドのプログラム状態を保持するために提供される。コンテキストレジスタの各セットは、それぞれのスレッドの現在のPC値を保持するためのそれぞれのプログラムカウンタ(PC)21を含む。プログラムポインタは、その命令がフェッチされる対象となるスレッドのそれぞれのコードの現在のポイントを指定する。また、コンテキストレジスタの各セットは、それぞれのスレッドの命令による動作の基となるオペランドを一時的に保持するためのオペランドレジスタ32も含む。各ワーカースレッドのオペランドレジスタ32は、それぞれのスレッドのMRF 26MおよびARF 26Aを含んでもよい。スーパーバイザのオペランドレジスタ32は、WRF 26Wを含んでもよい。コンテキストレジスタの各セットは、現在一時停止しているかどうかなど、それぞれのスレッドのステータスを記録するためのそれぞれの1つまたは複数の制御状態レジスタ(CRS)28をさらに含んでもよい。
【0079】
各スレッドに対し、パイプライン13は、それぞれのプログラムカウンタ(PC)に従って命令メモリ12から命令をフェッチして実行することによって開始される。好ましい実施形態では、繰り返し命令(rpt)は、以下の構文を取り入れる。
Rpt $size,$count
【0080】
すなわち、繰り返し命令(rpt)は、繰り返しコードの部分のサイズを指定する繰り返しサイズオペランドと、その部分を繰り返す回数を指定する繰り返し回数オペランドとの2つのオペランドを取る。実施形態では、これらのオペランドは、レジスタを参照することによって、それらのそれぞれの値を指定する。すなわち、命令のオペランドフィールドに直接含まれる値は、実際の繰り返しサイズまたは繰り返し回数値のそれぞれを取る対象となるレジスタ$sizeまたは$count(例えば、それぞれのスレッドのMRF 26Mの)を識別する。しかし、その代替として、これらの繰り返しサイズオペランドおよび繰り返し回数オペランドの一方または両方は、即値オペランドであってもよい(すなわち、繰り返しサイズおよび/または繰り返し回数値は、直接符号化され、繰り返し命令の関連オペランドフィールドに埋め込まれる)。
【0081】
動作の際、実行ユニット18およびフェッチステージ14は、繰り返し命令に応答して、以下の通り動作するように構成される。rpt $size,$countを実行する最初のスレッドは、繰り返しキャッシュ31を要求する。この動作は、繰り返しキャッシュ31をロックするかまたは繰り返しキャッシュを「所有する」と言うこともできる。実際には、これは、実行ユニット18が、要求されているとマーク付けするように繰り返しキャッシュ31の状態35を設定することを意味する。その後、繰り返し命令を実行するいかなる後続のワーカーも、状態35がリセットされるまで、繰り返しキャッシュを要求することはできない(以下を参照)。
【0082】
ワーカーがrptを実行すると、この命令は、命令フェッチのための繰り返しキャッシュを参照する(look in)よう命令フェッチャロジック14に通知する。最初のワーカーにおける繰り返し命令の実行により、実行ユニット18は、コードの繰り返し命令の後に続く当該ワーカーのN個の命令または命令バンドルで繰り返しキャッシュ31を満たす。Nは、$sizeで指定される($sizeが繰り返しキャッシュの容量より大きくない場合。$sizeが繰り返しキャッシュの容量よりも大きければ、繰り返しボディの最初の部分のみが繰り返しキャッシュ31に格納される)。また、実行ユニット18は、命令をキャッシュしつつ、1回通してそれらの命令の実行も行う。その後、N個の命令の部分の終了直後に、フェッチステージ14は戻され、命令キャッシュ31の格納エリア33からのコードのフェッチを開始し、次いで、コードのキャッシュされた部分は、$countで指定されている回数だけ、そこから繰り返される。この動作は、それぞれのスレッドのプログラムカウンタPC 21を分岐することを伴っていてもよい。最後の繰り返しの終了後、プログラムは、コードのキャッシュされた部分の直後のポイントから続ける。
【0083】
その状態35に従って繰り返しキャッシュが依然として要求(ロック)されている間に、繰り返し命令の別のインスタンスが2番目のワーカースレッドの一部として実行される場合は、繰り返し命令の実行により、実行ユニット18は、2番目のスレッドに対して異なる機能を実行する。すなわち、フェッチステージ14は、命令キャッシュ31の格納エリア33からのコードのキャッシュされた部分(最初のスレッドからキャッシュされたコードの部分)のフェッチを開始するように制御される。次いで、実行ユニット18は、キャッシュされたコードのこの部分の実行を繰り返すが、その回数は、2番目のワーカースレッドのそれぞれの$countオペランドによって指定されたものである。
【0084】
従って、繰り返し命令は、ゼロオーバーヘッドループ設備を提供し、それにより、命令または実行バンドル(繰り返しボディ)の後続のシーケンスが繰り返し実行される。繰り返し回数は、即値としてまたは符号なしのレジスタ送信元値として提供することができる。繰り返しボディのサイズは、命令または実行バンドルの整数で表現され、即値によって提供される(例えば、繰り返しボディサイズは、(即値+1)実行である)。
【0085】
注:繰り返しキャッシュの検索は、依然として、二通りの状況で失敗し得る。第1の状況は、2番目のワーカーが繰り返し命令の異なるインスタンス(メモリの異なる場所に存在する)を実行し、従って、繰り返しループのボディがキャッシュ31にない場合である。この事例では、命令フェッチロジック14は、メモリ12からフェッチすると報告する。第2の状況は、繰り返しボディの長さが繰り返しキャッシュの容量を超えている場合であり、この事例では、繰り返しボディの最後尾は繰り返しキャッシュ内には見られず、依然として命令メモリ12からのフェッチを実行しなければならない。
【0086】
繰り返しキャッシュ31は、多くのワーカーコンテキストが同じタスクを実行している際に特に、例えば高度演算カーネル内側ループの間の、コードオーバーヘッドひいては電力消費量の低減を目的として、小さく、アーキテクチャ上では見えない(ほとんど見えない)命令キャッシュを提供する。キャッシュ31は、ワーカーコンテキストの間で共有され、実施形態では、繰り返し命令のインスタンスの繰り返しボディ内の命令またはバンドルをキャッシュするためにのみ特別に確保される。
【0087】
実施形態では、繰り返しキャッシュの格納エリア33は、多くの独立ラインからなり、各ラインは、命令(個々の命令発行の場合)または命令バンドル(プロセッサ4が共同発行された命令のバンドルを実行する場合)と同じサイズにサイズ指定される。各ラインは、有効または無効であってもよい。すべてのラインは、最初は無効である。実施形態では、実行バンドルは繰り返し命令の繰り返しボディ内にあるため、それらのバンドルは、好ましくは、タイルメモリにおいて位置合わせすべきでもある(例えば、8バイト単位で位置合わせされる)。
【0088】
繰り返しキャッシュ31は、ロックまたはアンロックされる。アンロック(初期の状態)の際、繰り返しキャッシュは、繰り返し命令のインスタンスを実行するワーカースレッド(ロックコンテキスト)の副作用としてロックされる。ワーカーコンテキストが繰り返し命令を実行する際に既に繰り返しキャッシュ31がロックされている場合は、この点において何の行動も起こさない。
【0089】
繰り返しキャッシュの要求(ロック)を再び取り除くことができるように状態35をリセットするためのメカニズムを実装する可能性は少なくとも2つある。
【0090】
第1の可能性は、繰り返しキャッシュを所有するワーカースレッドが繰り返しループの最後の命令を実行する際、繰り返しキャッシュ31はアンロックされ、すべてのライン33は無効とマーク付けされることである。ここでは、繰り返しキャッシュ31を現在使用している他のワーカーコンテキストはいずれも、繰り返しキャッシュ31というよりむしろ、メモリ12からコードをフェッチする。この動作には、どのワーカースレッド(またはむしろ、どのコンテキストもしくはどのスロット)が繰り返しキャッシュ31を要求したか(すなわち、どれが繰り返しキャッシュ31をロックするようにしたか)を記録するための手段が要求される。これは、キャッシュ31の内部状態の状態としてまたはレジスタファイル26のうちの1つのレジスタファイル26のレジスタにおいて実装することができる。
【0091】
第2の好ましい代替の可能性は、各コンテキスト(並列スレッドの各々またはスロットの各々)に対してフラグ41が保持されることである。例えば、この動作は、それぞれのコンテキストの制御状態レジスタ28のうちの1つにおいて実装することができる。繰り返しキャッシュがロックされた時点で、各ワーカースレッドに対して繰り返しキャッシュを使用する(ヒットする)ようにフラグが設定される。コンテキストがその繰り返しループの最後の命令を実行する度に、設定されている唯一のフラグがこのスレッドによって所有されているものである(すなわち、他のすべてのフラグはクリアされている)場合は、繰り返しキャッシュ31はアンロックされる。いずれにせよ、このスレッドによって所有されているフラグ41はクリアされる(すなわち、繰り返しキャッシュを使用している最後のコンテキストがその繰り返しループを終了すると、繰り返しキャッシュ31はアンロックされる)。
【0092】
注:どのスレッドがキャッシュ31を要求するかについて述べられているところでは、これは、並列スレッドのうちのどのスレッドか(すなわち、時間スロットおよびコンテキストレジスタ26の関連セットのうちの1つに現在割り当てられているものはどれか)を意味する。同等に、コンテキストレジスタ26(CX0…CXJ−1)のうちのどのコンテキストがキャッシュを要求するか、または、スロットS0…SJ−1のうちのどのスロットがキャッシュを要求するかと述べることができる。当技術分野では場合により、「コンテキスト」は、コンテキスト(プログラム状態の意味の)を保持しているレジスタ26のセット、それぞれのスレッドが実行するスロット、または、まさにスレッド、スロット、プログラム状態およびコンテキストレジスタの全構成に対する略語としても使用される。
【0093】
繰り返しキャッシュ31をロックすることにより、キャッシュフィル動作が開始される。すなわち、ロックされると、ロックコンテキストの繰り返しボディの先頭にある各連続実行命令またはバンドルの実行によって、i)その命令またはバンドルアドレスに単一のラインが割り当てられ、ii)割り当てられたラインに命令または実行バンドルデータが書き込まれ、iii)ラインが有効と設定される。繰り返しボディのサイズが繰り返しキャッシュの容量より大きい場合は、繰り返しボディの先頭にある実行バンドルのみがキャッシュされる。
【0094】
ロックの際、$count(ロックコンテキストの)の値が0になる(第1のリセットメカニズム)かまたは関連フラグがクリアされる(第2のリセットメカニズム)と、繰り返しキャッシュはアンロックされる。すべてのワーカーコンテキストに対し、$countがゼロではない(すなわち、ワーカーが繰り返しボディを実行している)ときは、命令フェッチメカニズムは、命令または実行バンドルアドレスに割り当てられた有効なラインの存在をチェックし、ヒットの場合は、タイルメモリからのフェッチを実行するというよりむしろ、キャッシュラインのコンテンツを使用する。
【0095】
実施形態では、最初に、繰り返し回数がゼロである場合は、繰り返し命令は、繰り返しボディ上の分岐として動作する。そうでなければ、後続の繰り返しボディ実行バンドルが$count回実行される。
【0096】
共同発行された命令のバンドルを実行する実施形態では、繰り返し命令と共に共同発行されたいかなる命令も、一度だけ実行され、繰り返しボディの一部ではない。
【0097】
実施形態では、繰り返しボディ内のあるタイプの命令を実行することができない場合がある。この場合には、そのような命令の実行の試みにおいて除外が発生する。
【0098】
上記の実施形態は単なる例示として説明されてきたことが理解されよう。
【0099】
例えば、代替の実装形態では、繰り返し命令の構文は、必ずしも繰り返しサイズオペランドを必要とするとは限らない。代わりに、キャッシュされた部分のサイズを固定する(暗黙的にする)ことも、他の何らかの状態の断片(例えば、スーパーバイザによって設定された繰り返しキャッシュの設定)によって指定することもできる。また、繰り返しボディのサイズは、繰り返しキャッシュのサイズと一致しなくともよいことにも留意されたい。
【0100】
あるいは、より複雑な実装形態では、キャッシュされた命令(繰り返しボディ)は、必ずしも繰り返し命令の直後の命令またはバンドルから始める必要はない。例えば、代わりに、繰り返し命令の構文は、繰り返しボディの開始および終了ポイントの指定を可能にすることができる。あるいは、別の例として、プロセッサは、ローリング方式で最後のM個の命令を継続的にキャッシュすることができ、次いで、繰り返し回数オペランドは、繰り返し命令につながるそれらのうちの最後のN個をキャッシュさせる(すなわち、繰り返し命令は、ループのボディの前というよりむしろ、ループのボディの後に実行することができる)。
【0101】
さらなる代替のまたは追加の変形形態では、プロセッサ4は、必ずしも繰り返しキャッシュ31に対する要求をリセットする(すなわち、繰り返しキャッシュをアンロックする)ための専用ハードウェアメカニズム41を必要とするとは限らない。代替の実装形態では、この要求は、ワーカーまたはスーパーバイザのうちの1つのソフトウェアによって明示的にリセットすることができる(例えば、このレジスタがレジスタファイルの書き込み可能なレジスタとして実装される場合、符号31などの繰り返しキャッシュにリンクされたレジスタに書き込むためのプット(put)命令を実行することによって)。
【0102】
さらに、本開示の範囲は、上記で説明されるアーキテクチャであり、そのアーキテクチャでは、スーパーバイザスレッドに対して別個のコンテキストが提供されるか、または、スーパーバイザスレッドは、スロットで実行し、次いで、そのスロットをワーカーに委ねる。スーパーバイザは、代わりに、汎用コンテキストを使用することができる。あるいは、別の構成では、例えば、スーパーバイザは、それ自体の専用スロットで実行することができる。さらに、実装形態は、スーパーバイザの役割さえも有するスレッドのうちの特定のものに限定されない。さらに、本開示の範囲は、タイルのアレイにおけるタイルであるプロセッサ4に限定されない。代替の実施形態では、プロセッサ4は、例えば、スタンドアロンプロセッサでも、単一チッププロセッサでもあり得る。
【0103】
実装形態は、別個のMRFおよびARFに限定されない。また、別個のWRFの使用にも限定されない。一般に、レジスタは、1つまたは複数のレジスタファイルのいずれからのものでもあり得、異なるメモリアクセスと算術演算との間で共有することも、分離することもできる。
【0104】
さらに、本開示の範囲は、機械学習アプリケーションに限定されない。コードオーバーヘッドを低減し、従って、コード密度を改善するために、スレッド間でコードを再利用することが望ましい他の多くのアプリケーションが存在する。
【0105】
開示される技法の他の変形形態または使用事例は、本明細書の本開示が与えられた時点で当業者に明らかになるであろう。本開示の範囲は、説明される実施形態による制限は受けず、添付の請求項による制限のみを受ける。