(57)【要約】  デバイスにおいて基本計算原始関数を実施するための方法において、デバイスは、プロセッサと行列乗算アクセラレータ（ＭＭＡ）とを含む。この方法は、メモリからの基本計算原始関数に対してデータをストリーミングするように、デバイスにおけるストリーミングエンジンを構成すること（２００）、データをフォーマット化するようにＭＭＡを構成すること（２０２）、及びデバイスによって基本計算原始関数を実行すること（２０４）を含む。
2020509501.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサ及び行列乗算アクセラレータ（ＭＭＡ）を含むデバイスにおいて基本計算原始関数を実施する方法であって、前記方法が、
前記デバイスに含まれるストリーミングエンジンを、メモリからの前記基本計算原始関数に対してデータをストリーミングするように構成すること、
前記ＭＭＡを、前記データをフォーマットするように構成すること、及び
前記デバイスによって前記基本計算原始関数を実行すること、
を含む、方法。
【請求項２】
請求項１に記載の方法であって、前記基本計算原始関数を実行することが、第２の被乗数行列バッファにおけるデータを用いる行列乗算の実行と同時に、データを第１の被乗数行列バッファにロードすることを更に含み、前記第１及び第２の被乗数行列バッファが前記ＭＭＡに含まれる、方法。
【請求項３】
請求項１に記載の方法であって、前記ＭＭＡを構成することが、前記ＭＭＡに含まれる被乗数行列バッファにデータをオフセットロードするように、前記ＭＭＡを構成することを更に含む、方法。
【請求項４】
請求項１に記載の方法であって、前記データが行列の行を含み、前記基本計算原始関数を実行することが、前記データを、前記ＭＭＡに含まれる被乗数行列バッファにおける列にコピーすることを更に含む、方法。
【請求項５】
請求項１に記載の方法であって、前記ＭＭＡの出力にゼロパディングを付加するように、前記プロセッサを構成することを含む、方法。
【請求項６】
請求項１に記載の方法であって、前記プロセッサを、前記ＭＭＡの出力上でシーム除去を実施するように構成することを更に含む、方法。
【請求項７】
請求項１に記載の方法であって、前記プロセッサを、特定のストライドに従って、前記ＭＭＡの出力上で列サブサンプリングを実施するように構成することを更に含む、方法。
【請求項８】
請求項１に記載の方法であって、前記ストリーミングエンジンを構成することが、前記ストリーミングエンジンを、複数の特徴マップのデータをフィルタリング行列にタイル化するように構成することを更に含む、方法。
【請求項９】
請求項８に記載の方法であって、データのタイルのサイズが、前記前記ＭＭＡの出力においてシームが存在しないように選択される、方法。
【請求項１０】
請求項８に記載の方法であって、データのタイルのサイズが、シームが常に前記ＭＭＡの前記出力における同じ位置にあるように選択される、方法。
【請求項１１】
請求項１に記載の方法であって、前記データが複素数を含み、前記複素数の実数部と虚数部が前記メモリにインタリーブされてストアされ、前記方法が、前記ＭＭＡにロードするために、各複素数を前記実数部と前記虚数部とに分割するように、前記プロセッサを構成することを更に含む、方法。
【請求項１２】
請求項１に記載の方法であって、前記基本計算原始関数が高速フーリエ変換（ＦＦＴ）であり、
前記基本計算原始関数を実行することが、
前記データ行列の列上で前記ＦＦＴを実施するために、離散フーリエ変換（ＤＦＴ）行列を、前記ＭＭＡに含まれる乗数行列バッファにロードすること、及び、前記ＭＭＡに含まれる被乗数行列バッファにデータ行列をロードすること、及び
前記データ行列の行上で前記ＦＦＴを実施するために、前記データ行列を前記乗数行列バッファに、及び前記ＤＦＴ行列を被乗数行列バッファにロードすること、
を更に含む、
方法。
【請求項１３】
請求項１に記載の方法であって、前記データが、前記ＭＭＡに含まれる被乗数行列バッファの幅より大きい長さのフィルタを含み、前記フィルタが、複数の一層小さいフィルタに分解され、前記一層小さいフィルタのサイズが、前記ＭＭＡの前記スループットの最大化と一層小さいフィルタの総数の最小化との間のトレードオフとして選択される、方法。
【請求項１４】
デバイスであって、
メモリ、
前記メモリに結合されるプロセッサ、及び
前記プロセッサに結合される行列乗算アクセラレータ（ＭＭＡ）を含み、
前記ＭＭＡが、乗数バッファ及び第１の被乗数バッファを含み、
前記デバイスが、
前記デバイスに含まれるストリーミングエンジンを、前記メモリからの基本計算原始関数のために、データをストリーミングするように構成し、
前記データをフォーマットするように前記ＭＭＡを構成し、
前記基本計算原始関数を実行する、
ように動作可能である、デバイス。
【請求項１５】
請求項１４に記載のデバイスであって、前記デバイスが更に、前記基本計算原始関数を実行するように動作可能であり、前記ＭＭＡに含まれる第２の被乗数行列バッファにおけるデータを用いる行列乗算の実行と同時に、データが前記第１の被乗数行列バッファにロードされる、デバイス。
【請求項１６】
請求項１４に記載のデバイスであって、前記デバイスが更に、前記第１の被乗数行列バッファにデータをオフセットロードするように前記ＭＭＡを構成するように動作可能である、デバイス。
【請求項１７】
請求項１４に記載のデバイスであって、前記デバイスが更に、前記基本計算原始関数を実行するように動作可能であり、前記データが、行列の行を含み、前記データが、前記第１の被乗数行列バッファにおける列にコピーされる、デバイス。
【請求項１８】
請求項１４に記載のデバイスであって、前記デバイスが更に、前記ＭＭＡの出力にゼロパディングを付加するように前記プロセッサを構成する、デバイス。
【請求項１９】
請求項１４に記載のデバイスであって、前記デバイスが更に、前記ＭＭＡの出力上でシーム除去を実施するように前記プロセッサを構成するように動作可能である、デバイス。
【請求項２０】
請求項１４に記載のデバイスであって、前記デバイスが更に、特定のストライドに従って、前記ＭＭＡの出力上で列サブサンプリングを実施するように前記プロセッサを構成するように動作可能である、デバイス。
【請求項２１】
請求項１４に記載のデバイスであって、前記デバイスが更に、複数の特徴マップのデータをフィルタリング行列にタイル化するように前記ストリーミングエンジンを構成するように動作可能である、デバイス。
【請求項２２】
請求項２１に記載のデバイスであって、データのタイルのサイズが、前記ＭＭＡの出力においてシームが存在しないように選択される、デバイス。
【請求項２３】
請求項２１に記載のデバイスであって、データのタイルのサイズが、シームが前記ＭＭＡの出力における同じ位置に存在するように選択される、デバイス。
【請求項２４】
請求項１４に記載のデバイスであって、前記データが複素数を含み、前記複素数の実数部と虚数部が前記メモリにインタリーブされてストアされ、前記デバイスが更に、前記ＭＭＡにロードするために、各複素数を前記実数部と前記虚数部とに分けるように前記プロセッサを構成するように動作可能である、デバイス。
【請求項２５】
請求項１４に記載のデバイスであって、前記基本計算原始関数が高速フーリエ変換（ＦＦＴ）であり、前記デバイスが更に、前記基本計算原始関数を実行するように動作可能であり、
前記データ行列の列上で前記ＦＦＴを実施するために、離散フーリエ変換（ＤＦＴ）行列が前記乗数行列バッファにロードされ、データ行列が前記第１の被乗数行列バッファにロードされ、
前記データ行列の行上で前記ＦＦＴを実施するために、前記データ行列が前記乗数行列バッファにロードされ、前記ＤＦＴ行列が前記第１の被乗数行列バッファにロードされる、
デバイス。
【請求項２６】
請求項１４に記載のデバイスであって、前記データが、前記第１の被乗数行列バッファの幅より大きい長さのフィルタを含み、前記デバイスが更に、前記フィルタを複数の一層小さいフィルタに分解するように動作可能であり、前記一層小さいフィルタのサイズが、前記ＭＭＡの前記スループットの最大化と、前記一層小さいフィルタの総数の最小化との間のトレードオフとして選択される、デバイス。
【発明の詳細な説明】
【技術分野】
【０００１】
音声認識、インテリジェント産業用制御、オブジェクト検出及び認識、及び映像等の応用例は、ますます組み込みデバイスに移行されつつある。そのようなデバイスにおいて、そのような応用例に用いられるアルゴリズムの計算需要をサポートするために、ハードウェアアクセラレーションが必要とされ得る。
【発明の概要】
【０００２】
本明細書において説明される例は、行列乗算アクセラレータを用いて基本計算原始関数（primitives）を実装することに関する。一つの態様において、デバイスにおいて基本計算原始関数を実施するための方法が提供され、このデバイスはプロセッサ及び行列乗算アクセラレータ（ＭＭＡ）を含む。この方法は、メモリからの基本計算原始関数に対してデータをストリーミングするためのデバイスにおけるストリーミングエンジンを構成すること、データをフォーマットするようＭＭＡを構成すること、及びそのデバイスによって基本計算原始関数を実行することを含む。
【０００３】
一つの態様において、メモリ、メモリに結合されるプロセッサ、及びプロセッサに結合される行列乗算アクセラレータ（ＭＭＡ）を含むデバイスが提供され、ＭＭＡは、乗数バッファ及び第１の被乗数バッファを含む。デバイスは、メモリからの基本計算原始関数に対してデータをストリーミングするためのデバイスにおけるストリーミングエンジンを構成し、データをフォーマットするようＭＭＡを構成し、及び基本計算原始関数を実行するように動作可能である。
【図面の簡単な説明】
【０００４】
【図１】プロセッサに結合される行列乗算アクセラレータ（ＭＭＡ）を用いて基本計算原始関数を実装するように構成可能な例示のデバイスを図示する。
【０００５】
【図２】図１のデバイスにおいて基本計算原始関数を実行するための方法のフローチャートである。
【０００６】
【図３】図１のデバイスにおけるバッチ小行列行列乗算の実装を図示する例である。
【０００７】
【図４】図１のデバイスにおける大行列行列乗算の実装を図示する例である。
【０００８】
【図５】図１のデバイスにおける行列行列点状乗算の実装を図示する例である。
【０００９】
【図６】図１のデバイスにおける行列行列加算の実装を図示する例である。
【００１０】
【図７】図１のデバイスにおける小ベクトル行列乗算の実装を図示する例である。
【００１１】
【図８】図１のデバイスにおける小ベクトル総和の実装を図示する例である。
【００１２】
【図９】図１のデバイスにおけるアフィン変換の実装を図示する例である。
【００１３】
【図１０】図１のデバイスにおける二次元（２Ｄ）畳み込みの実装を図示する例である。
【図１１】図１のデバイスにおける二次元（２Ｄ）畳み込みの実装を図示する例である。
【００１４】
【図１２】図１のデバイスにおける行列行置換の実装を図示する例である。
【００１５】
【図１３】図１のデバイスにおけるベクトル列置換の実装を図示する例である。
【００１６】
【図１４】フィルタサイズとスループットとのトレードオフを図示すグラフである。
【発明を実施するための形態】
【００１７】
一貫性のため、図における類似の要素は類似の参照番号で示される。
【００１８】
本明細書に説明される例は、音声認識、インテリジェント産業用制御、オブジェクト検出及び認識、及び映像等の、行列乗算アクセラレータ（ＭＭＡ）を用いる応用例により用いられる基本計算原始関数の実装を提供する。基本計算原始関数は、例えば、畳み込みニューラルネットワーク（ＣＮＮ）において用いられるような二次元（２Ｄ）畳み込み、小及び大行列行列乗算、行列行列点状乗算、行列行列加算、ベクトル行列乗算、ベクトル総和、アフィン変換、高速フーリエ変換、離散コサイン変換、畳み込み、相関、行列アサイメント、行列置換、及び行列転置を含む。
【００１９】
図１は、プロセッサ１０２に結合される行列乗算アクセラレータ（ＭＭＡ）１０４を用いて、本明細書で上述されたもの等の基本計算原始関数を実装するように構成可能な例示のデバイス１００を図示する。ＭＭＡ１０４は、行列乗算を実施するための機能性を含む。行列乗算は、２つの行列から行列を生成する二項演算である。具体的には、乗数行列ＡがＭ×Ｋ行列であり、被乗数行列ＢがＫ×Ｎ行列である場合、これら２つの行列の行列積はＭ×Ｎ行列Ｃであり、その場合、Ａの行ｎを横切るｍ要素に、Ｂの列Ｋを下に向かうｍ要素を掛け、総和して要素Ｃｍｎを生成する。
【００２０】
ＭＭＡ１０４は、２つのＢ行列をストアするための１６ビット要素の２つの３２×３２被乗数バッファ１４４及び２つのＣ行列をストアするための１６ビット要素の２つの３２×３２結果バッファ１３４をストアするために充分なメモリを含む。被乗数バッファ１４４は、本明細書においてＢ行列バッファと称され得、結果バッファ１３４は、本明細書においてＣ行列バッファと称され得る。ＭＭＡ１０４は更に、乗数行列Ａの行をストアするための１６ビット要素の１×３２乗数バッファ１３８をストアするためのメモリを含む。乗数バッファ１３８は、本明細書においてＡ行列バッファと称され得る。本明細書において説明されるように、Ｂ行列バッファ１４４は、ピンポンバッファとして用いられ、一方のバッファのデータが演算実行のために用いられるときに、他方のバッファにデータがバックグラウンドでロードされる。同様に、Ｃ行列バッファ１３４はフォアグラウンド及びバックグラウンドバッファとして用いられ、例えば、一方のバッファのコンテンツがＭＭＡ１０４から出力される間に、演算実行の結果が別のバッファにストアされる。
【００２１】
各サイクル上で、ＭＭＡ１０４は、単一の命令、即ち、本明細書においてＬＳＥ命令と称されるロード、ストア、及び命令実行を実施する。この名称が示唆するように、ＭＭＡ１０４は、単一のサイクルにおいて、ロード演算、ストア演算、実行演算を実施し得る。概して、或るサイクルにおいて、データのベクトルがＡ行列バッファ１３８にロードされ、選択されたＢ行列バッファ１４４にストアされたＢ行列とＡ行列バッファ１３８におけるデータベクトルとの間で行列乗算演算が実施される。従って、Ａ行列バッファ１３８のデータベクトルと選択されたＢ行列バッファ１４４におけるＢ行列の各列との行列積が計算される。行列乗算演算の結果は、データ要素の行であり、それは選択されたＣ行列バッファ１３４におけるＣ行列の行にストアされる。ＬＳＥ命令のフィールドのコンテンツに応じ、サイクルが、データの行を行列乗算に用いられていないＢ行列バッファ、即ちバックグラウンドＢ行列バッファ、にロードすること、Ｃ行列バッファからのデータの行を外部メモリにストアすること、及び／又は、選択されたＣ行列バッファ１３４に結果をストアする前に、行列積演算の結果上で特定の演算を実施することも含み得る。
【００２２】
ＬＳＥ命令のロード演算部は、Ａ行列バッファ１３８にロードされるべきデータのバッファ１２４における位置と、Ｂ行列バッファ１４４にロードされるべきデータのバッファ１２８における位置と、ロード演算のターゲットであるＢ行列バッファ１４４と、ロードされるべきターゲットＢ行列バッファにおける行とを識別するフィールドを含む。ロード演算部はまた、ロード演算が実施されるべきか否かを示すためのフィールドも含む。
【００２３】
ＬＳＥ命令のストア演算部は、Ｃ行列バッファ１３４におけるデータがストアされるべきバッファ１１８内の位置と、ストアされるべきデータを保持するＣ行列バッファ１３４と、ストアされるべきデータを含むターゲットＣ行列バッファ１３４における行とを識別するフィールドを含む。ストア演算部はまた、ストア演算が実施されるべきか否かを示すためのフィールドも含む。
【００２４】
ＬＳＥ命令の実行演算部は、ターゲットＣ行列バッファ１３４、及び実行演算の結果を受け取るべきターゲットＣ行列バッファ１３４における行と、ターゲットＣ行列バッファ１３４にストアする前に行列乗算の結果を用いて実施すべき演算とを識別するフィールドを含む。特定され得る演算は、＝、＋＝、−＝、又はｎｏｎｅである。＝演算は、結果を、変更なしに、特定された行に直接ストアさせる。＋＝演算は、結果における要素を、特定された行における対応する要素に加算させ、加算の結果が、特定された行のコンテンツに置き換わる。−＝演算は、結果における要素を、特定された行における対応する要素から減算させ、減算の結果が、特定された行のコンテンツに置き換わる。ｎｏｎｅ演算は、その名が示唆するように、演算が実施されないことを示す。ｎｏｎｅ演算は、例えば、行列乗算を実施する前の、データのＢ行列バッファ１４４への初期ロードの間、又は、Ｃ行列バッファ１３４にストアされた最終結果をＭＭＡ１０４の外に移動させるときに用いられる。
【００２５】
ＭＭＡ１０４は更に、それぞれ、ＭＭＡ１０４によるデータ出力及びＭＭＡ１０４へのデータ入力をフォーマットするための、構成可能なフォーマットコンポーネント１３０、１３６、１４０を含む。フォーマットＡコンポーネント１３６及びフォーマットＢコンポーネント１４０は、例えば、１６ビット浮動小数点、１６ビット固定小数点符号あり、１６ビット固定小数点符号なし、８ビット固定小数点符号あり、及び８ビット固定小数点符号なし、及びＱポイント、即ち、固定小数点入力に対する小数点以下ビットの数等、特定されたタイプに従って、それぞれの入力データをフォーマットするように構成可能である。フォーマットＣコンポーネント１３０は、例えば、１６ビット浮動小数点、１６ビット固定小数点符号あり、１６ビット固定小数点符号なし、８ビット固定小数点符号あり、及び８ビット固定小数点符号なし、及びＱポイント、即ち、固定小数点出力に対する小数点以下のビット数等、特定されたタイプに従って出力データをフォーマットするように構成可能である。フォーマットＡコンポーネント１３６は更に、Ｌ２  １０６におけるＡデータを、メモリを節約するため４ビット精度でストアさせ、Ａ行列バッファ１３８において、均一である必要がない４ビットから１６ビットへのマッピングを用いて、１６ビットに拡張させることを可能にするルックアップテーブル（ＬＵＴ）を定義するように構成可能である。これは、潜在的に、全ての計算原始関数に対して有用であり、特に、ＣＮＮスタイル２Ｄ畳み込みに対して有用である。
【００２６】
ＭＭＡ１０４はまた、Ｂ行列バッファ１４４にロードされるべきデータの行の各要素に対しオフセットを特定するように構成可能な行オフセットコンポーネント１４２を含む。行オフセットコンポーネント１４２は、行における３２個の要素の各々に対して１つの、３２個の５ビットオフセット値をストアする。行オフセットコンポーネント１４２において特定された行オフセット値は、要素を、ＬＳＥ命令のロード部において特定された行番号とは異なるバックグラウンドＢ行列バッファにおける異なる行にロードされているデータ要素の行に置くために用いられ得る。データ要素に対応するオフセット値は、ＬＳＥ命令のロード部において特定されたＢ行列バッファの行番号に加算されて、データ要素がロードされることになるＢ行列バッファの行を決定する。データ要素の列番号は影響されない。
【００２７】
より具体的には、ＭＭＡ１０４のサイクル上で、データの新しい行が、バックグラウンドＢ行列バッファ、即ち、実行のために用いられていないＢ行列バッファ１４４、にロードされ得る。データの行における全ての要素に対し、行オフセットコンポーネント１４２における行オフセット値がゼロである場合、データ要素は、サイクルに対するＬＳＥ命令において特定されるバックグラウンドＢ行列バッファの行にロードされる。例えば、データの新しい行を、バックグラウンドＢ行列バッファの第１の行にロードするとき、第１の要素は行１、列１にロードされ、第２の要素は行１、列２にロードされる等となる。しかしながら、行オフセットコンポーネント１４２における行オフセット値が非ゼロである場合、対応するデータ要素がロードされる行は、ＬＳＥ命令において特定される行及び行オフセット値によって決定される。例えば、行オフセット値が０、１、２、．．．３１であると想定する。ＬＳＥ命令においてバックグラウンドＢ行列バッファの第１の行が特定されているデータの新しい行をロードするとき、第１の要素は行１、列１にロードされ、第２の要素は行２、列２にロードされ、第３の要素は行３、列３にロードされる等となり、従って、バックグラウンドＢ行列バッファにおいて対角線を形成する。
【００２８】
ＭＭＡ１０４は更に、Ｃ行列バッファ１３４の出力に非線形性を適用するための、構成可能な非線形性コンポーネント１３２を含む。実装される非線形性は、正規化線形関数（ＲｅＬＵ）であり、有効化されると、要素毎にＣ行列バッファ１３４の出力に適用される。非線形性コンポーネント１３２に対する入力が負である場合、非線形性コンポーネント１３２の出力をゼロに設定し、非線形性コンポーネント１３２の入力が負でない場合、非線形性コンポーネント１３２の出力を非線形性の入力に設定する。
【００２９】
例示のデバイス１００において、プロセッサ１０２は、レベル１データ（Ｌ１Ｄ）キャッシュメモリ１１２、レベル２（Ｌ２）統合命令及びデータキャッシュメモリ１０６、及び２つのストリーミングエンジン（ＳＥ０及びＳＥ１）１０８、１１０を含むデジタル信号プロセッサ（ＤＳＰ）である。そのようなプロセッサの例は、本明細書に参照として組み込まれる、２０１７年３月２８日発行の米国特許番号ＵＳ９，６０６，８０３に記載されている。また、ストリーミングエンジンの例は、米国特許番号ＵＳ９，６０６，８０３、及び本明細書に参照として組み込まれる、２０１７年１０月２６日公開の米国特許出願公開番号ＵＳ２０１７／０３０８３８１に記載されている。
【特許文献１】米国特許番号ＵＳ９，６０６，８０３
【特許文献２】米国特許出願公開番号ＵＳ２０１７／０３０８３８１
【００３０】
プロセッサ１０２は、ＭＭＡ１０４に対する入力データのソースとして動作するように、及びＭＭＡ１０４から出力データを受け取るように構成される。より具体的には、プロセッサ１０２は、それぞれのレジスタファイル１２０、１２６におけるストリーミングエンジン１０８、１１０からＭＭＡ１０４のためのデータベクトルを受け取るように、及び、デバイス１００によって実行されている基本計算原始関数のため必要に応じて、フォーマッティング１２２をデータに適用するように、及び、ＭＭＡ１０４による消費のためにそれぞれのバッファ１２４、１２８にデータベクトルをストアするように構成される。ソースＡバッファ１２４は、Ａ行列バッファ１３８にロードされるべきデータをストアし、ソースＢバッファ１２８は、Ｂ行列バッファ１４４にロードされるべきデータをストアする。
【００３１】
入力フォーマッティング１２２の例としては、ゼロパディング、偶数／奇数ベクトル生成、値コピー、既知行列生成、及び連係演算が含まれる。偶数／奇数ベクトル生成は、２つのベクトルを受け取る。偶数オプションが選択される場合、ＭＭＡ１０４への入力に対する出力ベクトルを生成するために、２つのベクトルの全ての偶数要素が用いられる。奇数オプションが選択される場合、出力ベクトルを生成するために、２つのベクトルの全ての奇数要素が用いられる。偶数／奇数フォーマッティングは、例えば、１より大きいストライドを用いる高速フーリエ変換（ＦＦＴ）及び畳み込みに有用である。値コピーフォーマッティングは、ＭＭＡ１０４への入力に対するベクトルを生成し、Ｌ２  １０６から読み出されるスカラー値が、ベクトルの全ての要素に対して複製される。値コピーは、例えば、バイアス生成に対して有用である。既知行列生成フォーマッティングは、ＭＭＡ１０４への入力に対する出力ベクトルのシーケンスを生成し、それらはともに、単位行列等の共通既知行列パターンを形成する。ゼロパディングフォーマッティングは、ＭＭＡ１０４への入力の前にベクトルにゼロを追加する。連係演算は、ＭＭＡ１０４の出力ベクトルを取り、そのベクトルをＡ行列バッファ１３８又はＢ行列バッファ１４４のために、ＭＭＡ１０４に対する入力として提供する。連係演算は、例えば、Ｚ＝Ｗ＊Ｘ＊Ｙスタイルの演算のために有用である。
【００３２】
プロセッサ１０２はまた、デスティネーションＣバッファ１１８におけるＭＭＡ１０４からデータベクトルを受け取るように、及び、フォーマッティング１１６を、デバイス１００によって実行されている基本計算原始関数のために、必要に応じてデータに適用するように、及び、データベクトルをレジスタファイル１１４にストアするように構成される。データベクトルは、レベル１データキャッシュ１１２及びレベル２統合キャッシュ１０６を介して外部メモリ（図示されない）にストアされる。出力フォーマッティング１１６の例としては、シーム除去、ストライド除去、ゼロパディング、及び行列転置が含まれる。
【００３３】
ストリーミングエンジン１０８、１１０は、データ要素のストリームをレベル２キャッシュ１０６からそれぞれのレジスタファイル１２０、１２６に転送するように構成される。ストリームは、同じタイプ及びサイズの要素のシーケンスであると定義される。ストリーミングエンジン１２０、１２６は、下記のストリーム属性を特定することによって、基本計算原始関数に特有のストリームを定義するようにプログラム可能である。ストリーム属性は、ストリームの第１の要素のアドレス、ストリームにおける要素のサイズ及びタイプ、ストリームにおけるデータのフォーマッティング、及びストリームに関連するアドレスシーケンス、即ち、それらをストリームに置くために要素にアクセスするアドレス順である。ストリームが開始されると、ストリーミングエンジン１２０、１２６が、アドレスを計算し、Ｌ２から定義されたデータタイプをフェッチし、ゼロ拡張又は符号拡張等の任意の特定されたデータタイプフォーマッティングを実施し、データをベクトルにマッピングし、データベクトルを直接それぞれのレジスタファイル１２０、１２６に搬送する。
【００３４】
ストリーミングエンジン１０８、１１０のアドレスシーケンスは、多次元メモリアクセスを可能にする。従って、各ストリーミングエンジン１２０、１２６は、ストリームの要素に対するアドレスシーケンスを、メモリをウォークスルーするポインタによって実行する。各ストリーミングエンジン１２０、１２６は、ポインタが取るべき経路を制御するマルチレベルパラメータ化ネスト化ループを実装する。このネスト化ループにおいて、ループレベルに対する反復カウントが、そのレベルにおいてループが反復する回数を示し、ループレベルに対する次元が、そのループレベルにおけるポインタ位置間の距離を定義する。
【００３５】
最も内側のループ、即ち、ループ０は、メモリから物理的に連続する要素を消費し、１の暗示的次元を有し、ポインタは要素から要素に連続的に移動し、このループレベルにおける順序を上げる。内側ループの外側の各レベルにおいて、ループは、ループに対して特定された次元のサイズに基づいて、ポインタを新しい位置に移動させる。このアドレッシングのフォームによって、プログラムが、メモリを介した正規経路を少数のパラメータで特定できる。
【００３６】
表１は、そのような、６レベルを用いてネスト化されたループに対する例示の疑似コードを示す。この疑似コードにおいて、ＩＣＮＴｘはレベルｘに対する反復カウントであり、ＤＩＭｘはレベルｘに対する次元であり、ＥＬＥＭ＿ＢＹＴＥＳは、バイトでの各要素のサイズである。他の例において、ネスト化されたループは、これより多い又はこれより少ないレベルを有し得る。
【表１】
2020509501.tif 000003
【００３７】
また、プロセッサ１０２は、デバイス１００に対して定義された各基本計算原始関数に対する制御ソフトウェアを実行する。制御ソフトウェアは、必要に応じて、ストリーミングエンジン１０８、１１０及びＭＭＡ１０４の構成に基本計算原始関数を実施させ、ＭＭＡの実行を制御し、基本計算原始関数のために必要な任意の入力フォーマッティング１２２及び／又は出力フォーマッティング１１６を適用させる。
【００３８】
図２は、デバイス１００において基本計算原始関数を実行するための方法のフローチャートである。初期的に、基本計算原始関数のための制御ソフトウェアが、基本計算原始関数のためのデータ要素を、必要な順序にストリーミングするように、ストリーミングエンジン１０８、１１０を構成する（２００）。従って、制御ソフトウェアは、基本計算原始関数のストリーム属性を、ストリーミングエンジン１０８、１１０の各々に通信する。基本計算原始関数に応じて、一方又は双方のストリーミングエンジンが用いられ得る。概して、ストリーミングエンジン１０８は、Ａ行列バッファ１３８のためのデータ要素をストリーミングするように構成され、ストリーミングエンジン１１０は、Ｂ行列バッファ１４４のためのデータ要素をストリーミングするように構成される。異なる基本計算原始関数のためにストリーミングエンジン１０８、１１０を構成する例が本明細書に記載される。
【００３９】
制御ソフトウェアはまた、行列乗算を用いて基本計算原始関数を実施するために必要に応じ、ＭＭＡ１０４を構成する（２０２）。従って、制御ソフトウェアは、フォーマットコンポーネント１３０、１３６、１４０、行オフセットコンポーネント１４２、及び非線形性コンポーネント１３２を、基本計算原始関数のための必要に応じて構成する。異なる計算原始関数のためにＭＭＡ１０４を構成する例が本明細書に記載される。
【００４０】
構成が完了すると、制御ソフトウェアは、構成されたストリーミングエンジン１０８、１１０を開始し（２０４）、構成された基本計算原始関数を実行する（２０６）。概して、基本計算原始関数を実行するために、制御ソフトウェアは、ＭＭＡ１０４にＬＳＥ命令のシーケンスを実行させて、データ要素をＡ行列バッファ１３８及びバックグラウンドＢ行列バッファ１４４にロードし、Ａ行列バッファ１３８とフォアグラウンドＢ行列バッファ１４４との間で行列乗算を実行し、行列乗算の結果を選択されたＣ行列バッファ１３４にストアし、データをバックグラウンドＣ行列バッファ１３４からバッファ１１８に移動させる。ＭＭＡ１０４において構成される任意のフォーマッティング及びオフセットが、データ要素がバッファ１３８、１４４にロードされる前に、及び結果がＣ行列バッファ１３４からバッファ１１８に移動されるときに、適用される。基本計算原始関数の実行の一部として、制御ソフトウェアはまた、基本計算原始関数に固有の入力フォーマッティング１２２及び出力フォーマッティング１１６をプロセッサ１０２上で実施させる。
【００４１】
図３は、図１のデバイス１００におけるバッチ小行列行列乗算の実装を図示する例である。充分に小さい行列の場合、複数の被乗数行列ＸをＢ行列バッファ１４４に対角線状にロードし、Ａ行列バッファ１３８においてロードされた対応する乗数行列Ｈを掛けることによって、複数の行列乗算Ｙ＝Ｈ＊Ｘが単一バッチにおいて実施され得る。図３に示されるように、被乗数行列がＫ×Ｎであり、対応する乗数行列がＭ×Ｋであり、Ｋ、Ｎ、及びＭが、３２より小さいと仮定する。バッチサイズＴ、即ち、Ｂ行列バッファ１４４に対角線状にロードされ得る被乗数行列Ｘの数は、Ｔ＝ｆｌｏｏｒ（３２／ｍａｘ（Ｋ，Ｎ））である。このように、Ｔ個の被乗数行列Ｘ（ｔ），ｔ＝０，１，．．．，Ｔ−１，は、Ｂ行列バッファ１４４に対角線状にロードされ得、Ｔ個の乗数行列Ｈ（ｔ）ができる。
【００４２】
この原始関数を実施するため、Ｔ個のＨ行列はＬ２キャッシュ１０６にストアされ、その結果、Ｔ個のＨ行列の各々の第１の行を含むＴ＊Ｋ連続要素があり、その後にＺＫ個の０が続き、Ｔ個のＨ行列の各々の第２の行を含むＴ＊Ｋ連続要素があり、その後にＺＫ個の０が続き、．．．、Ｈ行列の各々のＭ番目の行のＴ＊Ｋ連続要素があり、その後にＺＫ個の０が続く。ここで、ＺＫ＝３２−Ｔ＊Ｋである。また、Ｔ個のＸ行列はＬ２キャッシュ１０６にストアされ、その結果、Ｔ個のＸ行列の各々の第１の行を含むＴ＊Ｎ連続要素があり、その後にＺＮ個の０が続き、Ｔ個のＸ行列の各々の第２の行を含むＴ＊Ｎ連続要素があり、その後にＺＮ個の０が続き、．．．、Ｔ個のＸ行列の各々のＭ番目の行のＴ＊Ｎ連続要素があり、その後にＺＮ個の０が続く。ここでＺＮ＝３２−Ｔ＊Ｎである。
【００４３】
ストリーミングエンジン１１０は、Ｌ２キャッシュ１０６からＴ個のＸ行列の要素を読み出すように、及び、ＭＭＡ１０４のＢ行列バッファ１４４にロードするために、Ｔ個のＸ行列の連続行の要素を含むベクトルを提供するように構成される。ストリーミングエンジン１０８は、Ｌ２キャッシュ１０６からＴ個のＨ行列の要素を読み出すように、及び、Ａ行列バッファ１３８にロードするために、Ｔ個のＨ行列の連続行の要素を含むベクトルを提供するように構成される。
【００４４】
ＭＭＡ１０４の行オフセットコンポーネント１４０は、ストリーミングエンジン１１０からの各ベクトルの行の要素を、オフセットｔ＊ＫでＢ行列バッファ１４４にロードさせるように構成される。このように、Ｘ（０）からの行の要素は、０のオフセットを用いてロードされ、Ｘ（１）からの行の要素は、Ｋのオフセットを用いてロードされ、Ｘ（２）からの行の要素は、２Ｋのオフセットを用いてロードされる等となる。
【００４５】
乗算を実施するため、適切に構成されたＬＳＥ命令がＭＭＡ１０４上で実行されて、Ｂ行列バッファ１４４にＸ行列の初期バッチをロードする。Ｂ行列バッファがロードされると、更なるＬＳＥ命令が実行されて、対応するＨ行列の行をＡ行列バッファ１３８にロードし、乗算を実施し、結果をＣ行列バッファ１３４にストアする。また、複数のバッチが処理される場合、ＬＳＥ命令はまた、Ｘ行列の別のバッチをバックグラウンドＢ行列バッファ１４４にロードし、前のバッチの結果をＣ行列バッファ１３４からＭＭＡ１０４の外に移動させる。このように、バッチ小行列行列乗算を実施するため、Ｔ＊Ｋ要素が、Ｍサイクルの間、Ａ行列バッファ１３８にロードされ、Ｔ＊Ｎ要素が、Ｋサイクルの間、Ｂ行列バッファ１４４（初期バッチ以外、バックグラウンドにおいて）にロードされ、Ｔ＊Ｎ要素が、Ｍサイクルの間、Ｃ行列バッファから外に移動される。
【００４６】
他の例において、ＺＫ及びＺＮ個の０をＬ２キャッシュ１０６にストアするのではなく、ストリーミングエンジン１０８、１１０又は入力フォーマッティング１２２がゼロパディングを実施するように構成されて、ベクトルをソースＡバッファ１２４又はソースＢバッファ１２８にストアする前に、必要な数のゼロを各ベクトルに付加する。
【００４７】
図４は、図１のデバイス１００における大行列行列乗算Ｙ＝Ｈ＊Ｘの実装を図示する例であり、ここで、被乗数行列Ｘ及び乗数行列Ｈは、Ｂ行列バッファ１４４及びＡ行列バッファ１３８より大きい次元を有する。この例は、被乗数行列Ｘの次元が３２Ｋ×３２Ｎであり、乗数行列Ｈの次元が３２Ｍ×３２Ｋであること、即ち、これらの行列の各々の次元が３２で均一に割り切れること、を仮定している。このように、Ｙ行列の次元は、３２Ｍ×３２Ｎである。行列Ｘ及びＨは３２×３２タイルに分割される。従って、行列のタイルＴ（ｍ，ｎ）が、行（３２＊ｍ）：３２＊（（ｍ＋１）−１）、及び列（３２＊ｎ）：（３２＊（ｎ＋１）−１）から形成される。図４に図示されるように、Ｈタイルの行のＸタイルの列との行列乗算が、Ｈのタイル行１とＸのタイル列１の行列乗算によって生成されるタイルＹ（１、１）等、単一の対応するＹタイルを生成する。
【００４８】
表２は、ＭＭＡ１０４によるこの原始関数のパフォーマンスを図示する例示の疑似コードである。疑似コードは、ストリーミングエンジン１０８が、Ｌ２キャッシュ１０６から乗数行列Ｈの要素を読み出すように、及びベクトルをＡ行列バッファ１３８に提供するように構成されることを仮定し、その結果、Ｈタイルの各行がＮ回ロードされ、即ち、Ｈ（０，０：（Ｋ−１））がＮ回ロードされ、Ｈ（１，０：（Ｋ−１））がＮ回ロードされ、Ｈ（２、０：（Ｋ−１））はＮ回ロードされる等となる。従って、Ｈ行列の全ての行が、Ｌ２キャッシュ１０６に連続してストアされる。ストリーミングエンジン１０８は、シーケンス、Ｈ（０，０），Ｈ（０，１），．．．，Ｈ（０，Ｋ−１）をＮ回ロードし、．．．、その後、シーケンス、Ｈ（１，０），Ｈ（１，１），．．，Ｈ（１，Ｋ−１）をＮ回ロードし、その後、シーケンス、Ｈ（Ｍ−１，０），Ｈ（Ｍ−１，１），．．．，Ｈ（Ｍ−１、Ｋ−１）をＮ回ロードするように構成される。
【００４９】
また、疑似コードは、ストリーミングエンジン１１０が、Ｌ２キャッシュ１０６からＸタイルの要素を読み出すように、及びＢ行列バッファ１４４にＭ回ロードされるべき各Ｘタイルを提供するように、即ち、ロードのシーケンス［Ｘ（０：（Ｋ−１），０），．．．，Ｘ（０：（Ｋ−１），Ｎ−１）］がＭ回繰り返されるように構成されることを仮定している。従って、Ｘ行列の全ての行がＬ２キャッシュ１０６に連続してストアされる。ストリーミングエンジン１１０は、Ｘ（０，０），Ｘ（１，０），．．．，Ｘ（Ｋ−１，０），Ｘ（０，１），Ｘ（１，１），．．．，Ｘ（Ｋ−１，１），．．．，Ｘ（０，Ｎ−１），Ｘ（１，Ｎ−１），．．．，Ｘ（Ｋ−１，Ｎ−１）をＮ回ロードするように構成される。
【００５０】
この疑似コードにおいて、Ｂｂａｃｋは、Ｂ行列バッファ１４４のカレントのバックグラウンドバッファを示し、Ｂｆｏｒｅは実行に用いられるカレントのフォアグラウンドバッファを示す。
【表２】
2020509501.tif 000004
2020509501.tif 000005
【００５１】
図５は、図１のデバイス１００における行列行列点状乗算Ｃ＝Ａ．＊Ｂの実装を図示する例である。行列行列点状乗算において、行列Ａ、Ｂ、Ｃの次元は、例えばｍ×ｎのように、同じであり、要素Ｃ（ｍ，ｎ）は、Ａ（ｍ，ｎ）とＢ（ｍ，ｎ）との積である。デバイス１００において、Ｃ＝Ａ．＊Ｂは、Ｃ（ｋ，：）＝Ａ（ｋ，：）＊ｄｉａｇ（Ｂ（ｋ，：）），ｋ＝０，．．．，３１として実装され得る。従って、点状乗算は、Ｂ行列の各行の要素をＢ行列バッファ１４４に対角線上にロードすること、及びＡ行列バッファ１３８にロードされたＡ行列の対応する行で行列乗算を実施することによって実装され得る。図５の例は、Ａ行列及びＢ行列の行に対するこれを図示し、ｍ＝ｎ＝３２と仮定する。
【００５２】
この原始関数を実施するため、ストリーミングエンジン１１０は、Ｌ２キャッシュ１０６からＢ行列の要素を読み出すように、及びＭＭＡ１０４のＢ行列バッファ１４４にロードするためＢ行列の各行を提供するように構成される。従って、ストリーミングエンジン１１０からの第１のベクトルは、Ｂ行列の第１の行、行０を含み、ストリーミングエンジンからの第２のベクトルは、Ｂ行列の第２の行を含む等となる。ストリーミングエンジン１０８は、Ｌ２キャッシュ１０６からＡ行列の要素を読み出すように、及び、Ａ行列バッファ１３８にロードするためＡ行列の各行を提供するように構成される。従って、ストリーミングエンジン１０８からの第１のベクトルは、Ａ行列の第１の行、行０を含み、ストリーミングエンジンからの第２のベクトルは、Ａ行列の第２の行を含む等となる。
【００５３】
ＭＭＡ１０４の行オフセットコンポーネント１４０は、Ｂ行列の行の要素をＢ行列バッファ１４４に対角線状にロードさせるように構成される。従って、行要素に対するオフセットは、行の第１の要素が行０、列０にロードされ、第２の要素が行１、列１にロードされ、第３の要素が行２、列２にロードされる等のように、０から３１にわたる逐次値に設定される。
【００５４】
点状乗算を実施するため、適切に構成されたＬＳＥ命令が、ＭＭＡ１０４上で実行されて、Ｂ行列バッファ１４４にＢ行列の初期の行がロードされる。Ｂ行列バッファがロードされると、更なるＬＳＥ命令が実行されて、Ａ行列の対応する行をＡ行列バッファ１３８にロードし、行列乗算を実施し、結果をＣ行列バッファ１３４の対応する行にストアする。更に、ＬＳＥ命令はまた、Ｂ行列の次の行をバックグラウンドＢ行列バッファ１４４にロードする。Ｂ行列の行をバックグラウンドＢ行列の対角線上にロードし、フォアグラウンドＢ行列バッファ上で行列乗算を実行し、結果をストアするこのプロセスは、Ｂ行列の全ての行が処理されるまで繰り返される。その後、Ｃ行列バッファ１３４のコンテンツをＭＭＡ１０４の外に移動するためのＬＳＥ命令が実行される。
【００５５】
図６は、図１のデバイス１００における、行列行列加算Ｃ＝Ａ＋Ｂの実装を図示する例である。行列行列加算において、行列Ａ、Ｂ、Ｃの次元は、例えばｍ×ｍ等、同じであり、要素Ｃ（ｍ，ｎ）は、Ａ（ｍ，ｎ）とＢ（ｍ，ｎ）との合計である。ＭＭＡ１０４を用いて、Ｃ＝Ａ＋Ｂは、Ｃ＝Ａ＊Ｉ＋Ｂ＊Ｉとして実装され得、ここで、Ｉは単位行列である。より具体的には、図６に示されるように、Ｃ＝Ａ＋Ｂは、Ｃ＝Ａ＊Ｉとして実装され得、その後にＣ＋＝Ｂ＊Ｉが続く。また、Ｃ＝Ａ＋Ｂは、Ｃ＝Ｂ＊Ｉとして実装され得、その後にＣ＋＝Ａ＊Ｉが続く。単位行列は、主対角線の全ての要素が１であり他の全ての要素がゼロである正方行列である。所与の行列に単位行列を掛ける効果は、所与の行列を変化させずに残すことである。
【００５６】
この原始関数を実施するため、ストリーミングエンジン１０８は、Ｌ２キャッシュ１０６からＡの要素を読み出すように、及びＡ行列バッファ１３８にロードされるべきＡの各行を提供するように構成される。入力フォーマッティング１２２は、Ｂ行列バッファ１４４にロードされるべき単位行列Ｉのベクトルを生成するように構成される。適切に構成されたＬＳＥ命令がＭＭＡ１０４において実行されて、Ａの各行をＡ行列バッファ１３８にロードし、Ａ行列バッファ１３８にロードされたＡの行と、Ｂ行列バッファ１４４の単位行列との間で行列乗算を行い、結果をＣ行列バッファ１３４の対応する位置にストアする。＝演算は、ＬＳＥ命令において、結果をＣ行列バッファにストアするためのものとして特定される。このように、Ａの各要素が、変更なしに、Ｃ行列バッファの対応する位置にストアされる。
【００５７】
ストリーミングエンジン１０８は、その後、Ｌ２キャッシュ１０６からＢの要素を読み出すように、及びＡ行列バッファ１３８にロードされるべきＢの各行を提供するように構成される。適切に構成されたＬＳＥ命令がＭＭＡ１０４において実行されて、Ｂの各行をＡ行列バッファ１３８にロードし、Ａ行列バッファ１３８にロードされたＢの行とＢ行列バッファ１４４の単位行列との間で行列乗算を行い、結果を、Ａ＊Ｉの結果をストアするＣ行列バッファ１３４の対応する位置にストアする。＋＝演算は、ＬＳＥ命令において、結果をＣ行列バッファにストアするためのものと特定されており、従って、Ｂの各データ要素の値を、Ｃ行列バッファの対応する位置にストアされているＡの対応する要素の値に加算させる。その後、Ｃ行列バッファ１３４のコンテンツをＭＭＡの外に移動させるためＬＳＥ命令が実行される。
【００５８】
図７は、図１のデバイス１００における小ベクトル行列乗算ｙ＝ｘ＊Ｈの実装を図示する例である。定数行列Ｈの場合、Ｈブロックの複数コピーを、対角線状に、Ｂ行列バッファ１４４にロードすること、対応するｘベクトルをＡ行列バッファ１３８にロードすること、及び、行列乗算を実施することによって、複数のｘベクトルによる乗算が単一のバッチにおいて計算され得る。図７に示されるように、ＨはＫ×Ｎ行列であり、各ｘベクトルは１×Ｋであると仮定する。バッチサイズＴ、即ち、Ｂ行列バッファ１４４ブロックに対角線状にロードされ得るＨのコピーの数は、Ｔ＝ｆｌｏｏｒ（３２／ｍａｘ（Ｋ，Ｎ））である。このように、ＨのＴ個のコピーは、Ｂ行列バッファ１４４ブロックに対角線状にロードされ得、対応するベクトルｘ（ｔ），ｔ＝０，１，．．．，Ｔ−１，はＡ行列バッファ１３８にロードされ得る。
【００５９】
この原始関数を実施するため、ストリーミングエンジン１０８は、Ｌ２キャッシュ１０６からＴ個の対応するｘベクトルの要素を読み出すように、及びＡ行列バッファ１３８にロードするためにベクトルを提供するように構成される。従って、ストリーミングエンジン１０８からのベクトルは、ｘ（０），．．．ｘ（Ｔ−１）の要素を含む。ストリーミングエンジン１０８を介するベクトルのロードは、図３を参照して説明されるものに類似し、ここで、Ｍ＝１である。ストリーミングエンジン１１０は、Ｌ２キャッシュ１０６からＨ行列の要素を読み出すように、及びＨ行列の連続する行の要素を含む、ＭＭＡ１０４のＢ行列バッファ１４４にロードするためにベクトルを提供するように構成される。Ｈ行列を複製するため、適切なゼロパディングを用いるＨ行列の行の複数のコピーが、Ｌ２キャッシュ１０６に連続してストアされる。或いは、入力フォーマッティング１２２又はストリーミングエンジン１１０のいずれかが、Ｈの各行をＴ回複製し、適切なゼロパディングを付加するように構成される。
【００６０】
ＭＭＡ１０４の行オフセットコンポーネント１４０は、ストリーミングエンジン１１０からの各ベクトルにおける行の要素を、オフセットｔ＊ＫでＢ行列バッファ１４４にロードさせるように構成される。このように、Ｈ行列の複製された行０の要素は、０のオフセットでロードされ、Ｈ行列の複製された行１の要素は、Ｋのオフセットでロードされ、Ｈ行列の複製された行２の要素は、２Ｋのオフセットを用いてロードされる等となる。
【００６１】
乗算を実施するため、適切に構成されたＬＳＥ命令がＭＭＡ１０４上で実行されて、複製されたＨ行列の初期バッチをＢ行列バッファ１４４にロードする。Ｂ行列バッファがロードされると、更なるＬＳＥ命令が実行されて、対応するｘベクトルのベクトルをＡ行列バッファ１３８にロードし、乗算を実施し、結果をＣ行列バッファ１３４にストアする。また、複数のバッチが処理されるべき場合、適切に構成されたＬＳＥ命令が別のベクトルをＡ行列バッファ１３８にロードし、乗算を実施し、前に計算されたベクトルをＡ行列バッファ１３８にストアする。Ｂ行列バッファ１４４は、Ａ行列バッファ１３８にロードされる各新しいベクトルに対してリロードされる必要はない。
【００６２】
図８は、デバイス１００における小ベクトル総和の実装を図示する例である。ベクトル総和は、ｙ＝ｓｕｍ（ｘ）として表され得、ここで、ｙはベクトルの要素の和である。充分に小さいベクトルの場合、複数のｘベクトルをＡ行列バッファ１４４にロードすること、対角線上の１のベクトルのコピーをＢ行列バッファ１４４にロードすること、及び行列乗算を実施することによって、複数の総和が単一バッチにおいて計算され得る。図８に示されるように、各ｘベクトルが１×Ｋであると仮定する。バッチサイズＴ、即ち、Ａ行列バッファ１３８にロードされ得るベクトルの数は、Ｔ＝ｆｌｏｏｒ（３２／Ｋ）である。このように、ｘ（ｔ），ｔ＝０，１，．．．，Ｔ−１，はＡ行列バッファ１３８にロードされ得、全ての１のＫ×１ベクトルのＴ個のコピーが、Ｂ行列バッファ１４４にロードされるべきである。
【００６３】
この原始関数を実施するため、ストリーミングエンジン１０８は、Ｌ２キャッシュ１０６からｘベクトルを読み出すように、及びＡ行列バッファ１３８にロードするために、Ｔ個のｘベクトルを含むベクトルを提供するように構成される。したがって、ストリーミングエンジン１０８からのベクトルは、ベクトルｘ（０），．．．，ｘ（Ｔ−１）を含む。ストリーミングエンジン１０８を介するベクトルのロードは、図３を参照して説明されるものに類似し、ここでＭ＝１である。更に、入力フォーマッティング１２２は、Ｂ行列バッファ１４４において対角線上にロードされるべき全ての１のＫ×１ベクトルを生成するように構成される。
【００６４】
総和を実施するため、適切に構成されたＬＳＥ命令がＭＭＡ１０４上で実行されて、全ての１の１×Ｋベクトルの複数のコピーを、Ｂ行列バッファ１４４に対角線上にロードする。Ｂ行列バッファがロードされると、更なるＬＳＥ命令が実行されて、ｘ（０）．．．ｘ（Ｔ−１）ベクトルをＡ行列バッファ１３８にロードし、乗算を実施し、結果をＣ行列バッファ１３４の行にストアする。また、複数のバッチが処理されるべき場合、適切に構成されたＬＳＥ命令がＡ行列バッファ１３８に別のベクトルをロードし、乗算を実施し、前に計算されたベクトルをストアする。Ｂ行列バッファ１４４は、Ａ行列バッファ１３８にロードされる新しいベクトル毎にリロードされる必要はない。
【００６５】
図９は、デバイス１００におけるアフィン変換の実装を図示する例である。アフィン変換はｙ＝ｘ＊Ｈ＋ｖとして表され得、ｙ＝［ｘ１］＊［Ｈ；ｖ］として計算され得る。行列Ｈ及びベクトルｖが、複数の変換にわたって一定である場合、［Ｈ；ｖ］ブロックの複数のコピーを対角線状にＢ行列バッファ１４４にロードすること、対応するｘベクトルをＡ行列バッファ１３８にロードすること、及び行列乗算を実施することによって、アフィン変換がバッチで計算され得る。図９に示されるように、Ｈが（Ｋ−１）×Ｎ行列であり、ｖが１×Ｎであり、各ｘベクトルが１×（Ｋ−１）であると仮定する。バッチサイズＴ、即ち、Ｂ行列バッファ１４４ブロックに対角線状にロードされ得る［Ｈ；ｖ］のコピーの数は、Ｔ＝ｆｌｏｏｒ（３２／ｍａｘ（Ｋ，Ｎ））である。このように、［Ｈ；ｖ］のＴ個のコピーが、Ｂ行列バッファ１４４にブロックで対角線状にロードされ得、対応するベクトルｘ（ｔ），ｔ＝０，１，．．．，Ｔ−１，は、Ａ行列バッファ１３８にロードされ得る。
【００６６】
この原始関数を実施するため、ストリーミングエンジン１１０は、Ｌ２キャッシュ１０６からＨ行列及びｖの要素を読み出すように、及びＭＭＡ１０４のＢ行列バッファ１４４にロードするためにベクトルを提供するように構成される。ｖと連結されるＨ行列を複製するために、ＨのＫ−１行が連続してＬ２キャッシュ１０６にストアされ、その後にｖの１行が続き、入力フォーマッティング１２２は、これをＴ回複製し、Ｚｎ個の０を付加するように構成される。或いは、Ｈの各行のＴ個のコピーが連続してＬ２キャッシュ１０６にストアされ、それぞれの後にＺｎ個の０が続き、その後、ｖのＴ個のコピーが連続してＬ２キャッシュ１０６にストアされ、その後にＺｎ個の０が続く。
【００６７】
ストリーミングエンジン１０８は、Ｌ２キャッシュ１０６からＴ個の対応するｘベクトルの要素を読み出すように、及びＡ行列バッファ１３８にロードするためにベクトルを提供するように構成される。一例において、ｘ（ｔ）のＴ個のコピーは連続してＬ２キャッシュ１０６にストアされ、入力フォーマッティング１２２は、最後にコピーとＺｋ個の０との間に１を付加するように構成される。或いは、ｘ（ｔ）のＴ個のコピーは連続してＬ２キャッシュ１０６にストアされ、最後にコピーとＺｋ個の０との間に１を有する。
【００６８】
ＭＭＡ１０４の行オフセットコンポーネント１４０は、ストリーミングエンジン１１０からの各ベクトルの要素を、Ｂ行列バッファ１４４に適切なオフセットでロードさせるように構成される。例えば、Ｈの各行のＴ個のコピーがＬ２キャッシュ１０６に連続してストアされ、それぞれの後にＺｎ個の０が続き、その後、ｖのＴ個のコピーがＬ２キャッシュ１０６に連続してストアされ、その後にＺｎ個の０が続くと仮定すると、行オフセットコンポーネント１４０は、［Ｈ；ｖ］行列の複製された行０の要素が、０のオフセットでロードされ、［Ｈ；ｖ］行列の複製された行１の要素がＫのオフセットでロードされ、［Ｈ；ｖ］行列の複製された行２の要素が２Ｋのオフセットでロードされる等のように構成される。
【００６９】
乗算を実施するため、適切に構成されたＬＳＥ命令がＭＭＡ１０４上で実行されて、複製された［Ｈ；ｖ］行列の初期バッチをＢ行列バッファ１４４にロードする。Ｂ行列バッファがロードされると、更なるＬＳＥ命令が実施され、対応するｘベクトルのベクトルをＡ行列バッファ１３８にロードし、乗算を実施し、結果をＣ行列バッファ１３４にストアする。また、複数のバッチが処理されるべき場合、適切に構成されたＬＳＥ命令が、別のベクトルをＡ行列バッファ１３８にロードし、乗算を実施し、前に計算されたベクトルをストアする。Ｂ行列バッファ１４４は、Ａ行列バッファ１３８にロードされる新しいベクトル毎にリロードされる必要はない。
【００７０】
図１０は、デバイス１００における畳み込みニューラルネットワーク（ＣＮＮ）において用いられるような二次元（２Ｄ）畳み込み
2020509501.tif 000006
の実装を図示する例である。典型的な畳み込みニューラルネットワーク（ＣＮＮ）は、特徴を抽出するための幾つかの畳み込み及びサブサンプリング層を含み、その後に、抽出された特徴に基づいて分類を実施するために従来のニューラルネットワークにおいて用いられるような一つ又は複数の完全に接続された層が続く。各畳み込み層及び各サブサンプリング層の出力は特徴マップのセットであり、それはＣＮＮにおける次の層に対する入力である。各畳み込み層は、幾つかのフィルタを含み、それらのサイズ及び数は各層ごとに異なり得る。フィルタは、対応する特徴マップで畳み込まれて、各フィルタに対応する特徴マップを生成する。
【００７１】
図１０は、次元Ｌｒ×Ｌｃを有するＮｉ入力特徴マップ１０００を用いる一般的な畳み込み層を示す。入力特徴マップ１０００は、次元Ｆｒ×Ｆｃを有する対応するフィルタ１０で畳み込まれて、次元Ｍｒ×Ｍｃを有するＮｏ出力特徴マップ１００４を生成する。ＭＭＡ１０４を用いて２Ｄ畳み込みを実施するために、特徴マップ１０００は、次元（Ｆｒ＊Ｆｃ＊Ｎｉ）×（Ｍｒ＊Ｍｃ）のフィルタリング行列Ｘ１００６にタイル化される。フィルタリング行列Ｘにおけるタイルサイズは、大又は小であり得、フィルタ長の関数として選択されるタイルオーバーラップを備える。畳み込みが、Ｌの入力サイズ及びＦのフィルタ長に対してＭ＝Ｌ−Ｆ＋１出力を生成するので、このオーバーラップが存在する。フィルタリング行列Ｘ１１０６におけるタイルに対して大きいサイズを選択することはシームを防止し得、一方、小さいタイルサイズでは、タイル化処理は、プロセッサ１０２による除去のために同じ場所にシームを発生させる。大きい特徴マップタイルは、Ｌｃ＝３２＊Ｂｃ＋Ｆｃ−１を満たし、小さい特徴マップタイルは、Ｌｃ＜＝（３２＋Ｆｃ−１）／Ｂｃを満たす。タイルサイズのこの選択は、同じ場所にシームを発生させる。
【００７２】
出力特徴マップ１００４を計算するため、フィルタ又はカーネルは、連続する３２×３２ブロックにおいて読み出され得、ＭＭＡ１０４におけるタイルフィルタリング行列Ｘ  １００６の３２×３２ブロックに適用され得る。フィルタを入力特徴マップ１０００に適用した結果は、ＭＭＡ１０４によってタイルフィルタリング行列１００６の３２×３２ブロックに対して別々に計算され得、出力特徴マップ１００４を生成するために結合され得る。フィルタ又はカーネル１００２の行は、連続してＬ２キャッシュ１０６にストアされ得、フィルタ行列Ｈ  １００８は、連続する３２×３２ブロックにおいてＬ２キャッシュ１０６から読み出され得る。図１１に図示されるように、タイルフィルタリング行列１００６の特徴マップタイルは、立方体で読み出される。即ち、初期特徴マップＦＭ１  １０１２のタイルの全ての行が読み出され、その後に、次の特徴マップＦＭ２  １０１４における対応するタイルの全ての行が続く等、最後の特徴マップＦＭＮｉ  １０１６における対応するタイルの全ての行まで読み出される。計算は、下記式に従って、ブロック列順に実施され得る。
Ｙ（：，ｎ）＝Ｈ＊Ｘｆｉｌｔｅｒ（：，ｎ），ｎ＝０，．．．，Ｎ−１
又は下記式に従って、ブロック行順（この例において示される順）に実施され得る。
Ｙ（ｍ，：）＝Ｈ（ｍ，：）＊Ｘｆｉｌｔｅｒ，ｍ＝０，．．．，Ｍ−１
ここで、Ｘｆｉｌｔｅｒはタイルフィルタリング行列である。
【００７３】
大きい特徴マップタイルが用いられるときにこの原始関数を実施するため、ストリーミングエンジン１０８は、ＭＭＡ１０４のＡ行列バッファ１３８にロードするために、Ｌ２キャッシュ１０６からフィルタ行列Ｈ  １００８のフィルタベクトルをブロック行順に読み出すように構成される。ストリーミングエンジン１１０は、特徴マップの行の要素をＬ２キャッシュ１０６から読み出すように、及びＭＭＡ１０４のＢ行列バッファ１４４にロードするために特徴マップにおける３２×３２タイルの各行を提供するように構成される。表３は、ストリーミングエンジン１０８を構成するための疑似コードの例であり、表４は、ストリーミングエンジン１１０を構成するための疑似コードの例である。この疑似コードにおいて、Ｂｆは、特徴マップデータ要素ごとのバイトの数であり、Ｓはストライドであり、ＶＥＣＬＥＮはベクトル長であり、タイルサイズは、Ｌｒ×Ｌｃ×Ｎｉであり、ここで、Ｌｃ＝３２＊Ｂｃ＋Ｆｃ−１であり、Ｂｃは、有効な入力特徴マップタイル列の数を示す正の整数である。Ｂｃの値は、例えば、３２＊Ｂｃ＋Ｆｃ−１≦特徴マップにおける列の数になるように、可能な最大整数として選択され得る。これより小さいＢｃの値も用いられ得る。
【００７４】
表３の疑似コードにおいて、ＩＣＮＴｘ及びＤＩＭｘの値は、フィルタ行列Ｈが、事前に特定されたように、ブロック行順に生成されるように選択される。Ｈ行列の行は、ゼロパッドを備えてＬ２キャッシュ１０６にストアされるか又はストリーミングエンジン１０８又は入力フォーマッティング１２２は、ゼロパディングを付加するように構成される。表３の疑似コードにおいて、ＩＣＮＴｘ及びＤＩＭの値は、フィルタリング行列Ｘが事前に特定されたように、ブロック列順に生成されるように、選択される。ｆｏｒ  ｌｏｏｐは、全パターンがｃｅｉｌ（Ｎｏ／３２）回、反復することを示している。
【００７５】
表３及び表４の疑似コードにおけるパターンは、大行列行列乗算の問題を生成する。即ち、ＭＭＡ１０４の観点からみると、実施される処理は、図４に関連して上述したように実施される大行列行列乗算問題である。
【表３】
2020509501.tif 000007
【表４】
2020509501.tif 000008
【００７６】
小さい特徴マップタイルが用いられるときにこの原始関数を実施するため、ストリーミングエンジン１０８は、ＭＭＡ１０４のＡ行列バッファ１３８にロードするために、フィルタ行列Ｈ  １００８のフィルタベクトルをＬ２キャッシュ１０６からブロック行順に読み出すように構成される。ストリーミングエンジン１１０は、Ｌ２キャッシュ１０６から特徴マップの要素を読み出すように、及びＭＭＡ１０４のＢ行列バッファ１４４にロードするために３２×３２タイルの各行を特徴マップに提供するように構成され得る。表５は、ストリーミングエンジン１０８を構成するための疑似コードの例であり、表６は、ストリーミングエンジン１１０を構成するための疑似コードの例である。この疑似コードにおいて、Ｂｆは、特徴マップデータ要素毎のバイトの数であり、Ｓはストライドであり、ＶＥＣＬＥＮはベクトル長であり、タイルサイズは、Ｌｒ×Ｌｃ×Ｎｉであり、ここで、Ｔｃ≦（３２＋Ｆｃ−１）／Ｂｃであり、Ｂｃは、有効な入力特徴マップタイル列の数を示す正の整数であり、Ｍ＝ｍａｘ（Ｂｃ，Ｓ）である。Ｂｃの値は、Ｂｃ≦（３２＋Ｆｃ−１）／Ｌｃを満たす最大整数である。
【００７７】
表５の疑似コードにおいて、ＩＣＮＴｘ及びＤＩＭｘの値は、フィルタ行列Ｈが、事前に特定されたようにブロック行順に生成されるように選択される。Ｈ行列の行は、ゼロパディングを用いてＬ２キャッシュ１０６にストアされるか、或いは、ストリーミングエンジン１０８又は入力フォーマッティング１２２は、ゼロパディングを付加するように構成される。表６の疑似コードにおいて、ＩＣＮＴｘ及びＤＩＭの値は、フィルタリング行列Ｘが、事前に特定されたようにブロック列順に生成されるように選択される。ＦＯＲループは、全パターンが上限（Ｎｏ／３２）回反復することを示す。
【００７８】
表５及び表６の疑似コードにおけるパターンは、大行列行列乗算問題を生成する。即ち、ＭＭＡ１０４の観点からみると、実施される処理は、図４に関連して前に説明されたように実施される大行列行列乗算問題である。
【表５】
2020509501.tif 000009
【表６】
2020509501.tif 000010
【００７９】
大きな特徴タイルが用いられるとき、ストライドＳが１より大きい場合、ストリーミングエンジン１０８の構成は行ストライドを扱う。列ストライドは、ＭＭＡ１０４によって生成されるＳ列毎に一つを書き出すように、出力フォーマッティング１１６を構成することによって扱われる。小さい特徴タイルが用いられるとき、ＭＭＡ１０４の出力からシームが除去される必要がある。ストライドＳが特定されない場合、出力フォーマッティング１１６は、出力からサイズＦｃ−１のＢｃ−１シームを除去するように、及び出力から最後の３２−Ｂｃ＊Ｌｃ＋Ｆｃ−１サンプルを除去し、（Ｌｒ−Ｆｒ＋１）／Ｂｃが整数でない場合、最後のサンプルを無視するように構成される。ストライドＳが特定される場合、出力フォーマッティング１１６は、出力上でシーム除去を実施するように、及び出力から（Ｓ−１）／Ｓ行及び列を除去するように構成される。幾つかの例において、次の畳み込み層のためにゼロパディングが必要とされるとき、出力フォーマッティング１１６は、ＭＭＡ１０４の出力にゼロパディングを付加するように構成される。
【００８０】
図１２は、図１のデバイス１００における行列行置換Ｃ＝Ｂ（新しい指数、：））の実装を図示する例である。行置換はＣ＝Ｐ＊Ｂとして実装され得、ここで、置換行列Ｐは、各行及び列において単一の１を有し、その列位置は、Ｂの対応する要素に対する新しい行指数である。Ｐにおける他の全ての要素はゼロに設定される。
【００８１】
この原始関数を実施するため、ストリーミングエンジン１１０は、ＭＭＡ１０４のＢ行列バッファ１４４にロードするため、Ｌ２キャッシュ１０６からＢ行列の各行を提供するように構成される。従って、ストリーミングエンジン１１０からの第１のベクトルがＢ行列の第１の行、行０を含み、ストリーミングエンジン１１０からの第２のベクトルがＢ行列の第２の行を含む等となる。ストリーミングエンジン１０８は、Ａ行列バッファ１３８にロードするために、Ｌ２キャッシュ１０６からＰ行列の各行を提供するように構成される。従って、ストリーミングエンジン１０８からの第１のベクトルがＰ行列の第１の行、行０を含み、ストリーミングエンジンからの第２のベクトルがＡ行列の第２の行を含む等となる。
【００８２】
行置換を実施するため、適切に構成されたＬＳＥ命令がＭＭＡ１０４上で実行されて、Ｂ行列をＢ行列バッファ１４４にロードする。Ｂ行列バッファがロードされると、更なるＬＳＥ命令が実行されて、Ｐ行列の行をＡ行列バッファ１３８にロードし、行列乗算を実施し、結果をＣ行列バッファ１３４の対応する行にストアする。全ての行列乗算が完了すると、Ｃ行列バッファ１３４のコンテンツをＭＭＡ１０４の外に移動させるためのＬＳＥ命令が実行される。
【００８３】
図１３は、図１のシステムにおけるベクトル列置換、ｃ（ｋ，：）＝ａ（ｋ，新しい指数））の実装を図示する例である。ベクトル列置換は、ｃ（ｋ，：）＝ａ（ｋ，：）＊Ｐとして実装され得、ここで、置換行列Ｐは、各行及び列に単一の１を有し、その行位置は、ａの要素に対する新しい列指数である。Ｐにおける他の全ての要素はゼロに設定される。
【００８４】
この原始関数を実施するため、ストリーミングエンジン１１０は、ＭＭＡ１０４のＢ行列バッファ１４４にロードするために、Ｌ２キャッシュ１０６からＰ行列の各行を提供するように構成される。従って、ストリーミングエンジン１１０からの第１のベクトルがＰ行列の第１の行、行０を含み、ストリーミングエンジンからの第２のベクトルがＰ行列の第２の行を含む等となる。ストリーミングエンジン１０８は、Ａ行列バッファ１３８にロードするために、Ｌ２キャッシュ１０６からベクトルｃを提供するように構成される。
【００８５】
列置換を実施するため、適切に構成されたＬＳＥ命令がＭＭＡ１０４上で実行されて、Ｐ行列をＢ行列バッファ１４４にロードする。Ｂ行列バッファがロードされると、更なるＬＳＥ命令が実行されて、ｃベクトルをＡ行列バッファ１３８にロードし、行列乗算を実施し、結果をＣ行列バッファ１３４の対応する行にストアする。全ての行列乗算が完了すると、Ｃ行列バッファ１３４のコンテンツをＭＭＡ１０４の外に移動させるためにＬＳＥ命令が実行される。
【００８６】
デバイス１００はまた、インタリーブされた実数部と虚数部を用い、個別の実数部と虚数部を用いて、バッチ小一次元（１Ｄ）複素数−複素数高速フーリエ変換（ＦＦＴ）を、インタリーブされた実数部と虚数部を用い、個別の実数部と虚数部を用いて、大１Ｄ複素数複素数ＦＦＴを実施するように構成される。下記のＦＦＴの説明において、下付き文字「ｃｏ」は複素数を示し、下付き文字「ｒｅ」は実数を示し、下付き文字「ｉｍ」は虚数を示す。
【００８７】
インタリーブされた実数部と虚数部を有する長さＮ≦１６の小複素数−複素数ＦＦＴが、下記のように、総当たり離散フーリエ変換（ＤＦＴ）として計算され得る。
2020509501.tif 000011
ここで、
2020509501.tif 000012
である。本明細書に用いられるように、総当たりＤＦＴは、ＤＦＴ行列を用いて入力ベクトルを乗算し、入力のＤＦＴである出力ベクトルを生成することである。
【００８８】
Ｎ＝１６の場合、ｘｃｏ１６及びｙｃｏ１６はインタリーブされた実数及び虚数の値を有する１×３２ベクトルであり、Ｆｃｏ１６は３２×３２行列であるので、ｙｃｏ１６＝ｘｃｏ１６＊Ｆｃｏ１６を計算するために、ベクトル行列乗算が用いられ得る。従って、ベクトルｘｃｏ１６は、ＭＭＡ１０４のＡ行列バッファ１３８にロードされ得、行列Ｆｃｏ１６はＢ行列バッファ１４４にロードされ得、行列積が計算され得、結果がＣ行列バッファ１３４にストアされ得る。より小さいＮ値の場合、図７に関連して本明細書で上述したような小ベクトル行列乗算が、総当たりＤＦＴのバッチを計算するために用いられ得る。
【００８９】
個別の実数部と虚数部を備える小複素数−複素数ＦＦＴのバッチが、下記のように総当たり離散フーリエ変換（ＤＦＴ）として計算され得る。
2020509501.tif 000013
ここで、
2020509501.tif 000014
であり、ここで、
2020509501.tif 000015
である。
【００９０】
ＹｒｅＭ，３２及びＹｉｍＭ，３２計算を下記のように２つの計算に分けることによって、行列行列乗算を用いて、個別の実数部と虚数部を備えるＭ３２ポイント複素数−複素数ＦＦＴのバッチがデバイス１００において計算され得る。
2020509501.tif 000016
これらの計算を実施するため、ストリーミングエンジン１０８、１１０、及びＭＭＡ１０４は、行列行列乗算に対して構成される。また、入力フォーマッティング１２２は、入力を実数部と虚数部に分けるように構成される。
【００９１】
個別の実数部と虚数部を有する一層小さい複素数−複素数ＦＦＴが、本明細書において上述したように、上記の式及びバッチ小行列行列乗算を用いて、バッチのバッチにおいてデバイス１００において計算される。ここで、Ｎ＝Ｋ＝ＦＦＴサイズ≦３２である。
【００９２】
大複素数−複素数１Ｄ  ＦＦＴが下記のように計算され得る。１）データＸを連続順に行列の行にロードする。２）行列の列のＦＦＴを実施する。３）ＩＦＦＴの場合、ｅｊ＊（２＊π／Ｎ）＊ｒｏｗ＊ｃｏｌ、ＦＦＴの場合、ｅ−ｊ＊（２＊π／Ｎ）＊ｒｏｗ＊ｃｏｌの回転因子によって行列を点状乗算する。４）行列の行のＦＦＴを実施する。５）行列を転置する。６）結果の行列の行を連続順にストアする。
【００９３】
この処理は、データ行列Ｘが与えられると、下記のようにデバイス１００において実装される。Ｘの列のＦＦＴを実施するため、行列ＸをＢ行列バッファ１４４にロードし、ＤＦＴ行列ＦをＡ行列バッファ１３８にロードする。その後、本明細書に説明されるように行列行列点状乗算を用いて、回転因子を用いる乗算を実施する。Ｘの行のＦＦＴを実施するため、ＤＦＴ行列ＦをＢ行列バッファ１４４にロードし、行列ＸをＡ行列バッファ１３８にロードする。データ行列ＸをＡ行列バッファ又はＢ行列バッファにロードすることは、転置無しに、列又は行のＦＦＴを可能にする。行列Ｘの最終転置は、ＭＭＡ１０４又は出力フォーマッティング１１６において実施され得る。
【００９４】
表７は、個別の実数部と虚数部を有する長さ１０２４の複素数−複素数１Ｄ  ＦＦＴの計算を図示する例である。例えば、Ｔｒｅ３２＝Ｆｒｅ３２及びＴｉｍ３２＝Ｆｉｍ３２である。また、初期化ロードは例外であるが、明示的に言及される全てのロード演算は、Ｂ行列バッファ１４４に対するものであり、行列乗算と並行して実施される。入力フォーマッティング１２２は、入力を実数部と虚数部とに分けるように構成される。
【表７】
2020509501.tif 000017
2020509501.tif 000018
【００９５】
また、デバイス１００は、ｙ＝ｄｃｔ（ｘ）に従って、一次元（１Ｄ）離散コサイン変換（ＤＣＴ）を実施するように構成され得る。バッチ小一次元（１Ｄ）離散コサイン変換（ＤＣＴ）及び大１Ｄ  ＤＣＴの計算は、ＤＣＴ行列が実数でありデータが実数であること以外、上述した小及び大１Ｄ複素数−複素数ＦＦＴに類似する。ＤＣＴサイズに関連する用語、小及び大は、用語、小及び大ＦＦＴサイズと同様に用いられる。小ＤＣＴは、行列ベクトル乗算を介して実装され得る。大ＤＣＴは、下記のように、事前処理（ステップ１）、ＦＦＴ（ステップ２）、及び事後処理（ステップ３）を介して実装され得る。
ｎ＝０，１，．．．，Ｎ／２−１に対し、x’(n)=x(2*n)及びx’(N-1-n)=x(2*n-1)      （ステップ１）
ｙ’＝ＦＦＴ（ｘ’）を計算      （ステップ２）
y(n)=real(exp(-j*n*pi/(2*N))*y(n))      （ステップ３）
上記のシーケンスにおけるステップ２を計算するため、上述した小ＦＦＴ及び大ＦＦＴを含み、任意のＦＦＴ方法が用いられ得る。
【００９６】
また、デバイス１００は、
2020509501.tif 000019
に従って、小及び大一次元（１Ｄ）畳み込み／フィルタリングを実施するように構成され得る。１Ｄ畳み込み／フィルタリングは、下記に従って計算され得る。
ｙ（ｎ）＝Σｈ（τ）＊ｘ（ｎ−τ），τ＝０，．．．，Ｌ−１；ｎ＝Ｌ−１，Ｌ，．．．
ここで、Ｌはフィルタ長であり、τは畳み込みの定義に従ったフィルタ係数インデックスである。小畳み込みは、Ｌ＜３２であるものであり、大畳み込みは、Ｌ＞３２であるものである。小１Ｄ畳み込みの場合、フィルタ長Ｌが［１，３２］にあり、ｎ≧Ｌ−１の場合、出力が有効であると仮定する。小１Ｄ畳み込みは、下記に従って計算され得る。
Ｃ（ｔ，：）＝Ａ（ｔ，：）*Ｂ，ｔ＝０，１，．．．
ここで、
2020509501.tif 000020
Ｂにおいて、全ての行の最後のＬ−１列はゼロであり、Ｃにおいて、最後のＬ−１エントリはゼロであり、変数ｔは、３２−Ｌ出力が生成される回数を指数化するために用いられる。
【００９７】
１Ｄ畳み込みを実施するため、ストリーミングエンジン１１０は、フィルタの３３−ＬコピーをＢ行列バッファ１４４に初期的にロードするために、Ｌ２キャッシュ１０６からフィルタｈの要素を提供するように構成される。ｈの複数のコピーがＬ２キャッシュ１０６にストアされるか又は単一のコピーがＬ２キャッシュ１０６にストアされ、入力フォーマッティング１２２を構成することによって複製される。ストリーミングエンジン１０８は、各サイクルで、Ｌ２キャッシュ１０６から３３−Ｌのｘ（ｎ）の新しい値を読み出し、Ａ（ｔ，：）を生成するように構成される。ＭＭＡ１０４は、ベクトル行列乗算のために構成され、各サイクルで、ＭＭＡ１０４は、Ｃ（ｔ，：）におけるｙ（ｎ）の３３−Ｌの値を計算する。
【００９８】
デバイス１００において、大１Ｄ畳み込み／フィルタを計算するためのストラテジは、大フィルタを２つの一層小さいフィルタフラグメントに分解することに関する下記の観察に基づく。
2020509501.tif 000021
2020509501.tif 000022
ここで、τ＝０，．．．，Ｌ−１、Ｎ＝Ｌ−１，Ｌ，．．．であり、τ１＝０，．．．，Ｌ１−１、τ２＝０，．．．，Ｌ２−１である。
【００９９】
フィルタｈは、フィルタフラグメントが可能な限り最適なサイズになるまで、上記の分解の反復的適用を用いて一層小さいフラグメントに分解される。即ち、ＭＭＡ１０４のスループットの最大化とフィルタの総数の最小化とのトレードオフとして、フィルタサイズが選択される。図１４のグラフは、フィルタフラグメントのサイズとＭＭＡ１０４のスループットとの間のトレードオフを図示する。このグラフが示すように、ＭＭＡ１０４のための最適なフィルタフラグメントサイズは、バッファ１３８、１４４の幅の約二分の一であり、即ち、ＭＭＡ１０４の計算原始関数サイズの幅の約二分の一である。幾つかの例において、一層小さいフィルタフラグメントのサイズを選択するための分解はオフラインで実施される。幾つかの例において、分解は、プロセッサ１０２によって実施される。入力の適切にシフトされたバージョンは、上記の式に従って、対応するフィルタフラグメントを用いてフィルタされ、結果が加算される。フィルタリングは、上述したように、ベクトル行列乗算を用いて実装される。
【０１００】
また、デバイス１００は、ｙ＝ｈ★ｘに従って、１Ｄ相関を実施するように構成され得る。相関は、時間反転順に、フィルタ係数を用いる畳み込みと同じである。従って、１Ｄ相関は、上述したように、小又は大１Ｄ畳み込みを用いて実装され得、入力フォーマッティング１２２は、ｈ又はｘのいずれかにおいて時間反転を実施するように構成される。
【０１０１】
また、デバイス１００は、Ｃ＝Ａ又はＣ＝Ｂに従って、行列アサイメントを実装するように構成され得る。従って、アサイメントは、Ｃ＝Ａ＊Ｉ又はＣ＝Ｉ＊Ｂとして、ＭＭＡ１０４において実施され得る。ここで、Ｉは単位行列である。
【０１０２】
また、デバイス１００は、行列転置ＢＴを実装するように構成され得る。行列の転置は、新しい行列であり、そこでは、列が、元の行列の行である。転置演算を実施するため、ＭＭＡ１０４は、Ａ行列バッファ１３８における要素がＢ行列バッファ１４４の指定された列にコピーされるべきであることを特定する演算モード、即ち、コピー演算を含む。
【０１０３】
行列の転置を実施するため、ストリーミングエンジン１０８は、Ｌ２キャッシュ１０６から行列の行の要素を読み出すように、及びＢ行列バッファ１４４にロードするために行列の各行を提供するように構成される。従って、ストリーミングエンジン１０８からの第１のベクトルが行列の第１の行、行０を含み、ストリーミングエンジンからの第２のベクトルが行列の第２の行を含む等となる。その後、バッファ１２４から行列の行をロードし、要素をＢ行列バッファ１４４の連続する列にストアする、適切に構成されたＬＳＥ命令が実行される。行列の全ての行が転置されると、適切に構成されたＬＳＥ命令が実行されて、Ｂ行列バッファのコンテンツを、Ｃ行列バッファ１３４に移動し、ＭＭＡ１０４の外に出す。
【０１０４】
その他の例
本明細書において、プロセッサがＤＳＰであり、基本計算原始関数を実施するようにデバイス１００を構成する制御ソフトウェアを実行し、原始関数の実行を制御する例が説明されてきた。他の例において、デバイス１００に結合されるホストプロセッサが、基本計算原始関数を実行するために必要な制御演算の幾つか又は全てを実施する。プロセッサは、任意の適切なタイプの電子データプロセッサ及び電子データプロセッサの組み合わせであり得る。例えば、プロセッサは、インテル社製又はアドバンストマイクロデバイス社製の一つ又は複数のプロセッサ、一つ又は複数の縮小命令セットコンピュータ（ＲＩＳＣ）、一つ又は複数の特定用途向け集積回路（ＡＳＩＣ）、一つ又は複数のデジタル信号プロセッサ（ＤＳＰ）等であり得る。
【０１０５】
ＭＭＡのバッファの次元が１×３２又は３２×３２である例が本明細書に説明されてきた。他の例において、ＭＭＡのバッファの次元は、これより小さくても大きくてもよい。
【０１０６】
特許請求の範囲内で、説明した実施形態における変更が可能であり、他の実施形態が可能である。
【図１】
2020509501.tif 000023
【図２】
2020509501.tif 000024
【図３】
2020509501.tif 000025
【図４】
2020509501.tif 000026
【図５】
2020509501.tif 000027
【図６】
2020509501.tif 000028
【図７】
2020509501.tif 000029
【図８】
2020509501.tif 000030
【図９】
2020509501.tif 000031
【図１０】
2020509501.tif 000032
【図１１】
2020509501.tif 000033
【図１２】
2020509501.tif 000034
【図１３】
2020509501.tif 000035
【図１４】
2020509501.tif 000036
【国際調査報告】
2020509501.tif 000037