(57)【要約】【課題】マルチスレッドプロセッサの命令キャッシュを提供する。【解決手段】プロセッサの命令セットは、繰り返し回数オペランドを取る繰り返し命令を含む。繰り返しキャッシュが要求されておらず、繰り返し命令が最初のスレッドにおいて実行されるときは、コードの部分は、最初のスレッドから繰り返しキャッシュにキャッシュされ、繰り返しキャッシュの状態は繰り返しキャッシュが要求されていると記録されて更新され、キャッシュされたコードは、回数分だけ実行される。次いで、繰り返し命令がさらなるスレッドにおいて実行されると、コードの既にキャッシュされた部分は、繰り返しキャッシュから毎回、対応する回数だけ再び実行される。最初のおよびさらなる命令の各々に対し、それぞれの命令の繰り返し回数オペランドは、キャッシュされたコードを実行する回数を指定する。【選択図】図７
2020107306.tif 000002
【特許請求の範囲】
【請求項１】
命令セットにおいて定義される命令タイプのインスタンスを実行するように構成された実行ユニットであって、インターリーブされた時間スロットの繰り返しシーケンスのうち対応するシーケンスにおいて複数の並列スレッドの各々を実行するように構成されたバレルスレッド実行ユニットである実行ユニットと、
前記スレッドのうち１つによって現在要求されているか否かを記録する関連状態を有する繰り返しキャッシュと、
を含むプロセッサであって、
前記命令セットにおいて定義される前記命令のタイプは、繰り返し回数オペランドを取る繰り返し命令を含み、前記実行ユニットは、
ａ）前記繰り返しキャッシュが前記状態に従って現在要求されておらず、前記繰り返し命令の各インスタンスが前記スレッドのうち最初の対応するスレッドにおいて実行されるときは、前記最初のスレッドから前記繰り返しキャッシュにコードの部分をキャッシュし、前記状態を前記繰り返しキャッシュが要求されていると記録して修正し、前記繰り返しキャッシュから各連続繰り返しを取り出して対応する回数だけ前記コードの部分を実行することと、
ｂ）前記繰り返しキャッシュが前記状態に従って現在要求され、繰り返しキャッシュが再度要求されていないと前記状態が次にリセットされるまで、前記繰り返し命令の別のインスタンスが前記スレッドのうちのさらなる対応するスレッドのいずれかの一部として実行されるときは、前記コードのすでにキャッシュされた部分を、毎回前記繰り返しキャッシュから対応する回数だけ実行することと、
を行うように構成され、
前記最初のおよびさらなる命令の各々に対し、前記それぞれの命令の前記繰り返し回数オペランドが、前記コードの部分が実行される前記それぞれの回数を指定し、前記繰り返し回数オペランドが、前記コードの部分を実行する前記それぞれの回数に対して複数の正の整数値のいずれかを指定することができる、プロセッサ。
【請求項２】
前記コードの部分は、前記最初のスレッドの前記繰り返し命令の前記インスタンスに続く部分である、請求項１に記載のプロセッサ。
【請求項３】
前記繰り返し命令は、前記コードの部分のサイズを指定するための繰り返しサイズオペランドを取り、前記コードの部分は、前記最初のスレッドの前記繰り返し命令の前記インスタンスに続く事前に定義されたポイントから、前記最初のスレッドの前記繰り返し命令の前記それぞれのインスタンスの前記サイズオペランドによって定義された後続のポイントまで実行する、請求項２に記載のプロセッサ。
【請求項４】
前記繰り返し回数オペランドは、さらにゼロの値を取ることができ、前記繰り返し回数がゼロの場合は、前記繰り返し命令が、前記最初のスレッドを含めて、前記それぞれのスレッドの前記コードの部分の実行の省略を前記実行ユニットに行わせる、請求項１〜３のいずれか一項に記載のプロセッサ。
【請求項５】
前記繰り返し回数が１の場合は、前記繰り返し命令が、繰り返すことなく一度だけ、前記それぞれのスレッドの一部として、前記コードの部分の実行を前記実行ユニットに行わせる、請求項１〜４のいずれか一項に記載のプロセッサ。
【請求項６】
前記繰り返し回数オペランドは即値オペランドである、および／または、前記繰り返しサイズオペランドは即値オペランドである、請求項１〜５のいずれか一項に記載のプロセッサ。
【請求項７】
前記繰り返し回数オペランドは、前記それぞれの回数を読み取る対象となるレジスタを参照することによって、前記コードの部分を実行する前記それぞれの回数を指定する、および／または、
前記繰り返しサイズオペランドが、前記サイズを読み取る対象となるレジスタを参照することによって、前記サイズを指定する、請求項１〜６のいずれか一項に記載のプロセッサ。
【請求項８】
前記最初のおよびさらなるスレッドのうちの少なくとも１つがそのそれぞれの回数だけ前記コードのキャッシュされた部分の実行を完了した時点で、前記繰り返しキャッシュが再び要求されていないと記録して前記状態を自動的にリセットするハードウェアメカニズムを含む、請求項１〜７のいずれか一項に記載のプロセッサ。
【請求項９】
前記メカニズムは、前記最初のスレッドが対応する回数だけ前記コードのキャッシュされた部分の実行を完了したときに、前記状態を自動的にリセットするように構成される、請求項８に記載のプロセッサ。
【請求項１０】
前記メカニズムは、最初のおよびさらなる全てのスレッドが対応する回数だけ前記コードのキャッシュされた部分の実行を完了したときに、前記繰り返しキャッシュに対する前記要求を自動的にクリアするように構成される、請求項８に記載のプロセッサ。
【請求項１１】
コンテキストレジスタの複数のセットを含み、各セットは、前記並列スレッドのうちの対応するスレッドのプログラム状態を保持するように構成され、
前記実行ユニットは、前記最初のおよびさらなるスレッドのうち対応するスレッドの前記繰り返し命令に応答して、コードの前記同じ部分を実行するが、対応するスレッドの対応するコンテキストレジスタの１つまたは複数のセットにおいて保持されている対応する１つまたは複数の対応するオペランド値に基づいて動作するように構成される、請求項１〜１０のいずれか一項に記載のプロセッサ。
【請求項１２】
前記並列スレッドは、複数のワーカースレッドを含み、前記実行ユニットは、少なくともいくつかの時間に、前記ワーカースレッドを管理するように構成された少なくとも１つのスーパーバイザスレッドを含むスーパーバイザサブプログラムを実行するようにさらに構成される、請求項１１に記載のプロセッサ。
【請求項１３】
前記コンテキストレジスタは、並列に実行することができる前記ワーカースレッドの各々に対するコンテキストレジスタの前記セットのうち対応するセットと、前記スーパーバイザサブプログラムのプログラム状態を保持するように構成されたコンテキストレジスタの追加のセットとを含む、請求項１２に記載のプロセッサ。
【請求項１４】
前記スーパーバイザサブプログラムは、最初に前記スロットのすべてにおいて動作することによって開始し、次いで、前記スーパーバイザサブプログラムが最初に動作していた前記スロットのいくつかまたはすべてを対応する前記ワーカースレッドに委ねることによって前記ワーカースレッドを起動するように構成される、請求項１３に記載のプロセッサ。
【請求項１５】
前記命令セットは、実行命令を含み、前記実行命令は、前記スーパーバイザサブプログラムの一部として実行されると、前記実行命令が実行された前記スロットを前記ワーカースレッドのうちの１つに委ね、前記スーパーバイザサブプログラムの代わりに、前記ワーカースレッドがそのスロットにおいて起動される、請求項１４に記載のプロセッサ。
【請求項１６】
前記命令セットは、終了命令を含み、前記終了命令は、前記ワーカースレッドのうちの１つの一部として実行されると、前記終了命令が実行された前記スロットを前記スーパーバイザサブプログラムに返し、前記ワーカースレッドの代わりに、前記スーパーバイザサブプログラムがそのスロットにおいて再び実行を続ける、請求項１５に記載のプロセッサ。
【請求項１７】
前記コードの部分の前記命令のうち少なくとも１つは、ｉ）コンテキストレジスタの対応するセットにおける少なくとも１つのレジスタからのオペランド値と、ｉｉ）前記ワーカースレッドに共通のオペランドレジスタのセットにおける少なくとも１つのレジスタからのオペランド値と、の組合せに基づいて動作するタイプのものである、請求項１１〜１６のいずれか一項に記載のプロセッサ。
【請求項１８】
共有されたレジスタファイルの前記セットは、前記スーパーバイザサブプログラムのみが共通のレジスタの前記セットに値を書き込むことができ、前記ワーカースレッドは、共通のレジスタの前記セットから読み取ることしかできないように構成される、請求項１２〜１６のいずれか一項に記載の請求項１７に記載のプロセッサ。
【請求項１９】
コンピュータ可読記憶装置上で具体化されるコンピュータプログラムであって、請求項１〜１８のいずれか一項に記載のプロセッサ上で実行するように構成されたコードを含み、前記コードが前記スレッドを含み、前記スレッドの少なくともいくつかが、前記スレッドのうちの少なくとも１つが前記スレッドのうちの別のものによって前記繰り返しキャッシュにキャッシュされた前記コードの部分を再利用するように構成された前記繰り返し命令のインスタンスを含む、コンピュータプログラム。
【請求項２０】
請求項１〜１８のいずれか一項に記載されたプロセッサを操作する方法であって、前記実行ユニットを通じて前記プロセッサ上で前記スレッドを含むプログラムを実行するステップを含み、前記スレッドの少なくともいくつかが、前記スレッドのうちの少なくとも１つが前記スレッドのうちの別のものによって前記繰り返しキャッシュにキャッシュされた前記コードの部分を再利用するように構成された前記繰り返し命令のインスタンスを含む、方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、マルチスレッドプロセッサにおいて機械語の部分をキャッシュするための命令キャッシュに関する。
【背景技術】
【０００２】
グラフィックス処理装置（ＧＰＵ）およびデジタル信号プロセッサ（ＤＳＰ）などの特定のアプリケーション用に設計されたプロセッサの開発への関心が高まってきている。最近関心を集めた別のタイプのアプリケーション特有のプロセッサは、出願人によって「ＩＰＵ（ｉｎｔｅｌｌｉｇｅｎｃｅ  ｐｒｏｃｅｓｓｉｎｇ  ｕｎｉｔ）」（知能処理装置）と呼ばれる機械知能アプリケーション専用のものである。これらは、例えば、ニューラルネットワークなどの知識モデルを訓練するかまたは知識モデルの訓練を補助するため、あるいは、そのようなモデルに基づいて予測もしくは推論を実行するかまたは予測もしくは推論の実行を補助するために、ホストによって割り当てられた仕事を実行するように構成されたアクセラレータプロセッサとして採用することができる。
【０００３】
機械知能アルゴリズムは、複数の相互接続ノードのグラフによって表すことができる「知識モデル」への反復更新を実行することに基づく。各ノードは、その入力の関数を表す。ノードは、グラフへの入力を受信するものもあれば、１つまたは複数の他のノードからの入力を受信するものもある一方で、ノードの出力は、他のノードの入力を形成するものもあれば、グラフの出力を提供するものもある（いくつかの事例では、所定のノードは、これらのグラフへの入力、グラフからの出力および他のノードとの接続のすべてを有するものさえもあり得る）。さらに、各ノードにおける関数は、１つまたは複数のそれぞれのパラメータ（例えば、重み）によってパラメータ化される。学習段階では、経験に基づく入力データセットに基づいて、グラフが全体として、可能な入力の範囲に対して所望の出力を生成するように、様々なパラメータに対する値を見出すことを目的とする。この学習を行うための様々なアルゴリズムは、確率的勾配降下法に基づく誤差逆伝播アルゴリズムなど、当技術分野において知られている。入力データに基づく複数の反復にわたり、パラメータは、それらの誤差を減少するように徐々に調節され、グラフは、解に向けて収束する。次いで、後続の段階では、学習済みのモデルを使用して、指定された入力セットに与えられる出力の予測を行うこと、または、指定された出力セットに与えられる入力（原因）に関する推論を行うことができる。
【０００４】
各ノードは、データ処理と、ノード間で交換されるデータに対応するグラフの相互接続により実現される。典型的には、各ノードの処理の少なくともいくつかは、グラフの他のノードの一部またはすべてとは独立して実行することができ、大きなグラフは、並列処理の大きな機会に触れることになる。
【０００５】
従って、機械知能アプリケーション用に設計されたプロセッサは、複数のプログラムスレッドの並列実行のサポートを含み得る。このサポートは、典型的には、各スレッドに対するコンテキストレジスタのそれぞれのセットを含み、各セットは、並列に実行される複数のスレッドのうち対応するスレッドのプログラム状態（「コンテキスト」）を保持するために使用される。所定のスレッドのコンテキストレジスタに保持されるプログラム状態は、典型的には、そのスレッドに対するプログラムカウンタと、スレッドの状態（例えば、一時停止している、動作しているなど）を記録する１つまたは複数の制御状態レジスタと、それぞれのスレッドの算術命令に基づいて操作される値およびそれぞれのスレッドの算術命令によって出力される値を一時的に保持するための算術オペランドレジスタを含む複数のオペランドレジスタとを含む。異なる並列スレッドは、それぞれの実行時間スロットにおいて共通の実行パイプラインを通じて時間的にインターリーブ（interleave）され、各スロットは、コンテキストレジスタのセットのうち対応するコンテキストレジスタのレジスタのみを利用する。
【０００６】
別の手法では、機械知能用に設計されたプロセッサは、複数の並列実行ユニットを含んでもよく、各並列実行ユニットは、別個のパイプラインを含む（すなわち、インターリーブされたことを意味する並列処理とは対照的な真の並列処理）。プロセッサは、タイルのアレイに分割することができ、各タイルは、それ自体の実行ユニットと、その実行ユニットにより使用されるメモリとを含む。このようにして、並列処理モジュールのアレイが、同じチップ上で、または、複数のチップにわたって広がって実装される。プロセッサは、この構成を並列手法と組み合わせることもできる（すなわち、複数の並列スレッドを実行するように各タイルが構成される複数のタイルのアレイを含めるため）。
【発明の概要】
【課題を解決するための手段】
【０００７】
ここでは、複数の異なるスレッドが同じコードを実行することが望ましい状況が起こり得ると認識される。そのような例としては、各スレッドが異なるそれぞれのノードの処理を実行する機械学習アプリケーションがある。この場合、いくつかのノードは、実際に、同じ演算のいくつかを実行することができると認識される。そのようなすべてのノードのスレッドによってこのコードをメモリから別々にフェッチする必要がなくなれば、電力消費量を節約できると考えられる。同様の論点は、異なる並列プロセスが同じ動作のいくつかまたはすべてを含む他のアプリケーションでも起こり得る。
【０００８】
本明細書で開示される一態様によれば、命令セットにおいて定義される命令タイプのインスタンスを実行するように構成された実行ユニットであって、インターリーブされた時間スロットの繰り返しシーケンスのそれぞれにおいて複数の並列スレッドの各々を実行するように構成されたバレルスレッド実行ユニットである実行ユニットと、繰り返しキャッシュがスレッドのうち１つによって現在要求されているか否かを記録する関連状態を有する繰り返しキャッシュと、を含むプロセッサが提供される。命令セットにおいて定義される命令のタイプは、繰り返し回数オペランドを取る繰り返し（repeat）命令を含み、実行ユニットは、ａ）繰り返しキャッシュが上記状態に従って現在要求されておらず、繰り返し命令の各インスタンスが上記スレッドのうち最初の対応するスレッドにおいて実行されるときは、当該最初のスレッドから繰り返しキャッシュにコードの部分をキャッシュし、上記の状態を繰り返しキャッシュが要求されていると記録して修正し、繰り返しキャッシュから各連続繰り返しを取り出して対応する回数だけ上記コードの部分を実行することと、ｂ）繰り返しキャッシュが上記状態に従って現在要求され、再びその後、繰り返しキャッシュが再度要求されていないと上記の状態が次にリセットされるまで、繰り返し命令が上記スレッドのうちのさらなる対応するスレッドの一部として実行されるときは、コードのすでにキャッシュされた部分を、毎回繰り返しキャッシュから対応する回数だけ実行することと、を実行するように構成される。最初のおよびさらなる命令の各々に対し、それぞれの命令の繰り返し回数オペランドは、コードの部分が実行されるそれぞれの回数を指定し、繰り返し回数オペランドは、コードの部分を実行するそれぞれの回数に対して複数の正の整数値のいずれかを指定することができる。
【０００９】
従って、現在開示されているプロセッサは、有利には、あるメカニズムを提供し、そのメカニズムにより、最初のスレッドは、繰り返しキャッシュに基づいてそれ自体のコードを複数回再利用できるのみならず、さらなるスレッドもまた、最初のスレッドによって既にキャッシュされている同じコードを、メモリから別々にその同じコードをフェッチする必要なく、再利用することができる。
【００１０】
実施形態では、上記コードの部分は、最初のスレッドの繰り返し命令のインスタンスに続く部分であり得る。
【００１１】
実施形態では、繰り返し命令は、上記コードの部分のサイズを指定するための繰り返しサイズオペランドを取ることができ、上記コードの部分は、最初のスレッドの繰り返し命令のインスタンスに続く事前に定義されたポイントから、最初のスレッドの繰り返し命令のインスタンスのサイズオペランドによって定義された後続のポイントまで実行することができる。
【００１２】
繰り返しサイズオペランドは、上記事前に定義されたポイントに続く個々の命令の数の観点から、または、上記事前に定義されたポイントに続く命令バンドルの数の観点から（各バンドルは、多数の命令（例えば、１つの命令当たり２つまたは４つの命令）を含む）、サイズを指定することができる。
【００１３】
実施形態では、繰り返し回数オペランドは、ゼロの値を取ることができ、繰り返し回数がゼロの場合は、繰り返し命令は、最初のスレッドの場合を含めて、実行ユニットに対し、対応するスレッドのコードの部分の実行をスキップさせる。
【００１４】
実施形態では、繰り返し回数が１の場合、繰り返し命令は、実行ユニットに対して、繰り返すことなく一度だけ、対応するスレッドの一部として、コードの部分を実行させる。
【００１５】
実施形態では、繰り返し回数オペランドは即値オペランドであってもよい。および／または、繰り返しサイズオペランドは即値オペランドであってもよい。
【００１６】
実施形態では、繰り返し回数オペランドは、それぞれの回数を読み取る対象となるレジスタを参照することによって、コードの部分を実行する回数を指定することができる。および／または、繰り返しサイズオペランドは、サイズを読み取る対象となるレジスタを参照することによって、サイズを指定することができる。
【００１７】
実施形態では、プロセッサは、最初のおよびさらなるスレッドのうちの少なくとも１つが対応する回数だけコードのキャッシュされた部分の実行を完了した時点で、繰り返しキャッシュが再び要求されていないと記録して上記状態を自動的にリセットするハードウェアメカニズムを含んでもよい。
【００１８】
実施形態では、メカニズムは、最初のスレッドが対応する回数だけコードのキャッシュされた部分の実行を完了したときに、上記状態を自動的にリセットするように構成することができる。
【００１９】
あるいは、メカニズムは、最初のおよびさらなる全スレッドが対応する回数だけコードのキャッシュされた部分の実行を完了したときに、繰り返しキャッシュに対する要求を自動的にクリアするように構成することができる。
【００２０】
繰り返しキャッシュが要求されているかどうかを記録する繰り返しキャッシュの状態は、例えば、繰り返しキャッシュもしくは実行ユニットの内部状態（内部回路の１つもしくは複数のラッチ）として実装することができるか、またはその代替として、レジスタファイルのレジスタ（例えば、第１のスレッドもしくはスーパーバイザのコンテキストレジスタのうちの１つ、以下を参照）において実装することができる。
【００２１】
いくつかの場合、複数の異なるスレッドが同じコードを実行するが、異なるデータに基づいて動作することが望ましい場合がある。この場合もやはり、そのような例は、機械学習アプリケーションにおいて起こり得る。例えば、各スレッドが異なるそれぞれのノードの処理を実行する場合を再び考える。多くのノードは、実際に、同じプロセスを含み得るが、それ自体の対応する入力データに基づいて動作することが分かる。例えば、問題のノードが全く同じ機能を表すが、グラフの異なる入力接続（エッジ）を有する。
【００２２】
従って、実施形態では、プロセッサは、コンテキストレジスタの複数のセットを含んでもよく、各セットは、並列スレッドのうち対応するスレッドのプログラム状態を保持するように構成され、実行ユニットは、最初のおよびさらなるスレッドのうち各々のスレッドの繰り返し命令に応答して、コードの上記同じ部分を実行するが、対応するスレッドの対応するコンテキストレジスタの１つ又は複数のセットにおいて保持されている対応する１又は複数の対応するオペランドの値に基づいて動作するように構成することができる。
【００２３】
実施形態では、上記並列スレッドは、複数のワーカースレッドを含んでもよく、実行ユニットは、少なくともいくつかの時間に、ワーカースレッドを管理するように構成された少なくとも１つのスーパーバイザスレッドを含むスーパーバイザサブプログラムを実行するようにさらに構成することができる。
【００２４】
実施形態では、コンテキストレジスタは、並列に実行することができるワーカースレッドの各々に対するコンテキストレジスタのセットを含んでもよく、コンテキストレジスタの追加のセットは、スーパーバイザサブプログラムのプログラム状態を保持するように構成される。
【００２５】
実施形態では、スーパーバイザサブプログラムは、最初にスロットのすべてにおいて動作することによって開始し、次いで、スーパーバイザサブプログラムが最初に動作していたスロットのいくつかまたはすべてを対応するワーカースレッドに委ねることによってワーカースレッドを起動するように構成することができる。
【００２６】
実施形態では、命令セットは、実行（run）命令を含んでもよく、実行命令は、スーパーバイザサブプログラムの一部として実行されると、実行命令が実行されたスロットをワーカースレッドのうちの１つに委ね、スーパーバイザサブプログラムの代わりに、ワーカースレッドがそのスロットにおいて起動される。
【００２７】
実施形態では、命令セットは、終了（exit）命令を含んでもよく、終了命令は、ワーカースレッドのうちの１つの一部として実行されると、終了命令が実行されたスロットをスーパーバイザサブプログラムに返すようにし、ワーカースレッドの代わりに、スーパーバイザサブプログラムがそのスロットにおいて再び動作を続ける。
【００２８】
いくつかの場合、スレッドが実際にいくつかの同一のオペランド値だけでなく、別個のスレッドに特有のいくつかの他のオペランドに基づいても動作する応用が発生しうる。そのような例としては、各スレッドの命令が共通の重みのセット（スレッド間で共有される）と、別個のスレッドに特有の入力データとを乗算する畳み込みの一部として実行されるベクトルまたは行列乗算がある。この特定の例は、多くのノードが実際に同一の重みを有するが異なる接続を有する畳み込みニューラルネットワークで発生する場合がある。例えば、ある特徴を検出するためにそれぞれの入力データに共通の重みのカーネルを畳み込むなど、ニューラルネットワークの異なるノードの処理を実行するように各スレッドが構成されるシナリオを考える。そのようなシナリオでは、所定の算術命令を、スレッド間で共有される１つまたは複数の共通の重みオペランドと個々のスレッドに特有の１つまたは複数のオペランドとの組合せに基づいて動作、可能とするメカニズムを提供することが有利である。その論点は、決してニューラルネットワークに特有ではなく、いくつかの共有されたオペランド値およびいくつかのスレッド特有のオペランドを使用することになるいかなるアプリケーションにおいても生じ得る。
【００２９】
実施形態では、上記コードの部分の命令のうちの少なくとも１つは、ｉ）コンテキストレジスタの対応するセットにおける少なくとも１つのレジスタからのオペランド値と、ｉｉ）ワーカースレッドに共通のオペランドレジスタのセットにおける少なくとも１つのレジスタからのオペランド値との組合せに基づいて動作するタイプのものであってもよい。
【００３０】
実施形態では、共有されたレジスタファイルのセットは、スーパーバイザサブプログラムのみが共通のレジスタのセットに値を書き込むことができ、ワーカースレッドは、共通のレジスタのセットから読み取ることしかできないように構成することができる。
【００３１】
本発明の別の態様によれば、コンピュータ可読記憶装置上で具体化されるコンピュータプログラムであって、上記または本明細書の他の場所の任意の実施形態のプロセッサ上で実行するように構成されたコードであって、上記スレッドを含むコードであり、上記スレッドの少なくともいくつかが、スレッドのうちの少なくとも１つがスレッドのうちの別のものによって繰り返しキャッシュにキャッシュされたコードの部分を再利用するように構成された繰り返し命令のインスタンスを含む、コードを含む、コンピュータプログラムが提供される。
【００３２】
本発明の別の態様によれば、実行ユニットを通じてプロセッサ上で上記スレッドを含むプログラムを実行するステップを含む方法であって、スレッドの少なくともいくつかが、スレッドのうちの少なくとも１つがスレッドのうちの別のものによって繰り返しキャッシュにキャッシュされたコードの部分を再利用するように構成された繰り返し命令のインスタンスを含む、方法が提供される。
【００３３】
実施形態では、プログラムは、本明細書で開示される構成のいずれかに従って動作するようにさらに構成することができる。
【００３４】
本開示の実施形態を理解することを支援するため、および、そのような実施形態をどのように実施するかを示すため、単なる例示として、添付の図面を参照する。
【図面の簡単な説明】
【００３５】
【図１】例示的なマルチスレッドプロセッサの概略ブロック図である。
【図２】交互に起こる時間スロットのスキームを概略的に示す。
【図３】多数の交互に起こる時間スロットにおいて実行するスーパーバイザスレッドおよび多数のワーカースレッドを概略的に示す。
【図４】実施形態による、例示的なプロセッサのさらなる詳細を示す概略ブロック図である。
【図５】構成プロセッサのアレイを含むプロセッサの概略ブロック図である。
【図６】機械知能アルゴリズムにおいて使用されたグラフの概略図である。
【図７】本明細書で開示される実施形態による、例示的な繰り返しキャッシュを示す概略ブロック図である。
【発明を実施するための形態】
【００３６】
実施形態の詳細な説明
図１は、本開示の実施形態によるプロセッサ４の例を示す。プロセッサ４は、バレルスレッド処理装置の形態のマルチスレッド処理装置１０と、ローカルメモリ１１（すなわち、マルチタイルアレイの場合は同じタイル上、または、単一プロセッサチップの場合は同じチップ上）とを含む。バレルスレッド処理装置は、パイプラインの実行時間が、インターリーブされた時間スロットの繰り返しシーケンス（その各々は、所定のスレッドによって占有される）に分割されるタイプのマルチスレッド処理装置である。また、これは、間もなくさらに詳細に論じられるように、並列実行と呼ぶこともできる。メモリ１１は、命令メモリ１２およびデータメモリ２２（異なるアドレス可能メモリユニットまたは同じアドレス可能メモリユニットの異なる領域において実装することができる）を含む。命令メモリ１２は、処理装置１０によって実行される機械語を格納し、データメモリ２２は、実行コードによって処理されるデータと、実行コードによって出力されたデータ（例えば、そのような処理の結果として）の両方を格納する。
【００３７】
メモリ１２は、プログラムの複数の異なるスレッドを格納し、各スレッドは、所定の１つまたは複数のタスクを実行するための命令の対応するシーケンスを含む。本明細書で言及される命令は、単一のオペコードおよび０またはそれ以上のオペランドからなる機械語命令（すなわち、プロセッサの命令セットの基本命令のうちの１つのインスタンス）を意味することに留意されたい。実施形態では、プログラムは、多数のワーカースレッドと、１つまたは複数のスーパーバイザスレッドとして構造化することができるスーパーバイザサブプログラムとを含む。これらについては、間もなくさらに詳細に論じる。
【００３８】
マルチスレッドプロセッサは、典型的には並列的に、互いに並んで配置された複数のプログラムスレッドの実行が可能なプロセッサである。並列実行は、スレッドが、共通の実行パイプライン（またはパイプラインの少なくとも共通部分）を共有し、異なるスレッドが、繰り返しサイクルの異なるインターリーブされた時間スロットにおいて、この同じ共有された実行パイプラインを通じてインターリーブされることを意味する。これにより、パイプライン遅延を隠蔽する機会が増大するので、性能が向上する。プロセッサは、複数の異なるスレッドに共通の何らかのハードウェア（例えば、共通の命令メモリ、データメモリおよび／または実行ユニット）を含むが、マルチスレッドをサポートするため、プロセッサは、各スレッドに特有の何らかの専用ハードウェアも含む。
【００３９】
専用ハードウェアは、並列に実行することができるスレッドの少なくとも各々に対するコンテキストレジスタ２６の個別のセット（すなわち、サイクルの１スロット当たり１セット）を含む。マルチスレッドプロセッサについて述べる際、「コンテキスト」は、互いに並んで実行されている複数のスレッドのそれぞれのスレッドのプログラム状態（例えば、プログラムカウンタ値、ステータスおよび現在のオペランド値）を指す。コンテキストレジスタは、それぞれのスレッドのこのプログラム状態を表すためのそれぞれのレジスタを指す。レジスタファイルのレジスタは、レジスタアドレスが命令語においてビットとして固定されるという点で、一般的なメモリとは別個のものであり、メモリアドレスは、命令を実行することによって演算することができる。
【００４０】
処理装置１０内では、命令メモリ１２からのスレッドの複数の異なるスレッドを、単一の実行パイプライン１３を通じてインターリーブできる（ただし、典型的には、命令メモリに格納された全スレッドのサブセットのみが全プログラムの任意の所定のポイントにおいてインターリーブされうる）。マルチスレッド処理装置１０は、コンテキストレジスタ２６の多数のセットを含み、各セット２６は、並列に実行することができる複数のスレッドのうちの異なるそれぞれのスレッドの状態（コンテキスト）を表すように構成される。また、マルチスレッド処理装置１０は、並列に実行されるスレッドに共通の共有された実行パイプライン１３や、インターリーブ方法で（例えば、ラウンドロビン方法で）共有されたパイプラインを通じて実行するための並列スレッドをスケジュールするためのスケジューラ２４も含む。処理装置１０は、多数のスレッドに共通の共有された命令メモリ１２と、これもまた多数のスレッドに共通の共有されたデータメモリ２２とに接続される。
【００４１】
実行パイプライン１３は、フェッチステージ１４と、復号ステージ１６と、命令セットアーキテクチャによって定義されるような、算術および論理演算、アドレス計算、ロードおよびストア操作ならびに他の動作を実行することができる実行ユニットを含む実行ステージ１８とを含む。
【００４２】
コンテキストレジスタ２６の各セットは、対応する１つまたは複数の制御レジスタを含み、制御レジスタは、それぞれのスレッドに対する少なくともプログラムカウンタ（ＰＣ）を含み（スレッドが現在実行し命令アドレスを追跡するため）、また、実施形態では、対応するスレッドの現在の状態（スレッドが現在実行されているかまたは一時停止しているかなど）を記録する１つまたは複数の制御状態レジスタ（ＣＳＲ）のセットも含む。また、コンテキストレジスタファイル２６の各セットは、それぞれのスレッドによって実行される命令のオペランド（すなわち、実行される際にそれぞれのスレッドの命令のオペコードによって定義された動作に基づいて操作される値または定義された動作から生じる値）を一時的に保持するためのオペランドレジスタのそれぞれのセットも含む。レジスタ２６の各セットは、１つまたは複数のレジスタファイルにおいて実装することができる。
【００４３】
フェッチステージ１４は、複数のコンテキストの各々のコンテキストのプログラムカウンタ（ＰＣ）へアクセスできる。対応するスレッドのそれぞれに対し、フェッチステージ１４は、プログラムカウンタによって示されたプログラムメモリ１２の次のアドレスからそのスレッドの次の命令をフェッチする。プログラムカウンタは、分岐命令によって分岐されない限り、各実行サイクルを自動的にインクリメントする。次いで、フェッチステージ１４は、フェッチした命令を復号のために復号ステージ１６に渡し、次いで、復号ステージ１６は、命令を実行するために、命令において指定されたいかなるオペランドレジスタの復号化されたアドレスと共に、復号化された命令を実行ユニット１８に渡す。実行ユニット１８は、オペランドレジスタおよび制御状態レジスタへアクセスできる。実行ユニットは、算術命令の場合のように、復号化されたレジスタアドレスに基づいて命令を実行するときに、そのオペランドレジスタおよび制御状態レジスタを用いてもよい（例えば、２つのオペランドレジスタの値の加算、乗算、減算または除算を行い、対応するスレッドの別のオペランドレジスタに結果を出力する）。あるいは、命令がメモリアクセス（ロードまたはストア）を定義する場合は、実行ユニット１８のロード／ストアロジックは、命令に従って、データメモリからそれぞれのスレッドのオペランドレジスタに値をロードするか、または、それぞれのスレッドのオペランドレジスタからデータメモリ２２に値を格納する。
【００４４】
フェッチステージ１４は、スケジューラ２４の制御の下で、実行される命令を命令メモリ１２からフェッチ可能に接続される。スケジューラ２４は、時間スロットの繰り返しシーケンスにおいて次々と並列に実行しているスレッドのセットの各々から命令をフェッチするようにフェッチステージ１４を制御するように構成され、従って、間もなくさらに詳細に論じられるように、パイプライン１３のリソースを多数の時間的にインターリーブされた時間スロットに分割する。例えば、スケジューリングスキームは、ラウンドロビンまたは重み付けラウンドロビンであり得る。そのような方法で動作するプロセッサに対する別の用語は、バレルスレッドプロセッサである。
【００４５】
スケジューラ２４によって実装されるインターリーブスキームの例は、図２に示されている。ここでは、並列スレッドは、ラウンドロビンスキームに従ってインターリーブされ、それにより、スキームの各ラウンド内では、ラウンドは、時間スロットのシーケンスＳ０、Ｓ１、Ｓ２…ＳＪ−１（例えば、Ｊ＝４またはＪ＝６）に分割され、各スロットは、それぞれのスレッドを実行するためのものである。典型的には、各スロットは、１つの実行サイクルの長さであり、異なるスロットが均等にサイズ指定されるが、すべての可能な実施形態において必ずしもそうであるとは限らず、例えば、１回の実行ラウンド当たりいくつかのスレッドが他のスレッドより多くのサイクルを獲得する重み付けラウンドロビンスキームも可能である。一般に、バレルスレッドは、均一なラウンドロビンまたは重み付けラウンドロビンスケジュールを採用することができ、後者の場合、重み付けは、固定することも、適応化させることもできる。
【００４６】
１回の実行ラウンド当たりのシーケンスが何であれ、このパターンは繰り返され、各ラウンドは、複数の時間スロットの各々の対応するインスタンスを含む。従って、本明細書で言及される場合は、時間スロットは、シーケンスにおける繰り返し割り当てられる場所を意味し、シーケンスの特定の繰り返しにおける時間スロットの特定のインスタンスを意味しないことに留意されたい。別の言い方をすれば、スケジューラ２４は、パイプライン１３の実行サイクルを多数の時間的にインターリーブされた（時分割多重化）実行チャネルに分配し、各実行チャネルは、時間スロットの繰り返しシーケンスにおけるそれぞれの時間スロットの再現を含む。示される実施形態では、４つの時間スロットが存在しているが、これは単なる例示を目的としており、他の数も可能である。例えば、好ましい一実施形態では、実際に、６つの時間スロットが存在する。
【００４７】
実施形態では、コンテキストレジスタ２６は、並列に実行することができるＪ個の数のスレッド（示される例では、Ｊ＝３であるが、これに限定されない）の各々に対するワーカーコンテキストレジスタＣＸ０…ＣＸ（Ｊ−１）のそれぞれのセットと、１つの追加のスーパーバイザコンテキストレジスタファイルＣＸＳとを含む。ワーカーコンテキストレジスタファイルは、ワーカースレッドのコンテキストを保持し、スーパーバイザコンテキストレジスタファイルは、スーパーバイザスレッドのコンテキストを保持する。実施形態では、スーパーバイザコンテキストは、ワーカーの各々とは異なる数のレジスタを有することに留意されたい。従って、処理装置１０は、時間スロットよりも１つ多いコンテキストレジスタファイル２６を含む（すなわち、処理装置１０は、バレルスレッドが可能なインターリーブされた時間スロットの数よりも１つ多いコンテキストをサポートする）。
【００４８】
ワーカーコンテキストＣＸ０…ＣＸＪ−１の各々は、プログラマが望むアプリケーション特有の演算タスクは何でも実行するために、Ｊ（例えば、４）個の実行時間スロットＳ０…ＳＪ−１のうちの１つに現在割り当てられている複数のワーカースレッドのそれぞれの状態を表すために使用される（この場合もやはり、このワーカーコンテキストは、命令メモリ１２に格納されるようなプログラムのワーカースレッドの総数の単なるサブセットであってもよいことに留意されたい）。追加のコンテキストＣＸＳは、「スーパーバイザスレッド」（ＳＶ）の状態を表すために使用される。スーパーバイザスレッドの役割は、実行しようとするワーカースレッドＷを、全プログラムのどのポイントにおいて、どの時間スロットＳ０、Ｓ１、Ｓ２・・・に割り当てるかという意味で少なくとも、ワーカースレッドの実行を調整することにある。その他、スーパーバイザスレッドは、外部の交換またはバリア同期の実行などのような他の「オーバーシーア（overseer）」または調整責任を有してもよい。当然ながら、Ｊ＝４の上記事例は、例示を目的とする実装形態の単なる一例であることに留意されたい。例えば、別の実装形態では、Ｊ＝６（６つの時間スロット、６つのワーカーコンテキストおよび１つのスーパーバイザコンテキスト）である。
【００４９】
図３を参照すると、実施形態では、スーパーバイザスレッドＳＶは、インターリーブされた実行時間スロットのスキームにそれ自体の時間スロットを有さない。また、ワーカースレッドへのスロットの割り当ては柔軟に定義されるため、ワーカーも同様である。むしろ、各時間スロットは、ワーカーコンテキストを格納するためのコンテキストレジスタのそれ自体のセットを有し、そのセットは、ワーカーによって、スロットがワーカーに割り当てられる際に使用されるが、スロットがスーパーバイザに割り当てられる際には使用されない。所定のスロットがスーパーバイザに割り当てられる際は、そのスロットは代わりに、スーパーバイザのコンテキストレジスタファイルＣＸＳを使用する。スーパーバイザは、常に、それ自体のコンテキストへのアクセスを有し、ワーカーは、スーパーバイザコンテキストレジスタファイルＣＸＳを占有することはできない。
【００５０】
スーパーバイザスレッドＳＶは、ありとあらゆる時間スロットＳ０…Ｓ３（またはより一般的にはＳ０…ＳＪ−１）において動作する能力を有する。スケジューラ２４は、プログラムが全体として開始されると、スーパーバイザスレッドを時間スロットのすべてに割り当てることで開始するよう、すなわち、スーパーバイザＳＶがＳ０…ＳＪ−１のすべてにおいて動作を開始するように構成される。しかし、スーパーバイザスレッドには、後続のある時点で（すぐにまたは１つもしくは複数のスーパーバイザタスクを実行した後に）、実行しているスロットの各々をワーカースレッドのそれぞれに（例えば、図３に示される例では、最初にワーカーＷ０…Ｗ３（またはより一般的にはＷ０…ＷＪ−１）に）一時的に委ねるためのメカニズムが提供される。これは、命令メモリ１２のワーカースレッドのアドレスをオペランドとして少なくとも取る実行（run）命令を実行するスーパーバイザスレッドによって達成される。ワーカースレッドは、互いに並列に実行することができるコードの部分であり、その各々は、実行される１つまたは複数のそれぞれの演算タスクを表す。
【００５１】
実行命令は、この命令自体が実行されている現在の時間スロットを、オペランドによって指定されたワーカースレッドに委ねるように、スケジューラ２４に作用する。実行命令では、委ねられるものが、この命令が実行される時間スロットであることは暗黙的であることに留意されたい（機械語命令の文脈では、暗黙的であるということは、オペランドがこれを指定する必要がないということ、すなわち、オペコード自体から暗黙のうちに理解されていることを意味する）。従って、渡される時間スロットは、スーパーバイザが実行命令を実行する時間スロットである。
【００５２】
スーパーバイザスレッドＳＶは、ワーカースレッドＷ０…ＷＪ−１の異なるそれぞれのワーカースレッド（命令メモリ１２の可能なワーカースレッドのより大きなセットから選択される）にその時間スロットのいくつかまたはすべてを渡すために、複数の時間スロットのうちの１つまたは複数の他の時間スロットの各々において同様の動作を実行する。最後のスロットに対してそのように行われた時点で、スーパーバイザは、中断される（次いで、後に、スロットのうちの１つがワーカーＷから返された際に、中断したところから再開される）。従って、スーパーバイザスレッドＳＶは、各々が１つまたは複数のタスクを実行する異なるワーカースレッドを、インターリーブされた実行時間スロットＳ０…ＳＪ−１（例えば、示されるようにＪ＝４、または、Ｊ＝６）の異なるインターリーブされた実行時間スロットに割り当てることができる。ワーカースレッドを実行する時間であるとスーパーバイザスレッドが決定すると、スーパーバイザスレッドは、実行命令を使用して、実行命令が実行された時間スロットにこのワーカーを割り当てる。
【００５３】
いくつかの実施形態では、命令セットは、「すべてを実行する（run-all）」という実行命令の変形形態も含み得る。この命令は、複数のワーカーのセットを共に起動するために使用され、すべてが同じコードを実行する。実施形態では、この命令は、処理装置のスロットＳ０…Ｓ３（またはより一般的にはＳ０…Ｓ（Ｊ−１））内のワーカーを１つ残らず起動する。
【００５４】
いったん起動されると、現在割り当てられているワーカースレッドＷ０…ＷＪ−１の各々は、それぞれの実行命令によって指定されたコードにおいて定義された１つまたは複数の演算タスクの実行に進む。次いで、この実行の終了時には、それぞれのワーカースレッドは、実行している時間スロットをスーパーバイザスレッドに返す。これは、それぞれのワーカースレッドにおいて終了（exit）命令を実行することによって達成される。終了命令は、この命令自体が実行されている現在の時間スロットをスーパーバイザスレッドに戻すように、スケジューラ２４に作用する。それに応答して、スケジューラ２４は、そのスロットにおいてスーパーバイザの実行を続ける。
【００５５】
図４は、実行ユニット１８およびコンテキストレジスタ２６の詳細を含むプロセッサ４のさらなる例示的な詳細を示す。コンテキストレジスタ２６は、ワーカーＭコンテキストおよびスーパーバイザコンテキストの各々に対するそれぞれのメインレジスタファイル（ＭＲＦ）２６Ｍを含む。コンテキストレジスタは、ワーカーコンテキストの各々に対する対応する補助レジスタファイル（ＡＲＦ）２６Ａをさらに含む。コンテキストレジスタ２６は、共通の重みレジスタファイル（ＷＲＦ）２６Ｗをさらに含み、共通の重みレジスタファイル（ＷＲＦ）２６Ｗは、現在実行しているワーカースレッドのすべてがアクセスして読み出すことができる。ＷＲＦは、スーパーバイザスレッドがＷＲＦに書き込むことができる唯一のスレッドであるという点で、スーパーバイザコンテキストと関連付けることができる。また、コンテキストレジスタ２６は、スーパーバイザおよびワーカーコンテキスト（図示せず）の各々に対する制御状態レジスタの対応するグループも含んでいてもよい。実行ユニット１８は、ロード／ストアユニット（ＬＳＵ）５５、整数演算論理ユニット（ＩＡＬＵ）５６および浮動小数点演算ユニット（ＦＰＵ）５９を含む。
【００５６】
Ｊ個のインターリーブされた時間スロットＳ０…ＳＪ−１の各々では、スケジューラ２４は、命令メモリ１２から、現在の時間スロットに対応するＪ個の命令バッファ（図示せず）のそれぞれに、対応するスレッドの少なくとも１つの命令をフェッチするようにフェッチステージ１４を制御する。実施形態では、各時間スロットは、プロセッサの１つの実行サイクルであるが、他のスキーム（例えば、重み付けラウンドロビン）も除外されない。プロセッサ４の各実行サイクル（すなわち、プログラムカウンタ時間を記録するプロセッサクロックの各サイクル）では、フェッチステージ１４は、実装形態に応じて、単一の命令または小さな「命令バンドル」（例えば、２命令バンドルまたは４命令バンドル）をフェッチする。次いで、各命令が、復号ステージ１６を介して、命令がメモリアクセス命令であるか、整数演算命令であるか、浮動小数点演算命令であるかに応じてそれぞれ（そのオペコードに従って）、ＬＳＵ  ５５、ＩＡＬＵ  ５６またはＦＰＵ  ５９のうちの１つに発行される。実施形態では、ＬＳＵ  ５５およびＩＡＬＵ  ５６は、ＭＲＦ  ２６Ｍからのレジスタを使用してそれらの命令を実行し、ＭＲＦ  ２６Ｍ内の特定のレジスタは、命令のオペランドによって指定される。ＦＰＵ  ５９は、ＡＲＦ  ２６ＡおよびＷＲＦ  ２６Ｗのレジスタを使用して演算を実行し、ＡＲＦ内の特定のレジスタは、命令のオペランドによって指定される。実施形態では、ＷＲＦのレジスタは、命令タイプにおいて暗黙的であってもよい（すなわち、その命令タイプに対して事前に決定される）。
【００５７】
各ワーカースレッドコンテキストは、メインレジスタファイル（ＭＲＦ）２６Ｍおよび補助レジスタファイル（ＡＲＦ）２６Ａのインスタンス（すなわち、バレルスレッドスロットの各々に対して１つのＭＲＦおよび１つのＡＲＦ）を有する。ＭＲＦまたはＡＲＦに関連してここで説明される機能は、コンテキスト別に動作するものと理解されたい。しかし、実施形態では、スレッド間で共有される単一の共有の重みレジスタファイル（ＷＲＦ）が存在する。各スレッドは、コンテキスト２６のＭＲＦおよびＡＲＦのみにアクセスすることができる。しかし、現在実行しているワーカースレッドはすべて、共通のＷＲＦにアクセスすることができる。従って、ＷＲＦは、すべてのワーカースレッドによる使用のための重みの共通のセットを提供する。実施形態では、スーパーバイザのみがＷＲＦに書き込むことができ、ワーカーは、ＷＲＦから読み取ることしかできない。
【００５８】
プロセッサ４の命令セットは、少なくとも１つのタイプのロード（load）命令を含む。その命令のオペコードは、実行されると、ＬＳＵ５５に対して、データメモリ２２からロード命令が実行されていたスレッドの対応するＡＲＦ２６Ａにデータをロードさせる。ＡＲＦ内の送信先は、ロード命令のオペランドによって指定される。ロード命令の別のオペランドは、それぞれのＭＲＦ  ２６Ｍのアドレスレジスタを指定し、それぞれのＭＲＦ  ２６Ｍのアドレスレジスタは、データをロードするためのデータメモリ２２のアドレスへのポインタを保持する。また、プロセッサ４の命令セットは、少なくとも１つのタイプのストア（store）命令も含む。ストア命令のオペコードは、実行されると、ＬＳＵ５５に対して、ストア命令が実行されていたスレッドの対応するＡＲＦからデータメモリ２２へデータを格納させる。ＡＲＦ内のストアの送信元は、ストア命令のオペランドによって指定される。ストア命令の別のオペランドは、ＭＲＦのアドレスレジスタを指定し、ＭＲＦのアドレスレジスタは、データを格納するためのデータメモリ２２のアドレスへのポインタを保持する。一般に、命令セットは、別個のロードおよびストア命令タイプ、ならびに／あるいは、１つもしくは複数のロード操作および／または１つもしくは複数のストア操作を組み合わせて単一の命令にした少なくとも１つのロード／ストア命令タイプを含んでいてもよい。
【００５９】
また、プロセッサ４の命令セットは、算術演算を実行するための１つまたは複数のタイプの算術命令も含む。例えば、これらの命令のタイプは、加算および乗算命令、ブール論理命令などを含んでいてもよい。各算術命令は、それぞれのスレッドのレジスタファイル２６のうち１つまたは複数の送信元レジスタを指定する１つまたは複数の送信元オペランドと、対応するスレッドのレジスタファイル２６のうち１つまたは複数の送信先レジスタを指定する１つまたは複数の送信先オペランドとを取る。算術命令は、実行されると、１つまたは複数の送信元レジスタからの１つまたは複数の送信元オペランド値に基づいて算術演算を実行し、結果を送信先レジスタに入れる。送信元オペランド値は、１つまたは複数の以前のロードまたはロード／ストア命令によって送信元オペランドレジスタにロードされている。結果は、１つまたは複数の後続のストアまたはロード／ストア命令によって送信先レジスタから保存される。算術命令は、好ましくは、１つまたは複数の浮動小数点演算命令を含み、その命令の１つまたは複数の送信元オペランド値は、浮動小数点値であり、その命令の１つまたは複数の結果は、浮動小数点値である。浮動小数点演算命令は、ＦＰＵ  ５９によって実行される。実施形態では、ＦＰＵ  ５９は、算術命令の送信元および送信先レジスタに対してＡＲＦ  ２６Ａを使用するように構成される。すなわち、送信元および送信先オペランドによるＡＲＦ内のレジスタの場所の指定は暗黙的である（事前に決定される）。また、実施形態では、命令セットは、ＩＡＬＵ  ５６によって実行される１つまたは複数の整数演算命令も含み得る。実施形態では、これらの整数演算命令は、ＭＲＦ  ２６Ｍの送信元および送信先レジスタを使用する。
【００６０】
本明細書で開示されるある実施形態によれば、浮動小数点演算命令は、共通の重みレジスタファイルＷＲＦ  ２６Ｗを利用する少なくとも１つのタイプを含んでもよい。このタイプの命令は、算術命令が実行されたスレッドの対応するＡＲＦ  ２６Ａの対応する算術演算の少なくとも１つの送信元を指定する少なくとも１つのオペランドを取る。しかし、算術命令の少なくとも１つの他の送信元は、共通のＷＲＦにあり、すべてのワーカースレッドに共通である。好ましくは、この送信元は、問題の算術命令において暗黙的である（すなわち、このタイプの算術命令に対して暗黙的である）。機械語命令の意味において、暗黙的であるということは、オペランドが指定する必要がないことを意味する。すなわち、この事例では、ＷＲＦの送信元の場所は、オペコードに固有のものである（その特定のオペコードに対して事前に決定される）。オペコードに応答して、ＦＰＵ  ５９は、オペコードによって指定されたように算術演算を実行し、算術演算は、スレッドのそれぞれのＡＲＦの指定された送信元レジスタおよびＷＲＦの暗黙的な送信元レジスタの値に基づいて演算することを含む。また、算術ユニットは、算術命令の送信先オペランドによって明示的に指定されるように、スレッドのそれぞれのＡＲＦの送信先レジスタへの算術演算の結果の出力も行う。
【００６１】
共通のＷＲＦ  ２６Ｗの暗黙的な送信元を採用することができる算術命令の例示的なタイプは、１つもしくは複数のベクトル乗算命令タイプ、１つもしくは複数の行列乗算命令タイプ、１つもしくは複数の累積ベクトル乗算命令タイプおよび／または累積行列乗算命令タイプ（命令のあるインスタンスから次のインスタンスまで乗算の結果を累計する）ならびに／あるいは１つもしくは複数の畳み込み命令タイプを含んでいてもよい。例えば、ベクトル乗算命令タイプは、ＡＲＦ  ２６Ａからの明示的な入力ベクトルにＷＲＦからの既定の重みベクトルを乗じることができる。あるいは、行列乗算命令タイプは、ＡＲＦからの明示的な入力ベクトルにＷＲＦからの既定の重み行列を乗じることができる。別の例として、畳み込み命令タイプは、ＡＲＦからの入力行列にＷＲＦからの既定の行列を畳み込むことができる。多数のスレッドに共通の共有の重みレジスタファイルＷＲＦを有することにより、各スレッドは、それ自体の対応するデータに共通のカーネルを乗じるかまたは畳み込むことができる。これは機械学習アプリケーションにおいて、例えば、各スレッドがニューラルネットワークの異なるノードを表し、共通のカーネルが検索または訓練されている特徴（例えば、グラフィカルデータのエリアまたはボリュームのエッジまたは特定の形状）を表す場合に、多く現れるシナリオであるため、これは有益である。
【００６２】
実施形態では、ＷＲＦ  ２６Ｗの値は、スーパーバイザスレッドによって書き込むことができる。スーパーバイザ（実施形態では、すべてのスロットＳ０・・・ＳＭにおいて実行することによって開始される）は、最初に、いくつかの共通の重み値をＷＲＦの既定の場所に書き込むために、一連のプット（put）命令を実行する。次いで、スーパーバイザは、スロットＳ０…ＳＪ−１のうちのいくつかまたはすべてのそれぞれのワーカーを起動するための命令を実行する（またはすべての命令を実行する）。次いで、各ワーカーは、上記で論じられるタイプの１つまたは複数の算術命令の１つまたは複数のインスタンスを含み、それにより、対応するＡＲＦ  ２６Ａにロードされると、対応する入力データに対して対応する算術演算を実行する（ただし、スーパーバイザによってＷＲＦ  ２６Ｗに書き込まれた共通の重みを使用して）。各スレッドがそのそれぞれのタスクを終了すると、各ワーカーは、そのスロットをスーパーバイザに返すために、終了命令を実行する。起動されたすべてのスレッドがそれらの対応するタスクを終了すると、スーパーバイザは、新しい値をＷＲＦに書き込み、新しいスレッドセットを起動することができる（または、新しいセットを起動して、ＷＲＦの既存の値の使用を続けることができる）。
【００６３】
「メイン」、「補助」および「重み」という修飾語は必ずしも限定的でないことが理解されよう。実施形態では、それらの修飾語は、最初のレジスタファイル（１つのワーカーコンテキスト当たり）、２番目のレジスタファイル（１つのワーカーコンテキスト当たり）および共有された３番目のレジスタファイル（例えば、スーパーバイザコンテキストの一部であるが、すべてのワーカーがアクセス可能である）のいずれかであってもよい。ＡＲＦ  ２６Ａおよび補助実行ユニット１８Ａは、算術命令（または少なくとも浮動小数点演算）のために使用されるため、算術レジスタファイルおよび算術実行ユニットと呼ぶこともできる。ＭＲＦ  ２６Ｍおよびメイン実行ユニット１８Ｍは、それらの使用のうちの１つがメモリにアクセスするためのものであるため、メモリアドレスレジスタファイルおよびロード／ストアユニットと呼ぶこともできる。重みレジスタファイル（ＷＲＦ）２６Ｗは、間もなくさらに詳細に論じられるように、一定の１つまたは複数のタイプの算術命令で使用される乗法重みを保持するために使用されるため、そのように呼ばれる。例えば、これらの重みレジスタファイル（ＷＲＦ）２６Ｗは、ニューラルネットワークのノードの重みを表すために使用することができる。別の方法で見ると、ＭＲＦは、整数オペランドを保持するために使用されるため、整数レジスタファイルと呼ぶことができ、ＡＲＦは、浮動小数点オペランドを保持するために使用されるため、浮動小数点レジスタファイルと呼ぶことができる。しかし、代替の実施形態では、レジスタ空間２６は、必ずしもこれらの異なる目的のためにこれらの別個のレジスタファイルに分割されるとは限らないことに留意されたい。代わりに、メインおよび補助実行ユニットを通じて実行される命令は、同じ共有されたレジスタファイルの中から、レジスタを指定することができる場合がある（マルチスレッドプロセッサの場合には、１つのコンテキスト当たり１つのレジスタファイル）。
【００６４】
実施形態では、プロセッサ４は、プロセッサの１つもしくは複数の他の例および／またはネットワークインタフェースもしくはネットワーク接続記憶装置（ＮＡＳ）デバイスなどの外部のデバイスと共に接続することができる。図５に示されるように、実施形態では、プロセッサ４は、相互接続プロセッサタイルのアレイ６のうち１つを形成することができ、各タイルは、より広いプログラムの一部を実行する。従って、個々のプロセッサ４（タイル）は、より広いプロセッサまたは処理システム６の一部を形成する。タイル４は、相互接続サブシステム３４を介して、共に接続することができる。タイル４は、同じチップ（すなわち、ダイ）上、異なるチップ上またはそれらの組合せ（すなわち、アレイは、各々が複数のタイル４を含む複数のチップにて形成することができる）で実装することができる。従って、相互接続システム３４および交換インタフェース５１は、内部（オンチップ）相互接続メカニズムおよび／または外部（インターチップ）交換メカニズムを相応に含んでいてもよい。
【００６５】
マルチスレッドおよび／またはマルチタイルプロセッサまたはシステムの例示的なアプリケーションの１つでは、複数のスレッドおよび／またはタイル４にわたって実行されるプログラムは、ニューラルネットワークの訓練および／またはニューラルネットワークに基づく推論の実行を行うように構成されたアルゴリズムなどの機械知能アルゴリズムを含む。そのような実施形態では、各ワーカースレッド、各タイル上で実行されるプログラムの一部または各タイル上の各ワーカースレッドは、ニューラルネットワーク（グラフのタイプ）の異なるノード１０２を表すために使用され、それに従って、スレッド間および／またはタイル間の通信は、グラフのノード１０２間のエッジ１０４を表す。これは、図６に示されている。
【００６６】
機械知能は、機械知能アルゴリズムが知識モデルを学習する学習段階から始まる。モデルは、相互接続ノード（すなわち、頂点）１０２およびエッジ（すなわち、リンク）１０４のグラフを含む。グラフの各ノード１０２は、１つまたは複数の入力エッジと、１つまたは複数の出力エッジとを有する。ノード１０２のいくつかの入力エッジのいくつかは、ノード１０２の他のいくつかの出力エッジであり、それにより、ノードが互いに接続され、グラフが形成される。さらに、ノード１０２の１つまたは複数の入力エッジの１つまたは複数は、全体としてのグラフへの入力を形成し、ノード１０２の１つまたは複数の出力エッジの１つまたは複数は、全体としてのグラフの出力を形成する。さらに、所定のノードは、グラフへの入力、グラフからの出力および他のノードとの接続のすべてを有するものであってもよい。各エッジ１０４は、値又はテンソル（ｎ次元行列）を伝達し、これらは、ノード１０２の入力エッジに提供される入力を形成するか、又は、出力エッジから提供される出力を形成する。
【００６７】
各ノード１０２は、その１つまたは複数の入力エッジにおいて受信される１つまたは複数の入力についての関数を表し、この関数の結果は、１つまたは複数の出力エッジにおいて提供される出力である。各関数は、１つまたは複数の対応するパラメータ（重みと呼ばれる場合もあるが、必ずしも乗法重みである必要はない）によってパラメータ化される。一般に、異なるノード１０２によって表される関数は、関数の異なる形態であることおよび／または異なるパラメータによってパラメータ化することが可能である。
【００６８】
さらに、各ノードの関数の１つまたは複数のパラメータの各々は、対応する誤差値によって特徴付けられる。さらに、対応する条件は、各ノード１０２のパラメータの誤差と関連付けることができる。単一のパラメータによってパラメータ化された関数を表すノード１０２の場合、条件は、簡単な閾値であってもよく、すなわち、条件は、誤差が指定閾値内にある場合に満たされるが、誤差が閾値を超える場合には満たされない。複数の対応するパラメータによってパラメータ化されたノード１０２の場合、誤差の許容レベルに達したそのノード１０２に対する条件は、より複雑なものであってもよい。例えば、条件は、そのノード１０２のパラメータの各々がそれぞれの閾値内に収まる場合にのみ満たされてもよい。別の例として、同じノード１０２に対する異なるパラメータの誤差を組み合わせた組合せ計量を定義することができ、条件は、組合せ計量の値が指定閾値内に収まるという条件によって満たされてもよいが、そうでなければ、条件は、組合せ計量の値が閾値を超える場合は満たされない（あるいは、計量の定義に応じて、その逆も同様である）。条件が何であれ、これにより、ノードのパラメータの誤差が許容度の一定のレベルまたは程度を下回るかどうかの尺度が得られる。一般に、任意の適切な計量を使用することができる。条件または計量は、すべてのノードに対して同じものでも、異なるそれぞれのノードに対して異なるものでもよい。
【００６９】
学習段階では、アルゴリズムは、経験データ（すなわち、グラフへの入力の異なる可能な組合せを表す複数のデータポイント）を受信する。多くの経験データが受信されるにつれて、アルゴリズムは、パラメータの誤差をできうる限り最小化するよう、経験データに基づいて、グラフの様々なノード１０２のパラメータを段階的に調節する。目標は、所定の入力に対してグラフの出力が所望の出力にできる限り近くなるようなパラメータの値を見出すことである。グラフが全体としてそのような状態に向かう傾向となったときに、グラフは収束したと言える。適切な収束度が得られた後、グラフは、予測または推論を実行するため（すなわち、何らかの所定の入力に対する結果を予測するかまたは何らかの所定の出力に対する原因を推論するため）に使用することができる。
【００７０】
学習段階は、多くの異なる可能な形態を取ることができる。例えば、教師ありアプローチ（supervised approach）では、入力経験データは、訓練データ（すなわち、既知の出力に対応する入力）の形態を取る。各データポイントを用いて、アルゴリズムは、所定の入力に対して出力が既知の出力により近くなるように、パラメータを調節することができる。後続の予測段階では、グラフは、入力クエリを近似予測出力にマッピングするために使用することができる（または、推論する場合は、その逆も同様である）。また、他の手法も可能である。例えば、教師なしアプローチ（unsupervised approach）では、１つの入力データ当たり１つの参照結果という概念は存在せず、代わりに、機械知能アルゴリズムは、出力データにおけるそれ自体の構造の識別を任される。あるいは、強化学習アプローチ（reinforcement approach）では、アルゴリズムは、入力経験データの各データポイントに対して少なくとも１つの可能な出力を試し、この出力が、正か否か（および、潜在的には、正または否の度合い）（例えば、勝つか負けるか、利益か損失かまたは同様のもの）が知らされる。多くの試行にわたり、アルゴリズムは、正の結果をもたらす入力を予測することができるように、グラフのパラメータを徐々に調節することができる。グラフを学習するための様々な手法およびアルゴリズムは、機械学習の当業者に知られている。
【００７１】
本明細書で開示される技法の例示的なアプリケーションによれば、各ワーカースレッドは、ニューラルネットワークなどの機械知能グラフのノード１０２のそれぞれの個々のノードと関連付けられた演算を実行するようにプログラムされる。この場合、ノード１０２間のエッジ１０４の少なくともいくつかは、スレッド間のデータの交換に相当するものであってもよいし、タイル間の交換に関与するものであってもよい。１つのタイル４当たり複数のスレッドを有するマルチタイル構成６の場合、各タイル４は、グラフのサブグラフを実行する。各サブグラフは、１つまたは複数のスーパーバイザスレッドを含むスーパーバイザサブプログラムと、それぞれのサブグラフのノード１０２を表すワーカースレッドのセットとを含む。
【００７２】
図７は、本開示の実施形態による、有利な繰り返しキャッシュメカニズムの例示的な実装形態を示す。このメカニズムは、機械学習アプリケーションにおいて見出すことができるが、そのようなアプリケーションに限定されない。メカニズムは、プロセッサ４の命令セットの繰り返し命令（「ｒｐｔ」）を提供することに基づく。繰り返し命令の機能は、ａ）繰り返し命令を実行する最初のスレッドが、それ自体のコードの部分をキャッシュし、このコードの部分を繰り返すのみならず、ｂ）繰り返し命令を実行する次のスレッドもまた、最初のスレッドからキャッシュされたコードの部分を繰り返すように構成される。従って、メモリ１２から再フェッチすることなく、複数のスレッドにわたって同じコードを再利用し、複製することができる。実施形態では、複数の異なるスレッドにおいて同じコードが再利用され、各スレッドは、対応するレジスタファイル２６（例えば、それ自体のそれぞれのＡＲＦ  ２６Ａ）の対応するオペランド値に基づいて動作する。
【００７３】
本発明者は、機械学習およびニューラルネットワークの分野では、各スレッドがグラフ（例えば、ニューラルネットワーク）の異なるノードを表し、ノードのいくつかが同じ演算プロセスのいくつかまたはすべてを実行する場合において、スレッド間でコードを再利用する機会が生じることを確認した。例えば、いくつかのノードを表すスレッドは、それぞれの入力データに基づいて１つまたは複数の同じ動作を実行することができる。実際に、いくつかの場合、いくつかのノードのスレッドは、互いにいくつかの同じオペランド値に基づいて同じ動作を実行することができるが、個々のスレッドに特有の他のオペランドに基づいて動作することもできる。そのような例は、畳み込みの一部として実行されるベクトルまたは行列乗算であり、各スレッドの命令は、個々のスレッドに特有の入力データに、共通の重みのセット（スレッド間で共有される）を乗じる。この例は、畳み込みニューラルネットワークで発生しうる。多くのノードは、実際に、同じ重みを含むが、異なる接続を有する。各スレッドは、ある特徴を検出するためにそれぞれの入力データに共通の重みのカーネルを畳み込むなど、ニューラルネットワークの異なるノードの処理を実行するように構成することができる。
【００７４】
そのようなシナリオでは、各スレッドがメモリから別々に再フェッチする必要なく、あるスレッドからのコードの部分を１つまたは複数の他のスレッドにおいて再利用することができるメカニズムを提供することが有利であり、それにより、スレッドが同じ動作のいくつかまたはすべてを実行するシナリオにおいて電力消費量が低減される。例えば、このメカニズムは、スレッド間で共有される１つまたは複数の共通の重みオペランドと個々のスレッドに特有の１つまたは複数のオペランドとの組合せに基づいて、同じ動作が各スレッドによって実行される予定のシナリオにおいて使用することができる。
【００７５】
そのようなシナリオにおける繰り返しキャッシュの利点は、メモリ１２からの命令フェッチはエネルギー消費が多いことである。例えば、ニューラルネットワークなどのアプリケーションにおける多くの内部ループ（例えば、それらのループは畳み込みのために使用される）は小さく（ほんの一握りの命令またはバンドル）、また、ワーカーは共通にそれら同じループを実行するため、小型、ローカル、かつエネルギー効率のよいキャッシュ３１をタイル４内に実装することにより、これは、電力消費の機会を与えることになる。従って、すべてのワーカーは、同じコードに対し、エネルギー消費の多いフェッチをメモリに対して実行するのではなく、むしろ、その代わりによりエネルギー効率のよいキャッシュを使用できる。
【００７６】
図７に示されるように、本開示によれば、プロセッサ４は、少なくとも繰り返しキャッシュ３１を含む命令キャッシュを含む。繰り返しキャッシュ３１は、多数のキャッシュされた命令を順番に一時的に保持するための一時的な格納エリア３３を含む。また、繰り返しキャッシュ３１は、キャッシュの状態を記録するための関連手段３５も有し、状態は、キャッシュがスレッドの１つによって現在「要求されている（claimed）」（または「所有されている（owned）」）か否かの記録を少なくとも含む。この意味は、間もなく明らかになるであろう。状態３５は、繰り返しキャッシュ３１の内部状態（すなわち、１つまたは複数の内部ラッチの形態のハードウェア回路）として実装することができる。あるいは、状態３５は、レジスタファイルのレジスタとして（例えば、スーパーバイザコンテキストなどのコンテキストのうちの１つの制御状態レジスタ２８として）実装することができる。
【００７７】
パイプライン１３の命令フェッチステージ１４は、命令メモリ１２または繰り返しキャッシュ３１のいずれかから命令をフェッチするように動作可能である。任意の所定の時間にどちらの命令供給源を使用するかは、間もなくさらに詳細に論じられるように、繰り返し命令およびそのオペランドに依存する。
【００７８】
図７に示されるように、並列に実行することができるＪ個のワーカースレッドの各々は、複数のＪ個のセットのコンテキストレジスタ２６（ＣＸ０…ＣＸＪ−１）のうちの対応するコンテキストレジスタ２６に割り当てられ、各セットは、そのそれぞれのワーカーのプログラム状態を保持するように構成される。実施形態では、コンテキストレジスタ２６の追加のセット（ＣＸＳ）は、スーパーバイザスレッドのプログラム状態を保持するために提供される。コンテキストレジスタの各セットは、それぞれのスレッドの現在のＰＣ値を保持するためのそれぞれのプログラムカウンタ（ＰＣ）２１を含む。プログラムポインタは、その命令がフェッチされる対象となるスレッドのそれぞれのコードの現在のポイントを指定する。また、コンテキストレジスタの各セットは、それぞれのスレッドの命令による動作の基となるオペランドを一時的に保持するためのオペランドレジスタ３２も含む。各ワーカースレッドのオペランドレジスタ３２は、それぞれのスレッドのＭＲＦ  ２６ＭおよびＡＲＦ  ２６Ａを含んでもよい。スーパーバイザのオペランドレジスタ３２は、ＷＲＦ  ２６Ｗを含んでもよい。コンテキストレジスタの各セットは、現在一時停止しているかどうかなど、それぞれのスレッドのステータスを記録するためのそれぞれの１つまたは複数の制御状態レジスタ（ＣＲＳ）２８をさらに含んでもよい。
【００７９】
各スレッドに対し、パイプライン１３は、それぞれのプログラムカウンタ（ＰＣ）に従って命令メモリ１２から命令をフェッチして実行することによって開始される。好ましい実施形態では、繰り返し命令（ｒｐｔ）は、以下の構文を取り入れる。
Ｒｐｔ  ＄ｓｉｚｅ，＄ｃｏｕｎｔ
【００８０】
すなわち、繰り返し命令（ｒｐｔ）は、繰り返しコードの部分のサイズを指定する繰り返しサイズオペランドと、その部分を繰り返す回数を指定する繰り返し回数オペランドとの２つのオペランドを取る。実施形態では、これらのオペランドは、レジスタを参照することによって、それらのそれぞれの値を指定する。すなわち、命令のオペランドフィールドに直接含まれる値は、実際の繰り返しサイズまたは繰り返し回数値のそれぞれを取る対象となるレジスタ＄ｓｉｚｅまたは＄ｃｏｕｎｔ（例えば、それぞれのスレッドのＭＲＦ  ２６Ｍの）を識別する。しかし、その代替として、これらの繰り返しサイズオペランドおよび繰り返し回数オペランドの一方または両方は、即値オペランドであってもよい（すなわち、繰り返しサイズおよび／または繰り返し回数値は、直接符号化され、繰り返し命令の関連オペランドフィールドに埋め込まれる）。
【００８１】
動作の際、実行ユニット１８およびフェッチステージ１４は、繰り返し命令に応答して、以下の通り動作するように構成される。ｒｐｔ  ＄ｓｉｚｅ，＄ｃｏｕｎｔを実行する最初のスレッドは、繰り返しキャッシュ３１を要求する。この動作は、繰り返しキャッシュ３１をロックするかまたは繰り返しキャッシュを「所有する」と言うこともできる。実際には、これは、実行ユニット１８が、要求されているとマーク付けするように繰り返しキャッシュ３１の状態３５を設定することを意味する。その後、繰り返し命令を実行するいかなる後続のワーカーも、状態３５がリセットされるまで、繰り返しキャッシュを要求することはできない（以下を参照）。
【００８２】
ワーカーがｒｐｔを実行すると、この命令は、命令フェッチのための繰り返しキャッシュを参照する（look  in）よう命令フェッチャロジック１４に通知する。最初のワーカーにおける繰り返し命令の実行により、実行ユニット１８は、コードの繰り返し命令の後に続く当該ワーカーのＮ個の命令または命令バンドルで繰り返しキャッシュ３１を満たす。Ｎは、＄ｓｉｚｅで指定される（＄ｓｉｚｅが繰り返しキャッシュの容量より大きくない場合。＄ｓｉｚｅが繰り返しキャッシュの容量よりも大きければ、繰り返しボディの最初の部分のみが繰り返しキャッシュ３１に格納される）。また、実行ユニット１８は、命令をキャッシュしつつ、１回通してそれらの命令の実行も行う。その後、Ｎ個の命令の部分の終了直後に、フェッチステージ１４は戻され、命令キャッシュ３１の格納エリア３３からのコードのフェッチを開始し、次いで、コードのキャッシュされた部分は、＄ｃｏｕｎｔで指定されている回数だけ、そこから繰り返される。この動作は、それぞれのスレッドのプログラムカウンタＰＣ  ２１を分岐することを伴っていてもよい。最後の繰り返しの終了後、プログラムは、コードのキャッシュされた部分の直後のポイントから続ける。
【００８３】
その状態３５に従って繰り返しキャッシュが依然として要求（ロック）されている間に、繰り返し命令の別のインスタンスが２番目のワーカースレッドの一部として実行される場合は、繰り返し命令の実行により、実行ユニット１８は、２番目のスレッドに対して異なる機能を実行する。すなわち、フェッチステージ１４は、命令キャッシュ３１の格納エリア３３からのコードのキャッシュされた部分（最初のスレッドからキャッシュされたコードの部分）のフェッチを開始するように制御される。次いで、実行ユニット１８は、キャッシュされたコードのこの部分の実行を繰り返すが、その回数は、２番目のワーカースレッドのそれぞれの＄ｃｏｕｎｔオペランドによって指定されたものである。
【００８４】
従って、繰り返し命令は、ゼロオーバーヘッドループ設備を提供し、それにより、命令または実行バンドル（繰り返しボディ）の後続のシーケンスが繰り返し実行される。繰り返し回数は、即値としてまたは符号なしのレジスタ送信元値として提供することができる。繰り返しボディのサイズは、命令または実行バンドルの整数で表現され、即値によって提供される（例えば、繰り返しボディサイズは、（即値＋１）実行である）。
【００８５】
注：繰り返しキャッシュの検索は、依然として、二通りの状況で失敗し得る。第１の状況は、２番目のワーカーが繰り返し命令の異なるインスタンス（メモリの異なる場所に存在する）を実行し、従って、繰り返しループのボディがキャッシュ３１にない場合である。この事例では、命令フェッチロジック１４は、メモリ１２からフェッチすると報告する。第２の状況は、繰り返しボディの長さが繰り返しキャッシュの容量を超えている場合であり、この事例では、繰り返しボディの最後尾は繰り返しキャッシュ内には見られず、依然として命令メモリ１２からのフェッチを実行しなければならない。
【００８６】
繰り返しキャッシュ３１は、多くのワーカーコンテキストが同じタスクを実行している際に特に、例えば高度演算カーネル内側ループの間の、コードオーバーヘッドひいては電力消費量の低減を目的として、小さく、アーキテクチャ上では見えない（ほとんど見えない）命令キャッシュを提供する。キャッシュ３１は、ワーカーコンテキストの間で共有され、実施形態では、繰り返し命令のインスタンスの繰り返しボディ内の命令またはバンドルをキャッシュするためにのみ特別に確保される。
【００８７】
実施形態では、繰り返しキャッシュの格納エリア３３は、多くの独立ラインからなり、各ラインは、命令（個々の命令発行の場合）または命令バンドル（プロセッサ４が共同発行された命令のバンドルを実行する場合）と同じサイズにサイズ指定される。各ラインは、有効または無効であってもよい。すべてのラインは、最初は無効である。実施形態では、実行バンドルは繰り返し命令の繰り返しボディ内にあるため、それらのバンドルは、好ましくは、タイルメモリにおいて位置合わせすべきでもある（例えば、８バイト単位で位置合わせされる）。
【００８８】
繰り返しキャッシュ３１は、ロックまたはアンロックされる。アンロック（初期の状態）の際、繰り返しキャッシュは、繰り返し命令のインスタンスを実行するワーカースレッド（ロックコンテキスト）の副作用としてロックされる。ワーカーコンテキストが繰り返し命令を実行する際に既に繰り返しキャッシュ３１がロックされている場合は、この点において何の行動も起こさない。
【００８９】
繰り返しキャッシュの要求（ロック）を再び取り除くことができるように状態３５をリセットするためのメカニズムを実装する可能性は少なくとも２つある。
【００９０】
第１の可能性は、繰り返しキャッシュを所有するワーカースレッドが繰り返しループの最後の命令を実行する際、繰り返しキャッシュ３１はアンロックされ、すべてのライン３３は無効とマーク付けされることである。ここでは、繰り返しキャッシュ３１を現在使用している他のワーカーコンテキストはいずれも、繰り返しキャッシュ３１というよりむしろ、メモリ１２からコードをフェッチする。この動作には、どのワーカースレッド（またはむしろ、どのコンテキストもしくはどのスロット）が繰り返しキャッシュ３１を要求したか（すなわち、どれが繰り返しキャッシュ３１をロックするようにしたか）を記録するための手段が要求される。これは、キャッシュ３１の内部状態の状態としてまたはレジスタファイル２６のうちの１つのレジスタファイル２６のレジスタにおいて実装することができる。
【００９１】
第２の好ましい代替の可能性は、各コンテキスト（並列スレッドの各々またはスロットの各々）に対してフラグ４１が保持されることである。例えば、この動作は、それぞれのコンテキストの制御状態レジスタ２８のうちの１つにおいて実装することができる。繰り返しキャッシュがロックされた時点で、各ワーカースレッドに対して繰り返しキャッシュを使用する（ヒットする）ようにフラグが設定される。コンテキストがその繰り返しループの最後の命令を実行する度に、設定されている唯一のフラグがこのスレッドによって所有されているものである（すなわち、他のすべてのフラグはクリアされている）場合は、繰り返しキャッシュ３１はアンロックされる。いずれにせよ、このスレッドによって所有されているフラグ４１はクリアされる（すなわち、繰り返しキャッシュを使用している最後のコンテキストがその繰り返しループを終了すると、繰り返しキャッシュ３１はアンロックされる）。
【００９２】
注：どのスレッドがキャッシュ３１を要求するかについて述べられているところでは、これは、並列スレッドのうちのどのスレッドか（すなわち、時間スロットおよびコンテキストレジスタ２６の関連セットのうちの１つに現在割り当てられているものはどれか）を意味する。同等に、コンテキストレジスタ２６（ＣＸ０…ＣＸＪ−１）のうちのどのコンテキストがキャッシュを要求するか、または、スロットＳ０…ＳＪ−１のうちのどのスロットがキャッシュを要求するかと述べることができる。当技術分野では場合により、「コンテキスト」は、コンテキスト（プログラム状態の意味の）を保持しているレジスタ２６のセット、それぞれのスレッドが実行するスロット、または、まさにスレッド、スロット、プログラム状態およびコンテキストレジスタの全構成に対する略語としても使用される。
【００９３】
繰り返しキャッシュ３１をロックすることにより、キャッシュフィル動作が開始される。すなわち、ロックされると、ロックコンテキストの繰り返しボディの先頭にある各連続実行命令またはバンドルの実行によって、ｉ）その命令またはバンドルアドレスに単一のラインが割り当てられ、ｉｉ）割り当てられたラインに命令または実行バンドルデータが書き込まれ、ｉｉｉ）ラインが有効と設定される。繰り返しボディのサイズが繰り返しキャッシュの容量より大きい場合は、繰り返しボディの先頭にある実行バンドルのみがキャッシュされる。
【００９４】
ロックの際、＄ｃｏｕｎｔ（ロックコンテキストの）の値が０になる（第１のリセットメカニズム）かまたは関連フラグがクリアされる（第２のリセットメカニズム）と、繰り返しキャッシュはアンロックされる。すべてのワーカーコンテキストに対し、＄ｃｏｕｎｔがゼロではない（すなわち、ワーカーが繰り返しボディを実行している）ときは、命令フェッチメカニズムは、命令または実行バンドルアドレスに割り当てられた有効なラインの存在をチェックし、ヒットの場合は、タイルメモリからのフェッチを実行するというよりむしろ、キャッシュラインのコンテンツを使用する。
【００９５】
実施形態では、最初に、繰り返し回数がゼロである場合は、繰り返し命令は、繰り返しボディ上の分岐として動作する。そうでなければ、後続の繰り返しボディ実行バンドルが＄ｃｏｕｎｔ回実行される。
【００９６】
共同発行された命令のバンドルを実行する実施形態では、繰り返し命令と共に共同発行されたいかなる命令も、一度だけ実行され、繰り返しボディの一部ではない。
【００９７】
実施形態では、繰り返しボディ内のあるタイプの命令を実行することができない場合がある。この場合には、そのような命令の実行の試みにおいて除外が発生する。
【００９８】
上記の実施形態は単なる例示として説明されてきたことが理解されよう。
【００９９】
例えば、代替の実装形態では、繰り返し命令の構文は、必ずしも繰り返しサイズオペランドを必要とするとは限らない。代わりに、キャッシュされた部分のサイズを固定する（暗黙的にする）ことも、他の何らかの状態の断片（例えば、スーパーバイザによって設定された繰り返しキャッシュの設定）によって指定することもできる。また、繰り返しボディのサイズは、繰り返しキャッシュのサイズと一致しなくともよいことにも留意されたい。
【０１００】
あるいは、より複雑な実装形態では、キャッシュされた命令（繰り返しボディ）は、必ずしも繰り返し命令の直後の命令またはバンドルから始める必要はない。例えば、代わりに、繰り返し命令の構文は、繰り返しボディの開始および終了ポイントの指定を可能にすることができる。あるいは、別の例として、プロセッサは、ローリング方式で最後のＭ個の命令を継続的にキャッシュすることができ、次いで、繰り返し回数オペランドは、繰り返し命令につながるそれらのうちの最後のＮ個をキャッシュさせる（すなわち、繰り返し命令は、ループのボディの前というよりむしろ、ループのボディの後に実行することができる）。
【０１０１】
さらなる代替のまたは追加の変形形態では、プロセッサ４は、必ずしも繰り返しキャッシュ３１に対する要求をリセットする（すなわち、繰り返しキャッシュをアンロックする）ための専用ハードウェアメカニズム４１を必要とするとは限らない。代替の実装形態では、この要求は、ワーカーまたはスーパーバイザのうちの１つのソフトウェアによって明示的にリセットすることができる（例えば、このレジスタがレジスタファイルの書き込み可能なレジスタとして実装される場合、符号３１などの繰り返しキャッシュにリンクされたレジスタに書き込むためのプット（put）命令を実行することによって）。
【０１０２】
さらに、本開示の範囲は、上記で説明されるアーキテクチャであり、そのアーキテクチャでは、スーパーバイザスレッドに対して別個のコンテキストが提供されるか、または、スーパーバイザスレッドは、スロットで実行し、次いで、そのスロットをワーカーに委ねる。スーパーバイザは、代わりに、汎用コンテキストを使用することができる。あるいは、別の構成では、例えば、スーパーバイザは、それ自体の専用スロットで実行することができる。さらに、実装形態は、スーパーバイザの役割さえも有するスレッドのうちの特定のものに限定されない。さらに、本開示の範囲は、タイルのアレイにおけるタイルであるプロセッサ４に限定されない。代替の実施形態では、プロセッサ４は、例えば、スタンドアロンプロセッサでも、単一チッププロセッサでもあり得る。
【０１０３】
実装形態は、別個のＭＲＦおよびＡＲＦに限定されない。また、別個のＷＲＦの使用にも限定されない。一般に、レジスタは、１つまたは複数のレジスタファイルのいずれからのものでもあり得、異なるメモリアクセスと算術演算との間で共有することも、分離することもできる。
【０１０４】
さらに、本開示の範囲は、機械学習アプリケーションに限定されない。コードオーバーヘッドを低減し、従って、コード密度を改善するために、スレッド間でコードを再利用することが望ましい他の多くのアプリケーションが存在する。
【０１０５】
開示される技法の他の変形形態または使用事例は、本明細書の本開示が与えられた時点で当業者に明らかになるであろう。本開示の範囲は、説明される実施形態による制限は受けず、添付の請求項による制限のみを受ける。
【符号の説明】
【０１０６】
４  プロセッサ
６  タイルのアレイ
１０  マルチスレッド処理装置
１１  ローカルメモリ
１２  命令メモリ
１３  実行パイプライン
１４  フェッチ
１６  復号
１８  実行ユニット
２１  プログラムカウンタ
２２  データメモリ
２４  スケジューラ
２６  コンテキストレジスタ
２６Ａ  補助レジスタファイル
２６Ｍ  メインレジスタタファイル
２６Ｗ  共通の重みレジスタファイル
２８  制御状態レジスタ
３１  繰り返しキャッシュ
３２  オペランドレジスタ
３３  格納エリア
３４  相互接続サブシステム
３５  状態
４１  フラグ
５１  交換インタフェース
５５  ロード／ストアユニット
５６  整数演算論理ユニット
５９  浮動小数点演算ユニット
１０２  ノード
１０４  エッジ
【図１】
2020107306.tif 000003
【図２】
2020107306.tif 000004
【図３】
2020107306.tif 000005
【図４】
2020107306.tif 000006
【図５】
2020107306.tif 000007
【図６】
2020107306.tif 000008
【図７】
2020107306.tif 000009
【外国語明細書】
2020107306000001.pdf