(57)【要約】  Ｎ次元テンソルにアクセスするための方法、システム、および装置について説明される。いくつかの実現例では、方法は、第１のネステッドループの１つ以上の第１の反復の各々について、第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、第２のネステッドループの反復を行うことを備える。第１のネステッドループの１つ以上の第１の反復についてのネステッドループの反復回数は、第２のネステッドループが計算システムのハードウェアのプロパティの値を超える反復の総数を有することに応じて、第１のループ限界値によって制限される。第１のネステッドループの最後から２番目の反復が終了した後で、代替ループ限界値に達するまで、第１のネステッドループの最後の反復について第２のネステッドループの１つ以上の反復が行われる。
2020524318.tif 000002
【特許請求の範囲】
【請求項１】
Ｎ次元テンソルにアクセスするために計算システムによって行われる方法であって、
第１のネステッドループの１つ以上の第１の反復の各々について、前記第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、前記第２のネステッドループの反復を行うことを備え、前記第１のネステッドループの前記１つ以上の第１の反復についての前記第２のネステッドループの反復回数は、前記第２のネステッドループが前記計算システムの計算ユニットの数の値を超える反復の総数を有することに応じて、前記第１のループ限界値によって制限され、前記方法はさらに、
前記第１のネステッドループの最後から２番目の反復が終了した後で、前記第１のループ限界値よりも小さい代替ループ限界値に達するまで、前記第１のネステッドループの最後の反復について前記第２のネステッドループの１つ以上の反復を行うことを備える、方法。
【請求項２】
前記第１のネステッドループの前記最後から２番目の反復が終了したという判断に応じて、前記第１のネステッドループの前記最後の反復について、前記第１のループ限界値の代わりに前記代替限界値を用いることをさらに備える、請求項１に記載の方法。
【請求項３】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項１に記載の方法。
【請求項４】
前記第２のネステッドループの前記第１のループ限界値に達するまで、前記第１のネステッドループ内にネストされた前記第２のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第２のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第２のネステッドループのそれぞれの反復を行う、請求項２に記載の方法。
【請求項５】
前記代替ループ限界値は、前記第２のネステッドループの前記反復の総数を前記計算ユニットの前記数で除算することによって生じる余りの値に基づいている、請求項２に記載の方法。
【請求項６】
前記第１のネステッドループと前記第２のネステッドループとを含むネステッドループの組は、前記第１のネステッドループと前記第２のネステッドループとの間でネストされた１つ以上のループを含み、前記第２のネステッドループは他のループ内にネストされている、請求項１に記載の方法。
【請求項７】
前記第２のネステッドループは、前記第１のネステッドループと前記第２のネステッドループとの間に他のループがネストされていない状態で、前記第１のネステッドループ内に直接ネストされている、請求項１に記載の方法。
【請求項８】
Ｎ次元テンソルにアクセスするためのシステムであって、
複数の個別の計算ユニットと、
１つ以上のプロセッサとを備え、前記１つ以上のプロセッサは、
第１のネステッドループの１つ以上の第１の反復の各々について、前記第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、前記第２のネステッドループの反復を行うように構成されており、前記第１のネステッドループの前記１つ以上の第１の反復についての前記第２のネステッドループの反復回数は、前記第２のネステッドループが前記計算ユニットの数の値を超える反復の総数を有することに応じて、前記第１のループ限界値によって制限され、
前記１つ以上のプロセッサはさらに、
前記第１のネステッドループの最後から２番目の反復が終了した後で、前記第１のループ限界値よりも小さい代替ループ限界値に達するまで、前記第１のネステッドループの最後の反復について前記第２のネステッドループの１つ以上の反復を行うように構成されている、システム。
【請求項９】
前記１つ以上のプロセッサはさらに、前記第１のネステッドループの前記最後から２番目の反復が終了したという判断に応じて、前記第１のネステッドループの前記最後の反復について、前記第１のループ限界値の代わりに前記代替限界値を用いるように構成されている、請求項８に記載のシステム。
【請求項１０】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項８に記載のシステム。
【請求項１１】
前記第２のネステッドループの前記第１のループ限界値に達するまで、前記第１のネステッドループ内にネストされた前記第２のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第２のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第２のネステッドループのそれぞれの反復を行う、請求項８に記載のシステム。
【請求項１２】
前記代替ループ限界値は、前記第２のネステッドループの前記反復の総数を前記計算ユニットの前記数で除算することによって生じる余りの値に基づいている、請求項８に記載のシステム。
【請求項１３】
前記第１のネステッドループと前記第２のネステッドループとを含むネステッドループの組は、前記第１のネステッドループと前記第２のネステッドループとの間でネストされた１つ以上のループを含み、前記第２のネステッドループは、他のループ内にネストされている、請求項８に記載のシステム。
【請求項１４】
前記第２のネステッドループは、前記第１のネステッドループと前記第２のネステッドループとの間に他のループがネストされていない状態で、前記第１のネステッドループ内に直接ネストされている、請求項８に記載のシステム。
【請求項１５】
Ｎ次元テンソルにアクセスするための装置であって、
各々がテンソル要素のメモリアドレスを計算する複数の個別の計算ユニットと、
動作を行うことによって、ネステッドループの反復を前記個別の計算ユニットへ割当てるように構成されたコントローラとを備え、前記動作は、
第１のネステッドループの１つ以上の第１の反復の各々について、前記第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、前記第２のネステッドループの反復を行うことを含み、前記第１のネステッドループの前記１つ以上の第１の反復についての前記第２のネステッドループの反復回数は、前記第２のネステッドループが前記計算ユニットの数の値を超える反復の総数を有することに応じて、前記第１のループ限界値によって制限され、前記計算ユニットのうちの１つが前記第２のネステッドループの各々の反復についてテンソル要素のメモリアドレスを決定し、前記動作はさらに、
前記第１のネステッドループの最後から２番目の反復が終了した後で、前記第１のループ限界値よりも小さい代替ループ限界値に達するまで、前記第１のネステッドループの最後の反復について前記第２のネステッドループの１つ以上の反復を行うことを含む、装置。
【請求項１６】
前記コントローラは、前記第１のネステッドループの前記最後から２番目の反復が終了したという判断に応じて、前記第１のネステッドループの前記最後の反復について、前記第１のループ限界値の代わりに前記代替限界値を用いることを含む動作をさらに行うように構成されている、請求項１５に記載の装置。
【請求項１７】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項１５に記載の装置。
【請求項１８】
前記第２のネステッドループの前記第１のループ限界値に達するまで、前記第１のネステッドループ内にネストされた前記第２のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第２のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第２のネステッドループのそれぞれの反復を行う、請求項１５に記載の装置。
【請求項１９】
前記代替ループ限界値は、前記第２のネステッドループの前記反復の総数を前記計算ユニットの前記数で除算することによって生じる余りの値に基づいている、請求項１５に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
背景
本明細書は、一般に、複数の計算ユニットを含む専用の計算ユニットを用いて機械学習計算を行うことに関する。
【背景技術】
【０００２】
ニューラルネットワークは、モデルの１つ以上の層を用いて、受信した入力について出力、たとえば分類を生成する機械学習モデルである。ニューラルネットワークの中には、外層に加えて１つ以上の隠れ層を含むものもある。各隠れ層の出力は、ネットワークにおける次の層、すなわち、ネットワークの次の隠れ層または出力層に対する入力として用いられる。ネットワークの各層は、パラメータのそれぞれの組の現在値に従って、受信された入力から出力を生成する。
【０００３】
ニューラルネットワークの中には、１つ以上の畳み込みニューラルネットワーク層を含むものもある。各畳み込みニューラルネットワーク層は、カーネルの関連する組を有する。カーネルは、重み入力のマトリックス構造として表すことができる。各畳み込み層は、カーネルを使用して、層に対する入力を処理する。層に対する入力の組は、マトリックス構造として表すこともできる。
【発明の概要】
【課題を解決するための手段】
【０００４】
概要
本明細書で説明される主題のある革新的な態様によると、Ｎ次元テンソルにアクセスするための方法は、第１のネステッドループの１つ以上の第１の反復の各々について、第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、第２のネステッドループの反復を行うことを備える。第１のネステッドループの１つ以上の第１の反復についての第２のネステッドループの反復回数は、第２のネステッドループが計算システムのハードウェアのプロパティの値を超える反復の総数を有することに応じて、第１のループ限界値によって制限されてもよい。第１のネステッドループの最後から２番目の反復が終了した後で、第１のループ限界値よりも小さい代替ループ限界値に達するまで、第１のネステッドループの最後の反復について、第２のネステッドループの１つ以上の反復を行ってもよい。
【０００５】
これらのおよび他の実現例は各々、任意に以下の特徴のうちの１つ以上を含んでもよい。いくつかの局面は、第１のネステッドループの最後から２番目の反復が終了したという判断に応じて、第１のネステッドループの最後の反復について、第１のループ限界値の代わりに代替限界値を用いることを備えてもよい。
【０００６】
いくつかの局面では、ハードウェアのプロパティの値は、計算システムの複数の個別の計算ユニットを含む。個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含んでもよい。
【０００７】
第２のネステッドループの第１のループ限界値に達するまで、第１のネステッドループ内にネストされた第２のネステッドループの反復を行うことは、計算ユニットを用いて、第２のネステッドループの各々の反復を並列して行うことを含んでもよい。各計算ユニットは、第２のネステッドループのそれぞれの反復を行ってもよい。
【０００８】
いくつかの局面では、代替ループ限界値は、第２のネステッドループの反復の総数を計算ユニットの数で除算することによって生じる余りの値に基づいている。第１のネステッドループと第２のネステッドループとを含むネステッドループの組は、第１のネステッドループと第２のネステッドループとの間でネストされた１つ以上のループを含んでもよく、第２のネステッドループは、他のループ内にネストされてもよい。第２のネステッドループは、第１のネステッドループと第２のネステッドループとの間に他のループがネストされていない状態で、第１のネステッドループ内に直接ネストされてもよい。
【０００９】
本明細書に記載されている主題は、以下の利点のうちの１つ以上を実現するように、特定の実施形態において実現されてもよい。複数の計算ユニット、たとえば、複数の計算タイル、複数のプロセッサ、または複数の数値演算ユニットを用いて機械学習計算を並列して行うことによって、計算速度および効率が増加し、より複雑な機械学習計算をより短い時間で行うことができる。ネステッドループの調整可能なループ限界値によって、反復回数が個別の計算ユニットの数の倍数または他のハードウェアのプロパティでない場合であっても、ネステッドループの反復を並列して処理することができる。内側ループのループ限界値は、内側ループの反復回数が、内側ループがネストされている外側ループの最後の反復以外の全ての反復について個別の計算ユニットの数に等しくなるように、設定可能である。これにより、外側ループの各反復について、内側ループの各反復が並列して、たとえば同時に行われる。さらに、外側ループの最後の反復以外の全ての反復について、個々の計算ユニットは、外側ループの各反復について使用され、その結果、計算がより速くより効率的になる。外側ループの最後の反復について内側ループの代わりに代替ループ限界値を用いることによって、内側ループの反復を行うために必要な反復の数を減らすことができ、メモリデバイスの数が少なくなる、および／または、より多くのメモリが利用可能になる。
【００１０】
このおよび他の局面の他の実現例は、コンピュータ記憶装置に符号化された方法の動作を実行するように構成された、対応するシステム、装置およびコンピュータプログラムを含む。１つ以上のコンピュータのシステムは、操作時にシステムに動作を実行させる、システムにインストールされたソフトウェア、ファームウェア、ハードウェア、またはそれらの組合わせによって、そのように構成されてもよい。１つ以上のコンピュータプログラムは、データ処理装置によって実行されると装置に動作を実行させる命令を有することによって、そのように構成されてもよい。
【００１１】
本明細書に記載されている主題の１つ以上の実現例の詳細については、添付の図面および以下の説明に記載されている。主題の他の考えられる特徴、局面および利点は、明細書、図面および特許請求の範囲から明らかになる。
【図面の簡単な説明】
【００１２】
【図１】計算システムの例がテンソル計算を加速する環境のブロック図である。
【図２】複数の計算ユニットを用いてテンソルのトラバースを行うためのネステッドループの例を示す図である。
【図３】テンソル計算を行うためのプロセスの例を示すフロー図である。
【発明を実施するための形態】
【００１３】
様々な図における同様の参照番号および名称は、同様の要素を示す。
詳細な説明
本明細書で説明される主題は、ネステッドループの反復を並列して処理するための代替ループ制限値の使用、たとえば、複数の計算ユニットを含むハードウェア計算システムの使用に関する。各計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットとして実現されてもよい。複数の計算ユニットは、ニューラルネットワークの推論作業負荷を加速するように、および／または、テンソル要素のメモリアドレスを求めるための計算を加速するように構成可能である。ハードウェア計算システムの各計算ユニットは、自己完結型であり、多層ニューラルネットワークの所与の層が求める計算を独立して実行可能である。
【００１４】
複数の層を有するニューラルネットワークは、推論を計算するために使用可能である。たとえば、入力を与えられると、ニューラルネットワークはその入力について推論を計算可能である。ニューラルネットワークは、ニューラルネットワークの層の各々を通じて入力を処理することによって、この推論を計算する。特に、ニューラルネットワークの層は各々、重みのそれぞれの組を有する。各層は、入力を受信し、当該層の重みの組に従って入力を処理して、出力を生成する。
【００１５】
したがって、ニューラルネットワークは、受信した入力から推論を計算するために入力を受信し、推論を生成するためにニューラルネットワーク層の各々を介して入力を処理し、１つのニューラルネットワーク層からの出力は、次のニューラルネットワーク層に対する入力として提供される。ニューラルネットワーク層に対するデータ入力、たとえば、ニューラルネットワークに対する入力、または、シーケンスにおけるニューラルネットワーク層の下の層のニューラルネットワーク層に対する出力は、層に対する起動入力と呼ぶことができる。
【００１６】
本明細書で説明される技術は、複数の計算ユニット、たとえば、複数の計算タイル、複数のプロセッサ、または複数の数値演算ユニットにわたってテンソル計算を分散することによって、テンソル要素のメモリアドレスの計算を行うことが可能である。メモリアドレスの計算は、テンソル状態要素に基づいてメモリアドレスのオフセットを求めることと、このオフセットをテンソル要素のベースアドレスに加算することとを含み得る。
【００１７】
テンソルは多次元形状オブジェクトであり、多次元形状オブジェクトの例としては、行列およびデータ配列が挙げられる。一般に、ソフトウェアアルゴリズムは、１つ以上の計算タイルによって実行されて、ネステッドループを処理することによってテンソル計算を行って、Ｎ次元テンソルのトラバースを行う。計算プロセスの一例では、各ループは、Ｎ次元テンソルの特定の次元のトラバースに関与してもよい。所与のテンソル構造について、計算タイルは、テンソルと関連する１つ以上のドット積の計算を実行するために、特定のテンソルの要素へのアクセスを必要とすることがある。ニューラルネットワーク層内で行われる計算プロセスは、入力起動を含む入力テンソルに重みを含むパラメータテンソルを乗算することを含んでもよい。この計算は、入力起動に１つ以上のサイクルの重みを乗算することと、複数のサイクルにわたって積を累算することとを含む。メモリ構造によって提供される入力起動に、他のメモリ構造によって提供されるパラメータまたは重みが乗算されると、計算が発生する。テンソルはメモリに記憶されるため、テンソルインデックスの組は、メモリからテンソルの正しい要素を検索するために、メモリアドレスの組への変換を必要としてもよい。一般に、計算タイルのテンソルトラバーサルユニットは、テンソルと関連する各次元のインデックス、および計算を行うためにインデックス要素がトラバースされる順序を提供する制御動作を実行する。乗算の結果が出力バスに書き込まれてメモリに記憶されると、テンソル計算は終了する。
【００１８】
１つの計算タイル（または複数の計算タイル）内の複数の数値演算ユニットは、Ｎ次元テンソルについてのメモリアドレス計算を並列して行う。たとえば、ネステッドループのうち最も内側のループの反復毎に、計算が行われてもよい。テンソル計算が行われる各ループは、「テンソル計算ループ」と呼ばれ、常に最も内側のループでなくてもよい。これらの反復の計算は、数値演算ユニットを用いて並列に行うことが可能である。
【００１９】
ネステッドループにおけるテンソルのトラバースを行うには、要素の対応するデータ値のロードまたは格納を行うために、要素のメモリアドレス値の計算が必要である。たとえば、３次元テンソルの要素は、画像がニューラルネットワークによって分類されるという特徴を表してもよい。第１の次元（Ｚ）は画像の幅を表し、第２の次元（Ｙ）は画像の高さを表し、第３の次元（Ｘ）は画像内の画素のＲＧＢ値を表してもよい。画像を分類するために、各ＲＢＧ値に畳み込み層のフィルタ値を乗算して、起動マップを生成してもよい。
【００２０】
ネステッドループを使用して、テンソルの各ＲＢＧ値にアクセスするためのメモリアドレスを決定することができる。ネステッドループは、テンソルの各次元のループを含んでもよい。たとえば、出力ループ（ｚ）は、Ｚ次元（画像の幅）のトラバースを行うために使用可能であり、中間ループ（ｙ）は、Ｙ次元（画像の高さ）のトラバースを行うために使用可能であり、内側ループ（ｘ）は、Ｘ次元（各画素の３つのＲＧＢ値）のトラバースを行うために使用可能である。内側ループの各反復において、外側ループｚおよび中間ループｙの値によって表される画像の特定の画素の３つのＲＧＢ値のうちの１つについて、メモリアドレスが求められる。たとえば、Ｚ＝０およびＹ＝０によって表される画像の画素のＲ値のメモリアドレスは、ｚ＝０およびｙ＝０（たとえば、ｚ＝０；ｙ＝０；ｘ＝０）の場合に、内側ループｘの第１の反復の間に求められてもよい。同様に、Ｚ＝５およびＹ＝２によって表される画像の画素のＧ値のメモリアドレスは、ｚ＝５およびｙ＝２（たとえば、ｚ＝５；ｙ＝２；ｘ＝２）の場合に、内側ループの第３の反復の間に求められてもよい。
【００２１】
メモリアドレスの計算は、複数の計算ユニットを用いて並列して行うことができる。たとえば、３つの計算ユニットがある場合、特定の画素の各ＲＧＢ値のメモリアドレス値は、並列して求めることができる。第１の計算ユニットは、画素のＲ値のメモリアドレスを求めることができ、第２の計算ユニットは、画素のＧ値のメモリアドレスのメモリアドレスを求めることができ、第３の計算ユニットは、画素のＢ値のメモリアドレスを求めることができる。ＲＧＢ値についてメモリアドレスが求められると、処理ユニットは、メモリアドレスを用いて値にアクセスし、この値にフィルタ値を乗算することができる。
【００２２】
場合によっては、テンソル計算ループの反復回数は、計算ユニットの数を超えてもよい。そのような場合、テンソル計算ループの反復は、テンソル計算ループがネストされる外側ループの複数の並列反復に分けられる。たとえば、テンソル計算ループに対応するＮ次元テンソルの次元は、１２８個の要素を含んでもよく、計算システムは、６４個の計算ユニットを含んでもよい。この例では、テンソル計算ループは、外側ループの２つの反復の各々について６４個の計算が並列して行われるように、２つの６４個の外側ループ反復に分けることができる１２８回の反復を含む。この例では、第１の６４回の反復を、計算ユニットの間で分散可能である。第１の６４回の反復が完了すると、計算ユニットの間で次の６４回の反復を分散可能である。
【００２３】
場合によっては、テンソル計算ループの反復回数は、計算ユニットの数の正確な倍数でなくてもよい。たとえば、テンソル計算ループに対応する次元は、１６０個の要素を含んでもよく、計算システムは、６４個の計算ユニットを有してもよい。この例では、テンソル計算ループは、２つの６４個の外側ループの反復と第３の３２個の外側ループの反復とに分けることができる、１６０回の反復を含む。第３の外側ループの反復についてのテンソル計算ループの反復回数を調整するために、テンソル計算ループのループ限界値は、外側ループの第２の反復の後で、たとえば外側ループの最後の反復の前に、６４から３２に変更されてもよい。
【００２４】
図１は、計算システム１０２の例がテンソル計算を加速する環境１００のブロック図である。たとえば、計算システム１０２は、ディープニューラルネットワーク（ＤＮＮｓ）と関連する計算を促進可能である。計算システム１０２は、コントローラ１０５と、複数の個別の計算タイル１１２Ａ〜１１２Ｚとを含む。コントローラ１０５は、計算システム１０２内のテンソル計算に関連する１つ以上の命令を実行するように構成される。図示されていないが、コントローラ１０５は、計算システム１０２内で発生する計算に関連する様々なデータを記憶し、これらにアクセスするためのデータメモリと、コントローラ１０５の１つ以上のプロセッサによって実行可能な１つ以上の機械可読命令を記憶するための命令メモリとを含み得る。
【００２５】
コントローラ１０５は、入力１３２、たとえば命令、コンパイルされたプログラムなどをホスト１３０から受信することができる。計算システム１０２がテンソル計算を行うと、コントローラ１０５は、ホストに出力１３４を提供できる。たとえば、出力１３４は、テンソル要素のメモリアドレスでもよい。コントローラ１０５は、ホストインターフェース（図示せず）を介してホスト１３０に対する入力１３２の受信および出力１３４の提供が可能である。
【００２６】
コントローラ１０５は、１つ以上のデータ通信路、たとえば１つ以上のバスを介して、計算タイル１１２‐Ａ〜１１２‐Ｚと通信できる。同様に、計算タイル１１２‐Ａ〜１１２‐Ｚは、１つ以上のバスを介して互いに通信できる。複数の計算タイルを有する計算システムの例は、２０１６年１０月２７日に出願された「ニューラルネットワーク計算タイル」と題された米国特許出願第１５／３３５，７６９号に記載されており、その開示全体を本明細書に引用により援用する。
【００２７】
各計算タイル１１２‐Ａ〜１１２‐Ｚは、処理ユニット１１４と、データ記憶媒体１１６と、テンソルトラバーサルユニット１２０とを含む。記憶媒体１１６は、計算システム１０２内の情報を格納する。記憶媒体１１６が１つまたは複数の揮発性メモリユニットである実現例もあれば、記憶媒体１１６が１つまたは複数の不揮発性メモリユニットである実現例もある。記憶媒体１１６は、フロッピー（登録商標）ディスクデバイス、ハードディスクデバイス、光ディスクデバイスもしくはテープデバイス、フラッシュメモリもしくは他の同様のソリッドステートメモリデバイス、またはストレージエリアネットワークもしくは他の構成内のデバイスを含むデバイスのアレイなどの、別の形態のコンピュータ可読媒体であってもよい。命令は、処理ユニット１１４によって実行されると、処理ユニット１１４に１つ以上のタスクを実行させる。
【００２８】
処理ユニット１１４は、１つ以上のプロセッサおよび／または１つ以上の有限状態機械（ＦＳＭ）を含み得る。処理ユニット１１４は、コントローラ１０５から受信された命令を実行可能である。たとえば、処理ユニット１１４は、テンソルトラバーサルユニット１２０を用いてテンソル要素のメモリアドレス（またはメモリアドレスオフセット）を計算するための命令を実行可能である。ＦＳＭを含む処理ユニットの場合、ＦＳＭは、テンソルトラバーサルユニット１２０に、テンソル要素のメモリアドレスを問合わせることができる。
【００２９】
一般に、テンソルトラバーサルユニット１２０は、１つ以上のテンソルと関連する状態を求める。いくつかの実現例では、この状態は、メモリアドレス値を求めるためのループ限界値、現在のループインデックス変数値、部分アドレスオフセット値、および／または、ブランチループ限界値を処理するためのプログラムカウンタ値を含んでもよい。テンソルトラバーサルユニット１２０は、特定用途向け集積回路として実現されてもよい。
【００３０】
テンソルトラバーサルユニット１２０は、テンソルインデックスをメモリアドレスに変換する。たとえば、テンソルトラバーサルユニット１２０は、Ｎ次元テンソルインデックスの組を１次元アドレス空間に変換してもよい。テンソルトラバーサルユニット１２０は、テンソル要素のメモリアドレスを要素の次元インデックスの結合（たとえば、線形結合）にすることによって、そのような変換を行うことが可能である。
【００３１】
テンソルトラバーサルユニット１２０は、１つ以上のテンソル状態要素１２２と、１つ以上の数値演算ユニット１２４とを含み得る。たとえば、計算タイル１１２‐Ａのテンソルトラバーサルユニット１２０は、４つの数値演算ユニット１２４‐Ａ〜１２４‐Ｄを含む。他の計算タイルの他のテンソルトラバーサルユニットは、他の数の数値演算ユニットを含んでもよい。テンソル状態要素１２２の各々は、記憶素子、たとえば、レジスタまたは任意の好適な記憶回路でもよい。各数値演算ユニット１２４は、１つまたは複数の算術論理演算ユニット（ＡＬＵｓ）および／または１つ以上のハードウェア加算器を含み得る。数値演算ユニット１２４は、たとえばテンソル状態要素に格納された値に基づいて、テンソル要素のメモリアドレスまたはメモリアドレスオフセット値を計算するために使用可能である。テンソルトラバーサルユニットを用いてメモリアドレスを求める技法の例は、２０１６年１０月２７日に出願された「ニューラルネットワーク計算タイル」と題された米国特許出願第１５／３３５，７６９号、および２０１６年２月３日に出願された「多次元テンソルにおけるデータへのアクセス」と題された米国特許出願第１５／０１４，２６５号に記載されている。コントローラ１０５は、計算タイル１１２‐Ａ〜１１２‐Ｚを用いてテンソル計算を調整可能である。たとえば、コントローラ１０５は、命令を受信して、テンソル要素のメモリアドレスを求めることができる。コントローラ１０５は、ネステッドループを用いてテンソル計算を行うことができる。
【００３２】
各ループは、Ｎ次元テンソルのそれぞれの次元のトラバースに関与することができる。多次元テンソルは、マトリックスまたは多次元マトリックスでもよい。たとえば、２次元テンソルはマトリックスである一方で、３次元テンソルは、複数の２次元マトリックスで構成される３次元マトリックスである。Ｎ次元テンソルの各次元は１つ以上の要素を含んでもよく、各要素は、それぞれのデータ値を格納してもよい。たとえば、テンソルは、プログラムにおける変数でもよく、この変数は３次元でもよい。第１の次元は３００個の要素の長さを有してもよく、第２の次元は１０００個の要素の長さを有してもよく、第３の次元は２０個の要素の長さを有してもよい。当然のことながら、各次元における他の数の要素が可能である。
【００３３】
ネステッドループ内のテンソルのトラバースは、要素の対応するデータ値のロードまたは格納を行うための要素のメモリアドレス値の計算を含み得る。ｆｏｒループは、ネステッドループの一例であり、３つのループインデックス変数（たとえば、ｉ、ｊ、およびｋ）によってトラックされる３つのループが、３次元テンソルのトラバースを行うようにネスト可能である。ニューラルネットワークでは、要素の値は、テンソルと関連付けられた１つ以上のドット積の計算で用いられてもよい。たとえば、要素の値は、対応するパラメータまたは重みが乗算されてもよい。テンソルの要素をネステッドｆｏｒループを用いて順番にトラバースして、要素にアクセスし、要素の値を用いて１つ以上の計算を行ってもよい。３次元テンソルの例を続けると、変数ｉによってトラックされるループのトラバースを行うために外側ｆｏｒループを用いてもよく、変数ｊによってトラックされるループのトラバースを行うために中央ｆｏｒループを用いてもよく、変数ｋによってトラックされるループのトラバースを行うために内側ｆｏｒループを用いてもよい。この例では、アクセスされる第１の要素は、（ｉ＝０，ｊ＝０，ｋ＝０）であってもよく、第２の要素は、（ｉ＝０，ｊ＝０，ｋ＝１）であってもよい、などである。処理ユニットが要素の値にアクセスできるように、かつ、要素の値を用いて１つ以上の計算を行えるように、計算タイル１１２‐Ａ〜１１２‐Ｚのテンソルトラバーサルユニット１２０を用いて、ネステッドループを用いて順番に要素のメモリアドレスを求めることが可能である。重みまたはパラメータの値も、ネステッドｆｏｒループを用いて同様にアクセス可能である。また、テンソルトラバーサルユニット１２０は、計算で用いられる重みまたはパラメータについて、および／または計算の出力についてアドレスを求めるために使用可能であり、計算の出力は、ニューラルネットワークの隠れ層に対する入力として用いられてもよい。
【００３４】
たとえば、米国特許出願第１５／０１４，２６５号に記載されているように、テンソル状態要素１２２は、テンソルインデックス要素のグループ、テンソル限界値要素のグループ、および次元乗数要素のグループを含み得る。要素の各グループは、Ｍ個の行とＮ個の列とを有する２Ｄアレイとして配置され得る。グループの各行は、テンソルのテンソルインデックス情報を表し得る。グループの各列は、テンソルに関連付けられたネステッドループインデックス変数値についての情報（たとえば、テンソルインデックス値、テンソル限界値、または次元乗数値）を表し得る。たとえば、テンソルインデックス要素の２Ｄアレイにおける１つの列は、変数ｉについてのテンソルインデックス情報を表してもよく、１つの列は、変数ｉについてのテンソルインデックス情報を表してもよく、１つの列は、変数ｉについてのテンソルインデックス情報を表してもよく、１つの列は、変数ｋについてのテンソルインデックス情報を表してもよい。
【００３５】
各テンソルインデックス要素は、ネステッドループにおけるループのネステッドループ変数をトラックできる。たとえば、１つのテンソルインデックス要素は、ネステッドループインデックス変数ｉをトラックするように割当てられてもよく、１つのテンソルインデックス要素は、ネステッドループインデックス変数ｊをトラックするように割当てられてもよく、１つのテンソルインデックス要素は、ネステッドループインデックス変数ｋをトラックするように割当てられてもよい。各テンソル限界値要素は、テンソルインデックス要素における対応する要素を有する。各テンソル限界値要素は、テンソルに関連付けられたネステッドループインデックス変数値についてのテンソル限界値情報を表してもよい。たとえば、１つのテンソル限界値要素は、ネステッドループインデックス変数ｉについてのテンソル限界値情報を表してもよく、１つのテンソル限界値要素は、ネステッドループインデックス変数ｊについてのテンソル限界値情報を表してもよく、１つのテンソル限界値要素は、ネステッドループインデックス変数ｋについてのテンソル限界値情報を表してもよい。
【００３６】
各次元乗数要素は、テンソルインデックス要素における対応する要素に乗算される乗数を表し得る。要素のメモリアドレスを求めるために、テンソルトラバーサルユニット１２０は、ネステッドループインデックス変数のテンソルインデックス要素に格納された値にネステッドループインデックス変数の乗数を乗算することによって、各ネステッドループインデックス変数のメモリアドレスオフセットを求めることができる。次に、テンソルトラバーサルユニット１２０は、全ての乗算結果を合計して、アクセスされる要素に対応するメモリアドレスを求めることができる。
【００３７】
テンソルトラバーサルユニット１２０は、ネステッドループの内側ループの各反復後に、テンソルインデックス要素を更新することができる。内側ループの各反復について、テンソルトラバーサルユニット１２０は、たとえば内側ループのテンソルインデックス要素をインクリメントすることによって、ループのテンソルインデックス要素を更新することができる。内側ループの更新されたテンソルインデックス要素が、内側ループのテンソル限界値要素に格納された値に等しい場合には、テンソルインデックス要素をリセットすることができ、内側ループがネストされる次の外側ループのテンソルインデックス要素を更新することができる。次に、テンソルトラバーサルユニット１２０は、上述したように、テンソルインデックス要素にそれらの対応する乗数を乗算し、結果を合計することによって、内側ループのこの反復に対応する次の要素のメモリアドレスを求めることができる。
【００３８】
コントローラ１０５は、プログラムのネステッドループを反復することと、ループのうちの１つ以上の各反復について、たとえば、ネステッドループの最も内側の（他の）ループの各反復について計算を行うこととによって、テンソル計算を調整してもよい。テンソル計算を加速するために、コントローラ１０５は、複数の計算ユニットを用いてテンソル計算のうち少なくとも一部を並列して行ってもよい。計算ユニットは、個別の計算タイルまたは個別の数値演算ユニットでもよい。たとえば、コントローラ１０５は、計算タイル１１２‐Ａが第１のテンソル計算を行うように要求し、同時に、計算タイル１１２‐Ｂが第２のテンソル計算を行うように要求してもよい。他の例では、コントローラ１０５は、計算タイル１１２‐Ａが特定のテンソルのテンソル計算を行うように要求してもよい。その後、テンソルトラバーサルユニット１２０は、数値演算ユニット１２４‐Ａ〜１２４‐Ｄを用いてテンソル計算を並列して行うことができる。
【００３９】
ループは一般に、ループのインデックス変数がループの限界値に等しくなると（またはこれを上回ると）終了する。たとえば、ループは、「ｆｏｒ（ｉ＝０；ｊ＜３；ｉ＋＋）」とプログラムされてもよく、ここで、ｉはインデックス値であり、限界値は３である。この例のループは、３つの反復(ｉ＝０、ｉ＝１、およびｉ＝２)を含む。インデックス変数が３に等しい場合、計算しなくてもループから出る。複数の計算ユニット（たとえば、複数の計算タイル１１２または複数の数値演算ユニット１２４）を用いて並列計算を行う場合、コントローラ１０５は、計算が計算ユニットに割当てられるたびにインデックス変数を反復し、ループの他の反復を他の計算ユニットに割当てる前に、インデックス変数を限界値と比較してもよい。
【００４０】
いくつかの実現例では、コントローラ１０５によって実行されるプログラムのネステッドループは、計算システム１０２のプロパティに基づいて求められたループ限界値を有していてもよい。たとえば、ループのうちの１つ以上のループ限界値は、計算システム１０２の計算タイル１１２‐Ａ〜１１２‐Ｚの数またはテンソルトラバーサルユニット１２０の数値演算ユニットの数に基づいて求められてもよい。
【００４１】
いくつかの実現例では、コンパイラ１３６は、テンソルのテンソル計算を行うためのプログラムをコンパイルする。コンパイラ１３６は、テンソルの次元のうちの１つ以上に含まれる要素の数、および／または、計算システム１０２の計算ユニットの数に基づいて、ループのうちの１つ以上のループ限界値を求めるように構成可能である。ループのループ限界値は、ループのインデックス値がループ限界値と等しくなるとループが終了する数である。言い換えると、ループのループ限界値は、ループの反復回数に等しくなり得る。
【００４２】
コンパイラ１３６は、１つ以上のテンソル計算ループ（テンソル計算が行われるループ）の外側ループを生成するように、かつ、外側ループの１つ以上のループ限界値を求めるように構成されてもよい。生成された外側ループは、テンソル計算ループの反復を外側ループの複数の反復に分割するために使用されてもよい。たとえば、計算システム１０２は６４個の計算ユニット（たとえば、計算タイルまたは数値演算ユニット）を含んでもよく、テンソル計算ループは１２８回の反復を含んでもよい。この例では、計算システム１０２は、６４個のテンソル計算を並列して行うことが可能である。６４個のテンソル計算を並列して行うために、テンソル計算ループの１２８回の反復は、各々がテンソル計算ループの６４回の反復を含む、２つの外側ループの反復に分割可能である。たとえば、外側ループの第１の反復は、テンソル計算ループの反復１〜６４を含んでもよい。外側ループの第２の反復は、テンソル計算ループの反復６５〜１２８を含んでもよい。このように、６４個のテンソル計算が、計算システムの６４個の計算ユニットの各々を用いて外側ループの第１の反復について並列して行われ（たとえば、１つのタイルにつき１つの計算）、６４個のテンソル計算が、６４個の計算ユニットを用いて外側ループの第２の反復について並列して行われる。
【００４３】
コンパイラ１３６は、外側ループが生成されるべきかどうかを判断し、生成されるべきであると判断すると、コンパイルされたプログラムにおいて外側ループを生成することができる。いくつかの実現例では、コンパイラ１３６は、プログラムが実行される計算システム１０２の計算ユニットの数よりも多い反復をテンソル計算ループが有している場合、外側ループを（コンパイルされているプログラムにおける任意の外側ループに加えて）生成するだけである。テンソル計算ループが計算ユニットの数よりも多い反復を有している場合、コンパイラ１３６は、外側ループを生成して、テンソル計算ループの反復を複数の外側ループの反復に分割可能である。
【００４４】
コンパイラ１３６は、テンソル計算が行われるループの反復回数、および／または、プログラムが実行される計算システム１０２の計算ユニットの数に基づいて、生成された外側ループのループ限界値を求めることもできる。テンソル計算ループの反復回数が計算ユニットの数の倍数であれば、反復回数は、ループに対応する次元における要素の数に等しくてもよい。計算ユニットの数は、計算ユニットを用いて並列して行うことが可能な反復回数の最大値を表すため、コンパイラ１３６は、計算ユニットの数でテンソル計算ループの反復回数を除算できる。たとえば、テンソル計算ループの反復回数が１２８であり計算ユニットの数が６４であれば、生成された外側ループのループ限界値は２（１２８／６４）でもよい。そのため、この例では、外側ループの第１の反復は、テンソル計算ループの６４回の並列反復を含み、外側ループの第２の反復は、テンソル計算ループの６４回の並列反復を含む。除算結果が余りを生じる場合、以下で説明するように、外側ループのループ限界値は、１だけインクリメントされてもよい。
【００４５】
コンパイラ１３６は、テンソル計算ループの反復回数と、プログラムが実行される計算システム１０２の計算ユニットの数とに基づいて、テンソル計算ループの１つ以上のループ限界値を求めることもできる。テンソル計算ループの反復回数が計算ユニットの数の正確な倍数である場合、テンソル計算ループのループ限界値は、テンソル計算ループについて生成された外側ループの各反復の計算ユニットの数と等しくなり得る。たとえば、テンソル計算ループが１２０回の反復を有し計算システムが６０個の計算ユニットを含む場合、テンソル計算ループのループ限界値は６０でもよく、外側ループのループ限界値は２でもよい。この例では、外側ループの第１の反復はテンソル計算ループの６０回の反復（並列反復）を含み、外側ループの第２の反復は、テンソル計算ループの６０回の反復を含んでもよい。
【００４６】
テンソル計算ループの反復回数が計算ユニットの数の正確な倍数でない場合、コンパイラ１３６は、テンソル計算ループの２つ以上のループ限界値を求めてもよい。たとえば、コンパイラ１３６は、テンソル計算ループの反復回数を計算ユニットの数で除算してもよい。反復回数は正確な倍数ではないので、この除算の結果は、余りの値を含むことになる。たとえば、反復回数は１６０でもよく、計算ユニットの数は５０でもよい。この例では、コンパイラ１３６は、反復回数（１６０）を計算ユニットの数（５０）で除算して、３の商と１０の余りを得てもよい。コンパイラ１３６は、計算ユニットの数（たとえば、５０）に等しいテンソル計算ループの第１のループ限界値と、余り（たとえば、１０）に等しいテンソル計算ループの代替ループ限界値とを設定できる。プログラムの実行中、代替ループ限界値を、外側ループの第１の反復のテンソル計算ループについて用いてもよく、第１のループ限界値を外側ループの各々の他の反復について用いてもよい。前の例を続けると、外側ループは、１６０／５０＝３で余りが１０の４のループ限界値を有することがあり、外側ループのループ限界値は、余りに基づいて１だけインクリメントされる。外側ループの第１の３回の反復の場合、テンソル計算ループのループ限界値は５０のことがある。そのため、外側ループの第１の３回の反復の各々について、テンソル計算ループの５０回の反復が並列して行われ、結果として１５０回の反復が行われることになる。外側ループの最後の反復について、テンソル計算ループのループ限界値は１０であり、テンソル計算ループの１６０回の反復全てが外側ループの４回の反復において行われることになる。
【００４７】
コンパイルされたプログラムは、コントローラ１０５のプロセッサに、外側ループの最後から２番目の反復が終了した後で外側ループの最後の反復が行われる前に、テンソル計算ループのループ限界値を第１のループ限界値から代替ループ限界値に変更させる命令を含み得る。このように、テンソル計算ループの反復を複数の外側ループの反復に分割するために生成された外側ループの最後の反復についてのテンソル計算ループのループ限界値として、代替ループ限界値のループ限界値が用いられる。
【００４８】
いくつかの実現例では、コンパイラ１３６は、テンソル計算ループがネストされている隣接した外側ループとして、すなわち、外側ループとテンソル計算ループとの間に他のループがネストされていない外側ループとして、テンソル計算ループの外側ループを生成可能である。いくつかの実現例では、コンパイラ１３６は、テンソル計算ループがネストされている、すなわち、外側ループが他のループ内にネストされていないネステッドループの最も外側のループとして、外側ループを生成可能である。ネステッドループの最も外側のループにおいて外側ループを生成することによって、ネストループおよびテンソルトラバーサルユニット１２０を用いて求められたメモリアドレスによって、テンソル要素がより隣接して整列する。たとえば、最後の反復のループ限界値を調整することなく、データが格納されないループの反復についてメモリアドレスが求められ、無駄なメモリ空間が生じることがある。ループの最後の反復についての代替の限界値によって、テンソルトラバーサルユニットは、付加的な命令を用いることなくテンソル要素のみのメモリアドレスを求めることができる。
【００４９】
図２は、複数の計算ユニット２１０を用いてテンソル２０５のトラバースを行うためのネステッドループ２１５および２２０の例を示す図である。個々の計算ユニット２１０は、計算タイルまたは数値演算ユニットであり得る。この例では、テンソル２０５は、Ｘ次元、Ｙ次元、およびＺ次元を有する３次元テンソルである。テンソル２０５は縮尺通りに描かれていないが、Ｘ次元は１６０個の要素の長さを有し、Ｙ次元は３０個の要素の長さを有し、Ｚ次元は１００個の要素の長さを有する。テンソル１０５の各要素は、ニューラルネットワーク計算で使用されるそれぞれのデータ値を格納可能である。
【００５０】
一般に、テンソルは、ネステッドループ２１５を用いてトラバース可能である。この例では、Ｘ次元は内側ループを用いてトラバースされ、Ｙ次元は中央ループを用いてトラバースされ、Ｚ次元は外側ループを用いてトラバースされる。内側ループの各反復について、メモリアドレスが、内側ループの反復に関してｘ、ｙ、およびｚの値に対応するテンソル要素について計算される。
【００５１】
複数の計算ユニット２１０は、計算システムの一部であり得る、たとえば、各計算ユニット２１０は、図１の計算タイル１１２‐Ａ〜１１２‐Ｚまたは図１の数値演算ユニット１２４と同じまたは同様であり得る。この例では、計算システムは６４個の計算ユニットを含むが、他の数の計算ユニットも可能である。計算ユニット２１０は、たとえばネステッドループ２２０を用いて、テンソル２０５についてテンソル計算を並列して行うことができる。
【００５２】
コンパイラ、たとえば図１のコンパイラ１３６は、ネステッドループ２１５（または、ネステッドループ２１５を表すコード）を含むプログラムと、プログラムが実行される計算システムの計算ユニット２１０の数とに基づいて、ネステッドループ２２０を生成できる。たとえば、コンパイラは、テンソル計算ループ（この例ではＸ次元についてのループ）の反復を複数の外側ループの反復に分割するために、外側ループが生成されるべきであると判断してもよい。
【００５３】
外側ループが生成されるべきかどうかを判断するために、コンパイラは、各テンソル計算ループの反復回数を、計算システムのハードウェアのプロパティと比較してもよい。たとえば、ハードウェアのプロパティは、計算ユニット２１０の数、または計算システムが並列して行うことができる計算の総数でもよい。テンソル計算ループのループの反復回数がハードウェアのプロパティの値を超える場合、コンパイラは外側ループを生成してもよい。この例では、Ｘ次元についてのループの反復回数（１６０）は、計算ユニットの数（６４）を上回る。このため、コンパイラは、インデックス変数「ｉ」を有する外側ループを生成している。
【００５４】
コンパイラは、テンソル計算ループの反復回数とハードウェアのプロパティの値（たとえば、計算ユニットの数）とに基づいて、外側ループのループ限界値を求めることもできる。たとえば、コンパイラは、テンソル計算ループの反復回数（１６０）を計算ユニットの数（６４）で除算することによって限界値を求めてもよく、その結果は２で余りが３２である。上述したように、外側ループ限界値は、いずれの余りについても１だけインクリメントしてもよい。このため、この例における外側ループ限界値は３である。
【００５５】
コンパイラは、テンソル計算ループの反復回数とハードウェアのプロパティの値とに基づいて、テンソル計算ループの１つ以上のループ限界値を求めることもできる。テンソル計算ループの反復回数がハードウェアのプロパティの値を超えない場合、テンソル計算ループのループ限界値は、反復回数に等しくなり得る。テンソル計算ループの反復回数がハードウェアのプロパティの正確な倍数である場合、テンソル計算ループのループ限界値は、ハードウェアのプロパティの値に等しくてもよい。テンソル計算ループの反復回数がハードウェアのプロパティの値を超えるがハードウェアのプロパティの値の正確な倍数ではない場合、テンソル計算ループは、ループの最後の反復以外の全てについての第１のループ限界値と、ループの最後の反復についての代替ループ限界値とを有してもよい。第１のループ限界値は、ハードウェアのプロパティの値に等しくてもよく、代替ループ限界値は、テンソル計算ループの反復回数をハードウェアのプロパティの値で除算した後の余りに等しくてもよい。
【００５６】
この例では、テンソル計算ループの反復回数（１６０）は計算ユニットの数（６４）を超えるが、計算ユニットの数の正確な倍数ではない。このため、Ｘ次元の第１のループ限界値は６４であり、代替限界値は３２である（１６０／６４＝２、余り３２）。外側ループ（ループｉ）の最初の２つの反復について、Ｘ次元のループのループ限界値は６４となる。外側ループの最後の反復について、Ｘ次元のループ限界値は３２となる。
【００５７】
外側ループの第１の反復回数について、テンソルの６４個のメモリアドレスを、６４個の計算ユニットを用いて並列して求めてもよい。たとえば、第１の計算ユニットは、ｚ＝０；ｙ＝０；ｘ＝０のメモリアドレスを求め、第２の計算ユニットは、ｚ＝０；ｙ＝０；ｘ＝０のメモリアドレスを求め、・・・第６４の計算ユニットは、ｚ＝０；ｙ＝０；ｘ＝６３のメモリアドレスを計算してもよい。外側ループの最後の反復について、６４個の計算ユニットのうち３２個の計算ユニットを用いて、内側ループの最後の３２回の反復を求めてもよい。
【００５８】
図３は、テンソル計算を行うためのプロセスの例３００を示すフローチャートである。プロセス３００は、１つ以上のコンピュータからなるシステム、たとえば、図１の計算システム１０２によって行われてもよい。
【００５９】
第１のネステッドループの１つ以上の第１の反復の各々について、第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、システムは、第２のネステッドループの反復を行う（３０２）。たとえば、第２のネステッドループは、テンソル計算（たとえば、メモリアドレス計算のドット積の計算）がプログラムの一部として行われるループでもよい。
【００６０】
第１のループは、たとえば、第１および第２のネストループを含むプログラムをコンパイルしたコンパイラによって生成された外側ループでもよい。たとえば、コンパイラは、テンソル計算ループの識別、テンソル計算ループの外側ループの生成を行うかどうかの判断を行うことができ、そのような生成を行うと判断した場合、生成された外側ループおよび／またはテンソル計算ループの１つ以上のループ限界値を求めることができる。
【００６１】
コンパイラは、第２のネステッドループの反復の総数（たとえば、第２のループに対応するテンソルの次元における要素の総数）とシステムの計算ユニットの数とに基づいて、第２のネステッドループの第１のループ限界値を求めることができる。たとえば、第２のループの反復の総数が計算ユニットの数よりも少ない場合、第１のループ限界値は、第２のネステッドループの反復の総数と等しくてもよい。第２のネステッドループの反復の総数が計算ユニットの数の正確な倍数である場合、第１のループ限界値は、反復回数に等しくてもよい。第２のネステッドループの反復の総数が計算ユニットの数よりも多いものの計算ユニットの正確な倍数でない場合、コンパイラは、第１のループ限界値を計算ユニットの数に設定してもよく、計算ユニットの数によって除算された第２のネステッドループの反復の総数の余りに等しい代替ループ限界値を求めてもよい。
【００６２】
この例では、第２のネステッドループの反復の総数は計算ユニットの数よりも多く、かつ、第２のネステッドループの反復の総数は計算ユニットの数の正確な倍数ではないと仮定する。このため、この例では、第１のネステッドループの１つ以上の第１の反復回数についての第２のネステッドループの反復回数は、第２のネステッドループが計算ユニットのハードウェアのプロパティの値を超える反復の総数を有することに応じて、第１のループ限界値によって制限される。
【００６３】
システムは、第２のネステッドループの反復を並列して行ってもよい。たとえば、上述した通り、第２のネステッドループの反復回数が計算ユニットの数を超えないように、第２のネステッドループの第１のループ限界値は求められてもよい。この例では、第１のネステッドループの１つ以上の第１の反復についての各々の第２のループの各反復は、並列して行うことができる。システムが第２のネステッドループの反復を計算ユニットに割当てると、システムは、第２のループのインデックス変数を反復することができる。インデックス変数が第１のループ限界値に等しくなると、第２のループは完了している。
【００６４】
システムは、第１のループの最後から２番目（すなわち、最後から１つ手前）の反復が完了しているかどうかを判断する（３０４）。たとえば、システムは、第１のループのインデックス変数を第１のループのループ限界値と比較してもよい。ループ限界値とインデックス変数との間の相違が特定の値（たとえば、１）の場合、システムは、第１のループの最後から２番目の反復が完了していないと判断してもよい。たとえば、「ｉ」のインデックス変数を有するループは、３つの反復を含んでもよい。この例では、ループは、「ｆｏｒ (ｉ＝０；ｉ＜３)」または「ｆｏｒ (ｉ＝１；ｉ＜４）」とプログラムされてもよい。
【００６５】
第１の例では、ループ限界値は３であり、ループの最後の反復はｉ＝２について行われ、ループの最後から２番目の反復はｉ＝１について行われる。一般に、インデックス変数は、典型的にはループの反復が行われるときにまたはその直後にインクリメントされる。この例では、ループの反復が行われた後のインデックス変数が２である場合、行われた反復は、最後から２番目の反復である。このため、限界値（３）とインデックス変数との間の相違が１に等しい場合、ループの最後から２番目の反復は終了した反復である。
【００６６】
同様に、第２の例では、ループ限界値は４であり、ループの最後の反復はｉ＝３について行われ、ループの最後から２番目の反復はｉ＝２について行われる。この例では、ループの反復が行われた後のインデックス変数が３の場合、行われた反復は最後から２番目の反復である。したがって、限界値（３）とインデックス変数との間の相違が１に等しい場合、ループの最後から２番目の反復は、終了した反復である。第１のループの最後から２番目の反復が終了していない場合、システムは動作３０２に戻って、更新されたインデックス変数値に対応する第１のネステッドループの次の反復について第２のネステッドループの反復を行う。
【００６７】
第１のループの最後から２番目の反復が完了している場合、システムは、第２のループについて、第１のループ限界値の代わりに代替限界値を用いる（３０８）。たとえば、システムは、第１のネステッドループの最後の反復について、第２のネステッドループ限界値に代替限界値を使用してもよい。
【００６８】
システムは、代替ループ限界値に達するまで、第１のネステッドループの反復について、第２のネステッドループの１つ以上の反復を行う（３１０）。たとえば、第２のネステッドループの複数の反復が残っている場合、システムは、複数の計算ユニットを用いて反復を並列して行ってもよい。
【００６９】
主題の実施形態および本明細書に記載されている機能動作は、本明細書に開示されている構造およびそれらの構造的等価物を含むデジタル電子回路、有形に具体化されたコンピュータソフトウェアもしくはファームウェア、コンピュータハードウェア、またはそれらのうちの１つ以上の組合わせで実現することができる。本明細書に記載されている主題の実施形態は、１つ以上のコンピュータプログラムとして、すなわちデータ処理装置によって実行されるようにまたはデータ処理装置の動作を制御するように有形の非一時的なプログラムキャリアに符号化されるコンピュータプログラム命令の１つ以上のモジュールとして実現可能である。代替的にまたはさらに、プログラム命令は、人工的に発生させた伝搬信号、たとえば機械によって生成される電気信号、光信号または電磁信号に符号化することができ、この信号は、情報を符号化するように生成され、好適な受信機装置に送信され、データ処理装置によって実行される。コンピュータ記憶媒体は、機械可読記憶装置、機械可読記憶基板、ランダムもしくはシリアルアクセスメモリデバイス、またはそれらのうちの１つ以上の組合わせであってもよい。
【００７０】
本明細書に記載されているプロセスおよび論理フローは、入力データ上で動作して出力を生成することによって機能を実行するように１つ以上のコンピュータプログラムを実行する１つ以上のプログラム可能なコンピュータによって実行することができる。これらのプロセスおよび論理フローは、特殊目的論理回路、たとえばＦＰＧＡ（フィールドプログラマブルゲートアレイ）、ＡＳＩＣ（特定用途向け集積回路）、ＧＰＧＰＵ（汎用グラフィックス処理ユニット）またはその他の処理ユニットによっても実行されてもよく、装置は、特殊目的論地回路、たとえばＦＰＧＡ、ＡＩＳＣ、またはＧＰＧＰＵとして実現されてもよい。
【００７１】
コンピュータプログラムの実行に適したコンピュータは、一例として、汎用マイクロプロセッサもしくは特殊目的マイクロプロセッサもしくはそれら両方、またはその他の種類の中央処理装置を含み、それらに基づくものであってもよい。一般に、中央処理装置は、リードオンリメモリまたはランダムアクセスメモリまたはそれら両方から命令およびデータを受信する。コンピュータの必須の要素は、命令を実施または実行するための中央処理装置、ならびに、命令およびデータを記憶するための１つ以上のメモリ装置である。一般に、コンピュータは、データを格納するための１つ以上の大容量記憶装置（たとえば磁気ディスク、光磁気ディスクもしくは光ディスク）も含み、または、１つ以上の大容量記憶装置からデータを受信するように、もしくは１つ以上の大容量記憶装置にデータを送信するように、もしくは１つ以上の大容量記憶装置に対してデータを送受信するように動作可能に結合される。しかしながら、コンピュータはこのような装置を有していなくてもよい。さらに、コンピュータは、別の装置、たとえばほんの数例を挙げると、携帯電話、パーソナルデジタルアシスタント（ＰＤＡ）、携帯オーディオまたはビデオプレーヤ、ゲーム機、グローバルポジショニングシステム（ＧＰＳ）受信機、または携帯型記憶装置（たとえば、ユニバーサルシリアルバス（ＵＳＢ）フラッシュドライブ）に組み込まれてもよい。
【００７２】
コンピュータプログラム命令およびデータの格納に好適なコンピュータ可読媒体は、全ての形態の不揮発性メモリ、媒体およびメモリデバイスを含み、これらのデバイスは、一例として、半導体メモリデバイス（たとえば、ＥＰＲＯＭ、ＥＥＰＲＯＭおよびフラッシュメモリデバイス）、磁気ディスク（たとえば、内部ハードディスクまたはリムーバブルディスク）、磁気ディスク（たとえば、内部ハードディスクまたはリムーバブルディスク）、光磁気ディスク、ならびにＣＤ  ＲＯＭおよびＤＶＤ−ＲＯＭディスクを含む。プロセッサおよびメモリは、特殊目的論理回路によって補完されてもよく、または特殊目的論理回路に組み入れられてもよい。
【００７３】
本明細書は、多くの具体的な実現例の詳細を含んでいるが、これらは、いずれの発明または請求の範囲を限定するものとして解釈されるべきではなく、特定の発明の特定の実施形態に特有の特徴を説明するものとして解釈されるべきである。別々の実施形態の文脈で本明細書に記載されている特定の特徴は、単一の実施形態において組み合わせて実現することも可能である。逆に、単一の実施形態の文脈で記載されているさまざまな特徴は、複数の実施形態において別々にまたは任意の好適な部分的な組み合わせで実現することも可能である。さらに、特徴は、特定の組合わせで動作するものとして上記され、最初にそのように記載されているかもしれないが、記載されている組み合わせの中の１つ以上の特徴は、場合によってはこの組合わせから除外されてもよく、記載されている組み合わせは、部分的な組み合わせまたは部分的な組み合わせの変形例を対象としてもよい。
【００７４】
同様に、動作は、特定の順序で図面に示されているが、これは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序でこのような動作を実行しなければならないものとして理解されるべきではなく、示されている動作を全て実行しなければならないものとして理解されるべきでもない。特定の状況では、マルチタスクおよび並列処理が有利である場合もある。さらに、上記の実施形態におけるさまざまなシステムモジュールおよびコンポーネントの分離は、このような分離が全ての実施形態で必要であるものとして理解されるべきではなく、記載されているプログラムコンポーネントおよびシステムは、一般に、単一のソフトウェア製品に一体化されるかまたは複数のソフトウェア製品にパッケージングされてもよいということが理解されるべきである。
【００７５】
主題の特定の実施形態について説明してきた。他の実施形態は、以下の特許請求の範囲の範囲内である。たとえば、特許請求の範囲に記載されている動作は、異なる順序で実行されても、依然として望ましい結果を達成することができる。一例として、添付の図面に示されているプロセスは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序を必ずしも必要としない。特定の実現例では、マルチタスクおよび並列処理が有利である場合もある。
【図１】
2020524318.tif 000003
【図２】
2020524318.tif 000004
【図３】
2020524318.tif 000005
【手続補正書】
【提出日】令和2年1月8日(2020.1.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
Ｎ次元テンソルにアクセスするために計算システムによって行われる方法であって、
第１のネステッドループの１つ以上の第１の反復の各々について、前記第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、前記第２のネステッドループの反復を行うことを備え、前記第１のネステッドループの前記１つ以上の第１の反復についての前記第２のネステッドループの反復回数は、前記第２のネステッドループが前記計算システムの計算ユニットの数の値を超える反復の総数を有することに応じて、前記第１のループ限界値によって制限され、前記方法はさらに、
前記第１のネステッドループの最後から２番目の反復が終了した後で、前記第１のループ限界値よりも小さい代替ループ限界値に達するまで、前記第１のネステッドループの最後の反復について前記第２のネステッドループの１つ以上の反復を行うことを備える、方法。
【請求項２】
前記第１のネステッドループの前記最後から２番目の反復が終了したという判断に応じて、前記第１のネステッドループの前記最後の反復について、前記第１のループ限界値の代わりに前記代替限界値を用いることをさらに備える、請求項１に記載の方法。
【請求項３】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項１または２に記載の方法。
【請求項４】
前記第２のネステッドループの前記第１のループ限界値に達するまで、前記第１のネステッドループ内にネストされた前記第２のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第２のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第２のネステッドループのそれぞれの反復を行う、請求項１〜３のいずれか１項に記載の方法。
【請求項５】
前記代替ループ限界値は、前記第２のネステッドループの前記反復の総数を前記計算ユニットの前記数で除算することによって生じる余りの値に基づいている、請求項１〜４のいずれか１項に記載の方法。
【請求項６】
前記第１のネステッドループと前記第２のネステッドループとを含むネステッドループの組は、前記第１のネステッドループと前記第２のネステッドループとの間でネストされた１つ以上のループを含み、前記第２のネステッドループは他のループ内にネストされている、請求項１〜５のいずれか１項に記載の方法。
【請求項７】
前記第２のネステッドループは、前記第１のネステッドループと前記第２のネステッドループとの間に他のループがネストされていない状態で、前記第１のネステッドループ内に直接ネストされている、請求項１〜５のいずれか１項に記載の方法。
【請求項８】
Ｎ次元テンソルにアクセスするためのシステムであって、
複数の個別の計算ユニットと、
１つ以上のプロセッサとを備え、前記１つ以上のプロセッサは、
第１のネステッドループの１つ以上の第１の反復の各々について、前記第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、前記第２のネステッドループの反復を行うように構成されており、前記第１のネステッドループの前記１つ以上の第１の反復についての前記第２のネステッドループの反復回数は、前記第２のネステッドループが前記計算ユニットの数の値を超える反復の総数を有することに応じて、前記第１のループ限界値によって制限され、
前記１つ以上のプロセッサはさらに、
前記第１のネステッドループの最後から２番目の反復が終了した後で、前記第１のループ限界値よりも小さい代替ループ限界値に達するまで、前記第１のネステッドループの最後の反復について前記第２のネステッドループの１つ以上の反復を行うように構成されている、システム。
【請求項９】
前記１つ以上のプロセッサはさらに、前記第１のネステッドループの前記最後から２番目の反復が終了したという判断に応じて、前記第１のネステッドループの前記最後の反復について、前記第１のループ限界値の代わりに前記代替限界値を用いるように構成されている、請求項８に記載のシステム。
【請求項１０】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項８または９に記載のシステム。
【請求項１１】
前記第２のネステッドループの前記第１のループ限界値に達するまで、前記第１のネステッドループ内にネストされた前記第２のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第２のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第２のネステッドループのそれぞれの反復を行う、請求項８〜１０のいずれか１項に記載のシステム。
【請求項１２】
前記代替ループ限界値は、前記第２のネステッドループの前記反復の総数を前記計算ユニットの前記数で除算することによって生じる余りの値に基づいている、請求項８〜１１のいずれか１項に記載のシステム。
【請求項１３】
前記第１のネステッドループと前記第２のネステッドループとを含むネステッドループの組は、前記第１のネステッドループと前記第２のネステッドループとの間でネストされた１つ以上のループを含み、前記第２のネステッドループは、他のループ内にネストされている、請求項８〜１２のいずれか１項に記載のシステム。
【請求項１４】
前記第２のネステッドループは、前記第１のネステッドループと前記第２のネステッドループとの間に他のループがネストされていない状態で、前記第１のネステッドループ内に直接ネストされている、請求項８〜１２のいずれか１項に記載のシステム。
【請求項１５】
Ｎ次元テンソルにアクセスするための装置であって、
各々がテンソル要素のメモリアドレスを計算する複数の個別の計算ユニットと、
動作を行うことによって、ネステッドループの反復を前記個別の計算ユニットへ割当てるように構成されたコントローラとを備え、前記動作は、
第１のネステッドループの１つ以上の第１の反復の各々について、前記第１のネステッドループ内にネストされた第２のネステッドループの第１のループ限界値に達するまで、前記第２のネステッドループの反復を行うことを含み、前記第１のネステッドループの前記１つ以上の第１の反復についての前記第２のネステッドループの反復回数は、前記第２のネステッドループが前記計算ユニットの数の値を超える反復の総数を有することに応じて、前記第１のループ限界値によって制限され、前記計算ユニットのうちの１つが前記第２のネステッドループの各々の反復についてテンソル要素のメモリアドレスを決定し、前記動作はさらに、
前記第１のネステッドループの最後から２番目の反復が終了した後で、前記第１のループ限界値よりも小さい代替ループ限界値に達するまで、前記第１のネステッドループの最後の反復について前記第２のネステッドループの１つ以上の反復を行うことを含む、装置。
【請求項１６】
前記コントローラは、前記第１のネステッドループの前記最後から２番目の反復が終了したという判断に応じて、前記第１のネステッドループの前記最後の反復について、前記第１のループ限界値の代わりに前記代替限界値を用いることを含む動作をさらに行うように構成されている、請求項１５に記載の装置。
【請求項１７】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項１５または１６に記載の装置。
【請求項１８】
前記第２のネステッドループの前記第１のループ限界値に達するまで、前記第１のネステッドループ内にネストされた前記第２のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第２のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第２のネステッドループのそれぞれの反復を行う、請求項１５〜１７のいずれか１項に記載の装置。
【請求項１９】
前記代替ループ限界値は、前記第２のネステッドループの前記反復の総数を前記計算ユニットの前記数で除算することによって生じる余りの値に基づいている、請求項１５〜１８のいずれか１項に記載の方法。
【国際調査報告】
2020524318.tif 000006
2020524318.tif 000007