(57)【要約】  Ｎ次元テンソルにアクセスするための装置を含む方法、システムおよび装置であって、この装置は、Ｎ次元テンソルの各次元について、部分アドレスオフセット値要素を含み、部分アドレスオフセット値要素は、次元の初期値、次元のステップ値および次元のループの繰り返し回数に少なくとも基づいて次元の部分アドレスオフセット値を格納する。この装置は、ハードウェア加算器と、プロセッサとを含む。プロセッサは、Ｎ次元テンソルの特定の要素にアクセスするための命令を取得する。Ｎ次元テンソルは、Ｎ個の次元の各々にわたって配置された複数の要素を有し、Ｎは、１以上の整数である。プロセッサは、部分アドレスオフセット値要素およびハードウェア加算器を使用して、特定の要素のアドレスを求め、特定の要素にアクセスするための求められたアドレスを示すデータを出力する。
2020521198.tif 000002
【特許請求の範囲】
【請求項１】
Ｎ次元テンソルにアクセスするための命令を処理する装置であって、
前記Ｎ次元テンソルの各次元について、部分アドレスオフセット値要素を備え、前記部分アドレスオフセット値要素は、前記次元の初期値、前記次元のステップ値および前記次元のループの繰り返し回数に少なくとも基づいて前記次元の部分アドレスオフセット値を格納し、前記装置はさらに、
１つ以上のハードウェア加算器と、
１つ以上のプロセッサとを備え、前記１つ以上のプロセッサは、
前記Ｎ次元テンソルの特定の要素にアクセスするための命令を取得するように構成され、前記Ｎ次元テンソルは、前記Ｎ個の次元の各々にわたって配置された複数の要素を有し、Ｎは、１以上の整数であり、前記１つ以上のプロセッサはさらに、
前記部分アドレスオフセット値要素および前記１つ以上のハードウェア加算器のうちの１つ以上を使用して、前記特定の要素のアドレスを求めるように構成され、
前記Ｎ次元テンソルの前記特定の要素にアクセスするための前記求められたアドレスを示すデータを出力するように構成される、装置。
【請求項２】
各次元について、
前記次元の前記初期値を格納する初期値要素と、
前記次元の前記ステップ値を格納するステップ値要素とをさらに備える、請求項１に記載の装置。
【請求項３】
各部分アドレスオフセット値要素、各初期値要素および各ステップ値要素は、レジスタを備える、請求項２に記載の装置。
【請求項４】
前記特定の要素の前記アドレスを求めることは、前記１つ以上のハードウェア加算器を使用して各次元について前記部分アドレスオフセット値の合計を求めることを備える、請求項１から３のいずれか１項に記載の装置。
【請求項５】
前記１つ以上のプロセッサはさらに、
各次元について、前記ステップ値を前記次元の以前のアドレスオフセット値に加算することによって、前記次元のネステッドループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めるように構成される、請求項１から４のいずれか１項に記載の装置。
【請求項６】
各次元について、前記次元の限界値を格納する限界値要素をさらに備え、前記１つ以上のプロセッサはさらに、
各次元について、次元の前記求められた部分アドレスオフセット値が前記次元の前記限界値に等しいか否かを判断するように構成され、
第１のネステッドループに対応する第１の次元の前記求められた部分アドレスオフセット値が前記第１の次元の前記限界値に等しいと判断したことに応答して、
前記第１の次元の前記部分アドレスオフセット値を前記第１の次元の前記初期値にリセットするように構成され、
前記第１のネステッドループがネストされる第２のネステッドループに対応する第２の次元について、前記１つ以上のハードウェア加算器を使用して、前記第２の次元の前記ステップ値と前記第２の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第２の次元の前記部分アドレスオフセット値を更新するように構成される、請求項５に記載の装置。
【請求項７】
各次元の前記ステップ値は、１つ以上の前記次元における要素の個数に基づく予め定められた値である、請求項１から６のいずれか１項に記載の装置。
【請求項８】
システムであって、
Ｎ次元テンソルに対して線形代数演算を実行するように構成された１つ以上のプロセッサを備え、前記Ｎ次元テンソルは、前記Ｎ個の次元の各々にわたって配置された複数の要素を有し、Ｎは、１以上の整数であり、前記システムはさらに、
前記Ｎ個の次元の各次元について、部分アドレスオフセット値要素を備え、前記部分アドレスオフセット値要素は、前記次元の初期値、前記次元のステップ値および前記次元のループの繰り返し回数に少なくとも基づいて前記次元の部分アドレスオフセット値を格納し、前記システムはさらに、
１つ以上のハードウェア加算器を含む回路を備え、前記回路は、
前記Ｎ次元テンソルの特定の要素にアクセスするための命令を取得するように構成され、
前記部分アドレスオフセット値要素および前記１つ以上のハードウェア加算器のうちの１つ以上を使用して、前記特定の要素のアドレスを求めるように構成され、
前記Ｎ次元テンソルの前記特定の要素にアクセスするための前記求められたアドレスを示すデータを出力するように構成される、システム。
【請求項９】
各次元について、
前記次元の前記初期値を格納する初期値要素と、
前記次元の前記ステップ値を格納するステップ値要素とをさらに備える、請求項８に記載のシステム。
【請求項１０】
各部分アドレスオフセット値要素、各初期値要素および各ステップ値要素は、レジスタを備える、請求項９に記載のシステム。
【請求項１１】
前記特定の要素の前記アドレスを求めることは、前記１つ以上のハードウェア加算器を使用して各次元について前記部分アドレスオフセット値の合計を求めることを備える、請求項８に記載のシステム。
【請求項１２】
前記回路はさらに、
各次元について、前記ステップ値を前記次元の以前のアドレスオフセット値に加算することによって、前記次元のネステッドループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めるように構成される、請求項８から１０のいずれか１項に記載のシステム。
【請求項１３】
各次元について、前記次元の限界値を格納する限界値要素をさらに備え、前記回路はさらに、
各次元について、次元の前記求められた部分アドレスオフセット値が前記次元の前記限界値に等しいか否かを判断するように構成され、
第１のネステッドループに対応する第１の次元の前記求められた部分アドレスオフセット値が前記第１の次元の前記限界値に等しいと判断したことに応答して、
前記第１の次元の前記部分アドレスオフセット値を前記第１の次元の前記初期値にリセットするように構成され、
前記第１のネステッドループがネストされる第２のネステッドループに対応する第２の次元について、前記１つ以上のハードウェア加算器を使用して、前記第２の次元の前記ステップ値と前記第２の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第２の次元の前記部分アドレスオフセット値を更新するように構成される、請求項１２に記載のシステム。
【請求項１４】
各次元の前記ステップ値は、１つ以上の前記次元における要素の個数に基づく予め定められた値である、請求項８から１３のいずれか１項に記載のシステム。
【請求項１５】
コンピュータによって実行される方法であって、
Ｎ次元テンソルの特定の要素にアクセスするための命令を取得するステップを備え、前記Ｎ次元テンソルは、前記Ｎ個の次元の各々にわたって配置された複数の要素を有し、Ｎは、１以上の整数であり、前記方法はさらに、
それぞれの部分アドレスオフセット要素に格納された部分アドレスオフセット値および１つ以上のハードウェア加算器を使用して、前記特定の要素のアドレスを求めるステップを備え、前記部分アドレス値は、各次元の部分アドレスオフセット値を含み、次元の前記部分アドレス値は、前記次元の初期値、前記次元のステップ値および前記次元のループの繰り返し回数に少なくとも基づいており、前記方法はさらに、
前記Ｎ次元テンソルの前記特定の要素にアクセスするための前記求められたアドレスを示すデータを出力するステップを備える、方法。
【請求項１６】
各次元の前記初期値は、前記次元の初期値要素に格納され、
前記次元の前記ステップ値は、前記次元のステップ値要素に格納される、請求項１５に記載の方法。
【請求項１７】
各部分アドレスオフセット値要素、各初期値要素および各ステップ値要素は、レジスタを備える、請求項１６に記載の方法。
【請求項１８】
前記特定の要素の前記アドレスを求めるステップは、前記１つ以上のハードウェア加算器を使用して各次元について前記部分アドレスオフセット値の合計を求めるステップを備える、請求項１５から１７のいずれか１項に記載の方法。
【請求項１９】
各次元について、前記ステップ値を前記次元の以前のアドレスオフセット値に加算することによって、前記次元のネステッドループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めるステップをさらに備える、請求項１５から１８のいずれか１項に記載の方法。
【請求項２０】
各次元について、次元の前記求められた部分アドレスオフセット値が前記次元の限界値に等しいか否かを判断するステップと、
第１のネステッドループに対応する第１の次元の前記求められた部分アドレスオフセット値が前記第１の次元の前記限界値に等しいと判断したことに応答して、
前記第１の次元の前記部分アドレスオフセット値を前記第１の次元の前記初期値にリセットするステップと、
前記第１のネステッドループがネストされる第２のネステッドループに対応する第２の次元について、前記１つ以上のハードウェア加算器を使用して、前記第２の次元の前記ステップ値と前記第２の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第２の次元の前記部分アドレスオフセット値を更新するステップとをさらに備える、請求項１９に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
背景
本明細書は、一般に、ハードウェア加算器を有する特殊目的計算ユニットを使用して機械学習計算を実行することに関する。
【発明の概要】
【０００２】
ニューラルネットワークは、モデルの１つ以上のレイヤを利用して、受信した入力に対する出力、たとえば分類、を生成する機械学習モデルである。ニューラルネットワークの中には、出力レイヤに加えて１つ以上の隠れレイヤを含んでいるものもある。各隠れレイヤの出力は、ネットワーク内の次のレイヤ、すなわちネットワークの次の隠れレイヤまたは出力レイヤ、への入力として使用される。ネットワークの各レイヤは、それぞれのパラメータセットの現在の値に従って、受信した入力から出力を生成する。
【０００３】
ニューラルネットワークの中には、１つ以上の畳み込みニューラルネットワークレイヤを含んでいるものもある。各畳み込みニューラルネットワークレイヤは、関連付けられたカーネルセットを有する。カーネルは、重み入力のマトリクス構造として表すことができる。各畳み込みレイヤは、カーネルを使用してレイヤへの入力を処理する。レイヤへの入力セットも、マトリクス構造として表すことができる。
【０００４】
概要
本明細書には、テンソル要素のメモリアドレスを求めるために１つ以上のハードウェア加算器を使用してＮ次元テンソルにアクセスすることに関連する技術が記載されている。
【０００５】
概して、本明細書に記載されている主題の１つの革新的局面は、Ｎ次元テンソルにアクセスするための装置で具体化することができる。上記装置は、上記Ｎ次元テンソルの各次元について、部分アドレスオフセット値要素を含んでもよく、上記部分アドレスオフセット値要素は、上記次元の初期値、上記次元のステップ値および上記次元のループの繰り返し回数に少なくとも基づいて上記次元の部分アドレスオフセット値を格納する。また、上記装置は、１つ以上のハードウェア加算器と、１つ以上のプロセッサとを含んでもよい。上記１つ以上のプロセッサは、上記Ｎ次元テンソルの特定の要素にアクセスするための命令を取得するように構成されてもよい。上記Ｎ次元テンソルは、上記Ｎ個の次元の各々にわたって配置された複数の要素を有してもよい。Ｎは、１以上の整数であってもよい。上記プロセッサは、上記部分アドレスオフセット値要素および上記１つ以上のハードウェア加算器のうちの１つ以上を使用して、上記特定の要素のアドレスを求め、上記Ｎ次元テンソルの上記特定の要素にアクセスするための上記求められたアドレスを示すデータを出力してもよい。
【０００６】
これらのおよび他の実現例の各々は、任意に、以下の特徴のうちの１つ以上を含んでもよい。いくつかの局面では、上記装置は、各次元について、上記次元の上記初期値を格納する初期値要素と、上記次元の上記ステップ値を格納するステップ値要素とを含んでもよい。各部分アドレスオフセット値要素、各初期値要素および各ステップ値要素は、レジスタを含んでもよい。
【０００７】
いくつかの局面では、上記特定の要素の上記アドレスを求めることは、上記１つ以上のハードウェア加算器を使用して各次元について上記部分アドレスオフセット値の合計を求めることを含んでもよい。上記１つ以上のプロセッサは、各次元について、上記ステップ値を上記次元の以前のアドレスオフセット値に加算することによって、上記次元のネステッドループの各繰り返し後に上記次元の上記部分アドレスオフセット値を求めるように構成されてもよい。
【０００８】
上記装置は、各次元について、上記次元の限界値を格納する限界値要素を含んでもよい。上記１つ以上のプロセッサは、各次元について、次元の上記求められた部分アドレスオフセット値が上記次元の上記限界値に等しいか否かを判断してもよい。第１のネステッドループに対応する第１の次元の上記求められた部分アドレスオフセット値が上記第１の次元の上記限界値に等しいと判断したことに応答して、上記１つ以上のプロセッサは、上記第１の次元の上記部分アドレスオフセット値を上記第１の次元の上記初期値にリセットし、上記第１のネステッドループがネストされる第２のネステッドループに対応する第２の次元について、上記１つ以上のハードウェア加算器を使用して、上記第２の次元の上記ステップ値と上記第２の次元の上記部分アドレスオフセット値との合計に等しくなるように上記第２の次元の上記部分アドレスオフセット値を更新してもよい。いくつかの局面では、各次元の上記ステップ値は、１つ以上の上記次元における要素の個数に基づく予め定められた値である。
【０００９】
本明細書に記載されている主題は、以下の利点のうちの１つ以上を実現するように特定の実施形態において実現することができる。レジスタを使用してメモリアドレス値を追跡することによって、プログラムは、１つの命令で、深くネストされたループを繰り返すことができるようになる。メモリアドレス値は、レジスタに格納された値に基づいて単純な加算を適用することによって速やかに求めることができる。特殊目的計算ユニットは、アドレスを計算する加算器を含み得る。算術論理演算ユニット（ＡＬＵ）、乗算器または他の複雑な回路ではなく加算器を使用することによって、回路のサイズおよび回路の製造コストを下げることができる。ハードウェア加算器を使用してメモリアドレス値を求めることによって、プロセッサにおける計算サイクル数を減らすことができ、他の計算タスクのためのプロセッサ帯域幅が増加する。命令数を減らした状態でテンソルをトラバースすることができる。二次元レジスタアーキテクチャは、同時に追跡される異なる次元を各々が有する多次元テンソルを可能にする。
【００１０】
これおよび他の局面の他の実現例は、コンピュータ記憶装置上に符号化された方法のアクションを実行するように構成された対応するシステム、方法およびコンピュータプログラムを含む。１つ以上のコンピュータからなるシステムは、動作時にシステムにアクションを実行させる、システムにインストールされたソフトウェア、ファームウェア、ハードウェアまたはそれらの組み合わせによってそのように構成することができる。１つ以上のコンピュータプログラムは、データ処理装置によって実行されたときに装置にアクションを実行させる命令を有することによってそのように構成することができる。
【００１１】
本明細書に記載されている主題の１つ以上の実現例の詳細については、添付の図面および以下の説明に記載されている。主題の他の考えられる特徴、局面および利点は、明細書、図面および特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【００１２】
【図１】計算システムの一例のブロック図である。
【図２Ａ】テンソルトラバーサルユニットの一例を示す図である。
【図２Ｂ】テンソルトラバーサルユニットの一例を示す図である。
【図２Ｃ】テンソルトラバーサルユニットの一例を示す図である。
【図２Ｄ】テンソルトラバーサルユニットの一例を示す図である。
【図２Ｅ】テンソルトラバーサルユニットの一例を示す図である。
【図２Ｆ】テンソルトラバーサルユニットの一例を示す図である。
【図２Ｇ】テンソルトラバーサルユニットの一例を示す図である。
【図２Ｈ】テンソルトラバーサルユニットの一例を示す図である。
【図３】多次元テンソル変数のアドレスを求めるためのプロセスの一例を示すフロー図である。
【発明を実施するための形態】
【００１３】
さまざまな図面中の同様の参照番号および名称は、同様の要素を示す。
詳細な説明
一般に、ソフトウェアアルゴリズムがＮ次元テンソルを処理する際にネステッドループが使用されてもよい。各ループは、Ｎ次元テンソルのそれぞれの次元をトラバースすることに関与し得る。多次元テンソルは、マトリクスまたは多次元マトリクスであってもよい。たとえば、二次元テンソルは、マトリクスであり、三次元テンソルは、複数の二次元マトリクスで構成される三次元マトリクスである。Ｎ次元テンソルの各次元は、１つ以上の要素を含んでもよく、各要素は、それぞれのデータ値を格納してもよい。たとえば、テンソルは、プログラムにおける変数であってもよく、この変数は、３つの次元を有してもよい。第１の次元は、３００個の要素の長さを有してもよく、第２の次元は、１０００個の要素の長さを有してもよく、第３の次元は、２０個の要素の長さを有してもよい。当然のことながら、各次元において他の個数の要素も可能である。
【００１４】
ネステッドループにおいてテンソルをトラバースすることは、要素のメモリアドレス値を計算して、この要素の対応するデータ値をロードまたは格納することを含み得る。ｆｏｒループは、３つのループインデックス変数（たとえば、ｉ、ｊおよびｋ）によって追跡される３つのループを、三次元テンソルをトラバースするようにネストすることができるネステッドループの一例である。ニューラルネットワークでは、テンソルに関連付けられた１つ以上のドット積計算に要素の値が使用されてもよい。たとえば、要素の値は、対応するパラメータまたは重みを乗算されてもよい。要素にアクセスして要素の値を用いて１つ以上の計算を実行するために、テンソルの要素は、ネステッドｆｏｒループを使用して順番にトラバースされてもよい。引き続き三次元テンソルの例を参照して、外側ｆｏｒループを使用して、変数ｉによって追跡されるループをトラバースしてもよく、中間ｆｏｒループループを使用して、変数ｊによって追跡されるループをトラバースしてもよく、内側ｆｏｒループを使用して、変数ｋによって追跡されるループをトラバースしてもよい。この例では、アクセスされる第１の要素は（ｉ＝０，ｊ＝０，ｋ＝０）であってもよく、第２の要素は（ｉ＝０，ｊ＝０，ｋ＝１）であってもよい、などである。以下で説明するように、テンソルトラバーサルユニットを使用する目的は、ネステッドループを使用して順番に各要素のメモリアドレスを求めることによって、処理ユニットが要素の値にアクセスして、この要素の値を使用して１つ以上の計算を実行することができるようにすることである。重みまたはパラメータの値にも、ネステッドｆｏｒループを使用して同様にアクセスすることができる。また、テンソルトラバーサルユニットは、計算に使用される重みもしくはパラメータのアドレス、および／または、計算の出力のアドレスを求める目的でも使用することができ、計算の出力は、ニューラルネットワークの隠れレイヤへの入力として使用されてもよい。
【００１５】
場合によっては、プロセッサは、外側ループインデックス変数を用いて内側ループのループ境界を設定するなど、ループ境界条件を実行する必要があるかもしれない。たとえば、ネステッドループの最も内側のループを出るか否かを判断する際に、プログラムは、最も内側のループのループインデックス変数の現在の値とネステッドループの最も外側のループのループインデックス変数の現在の値とを比較してもよい。
【００１６】
これらのタスクは、分岐命令および整数演算命令などの相当数の命令を必要とする可能性がある。各ループ境界が小さく、ループの数が多い場合には、計算が全実行時間のうちのかなりの部分を占めて、全体的性能を非常に劣化させるおそれがある。プロセッサのためのハードウェアテンソルトラバーサルユニットは、テンソルをトラバースする際にプロセッサが処理しなければならない次元の個数を減少させることによってプロセッサの計算帯域幅を増加させることができる。
【００１７】
図１は、テンソルをトラバースするためのコンピューティングシステムの一例１００のブロック図を示す。一般に、コンピューティングシステム１００は、入力１０４を処理して出力１１６を生成する。コンピューティングシステム１００は、線形代数計算を実行するように構成されてもよい。入力１０４は、コンピューティングシステム１００が処理することができる任意の好適なデータであってもよい。コンピューティングシステム１００は、処理ユニット１０２と、記憶媒体１０４と、テンソルトラバーサルユニット１０６とを含む。
【００１８】
一般に、処理ユニット１０２が、テンソルの特定の要素にアクセスするための命令を実行すると、テンソルトラバーサルユニット１０６は、このテンソルの特定の要素のアドレスを求め、それにより、処理ユニット１０２が記憶媒体１０４にアクセスして特定の要素の値を表すデータ１１４を読み出すことができる。たとえば、プログラムは、ネステッドループを含んでもよく、処理ユニット１０２は、ネステッドループに関連付けられた現在のインデックス変数値に従って、ネステッドループ内の二次元配列変数の要素にアクセスするための命令を実行してもよい。ネステッドループに関連付けられた現在のインデックス変数値に基づいて、テンソルトラバーサルユニット１０６は、二次元配列変数の第１の要素のメモリアドレスからのオフセットを表すアドレスオフセット値を求めてもよい。次いで、処理ユニット１０２は、このアドレスオフセット値を使用して、記憶媒体から二次元配列変数の特定の要素にアクセスしてもよい。
【００１９】
処理ユニット１０２は、記憶媒体１０４に格納された命令１１２または別の記憶装置に格納された他の命令を含む、コンピューティングシステム１００内で実行される命令を処理するように構成される。処理ユニット１０２は、１つ以上のプロセッサを含んでもよい。記憶媒体１０４は、コンピューティングシステム１００内の情報を格納する。いくつかの実現例では、記憶媒体１０４は、１つまたは複数の揮発性メモリユニットである。いくつかの他の実現例では、記憶媒体１０４は、１つまたは複数の不揮発性メモリユニットである。また、記憶媒体１０４は、フロッピー（登録商標）ディスクデバイス、ハードディスクデバイス、光ディスクデバイスもしくはテープデバイス、フラッシュメモリもしくは他の同様のソリッドステートメモリデバイス、または一連のデバイス（ストレージエリアネットワークもしくは他の構成のデバイスを含む）などの、別の形態のコンピュータ読取可能媒体であってもよい。命令は、処理ユニット１０２によって実行されると、処理ユニット１０２に１つ以上のタスクを実行させる。
【００２０】
テンソルトラバーサルユニット１０６は、特定用途向け集積回路として実現されてもよい。テンソルトラバーサルユニット１０６は、１つ以上のテンソルに関連付けられた状態を判断するように構成されてもよい。この状態は、ループ境界値、現在のループインデックス変数値、メモリアドレス値を求めるための部分アドレスオフセット値、および／または、分岐ループ境界を処理するためのプログラムカウンタ値を含んでもよい。
【００２１】
テンソルトラバーサルユニット１０６は、テンソルインデックスをメモリアドレスに変換する。たとえば、テンソルトラバーサルユニット１０６は、一組のＮ次元テンソルインデックスを一次元アドレス空間に変換してもよい。テンソルトラバーサルユニットは、テンソル要素のメモリアドレスを要素の次元インデックスの組み合わせ（たとえば、線形組み合わせ）にすることによってこのような変換を実行することができる。
【００２２】
テンソルトラバーサルユニット１０６は、テンソル要素のシーケンスを参照するアドレスのシーケンスを効率的にプログラムに従って生成することができる。このアドレスのシーケンスは、ソフトウェアトラバーサルルーチンにおけるループネストによってアクセスされるであろうテンソル要素のシーケンスに対応する。トラバーサル中にアクセスされる要素のシーケンスは、メモリ内で物理的に連続している場合もあれば、そうでない場合もある。図２Ｂ〜図２Ｈに示され、以下で説明する例は、要素のシーケンスがどのようにしてメモリ内で物理的に連続していないかの一例を示す。
【００２３】
テンソルトラバーサルユニット１０６は、テンソルアドレス値要素１２２と、ハードウェア加算器ユニット１２４とを含む。テンソルアドレス値要素１２２の各々は、記憶要素、たとえばレジスタまたはその他の好適な記憶回路であってもよい。いくつかの実現例では、図２Ａ〜図２Ｈを参照して以下でより詳細に説明するように、テンソルアドレス値要素１２２は、異なるグループに物理的または論理的に分類されてもよい。いくつかの実現例では、テンソルアドレス値要素１２２のグループは、多次元配列に物理的または論理的に配置されてもよい。たとえば、テンソルアドレス値要素１２２の各グループは、二次元配列に物理的または論理的に配置されてもよい。
【００２４】
ハードウェア加算器ユニット１２４は、１つ以上のハードウェア加算器を含み得る。各加算器は、加算演算を実行するように構成されたデジタル回路を含んでもよい。たとえば、以下で説明するように、１つ以上の加算器は、部分アドレスオフセット値を加算して、テンソルの要素の合計アドレスオフセット値を求めてもよい。ハードウェア加算器は、算術論理演算ユニット（ＡＬＵ）およびハードウェア乗算器よりも必要な回路部品が少ないので、ハードウェア加算器ユニット１２４の回路のサイズ（したがって、テンソルトラバーサルユニット１０６のサイズ）は、ＡＬＵおよび／または乗算器を含むテンソルトラバーサルユニットよりも小さくすることができる。また、ハードウェア加算器を有するテンソルトラバーサルユニットの製造コストは、ＡＬＵおよび／または乗算器を有するテンソルトラバーサルユニットの製造コストよりも少ないであろう。いくつかの実現例では、ハードウェア加算器ユニット１２４は、加算器のみを含み、他の数学回路または論理回路は含まない。
【００２５】
図２Ａは、テンソルトラバーサルユニットの一組のテンソルアドレス値要素２００の一例を示す。テンソルアドレス値要素２００は、テンソルトラバーサルユニット１０６のテンソルアドレス値要素１２２に対応してもよい。テンソルトラバーサルユニット２００は、一群の初期値要素２０２と、一群のステップ値要素２０４と、一群の終了値要素２０６と、一群の部分アドレスオフセット値要素２０８とを含む。
【００２６】
初期値要素２０２は、Ｍ個の行とＮ個の列とを有する２Ｄ配列として物理的または論理的に配置されてもよく、ＭおよびＮは、１以上の整数である。初期値要素２０２は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセットの初期値を格納してもよい。いくつかの実現例では、初期値要素２０２の各行は、テンソルの初期値を表してもよい。たとえば、プログラムが２つの配列変数Ｖ１およびＶ２を定義する場合、テンソルトラバーサルユニットは、行２０２ａおよび２０２ｂを割り当てて、配列変数Ｖ１およびＶ２の初期値をそれぞれ格納してもよい。いくつかの実現例では、初期値要素２０２の各列は、テンソルに関連付けられたネステッドループインデックス変数値の初期値を表してもよい。たとえば、プログラムが、変数Ｖ１にアクセスするための３つのループを有するネステッドループを定義し、このネステッドループの各ループが、ネステッドループインデックス変数ｉ，ｊおよびｋによって索引付けされる場合、テンソルトラバーサルユニットは、初期値要素Ｖ１，１、Ｖ１，２およびＶ１，３を割り当てて、ネステッドループインデックス変数ｉ，ｊおよびｋの初期値をそれぞれ格納してもよい。初期値要素２０２については、図２Ｂ〜図２Ｈを参照して以下でより詳細に説明する。
【００２７】
ステップ値要素２０４は、初期値要素２０２と同一の次元を有する２Ｄ配列として物理的または論理的に配置されてもよく、ステップ値要素２０４の各要素は、初期値要素２０２の中に対応する要素を有する。ステップ値要素２０４は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセットのステップ値を格納してもよい。いくつかの実現例では、ステップ値要素２０４の各行は、テンソルのステップ値を表してもよい。たとえば、プログラムが２つの配列変数Ｖ１およびＶ２を定義する場合、テンソルトラバーサルユニットは、行２０４ａおよび２０４ｂを割り当てて、配列変数Ｖ１およびＶ２のステップ値をそれぞれ格納してもよい。いくつかの実現例では、ステップ値要素２０４の各列は、テンソルに関連付けられたネステッドループインデックス変数値のステップ値を表してもよい。たとえば、プログラムが、変数Ｖ１にアクセスするための３つのループを有するネステッドループを定義し、このネステッドループの各ループが、ネステッドループインデックス変数ｉ，ｊおよびｋによって索引付けされる場合、テンソルトラバーサルユニットは、ステップ値要素Ｘ１，１、Ｘ１，２およびＸ１，３を割り当てて、ネステッドループインデックス変数ｉ，ｊおよびｋのステップ値をそれぞれ格納してもよい。ステップ値要素２０４については、図２Ｂ〜図２Ｈを参照して以下でより詳細に説明する。
【００２８】
終了値要素２０６は、初期値要素２０２と同一の次元を有する２Ｄ配列として物理的または論理的に配置されてもよく、終了値要素２０６の各要素は、初期値要素２０２の中に対応する要素を有する。終了値要素２０６は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセットの終了値を格納してもよい。いくつかの実現例では、終了値要素２０６の各行は、テンソルの終了値を表してもよい。たとえば、プログラムが２つの配列変数Ｖ１およびＶ２を定義する場合、テンソルトラバーサルユニットは、行２０６ａおよび２０６ｂを割り当てて、配列変数Ｖ１およびＶ２の終了値をそれぞれ格納してもよい。いくつかの実現例では、終了値要素２０６の各列は、テンソルに関連付けられたネステッドループインデックス変数値の終了値を表してもよい。たとえば、プログラムが、変数Ｖ１にアクセスするための３つのループを有するネステッドループを定義し、このネステッドループの各ループが、ネステッドループインデックス変数ｉ，ｊおよびｋによって索引付けされる場合、テンソルトラバーサルユニットは、終了値要素Ｙ１，１、Ｙ１，２およびＹ１，３を割り当てて、ネステッドループインデックス変数ｉ，ｊおよびｋの終了値をそれぞれ格納してもよい。終了値要素２０６については、図２Ｂ〜図２Ｈを参照して以下でより詳細に説明する。
【００２９】
部分アドレスオフセット値要素２０８は、初期値要素２０２と同一の次元を有する２Ｄ配列として物理的または論理的に配置されてもよく、部分アドレスオフセット値要素２０８の各要素は、初期値要素２０２の中に対応する要素を有する。部分アドレスオフセット値要素２０６は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセット値を格納してもよい。いくつかの実現例では、部分アドレスオフセット値要素２０８の各行は、テンソルの部分アドレスオフセット値を表してもよい。たとえば、プログラムが２つの配列変数Ｖ１およびＶ２を定義する場合、テンソルトラバーサルユニットは、行２０８ａおよび２０８ｂを割り当てて、配列変数Ｖ１およびＶ２の部分アドレスオフセット値をそれぞれ格納してもよい。いくつかの実現例では、部分アドレスオフセット値要素２０８の各列は、テンソルに関連付けられたネステッドループインデックス変数値の部分アドレスオフセット値を表してもよい。たとえば、プログラムが、変数Ｖ１にアクセスするための３つのループを有するネステッドループを定義し、このネステッドループの各ループが、ネステッドループインデックス変数ｉ，ｊおよびｋによって索引付けされる場合、テンソルトラバーサルユニットは、部分アドレスオフセット値要素Ｚ１，１、Ｚ１，２およびＺ１，３を割り当てて、ネステッドループインデックス変数ｉ，ｊおよびｋの部分アドレスオフセット値をそれぞれ格納してもよい。部分アドレスオフセット値要素２０８については、図２Ｂ〜図２Ｈを参照して以下でより詳細に説明する。
【００３０】
図２Ｂ〜図２Ｈは、テンソルアドレス値要素２００がどのようにしてテンソルトラバーサルユニットによって使用されてテンソルを処理し得るかの一例を示し、テンソルのテンソル要素のメモリアドレス値を求めることを含む。図２Ｂを参照して、プログラム２１２は、記憶媒体１０４または別の記憶媒体に格納されてもよく、処理ユニット１０２によって実行可能である。プログラム２１２は、第１の次元が３であり、第２の次元が２であり、第３の次元が２である文字配列変数Ｖ１を指定する。プログラム２１２は、変数Ｖ１をトラバースするためのネステッドｆｏｒループを指定し、このｆｏｒループは、ネステッドループインデックス変数ｉによって追跡される外側ループにおいてＶ１の第１の次元をトラバースし、ネステッドループインデックス変数ｊによって追跡される中間ループにおいてＶ１の第２の次元をトラバースし、ネステッドループインデックス変数ｋによって追跡される内側ループにおいてＶ１の第３の次元をトラバースする。本明細書に記載されている図２Ｂ〜図２Ｈの示されている例は、３つの次元を含んでいるが、異なる個数の次元（たとえば、２つ、５つ、８つ、または他の個数の次元）を有するテンソルのメモリアドレス値を同様の態様で求めることができる。たとえば、８つの次元を有するテンソルがトラバースされてもよく、テンソル要素のメモリアドレスは、８重のループネストを使用して求めることができる。
【００３１】
いくつかの実現例では、テンソルアドレス値要素２００は、プログラムの開始時に初期化されてもよい。たとえば、プロセッサは、テンソルアドレス値要素２００を初期化する命令「InitializeElements」を実行してもよい。この命令は、プロセッサによって実行可能な命令セットのハードウェア命令であってもよい。いくつかの実現例では、初期化後、テンソルアドレス値要素２００の各要素は、予め定められた値に設定される。いくつかの実現例では、プロセッサは、たとえば初期値要素２０２のためにある命令を実行し、ステップ値要素のためにある命令を実行するなど、テンソルアドレス値要素の各グループについて別々の命令を実行してもよい。各々の別々の命令は、そのグループの各要素を当該要素のための予め定められた値に設定してもよい。
【００３２】
この例では、各初期値要素２０２は、ゼロという値に設定される。次元の初期値は、この次元をトラバースするｆｏｒループの１回目の繰り返しの間、この次元の部分アドレスオフセット値が設定される値である。したがって、この例では、各次元の部分アドレスオフセット値は、この次元のｆｏｒループの１回目の繰り返しの間はゼロという値に設定されることになる。
【００３３】
ステップ値要素は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセットのステップ値を格納してもよい。次元のステップ値は、この次元をトラバースするｆｏｒループの各繰り返しの後にこの次元の部分アドレスオフセット値に加算される値である。この例では、内側ネステッドループインデックス変数ｋは、１というステップ値を有し、中間ネステッドループインデックス変数ｊは、６というステップ値を有し、外側ネステッドループインデックス変数ｉは、２というステップ値を有する。
【００３４】
いくつかの実現例では、プロセッサ、ユーザ、またはテンソルをトラバースするためのプログラムをコンパイルするコンパイラは、テンソルの１つ以上の次元における要素の個数に基づいて各次元のステップ値および／または終了値を求める。一例では、各次元のステップ値および／または終了値は、テンソルのメモリレイアウトによって決まる。二次元テンソルの場合、メモリレイアウトは、たとえば行優先または列優先の順序に従ってもよい。このように、各テンソル要素について計算されるメモリアドレスは、各々の他のテンソル要素のメモリアドレスとは異なっている。いくつかの実現例では、メモリアドレスは、トラバーサル中にアクセスされる要素のシーケンスがメモリ内で物理的に連続しているように求められる。この例では、第１のテンソル要素は、第１のアドレスを有する第１のメモリ場所に格納されてもよく、第２のテンソル要素は、第１のメモリ場所のすぐ隣に位置する第２のメモリ場所に格納されてもよく、第３のテンソル要素は、第２のメモリ場所のすぐ隣に位置する第３のメモリ場所に格納されてもよい、などである。いくつかの実現例では、メモリアドレスは、トラバーサル中にアクセスされる要素のシーケンスがメモリ内で物理的に連続していないように求められる。この例では、第２のテンソル要素は、第１のテンソル要素のすぐ隣に格納されなくてもよい。
【００３５】
終了値要素は、次元の終了値を格納してもよい。次元の終了値は、部分アドレスオフセット値がこの次元の初期値にリセットされる値を表す。また、第１のループの部分アドレスオフセット値が第１のループの終了値に等しい場合には、第１のループがネストされる第２のループのステップ値が第２のループの部分アドレスオフセット値に加算される。この例では、内側ネステッドループインデックス変数ｉは、２という終了値を有し、中間ネステッドループインデックス変数ｉは、１２というステップ値を有し、外側ネステッドループインデックス変数ｋは、６という終了値を有する。したがって、内側ネステッドループインデックス変数ｉの部分アドレスオフセット値が２という値に達すると、プロセッサは、内側ネステッドループインデックス変数ｉの部分アドレスオフセット値をゼロにリセットして、中間ネステッドループインデックス変数ｊのステップ値（６）を中間ネステッドループインデックス変数ｊの部分アドレスオフセット値に加算してもよい。これが中間ネステッドループインデックス変数ｊによって追跡されるループの１回目の繰り返しであれば、中間ネステッドループインデックス変数ｊの部分アドレスオフセット値は、６（０＋６）になるであろう。
【００３６】
部分アドレスオフセット値要素２０８は、次元の部分アドレスオフセット値を格納する。この例では、プロセッサは、部分アドレスオフセット値をゼロに設定する。部分アドレスオフセット値は、テンソル要素のメモリアドレスオフセットを求めるために使用される。いくつかの実現例では、特定の変数についての特定のテンソル要素のメモリアドレスは、式２２５に示されるように、テンソル要素の予め指定されたベースアドレスとテンソル要素の次元の部分アドレスオフセット値との合計に基づく。変数Ｖ１では、特定のテンソル要素のメモリアドレスは、テンソル要素のベースアドレスと行２０８ａ（一番上の行）における部分アドレスオフセット値との合計に等しい。したがって、変数Ｖ１（ｉ＝０，ｊ＝０，ｋ＝０）の各次元の第１の要素に対応するテンソル要素では、部分アドレスオフセット値が全てゼロであるので、メモリアドレスは、ベースアドレス＋ゼロに等しい。
【００３７】
テンソル要素のメモリアドレスは、図１のハードウェア加算器ユニット１２４を使用して求めることができる。たとえば、特定の変数（たとえば、変数Ｖ１）についての加算器への入力は、ベースアドレスおよびこの変数の特定の行（たとえば、変数Ｖ１の行２０８ａ）における各部分アドレスオフセット値要素の値であってもよい。出力は、この変数のメモリアドレスである。
【００３８】
図２Ｃは、プログラム２１２に従って要素Ｖ１［０］［０］［０］にアクセスすることを示す。たとえば、プロセッサは、アクセスされる要素に対応するメモリアドレスを突き止める命令「LocateTensor」を実行してもよい。いくつかの実現例では、この命令は、ベースメモリアドレスを含んでもよい。たとえば、命令「LocateTensor」は、変数Ｖ１の第１の要素である要素Ｖ１［０］［０］［０］のメモリアドレスを含んでもよい。いくつかの実現例では、この命令は、アクセス対象のテンソルに対応する行番号を含んでもよい。たとえば、命令「LocateTensor」は、変数Ｖ１に対応する行番号を含んでもよい。ここでは、行番号は１である。
【００３９】
いくつかの実現例では、テンソルトラバーサルユニットを含むコンピューティングシステムは、テンソルトラバーサルユニットからメモリアドレス値を照会する有限状態機械（ＦＳＭ）を含んでもよい。たとえば、ＦＳＭは、図２Ｂ〜図２Ｈに関連して説明した「LocateTensor」および「IterateTensor」命令などの命令を実行するプロセッサではないプロセッサのメモリアドレス値を照会してもよい。ＦＳＭは、プロセッサを参照して以下で説明するように、ネステッドループを繰り返しトラバースし、ループをトラバースしながら部分アドレス値を繰り返してもよい。次いで、プロセッサは、求められたメモリアドレス値を、それらが求められた通りにハードウェアカウンタまたはＦＳＭから受信することができる。
【００４０】
いくつかの実現例では、この命令を受信したことに応答して、ハードウェア加算器ユニット（たとえば、図１のハードウェア加算器ユニット１２４）は、部分アドレス値要素２０８の行１（行２０８ａ）における部分アドレスオフセット値要素２０８の各々に格納された値の合計を計算することによってメモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット（すなわち、この例では０）に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素Ｖ１［０］［０］［０］にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値との合計を求めることによって要素Ｖ１［０］［０］［０］のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【００４１】
図２Ｄは、プログラム２１２に従って要素Ｖ１［０］［０］［１］にアクセスすることを示す。たとえば、プログラムが内側ループの１回目の繰り返しを完了した後、プロセッサは、プログラムが内側ループの２回目の繰り返し（すなわち、ｉ＝０，ｊ＝０，ｋ＝１）に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行してもよい。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ（内側ネステッドループインデックス変数ｉによって追跡されるループ）に対応する次元の部分アドレスオフセット値要素２０８を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Ｚ１，１に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素Ｘ１，１に格納されたステップ値だけインクリメントされる。内側ループのために格納された、結果として生じる更新後の部分アドレスオフセット値は、Ｚ１，１に格納された以前の値とＸ１，１に格納された値との合計、すなわち０＋１＝１である。
【００４２】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された更新後の部分オフセットアドレス値と要素Ｙ１，１に格納された内側ループの終了値とを比較する。Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された部分オフセットアドレス値の値を、要素Ｖ１，１に格納された内側ループの初期値にリセットしてもよい。また、以下でより詳細に説明するように、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループに対応する次元の部分アドレスオフセット値を、Ｘ１，２に格納された中間ループのステップ値だけインクリメントしてもよい。
【００４３】
要素Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値（１）は、内側ループの終了値（２）未満である。したがって、テンソルトラバーサルユニットは、中間ループの部分アドレスオフセット値をインクリメントすることなく、内側ループの部分アドレスオフセット要素Ｚ１，１に格納された更新後の部分アドレスオフセット値を保持する。
【００４４】
次いで、プロセッサは、Ｖ１［０］［０］［１］に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素Ｖ１［０］［０］［１］にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素２０８の行１（行２０８ａ）における部分アドレスオフセット値要素２０８の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット（すなわち、この例では１）に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素Ｖ１［０］［０］［１］にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値との合計を求めることによって、要素Ｖ１［０］［０］［１］のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【００４５】
図２Ｅは、プログラム２１２に従って要素Ｖ１［０］［１］［０］にアクセスすることを示す。たとえば、プログラムが内側ループの２回目の繰り返しを完了した後、プロセッサは、プログラムが中間ループの２回目の繰り返し（すなわち、ｉ＝０，ｊ＝１，ｋ＝０）に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行してもよい。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ（内側ネステッドループインデックス変数ｉによって追跡されるループ）に対応する次元の部分アドレスオフセット値要素２０８を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Ｚ１，１に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素Ｘ１，１に格納されたステップ値だけインクリメントされる。内側ループのために格納された、結果として生じる更新後の部分アドレスオフセット値は、Ｚ１，１に格納された以前の値とＸ１，１に格納された値との合計、すなわち１＋１＝２である。
【００４６】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された更新後の部分オフセットアドレス値と要素Ｙ１，１に格納された内側ループの終了値とを比較する。Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された部分オフセットアドレス値の値を、要素Ｖ１，１に格納された内側ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループに対応する次元の部分アドレスオフセット値を、Ｘ１，２に格納された中間ループのステップ値だけインクリメントしてもよい。
【００４７】
要素Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値（２）は、内側ループの終了値（２）に等しい。したがって、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された部分オフセットアドレス値を、要素Ｖ１，１に格納された初期値にリセットする。また、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループの部分アドレスオフセット値を、Ｘ１，２に格納された中間ループのステップ値だけインクリメントする。この例では、中間ループの更新後の部分アドレスオフセット値は、６（０＋６）である。
【００４８】
いくつかの実現例では、テンソルトラバーサルユニットは、中間ループの部分オフセットアドレス値を更新すると判断したことに応答して、要素Ｚ１，２に格納された中間ループの更新後の部分オフセットアドレス値と、要素Ｙ１，２に格納された中間ループの終了値とを比較する。Ｚ１，２に格納された中間ループ値の更新後の部分オフセットアドレスが、要素Ｙ１，２に格納された中間ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された部分オフセットアドレス値の値を、要素Ｖ１，２に格納された中間ループの初期値にリセットしてもよい。また、以下で説明するように、テンソルトラバーサルユニットは、要素Ｚ１，３に格納された外側ループに対応する次元の部分アドレスオフセット値を、Ｘ１，３に格納された外側ループのステップ値だけインクリメントしてもよい。
【００４９】
要素Ｚ１，２に格納された中間ループの更新後の部分オフセットアドレス値が、要素Ｙ１，２に格納された中間ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループの更新後の部分アドレス値を保持してもよい。この例では、中間ループの更新後の部分アドレスオフセット値（６）は、内側ループの終了値（１２）未満である。したがって、テンソルトラバーサルユニットは、外側ループの部分アドレスオフセット値をインクリメントすることなく、中間ループの部分アドレスオフセット要素Ｚ１，２に格納された更新後の部分アドレスオフセット値を保持する。
【００５０】
次いで、プロセッサは、Ｖ１［０］［１］［０］に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素Ｖ１［０］［１］［０］にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素２０８の行１（行２０８ａ）における部分アドレスオフセット値要素２０８の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット（すなわち、この例では６）に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素Ｖ１［０］［１］［０］にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値との合計を求めることによって、要素Ｖ１［０］［１］［０］のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【００５１】
図２Ｆは、プログラム２１２に従って要素Ｖ１［０］［１］［１］にアクセスすることを示す。たとえば、プログラムが中間ループの２回目の繰り返しのための内側ループの１回目の繰り返しを完了した後、プロセッサは、プログラムが中間ループの２回目の繰り返しのための内側ループの２回目の繰り返し（すなわち、ｉ＝０，ｊ＝１，ｋ＝１）に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行してもよい。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ（内側ネステッドループインデックス変数ｉによって追跡されるループ）に対応する次元の部分アドレスオフセット値要素２０８を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Ｚ１，１に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素Ｘ１，１に格納されたステップ値だけインクリメントされる。内側ループのために格納される、結果として生じる更新後の部分アドレスオフセット値は、Ｚ１，１に格納された以前の値とＸ１，１に格納された値との合計、すなわち０＋１＝２である。
【００５２】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された更新後の部分オフセットアドレス値と、要素Ｙ１，１に格納された内側ループの終了値とを比較する。Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された部分オフセットアドレス値の値を、要素Ｖ１，１に格納された内側ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループに対応する次元の部分アドレスオフセット値を、Ｘ１，２に格納された中間ループのステップ値だけインクリメントしてもよい。
【００５３】
要素Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値（１）は、内側ループの終了値（２）未満である。したがって、テンソルトラバーサルユニットは、中間ループの部分アドレスオフセット値をインクリメントすることなく、内側ループの部分アドレスオフセット要素Ｚ１，１に格納された更新後の部分アドレスオフセット値を保持する。
【００５４】
次いで、プロセッサは、Ｖ１［０］［１］［１］に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素Ｖ１［０］［１］［１］にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素２０８の行１（行２０８ａ）における部分アドレスオフセット値要素２０８の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット（すなわち、この例では７）を加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素Ｖ１［０］［１］［１］にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値との合計を求めることによって、要素Ｖ１［０］［１］［１］のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【００５５】
図２Ｇは、プログラム２１２に従って要素Ｖ１［１］［０］［０］にアクセスすることを示す。たとえば、プログラムが中間ループの２回目の繰り返しのための内側ループの２回目の繰り返しを完了した後、プロセッサは、プログラムが外側ループの２回目の繰り返し（すなわち、ｉ＝１，ｊ＝０，ｋ＝０）に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行してもよい。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ（内側ネステッドループインデックス変数ｉによって追跡されるループ）に対応する次元の部分アドレスオフセット値要素２０８を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Ｚ１，１に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素Ｘ１，１に格納されたステップ値だけインクリメントされる。内側ループのために格納される、結果として生じる更新後の部分アドレスオフセット値は、Ｚ１，１に格納された以前の値とＸ１，１に格納された値との合計、すなわち１＋１＝２である。
【００５６】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された更新後の部分オフセットアドレス値と、要素Ｙ１，１に格納された内側ループの終了値とを比較する。Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された部分オフセットアドレス値の値を、要素Ｖ１，１に格納された内側ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループに対応する次元の部分アドレスオフセット値を、Ｘ１，２に格納された中間ループのステップ値だけインクリメントしてもよい。
【００５７】
要素Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値（２）は、内側ループの終了値（２）に等しい。したがって、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された部分オフセットアドレス値を、要素Ｖ１，１に格納された初期値にリセットする。また、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループの部分アドレスオフセット値を、Ｘ１，２に格納された中間ループのステップ値だけインクリメントする。この例では、中間ループの更新後の部分アドレスオフセット値は、１２（６＋６）である。
【００５８】
いくつかの実現例では、テンソルトラバーサルユニットは、中間ループの部分オフセットアドレス値を更新すると判断したことに応答して、要素Ｚ１，２に格納された中間ループの更新後の部分オフセットアドレス値と、要素Ｙ１，２に格納された中間ループの終了値とを比較する。Ｚ１，２に格納された中間ループの更新後の部分オフセットアドレスが、要素Ｙ１，２に格納された中間ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された部分オフセットアドレス値の値を、要素Ｖ１，２に格納された中間ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Ｚ１，３に格納された外側ループに対応する次元の部分アドレスオフセット値を、Ｘ１，３に格納された外側ループのステップ値だけインクリメントしてもよい。
【００５９】
要素Ｚ１，２に格納された中間ループの更新後の部分オフセットアドレス値が、要素Ｙ１，２に格納された中間ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループの更新後の部分アドレス値を保持してもよい。この例では、中間ループの更新後の部分アドレスオフセット値（１２）は、中間ループの終了値（１２）に等しい。したがって、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された部分オフセットアドレス値を、要素Ｖ１，２に格納された初期値にリセットする。また、テンソルトラバーサルユニットは、要素Ｚ１，３に格納された外側ループの部分アドレスオフセット値を、Ｘ１，３に格納された外側ループのステップ値だけインクリメントする。この例では、外側ループの更新後の部分アドレスオフセット値は、２（０＋２）である。
【００６０】
次いで、プロセッサは、Ｖ１［１］［０］［０］に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素Ｖ１［１］［０］［０］にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素２０８の行１（行２０８ａ）における部分アドレスオフセット値要素２０８の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット（すなわち、この例では２）に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素Ｖ１［１］［０］［０］にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値との合計を求めることによって、要素Ｖ１［１］［０］［０］のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【００６１】
図２Ｈは、プログラム２１２に従って要素Ｖ１［１］［０］［１］にアクセスすることを示す。たとえば、プログラムが外側ループの２回目の繰り返しのための内側ループの１回目の繰り返しを完了した後、プロセッサは、プログラムが外側ループの２回目の繰り返しのための内側ループの２回目の繰り返し（すなわち、ｉ＝１，ｊ＝０，ｋ＝１）に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行してもよい。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ（内側ネステッドループインデックス変数ｉによって追跡されるループ）に対応する次元の部分アドレスオフセット値要素２０８を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Ｚ１，１に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素Ｘ１，１に格納されたステップ値だけインクリメントされる。内側ループのために格納される、結果として生じる更新後の部分アドレスオフセット値は、Ｚ１，１に格納された以前の値と、Ｘ１，１に格納された値との合計、すなわち０＋１＝２である。
【００６２】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された更新後の部分オフセットアドレス値と、要素Ｙ１，１に格納された内側ループの終了値とを比較する。Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された部分オフセットアドレス値の値を、要素Ｖ１，１に格納された内側ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Ｚ１，２に格納された中間ループに対応する次元の部分アドレスオフセット値を、Ｘ１，２に格納された中間ループのステップ値だけインクリメントしてもよい。
【００６３】
要素Ｚ１，１に格納された更新後の部分オフセットアドレス値が、要素Ｙ１，１に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Ｚ１，１に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値（１）は、内側ループの終了値（２）未満である。したがって、テンソルトラバーサルユニットは、中間ループの部分アドレスオフセット値をインクリメントすることなく、内側ループの部分アドレスオフセット要素Ｚ１，１に格納された更新後の部分アドレスオフセット値を保持する。
【００６４】
次いで、プロセッサは、Ｖ１［１］［０］［１］に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素Ｖ１［１］［０］［１］にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素２０８の行１（行２０８ａ）における部分アドレスオフセット値要素２０８の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット（すなわち、この例では３）に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素Ｖ１［１］［０］［１］にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Ｚ１，１、Ｚ１，２およびＺ１，３に格納された値との合計を求めることによって、要素Ｖ１［１］［０］［１］のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【００６５】
テンソルトラバーサルユニットは、ネステッドループの残りの繰り返しについてメモリアドレスを求めて、同様の態様で残りのテンソル要素にアクセスし続けることができる。以下の表１は、図２Ａ〜図２Ｈに示されるステップ値を使用したテンソル要素のメモリアドレスオフセット値を示す。
【００６６】
【表１】
2020521198.tif 000003
【００６７】
図３は、多次元テンソル変数のアドレスを求めるためのプロセスの一例３００を示すフロー図である。プロセス３００は、１つ以上のコンピュータのシステム、たとえば図１のコンピューティングシステム１００によって実行されてもよい。このシステムは、初期値要素とステップ値要素と終了値要素と部分アドレスオフセット要素とを含むテンソルアドレス値要素を有するテンソルトラバーサルユニットを含む。テンソルトラバーサルユニットは、１つ以上のハードウェア加算器を有するハードウェア加算器ユニットも含む。
【００６８】
このシステムは、Ｎ次元テンソルの特定の要素にアクセスするための命令を取得する（３０２）。Ｎ次元テンソルは、Ｎ個の次元の各々にわたって配置された複数の要素を含み得て、Ｎは、１以上の整数である。たとえば、このシステムは、テンソルの特定の要素にアクセスするための命令を実行する処理ユニット（たとえば、処理ユニット１０２）を含んでもよい。
【００６９】
いくつかの実現例では、命令は、第１のループと第２のループと第３のループとを含むネステッドループを処理するための命令を表してもよい。第１のループは、第２のループ内にネストされた内側ループであってもよく、第２のループは、第３のループ内にネストされた中間ループであってもよい。第１のループは、第１のインデックス変数を使用して繰り返されてもよい。同様に、第２のループは、第２のインデックス変数を使用して繰り返されてもよく、第３のループは、第３のインデックス変数を使用して繰り返されてもよい。たとえば、プログラムは、記憶媒体に格納されてもよく、処理ユニットによって実行可能である。プログラムは、文字配列変数Ｖ１（または、別のタイプの配列）、２という第１の次元、２という第２の次元および３という第３の次元を指定してもよい。プログラムは、変数Ｖ１をトラバースするためのネステッドｆｏｒループを指定してもよい。このｆｏｒループは、ネステッドループインデックス変数ｉによって追跡される外側ループにおいてＶ１の第３の次元をトラバースしてもよい。また、このｆｏｒループは、ネステッドループインデックス変数ｊによって追跡される中間ループにおいてＶ１の第２の次元をトラバースしてもよく、ネステッドループインデックス変数ｋによって追跡される内側ループにおいて第１の次元をトラバースしてもよい。
【００７０】
このシステムは、１つ以上のハードウェア加算器および部分アドレスオフセット要素を使用して、特定の要素のアドレスを求める（３０４）。いくつかの実現例では、特定の要素のアドレスは、Ｎ次元テンソルの別の要素からオフセットされたアドレスであってもよい。たとえば、特定の要素のアドレスは、Ｎ次元テンソルの別の要素のベースメモリアドレスからオフセットされたアドレスであってもよい。１つ以上のテンソルインデックス要素の各テンソルインデックス要素について、このシステムは、ハードウェア加算器を使用してベースメモリアドレスとともに部分アドレスオフセット要素の現在の値を加算することによって、メモリアドレスを求めてもよい。部分アドレスオフセット要素の現在の値は、ループの現在の繰り返しに基づく。
【００７１】
いくつかの実現例では、テンソルの要素のうちのいずれかの要素のアドレスオフセットを求める前に、このシステムは、テンソルアドレス値要素に格納された値を設定してもよい。たとえば、プロセッサは、テンソルアドレス値要素を初期化する命令「InitializeElements」を実行してもよい。
【００７２】
内側ループの各繰り返しについて、このシステムは、内側ループのステップ値を使用して内側ループの部分アドレスオフセット値を更新してもよい。中間および外側ループの１回目の繰り返しのための内側ループの１回目の繰り返しの前（すなわち、ｉ＝０，ｊ＝０，ｋ＝０）に、内側ループの部分アドレスオフセット値は、内側ループの初期値に設定されてもよい。
【００７３】
内側ループの各繰り返し後、このシステムは、内側ループの部分アドレスオフセット値を、内側ループの以前の部分アドレスオフセット値と内側ループのステップ値との合計に更新してもよい。次いで、このシステムは、内側ループの更新後の部分アドレスオフセット値と内側ループの終了値とを比較してもよい。内側ループの更新後の部分アドレスオフセット値が内側ループの終了値未満である場合、このシステムは、少なくとも内側ループの次の繰り返しまでは、他の部分アドレスオフセット値のいずれも修正することなく、部分アドレスオフセット値要素における内側ループの更新後の部分アドレスオフセット値を維持してもよい。
【００７４】
この更新後の部分アドレスオフセット値が内側ループの終了値に等しい場合、このシステムは、部分アドレスオフセット値を内側ループの初期値にリセットし、内側ループのステップ値を使用して中間ループの部分アドレスオフセット値をインクリメントしてもよい。たとえば、このシステムは、中間ループの部分アドレスオフセット値を、中間ループの以前の部分アドレスオフセット値と中間ループのステップ値との合計に更新してもよい。次いで、このシステムは、中間ループの更新後の部分アドレスオフセット値と中間ループの終了値とを比較してもよい。中間ループの更新後の部分アドレスオフセット値が、内側ループの終了値未満である場合、このシステムは、少なくとも中間ループの次の繰り返しまでは、他の部分アドレスオフセット値のいずれも修正することなく、部分アドレスオフセット値要素における中間ループの更新後の部分アドレスオフセット値を維持してもよい。
【００７５】
この更新後の部分アドレスオフセット値が中間ループの終了値に等しい場合、このシステムは、部分アドレスオフセット値を中間ループの初期値にリセットし、外側ループのステップ値を使用して外側ループの部分アドレスオフセット値をインクリメントしてもよい。たとえば、このシステムは、外側ループの部分アドレスオフセット値を、外側ループの以前の部分アドレスオフセット値と外側ループのステップ値との合計に更新してもよい。次いで、このシステムは、外側ループの更新後の部分アドレスオフセット値と外側ループの終了値とを比較してもよい。
【００７６】
外側ループの更新後の部分アドレスオフセット値が外側ループの終了値未満である場合、このシステムは、部分アドレスオフセット値要素における外側ループの更新後の部分アドレスオフセット値を維持してもよい。この更新後の部分アドレスオフセット値が外側ループの終了値に等しい場合、このシステムは、テンソルの各要素がアクセスされたときに各ループの部分アドレスオフセット値をそれらのそれぞれの初期値にリセットしてもよい。
【００７７】
このシステムは、Ｎ次元テンソルの特定の要素にアクセスするための求められたアドレスを示すデータを出力する（３０６）。たとえば、テンソルトラバーサルユニットは、現在の部分アドレスオフセット値とベースメモリアドレスとの合計に基づいて、求められたアドレスを出力してもよい。システムの処理ユニットは、メモリアドレスオフセット値を使用して、記憶媒体におけるＮ次元配列変数の特定の要素にアクセスしてもよい。
【００７８】
本明細書に記載されている主題および機能動作の実施形態は、デジタル電子回路、有形に具体化されたコンピュータソフトウェアもしくはファームウェア、本明細書に開示されている構造およびそれらの構造的等価物を含むコンピュータハードウェア、またはそれらのうちの１つ以上の組み合わせで実現することができる。本明細書に記載されている主題の実施形態は、１つ以上のコンピュータプログラムとして、すなわちデータ処理装置によって実行されるようにまたはデータ処理装置の動作を制御するように有形の非一時的なプログラムキャリア上に符号化されたコンピュータプログラム命令の１つ以上のモジュールとして、実現することができる。代替的にまたは加えて、プログラム命令は、人為的に生成された伝搬信号、たとえば情報を符号化して好適な受信機装置に送信してデータ処理装置によって実行するように生成される、機械によって生成される電気信号、光信号または電磁信号、上に符号化することができる。コンピュータ記憶媒体は、機械読取可能な記憶装置、機械読取可能な記憶基板、ランダムもしくはシリアルアクセスメモリデバイス、またはそれらのうちの１つ以上の組み合わせであってもよい。
【００７９】
本明細書に記載されているプロセスおよび論理フローは、１つ以上のプログラム可能なコンピュータが入力データ上で動作して出力を生成することによって機能を実行するように１つ以上のコンピュータプログラムを実行することによって実行することができる。プロセスおよび論理フローは、特殊目的論理回路、たとえばＦＰＧＡ（フィールドプログラマブルゲートアレイ）、ＡＳＩＣ（特定用途向け集積回路）またはＧＰＧＰＵ（汎用グラフィックス処理ユニット）、によっても実行することができ、装置は、特殊目的論理回路としても実現することができる。
【００８０】
コンピュータプログラムの実行に適したコンピュータは、一例として、汎用マイクロプロセッサもしくは特殊目的マイクロプロセッサもしくはそれら両方、またはその他の種類の中央処理装置を含み、それらに基づいてもよい。一般に、中央処理装置は、リードオンリメモリまたはランダムアクセスメモリまたはそれら両方から命令およびデータを受信する。コンピュータの必須の要素は、命令を実施または実行するための中央処理装置と、命令およびデータを格納するための１つ以上のメモリデバイスである。一般に、コンピュータは、データを格納するための１つ以上の大容量記憶装置（たとえば、磁気ディスク、光磁気ディスクまたは光ディスク）も含み、１つ以上の大容量記憶装置からデータを受信したり１つ以上の大容量記憶装置にデータを送信したり１つ以上の大容量記憶装置との間でデータを送受信したりするように動作可能に結合される。しかし、コンピュータは、このような装置を有していなくてもよい。さらに、コンピュータは、別のデバイス、たとえばほんの数例を挙げると、携帯電話、パーソナルデジタルアシスタント（ＰＤＡ）、携帯オーディオもしくはビデオプレーヤ、ゲーム機、グローバルポジショニングシステム（ＧＰＳ）受信機、またはポータブルストレージデバイス（たとえば、ユニバーサルシリアルバス（ＵＳＢ）フラッシュドライブ）、に組み込まれてもよい。
【００８１】
コンピュータプログラム命令およびデータの格納に適したコンピュータ読取可能媒体は、全ての形態の不揮発性メモリ、メディアおよびメモリデバイスを含み、メモリデバイスは、一例として、半導体メモリデバイス（たとえば、ＥＰＲＯＭ、ＥＥＰＲＯＭおよびフラッシュメモリデバイス）、磁気ディスク（たとえば、内蔵ハードディスクまたはリムーバブルディスク）、光磁気ディスク、ならびにＣＤ  ＲＯＭおよびＤＶＤ−ＲＯＭディスクを含む。プロセッサおよびメモリは、特殊目的論理回路によって補完されてもよく、または特殊目的論理回路に組み入れられてもよい。
【００８２】
本明細書は、多くの具体的な実現例の詳細を含んでいるが、これらは、いずれの発明または請求の範囲を限定するものとして解釈されるべきではなく、特定の発明の特定の実施形態に特有の特徴を説明するものとして解釈されるべきである。別々の実施形態の文脈で本明細書に記載されている特定の特徴は、単一の実施形態において組み合わせて実現することも可能である。逆に、単一の実施形態の文脈で記載されているさまざまな特徴は、複数の実施形態において別々にまたは任意の好適な部分的な組み合わせで実現することも可能である。さらに、特徴は、特定の組み合わせで動作するものとして上記され、最初にそのように記載されているかもしれないが、記載されている組み合わせの中の１つ以上の特徴は、場合によってはこの組み合わせから除外されてもよく、記載されている組み合わせは、部分的な組み合わせまたは部分的な組み合わせの変形例を対象としてもよい。
【００８３】
同様に、動作は、特定の順序で図面に示されているが、これは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序でこのような動作を実行しなければならないものとして理解されるべきではなく、示されている動作を全て実行しなければならないものとして理解されるべきでもない。特定の状況では、マルチタスクおよび並列処理が有利である場合もある。さらに、上記の実施形態におけるさまざまなシステムモジュールおよびコンポーネントの分離は、このような分離が全ての実施形態で必要であるものとして理解されるべきではなく、記載されているプログラムコンポーネントおよびシステムは、一般に、単一のソフトウェア製品に一体化されるかまたは複数のソフトウェア製品にパッケージングされてもよいということが理解されるべきである。
【００８４】
主題の特定の実施形態について説明してきた。他の実施形態は、以下の特許請求の範囲の範囲内である。たとえば、特許請求の範囲に記載されている動作は、異なる順序で実行されても、依然として望ましい結果を達成することができる。一例として、添付の図面に示されているプロセスは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序を必ずしも必要としない。特定の実現例では、マルチタスクおよび並列処理が有利である場合もある。
【図１】
2020521198.tif 000004
【図２Ａ】
2020521198.tif 000005
【図２Ｂ】
2020521198.tif 000006
【図２Ｃ】
2020521198.tif 000007
【図２Ｄ】
2020521198.tif 000008
【図２Ｅ】
2020521198.tif 000009
【図２Ｆ】
2020521198.tif 000010
【図２Ｇ】
2020521198.tif 000011
【図２Ｈ】
2020521198.tif 000012
【図３】
2020521198.tif 000013
【手続補正書】
【提出日】令和1年12月18日(2019.12.18)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
Ｎ次元テンソルにアクセスするための命令を処理する装置であって、
前記Ｎ次元テンソルの各次元について、部分アドレスオフセット値要素を備え、前記部分アドレスオフセット値要素は、前記次元の初期値、前記次元のステップ値および前記次元のループの繰り返し回数に少なくとも基づいて前記次元の部分アドレスオフセット値を格納し、前記装置はさらに、
１つ以上のハードウェア加算器と、
１つ以上のプロセッサとを備え、前記１つ以上のプロセッサは、
前記Ｎ次元テンソルの特定の要素にアクセスするための命令を取得するように構成され、前記Ｎ次元テンソルは、前記Ｎ個の次元の各々にわたって配置された複数の要素を有し、Ｎは、１以上の整数であり、前記１つ以上のプロセッサはさらに、
前記部分アドレスオフセット値要素および前記１つ以上のハードウェア加算器のうちの１つ以上を使用して、前記特定の要素のアドレスを求めるように構成され、
前記Ｎ次元テンソルの前記特定の要素にアクセスするための前記求められたアドレスを示すデータを出力するように構成される、装置。
【請求項２】
各次元について、
前記次元の前記初期値を格納する初期値要素と、
前記次元の前記ステップ値を格納するステップ値要素とをさらに備える、請求項１に記載の装置。
【請求項３】
各部分アドレスオフセット値要素、各初期値要素および各ステップ値要素は、レジスタを備える、請求項２に記載の装置。
【請求項４】
前記特定の要素の前記アドレスを求めることは、前記１つ以上のハードウェア加算器を使用して各次元について前記部分アドレスオフセット値の合計を求めることを備える、請求項１から３のいずれか１項に記載の装置。
【請求項５】
前記１つ以上のプロセッサはさらに、
各次元について、前記ステップ値を前記次元の以前のアドレスオフセット値に加算することによって、前記次元のネステッドループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めるように構成される、請求項１から４のいずれか１項に記載の装置。
【請求項６】
各次元について、前記次元の限界値を格納する限界値要素をさらに備え、前記１つ以上のプロセッサはさらに、
各次元について、前記次元の前記求められた部分アドレスオフセット値が前記次元の前記限界値に等しいか否かを判断するように構成され、
第１のネステッドループに対応する第１の次元の前記求められた部分アドレスオフセット値が前記第１の次元の前記限界値に等しいと判断したことに応答して、
前記第１の次元の前記部分アドレスオフセット値を前記第１の次元の前記初期値にリセットするように構成され、
前記第１のネステッドループがネストされる第２のネステッドループに対応する第２の次元について、前記１つ以上のハードウェア加算器を使用して、前記第２の次元の前記ステップ値と前記第２の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第２の次元の前記部分アドレスオフセット値を更新するように構成される、請求項５に記載の装置。
【請求項７】
各次元の前記ステップ値は、１つ以上の前記次元における要素の個数に基づく予め定められた値である、請求項１から６のいずれか１項に記載の装置。
【請求項８】
システムであって、
Ｎ次元テンソルに対して線形代数演算を実行するように構成された１つ以上のプロセッサを備え、前記Ｎ次元テンソルは、前記Ｎ個の次元の各々にわたって配置された複数の要素を有し、Ｎは、１以上の整数であり、前記システムはさらに、
前記Ｎ個の次元の各次元について、部分アドレスオフセット値要素を備え、前記部分アドレスオフセット値要素は、前記次元の初期値、前記次元のステップ値および前記次元のループの繰り返し回数に少なくとも基づいて前記次元の部分アドレスオフセット値を格納し、前記システムはさらに、
１つ以上のハードウェア加算器を含む回路を備え、前記回路は、
前記Ｎ次元テンソルの特定の要素にアクセスするための命令を取得するように構成され、
前記部分アドレスオフセット値要素および前記１つ以上のハードウェア加算器のうちの１つ以上を使用して、前記特定の要素のアドレスを求めるように構成され、
前記Ｎ次元テンソルの前記特定の要素にアクセスするための前記求められたアドレスを示すデータを出力するように構成される、システム。
【請求項９】
各次元について、
前記次元の前記初期値を格納する初期値要素と、
前記次元の前記ステップ値を格納するステップ値要素とをさらに備える、請求項８に記載のシステム。
【請求項１０】
各部分アドレスオフセット値要素、各初期値要素および各ステップ値要素は、レジスタを備える、請求項９に記載のシステム。
【請求項１１】
前記特定の要素の前記アドレスを求めることは、前記１つ以上のハードウェア加算器を使用して各次元について前記部分アドレスオフセット値の合計を求めることを備える、請求項８から１０のいずれか１項に記載のシステム。
【請求項１２】
前記回路はさらに、
各次元について、前記ステップ値を前記次元の以前のアドレスオフセット値に加算することによって、前記次元のネステッドループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めるように構成される、請求項８から１１のいずれか１項に記載のシステム。
【請求項１３】
各次元について、前記次元の限界値を格納する限界値要素をさらに備え、前記回路はさらに、
各次元について、前記次元の前記求められた部分アドレスオフセット値が前記次元の前記限界値に等しいか否かを判断するように構成され、
第１のネステッドループに対応する第１の次元の前記求められた部分アドレスオフセット値が前記第１の次元の前記限界値に等しいと判断したことに応答して、
前記第１の次元の前記部分アドレスオフセット値を前記第１の次元の前記初期値にリセットするように構成され、
前記第１のネステッドループがネストされる第２のネステッドループに対応する第２の次元について、前記１つ以上のハードウェア加算器を使用して、前記第２の次元の前記ステップ値と前記第２の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第２の次元の前記部分アドレスオフセット値を更新するように構成される、請求項１２に記載のシステム。
【請求項１４】
各次元の前記ステップ値は、１つ以上の前記次元における要素の個数に基づく予め定められた値である、請求項８から１３のいずれか１項に記載のシステム。
【請求項１５】
コンピュータによって実行される方法であって、
Ｎ次元テンソルの特定の要素にアクセスするための命令を取得するステップを備え、前記Ｎ次元テンソルは、前記Ｎ個の次元の各々にわたって配置された複数の要素を有し、Ｎは、１以上の整数であり、前記方法はさらに、
それぞれの部分アドレスオフセット要素に格納された部分アドレスオフセット値および１つ以上のハードウェア加算器を使用して、前記特定の要素のアドレスを求めるステップを備え、前記部分アドレスオフセット値は、各次元の部分アドレスオフセット値を含み、前記次元の前記部分アドレスオフセット値は、前記次元の初期値、前記次元のステップ値および前記次元のループの繰り返し回数に少なくとも基づいており、前記方法はさらに、
前記Ｎ次元テンソルの前記特定の要素にアクセスするための前記求められたアドレスを示すデータを出力するステップを備える、方法。
【請求項１６】
各次元の前記初期値は、前記次元の初期値要素に格納され、
前記次元の前記ステップ値は、前記次元のステップ値要素に格納される、請求項１５に記載の方法。
【請求項１７】
各部分アドレスオフセット値要素、各初期値要素および各ステップ値要素は、レジスタを備える、請求項１６に記載の方法。
【請求項１８】
前記特定の要素の前記アドレスを求めるステップは、前記１つ以上のハードウェア加算器を使用して各次元について前記部分アドレスオフセット値の合計を求めるステップを備える、請求項１５から１７のいずれか１項に記載の方法。
【請求項１９】
各次元について、前記ステップ値を前記次元の以前のアドレスオフセット値に加算することによって、前記次元のネステッドループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めるステップをさらに備える、請求項１５から１８のいずれか１項に記載の方法。
【請求項２０】
各次元について、前記次元の前記求められた部分アドレスオフセット値が前記次元の限界値に等しいか否かを判断するステップと、
第１のネステッドループに対応する第１の次元の前記求められた部分アドレスオフセット値が前記第１の次元の前記限界値に等しいと判断したことに応答して、
前記第１の次元の前記部分アドレスオフセット値を前記第１の次元の前記初期値にリセットするステップと、
前記第１のネステッドループがネストされる第２のネステッドループに対応する第２の次元について、前記１つ以上のハードウェア加算器を使用して、前記第２の次元の前記ステップ値と前記第２の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第２の次元の前記部分アドレスオフセット値を更新するステップとをさらに備える、請求項１９に記載の方法。
【国際調査報告】
2020521198.tif 000014
2020521198.tif 000015