(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-02-08
(45)【発行日】2024-02-19
(54)【発明の名称】加算器を使用した多次元テンソルにおけるデータへのアクセス
(51)【国際特許分類】
G06F 17/16 20060101AFI20240209BHJP
【FI】
G06F17/16 A
【外国語出願】
(21)【出願番号】P 2022056584
(22)【出願日】2022-03-30
(62)【分割の表示】P 2019553901の分割
【原出願日】2018-02-26
【審査請求日】2022-04-27
(32)【優先日】2017-05-23
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2018-02-23
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】502208397
【氏名又は名称】グーグル エルエルシー
【氏名又は名称原語表記】Google LLC
【住所又は居所原語表記】1600 Amphitheatre Parkway 94043 Mountain View, CA U.S.A.
(74)【代理人】
【識別番号】110001195
【氏名又は名称】弁理士法人深見特許事務所
(72)【発明者】
【氏名】テマム,オリビエ
(72)【発明者】
【氏名】カイタン,ハーシット
(72)【発明者】
【氏名】ナラヤナスワミ,ラビ
(72)【発明者】
【氏名】ウ,ドン・ヒョク
【審査官】坂東 博司
(56)【参考文献】
【文献】米国特許出願公開第2004/0034754(US,A1)
【文献】米国特許出願公開第2004/0093479(US,A1)
【文献】米国特許出願公開第2010/0145992(US,A1)
【文献】米国特許出願公開第2017/0075691(US,A1)
【文献】国際公開第01/90888(WO,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/16
(57)【特許請求の範囲】
【請求項1】
N次元テンソルのデータ要素のメモリアドレスを求めるための装置であって、
前記N次元テンソルの各次元について、部分アドレスオフセット値
格納部を備え、前記部分アドレスオフセット値
格納部は、前記次元の部分アドレスオフセット値を格納するように構成され、各次元の前記部分アドレスオフセット値は、前記次元の初期値、前記次元のステップ値および前記次元における要素の個数に少なくとも基づき、各部分アドレスオフセット値
格納部は、ハードウェア記憶回路を備え、前記N次元テンソルは、前記N個の次元の各々にわたって配置された複数の要素を有し、Nは、2以上の整数であり、前記装置はさらに、
1つまたは複数のハードウェア加算器を備え、前記1つまたは複数のハードウェア加算器は、
前記N次元テンソルのデータ要素のシーケンスのデータ値を格納するためのメモリ内の場所のメモリアドレスを求めるように構成され、前記メモリアドレスを求めることは、各特定のデータ要素について、
前記N次元テンソルの各次元について、前記次元の前記部分アドレスオフセット値
格納部から前記次元の現在の部分アドレスオフセット値を受信することと、
前記現在の部分アドレスオフセット値の合計を前記特定のデータ要素のメモリアドレスとして求めることとを含み、前記特定のデータ要素の前記求められたメモリアドレスは、前記特定のデータ要素の前記求められたメモリアドレスに格納された前記特定のデータ要素の値とは異なっており、前記1つまたは複数のハードウェア加算器はさらに、
前記N次元テンソルの各特定のデータ要素の前記求められたメモリアドレスを示すデータを出力するように構成される、装置。
【請求項2】
1つまたは複数のハードウェアプロセッサをさらに備え、前記1つまたは複数のハードウェアプロセッサは、前記1つまたは複数のハードウェアプロセッサによって実行可能な命令セットの1つまたは複数の命令を実行するように構成され、前記1つまたは複数の命令の実行は、前記1つまたは複数のハードウェア加算器に動作を実行させ、前記動作は、前記1つまたは複数のハードウェア加算器に、前記N次元テンソルのデータ要素のシーケンスのデータ値を格納するためのメモリ内の場所の前記メモリアドレスを求めさせることを備える、請求項1に記載の装置。
【請求項3】
前記1つまたは複数の命令の実行は、前記1つまたは複数のハードウェア加算器に動作を実行させ、前記動作は、前記1つまたは複数のハードウェア加算器を使用して前記次元のうちの少なくとも1つの次元の前記ステップ値を前記少なくとも1つの次元の前記現在の部分アドレスオフセット値に加算することによって、前記少なくとも1つの次元の前記部分アドレスオフセット値を更新することを備える、請求項2に記載の装置。
【請求項4】
前記1つまたは複数の命令の実行は、前記1つまたは複数のハードウェア加算器に動作を実行させ、前記動作は、各次元について、前記ステップ値を前記次元の以前の部分アドレスオフセット値に加算することによって、前記次元のループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めることを備える、請求項2に記載の装置。
【請求項5】
各次元について、前記次元の限界値を格納する限界値
格納部をさらに備え、前記1つまたは複数のハードウェアプロセッサはさらに、
各次元について、前記次元の前記求められた部分アドレスオフセット値が前記次元の前記限界値に等しいか否かを判断するように構成され、
第1のループに対応する第1の次元の前記求められた部分アドレスオフセット値が前記第1の次元の前記限界値に等しいと判断したことに応答して、
前記第1の次元の前記部分アドレスオフセット値を前記第1の次元の前記初期値にリセットするように構成され、
前記第1のループがネストされる第2のループに対応する第2の次元について、前記1つまたは複数のハードウェア加算器を使用して、前記第2の次元の前記ステップ値と前記第2の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第2の次元の前記部分アドレスオフセット値を更新するように構成される、請求項4に記載の装置。
【請求項6】
各次元の前記ステップ値は、前記次元のうちの1つまたは複数の次元における要素の個数に基づく予め定められた値である、請求項1~5のいずれかに記載の装置。
【請求項7】
各次元について、
前記次元の前記初期値を格納する初期値
格納部と、
前記次元の前記ステップ値を格納するステップ値
格納部とをさらに備え、
各部分アドレスオフセット値
格納部、各初期値
格納部および各ステップ値
格納部は、ハードウェアレジスタを
含む、請求項1~6のいずれかに記載の装置。
【請求項8】
システムであって、
N次元テンソルに対して線形代数演算を実行するように構成された1つまたは複数の処理ユニットを備え、前記N次元テンソルは、前記N個の次元の各々にわたって配置された複数の要素を有し、Nは、2以上の整数であり、前記システムはさらに、
前記N個の次元の各次元について、部分アドレスオフセット値
格納部を備え、前記部分アドレスオフセット値
格納部は、前記次元の部分アドレスオフセット値を格納するように構成され、各次元の前記部分アドレスオフセット値は、前記次元の初期値、前記次元のステップ値および前記次元における要素の個数に少なくとも基づき、各部分アドレスオフセット値
格納部は、ハードウェア記憶回路を備え、前記システムはさらに、
1つまたは複数のハードウェア加算器を備え、前記1つまたは複数のハードウェア加算器は、
前記N次元テンソルのデータ要素のシーケンスのデータ値を格納するためのメモリ内の場所のメモリアドレスを求めるように構成され、前記メモリアドレスを求めることは、各特定のデータ要素について、
前記N次元テンソルの各次元について、前記次元の前記部分アドレスオフセット値
格納部から前記次元の現在の部分アドレスオフセット値を受信することと、
前記現在の部分アドレスオフセット値の合計を前記特定のデータ要素のメモリアドレスとして求めることとを含み、前記特定のデータ要素の前記求められたメモリアドレスは、前記特定のデータ要素の前記求められたメモリアドレスに格納された前記特定のデータ要素の値とは異なっており、前記1つまたは複数のハードウェア加算器はさらに、
前記N次元テンソルの各特定のデータ要素の前記求められたメモリアドレスを示すデータを出力するように構成される、システム。
【請求項9】
1つまたは複数のハードウェアプロセッサをさらに備え、前記1つまたは複数のハードウェアプロセッサは、前記1つまたは複数のハードウェアプロセッサによって実行可能な命令セットの1つまたは複数の命令を実行するように構成され、前記1つまたは複数の命令の実行は、前記1つまたは複数のハードウェア加算器に動作を実行させ、前記動作は、前記1つまたは複数のハードウェア加算器に、前記N次元テンソルのデータ要素のシーケンスのデータ値を格納するためのメモリ内の場所の前記メモリアドレスを求めさせることを備える、請求項8に記載のシステム。
【請求項10】
前記1つまたは複数の命令の実行は、前記1つまたは複数のハードウェア加算器に動作を実行させ、前記動作は、前記1つまたは複数のハードウェア加算器を使用して前記次元のうちの少なくとも1つの次元の前記ステップ値を前記少なくとも1つの次元の前記現在の部分アドレスオフセット値に加算することによって、前記少なくとも1つの次元の前記部分アドレスオフセット値を更新することを備える、請求項9に記載のシステム。
【請求項11】
前記1つまたは複数の命令の実行は、前記1つまたは複数のハードウェア加算器に動作を実行させ、前記動作は、各次元について、前記ステップ値を前記次元の以前の部分アドレスオフセット値に加算することによって、前記次元のループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めることを備える、請求項9に記載のシステム。
【請求項12】
各次元について、前記次元の限界値を格納する限界値
格納部をさらに備え、前記1つまたは複数のハードウェアプロセッサはさらに、
各次元について、前記次元の前記求められた部分アドレスオフセット値が前記次元の前記限界値に等しいか否かを判断するように構成され、
第1のループに対応する第1の次元の前記求められた部分アドレスオフセット値が前記第1の次元の前記限界値に等しいと判断したことに応答して、
前記第1の次元の前記部分アドレスオフセット値を前記第1の次元の前記初期値にリセットするように構成され、
前記第1のループがネストされる第2のループに対応する第2の次元について、前記1つまたは複数のハードウェア加算器を使用して、前記第2の次元の前記ステップ値と前記第2の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第2の次元の前記部分アドレスオフセット値を更新するように構成される、請求項11に記載のシステム。
【請求項13】
各次元の前記ステップ値は、前記次元のうちの1つまたは複数の次元における要素の個数に基づく予め定められた値である、請求項8~12のいずれかに記載のシステム。
【請求項14】
各次元について、
前記次元の前記初期値を格納する初期値
格納部と、
前記次元の前記ステップ値を格納するステップ値
格納部とをさらに備え、
各部分アドレスオフセット値
格納部、各初期値
格納部および各ステップ値
格納部は、ハードウェアレジスタを備える、請求項8~13のいずれかに記載のシステム。
【請求項15】
N次元テンソルのデータ要素のメモリアドレスを求めるためのコンピュータによって実行される方法であって、
1つまたは複数のハードウェア加算器を含むハードウェア回路が、前記N次元テンソルのデータ要素のシーケンスのデータ値を格納するためのメモリ内の場所のメモリアドレスを求めるステップを備え、前記メモリアドレスを求めるステップは、各特定のデータ要素について、
前記1つまたは複数のハードウェア加算器が、前記N次元テンソルの各次元について、前記次元の部分アドレスオフセット値
格納部から前記次元の現在の部分アドレスオフセット値を受信するステップを含み、
各次元の前記部分アドレスオフセット値は、前記次元の初期値、前記次元のステップ値および前記次元における要素の個数に少なくとも基づき、
各部分アドレスオフセット値
格納部は、ハードウェア記憶回路を
含み、
前記N次元テンソルは、前記N個の次元の各々にわたって配置された複数の要素を有し、
Nは、2以上の整数であり、前記メモリアドレスを求めるステップはさらに、各特定のデータ要素について、
前記現在の部分アドレスオフセット値の合計を前記特定のデータ要素のメモリアドレスとして求めるステップを含み、前記特定のデータ要素の前記求められたメモリアドレスは、前記特定のデータ要素の前記求められたメモリアドレスに格納された前記特定のデータ要素の値とは異なっており、前記方法はさらに、
前記ハードウェア回路が、前記N次元テンソルの各特定のデータ要素の前記求められたメモリアドレスを示すデータを出力するステップを備える、方法。
【請求項16】
前記1つまたは複数のハードウェア加算器を使用して前記次元のうちの少なくとも1つの次元の前記ステップ値を前記少なくとも1つの次元の前記現在の部分アドレスオフセット値に加算することによって、前記少なくとも1つの次元の前記部分アドレスオフセット値を更新するステップをさらに備える、請求項15に記載の方法。
【請求項17】
各次元について、前記ステップ値を前記次元の以前の部分アドレスオフセット値に加算することによって、前記次元のループの各繰り返し後に前記次元の前記部分アドレスオフセット値を求めるステップをさらに備える、請求項15に記載の方法。
【請求項18】
各次元について、前記次元の前記求められた部分アドレスオフセット値が前記次元の限界値に等しいか否かを判断するステップと、
第1のループに対応する第1の次元の前記求められた部分アドレスオフセット値が前記第1の次元の前記限界値に等しいと判断したことに応答して、
前記第1の次元の前記部分アドレスオフセット値を前記第1の次元の前記初期値にリセットするステップと、
前記第1のループがネストされる第2のループに対応する第2の次元について、前記1つまたは複数のハードウェア加算器を使用して、前記第2の次元の前記ステップ値と前記第2の次元の前記部分アドレスオフセット値との合計に等しくなるように前記第2の次元の前記部分アドレスオフセット値を更新するステップとをさらに備える、請求項17に記載の方法。
【請求項19】
各次元の前記ステップ値は、前記次元のうちの1つまたは複数の次元における要素の個数に基づく予め定められた値である、請求項15~18のいずれかに記載の方法。
【請求項20】
各次元の前記初期値は、前記次元の初期値
格納部に格納され、
前記次元の前記ステップ値は、前記次元のステップ値
格納部に格納され、
各部分アドレスオフセット値
格納部、各初期値
格納部および各ステップ値
格納部は、ハードウェアレジスタを
含む、請求項15~19のいずれかに記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
背景
本明細書は、一般に、ハードウェア加算器を有する特殊目的計算ユニットを使用して機械学習計算を実行することに関する。
【発明の概要】
【0002】
ニューラルネットワークは、モデルの1つ以上のレイヤを利用して、受信した入力に対する出力、たとえば分類、を生成する機械学習モデルである。ニューラルネットワークの中には、出力レイヤに加えて1つ以上の隠れレイヤを含んでいるものもある。各隠れレイヤの出力は、ネットワーク内の次のレイヤ、すなわちネットワークの次の隠れレイヤまたは出力レイヤ、への入力として使用される。ネットワークの各レイヤは、それぞれのパラメータセットの現在の値に従って、受信した入力から出力を生成する。
【0003】
ニューラルネットワークの中には、1つ以上の畳み込みニューラルネットワークレイヤを含んでいるものもある。各畳み込みニューラルネットワークレイヤは、関連付けられたカーネルセットを有する。カーネルは、重み入力のマトリクス構造として表すことができる。各畳み込みレイヤは、カーネルを使用してレイヤへの入力を処理する。レイヤへの入力セットも、マトリクス構造として表すことができる。
【0004】
概要
本明細書には、テンソル要素のメモリアドレスを求めるために1つ以上のハードウェア加算器を使用してN次元テンソルにアクセスすることに関連する技術が記載されている。
【0005】
概して、本明細書に記載されている主題の1つの革新的局面は、N次元テンソルにアクセスするための装置で具体化することができる。上記装置は、上記N次元テンソルの各次元について、部分アドレスオフセット値要素を含んでもよく、上記部分アドレスオフセット値要素は、上記次元の初期値、上記次元のステップ値および上記次元のループの繰り返し回数に少なくとも基づいて上記次元の部分アドレスオフセット値を格納する。また、上記装置は、1つ以上のハードウェア加算器と、1つ以上のプロセッサとを含んでもよい。上記1つ以上のプロセッサは、上記N次元テンソルの特定の要素にアクセスするための命令を取得するように構成されてもよい。上記N次元テンソルは、上記N個の次元の各々にわたって配置された複数の要素を有してもよい。Nは、1以上の整数であってもよい。上記プロセッサは、上記部分アドレスオフセット値要素および上記1つ以上のハードウェア加算器のうちの1つ以上を使用して、上記特定の要素のアドレスを求め、上記N次元テンソルの上記特定の要素にアクセスするための上記求められたアドレスを示すデータを出力してもよい。
【0006】
これらのおよび他の実現例の各々は、任意に、以下の特徴のうちの1つ以上を含んでもよい。いくつかの局面では、上記装置は、各次元について、上記次元の上記初期値を格納する初期値要素と、上記次元の上記ステップ値を格納するステップ値要素とを含んでもよい。各部分アドレスオフセット値要素、各初期値要素および各ステップ値要素は、レジスタを含んでもよい。
【0007】
いくつかの局面では、上記特定の要素の上記アドレスを求めることは、上記1つ以上のハードウェア加算器を使用して各次元について上記部分アドレスオフセット値の合計を求めることを含んでもよい。上記1つ以上のプロセッサは、各次元について、上記ステップ値を上記次元の以前のアドレスオフセット値に加算することによって、上記次元のネステ
ッドループの各繰り返し後に上記次元の上記部分アドレスオフセット値を求めるように構成されてもよい。
【0008】
上記装置は、各次元について、上記次元の限界値を格納する限界値要素を含んでもよい。上記1つ以上のプロセッサは、各次元について、次元の上記求められた部分アドレスオフセット値が上記次元の上記限界値に等しいか否かを判断してもよい。第1のネステッドループに対応する第1の次元の上記求められた部分アドレスオフセット値が上記第1の次元の上記限界値に等しいと判断したことに応答して、上記1つ以上のプロセッサは、上記第1の次元の上記部分アドレスオフセット値を上記第1の次元の上記初期値にリセットし、上記第1のネステッドループがネストされる第2のネステッドループに対応する第2の次元について、上記1つ以上のハードウェア加算器を使用して、上記第2の次元の上記ステップ値と上記第2の次元の上記部分アドレスオフセット値との合計に等しくなるように上記第2の次元の上記部分アドレスオフセット値を更新してもよい。いくつかの局面では、各次元の上記ステップ値は、1つ以上の上記次元における要素の個数に基づく予め定められた値である。
【0009】
本明細書に記載されている主題は、以下の利点のうちの1つ以上を実現するように特定の実施形態において実現することができる。レジスタを使用してメモリアドレス値を追跡することによって、プログラムは、1つの命令で、深くネストされたループを繰り返すことができるようになる。メモリアドレス値は、レジスタに格納された値に基づいて単純な加算を適用することによって速やかに求めることができる。特殊目的計算ユニットは、アドレスを計算する加算器を含み得る。算術論理演算ユニット(ALU)、乗算器または他の複雑な回路ではなく加算器を使用することによって、回路のサイズおよび回路の製造コストを下げることができる。ハードウェア加算器を使用してメモリアドレス値を求めることによって、プロセッサにおける計算サイクル数を減らすことができ、他の計算タスクのためのプロセッサ帯域幅が増加する。命令数を減らした状態でテンソルをトラバースすることができる。二次元レジスタアーキテクチャは、同時に追跡される異なる次元を各々が有する多次元テンソルを可能にする。
【0010】
これおよび他の局面の他の実現例は、コンピュータ記憶装置上に符号化された方法のアクションを実行するように構成された対応するシステム、方法およびコンピュータプログラムを含む。1つ以上のコンピュータからなるシステムは、動作時にシステムにアクションを実行させる、システムにインストールされたソフトウェア、ファームウェア、ハードウェアまたはそれらの組み合わせによってそのように構成することができる。1つ以上のコンピュータプログラムは、データ処理装置によって実行されたときに装置にアクションを実行させる命令を有することによってそのように構成することができる。
【0011】
本明細書に記載されている主題の1つ以上の実現例の詳細については、添付の図面および以下の説明に記載されている。主題の他の考えられる特徴、局面および利点は、明細書、図面および特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【0012】
【
図2A】テンソルトラバーサルユニットの一例を示す図である。
【
図2B】テンソルトラバーサルユニットの一例を示す図である。
【
図2C】テンソルトラバーサルユニットの一例を示す図である。
【
図2D】テンソルトラバーサルユニットの一例を示す図である。
【
図2E】テンソルトラバーサルユニットの一例を示す図である。
【
図2F】テンソルトラバーサルユニットの一例を示す図である。
【
図2G】テンソルトラバーサルユニットの一例を示す図である。
【
図2H】テンソルトラバーサルユニットの一例を示す図である。
【
図3】多次元テンソル変数のアドレスを求めるためのプロセスの一例を示すフロー図である。
【発明を実施するための形態】
【0013】
さまざまな図面中の同様の参照番号および名称は、同様の要素を示す。
詳細な説明
一般に、ソフトウェアアルゴリズムがN次元テンソルを処理する際にネステッドループが使用されてもよい。各ループは、N次元テンソルのそれぞれの次元をトラバースすることに関与し得る。多次元テンソルは、マトリクスまたは多次元マトリクスであってもよい。たとえば、二次元テンソルは、マトリクスであり、三次元テンソルは、複数の二次元マトリクスで構成される三次元マトリクスである。N次元テンソルの各次元は、1つ以上の要素を含んでもよく、各要素は、それぞれのデータ値を格納してもよい。たとえば、テンソルは、プログラムにおける変数であってもよく、この変数は、3つの次元を有してもよい。第1の次元は、300個の要素の長さを有してもよく、第2の次元は、1000個の要素の長さを有してもよく、第3の次元は、20個の要素の長さを有してもよい。当然のことながら、各次元において他の個数の要素も可能である。
【0014】
ネステッドループにおいてテンソルをトラバースすることは、要素のメモリアドレス値を計算して、この要素の対応するデータ値をロードまたは格納することを含み得る。forループは、3つのループインデックス変数(たとえば、i、jおよびk)によって追跡される3つのループを、三次元テンソルをトラバースするようにネストすることができるネステッドループの一例である。ニューラルネットワークでは、テンソルに関連付けられた1つ以上のドット積計算に要素の値が使用されてもよい。たとえば、要素の値は、対応するパラメータまたは重みを乗算されてもよい。要素にアクセスして要素の値を用いて1つ以上の計算を実行するために、テンソルの要素は、ネステッドforループを使用して順番にトラバースされてもよい。引き続き三次元テンソルの例を参照して、外側forループを使用して、変数iによって追跡されるループをトラバースしてもよく、中間forループループを使用して、変数jによって追跡されるループをトラバースしてもよく、内側forループを使用して、変数kによって追跡されるループをトラバースしてもよい。この例では、アクセスされる第1の要素は(i=0,j=0,k=0)であってもよく、第2の要素は(i=0,j=0,k=1)であってもよい、などである。以下で説明するように、テンソルトラバーサルユニットを使用する目的は、ネステッドループを使用して順番に各要素のメモリアドレスを求めることによって、処理ユニットが要素の値にアクセスして、この要素の値を使用して1つ以上の計算を実行することができるようにすることである。重みまたはパラメータの値にも、ネステッドforループを使用して同様にアクセスすることができる。また、テンソルトラバーサルユニットは、計算に使用される重みもしくはパラメータのアドレス、および/または、計算の出力のアドレスを求める目的でも使用することができ、計算の出力は、ニューラルネットワークの隠れレイヤへの入力として使用されてもよい。
【0015】
場合によっては、プロセッサは、外側ループインデックス変数を用いて内側ループのループ境界を設定するなど、ループ境界条件を実行する必要があるかもしれない。たとえば、ネステッドループの最も内側のループを出るか否かを判断する際に、プログラムは、最も内側のループのループインデックス変数の現在の値とネステッドループの最も外側のループのループインデックス変数の現在の値とを比較してもよい。
【0016】
これらのタスクは、分岐命令および整数演算命令などの相当数の命令を必要とする可能性がある。各ループ境界が小さく、ループの数が多い場合には、計算が全実行時間のうちのかなりの部分を占めて、全体的性能を非常に劣化させるおそれがある。プロセッサのた
めのハードウェアテンソルトラバーサルユニットは、テンソルをトラバースする際にプロセッサが処理しなければならない次元の個数を減少させることによってプロセッサの計算帯域幅を増加させることができる。
【0017】
図1は、テンソルをトラバースするためのコンピューティングシステムの一例100のブロック図を示す。一般に、コンピューティングシステム100は、入力104を処理して出力116を生成する。コンピューティングシステム100は、線形代数計算を実行するように構成されてもよい。入力104は、コンピューティングシステム100が処理することができる任意の好適なデータであってもよい。コンピューティングシステム100は、処理ユニット102と、記憶媒体104と、テンソルトラバーサルユニット106とを含む。
【0018】
一般に、処理ユニット102が、テンソルの特定の要素にアクセスするための命令を実行すると、テンソルトラバーサルユニット106は、このテンソルの特定の要素のアドレスを求め、それにより、処理ユニット102が記憶媒体104にアクセスして特定の要素の値を表すデータ114を読み出すことができる。たとえば、プログラムは、ネステッドループを含んでもよく、処理ユニット102は、ネステッドループに関連付けられた現在のインデックス変数値に従って、ネステッドループ内の二次元配列変数の要素にアクセスするための命令を実行してもよい。ネステッドループに関連付けられた現在のインデックス変数値に基づいて、テンソルトラバーサルユニット106は、二次元配列変数の第1の要素のメモリアドレスからのオフセットを表すアドレスオフセット値を求めてもよい。次いで、処理ユニット102は、このアドレスオフセット値を使用して、記憶媒体から二次元配列変数の特定の要素にアクセスしてもよい。
【0019】
処理ユニット102は、記憶媒体104に格納された命令112または別の記憶装置に格納された他の命令を含む、コンピューティングシステム100内で実行される命令を処理するように構成される。処理ユニット102は、1つ以上のプロセッサを含んでもよい。記憶媒体104は、コンピューティングシステム100内の情報を格納する。いくつかの実現例では、記憶媒体104は、1つまたは複数の揮発性メモリユニットである。いくつかの他の実現例では、記憶媒体104は、1つまたは複数の不揮発性メモリユニットである。また、記憶媒体104は、フロッピー(登録商標)ディスクデバイス、ハードディスクデバイス、光ディスクデバイスもしくはテープデバイス、フラッシュメモリもしくは他の同様のソリッドステートメモリデバイス、または一連のデバイス(ストレージエリアネットワークもしくは他の構成のデバイスを含む)などの、別の形態のコンピュータ読取可能媒体であってもよい。命令は、処理ユニット102によって実行されると、処理ユニット102に1つ以上のタスクを実行させる。
【0020】
テンソルトラバーサルユニット106は、特定用途向け集積回路として実現されてもよい。テンソルトラバーサルユニット106は、1つ以上のテンソルに関連付けられた状態を判断するように構成されてもよい。この状態は、ループ境界値、現在のループインデックス変数値、メモリアドレス値を求めるための部分アドレスオフセット値、および/または、分岐ループ境界を処理するためのプログラムカウンタ値を含んでもよい。
【0021】
テンソルトラバーサルユニット106は、テンソルインデックスをメモリアドレスに変換する。たとえば、テンソルトラバーサルユニット106は、一組のN次元テンソルインデックスを一次元アドレス空間に変換してもよい。テンソルトラバーサルユニットは、テンソル要素のメモリアドレスを要素の次元インデックスの組み合わせ(たとえば、線形組み合わせ)にすることによってこのような変換を実行することができる。
【0022】
テンソルトラバーサルユニット106は、テンソル要素のシーケンスを参照するアドレ
スのシーケンスを効率的にプログラムに従って生成することができる。このアドレスのシーケンスは、ソフトウェアトラバーサルルーチンにおけるループネストによってアクセスされるであろうテンソル要素のシーケンスに対応する。トラバーサル中にアクセスされる要素のシーケンスは、メモリ内で物理的に連続している場合もあれば、そうでない場合もある。
図2B~
図2Hに示され、以下で説明する例は、要素のシーケンスがどのようにしてメモリ内で物理的に連続していないかの一例を示す。
【0023】
テンソルトラバーサルユニット106は、テンソルアドレス値要素122と、ハードウェア加算器ユニット124とを含む。テンソルアドレス値要素122の各々は、記憶要素、たとえばレジスタまたはその他の好適な記憶回路であってもよい。いくつかの実現例では、
図2A~
図2Hを参照して以下でより詳細に説明するように、テンソルアドレス値要素122は、異なるグループに物理的または論理的に分類されてもよい。いくつかの実現例では、テンソルアドレス値要素122のグループは、多次元配列に物理的または論理的に配置されてもよい。たとえば、テンソルアドレス値要素122の各グループは、二次元配列に物理的または論理的に配置されてもよい。
【0024】
ハードウェア加算器ユニット124は、1つ以上のハードウェア加算器を含み得る。各加算器は、加算演算を実行するように構成されたデジタル回路を含んでもよい。たとえば、以下で説明するように、1つ以上の加算器は、部分アドレスオフセット値を加算して、テンソルの要素の合計アドレスオフセット値を求めてもよい。ハードウェア加算器は、算術論理演算ユニット(ALU)およびハードウェア乗算器よりも必要な回路部品が少ないので、ハードウェア加算器ユニット124の回路のサイズ(したがって、テンソルトラバーサルユニット106のサイズ)は、ALUおよび/または乗算器を含むテンソルトラバーサルユニットよりも小さくすることができる。また、ハードウェア加算器を有するテンソルトラバーサルユニットの製造コストは、ALUおよび/または乗算器を有するテンソルトラバーサルユニットの製造コストよりも少ないであろう。いくつかの実現例では、ハードウェア加算器ユニット124は、加算器のみを含み、他の数学回路または論理回路は含まない。
【0025】
図2Aは、テンソルトラバーサルユニットの一組のテンソルアドレス値要素200の一例を示す。テンソルアドレス値要素200は、テンソルトラバーサルユニット106のテンソルアドレス値要素122に対応してもよい。テンソルトラバーサルユニット200は、一群の初期値要素202と、一群のステップ値要素204と、一群の終了値要素206と、一群の部分アドレスオフセット値要素208とを含む。
【0026】
初期値要素202は、M個の行とN個の列とを有する2D配列として物理的または論理的に配置されてもよく、MおよびNは、1以上の整数である。初期値要素202は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセットの初期値を格納してもよい。いくつかの実現例では、初期値要素202の各行は、テンソルの初期値を表してもよい。たとえば、プログラムが2つの配列変数V1およびV2を定義する場合、テンソルトラバーサルユニットは、行202aおよび202bを割り当てて、配列変数V1およびV2の初期値をそれぞれ格納してもよい。いくつかの実現例では、初期値要素202の各列は、テンソルに関連付けられたネステッドループインデックス変数値の初期値を表してもよい。たとえば、プログラムが、変数V1にアクセスするための3つのループを有するネステッドループを定義し、このネステッドループの各ループが、ネステッドループインデックス変数i,jおよびkによって索引付けされる場合、テンソルトラバーサルユニットは、初期値要素V
1,1、V
1,2およびV
1,3を割り当てて、ネステッドループインデックス変数i,jおよびkの初期値をそれぞれ格納してもよい。初期値要素202については、
図2B~
図2Hを参照して以下でより詳細に説明する。
【0027】
ステップ値要素204は、初期値要素202と同一の次元を有する2D配列として物理的または論理的に配置されてもよく、ステップ値要素204の各要素は、初期値要素202の中に対応する要素を有する。ステップ値要素204は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセットのステップ値を格納してもよい。いくつかの実現例では、ステップ値要素204の各行は、テンソルのステップ値を表してもよい。たとえば、プログラムが2つの配列変数V1およびV2を定義する場合、テンソルトラバーサルユニットは、行204aおよび204bを割り当てて、配列変数V1およびV2のステップ値をそれぞれ格納してもよい。いくつかの実現例では、ステップ値要素204の各列は、テンソルに関連付けられたネステッドループインデックス変数値のステップ値を表してもよい。たとえば、プログラムが、変数V1にアクセスするための3つのループを有するネステッドループを定義し、このネステッドループの各ループが、ネステッドループインデックス変数i,jおよびkによって索引付けされる場合、テンソルトラバーサルユニットは、ステップ値要素X
1,1、X
1,2およびX
1,3を割り当てて、ネステッドループインデックス変数i,jおよびkのステップ値をそれぞれ格納してもよい。ステップ値要素204については、
図2B~
図2Hを参照して以下でより詳細に説明する。
【0028】
終了値要素206は、初期値要素202と同一の次元を有する2D配列として物理的または論理的に配置されてもよく、終了値要素206の各要素は、初期値要素202の中に対応する要素を有する。終了値要素206は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセットの終了値を格納してもよい。いくつかの実現例では、終了値要素206の各行は、テンソルの終了値を表してもよい。たとえば、プログラムが2つの配列変数V1およびV2を定義する場合、テンソルトラバーサルユニットは、行206aおよび206bを割り当てて、配列変数V1およびV2の終了値をそれぞれ格納してもよい。いくつかの実現例では、終了値要素206の各列は、テンソルに関連付けられたネステッドループインデックス変数値の終了値を表してもよい。たとえば、プログラムが、変数V1にアクセスするための3つのループを有するネステッドループを定義し、このネステッドループの各ループが、ネステッドループインデックス変数i,jおよびkによって索引付けされる場合、テンソルトラバーサルユニットは、終了値要素Y
1,1、Y
1,2およびY
1,3を割り当てて、ネステッドループインデックス変数i,jおよびkの終了値をそれぞれ格納してもよい。終了値要素206については、
図2B~
図2Hを参照して以下でより詳細に説明する。
【0029】
部分アドレスオフセット値要素208は、初期値要素202と同一の次元を有する2D配列として物理的または論理的に配置されてもよく、部分アドレスオフセット値要素208の各要素は、初期値要素202の中に対応する要素を有する。部分アドレスオフセット値要素206は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセット値を格納してもよい。いくつかの実現例では、部分アドレスオフセット値要素208の各行は、テンソルの部分アドレスオフセット値を表してもよい。たとえば、プログラムが2つの配列変数V1およびV2を定義する場合、テンソルトラバーサルユニットは、行208aおよび208bを割り当てて、配列変数V1およびV2の部分アドレスオフセット値をそれぞれ格納してもよい。いくつかの実現例では、部分アドレスオフセット値要素208の各列は、テンソルに関連付けられたネステッドループインデックス変数値の部分アドレスオフセット値を表してもよい。たとえば、プログラムが、変数V1にアクセスするための3つのループを有するネステッドループを定義し、このネステッドループの各ループが、ネステッドループインデックス変数i,jおよびkによって索引付けされる場合、テンソルトラバーサルユニットは、部分アドレスオフセット値要素Z
1,1、Z
1,2およびZ
1,3を割り当てて、ネステッドループインデックス変数i,jおよびkの部分アドレスオフセット値をそれぞれ格納してもよい。部分アドレスオフセット値要素208については、
図2B~
図2Hを参照して以下でより詳細に説明する。
【0030】
図2B~
図2Hは、テンソルアドレス値要素200がどのようにしてテンソルトラバーサルユニットによって使用されてテンソルを処理し得るかの一例を示し、テンソルのテンソル要素のメモリアドレス値を求めることを含む。
図2Bを参照して、プログラム212は、記憶媒体104または別の記憶媒体に格納されてもよく、処理ユニット102によって実行可能である。プログラム212は、第1の次元が3であり、第2の次元が2であり、第3の次元が2である文字配列変数V1を指定する。プログラム212は、変数V1をトラバースするためのネステッドforループを指定し、このforループは、ネステッドループインデックス変数iによって追跡される外側ループにおいてV1の第1の次元をトラバースし、ネステッドループインデックス変数jによって追跡される中間ループにおいてV1の第2の次元をトラバースし、ネステッドループインデックス変数kによって追跡される内側ループにおいてV1の第3の次元をトラバースする。本明細書に記載されている
図2B~
図2Hの示されている例は、3つの次元を含んでいるが、異なる個数の次元(たとえば、2つ、5つ、8つ、または他の個数の次元)を有するテンソルのメモリアドレス値を同様の態様で求めることができる。たとえば、8つの次元を有するテンソルがトラバースされてもよく、テンソル要素のメモリアドレスは、8重のループネストを使用して求めることができる。
【0031】
いくつかの実現例では、テンソルアドレス値要素200は、プログラムの開始時に初期化されてもよい。たとえば、プロセッサは、テンソルアドレス値要素200を初期化する命令「InitializeElements」を実行してもよい。この命令は、プロセッサによって実行可能な命令セットのハードウェア命令であってもよい。いくつかの実現例では、初期化後、テンソルアドレス値要素200の各要素は、予め定められた値に設定される。いくつかの実現例では、プロセッサは、たとえば初期値要素202のためにある命令を実行し、ステップ値要素のためにある命令を実行するなど、テンソルアドレス値要素の各グループについて別々の命令を実行してもよい。各々の別々の命令は、そのグループの各要素を当該要素のための予め定められた値に設定してもよい。
【0032】
この例では、各初期値要素202は、ゼロという値に設定される。次元の初期値は、この次元をトラバースするforループの1回目の繰り返しの間、この次元の部分アドレスオフセット値が設定される値である。したがって、この例では、各次元の部分アドレスオフセット値は、この次元のforループの1回目の繰り返しの間はゼロという値に設定されることになる。
【0033】
ステップ値要素は、テンソル要素のメモリアドレスを求めるために使用される部分アドレスオフセットのステップ値を格納してもよい。次元のステップ値は、この次元をトラバースするforループの各繰り返しの後にこの次元の部分アドレスオフセット値に加算される値である。この例では、内側ネステッドループインデックス変数kは、1というステップ値を有し、中間ネステッドループインデックス変数jは、6というステップ値を有し、外側ネステッドループインデックス変数iは、2というステップ値を有する。
【0034】
いくつかの実現例では、プロセッサ、ユーザ、またはテンソルをトラバースするためのプログラムをコンパイルするコンパイラは、テンソルの1つ以上の次元における要素の個数に基づいて各次元のステップ値および/または終了値を求める。一例では、各次元のステップ値および/または終了値は、テンソルのメモリレイアウトによって決まる。二次元テンソルの場合、メモリレイアウトは、たとえば行優先または列優先の順序に従ってもよい。このように、各テンソル要素について計算されるメモリアドレスは、各々の他のテンソル要素のメモリアドレスとは異なっている。いくつかの実現例では、メモリアドレスは、トラバーサル中にアクセスされる要素のシーケンスがメモリ内で物理的に連続しているように求められる。この例では、第1のテンソル要素は、第1のアドレスを有する第1の
メモリ場所に格納されてもよく、第2のテンソル要素は、第1のメモリ場所のすぐ隣に位置する第2のメモリ場所に格納されてもよく、第3のテンソル要素は、第2のメモリ場所のすぐ隣に位置する第3のメモリ場所に格納されてもよい、などである。いくつかの実現例では、メモリアドレスは、トラバーサル中にアクセスされる要素のシーケンスがメモリ内で物理的に連続していないように求められる。この例では、第2のテンソル要素は、第1のテンソル要素のすぐ隣に格納されなくてもよい。
【0035】
終了値要素は、次元の終了値を格納してもよい。次元の終了値は、部分アドレスオフセット値がこの次元の初期値にリセットされる値を表す。また、第1のループの部分アドレスオフセット値が第1のループの終了値に等しい場合には、第1のループがネストされる第2のループのステップ値が第2のループの部分アドレスオフセット値に加算される。この例では、内側ネステッドループインデックス変数iは、2という終了値を有し、中間ネステッドループインデックス変数iは、12というステップ値を有し、外側ネステッドループインデックス変数kは、6という終了値を有する。したがって、内側ネステッドループインデックス変数iの部分アドレスオフセット値が2という値に達すると、プロセッサは、内側ネステッドループインデックス変数iの部分アドレスオフセット値をゼロにリセットして、中間ネステッドループインデックス変数jのステップ値(6)を中間ネステッドループインデックス変数jの部分アドレスオフセット値に加算してもよい。これが中間ネステッドループインデックス変数jによって追跡されるループの1回目の繰り返しであれば、中間ネステッドループインデックス変数jの部分アドレスオフセット値は、6(0+6)になるであろう。
【0036】
部分アドレスオフセット値要素208は、次元の部分アドレスオフセット値を格納する。この例では、プロセッサは、部分アドレスオフセット値をゼロに設定する。部分アドレスオフセット値は、テンソル要素のメモリアドレスオフセットを求めるために使用される。いくつかの実現例では、特定の変数についての特定のテンソル要素のメモリアドレスは、式225に示されるように、テンソル要素の予め指定されたベースアドレスとテンソル要素の次元の部分アドレスオフセット値との合計に基づく。変数V1では、特定のテンソル要素のメモリアドレスは、テンソル要素のベースアドレスと行208a(一番上の行)における部分アドレスオフセット値との合計に等しい。したがって、変数V1(i=0,j=0,k=0)の各次元の第1の要素に対応するテンソル要素では、部分アドレスオフセット値が全てゼロであるので、メモリアドレスは、ベースアドレス+ゼロに等しい。
【0037】
テンソル要素のメモリアドレスは、
図1のハードウェア加算器ユニット124を使用して求めることができる。たとえば、特定の変数(たとえば、変数V1)についての加算器への入力は、ベースアドレスおよびこの変数の特定の行(たとえば、変数V1の行208a)における各部分アドレスオフセット値要素の値であってもよい。出力は、この変数のメモリアドレスである。
【0038】
図2Cは、プログラム212に従って要素V1[0][0][0]にアクセスすることを示す。たとえば、プロセッサは、アクセスされる要素に対応するメモリアドレスを突き止める命令「LocateTensor」を実行してもよい。いくつかの実現例では、この命令は、ベースメモリアドレスを含んでもよい。たとえば、命令「LocateTensor」は、変数V1の第1の要素である要素V1[0][0][0]のメモリアドレスを含んでもよい。いくつかの実現例では、この命令は、アクセス対象のテンソルに対応する行番号を含んでもよい。たとえば、命令「LocateTensor」は、変数V1に対応する行番号を含んでもよい。ここでは、行番号は1である。
【0039】
いくつかの実現例では、テンソルトラバーサルユニットを含むコンピューティングシステムは、テンソルトラバーサルユニットからメモリアドレス値を照会する有限状態機械(
FSM)を含んでもよい。たとえば、FSMは、
図2B~
図2Hに関連して説明した「LocateTensor」および「IterateTensor」命令などの命令を実行するプロセッサではないプ
ロセッサのメモリアドレス値を照会してもよい。FSMは、プロセッサを参照して以下で説明するように、ネステッドループを繰り返しトラバースし、ループをトラバースしながら部分アドレス値を繰り返してもよい。次いで、プロセッサは、求められたメモリアドレス値を、それらが求められた通りにハードウェアカウンタまたはFSMから受信することができる。
【0040】
いくつかの実現例では、この命令を受信したことに応答して、ハードウェア加算器ユニット(たとえば、
図1のハードウェア加算器ユニット124)は、部分アドレス値要素208の行1(行208a)における部分アドレスオフセット値要素208の各々に格納された値の合計を計算することによってメモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Z
1,1、Z
1,2およびZ
1,3に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット(すなわち、この例では0)に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素V1[0][0][0]にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Z
1,1、Z
1,2およびZ
1,3に格納された値との合計を求めることによって要素V1[0][0][0]のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【0041】
図2Dは、プログラム212に従って要素V1[0][0][1]にアクセスすることを示す。たとえば、プログラムが内側ループの1回目の繰り返しを完了した後、プロセッサは、プログラムが内側ループの2回目の繰り返し(すなわち、i=0,j=0,k=1)に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行し
てもよい。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ(内側ネステッドループインデックス変数iによって追跡されるループ)に対応する次元の部分アドレスオフセット値要素208を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Z
1,1に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素X
1,1に格納されたステップ値だけインクリメントされる。内側ループのために格納された、結果として生じる更新後の部分アドレスオフセット値は、Z
1,1に格納された以前の値とX
1,1に格納された値との合計、すなわち0+1=1である。
【0042】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Z1,1に格納された更新後の部分オフセットアドレス値と要素Y1,1に格納された内側ループの終了値とを比較する。Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Z1,1に格納された部分オフセットアドレス値の値を、要素V1,1に格納された内側ループの初期値にリセットしてもよい。また、以下でより詳細に説明するように、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループに対応する次元の部分アドレスオフセット値を、X1,2に格納された中間ループのステップ値だけインクリメントしてもよい。
【0043】
要素Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Z1,1に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値(1)は、内側ループの終了値(2)未
満である。したがって、テンソルトラバーサルユニットは、中間ループの部分アドレスオフセット値をインクリメントすることなく、内側ループの部分アドレスオフセット要素Z1,1に格納された更新後の部分アドレスオフセット値を保持する。
【0044】
次いで、プロセッサは、V1[0][0][1]に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素V1[0][0][1]にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素208の行1(行208a)における部分アドレスオフセット値要素208の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Z1,1、Z1,2およびZ1,3に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット(すなわち、この例では1)に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素V1[0][0][1]にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Z1,1、Z1,2およびZ1,3に格納された値との合計を求めることによって、要素V1[0][0][1]のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【0045】
図2Eは、プログラム212に従って要素V1[0][1][0]にアクセスすることを示す。たとえば、プログラムが内側ループの2回目の繰り返しを完了した後、プロセッサは、プログラムが中間ループの2回目の繰り返し(すなわち、i=0,j=1,k=0)に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行し
てもよい。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ(内側ネステッドループインデックス変数iによって追跡されるループ)に対応する次元の部分アドレスオフセット値要素208を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Z
1,1に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素X
1,1に格納されたステップ値だけインクリメントされる。内側ループのために格納された、結果として生じる更新後の部分アドレスオフセット値は、Z
1,1に格納された以前の値とX
1,1に格納された値との合計、すなわち1+1=2である。
【0046】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Z1,1に格納された更新後の部分オフセットアドレス値と要素Y1,1に格納された内側ループの終了値とを比較する。Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Z1,1に格納された部分オフセットアドレス値の値を、要素V1,1に格納された内側ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループに対応する次元の部分アドレスオフセット値を、X1,2に格納された中間ループのステップ値だけインクリメントしてもよい。
【0047】
要素Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Z1,1に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値(2)は、内側ループの終了値(2)に等しい。したがって、テンソルトラバーサルユニットは、要素Z1,1に格納された部分オフセットアドレス値を、要素V1,1に格納された初期値にリセットする。また、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループの部分アドレスオフセット値を、X1,2に格納された中間ループのステップ値だけインクリメントする。こ
の例では、中間ループの更新後の部分アドレスオフセット値は、6(0+6)である。
【0048】
いくつかの実現例では、テンソルトラバーサルユニットは、中間ループの部分オフセットアドレス値を更新すると判断したことに応答して、要素Z1,2に格納された中間ループの更新後の部分オフセットアドレス値と、要素Y1,2に格納された中間ループの終了値とを比較する。Z1,2に格納された中間ループ値の更新後の部分オフセットアドレスが、要素Y1,2に格納された中間ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Z1,2に格納された部分オフセットアドレス値の値を、要素V1,2に格納された中間ループの初期値にリセットしてもよい。また、以下で説明するように、テンソルトラバーサルユニットは、要素Z1,3に格納された外側ループに対応する次元の部分アドレスオフセット値を、X1,3に格納された外側ループのステップ値だけインクリメントしてもよい。
【0049】
要素Z1,2に格納された中間ループの更新後の部分オフセットアドレス値が、要素Y1,2に格納された中間ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループの更新後の部分アドレス値を保持してもよい。この例では、中間ループの更新後の部分アドレスオフセット値(6)は、内側ループの終了値(12)未満である。したがって、テンソルトラバーサルユニットは、外側ループの部分アドレスオフセット値をインクリメントすることなく、中間ループの部分アドレスオフセット要素Z1,2に格納された更新後の部分アドレスオフセット値を保持する。
【0050】
次いで、プロセッサは、V1[0][1][0]に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素V1[0][1][0]にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素208の行1(行208a)における部分アドレスオフセット値要素208の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Z1,1、Z1,2およびZ1,3に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット(すなわち、この例では6)に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素V1[0][1][0]にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Z1,1、Z1,2およびZ1,3に格納された値との合計を求めることによって、要素V1[0][1][0]のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【0051】
図2Fは、プログラム212に従って要素V1[0][1][1]にアクセスすることを示す。たとえば、プログラムが中間ループの2回目の繰り返しのための内側ループの1回目の繰り返しを完了した後、プロセッサは、プログラムが中間ループの2回目の繰り返しのための内側ループの2回目の繰り返し(すなわち、i=0,j=1,k=1)に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行してもよい
。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ(内側ネステッドループインデックス変数iによって追跡されるループ)に対応する次元の部分アドレスオフセット値要素208を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Z
1,1に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素X
1,1に格納されたステップ値だけインクリメントされる。内側ループのために格納される、結果として生じる更新後の部分アドレスオフセット値は、Z
1,1に格納された以前の値とX
1,1に格納された値との合計、すなわち0+1=2である。
【0052】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Z1,1に格納された更新後の部分オフセットアドレス値と、要素Y1,1に格納された内側ループの終了値とを比較する。Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Z1,1に格納された部分オフセットアドレス値の値を、要素V1,1に格納された内側ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループに対応する次元の部分アドレスオフセット値を、X1,2に格納された中間ループのステップ値だけインクリメントしてもよい。
【0053】
要素Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Z1,1に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値(1)は、内側ループの終了値(2)未満である。したがって、テンソルトラバーサルユニットは、中間ループの部分アドレスオフセット値をインクリメントすることなく、内側ループの部分アドレスオフセット要素Z1,1に格納された更新後の部分アドレスオフセット値を保持する。
【0054】
次いで、プロセッサは、V1[0][1][1]に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素V1[0][1][1]にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素208の行1(行208a)における部分アドレスオフセット値要素208の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Z1,1、Z1,2およびZ1,3に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット(すなわち、この例では7)を加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素V1[0][1][1]にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Z1,1、Z1,2およびZ1,3に格納された値との合計を求めることによって、要素V1[0][1][1]のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【0055】
図2Gは、プログラム212に従って要素V1[1][0][0]にアクセスすることを示す。たとえば、プログラムが中間ループの2回目の繰り返しのための内側ループの2回目の繰り返しを完了した後、プロセッサは、プログラムが外側ループの2回目の繰り返し(すなわち、i=1,j=0,k=0)に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行してもよい。いくつかの実現例では、テンソルトラ
バーサルユニットは、内側ループ(内側ネステッドループインデックス変数iによって追跡されるループ)に対応する次元の部分アドレスオフセット値要素208を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Z
1,1に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素X
1,1に格納されたステップ値だけインクリメントされる。内側ループのために格納される、結果として生じる更新後の部分アドレスオフセット値は、Z
1,1に格納された以前の値とX
1,1に格納された値との合計、すなわち1+1=2である。
【0056】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Z1,1に格納された更新後の部分オフセットアドレス値と、要素Y1,1に格納された内側ループの終了値とを比較する。Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1
に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Z1,1に格納された部分オフセットアドレス値の値を、要素V1,1に格納された内側ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループに対応する次元の部分アドレスオフセット値を、X1,2に格納された中間ループのステップ値だけインクリメントしてもよい。
【0057】
要素Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Z1,1に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値(2)は、内側ループの終了値(2)に等しい。したがって、テンソルトラバーサルユニットは、要素Z1,1に格納された部分オフセットアドレス値を、要素V1,1に格納された初期値にリセットする。また、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループの部分アドレスオフセット値を、X1,2に格納された中間ループのステップ値だけインクリメントする。この例では、中間ループの更新後の部分アドレスオフセット値は、12(6+6)である。
【0058】
いくつかの実現例では、テンソルトラバーサルユニットは、中間ループの部分オフセットアドレス値を更新すると判断したことに応答して、要素Z1,2に格納された中間ループの更新後の部分オフセットアドレス値と、要素Y1,2に格納された中間ループの終了値とを比較する。Z1,2に格納された中間ループの更新後の部分オフセットアドレスが、要素Y1,2に格納された中間ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Z1,2に格納された部分オフセットアドレス値の値を、要素V1,2に格納された中間ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Z1,3に格納された外側ループに対応する次元の部分アドレスオフセット値を、X1,3に格納された外側ループのステップ値だけインクリメントしてもよい。
【0059】
要素Z1,2に格納された中間ループの更新後の部分オフセットアドレス値が、要素Y1,2に格納された中間ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループの更新後の部分アドレス値を保持してもよい。この例では、中間ループの更新後の部分アドレスオフセット値(12)は、中間ループの終了値(12)に等しい。したがって、テンソルトラバーサルユニットは、要素Z1,2に格納された部分オフセットアドレス値を、要素V1,2に格納された初期値にリセットする。また、テンソルトラバーサルユニットは、要素Z1,3に格納された外側ループの部分アドレスオフセット値を、X1,3に格納された外側ループのステップ値だけインクリメントする。この例では、外側ループの更新後の部分アドレスオフセット値は、2(0+2)である。
【0060】
次いで、プロセッサは、V1[1][0][0]に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素V1[1][0][0]にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素208の行1(行208a)における部分アドレスオフセット値要素208の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Z1,1、Z1,2およびZ1,3に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット(すなわち、この例では2)に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素V1[1][0][0]にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Z1,1、Z1,2およびZ1,3に格納された値との合計を求めることによって、要素V1[1][0][0]のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアド
レスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【0061】
図2Hは、プログラム212に従って要素V1[1][0][1]にアクセスすることを示す。たとえば、プログラムが外側ループの2回目の繰り返しのための内側ループの1回目の繰り返しを完了した後、プロセッサは、プログラムが外側ループの2回目の繰り返しのための内側ループの2回目の繰り返し(すなわち、i=1,j=0,k=1)に入ったときに部分アドレスオフセット値を更新する命令「IterateTensor」を実行してもよい
。いくつかの実現例では、テンソルトラバーサルユニットは、内側ループ(内側ネステッドループインデックス変数iによって追跡されるループ)に対応する次元の部分アドレスオフセット値要素208を、内側ループに対応する次元のステップ値だけインクリメントすることによって、部分アドレスオフセット値を更新する。この例では、部分アドレスオフセット値要素Z
1,1に格納された部分アドレスオフセット値は、ハードウェア加算器ユニットを使用して、ステップ値要素X
1,1に格納されたステップ値だけインクリメントされる。内側ループのために格納される、結果として生じる更新後の部分アドレスオフセット値は、Z
1,1に格納された以前の値と、X
1,1に格納された値との合計、すなわち0+1=2である。
【0062】
いくつかの実現例では、テンソルトラバーサルユニットは、要素Z1,1に格納された更新後の部分オフセットアドレス値と、要素Y1,1に格納された内側ループの終了値とを比較する。Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値に等しい場合、テンソルトラバーサルユニットは、要素Z1,1に格納された部分オフセットアドレス値の値を、要素V1,1に格納された内側ループの初期値にリセットしてもよい。また、テンソルトラバーサルユニットは、要素Z1,2に格納された中間ループに対応する次元の部分アドレスオフセット値を、X1,2に格納された中間ループのステップ値だけインクリメントしてもよい。
【0063】
要素Z1,1に格納された更新後の部分オフセットアドレス値が、要素Y1,1に格納された内側ループの終了値未満である場合、テンソルトラバーサルユニットは、要素Z1,1に格納された内側ループの更新後の部分アドレス値を保持してもよい。この例では、内側ループの更新後の部分アドレスオフセット値(1)は、内側ループの終了値(2)未満である。したがって、テンソルトラバーサルユニットは、中間ループの部分アドレスオフセット値をインクリメントすることなく、内側ループの部分アドレスオフセット要素Z1,1に格納された更新後の部分アドレスオフセット値を保持する。
【0064】
次いで、プロセッサは、V1[1][0][1]に対応するメモリアドレスを突き止めるための命令「LocateTensor」を実行することによって、要素V1[1][0][1]にアクセスすることができる。この命令を受信したことに応答して、ハードウェア加算器ユニットは、部分アドレス値要素208の行1(行208a)における部分アドレスオフセット値要素208の各々に格納された値の合計を計算することによって、メモリアドレスオフセットを求める。ここで、ハードウェア加算器ユニットは、要素Z1,1、Z1,2およびZ1,3に格納された値の合計を求める。次いで、プロセッサは、ベースメモリアドレスを求められたメモリアドレスオフセット(すなわち、この例では3)に加算してメモリアドレスを求め、求められたメモリアドレスに基づいて、記憶媒体に格納されたデータにアクセスすることによって、要素V1[1][0][1]にアクセスすることができる。別の例では、ハードウェア加算器は、ベースメモリアドレスと要素Z1,1、Z1,2およびZ1,3に格納された値との合計を求めることによって、要素V1[1][0][1]のメモリアドレスを求めてもよい。次いで、プロセッサは、求められたメモリアドレスに基づいて、記憶媒体に格納されたにアクセスすることができる。
【0065】
テンソルトラバーサルユニットは、ネステッドループの残りの繰り返しについてメモリ
アドレスを求めて、同様の態様で残りのテンソル要素にアクセスし続けることができる。以下の表1は、
図2A~
図2Hに示されるステップ値を使用したテンソル要素のメモリアドレスオフセット値を示す。
【0066】
【0067】
図3は、多次元テンソル変数のアドレスを求めるためのプロセスの一例300を示すフロー図である。プロセス300は、1つ以上のコンピュータのシステム、たとえば
図1のコンピューティングシステム100によって実行されてもよい。このシステムは、初期値要素とステップ値要素と終了値要素と部分アドレスオフセット要素とを含むテンソルアドレス値要素を有するテンソルトラバーサルユニットを含む。テンソルトラバーサルユニットは、1つ以上のハードウェア加算器を有するハードウェア加算器ユニットも含む。
【0068】
このシステムは、N次元テンソルの特定の要素にアクセスするための命令を取得する(302)。N次元テンソルは、N個の次元の各々にわたって配置された複数の要素を含み得て、Nは、1以上の整数である。たとえば、このシステムは、テンソルの特定の要素にアクセスするための命令を実行する処理ユニット(たとえば、処理ユニット102)を含んでもよい。
【0069】
いくつかの実現例では、命令は、第1のループと第2のループと第3のループとを含むネステッドループを処理するための命令を表してもよい。第1のループは、第2のループ内にネストされた内側ループであってもよく、第2のループは、第3のループ内にネストされた中間ループであってもよい。第1のループは、第1のインデックス変数を使用して繰り返されてもよい。同様に、第2のループは、第2のインデックス変数を使用して繰り
返されてもよく、第3のループは、第3のインデックス変数を使用して繰り返されてもよい。たとえば、プログラムは、記憶媒体に格納されてもよく、処理ユニットによって実行可能である。プログラムは、文字配列変数V1(または、別のタイプの配列)、2という第1の次元、2という第2の次元および3という第3の次元を指定してもよい。プログラムは、変数V1をトラバースするためのネステッドforループを指定してもよい。このforループは、ネステッドループインデックス変数iによって追跡される外側ループにおいてV1の第3の次元をトラバースしてもよい。また、このforループは、ネステッドループインデックス変数jによって追跡される中間ループにおいてV1の第2の次元をトラバースしてもよく、ネステッドループインデックス変数kによって追跡される内側ループにおいて第1の次元をトラバースしてもよい。
【0070】
このシステムは、1つ以上のハードウェア加算器および部分アドレスオフセット要素を使用して、特定の要素のアドレスを求める(304)。いくつかの実現例では、特定の要素のアドレスは、N次元テンソルの別の要素からオフセットされたアドレスであってもよい。たとえば、特定の要素のアドレスは、N次元テンソルの別の要素のベースメモリアドレスからオフセットされたアドレスであってもよい。1つ以上のテンソルインデックス要素の各テンソルインデックス要素について、このシステムは、ハードウェア加算器を使用してベースメモリアドレスとともに部分アドレスオフセット要素の現在の値を加算することによって、メモリアドレスを求めてもよい。部分アドレスオフセット要素の現在の値は、ループの現在の繰り返しに基づく。
【0071】
いくつかの実現例では、テンソルの要素のうちのいずれかの要素のアドレスオフセットを求める前に、このシステムは、テンソルアドレス値要素に格納された値を設定してもよい。たとえば、プロセッサは、テンソルアドレス値要素を初期化する命令「InitializeElements」を実行してもよい。
【0072】
内側ループの各繰り返しについて、このシステムは、内側ループのステップ値を使用して内側ループの部分アドレスオフセット値を更新してもよい。中間および外側ループの1回目の繰り返しのための内側ループの1回目の繰り返しの前(すなわち、i=0,j=0,k=0)に、内側ループの部分アドレスオフセット値は、内側ループの初期値に設定されてもよい。
【0073】
内側ループの各繰り返し後、このシステムは、内側ループの部分アドレスオフセット値を、内側ループの以前の部分アドレスオフセット値と内側ループのステップ値との合計に更新してもよい。次いで、このシステムは、内側ループの更新後の部分アドレスオフセット値と内側ループの終了値とを比較してもよい。内側ループの更新後の部分アドレスオフセット値が内側ループの終了値未満である場合、このシステムは、少なくとも内側ループの次の繰り返しまでは、他の部分アドレスオフセット値のいずれも修正することなく、部分アドレスオフセット値要素における内側ループの更新後の部分アドレスオフセット値を維持してもよい。
【0074】
この更新後の部分アドレスオフセット値が内側ループの終了値に等しい場合、このシステムは、部分アドレスオフセット値を内側ループの初期値にリセットし、内側ループのステップ値を使用して中間ループの部分アドレスオフセット値をインクリメントしてもよい。たとえば、このシステムは、中間ループの部分アドレスオフセット値を、中間ループの以前の部分アドレスオフセット値と中間ループのステップ値との合計に更新してもよい。次いで、このシステムは、中間ループの更新後の部分アドレスオフセット値と中間ループの終了値とを比較してもよい。中間ループの更新後の部分アドレスオフセット値が、内側ループの終了値未満である場合、このシステムは、少なくとも中間ループの次の繰り返しまでは、他の部分アドレスオフセット値のいずれも修正することなく、部分アドレスオフ
セット値要素における中間ループの更新後の部分アドレスオフセット値を維持してもよい。
【0075】
この更新後の部分アドレスオフセット値が中間ループの終了値に等しい場合、このシステムは、部分アドレスオフセット値を中間ループの初期値にリセットし、外側ループのステップ値を使用して外側ループの部分アドレスオフセット値をインクリメントしてもよい。たとえば、このシステムは、外側ループの部分アドレスオフセット値を、外側ループの以前の部分アドレスオフセット値と外側ループのステップ値との合計に更新してもよい。次いで、このシステムは、外側ループの更新後の部分アドレスオフセット値と外側ループの終了値とを比較してもよい。
【0076】
外側ループの更新後の部分アドレスオフセット値が外側ループの終了値未満である場合、このシステムは、部分アドレスオフセット値要素における外側ループの更新後の部分アドレスオフセット値を維持してもよい。この更新後の部分アドレスオフセット値が外側ループの終了値に等しい場合、このシステムは、テンソルの各要素がアクセスされたときに各ループの部分アドレスオフセット値をそれらのそれぞれの初期値にリセットしてもよい。
【0077】
このシステムは、N次元テンソルの特定の要素にアクセスするための求められたアドレスを示すデータを出力する(306)。たとえば、テンソルトラバーサルユニットは、現在の部分アドレスオフセット値とベースメモリアドレスとの合計に基づいて、求められたアドレスを出力してもよい。システムの処理ユニットは、メモリアドレスオフセット値を使用して、記憶媒体におけるN次元配列変数の特定の要素にアクセスしてもよい。
【0078】
本明細書に記載されている主題および機能動作の実施形態は、デジタル電子回路、有形に具体化されたコンピュータソフトウェアもしくはファームウェア、本明細書に開示されている構造およびそれらの構造的等価物を含むコンピュータハードウェア、またはそれらのうちの1つ以上の組み合わせで実現することができる。本明細書に記載されている主題の実施形態は、1つ以上のコンピュータプログラムとして、すなわちデータ処理装置によって実行されるようにまたはデータ処理装置の動作を制御するように有形の非一時的なプログラムキャリア上に符号化されたコンピュータプログラム命令の1つ以上のモジュールとして、実現することができる。代替的にまたは加えて、プログラム命令は、人為的に生成された伝搬信号、たとえば情報を符号化して好適な受信機装置に送信してデータ処理装置によって実行するように生成される、機械によって生成される電気信号、光信号または電磁信号、上に符号化することができる。コンピュータ記憶媒体は、機械読取可能な記憶装置、機械読取可能な記憶基板、ランダムもしくはシリアルアクセスメモリデバイス、またはそれらのうちの1つ以上の組み合わせであってもよい。
【0079】
本明細書に記載されているプロセスおよび論理フローは、1つ以上のプログラム可能なコンピュータが入力データ上で動作して出力を生成することによって機能を実行するように1つ以上のコンピュータプログラムを実行することによって実行することができる。プロセスおよび論理フローは、特殊目的論理回路、たとえばFPGA(フィールドプログラマブルゲートアレイ)、ASIC(特定用途向け集積回路)またはGPGPU(汎用グラフィックス処理ユニット)、によっても実行することができ、装置は、特殊目的論理回路としても実現することができる。
【0080】
コンピュータプログラムの実行に適したコンピュータは、一例として、汎用マイクロプロセッサもしくは特殊目的マイクロプロセッサもしくはそれら両方、またはその他の種類の中央処理装置を含み、それらに基づいてもよい。一般に、中央処理装置は、リードオンリメモリまたはランダムアクセスメモリまたはそれら両方から命令およびデータを受信す
る。コンピュータの必須の要素は、命令を実施または実行するための中央処理装置と、命令およびデータを格納するための1つ以上のメモリデバイスである。一般に、コンピュータは、データを格納するための1つ以上の大容量記憶装置(たとえば、磁気ディスク、光磁気ディスクまたは光ディスク)も含み、1つ以上の大容量記憶装置からデータを受信したり1つ以上の大容量記憶装置にデータを送信したり1つ以上の大容量記憶装置との間でデータを送受信したりするように動作可能に結合される。しかし、コンピュータは、このような装置を有していなくてもよい。さらに、コンピュータは、別のデバイス、たとえばほんの数例を挙げると、携帯電話、パーソナルデジタルアシスタント(PDA)、携帯オーディオもしくはビデオプレーヤ、ゲーム機、グローバルポジショニングシステム(GPS)受信機、またはポータブルストレージデバイス(たとえば、ユニバーサルシリアルバス(USB)フラッシュドライブ)、に組み込まれてもよい。
【0081】
コンピュータプログラム命令およびデータの格納に適したコンピュータ読取可能媒体は、全ての形態の不揮発性メモリ、メディアおよびメモリデバイスを含み、メモリデバイスは、一例として、半導体メモリデバイス(たとえば、EPROM、EEPROMおよびフラッシュメモリデバイス)、磁気ディスク(たとえば、内蔵ハードディスクまたはリムーバブルディスク)、光磁気ディスク、ならびにCD ROMおよびDVD-ROMディスクを含む。プロセッサおよびメモリは、特殊目的論理回路によって補完されてもよく、または特殊目的論理回路に組み入れられてもよい。
【0082】
本明細書は、多くの具体的な実現例の詳細を含んでいるが、これらは、いずれの発明または請求の範囲を限定するものとして解釈されるべきではなく、特定の発明の特定の実施形態に特有の特徴を説明するものとして解釈されるべきである。別々の実施形態の文脈で本明細書に記載されている特定の特徴は、単一の実施形態において組み合わせて実現することも可能である。逆に、単一の実施形態の文脈で記載されているさまざまな特徴は、複数の実施形態において別々にまたは任意の好適な部分的な組み合わせで実現することも可能である。さらに、特徴は、特定の組み合わせで動作するものとして上記され、最初にそのように記載されているかもしれないが、記載されている組み合わせの中の1つ以上の特徴は、場合によってはこの組み合わせから除外されてもよく、記載されている組み合わせは、部分的な組み合わせまたは部分的な組み合わせの変形例を対象としてもよい。
【0083】
同様に、動作は、特定の順序で図面に示されているが、これは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序でこのような動作を実行しなければならないものとして理解されるべきではなく、示されている動作を全て実行しなければならないものとして理解されるべきでもない。特定の状況では、マルチタスクおよび並列処理が有利である場合もある。さらに、上記の実施形態におけるさまざまなシステムモジュールおよびコンポーネントの分離は、このような分離が全ての実施形態で必要であるものとして理解されるべきではなく、記載されているプログラムコンポーネントおよびシステムは、一般に、単一のソフトウェア製品に一体化されるかまたは複数のソフトウェア製品にパッケージングされてもよいということが理解されるべきである。
【0084】
主題の特定の実施形態について説明してきた。他の実施形態は、以下の特許請求の範囲の範囲内である。たとえば、特許請求の範囲に記載されている動作は、異なる順序で実行されても、依然として望ましい結果を達成することができる。一例として、添付の図面に示されているプロセスは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序を必ずしも必要としない。特定の実現例では、マルチタスクおよび並列処理が有利である場合もある。