IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ グーグル インコーポレイテッドの特許一覧

<>
  • 特許-代替ループ限界値 図1
  • 特許-代替ループ限界値 図2
  • 特許-代替ループ限界値 図3
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-03-04
(45)【発行日】2022-03-14
(54)【発明の名称】代替ループ限界値
(51)【国際特許分類】
   G06F 17/16 20060101AFI20220307BHJP
   G06N 3/04 20060101ALI20220307BHJP
【FI】
G06F17/16 H
G06N3/04
【請求項の数】 16
(21)【出願番号】P 2019556242
(86)(22)【出願日】2018-04-27
(65)【公表番号】
(43)【公表日】2020-08-13
(86)【国際出願番号】 US2018029796
(87)【国際公開番号】W WO2018236468
(87)【国際公開日】2018-12-27
【審査請求日】2020-01-08
(31)【優先権主張番号】15/627,022
(32)【優先日】2017-06-19
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】502208397
【氏名又は名称】グーグル エルエルシー
【氏名又は名称原語表記】Google LLC
【住所又は居所原語表記】1600 Amphitheatre Parkway 94043 Mountain View, CA U.S.A.
(74)【代理人】
【識別番号】110001195
【氏名又は名称】特許業務法人深見特許事務所
(72)【発明者】
【氏名】テマム,オリビエ
(72)【発明者】
【氏名】カイタン,ハーシット
(72)【発明者】
【氏名】ナラヤナスワミ,ラビ
(72)【発明者】
【氏名】ウ,ドン・ヒョク
【審査官】井上 宏一
(56)【参考文献】
【文献】特開2012-032986(JP,A)
【文献】特開2011-197876(JP,A)
【文献】エイホ A.V.外3名,Information & Computing ex.38 コンパイラ[第2版],第2版,株式会社サイエンス社,2009年05月25日,pp.833-843
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/16
G06N 3/04
(57)【特許請求の範囲】
【請求項1】
N次元テンソルにアクセスするために計算システムによって行われる方法であって、
第1のネステッドループの1つ以上の第1の反復の各々について、前記第1のネステッドループ内にネストされた第2のネステッドループの第1のループ限界値に達するまで、前記第2のネステッドループの反復を行うことを備え前記方法はさらに、
前記第1のネステッドループの最後から2番目の反復が終了した後で、前記第1のループ限界値よりも小さい代替ループ限界値に達するまで、前記第1のネステッドループの最後の反復について前記第2のネステッドループの1つ以上の反復を行うことを備え、
前記第2のネステッドループの反復回数が前記計算システムの計算ユニットの数と等しくなるように、前記第1のループ限界値は、前記計算システムの計算ユニットの数に基づく第1の値であり、前記代替ループ限界値は、前記N次元テンソルのある次元のテンソル要素の数を前記計算システムの計算ユニットの数で除算した余りである第2の値である、方法。
【請求項2】
前記第1のネステッドループの前記最後から2番目の反復が終了したという判断に応じて、前記第1のネステッドループの前記最後の反復について、前記第1のループ限界値の代わりに前記代替ループ限界値を用いることをさらに備える、請求項1に記載の方法。
【請求項3】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項1または2に記載の方法。
【請求項4】
前記第2のネステッドループの前記第1のループ限界値に達するまで、前記第1のネステッドループ内にネストされた前記第2のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第2のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第2のネステッドループのそれぞれの反復を行う、請求項1~3のいずれか1項に記載の方法。
【請求項5】
前記第1のネステッドループと前記第2のネステッドループとを含むネステッドループの組は、前記第1のネステッドループと前記第2のネステッドループとの間でネストされた1つ以上のループを含み、前記第2のネステッドループは他のループ内にネストされている、請求項1~のいずれか1項に記載の方法。
【請求項6】
前記第2のネステッドループは、前記第1のネステッドループと前記第2のネステッドループとの間に他のループがネストされていない状態で、前記第1のネステッドループ内に直接ネストされている、請求項1~のいずれか1項に記載の方法。
【請求項7】
N次元テンソルにアクセスするためのシステムであって、
複数の個別の計算ユニットと、
1つ以上のプロセッサとを備え、前記1つ以上のプロセッサは、
第1のネステッドループの1つ以上の第1の反復の各々について、前記第1のネステッドループ内にネストされた第2のネステッドループの第1のループ限界値に達するまで、前記第2のネステッドループの反復を行うように構成されており、
前記1つ以上のプロセッサはさらに、
前記第1のネステッドループの最後から2番目の反復が終了した後で、前記第1のループ限界値よりも小さい代替ループ限界値に達するまで、前記第1のネステッドループの最後の反復について前記第2のネステッドループの1つ以上の反復を行うように構成されており
前記第2のネステッドループの反復回数が前記計算ユニットの数と等しくなるように、前記第1のループ限界値は、前記計算ユニットの数に基づく第1の値であり、前記代替ループ限界値は、前記N次元テンソルのある次元のテンソル要素の数を前記計算ユニットの数で除算した余りである第2の値である、システム。
【請求項8】
前記1つ以上のプロセッサはさらに、前記第1のネステッドループの前記最後から2番目の反復が終了したという判断に応じて、前記第1のネステッドループの前記最後の反復について、前記第1のループ限界値の代わりに前記代替ループ限界値を用いるように構成されている、請求項に記載のシステム。
【請求項9】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項またはに記載のシステム。
【請求項10】
前記第2のネステッドループの前記第1のループ限界値に達するまで、前記第1のネステッドループ内にネストされた前記第2のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第2のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第2のネステッドループのそれぞれの反復を行う、請求項7~9のいずれか1項に記載のシステム。
【請求項11】
前記第1のネステッドループと前記第2のネステッドループとを含むネステッドループの組は、前記第1のネステッドループと前記第2のネステッドループとの間でネストされた1つ以上のループを含み、前記第2のネステッドループは、他のループ内にネストされている、請求項7~10のいずれか1項に記載のシステム。
【請求項12】
前記第2のネステッドループは、前記第1のネステッドループと前記第2のネステッドループとの間に他のループがネストされていない状態で、前記第1のネステッドループ内に直接ネストされている、請求項7~10のいずれか1項に記載のシステム。
【請求項13】
N次元テンソルにアクセスするための装置であって、
各々がテンソル要素のメモリアドレスを計算する複数の個別の計算ユニットと、
動作を行うことによって、ネステッドループの反復を前記個別の計算ユニットへ割当てるように構成されたコントローラとを備え、前記動作は、
第1のネステッドループの1つ以上の第1の反復の各々について、前記第1のネステッドループ内にネストされた第2のネステッドループの第1のループ限界値に達するまで、前記第2のネステッドループの反復を行うことを含み前記計算ユニットのうちの1つが前記第2のネステッドループの各々の反復についてテンソル要素のメモリアドレスを決定し、前記動作はさらに、
前記第1のネステッドループの最後から2番目の反復が終了した後で、前記第1のループ限界値よりも小さい代替ループ限界値に達するまで、前記第1のネステッドループの最後の反復について前記第2のネステッドループの1つ以上の反復を行うことを含み、
前記第2のネステッドループの反復回数が前記計算ユニットの数と等しくなるように、前記第1のループ限界値は、前記計算ユニットの数に基づく第1の値であり、前記代替ループ限界値は、前記N次元テンソルのある次元のテンソル要素の数を前記計算ユニットの数で除算した余りである第2の値である、装置。
【請求項14】
前記コントローラは、前記第1のネステッドループの前記最後から2番目の反復が終了したという判断に応じて、前記第1のネステッドループの前記最後の反復について、前記第1のループ限界値の代わりに前記代替ループ限界値を用いることを含む動作をさらに行うように構成されている、請求項13に記載の装置。
【請求項15】
個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含む、請求項13または14に記載の装置。
【請求項16】
前記第2のネステッドループの前記第1のループ限界値に達するまで、前記第1のネステッドループ内にネストされた前記第2のネステッドループの反復を行うことは、前記計算ユニットを用いて前記第2のネステッドループの各々の反復を並列して行うことを含み、
各計算ユニットは、前記第2のネステッドループのそれぞれの反復を行う、請求項13~15のいずれか1項に記載の装置。
【発明の詳細な説明】
【技術分野】
【0001】
背景
本明細書は、一般に、複数の計算ユニットを含む専用の計算ユニットを用いて機械学習計算を行うことに関する。
【背景技術】
【0002】
ニューラルネットワークは、モデルの1つ以上の層を用いて、受信した入力について出力、たとえば分類を生成する機械学習モデルである。ニューラルネットワークの中には、外層に加えて1つ以上の隠れ層を含むものもある。各隠れ層の出力は、ネットワークにおける次の層、すなわち、ネットワークの次の隠れ層または出力層に対する入力として用いられる。ネットワークの各層は、パラメータのそれぞれの組の現在値に従って、受信された入力から出力を生成する。
【0003】
ニューラルネットワークの中には、1つ以上の畳み込みニューラルネットワーク層を含むものもある。各畳み込みニューラルネットワーク層は、カーネルの関連する組を有する。カーネルは、重み入力のマトリックス構造として表すことができる。各畳み込み層は、カーネルを使用して、層に対する入力を処理する。層に対する入力の組は、マトリックス構造として表すこともできる。
【発明の概要】
【課題を解決するための手段】
【0004】
概要
本明細書で説明される主題のある革新的な態様によると、N次元テンソルにアクセスするための方法は、第1のネステッドループの1つ以上の第1の反復の各々について、第1のネステッドループ内にネストされた第2のネステッドループの第1のループ限界値に達するまで、第2のネステッドループの反復を行うことを備える。第1のネステッドループの1つ以上の第1の反復についての第2のネステッドループの反復回数は、第2のネステッドループが計算システムのハードウェアのプロパティの値を超える反復の総数を有することに応じて、第1のループ限界値によって制限されてもよい。第1のネステッドループの最後から2番目の反復が終了した後で、第1のループ限界値よりも小さい代替ループ限界値に達するまで、第1のネステッドループの最後の反復について、第2のネステッドループの1つ以上の反復を行ってもよい。
【0005】
これらのおよび他の実現例は各々、任意に以下の特徴のうちの1つ以上を含んでもよい。いくつかの局面は、第1のネステッドループの最後から2番目の反復が終了したという判断に応じて、第1のネステッドループの最後の反復について、第1のループ限界値の代わりに代替限界値を用いることを備えてもよい。
【0006】
いくつかの局面では、ハードウェアのプロパティの値は、計算システムの複数の個別の計算ユニットを含む。個々の計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットを含んでもよい。
【0007】
第2のネステッドループの第1のループ限界値に達するまで、第1のネステッドループ内にネストされた第2のネステッドループの反復を行うことは、計算ユニットを用いて、第2のネステッドループの各々の反復を並列して行うことを含んでもよい。各計算ユニットは、第2のネステッドループのそれぞれの反復を行ってもよい。
【0008】
いくつかの局面では、代替ループ限界値は、第2のネステッドループの反復の総数を計算ユニットの数で除算することによって生じる余りの値に基づいている。第1のネステッドループと第2のネステッドループとを含むネステッドループの組は、第1のネステッドループと第2のネステッドループとの間でネストされた1つ以上のループを含んでもよく、第2のネステッドループは、他のループ内にネストされてもよい。第2のネステッドループは、第1のネステッドループと第2のネステッドループとの間に他のループがネストされていない状態で、第1のネステッドループ内に直接ネストされてもよい。
【0009】
本明細書に記載されている主題は、以下の利点のうちの1つ以上を実現するように、特定の実施形態において実現されてもよい。複数の計算ユニット、たとえば、複数の計算タイル、複数のプロセッサ、または複数の数値演算ユニットを用いて機械学習計算を並列して行うことによって、計算速度および効率が増加し、より複雑な機械学習計算をより短い時間で行うことができる。ネステッドループの調整可能なループ限界値によって、反復回数が個別の計算ユニットの数の倍数または他のハードウェアのプロパティでない場合であっても、ネステッドループの反復を並列して処理することができる。内側ループのループ限界値は、内側ループの反復回数が、内側ループがネストされている外側ループの最後の反復以外の全ての反復について個別の計算ユニットの数に等しくなるように、設定可能である。これにより、外側ループの各反復について、内側ループの各反復が並列して、たとえば同時に行われる。さらに、外側ループの最後の反復以外の全ての反復について、個々の計算ユニットは、外側ループの各反復について使用され、その結果、計算がより速くより効率的になる。外側ループの最後の反復について内側ループの代わりに代替ループ限界値を用いることによって、内側ループの反復を行うために必要な反復の数を減らすことができ、メモリデバイスの数が少なくなる、および/または、より多くのメモリが利用可能になる。
【0010】
このおよび他の局面の他の実現例は、コンピュータ記憶装置に符号化された方法の動作を実行するように構成された、対応するシステム、装置およびコンピュータプログラムを含む。1つ以上のコンピュータのシステムは、操作時にシステムに動作を実行させる、システムにインストールされたソフトウェア、ファームウェア、ハードウェア、またはそれらの組合わせによって、そのように構成されてもよい。1つ以上のコンピュータプログラムは、データ処理装置によって実行されると装置に動作を実行させる命令を有することによって、そのように構成されてもよい。
【0011】
本明細書に記載されている主題の1つ以上の実現例の詳細については、添付の図面および以下の説明に記載されている。主題の他の考えられる特徴、局面および利点は、明細書、図面および特許請求の範囲から明らかになる。
【図面の簡単な説明】
【0012】
図1】計算システムの例がテンソル計算を加速する環境のブロック図である。
図2】複数の計算ユニットを用いてテンソルのトラバースを行うためのネステッドループの例を示す図である。
図3】テンソル計算を行うためのプロセスの例を示すフロー図である。
【発明を実施するための形態】
【0013】
様々な図における同様の参照番号および名称は、同様の要素を示す。
詳細な説明
本明細書で説明される主題は、ネステッドループの反復を並列して処理するための代替ループ制限値の使用、たとえば、複数の計算ユニットを含むハードウェア計算システムの使用に関する。各計算ユニットは、計算タイル、プロセッサ、または数値演算ユニットとして実現されてもよい。複数の計算ユニットは、ニューラルネットワークの推論作業負荷を加速するように、および/または、テンソル要素のメモリアドレスを求めるための計算を加速するように構成可能である。ハードウェア計算システムの各計算ユニットは、自己完結型であり、多層ニューラルネットワークの所与の層が求める計算を独立して実行可能である。
【0014】
複数の層を有するニューラルネットワークは、推論を計算するために使用可能である。たとえば、入力を与えられると、ニューラルネットワークはその入力について推論を計算可能である。ニューラルネットワークは、ニューラルネットワークの層の各々を通じて入力を処理することによって、この推論を計算する。特に、ニューラルネットワークの層は各々、重みのそれぞれの組を有する。各層は、入力を受信し、当該層の重みの組に従って入力を処理して、出力を生成する。
【0015】
したがって、ニューラルネットワークは、受信した入力から推論を計算するために入力を受信し、推論を生成するためにニューラルネットワーク層の各々を介して入力を処理し、1つのニューラルネットワーク層からの出力は、次のニューラルネットワーク層に対する入力として提供される。ニューラルネットワーク層に対するデータ入力、たとえば、ニューラルネットワークに対する入力、または、シーケンスにおけるニューラルネットワーク層の下の層のニューラルネットワーク層に対する出力は、層に対する起動入力と呼ぶことができる。
【0016】
本明細書で説明される技術は、複数の計算ユニット、たとえば、複数の計算タイル、複数のプロセッサ、または複数の数値演算ユニットにわたってテンソル計算を分散することによって、テンソル要素のメモリアドレスの計算を行うことが可能である。メモリアドレスの計算は、テンソル状態要素に基づいてメモリアドレスのオフセットを求めることと、このオフセットをテンソル要素のベースアドレスに加算することとを含み得る。
【0017】
テンソルは多次元形状オブジェクトであり、多次元形状オブジェクトの例としては、行列およびデータ配列が挙げられる。一般に、ソフトウェアアルゴリズムは、1つ以上の計算タイルによって実行されて、ネステッドループを処理することによってテンソル計算を行って、N次元テンソルのトラバースを行う。計算プロセスの一例では、各ループは、N次元テンソルの特定の次元のトラバースに関与してもよい。所与のテンソル構造について、計算タイルは、テンソルと関連する1つ以上のドット積の計算を実行するために、特定のテンソルの要素へのアクセスを必要とすることがある。ニューラルネットワーク層内で行われる計算プロセスは、入力起動を含む入力テンソルに重みを含むパラメータテンソルを乗算することを含んでもよい。この計算は、入力起動に1つ以上のサイクルの重みを乗算することと、複数のサイクルにわたって積を累算することとを含む。メモリ構造によって提供される入力起動に、他のメモリ構造によって提供されるパラメータまたは重みが乗算されると、計算が発生する。テンソルはメモリに記憶されるため、テンソルインデックスの組は、メモリからテンソルの正しい要素を検索するために、メモリアドレスの組への変換を必要としてもよい。一般に、計算タイルのテンソルトラバーサルユニットは、テンソルと関連する各次元のインデックス、および計算を行うためにインデックス要素がトラバースされる順序を提供する制御動作を実行する。乗算の結果が出力バスに書き込まれてメモリに記憶されると、テンソル計算は終了する。
【0018】
1つの計算タイル(または複数の計算タイル)内の複数の数値演算ユニットは、N次元テンソルについてのメモリアドレス計算を並列して行う。たとえば、ネステッドループのうち最も内側のループの反復毎に、計算が行われてもよい。テンソル計算が行われる各ループは、「テンソル計算ループ」と呼ばれ、常に最も内側のループでなくてもよい。これらの反復の計算は、数値演算ユニットを用いて並列に行うことが可能である。
【0019】
ネステッドループにおけるテンソルのトラバースを行うには、要素の対応するデータ値のロードまたは格納を行うために、要素のメモリアドレス値の計算が必要である。たとえば、3次元テンソルの要素は、画像がニューラルネットワークによって分類されるという特徴を表してもよい。第1の次元(Z)は画像の幅を表し、第2の次元(Y)は画像の高さを表し、第3の次元(X)は画像内の画素のRGB値を表してもよい。画像を分類するために、各RBG値に畳み込み層のフィルタ値を乗算して、起動マップを生成してもよい。
【0020】
ネステッドループを使用して、テンソルの各RBG値にアクセスするためのメモリアドレスを決定することができる。ネステッドループは、テンソルの各次元のループを含んでもよい。たとえば、出力ループ(z)は、Z次元(画像の幅)のトラバースを行うために使用可能であり、中間ループ(y)は、Y次元(画像の高さ)のトラバースを行うために使用可能であり、内側ループ(x)は、X次元(各画素の3つのRGB値)のトラバースを行うために使用可能である。内側ループの各反復において、外側ループzおよび中間ループyの値によって表される画像の特定の画素の3つのRGB値のうちの1つについて、メモリアドレスが求められる。たとえば、Z=0およびY=0によって表される画像の画素のR値のメモリアドレスは、z=0およびy=0(たとえば、z=0;y=0;x=0)の場合に、内側ループxの第1の反復の間に求められてもよい。同様に、Z=5およびY=2によって表される画像の画素のG値のメモリアドレスは、z=5およびy=2(たとえば、z=5;y=2;x=2)の場合に、内側ループの第3の反復の間に求められてもよい。
【0021】
メモリアドレスの計算は、複数の計算ユニットを用いて並列して行うことができる。たとえば、3つの計算ユニットがある場合、特定の画素の各RGB値のメモリアドレス値は、並列して求めることができる。第1の計算ユニットは、画素のR値のメモリアドレスを求めることができ、第2の計算ユニットは、画素のG値のメモリアドレスのメモリアドレスを求めることができ、第3の計算ユニットは、画素のB値のメモリアドレスを求めることができる。RGB値についてメモリアドレスが求められると、処理ユニットは、メモリアドレスを用いて値にアクセスし、この値にフィルタ値を乗算することができる。
【0022】
場合によっては、テンソル計算ループの反復回数は、計算ユニットの数を超えてもよい。そのような場合、テンソル計算ループの反復は、テンソル計算ループがネストされる外側ループの複数の並列反復に分けられる。たとえば、テンソル計算ループに対応するN次元テンソルの次元は、128個の要素を含んでもよく、計算システムは、64個の計算ユニットを含んでもよい。この例では、テンソル計算ループは、外側ループの2つの反復の各々について64個の計算が並列して行われるように、2つの64個の外側ループ反復に分けることができる128回の反復を含む。この例では、第1の64回の反復を、計算ユニットの間で分散可能である。第1の64回の反復が完了すると、計算ユニットの間で次の64回の反復を分散可能である。
【0023】
場合によっては、テンソル計算ループの反復回数は、計算ユニットの数の正確な倍数でなくてもよい。たとえば、テンソル計算ループに対応する次元は、160個の要素を含んでもよく、計算システムは、64個の計算ユニットを有してもよい。この例では、テンソル計算ループは、2つの64個の外側ループの反復と第3の32個の外側ループの反復とに分けることができる、160回の反復を含む。第3の外側ループの反復についてのテンソル計算ループの反復回数を調整するために、テンソル計算ループのループ限界値は、外側ループの第2の反復の後で、たとえば外側ループの最後の反復の前に、64から32に変更されてもよい。
【0024】
図1は、計算システム102の例がテンソル計算を加速する環境100のブロック図である。たとえば、計算システム102は、ディープニューラルネットワーク(DNNs)と関連する計算を促進可能である。計算システム102は、コントローラ105と、複数の個別の計算タイル112A~112Zとを含む。コントローラ105は、計算システム102内のテンソル計算に関連する1つ以上の命令を実行するように構成される。図示されていないが、コントローラ105は、計算システム102内で発生する計算に関連する様々なデータを記憶し、これらにアクセスするためのデータメモリと、コントローラ105の1つ以上のプロセッサによって実行可能な1つ以上の機械可読命令を記憶するための命令メモリとを含み得る。
【0025】
コントローラ105は、入力132、たとえば命令、コンパイルされたプログラムなどをホスト130から受信することができる。計算システム102がテンソル計算を行うと、コントローラ105は、ホストに出力134を提供できる。たとえば、出力134は、テンソル要素のメモリアドレスでもよい。コントローラ105は、ホストインターフェース(図示せず)を介してホスト130に対する入力132の受信および出力134の提供が可能である。
【0026】
コントローラ105は、1つ以上のデータ通信路、たとえば1つ以上のバスを介して、計算タイル112‐A~112‐Zと通信できる。同様に、計算タイル112‐A~112‐Zは、1つ以上のバスを介して互いに通信できる。複数の計算タイルを有する計算システムの例は、2016年10月27日に出願された「ニューラルネットワーク計算タイル」と題された米国特許出願第15/335,769号に記載されており、その開示全体を本明細書に引用により援用する。
【0027】
各計算タイル112‐A~112‐Zは、処理ユニット114と、データ記憶媒体116と、テンソルトラバーサルユニット120とを含む。記憶媒体116は、計算システム102内の情報を格納する。記憶媒体116が1つまたは複数の揮発性メモリユニットである実現例もあれば、記憶媒体116が1つまたは複数の不揮発性メモリユニットである実現例もある。記憶媒体116は、フロッピー(登録商標)ディスクデバイス、ハードディスクデバイス、光ディスクデバイスもしくはテープデバイス、フラッシュメモリもしくは他の同様のソリッドステートメモリデバイス、またはストレージエリアネットワークもしくは他の構成内のデバイスを含むデバイスのアレイなどの、別の形態のコンピュータ可読媒体であってもよい。命令は、処理ユニット114によって実行されると、処理ユニット114に1つ以上のタスクを実行させる。
【0028】
処理ユニット114は、1つ以上のプロセッサおよび/または1つ以上の有限状態機械(FSM)を含み得る。処理ユニット114は、コントローラ105から受信された命令を実行可能である。たとえば、処理ユニット114は、テンソルトラバーサルユニット120を用いてテンソル要素のメモリアドレス(またはメモリアドレスオフセット)を計算するための命令を実行可能である。FSMを含む処理ユニットの場合、FSMは、テンソルトラバーサルユニット120に、テンソル要素のメモリアドレスを問合わせることができる。
【0029】
一般に、テンソルトラバーサルユニット120は、1つ以上のテンソルと関連する状態を求める。いくつかの実現例では、この状態は、メモリアドレス値を求めるためのループ限界値、現在のループインデックス変数値、部分アドレスオフセット値、および/または、ブランチループ限界値を処理するためのプログラムカウンタ値を含んでもよい。テンソルトラバーサルユニット120は、特定用途向け集積回路として実現されてもよい。
【0030】
テンソルトラバーサルユニット120は、テンソルインデックスをメモリアドレスに変換する。たとえば、テンソルトラバーサルユニット120は、N次元テンソルインデックスの組を1次元アドレス空間に変換してもよい。テンソルトラバーサルユニット120は、テンソル要素のメモリアドレスを要素の次元インデックスの結合(たとえば、線形結合)にすることによって、そのような変換を行うことが可能である。
【0031】
テンソルトラバーサルユニット120は、1つ以上のテンソル状態要素122と、1つ以上の数値演算ユニット124とを含み得る。たとえば、計算タイル112‐Aのテンソルトラバーサルユニット120は、4つの数値演算ユニット124‐A~124‐Dを含む。他の計算タイルの他のテンソルトラバーサルユニットは、他の数の数値演算ユニットを含んでもよい。テンソル状態要素122の各々は、記憶素子、たとえば、レジスタまたは任意の好適な記憶回路でもよい。各数値演算ユニット124は、1つまたは複数の算術論理演算ユニット(ALUs)および/または1つ以上のハードウェア加算器を含み得る。数値演算ユニット124は、たとえばテンソル状態要素に格納された値に基づいて、テンソル要素のメモリアドレスまたはメモリアドレスオフセット値を計算するために使用可能である。テンソルトラバーサルユニットを用いてメモリアドレスを求める技法の例は、2016年10月27日に出願された「ニューラルネットワーク計算タイル」と題された米国特許出願第15/335,769号、および2016年2月3日に出願された「多次元テンソルにおけるデータへのアクセス」と題された米国特許出願第15/014,265号に記載されている。コントローラ105は、計算タイル112‐A~112‐Zを用いてテンソル計算を調整可能である。たとえば、コントローラ105は、命令を受信して、テンソル要素のメモリアドレスを求めることができる。コントローラ105は、ネステッドループを用いてテンソル計算を行うことができる。
【0032】
各ループは、N次元テンソルのそれぞれの次元のトラバースに関与することができる。多次元テンソルは、マトリックスまたは多次元マトリックスでもよい。たとえば、2次元テンソルはマトリックスである一方で、3次元テンソルは、複数の2次元マトリックスで構成される3次元マトリックスである。N次元テンソルの各次元は1つ以上の要素を含んでもよく、各要素は、それぞれのデータ値を格納してもよい。たとえば、テンソルは、プログラムにおける変数でもよく、この変数は3次元でもよい。第1の次元は300個の要素の長さを有してもよく、第2の次元は1000個の要素の長さを有してもよく、第3の次元は20個の要素の長さを有してもよい。当然のことながら、各次元における他の数の要素が可能である。
【0033】
ネステッドループ内のテンソルのトラバースは、要素の対応するデータ値のロードまたは格納を行うための要素のメモリアドレス値の計算を含み得る。forループは、ネステッドループの一例であり、3つのループインデックス変数(たとえば、i、j、およびk)によってトラックされる3つのループが、3次元テンソルのトラバースを行うようにネスト可能である。ニューラルネットワークでは、要素の値は、テンソルと関連付けられた1つ以上のドット積の計算で用いられてもよい。たとえば、要素の値は、対応するパラメータまたは重みが乗算されてもよい。テンソルの要素をネステッドforループを用いて順番にトラバースして、要素にアクセスし、要素の値を用いて1つ以上の計算を行ってもよい。3次元テンソルの例を続けると、変数iによってトラックされるループのトラバースを行うために外側forループを用いてもよく、変数jによってトラックされるループのトラバースを行うために中央forループを用いてもよく、変数kによってトラックされるループのトラバースを行うために内側forループを用いてもよい。この例では、アクセスされる第1の要素は、(i=0,j=0,k=0)であってもよく、第2の要素は、(i=0,j=0,k=1)であってもよい、などである。処理ユニットが要素の値にアクセスできるように、かつ、要素の値を用いて1つ以上の計算を行えるように、計算タイル112‐A~112‐Zのテンソルトラバーサルユニット120を用いて、ネステッドループを用いて順番に要素のメモリアドレスを求めることが可能である。重みまたはパラメータの値も、ネステッドforループを用いて同様にアクセス可能である。また、テンソルトラバーサルユニット120は、計算で用いられる重みまたはパラメータについて、および/または計算の出力についてアドレスを求めるために使用可能であり、計算の出力は、ニューラルネットワークの隠れ層に対する入力として用いられてもよい。
【0034】
たとえば、米国特許出願第15/014,265号に記載されているように、テンソル状態要素122は、テンソルインデックス要素のグループ、テンソル限界値要素のグループ、および次元乗数要素のグループを含み得る。要素の各グループは、M個の行とN個の列とを有する2Dアレイとして配置され得る。グループの各行は、テンソルのテンソルインデックス情報を表し得る。グループの各列は、テンソルに関連付けられたネステッドループインデックス変数値についての情報(たとえば、テンソルインデックス値、テンソル限界値、または次元乗数値)を表し得る。たとえば、テンソルインデックス要素の2Dアレイにおける1つの列は、変数iについてのテンソルインデックス情報を表してもよく、1つの列は、変数iについてのテンソルインデックス情報を表してもよく、1つの列は、変数iについてのテンソルインデックス情報を表してもよく、1つの列は、変数kについてのテンソルインデックス情報を表してもよい。
【0035】
各テンソルインデックス要素は、ネステッドループにおけるループのネステッドループ変数をトラックできる。たとえば、1つのテンソルインデックス要素は、ネステッドループインデックス変数iをトラックするように割当てられてもよく、1つのテンソルインデックス要素は、ネステッドループインデックス変数jをトラックするように割当てられてもよく、1つのテンソルインデックス要素は、ネステッドループインデックス変数kをトラックするように割当てられてもよい。各テンソル限界値要素は、テンソルインデックス要素における対応する要素を有する。各テンソル限界値要素は、テンソルに関連付けられたネステッドループインデックス変数値についてのテンソル限界値情報を表してもよい。たとえば、1つのテンソル限界値要素は、ネステッドループインデックス変数iについてのテンソル限界値情報を表してもよく、1つのテンソル限界値要素は、ネステッドループインデックス変数jについてのテンソル限界値情報を表してもよく、1つのテンソル限界値要素は、ネステッドループインデックス変数kについてのテンソル限界値情報を表してもよい。
【0036】
各次元乗数要素は、テンソルインデックス要素における対応する要素に乗算される乗数を表し得る。要素のメモリアドレスを求めるために、テンソルトラバーサルユニット120は、ネステッドループインデックス変数のテンソルインデックス要素に格納された値にネステッドループインデックス変数の乗数を乗算することによって、各ネステッドループインデックス変数のメモリアドレスオフセットを求めることができる。次に、テンソルトラバーサルユニット120は、全ての乗算結果を合計して、アクセスされる要素に対応するメモリアドレスを求めることができる。
【0037】
テンソルトラバーサルユニット120は、ネステッドループの内側ループの各反復後に、テンソルインデックス要素を更新することができる。内側ループの各反復について、テンソルトラバーサルユニット120は、たとえば内側ループのテンソルインデックス要素をインクリメントすることによって、ループのテンソルインデックス要素を更新することができる。内側ループの更新されたテンソルインデックス要素が、内側ループのテンソル限界値要素に格納された値に等しい場合には、テンソルインデックス要素をリセットすることができ、内側ループがネストされる次の外側ループのテンソルインデックス要素を更新することができる。次に、テンソルトラバーサルユニット120は、上述したように、テンソルインデックス要素にそれらの対応する乗数を乗算し、結果を合計することによって、内側ループのこの反復に対応する次の要素のメモリアドレスを求めることができる。
【0038】
コントローラ105は、プログラムのネステッドループを反復することと、ループのうちの1つ以上の各反復について、たとえば、ネステッドループの最も内側の(他の)ループの各反復について計算を行うこととによって、テンソル計算を調整してもよい。テンソル計算を加速するために、コントローラ105は、複数の計算ユニットを用いてテンソル計算のうち少なくとも一部を並列して行ってもよい。計算ユニットは、個別の計算タイルまたは個別の数値演算ユニットでもよい。たとえば、コントローラ105は、計算タイル112‐Aが第1のテンソル計算を行うように要求し、同時に、計算タイル112‐Bが第2のテンソル計算を行うように要求してもよい。他の例では、コントローラ105は、計算タイル112‐Aが特定のテンソルのテンソル計算を行うように要求してもよい。その後、テンソルトラバーサルユニット120は、数値演算ユニット124‐A~124‐Dを用いてテンソル計算を並列して行うことができる。
【0039】
ループは一般に、ループのインデックス変数がループの限界値に等しくなると(またはこれを上回ると)終了する。たとえば、ループは、「for(i=0;j<3;i++)」とプログラムされてもよく、ここで、iはインデックス値であり、限界値は3である。この例のループは、3つの反復(i=0、i=1、およびi=2)を含む。インデックス変数が3に等しい場合、計算しなくてもループから出る。複数の計算ユニット(たとえば、複数の計算タイル112または複数の数値演算ユニット124)を用いて並列計算を行う場合、コントローラ105は、計算が計算ユニットに割当てられるたびにインデックス変数を反復し、ループの他の反復を他の計算ユニットに割当てる前に、インデックス変数を限界値と比較してもよい。
【0040】
いくつかの実現例では、コントローラ105によって実行されるプログラムのネステッドループは、計算システム102のプロパティに基づいて求められたループ限界値を有していてもよい。たとえば、ループのうちの1つ以上のループ限界値は、計算システム102の計算タイル112‐A~112‐Zの数またはテンソルトラバーサルユニット120の数値演算ユニットの数に基づいて求められてもよい。
【0041】
いくつかの実現例では、コンパイラ136は、テンソルのテンソル計算を行うためのプログラムをコンパイルする。コンパイラ136は、テンソルの次元のうちの1つ以上に含まれる要素の数、および/または、計算システム102の計算ユニットの数に基づいて、ループのうちの1つ以上のループ限界値を求めるように構成可能である。ループのループ限界値は、ループのインデックス値がループ限界値と等しくなるとループが終了する数である。言い換えると、ループのループ限界値は、ループの反復回数に等しくなり得る。
【0042】
コンパイラ136は、1つ以上のテンソル計算ループ(テンソル計算が行われるループ)の外側ループを生成するように、かつ、外側ループの1つ以上のループ限界値を求めるように構成されてもよい。生成された外側ループは、テンソル計算ループの反復を外側ループの複数の反復に分割するために使用されてもよい。たとえば、計算システム102は64個の計算ユニット(たとえば、計算タイルまたは数値演算ユニット)を含んでもよく、テンソル計算ループは128回の反復を含んでもよい。この例では、計算システム102は、64個のテンソル計算を並列して行うことが可能である。64個のテンソル計算を並列して行うために、テンソル計算ループの128回の反復は、各々がテンソル計算ループの64回の反復を含む、2つの外側ループの反復に分割可能である。たとえば、外側ループの第1の反復は、テンソル計算ループの反復1~64を含んでもよい。外側ループの第2の反復は、テンソル計算ループの反復65~128を含んでもよい。このように、64個のテンソル計算が、計算システムの64個の計算ユニットの各々を用いて外側ループの第1の反復について並列して行われ(たとえば、1つのタイルにつき1つの計算)、64個のテンソル計算が、64個の計算ユニットを用いて外側ループの第2の反復について並列して行われる。
【0043】
コンパイラ136は、外側ループが生成されるべきかどうかを判断し、生成されるべきであると判断すると、コンパイルされたプログラムにおいて外側ループを生成することができる。いくつかの実現例では、コンパイラ136は、プログラムが実行される計算システム102の計算ユニットの数よりも多い反復をテンソル計算ループが有している場合、外側ループを(コンパイルされているプログラムにおける任意の外側ループに加えて)生成するだけである。テンソル計算ループが計算ユニットの数よりも多い反復を有している場合、コンパイラ136は、外側ループを生成して、テンソル計算ループの反復を複数の外側ループの反復に分割可能である。
【0044】
コンパイラ136は、テンソル計算が行われるループの反復回数、および/または、プログラムが実行される計算システム102の計算ユニットの数に基づいて、生成された外側ループのループ限界値を求めることもできる。テンソル計算ループの反復回数が計算ユニットの数の倍数であれば、反復回数は、ループに対応する次元における要素の数に等しくてもよい。計算ユニットの数は、計算ユニットを用いて並列して行うことが可能な反復回数の最大値を表すため、コンパイラ136は、計算ユニットの数でテンソル計算ループの反復回数を除算できる。たとえば、テンソル計算ループの反復回数が128であり計算ユニットの数が64であれば、生成された外側ループのループ限界値は2(128/64)でもよい。そのため、この例では、外側ループの第1の反復は、テンソル計算ループの64回の並列反復を含み、外側ループの第2の反復は、テンソル計算ループの64回の並列反復を含む。除算結果が余りを生じる場合、以下で説明するように、外側ループのループ限界値は、1だけインクリメントされてもよい。
【0045】
コンパイラ136は、テンソル計算ループの反復回数と、プログラムが実行される計算システム102の計算ユニットの数とに基づいて、テンソル計算ループの1つ以上のループ限界値を求めることもできる。テンソル計算ループの反復回数が計算ユニットの数の正確な倍数である場合、テンソル計算ループのループ限界値は、テンソル計算ループについて生成された外側ループの各反復の計算ユニットの数と等しくなり得る。たとえば、テンソル計算ループが120回の反復を有し計算システムが60個の計算ユニットを含む場合、テンソル計算ループのループ限界値は60でもよく、外側ループのループ限界値は2でもよい。この例では、外側ループの第1の反復はテンソル計算ループの60回の反復(並列反復)を含み、外側ループの第2の反復は、テンソル計算ループの60回の反復を含んでもよい。
【0046】
テンソル計算ループの反復回数が計算ユニットの数の正確な倍数でない場合、コンパイラ136は、テンソル計算ループの2つ以上のループ限界値を求めてもよい。たとえば、コンパイラ136は、テンソル計算ループの反復回数を計算ユニットの数で除算してもよい。反復回数は正確な倍数ではないので、この除算の結果は、余りの値を含むことになる。たとえば、反復回数は160でもよく、計算ユニットの数は50でもよい。この例では、コンパイラ136は、反復回数(160)を計算ユニットの数(50)で除算して、3の商と10の余りを得てもよい。コンパイラ136は、計算ユニットの数(たとえば、50)に等しいテンソル計算ループの第1のループ限界値と、余り(たとえば、10)に等しいテンソル計算ループの代替ループ限界値とを設定できる。プログラムの実行中、代替ループ限界値を、外側ループの第1の反復のテンソル計算ループについて用いてもよく、第1のループ限界値を外側ループの各々の他の反復について用いてもよい。前の例を続けると、外側ループは、160/50=3で余りが10の4のループ限界値を有することがあり、外側ループのループ限界値は、余りに基づいて1だけインクリメントされる。外側ループの第1の3回の反復の場合、テンソル計算ループのループ限界値は50のことがある。そのため、外側ループの第1の3回の反復の各々について、テンソル計算ループの50回の反復が並列して行われ、結果として150回の反復が行われることになる。外側ループの最後の反復について、テンソル計算ループのループ限界値は10であり、テンソル計算ループの160回の反復全てが外側ループの4回の反復において行われることになる。
【0047】
コンパイルされたプログラムは、コントローラ105のプロセッサに、外側ループの最後から2番目の反復が終了した後で外側ループの最後の反復が行われる前に、テンソル計算ループのループ限界値を第1のループ限界値から代替ループ限界値に変更させる命令を含み得る。このように、テンソル計算ループの反復を複数の外側ループの反復に分割するために生成された外側ループの最後の反復についてのテンソル計算ループのループ限界値として、代替ループ限界値のループ限界値が用いられる。
【0048】
いくつかの実現例では、コンパイラ136は、テンソル計算ループがネストされている隣接した外側ループとして、すなわち、外側ループとテンソル計算ループとの間に他のループがネストされていない外側ループとして、テンソル計算ループの外側ループを生成可能である。いくつかの実現例では、コンパイラ136は、テンソル計算ループがネストされている、すなわち、外側ループが他のループ内にネストされていないネステッドループの最も外側のループとして、外側ループを生成可能である。ネステッドループの最も外側のループにおいて外側ループを生成することによって、ネストループおよびテンソルトラバーサルユニット120を用いて求められたメモリアドレスによって、テンソル要素がより隣接して整列する。たとえば、最後の反復のループ限界値を調整することなく、データが格納されないループの反復についてメモリアドレスが求められ、無駄なメモリ空間が生じることがある。ループの最後の反復についての代替の限界値によって、テンソルトラバーサルユニットは、付加的な命令を用いることなくテンソル要素のみのメモリアドレスを求めることができる。
【0049】
図2は、複数の計算ユニット210を用いてテンソル205のトラバースを行うためのネステッドループ215および220の例を示す図である。個々の計算ユニット210は、計算タイルまたは数値演算ユニットであり得る。この例では、テンソル205は、X次元、Y次元、およびZ次元を有する3次元テンソルである。テンソル205は縮尺通りに描かれていないが、X次元は160個の要素の長さを有し、Y次元は30個の要素の長さを有し、Z次元は100個の要素の長さを有する。テンソル105の各要素は、ニューラルネットワーク計算で使用されるそれぞれのデータ値を格納可能である。
【0050】
一般に、テンソルは、ネステッドループ215を用いてトラバース可能である。この例では、X次元は内側ループを用いてトラバースされ、Y次元は中央ループを用いてトラバースされ、Z次元は外側ループを用いてトラバースされる。内側ループの各反復について、メモリアドレスが、内側ループの反復に関してx、y、およびzの値に対応するテンソル要素について計算される。
【0051】
複数の計算ユニット210は、計算システムの一部であり得る、たとえば、各計算ユニット210は、図1の計算タイル112‐A~112‐Zまたは図1の数値演算ユニット124と同じまたは同様であり得る。この例では、計算システムは64個の計算ユニットを含むが、他の数の計算ユニットも可能である。計算ユニット210は、たとえばネステッドループ220を用いて、テンソル205についてテンソル計算を並列して行うことができる。
【0052】
コンパイラ、たとえば図1のコンパイラ136は、ネステッドループ215(または、ネステッドループ215を表すコード)を含むプログラムと、プログラムが実行される計算システムの計算ユニット210の数とに基づいて、ネステッドループ220を生成できる。たとえば、コンパイラは、テンソル計算ループ(この例ではX次元についてのループ)の反復を複数の外側ループの反復に分割するために、外側ループが生成されるべきであると判断してもよい。
【0053】
外側ループが生成されるべきかどうかを判断するために、コンパイラは、各テンソル計算ループの反復回数を、計算システムのハードウェアのプロパティと比較してもよい。たとえば、ハードウェアのプロパティは、計算ユニット210の数、または計算システムが並列して行うことができる計算の総数でもよい。テンソル計算ループのループの反復回数がハードウェアのプロパティの値を超える場合、コンパイラは外側ループを生成してもよい。この例では、X次元についてのループの反復回数(160)は、計算ユニットの数(64)を上回る。このため、コンパイラは、インデックス変数「i」を有する外側ループを生成している。
【0054】
コンパイラは、テンソル計算ループの反復回数とハードウェアのプロパティの値(たとえば、計算ユニットの数)とに基づいて、外側ループのループ限界値を求めることもできる。たとえば、コンパイラは、テンソル計算ループの反復回数(160)を計算ユニットの数(64)で除算することによって限界値を求めてもよく、その結果は2で余りが32である。上述したように、外側ループ限界値は、いずれの余りについても1だけインクリメントしてもよい。このため、この例における外側ループ限界値は3である。
【0055】
コンパイラは、テンソル計算ループの反復回数とハードウェアのプロパティの値とに基づいて、テンソル計算ループの1つ以上のループ限界値を求めることもできる。テンソル計算ループの反復回数がハードウェアのプロパティの値を超えない場合、テンソル計算ループのループ限界値は、反復回数に等しくなり得る。テンソル計算ループの反復回数がハードウェアのプロパティの正確な倍数である場合、テンソル計算ループのループ限界値は、ハードウェアのプロパティの値に等しくてもよい。テンソル計算ループの反復回数がハードウェアのプロパティの値を超えるがハードウェアのプロパティの値の正確な倍数ではない場合、テンソル計算ループは、ループの最後の反復以外の全てについての第1のループ限界値と、ループの最後の反復についての代替ループ限界値とを有してもよい。第1のループ限界値は、ハードウェアのプロパティの値に等しくてもよく、代替ループ限界値は、テンソル計算ループの反復回数をハードウェアのプロパティの値で除算した後の余りに等しくてもよい。
【0056】
この例では、テンソル計算ループの反復回数(160)は計算ユニットの数(64)を超えるが、計算ユニットの数の正確な倍数ではない。このため、X次元の第1のループ限界値は64であり、代替限界値は32である(160/64=2、余り32)。外側ループ(ループi)の最初の2つの反復について、X次元のループのループ限界値は64となる。外側ループの最後の反復について、X次元のループ限界値は32となる。
【0057】
外側ループの第1の反復回数について、テンソルの64個のメモリアドレスを、64個の計算ユニットを用いて並列して求めてもよい。たとえば、第1の計算ユニットは、z=0;y=0;x=0のメモリアドレスを求め、第2の計算ユニットは、z=0;y=0;x=0のメモリアドレスを求め、・・・第64の計算ユニットは、z=0;y=0;x=63のメモリアドレスを計算してもよい。外側ループの最後の反復について、64個の計算ユニットのうち32個の計算ユニットを用いて、内側ループの最後の32回の反復を求めてもよい。
【0058】
図3は、テンソル計算を行うためのプロセスの例300を示すフローチャートである。プロセス300は、1つ以上のコンピュータからなるシステム、たとえば、図1の計算システム102によって行われてもよい。
【0059】
第1のネステッドループの1つ以上の第1の反復の各々について、第1のネステッドループ内にネストされた第2のネステッドループの第1のループ限界値に達するまで、システムは、第2のネステッドループの反復を行う(302)。たとえば、第2のネステッドループは、テンソル計算(たとえば、メモリアドレス計算のドット積の計算)がプログラムの一部として行われるループでもよい。
【0060】
第1のループは、たとえば、第1および第2のネストループを含むプログラムをコンパイルしたコンパイラによって生成された外側ループでもよい。たとえば、コンパイラは、テンソル計算ループの識別、テンソル計算ループの外側ループの生成を行うかどうかの判断を行うことができ、そのような生成を行うと判断した場合、生成された外側ループおよび/またはテンソル計算ループの1つ以上のループ限界値を求めることができる。
【0061】
コンパイラは、第2のネステッドループの反復の総数(たとえば、第2のループに対応するテンソルの次元における要素の総数)とシステムの計算ユニットの数とに基づいて、第2のネステッドループの第1のループ限界値を求めることができる。たとえば、第2のループの反復の総数が計算ユニットの数よりも少ない場合、第1のループ限界値は、第2のネステッドループの反復の総数と等しくてもよい。第2のネステッドループの反復の総数が計算ユニットの数の正確な倍数である場合、第1のループ限界値は、反復回数に等しくてもよい。第2のネステッドループの反復の総数が計算ユニットの数よりも多いものの計算ユニットの正確な倍数でない場合、コンパイラは、第1のループ限界値を計算ユニットの数に設定してもよく、計算ユニットの数によって除算された第2のネステッドループの反復の総数の余りに等しい代替ループ限界値を求めてもよい。
【0062】
この例では、第2のネステッドループの反復の総数は計算ユニットの数よりも多く、かつ、第2のネステッドループの反復の総数は計算ユニットの数の正確な倍数ではないと仮定する。このため、この例では、第1のネステッドループの1つ以上の第1の反復回数についての第2のネステッドループの反復回数は、第2のネステッドループが計算ユニットのハードウェアのプロパティの値を超える反復の総数を有することに応じて、第1のループ限界値によって制限される。
【0063】
システムは、第2のネステッドループの反復を並列して行ってもよい。たとえば、上述した通り、第2のネステッドループの反復回数が計算ユニットの数を超えないように、第2のネステッドループの第1のループ限界値は求められてもよい。この例では、第1のネステッドループの1つ以上の第1の反復についての各々の第2のループの各反復は、並列して行うことができる。システムが第2のネステッドループの反復を計算ユニットに割当てると、システムは、第2のループのインデックス変数を反復することができる。インデックス変数が第1のループ限界値に等しくなると、第2のループは完了している。
【0064】
システムは、第1のループの最後から2番目(すなわち、最後から1つ手前)の反復が完了しているかどうかを判断する(304)。たとえば、システムは、第1のループのインデックス変数を第1のループのループ限界値と比較してもよい。ループ限界値とインデックス変数との間の相違が特定の値(たとえば、1)の場合、システムは、第1のループの最後から2番目の反復が完了していないと判断してもよい。たとえば、「i」のインデックス変数を有するループは、3つの反復を含んでもよい。この例では、ループは、「for (i=0;i<3)」または「for (i=1;i<4)」とプログラムされてもよい。
【0065】
第1の例では、ループ限界値は3であり、ループの最後の反復はi=2について行われ、ループの最後から2番目の反復はi=1について行われる。一般に、インデックス変数は、典型的にはループの反復が行われるときにまたはその直後にインクリメントされる。この例では、ループの反復が行われた後のインデックス変数が2である場合、行われた反復は、最後から2番目の反復である。このため、限界値(3)とインデックス変数との間の相違が1に等しい場合、ループの最後から2番目の反復は終了した反復である。
【0066】
同様に、第2の例では、ループ限界値は4であり、ループの最後の反復はi=3について行われ、ループの最後から2番目の反復はi=2について行われる。この例では、ループの反復が行われた後のインデックス変数が3の場合、行われた反復は最後から2番目の反復である。したがって、限界値(3)とインデックス変数との間の相違が1に等しい場合、ループの最後から2番目の反復は、終了した反復である。第1のループの最後から2番目の反復が終了していない場合、システムは動作302に戻って、更新されたインデックス変数値に対応する第1のネステッドループの次の反復について第2のネステッドループの反復を行う。
【0067】
第1のループの最後から2番目の反復が完了している場合、システムは、第2のループについて、第1のループ限界値の代わりに代替限界値を用いる(308)。たとえば、システムは、第1のネステッドループの最後の反復について、第2のネステッドループ限界値に代替限界値を使用してもよい。
【0068】
システムは、代替ループ限界値に達するまで、第1のネステッドループの反復について、第2のネステッドループの1つ以上の反復を行う(310)。たとえば、第2のネステッドループの複数の反復が残っている場合、システムは、複数の計算ユニットを用いて反復を並列して行ってもよい。
【0069】
主題の実施形態および本明細書に記載されている機能動作は、本明細書に開示されている構造およびそれらの構造的等価物を含むデジタル電子回路、有形に具体化されたコンピュータソフトウェアもしくはファームウェア、コンピュータハードウェア、またはそれらのうちの1つ以上の組合わせで実現することができる。本明細書に記載されている主題の実施形態は、1つ以上のコンピュータプログラムとして、すなわちデータ処理装置によって実行されるようにまたはデータ処理装置の動作を制御するように有形の非一時的なプログラムキャリアに符号化されるコンピュータプログラム命令の1つ以上のモジュールとして実現可能である。代替的にまたはさらに、プログラム命令は、人工的に発生させた伝搬信号、たとえば機械によって生成される電気信号、光信号または電磁信号に符号化することができ、この信号は、情報を符号化するように生成され、好適な受信機装置に送信され、データ処理装置によって実行される。コンピュータ記憶媒体は、機械可読記憶装置、機械可読記憶基板、ランダムもしくはシリアルアクセスメモリデバイス、またはそれらのうちの1つ以上の組合わせであってもよい。
【0070】
本明細書に記載されているプロセスおよび論理フローは、入力データ上で動作して出力を生成することによって機能を実行するように1つ以上のコンピュータプログラムを実行する1つ以上のプログラム可能なコンピュータによって実行することができる。これらのプロセスおよび論理フローは、特殊目的論理回路、たとえばFPGA(フィールドプログラマブルゲートアレイ)、ASIC(特定用途向け集積回路)、GPGPU(汎用グラフィックス処理ユニット)またはその他の処理ユニットによっても実行されてもよく、装置は、特殊目的論地回路、たとえばFPGA、AISC、またはGPGPUとして実現されてもよい。
【0071】
コンピュータプログラムの実行に適したコンピュータは、一例として、汎用マイクロプロセッサもしくは特殊目的マイクロプロセッサもしくはそれら両方、またはその他の種類の中央処理装置を含み、それらに基づくものであってもよい。一般に、中央処理装置は、リードオンリメモリまたはランダムアクセスメモリまたはそれら両方から命令およびデータを受信する。コンピュータの必須の要素は、命令を実施または実行するための中央処理装置、ならびに、命令およびデータを記憶するための1つ以上のメモリ装置である。一般に、コンピュータは、データを格納するための1つ以上の大容量記憶装置(たとえば磁気ディスク、光磁気ディスクもしくは光ディスク)も含み、または、1つ以上の大容量記憶装置からデータを受信するように、もしくは1つ以上の大容量記憶装置にデータを送信するように、もしくは1つ以上の大容量記憶装置に対してデータを送受信するように動作可能に結合される。しかしながら、コンピュータはこのような装置を有していなくてもよい。さらに、コンピュータは、別の装置、たとえばほんの数例を挙げると、携帯電話、パーソナルデジタルアシスタント(PDA)、携帯オーディオまたはビデオプレーヤ、ゲーム機、グローバルポジショニングシステム(GPS)受信機、または携帯型記憶装置(たとえば、ユニバーサルシリアルバス(USB)フラッシュドライブ)に組み込まれてもよい。
【0072】
コンピュータプログラム命令およびデータの格納に好適なコンピュータ可読媒体は、全ての形態の不揮発性メモリ、媒体およびメモリデバイスを含み、これらのデバイスは、一例として、半導体メモリデバイス(たとえば、EPROM、EEPROMおよびフラッシュメモリデバイス)、磁気ディスク(たとえば、内部ハードディスクまたはリムーバブルディスク)、磁気ディスク(たとえば、内部ハードディスクまたはリムーバブルディスク)、光磁気ディスク、ならびにCD ROMおよびDVD-ROMディスクを含む。プロセッサおよびメモリは、特殊目的論理回路によって補完されてもよく、または特殊目的論理回路に組み入れられてもよい。
【0073】
本明細書は、多くの具体的な実現例の詳細を含んでいるが、これらは、いずれの発明または請求の範囲を限定するものとして解釈されるべきではなく、特定の発明の特定の実施形態に特有の特徴を説明するものとして解釈されるべきである。別々の実施形態の文脈で本明細書に記載されている特定の特徴は、単一の実施形態において組み合わせて実現することも可能である。逆に、単一の実施形態の文脈で記載されているさまざまな特徴は、複数の実施形態において別々にまたは任意の好適な部分的な組み合わせで実現することも可能である。さらに、特徴は、特定の組合わせで動作するものとして上記され、最初にそのように記載されているかもしれないが、記載されている組み合わせの中の1つ以上の特徴は、場合によってはこの組合わせから除外されてもよく、記載されている組み合わせは、部分的な組み合わせまたは部分的な組み合わせの変形例を対象としてもよい。
【0074】
同様に、動作は、特定の順序で図面に示されているが、これは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序でこのような動作を実行しなければならないものとして理解されるべきではなく、示されている動作を全て実行しなければならないものとして理解されるべきでもない。特定の状況では、マルチタスクおよび並列処理が有利である場合もある。さらに、上記の実施形態におけるさまざまなシステムモジュールおよびコンポーネントの分離は、このような分離が全ての実施形態で必要であるものとして理解されるべきではなく、記載されているプログラムコンポーネントおよびシステムは、一般に、単一のソフトウェア製品に一体化されるかまたは複数のソフトウェア製品にパッケージングされてもよいということが理解されるべきである。
【0075】
主題の特定の実施形態について説明してきた。他の実施形態は、以下の特許請求の範囲の範囲内である。たとえば、特許請求の範囲に記載されている動作は、異なる順序で実行されても、依然として望ましい結果を達成することができる。一例として、添付の図面に示されているプロセスは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序を必ずしも必要としない。特定の実現例では、マルチタスクおよび並列処理が有利である場合もある。
図1
図2
図3