(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-05-01
(45)【発行日】2023-05-12
(54)【発明の名称】行列乗算アクセラレータ(MMA)を用いる基本計算原始関数の実装
(51)【国際特許分類】
G06F 17/16 20060101AFI20230502BHJP
G06F 17/14 20060101ALI20230502BHJP
【FI】
G06F17/16 C
G06F17/16 Q
G06F17/14 510
(21)【出願番号】P 2019547631
(86)(22)【出願日】2018-03-01
(86)【国際出願番号】 US2018020462
(87)【国際公開番号】W WO2018160843
(87)【国際公開日】2018-09-07
【審査請求日】2021-02-26
(32)【優先日】2018-02-28
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2017-03-01
(33)【優先権主張国・地域又は機関】US
【前置審査】
(73)【特許権者】
【識別番号】507107291
【氏名又は名称】テキサス インスツルメンツ インコーポレイテッド
(74)【代理人】
【識別番号】230129078
【氏名又は名称】佐藤 仁
(72)【発明者】
【氏名】アーサー ジョン レッドファーン
(72)【発明者】
【氏名】ティモシー デビッド アンダーソン
(72)【発明者】
【氏名】カイ チルカ
(72)【発明者】
【氏名】チェンチー ルオ
(72)【発明者】
【氏名】ジェンフア ユー
【審査官】坂庭 剛史
(56)【参考文献】
【文献】米国特許出願公開第2013/0332498(US,A1)
【文献】特開平09-153029(JP,A)
【文献】米国特許出願公開第2008/0155002(US,A1)
【文献】米国特許出願公開第2014/0365548(US,A1)
【文献】米国特許出願公開第2015/0052332(US,A1)
【文献】QIAO, Yuran et al.,FPGA-accelerated deep convolutional neural networks for high throughput and energy efficiency,CONCURRENCY AND COMPUTATION: PRACTICE AND EXPERIENCE,米国,Wiley Online Library (John Wiley & Sons Ltd.),2016年05月06日,pp.1-20,https://onlinelibrary.wiley.com/doi/pdfdirect/10.1002/cpe.3850,DOI: 10.1002/cpe.3850
【文献】AYDONAT, Utku et al.,An OpenCL Deep Learning Accelerator on Arria 10,arXiv.org,米国,Cornell University,2017年01月13日,pp.1-10,https://arxiv.org/pdf/1701.03534.pdf
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/16
G06F 17/14
(57)【特許請求の範囲】
【請求項1】
方法であって、
プロセッサによって、
データ要素を含むデータベクトルをストリーミングするように計算原始関数に基づいてストリーミングエンジンを構成することであって、前記データベクトルが
行列乗算アクセラレータ(MMA)に含まれる第1の被乗数行列バッファの幅より大きい長さのフィルタを含み、前記フィルタが複数の一層小さいフィルタに分解され、前記一層小さいフィルタのサイズが前記第1の被乗数行列バッファの幅より小さい、前記構成することと、
前記プロセッサによって、前記計算原始関数に基づいて前記データベクトルをフォーマットすることと、
前記プロセッサによって、前記計算原始関数に基づいて
前記MMAを構成することと、
前記MMAによって、MMA出力を生成するために前記計算原始関数を実行することと、
を含む、方法。
【請求項2】
請求項1に記載の方法であって、
前記計算原始関数を実行することが、
前記MMAに含まれる第2の被乗数行列バッファにおけるデータを用いる行列乗算の実行と同時に、データを
前記第1の被乗数行列バッファにロードすることを含
む、方法。
【請求項3】
請求項1に記載の方法であって、
前記MMAを構成することが、前記
第1の被乗数行列バッファにデータをオフセットロードするように前記MMAを構成することを含む、方法。
【請求項4】
請求項2に記載の方法であって、
前記データが行列の行を含み、
前記計算原始関数を実行することが、前記データを前記
第1の被乗数行列バッファにおける列にコピーすることを更に含む、方法。
【請求項5】
請求項1に記載の方法であって、
前記プロセッサによって、前記MMA出力にゼロパディングを付加するように前記MMA出力をフォーマットすることを更に含む、方法。
【請求項6】
請求項1に記載の方法であって、
前記プロセッサによって、前記MMA出力上でシーム除去を実施するように前記MMA出力をフォーマットすることを更に含む、方法。
【請求項7】
請求項1に記載の方法であって、
前記プロセッサによって、特定のストライドに従って前記MMA出力上で列サブサンプリングを実施するように前記MMA出力をフォーマットすることを更に含む、方法。
【請求項8】
請求項1に記載の方法であって、
前記ストリーミングエンジンを構成することが、複数の特徴マップのデータをフィルタリング行列にタイル化するように前記ストリーミングエンジンを構成することを含む、方法。
【請求項9】
請求項8に記載の方法であって、
データのタイルのサイズが、前記MMA出力においてシームが存在しないように選択される、方法。
【請求項10】
請求項8に記載の方法であって、
データのタイルのサイズが、シームが常に前記MMA出力における同じ位置にあるように選択される、方法。
【請求項11】
請求項1に記載の方法であって、
前記データベクトルが、インタリーブされた実数値と虚数値とを含み、
前記MMAが、前記データベクトル上で行列乗算を実施するように構成される、方法。
【請求項12】
請求項1に記載の方法であって、
前記一層小さいフィルタのサイズが、前記MMAのスループットの最大化と
前記一層小さいフィルタの総数の最小化との間のトレードオフとして選択される、方法。
【請求項13】
デバイスであって、
メモリと、
前記メモリに結合されるプロセッサと、
前記プロセッサに結合される行列乗算アクセラレータ(MMA)であって、乗数
行列バッファと第1の被乗数
行列バッファとを含
み、MMA出力を生成するために計算原始関数を実行するように動作可能である、前記MMAと、
を含み、
前記プロセッサが、
前記計算原始関数に基づいて
、データ要素を含むデータベクトル
であって、前記第1の被乗数行列バッファの幅より大きい長さのフィルタを含む、前記データベクトルをストリーミングするように前記デバイスに含まれるストリーミングエンジンを構成し、
前記フィルタを前記第1の被乗数行列バッファの幅より小さいサイズの複数の一層小さいフィルタに分解し、
前記計算原始関数に基づいて前記データベクトルをフォーマットし、
前記計算原始関数に基づいて前記MMAを構成する、
ように動作可能である、デバイス。
【請求項14】
請求項13に記載のデバイスであって、
前記プロセッサが、前記計算原始関数を実行するように更に動作可能であり、
前記MMAに含まれる第2の被乗数行列バッファにおけるデータを用いる行列乗算の実行と同時にデータが前記第1の被乗数行列バッファにロードされる、デバイス。
【請求項15】
請求項13に記載のデバイスであって、
前記プロセッサが、前記第1の被乗数行列バッファにデータをオフセットロードするように前記MMAを構成するように更に動作可能である、デバイス。
【請求項16】
請求項14に記載のデバイスであって、
前記MMAが、前本計算原始関数を実行するように更に動作可能であり、
前記データが行列の行を含み、前記データが前記第1の被乗数行列バッファにおける列にコピーされる、デバイス。
【請求項17】
請求項13に記載のデバイスであって、
前記プロセッサが、前記MMA出力にゼロパディングを付加するように前記MMA出力をフォーマットするように更に動作可能である、デバイス。
【請求項18】
請求項13に記載のデバイスであって、
前記プロセッサが、前記MMA出力上でシーム除去を実施するように前記MMA出力をフォーマットするように更に動作可能である、デバイス。
【請求項19】
請求項13に記載のデバイスであって、
前記プロセッサが、特定のストライドに従って前記MMA出力上で列サブサンプリングを実施するように前記MMA出力をフォーマットするように更に動作可能である、デバイス。
【請求項20】
請求項13に記載のデバイスであって、
前記プロセッサが、複数の特徴マップのデータをフィルタリング行列にタイル化するように前記ストリーミングエンジンを構成するように更に動作可能である、デバイス。
【請求項21】
請求項20に記載のデバイスであって、
データのタイルのサイズが、前記MMA出力においてシームが存在しないように選択される、デバイス。
【請求項22】
請求項20に記載のデバイスであって、
シームが前記MMA出力における同じ位置に存在するように、データのタイルのサイズが選択される、デバイス。
【請求項23】
請求項13に記載のデバイスであって、
前記データベクトルがインタリーブされた実数値と虚数値とを含み、
前記MMAが、前記データベクトル上で行列乗算を実施するように構成される、デバイス。
【請求項24】
請求項13に記載のデバイスであって、
前記一層小さいフィルタのサイズが、前記MMAのスループットの最大化と前記一層小さいフィルタの総数の最小化との間のトレードオフとして選択される、デバイス。
【発明の詳細な説明】
【技術分野】
【0001】
音声認識、インテリジェント産業用制御、オブジェクト検出及び認識、及び映像等の応用例は、ますます組み込みデバイスに移行されつつある。そのようなデバイスにおいて、そのような応用例に用いられるアルゴリズムの計算需要をサポートするために、ハードウェアアクセラレーションが必要とされ得る。
【発明の概要】
【0002】
本明細書において説明される例は、行列乗算アクセラレータを用いて基本計算原始関数(primitives)を実装することに関する。一つの態様において、デバイスにおいて基本計算原始関数を実施するための方法が提供され、このデバイスはプロセッサ及び行列乗算アクセラレータ(MMA)を含む。この方法は、メモリからの基本計算原始関数に対してデータをストリーミングするためのデバイスにおけるストリーミングエンジンを構成すること、データをフォーマットするようMMAを構成すること、及びそのデバイスによって基本計算原始関数を実行することを含む。
【0003】
一つの態様において、メモリ、メモリに結合されるプロセッサ、及びプロセッサに結合される行列乗算アクセラレータ(MMA)を含むデバイスが提供され、MMAは、乗数バッファ及び第1の被乗数バッファを含む。デバイスは、メモリからの基本計算原始関数に対してデータをストリーミングするためのデバイスにおけるストリーミングエンジンを構成し、データをフォーマットするようMMAを構成し、及び基本計算原始関数を実行するように動作可能である。
【図面の簡単な説明】
【0004】
【
図1】プロセッサに結合される行列乗算アクセラレータ(MMA)を用いて基本計算原始関数を実装するように構成可能な例示のデバイスを図示する。
【0005】
【
図2】
図1のデバイスにおいて基本計算原始関数を実行するための方法のフローチャートである。
【0006】
【
図3】
図1のデバイスにおけるバッチ小行列行列乗算の実装を図示する例である。
【0007】
【
図4】
図1のデバイスにおける大行列行列乗算の実装を図示する例である。
【0008】
【
図5】
図1のデバイスにおける行列行列点状乗算の実装を図示する例である。
【0009】
【
図6】
図1のデバイスにおける行列行列加算の実装を図示する例である。
【0010】
【
図7】
図1のデバイスにおける小ベクトル行列乗算の実装を図示する例である。
【0011】
【
図8】
図1のデバイスにおける小ベクトル総和の実装を図示する例である。
【0012】
【
図9】
図1のデバイスにおけるアフィン変換の実装を図示する例である。
【0013】
【
図10】
図1のデバイスにおける二次元(2D)畳み込みの実装を図示する例である。
【
図11】
図1のデバイスにおける二次元(2D)畳み込みの実装を図示する例である。
【0014】
【
図12】
図1のデバイスにおける行列行置換の実装を図示する例である。
【0015】
【
図13】
図1のデバイスにおけるベクトル列置換の実装を図示する例である。
【0016】
【
図14】フィルタサイズとスループットとのトレードオフを図示すグラフである。
【発明を実施するための形態】
【0017】
一貫性のため、図における類似の要素は類似の参照番号で示される。
【0018】
本明細書に説明される例は、音声認識、インテリジェント産業用制御、オブジェクト検出及び認識、及び映像等の、行列乗算アクセラレータ(MMA)を用いる応用例により用いられる基本計算原始関数の実装を提供する。基本計算原始関数は、例えば、畳み込みニューラルネットワーク(CNN)において用いられるような二次元(2D)畳み込み、小及び大行列行列乗算、行列行列点状乗算、行列行列加算、ベクトル行列乗算、ベクトル総和、アフィン変換、高速フーリエ変換、離散コサイン変換、畳み込み、相関、行列アサイメント、行列置換、及び行列転置を含む。
【0019】
図1は、プロセッサ102に結合される行列乗算アクセラレータ(MMA)104を用いて、本明細書で上述されたもの等の基本計算原始関数を実装するように構成可能な例示のデバイス100を図示する。MMA104は、行列乗算を実施するための機能性を含む。行列乗算は、2つの行列から行列を生成する二項演算である。具体的には、乗数行列AがM×K行列であり、被乗数行列BがK×N行列である場合、これら2つの行列の行列積はM×N行列Cであり、その場合、Aの行nを横切るm要素に、Bの列Kを下に向かうm要素を掛け、総和して要素C
mnを生成する。
【0020】
MMA104は、2つのB行列をストアするための16ビット要素の2つの32×32被乗数バッファ144及び2つのC行列をストアするための16ビット要素の2つの32×32結果バッファ134をストアするために充分なメモリを含む。被乗数バッファ144は、本明細書においてB行列バッファと称され得、結果バッファ134は、本明細書においてC行列バッファと称され得る。MMA104は更に、乗数行列Aの行をストアするための16ビット要素の1×32乗数バッファ138をストアするためのメモリを含む。乗数バッファ138は、本明細書においてA行列バッファと称され得る。本明細書において説明されるように、B行列バッファ144は、ピンポンバッファとして用いられ、一方のバッファのデータが演算実行のために用いられるときに、他方のバッファにデータがバックグラウンドでロードされる。同様に、C行列バッファ134はフォアグラウンド及びバックグラウンドバッファとして用いられ、例えば、一方のバッファのコンテンツがMMA104から出力される間に、演算実行の結果が別のバッファにストアされる。
【0021】
各サイクル上で、MMA104は、単一の命令、即ち、本明細書においてLSE命令と称されるロード、ストア、及び命令実行を実施する。この名称が示唆するように、MMA104は、単一のサイクルにおいて、ロード演算、ストア演算、実行演算を実施し得る。概して、或るサイクルにおいて、データのベクトルがA行列バッファ138にロードされ、選択されたB行列バッファ144にストアされたB行列とA行列バッファ138におけるデータベクトルとの間で行列乗算演算が実施される。従って、A行列バッファ138のデータベクトルと選択されたB行列バッファ144におけるB行列の各列との行列積が計算される。行列乗算演算の結果は、データ要素の行であり、それは選択されたC行列バッファ134におけるC行列の行にストアされる。LSE命令のフィールドのコンテンツに応じ、サイクルが、データの行を行列乗算に用いられていないB行列バッファ、即ちバックグラウンドB行列バッファ、にロードすること、C行列バッファからのデータの行を外部メモリにストアすること、及び/又は、選択されたC行列バッファ134に結果をストアする前に、行列積演算の結果上で特定の演算を実施することも含み得る。
【0022】
LSE命令のロード演算部は、A行列バッファ138にロードされるべきデータのバッファ124における位置と、B行列バッファ144にロードされるべきデータのバッファ128における位置と、ロード演算のターゲットであるB行列バッファ144と、ロードされるべきターゲットB行列バッファにおける行とを識別するフィールドを含む。ロード演算部はまた、ロード演算が実施されるべきか否かを示すためのフィールドも含む。
【0023】
LSE命令のストア演算部は、C行列バッファ134におけるデータがストアされるべきバッファ118内の位置と、ストアされるべきデータを保持するC行列バッファ134と、ストアされるべきデータを含むターゲットC行列バッファ134における行とを識別するフィールドを含む。ストア演算部はまた、ストア演算が実施されるべきか否かを示すためのフィールドも含む。
【0024】
LSE命令の実行演算部は、ターゲットC行列バッファ134、及び実行演算の結果を受け取るべきターゲットC行列バッファ134における行と、ターゲットC行列バッファ134にストアする前に行列乗算の結果を用いて実施すべき演算とを識別するフィールドを含む。特定され得る演算は、=、+=、-=、又はnoneである。=演算は、結果を、変更なしに、特定された行に直接ストアさせる。+=演算は、結果における要素を、特定された行における対応する要素に加算させ、加算の結果が、特定された行のコンテンツに置き換わる。-=演算は、結果における要素を、特定された行における対応する要素から減算させ、減算の結果が、特定された行のコンテンツに置き換わる。none演算は、その名が示唆するように、演算が実施されないことを示す。none演算は、例えば、行列乗算を実施する前の、データのB行列バッファ144への初期ロードの間、又は、C行列バッファ134にストアされた最終結果をMMA104の外に移動させるときに用いられる。
【0025】
MMA104は更に、それぞれ、MMA104によるデータ出力及びMMA104へのデータ入力をフォーマットするための、構成可能なフォーマットコンポーネント130、136、140を含む。フォーマットAコンポーネント136及びフォーマットBコンポーネント140は、例えば、16ビット浮動小数点、16ビット固定小数点符号あり、16ビット固定小数点符号なし、8ビット固定小数点符号あり、及び8ビット固定小数点符号なし、及びQポイント、即ち、固定小数点入力に対する小数点以下ビットの数等、特定されたタイプに従って、それぞれの入力データをフォーマットするように構成可能である。フォーマットCコンポーネント130は、例えば、16ビット浮動小数点、16ビット固定小数点符号あり、16ビット固定小数点符号なし、8ビット固定小数点符号あり、及び8ビット固定小数点符号なし、及びQポイント、即ち、固定小数点出力に対する小数点以下のビット数等、特定されたタイプに従って出力データをフォーマットするように構成可能である。フォーマットAコンポーネント136は更に、L2 106におけるAデータを、メモリを節約するため4ビット精度でストアさせ、A行列バッファ138において、均一である必要がない4ビットから16ビットへのマッピングを用いて、16ビットに拡張させることを可能にするルックアップテーブル(LUT)を定義するように構成可能である。これは、潜在的に、全ての計算原始関数に対して有用であり、特に、CNNスタイル2D畳み込みに対して有用である。
【0026】
MMA104はまた、B行列バッファ144にロードされるべきデータの行の各要素に対しオフセットを特定するように構成可能な行オフセットコンポーネント142を含む。行オフセットコンポーネント142は、行における32個の要素の各々に対して1つの、32個の5ビットオフセット値をストアする。行オフセットコンポーネント142において特定された行オフセット値は、要素を、LSE命令のロード部において特定された行番号とは異なるバックグラウンドB行列バッファにおける異なる行にロードされているデータ要素の行に置くために用いられ得る。データ要素に対応するオフセット値は、LSE命令のロード部において特定されたB行列バッファの行番号に加算されて、データ要素がロードされることになるB行列バッファの行を決定する。データ要素の列番号は影響されない。
【0027】
より具体的には、MMA104のサイクル上で、データの新しい行が、バックグラウンドB行列バッファ、即ち、実行のために用いられていないB行列バッファ144、にロードされ得る。データの行における全ての要素に対し、行オフセットコンポーネント142における行オフセット値がゼロである場合、データ要素は、サイクルに対するLSE命令において特定されるバックグラウンドB行列バッファの行にロードされる。例えば、データの新しい行を、バックグラウンドB行列バッファの第1の行にロードするとき、第1の要素は行1、列1にロードされ、第2の要素は行1、列2にロードされる等となる。しかしながら、行オフセットコンポーネント142における行オフセット値が非ゼロである場合、対応するデータ要素がロードされる行は、LSE命令において特定される行及び行オフセット値によって決定される。例えば、行オフセット値が0、1、2、...31であると想定する。LSE命令においてバックグラウンドB行列バッファの第1の行が特定されているデータの新しい行をロードするとき、第1の要素は行1、列1にロードされ、第2の要素は行2、列2にロードされ、第3の要素は行3、列3にロードされる等となり、従って、バックグラウンドB行列バッファにおいて対角線を形成する。
【0028】
MMA104は更に、C行列バッファ134の出力に非線形性を適用するための、構成可能な非線形性コンポーネント132を含む。実装される非線形性は、正規化線形関数(ReLU)であり、有効化されると、要素毎にC行列バッファ134の出力に適用される。非線形性コンポーネント132に対する入力が負である場合、非線形性コンポーネント132の出力をゼロに設定し、非線形性コンポーネント132の入力が負でない場合、非線形性コンポーネント132の出力を非線形性の入力に設定する。
【0029】
例示のデバイス100において、プロセッサ102は、レベル1データ(L1D)キャッシュメモリ112、レベル2(L2)統合命令及びデータキャッシュメモリ106、及び2つのストリーミングエンジン(SE0及びSE1)108、110を含むデジタル信号プロセッサ(DSP)である。そのようなプロセッサの例は、本明細書に参照として組み込まれる、2017年3月28日発行の米国特許番号US9,606,803に記載されている。また、ストリーミングエンジンの例は、米国特許番号US9,606,803、及び本明細書に参照として組み込まれる、2017年10月26日公開の米国特許出願公開番号US2017/0308381に記載されている。
【文献】米国特許番号US9,606,803
【文献】米国特許出願公開番号US2017/0308381
【0030】
プロセッサ102は、MMA104に対する入力データのソースとして動作するように、及びMMA104から出力データを受け取るように構成される。より具体的には、プロセッサ102は、それぞれのレジスタファイル120、126におけるストリーミングエンジン108、110からMMA104のためのデータベクトルを受け取るように、及び、デバイス100によって実行されている基本計算原始関数のため必要に応じて、フォーマッティング122をデータに適用するように、及び、MMA104による消費のためにそれぞれのバッファ124、128にデータベクトルをストアするように構成される。ソースAバッファ124は、A行列バッファ138にロードされるべきデータをストアし、ソースBバッファ128は、B行列バッファ144にロードされるべきデータをストアする。
【0031】
入力フォーマッティング122の例としては、ゼロパディング、偶数/奇数ベクトル生成、値コピー、既知行列生成、及び連係演算が含まれる。偶数/奇数ベクトル生成は、2つのベクトルを受け取る。偶数オプションが選択される場合、MMA104への入力に対する出力ベクトルを生成するために、2つのベクトルの全ての偶数要素が用いられる。奇数オプションが選択される場合、出力ベクトルを生成するために、2つのベクトルの全ての奇数要素が用いられる。偶数/奇数フォーマッティングは、例えば、1より大きいストライドを用いる高速フーリエ変換(FFT)及び畳み込みに有用である。値コピーフォーマッティングは、MMA104への入力に対するベクトルを生成し、L2 106から読み出されるスカラー値が、ベクトルの全ての要素に対して複製される。値コピーは、例えば、バイアス生成に対して有用である。既知行列生成フォーマッティングは、MMA104への入力に対する出力ベクトルのシーケンスを生成し、それらはともに、単位行列等の共通既知行列パターンを形成する。ゼロパディングフォーマッティングは、MMA104への入力の前にベクトルにゼロを追加する。連係演算は、MMA104の出力ベクトルを取り、そのベクトルをA行列バッファ138又はB行列バッファ144のために、MMA104に対する入力として提供する。連係演算は、例えば、Z=W*X*Yスタイルの演算のために有用である。
【0032】
プロセッサ102はまた、デスティネーションCバッファ118におけるMMA104からデータベクトルを受け取るように、及び、フォーマッティング116を、デバイス100によって実行されている基本計算原始関数のために、必要に応じてデータに適用するように、及び、データベクトルをレジスタファイル114にストアするように構成される。データベクトルは、レベル1データキャッシュ112及びレベル2統合キャッシュ106を介して外部メモリ(図示されない)にストアされる。出力フォーマッティング116の例としては、シーム除去、ストライド除去、ゼロパディング、及び行列転置が含まれる。
【0033】
ストリーミングエンジン108、110は、データ要素のストリームをレベル2キャッシュ106からそれぞれのレジスタファイル120、126に転送するように構成される。ストリームは、同じタイプ及びサイズの要素のシーケンスであると定義される。ストリーミングエンジン120、126は、下記のストリーム属性を特定することによって、基本計算原始関数に特有のストリームを定義するようにプログラム可能である。ストリーム属性は、ストリームの第1の要素のアドレス、ストリームにおける要素のサイズ及びタイプ、ストリームにおけるデータのフォーマッティング、及びストリームに関連するアドレスシーケンス、即ち、それらをストリームに置くために要素にアクセスするアドレス順である。ストリームが開始されると、ストリーミングエンジン120、126が、アドレスを計算し、L2から定義されたデータタイプをフェッチし、ゼロ拡張又は符号拡張等の任意の特定されたデータタイプフォーマッティングを実施し、データをベクトルにマッピングし、データベクトルを直接それぞれのレジスタファイル120、126に搬送する。
【0034】
ストリーミングエンジン108、110のアドレスシーケンスは、多次元メモリアクセスを可能にする。従って、各ストリーミングエンジン120、126は、ストリームの要素に対するアドレスシーケンスを、メモリをウォークスルーするポインタによって実行する。各ストリーミングエンジン120、126は、ポインタが取るべき経路を制御するマルチレベルパラメータ化ネスト化ループを実装する。このネスト化ループにおいて、ループレベルに対する反復カウントが、そのレベルにおいてループが反復する回数を示し、ループレベルに対する次元が、そのループレベルにおけるポインタ位置間の距離を定義する。
【0035】
最も内側のループ、即ち、ループ0は、メモリから物理的に連続する要素を消費し、1の暗示的次元を有し、ポインタは要素から要素に連続的に移動し、このループレベルにおける順序を上げる。内側ループの外側の各レベルにおいて、ループは、ループに対して特定された次元のサイズに基づいて、ポインタを新しい位置に移動させる。このアドレッシングのフォームによって、プログラムが、メモリを介した正規経路を少数のパラメータで特定できる。
【0036】
表1は、そのような、6レベルを用いてネスト化されたループに対する例示の疑似コードを示す。この疑似コードにおいて、ICNTxはレベルxに対する反復カウントであり、DIMxはレベルxに対する次元であり、ELEM_BYTESは、バイトでの各要素のサイズである。他の例において、ネスト化されたループは、これより多い又はこれより少ないレベルを有し得る。
【表1】
【0037】
また、プロセッサ102は、デバイス100に対して定義された各基本計算原始関数に対する制御ソフトウェアを実行する。制御ソフトウェアは、必要に応じて、ストリーミングエンジン108、110及びMMA104の構成に基本計算原始関数を実施させ、MMAの実行を制御し、基本計算原始関数のために必要な任意の入力フォーマッティング122及び/又は出力フォーマッティング116を適用させる。
【0038】
図2は、デバイス100において基本計算原始関数を実行するための方法のフローチャートである。初期的に、基本計算原始関数のための制御ソフトウェアが、基本計算原始関数のためのデータ要素を、必要な順序にストリーミングするように、ストリーミングエンジン108、110を構成する(200)。従って、制御ソフトウェアは、基本計算原始関数のストリーム属性を、ストリーミングエンジン108、110の各々に通信する。基本計算原始関数に応じて、一方又は双方のストリーミングエンジンが用いられ得る。概して、ストリーミングエンジン108は、A行列バッファ138のためのデータ要素をストリーミングするように構成され、ストリーミングエンジン110は、B行列バッファ144のためのデータ要素をストリーミングするように構成される。異なる基本計算原始関数のためにストリーミングエンジン108、110を構成する例が本明細書に記載される。
【0039】
制御ソフトウェアはまた、行列乗算を用いて基本計算原始関数を実施するために必要に応じ、MMA104を構成する(202)。従って、制御ソフトウェアは、フォーマットコンポーネント130、136、140、行オフセットコンポーネント142、及び非線形性コンポーネント132を、基本計算原始関数のための必要に応じて構成する。異なる計算原始関数のためにMMA104を構成する例が本明細書に記載される。
【0040】
構成が完了すると、制御ソフトウェアは、構成されたストリーミングエンジン108、110を開始し(204)、構成された基本計算原始関数を実行する(206)。概して、基本計算原始関数を実行するために、制御ソフトウェアは、MMA104にLSE命令のシーケンスを実行させて、データ要素をA行列バッファ138及びバックグラウンドB行列バッファ144にロードし、A行列バッファ138とフォアグラウンドB行列バッファ144との間で行列乗算を実行し、行列乗算の結果を選択されたC行列バッファ134にストアし、データをバックグラウンドC行列バッファ134からバッファ118に移動させる。MMA104において構成される任意のフォーマッティング及びオフセットが、データ要素がバッファ138、144にロードされる前に、及び結果がC行列バッファ134からバッファ118に移動されるときに、適用される。基本計算原始関数の実行の一部として、制御ソフトウェアはまた、基本計算原始関数に固有の入力フォーマッティング122及び出力フォーマッティング116をプロセッサ102上で実施させる。
【0041】
図3は、
図1のデバイス100におけるバッチ小行列行列乗算の実装を図示する例である。充分に小さい行列の場合、複数の被乗数行列XをB行列バッファ144に対角線状にロードし、A行列バッファ138においてロードされた対応する乗数行列Hを掛けることによって、複数の行列乗算Y=H*Xが単一バッチにおいて実施され得る。
図3に示されるように、被乗数行列がK×Nであり、対応する乗数行列がM×Kであり、K、N、及びMが、32より小さいと仮定する。バッチサイズT、即ち、B行列バッファ144に対角線状にロードされ得る被乗数行列Xの数は、T=floor(32/max(K,N))である。このように、T個の被乗数行列X(t),t=0,1,...,T-1,は、B行列バッファ144に対角線状にロードされ得、T個の乗数行列H(t)ができる。
【0042】
この原始関数を実施するため、T個のH行列はL2キャッシュ106にストアされ、その結果、T個のH行列の各々の第1の行を含むT*K連続要素があり、その後にZK個の0が続き、T個のH行列の各々の第2の行を含むT*K連続要素があり、その後にZK個の0が続き、...、H行列の各々のM番目の行のT*K連続要素があり、その後にZK個の0が続く。ここで、ZK=32-T*Kである。また、T個のX行列はL2キャッシュ106にストアされ、その結果、T個のX行列の各々の第1の行を含むT*N連続要素があり、その後にZN個の0が続き、T個のX行列の各々の第2の行を含むT*N連続要素があり、その後にZN個の0が続き、...、T個のX行列の各々のM番目の行のT*N連続要素があり、その後にZN個の0が続く。ここでZN=32-T*Nである。
【0043】
ストリーミングエンジン110は、L2キャッシュ106からT個のX行列の要素を読み出すように、及び、MMA104のB行列バッファ144にロードするために、T個のX行列の連続行の要素を含むベクトルを提供するように構成される。ストリーミングエンジン108は、L2キャッシュ106からT個のH行列の要素を読み出すように、及び、A行列バッファ138にロードするために、T個のH行列の連続行の要素を含むベクトルを提供するように構成される。
【0044】
MMA104の行オフセットコンポーネント140は、ストリーミングエンジン110からの各ベクトルの行の要素を、オフセットt*KでB行列バッファ144にロードさせるように構成される。このように、X(0)からの行の要素は、0のオフセットを用いてロードされ、X(1)からの行の要素は、Kのオフセットを用いてロードされ、X(2)からの行の要素は、2Kのオフセットを用いてロードされる等となる。
【0045】
乗算を実施するため、適切に構成されたLSE命令がMMA104上で実行されて、B行列バッファ144にX行列の初期バッチをロードする。B行列バッファがロードされると、更なるLSE命令が実行されて、対応するH行列の行をA行列バッファ138にロードし、乗算を実施し、結果をC行列バッファ134にストアする。また、複数のバッチが処理される場合、LSE命令はまた、X行列の別のバッチをバックグラウンドB行列バッファ144にロードし、前のバッチの結果をC行列バッファ134からMMA104の外に移動させる。このように、バッチ小行列行列乗算を実施するため、T*K要素が、Mサイクルの間、A行列バッファ138にロードされ、T*N要素が、Kサイクルの間、B行列バッファ144(初期バッチ以外、バックグラウンドにおいて)にロードされ、T*N要素が、Mサイクルの間、C行列バッファから外に移動される。
【0046】
他の例において、ZK及びZN個の0をL2キャッシュ106にストアするのではなく、ストリーミングエンジン108、110又は入力フォーマッティング122がゼロパディングを実施するように構成されて、ベクトルをソースAバッファ124又はソースBバッファ128にストアする前に、必要な数のゼロを各ベクトルに付加する。
【0047】
図4は、
図1のデバイス100における大行列行列乗算Y=H*Xの実装を図示する例であり、ここで、被乗数行列X及び乗数行列Hは、B行列バッファ144及びA行列バッファ138より大きい次元を有する。この例は、被乗数行列Xの次元が32K×32Nであり、乗数行列Hの次元が32M×32Kであること、即ち、これらの行列の各々の次元が32で均一に割り切れること、を仮定している。このように、Y行列の次元は、32M×32Nである。行列X及びHは32×32タイルに分割される。従って、行列のタイルT(m,n)が、行(32*m):32*((m+1)-1)、及び列(32*n):(32*(n+1)-1)から形成される。
図4に図示されるように、Hタイルの行のXタイルの列との行列乗算が、Hのタイル行1とXのタイル列1の行列乗算によって生成されるタイルY(1、1)等、単一の対応するYタイルを生成する。
【0048】
表2は、MMA104によるこの原始関数のパフォーマンスを図示する例示の疑似コードである。疑似コードは、ストリーミングエンジン108が、L2キャッシュ106から乗数行列Hの要素を読み出すように、及びベクトルをA行列バッファ138に提供するように構成されることを仮定し、その結果、Hタイルの各行がN回ロードされ、即ち、H(0,0:(K-1))がN回ロードされ、H(1,0:(K-1))がN回ロードされ、H(2、0:(K-1))はN回ロードされる等となる。従って、H行列の全ての行が、L2キャッシュ106に連続してストアされる。ストリーミングエンジン108は、シーケンス、H(0,0),H(0,1),...,H(0,K-1)をN回ロードし、...、その後、シーケンス、H(1,0),H(1,1),..,H(1,K-1)をN回ロードし、その後、シーケンス、H(M-1,0),H(M-1,1),...,H(M-1、K-1)をN回ロードするように構成される。
【0049】
また、疑似コードは、ストリーミングエンジン110が、L2キャッシュ106からXタイルの要素を読み出すように、及びB行列バッファ144にM回ロードされるべき各Xタイルを提供するように、即ち、ロードのシーケンス[X(0:(K-1),0),...,X(0:(K-1),N-1)]がM回繰り返されるように構成されることを仮定している。従って、X行列の全ての行がL2キャッシュ106に連続してストアされる。ストリーミングエンジン110は、X(0,0),X(1,0),...,X(K-1,0),X(0,1),X(1,1),...,X(K-1,1),...,X(0,N-1),X(1,N-1),...,X(K-1,N-1)をN回ロードするように構成される。
【0050】
この疑似コードにおいて、Bbackは、B行列バッファ144のカレントのバックグラウンドバッファを示し、Bforeは実行に用いられるカレントのフォアグラウンドバッファを示す。
【表2】
【0051】
図5は、
図1のデバイス100における行列行列点状乗算C=A.*Bの実装を図示する例である。行列行列点状乗算において、行列A、B、Cの次元は、例えばm×nのように、同じであり、要素C(m,n)は、A(m,n)とB(m,n)との積である。デバイス100において、C=A.*Bは、C(k,:)=A(k,:)*diag(B(k,:)),k=0,...,31として実装され得る。従って、点状乗算は、B行列の各行の要素をB行列バッファ144に対角線上にロードすること、及びA行列バッファ138にロードされたA行列の対応する行で行列乗算を実施することによって実装され得る。
図5の例は、A行列及びB行列の行に対するこれを図示し、m=n=32と仮定する。
【0052】
この原始関数を実施するため、ストリーミングエンジン110は、L2キャッシュ106からB行列の要素を読み出すように、及びMMA104のB行列バッファ144にロードするためB行列の各行を提供するように構成される。従って、ストリーミングエンジン110からの第1のベクトルは、B行列の第1の行、行0を含み、ストリーミングエンジンからの第2のベクトルは、B行列の第2の行を含む等となる。ストリーミングエンジン108は、L2キャッシュ106からA行列の要素を読み出すように、及び、A行列バッファ138にロードするためA行列の各行を提供するように構成される。従って、ストリーミングエンジン108からの第1のベクトルは、A行列の第1の行、行0を含み、ストリーミングエンジンからの第2のベクトルは、A行列の第2の行を含む等となる。
【0053】
MMA104の行オフセットコンポーネント140は、B行列の行の要素をB行列バッファ144に対角線状にロードさせるように構成される。従って、行要素に対するオフセットは、行の第1の要素が行0、列0にロードされ、第2の要素が行1、列1にロードされ、第3の要素が行2、列2にロードされる等のように、0から31にわたる逐次値に設定される。
【0054】
点状乗算を実施するため、適切に構成されたLSE命令が、MMA104上で実行されて、B行列バッファ144にB行列の初期の行がロードされる。B行列バッファがロードされると、更なるLSE命令が実行されて、A行列の対応する行をA行列バッファ138にロードし、行列乗算を実施し、結果をC行列バッファ134の対応する行にストアする。更に、LSE命令はまた、B行列の次の行をバックグラウンドB行列バッファ144にロードする。B行列の行をバックグラウンドB行列の対角線上にロードし、フォアグラウンドB行列バッファ上で行列乗算を実行し、結果をストアするこのプロセスは、B行列の全ての行が処理されるまで繰り返される。その後、C行列バッファ134のコンテンツをMMA104の外に移動するためのLSE命令が実行される。
【0055】
図6は、
図1のデバイス100における、行列行列加算C=A+Bの実装を図示する例である。行列行列加算において、行列A、B、Cの次元は、例えばm×m等、同じであり、要素C(m,n)は、A(m,n)とB(m,n)との合計である。MMA104を用いて、C=A+Bは、C=A*I+B*Iとして実装され得、ここで、Iは単位行列である。より具体的には、
図6に示されるように、C=A+Bは、C=A*Iとして実装され得、その後にC+=B*Iが続く。また、C=A+Bは、C=B*Iとして実装され得、その後にC+=A*Iが続く。単位行列は、主対角線の全ての要素が1であり他の全ての要素がゼロである正方行列である。所与の行列に単位行列を掛ける効果は、所与の行列を変化させずに残すことである。
【0056】
この原始関数を実施するため、ストリーミングエンジン108は、L2キャッシュ106からAの要素を読み出すように、及びA行列バッファ138にロードされるべきAの各行を提供するように構成される。入力フォーマッティング122は、B行列バッファ144にロードされるべき単位行列Iのベクトルを生成するように構成される。適切に構成されたLSE命令がMMA104において実行されて、Aの各行をA行列バッファ138にロードし、A行列バッファ138にロードされたAの行と、B行列バッファ144の単位行列との間で行列乗算を行い、結果をC行列バッファ134の対応する位置にストアする。=演算は、LSE命令において、結果をC行列バッファにストアするためのものとして特定される。このように、Aの各要素が、変更なしに、C行列バッファの対応する位置にストアされる。
【0057】
ストリーミングエンジン108は、その後、L2キャッシュ106からBの要素を読み出すように、及びA行列バッファ138にロードされるべきBの各行を提供するように構成される。適切に構成されたLSE命令がMMA104において実行されて、Bの各行をA行列バッファ138にロードし、A行列バッファ138にロードされたBの行とB行列バッファ144の単位行列との間で行列乗算を行い、結果を、A*Iの結果をストアするC行列バッファ134の対応する位置にストアする。+=演算は、LSE命令において、結果をC行列バッファにストアするためのものと特定されており、従って、Bの各データ要素の値を、C行列バッファの対応する位置にストアされているAの対応する要素の値に加算させる。その後、C行列バッファ134のコンテンツをMMAの外に移動させるためLSE命令が実行される。
【0058】
図7は、
図1のデバイス100における小ベクトル行列乗算y=x*Hの実装を図示する例である。定数行列Hの場合、Hブロックの複数コピーを、対角線状に、B行列バッファ144にロードすること、対応するxベクトルをA行列バッファ138にロードすること、及び、行列乗算を実施することによって、複数のxベクトルによる乗算が単一のバッチにおいて計算され得る。
図7に示されるように、HはK×N行列であり、各xベクトルは1×Kであると仮定する。バッチサイズT、即ち、B行列バッファ144ブロックに対角線状にロードされ得るHのコピーの数は、T=floor(32/max(K,N))である。このように、HのT個のコピーは、B行列バッファ144ブロックに対角線状にロードされ得、対応するベクトルx(t),t=0,1,...,T-1,はA行列バッファ138にロードされ得る。
【0059】
この原始関数を実施するため、ストリーミングエンジン108は、L2キャッシュ106からT個の対応するxベクトルの要素を読み出すように、及びA行列バッファ138にロードするためにベクトルを提供するように構成される。従って、ストリーミングエンジン108からのベクトルは、x(0),...x(T-1)の要素を含む。ストリーミングエンジン108を介するベクトルのロードは、
図3を参照して説明されるものに類似し、ここで、M=1である。ストリーミングエンジン110は、L2キャッシュ106からH行列の要素を読み出すように、及びH行列の連続する行の要素を含む、MMA104のB行列バッファ144にロードするためにベクトルを提供するように構成される。H行列を複製するため、適切なゼロパディングを用いるH行列の行の複数のコピーが、L2キャッシュ106に連続してストアされる。或いは、入力フォーマッティング122又はストリーミングエンジン110のいずれかが、Hの各行をT回複製し、適切なゼロパディングを付加するように構成される。
【0060】
MMA104の行オフセットコンポーネント140は、ストリーミングエンジン110からの各ベクトルにおける行の要素を、オフセットt*KでB行列バッファ144にロードさせるように構成される。このように、H行列の複製された行0の要素は、0のオフセットでロードされ、H行列の複製された行1の要素は、Kのオフセットでロードされ、H行列の複製された行2の要素は、2Kのオフセットを用いてロードされる等となる。
【0061】
乗算を実施するため、適切に構成されたLSE命令がMMA104上で実行されて、複製されたH行列の初期バッチをB行列バッファ144にロードする。B行列バッファがロードされると、更なるLSE命令が実行されて、対応するxベクトルのベクトルをA行列バッファ138にロードし、乗算を実施し、結果をC行列バッファ134にストアする。また、複数のバッチが処理されるべき場合、適切に構成されたLSE命令が別のベクトルをA行列バッファ138にロードし、乗算を実施し、前に計算されたベクトルをA行列バッファ138にストアする。B行列バッファ144は、A行列バッファ138にロードされる各新しいベクトルに対してリロードされる必要はない。
【0062】
図8は、デバイス100における小ベクトル総和の実装を図示する例である。ベクトル総和は、y=sum(x)として表され得、ここで、yはベクトルの要素の和である。充分に小さいベクトルの場合、複数のxベクトルをA行列バッファ144にロードすること、対角線上の1のベクトルのコピーをB行列バッファ144にロードすること、及び行列乗算を実施することによって、複数の総和が単一バッチにおいて計算され得る。
図8に示されるように、各xベクトルが1×Kであると仮定する。バッチサイズT、即ち、A行列バッファ138にロードされ得るベクトルの数は、T=floor(32/K)である。このように、x(t),t=0,1,...,T-1,はA行列バッファ138にロードされ得、全ての1のK×1ベクトルのT個のコピーが、B行列バッファ144にロードされるべきである。
【0063】
この原始関数を実施するため、ストリーミングエンジン108は、L2キャッシュ106からxベクトルを読み出すように、及びA行列バッファ138にロードするために、T個のxベクトルを含むベクトルを提供するように構成される。したがって、ストリーミングエンジン108からのベクトルは、ベクトルx(0),...,x(T-1)を含む。ストリーミングエンジン108を介するベクトルのロードは、
図3を参照して説明されるものに類似し、ここでM=1である。更に、入力フォーマッティング122は、B行列バッファ144において対角線上にロードされるべき全ての1のK×1ベクトルを生成するように構成される。
【0064】
総和を実施するため、適切に構成されたLSE命令がMMA104上で実行されて、全ての1の1×Kベクトルの複数のコピーを、B行列バッファ144に対角線上にロードする。B行列バッファがロードされると、更なるLSE命令が実行されて、x(0)...x(T-1)ベクトルをA行列バッファ138にロードし、乗算を実施し、結果をC行列バッファ134の行にストアする。また、複数のバッチが処理されるべき場合、適切に構成されたLSE命令がA行列バッファ138に別のベクトルをロードし、乗算を実施し、前に計算されたベクトルをストアする。B行列バッファ144は、A行列バッファ138にロードされる新しいベクトル毎にリロードされる必要はない。
【0065】
図9は、デバイス100におけるアフィン変換の実装を図示する例である。アフィン変換はy=x*H+vとして表され得、y=[x1]*[H;v]として計算され得る。行列H及びベクトルvが、複数の変換にわたって一定である場合、[H;v]ブロックの複数のコピーを対角線状にB行列バッファ144にロードすること、対応するxベクトルをA行列バッファ138にロードすること、及び行列乗算を実施することによって、アフィン変換がバッチで計算され得る。
図9に示されるように、Hが(K-1)×N行列であり、vが1×Nであり、各xベクトルが1×(K-1)であると仮定する。バッチサイズT、即ち、B行列バッファ144ブロックに対角線状にロードされ得る[H;v]のコピーの数は、T=floor(32/max(K,N))である。このように、[H;v]のT個のコピーが、B行列バッファ144にブロックで対角線状にロードされ得、対応するベクトルx(t),t=0,1,...,T-1,は、A行列バッファ138にロードされ得る。
【0066】
この原始関数を実施するため、ストリーミングエンジン110は、L2キャッシュ106からH行列及びvの要素を読み出すように、及びMMA104のB行列バッファ144にロードするためにベクトルを提供するように構成される。vと連結されるH行列を複製するために、HのK-1行が連続してL2キャッシュ106にストアされ、その後にvの1行が続き、入力フォーマッティング122は、これをT回複製し、Zn個の0を付加するように構成される。或いは、Hの各行のT個のコピーが連続してL2キャッシュ106にストアされ、それぞれの後にZn個の0が続き、その後、vのT個のコピーが連続してL2キャッシュ106にストアされ、その後にZn個の0が続く。
【0067】
ストリーミングエンジン108は、L2キャッシュ106からT個の対応するxベクトルの要素を読み出すように、及びA行列バッファ138にロードするためにベクトルを提供するように構成される。一例において、x(t)のT個のコピーは連続してL2キャッシュ106にストアされ、入力フォーマッティング122は、最後にコピーとZk個の0との間に1を付加するように構成される。或いは、x(t)のT個のコピーは連続してL2キャッシュ106にストアされ、最後にコピーとZk個の0との間に1を有する。
【0068】
MMA104の行オフセットコンポーネント140は、ストリーミングエンジン110からの各ベクトルの要素を、B行列バッファ144に適切なオフセットでロードさせるように構成される。例えば、Hの各行のT個のコピーがL2キャッシュ106に連続してストアされ、それぞれの後にZn個の0が続き、その後、vのT個のコピーがL2キャッシュ106に連続してストアされ、その後にZn個の0が続くと仮定すると、行オフセットコンポーネント140は、[H;v]行列の複製された行0の要素が、0のオフセットでロードされ、[H;v]行列の複製された行1の要素がKのオフセットでロードされ、[H;v]行列の複製された行2の要素が2Kのオフセットでロードされる等のように構成される。
【0069】
乗算を実施するため、適切に構成されたLSE命令がMMA104上で実行されて、複製された[H;v]行列の初期バッチをB行列バッファ144にロードする。B行列バッファがロードされると、更なるLSE命令が実施され、対応するxベクトルのベクトルをA行列バッファ138にロードし、乗算を実施し、結果をC行列バッファ134にストアする。また、複数のバッチが処理されるべき場合、適切に構成されたLSE命令が、別のベクトルをA行列バッファ138にロードし、乗算を実施し、前に計算されたベクトルをストアする。B行列バッファ144は、A行列バッファ138にロードされる新しいベクトル毎にリロードされる必要はない。
【0070】
図10は、デバイス100における畳み込みニューラルネットワーク(CNN)において用いられるような二次元(2D)畳み込み
の実装を図示する例である。典型的な畳み込みニューラルネットワーク(CNN)は、特徴を抽出するための幾つかの畳み込み及びサブサンプリング層を含み、その後に、抽出された特徴に基づいて分類を実施するために従来のニューラルネットワークにおいて用いられるような一つ又は複数の完全に接続された層が続く。各畳み込み層及び各サブサンプリング層の出力は特徴マップのセットであり、それはCNNにおける次の層に対する入力である。各畳み込み層は、幾つかのフィルタを含み、それらのサイズ及び数は各層ごとに異なり得る。フィルタは、対応する特徴マップで畳み込まれて、各フィルタに対応する特徴マップを生成する。
【0071】
図10は、次元Lr×Lcを有するNi入力特徴マップ1000を用いる一般的な畳み込み層を示す。入力特徴マップ1000は、次元Fr×Fcを有する対応するフィルタ10で畳み込まれて、次元Mr×Mcを有するNo出力特徴マップ1004を生成する。MMA104を用いて2D畳み込みを実施するために、特徴マップ1000は、次元(Fr*Fc*Ni)×(Mr*Mc)のフィルタリング行列X1006にタイル化される。フィルタリング行列Xにおけるタイルサイズは、大又は小であり得、フィルタ長の関数として選択されるタイルオーバーラップを備える。畳み込みが、Lの入力サイズ及びFのフィルタ長に対してM=L-F+1出力を生成するので、このオーバーラップが存在する。フィルタリング行列X1106におけるタイルに対して大きいサイズを選択することはシームを防止し得、一方、小さいタイルサイズでは、タイル化処理は、プロセッサ102による除去のために同じ場所にシームを発生させる。大きい特徴マップタイルは、Lc=32*Bc+Fc-1を満たし、小さい特徴マップタイルは、Lc<=(32+Fc-1)/Bcを満たす。タイルサイズのこの選択は、同じ場所にシームを発生させる。
【0072】
出力特徴マップ1004を計算するため、フィルタ又はカーネルは、連続する32×32ブロックにおいて読み出され得、MMA104におけるタイルフィルタリング行列X 1006の32×32ブロックに適用され得る。フィルタを入力特徴マップ1000に適用した結果は、MMA104によってタイルフィルタリング行列1006の32×32ブロックに対して別々に計算され得、出力特徴マップ1004を生成するために結合され得る。フィルタ又はカーネル1002の行は、連続してL2キャッシュ106にストアされ得、フィルタ行列H 1008は、連続する32×32ブロックにおいてL2キャッシュ106から読み出され得る。
図11に図示されるように、タイルフィルタリング行列1006の特徴マップタイルは、立方体で読み出される。即ち、初期特徴マップFM1 1012のタイルの全ての行が読み出され、その後に、次の特徴マップFM2 1014における対応するタイルの全ての行が続く等、最後の特徴マップFMNi 1016における対応するタイルの全ての行まで読み出される。計算は、下記式に従って、ブロック列順に実施され得る。
Y(:,n)=H*Xfilter(:,n),n=0,...,N-1
又は下記式に従って、ブロック行順(この例において示される順)に実施され得る。
Y(m,:)=H(m,:)*Xfilter,m=0,...,M-1
ここで、Xfilterはタイルフィルタリング行列である。
【0073】
大きい特徴マップタイルが用いられるときにこの原始関数を実施するため、ストリーミングエンジン108は、MMA104のA行列バッファ138にロードするために、L2キャッシュ106からフィルタ行列H 1008のフィルタベクトルをブロック行順に読み出すように構成される。ストリーミングエンジン110は、特徴マップの行の要素をL2キャッシュ106から読み出すように、及びMMA104のB行列バッファ144にロードするために特徴マップにおける32×32タイルの各行を提供するように構成される。表3は、ストリーミングエンジン108を構成するための疑似コードの例であり、表4は、ストリーミングエンジン110を構成するための疑似コードの例である。この疑似コードにおいて、Bfは、特徴マップデータ要素ごとのバイトの数であり、Sはストライドであり、VECLENはベクトル長であり、タイルサイズは、Lr×Lc×Niであり、ここで、Lc=32*Bc+Fc-1であり、Bcは、有効な入力特徴マップタイル列の数を示す正の整数である。Bcの値は、例えば、32*Bc+Fc-1≦特徴マップにおける列の数になるように、可能な最大整数として選択され得る。これより小さいBcの値も用いられ得る。
【0074】
表3の疑似コードにおいて、ICNTx及びDIMxの値は、フィルタ行列Hが、事前に特定されたように、ブロック行順に生成されるように選択される。H行列の行は、ゼロパッドを備えてL2キャッシュ106にストアされるか又はストリーミングエンジン108又は入力フォーマッティング122は、ゼロパディングを付加するように構成される。表3の疑似コードにおいて、ICNTx及びDIMの値は、フィルタリング行列Xが事前に特定されたように、ブロック列順に生成されるように、選択される。for loopは、全パターンがceil(No/32)回、反復することを示している。
【0075】
表3及び表4の疑似コードにおけるパターンは、大行列行列乗算の問題を生成する。即ち、MMA104の観点からみると、実施される処理は、
図4に関連して上述したように実施される大行列行列乗算問題である。
【表3】
【表4】
【0076】
小さい特徴マップタイルが用いられるときにこの原始関数を実施するため、ストリーミングエンジン108は、MMA104のA行列バッファ138にロードするために、フィルタ行列H 1008のフィルタベクトルをL2キャッシュ106からブロック行順に読み出すように構成される。ストリーミングエンジン110は、L2キャッシュ106から特徴マップの要素を読み出すように、及びMMA104のB行列バッファ144にロードするために32×32タイルの各行を特徴マップに提供するように構成され得る。表5は、ストリーミングエンジン108を構成するための疑似コードの例であり、表6は、ストリーミングエンジン110を構成するための疑似コードの例である。この疑似コードにおいて、Bfは、特徴マップデータ要素毎のバイトの数であり、Sはストライドであり、VECLENはベクトル長であり、タイルサイズは、Lr×Lc×Niであり、ここで、Tc≦(32+Fc-1)/Bcであり、Bcは、有効な入力特徴マップタイル列の数を示す正の整数であり、M=max(Bc,S)である。Bcの値は、Bc≦(32+Fc-1)/Lcを満たす最大整数である。
【0077】
表5の疑似コードにおいて、ICNTx及びDIMxの値は、フィルタ行列Hが、事前に特定されたようにブロック行順に生成されるように選択される。H行列の行は、ゼロパディングを用いてL2キャッシュ106にストアされるか、或いは、ストリーミングエンジン108又は入力フォーマッティング122は、ゼロパディングを付加するように構成される。表6の疑似コードにおいて、ICNTx及びDIMの値は、フィルタリング行列Xが、事前に特定されたようにブロック列順に生成されるように選択される。FORループは、全パターンが上限(No/32)回反復することを示す。
【0078】
表5及び表6の疑似コードにおけるパターンは、大行列行列乗算問題を生成する。即ち、MMA104の観点からみると、実施される処理は、
図4に関連して前に説明されたように実施される大行列行列乗算問題である。
【表5】
【表6】
【0079】
大きな特徴タイルが用いられるとき、ストライドSが1より大きい場合、ストリーミングエンジン108の構成は行ストライドを扱う。列ストライドは、MMA104によって生成されるS列毎に一つを書き出すように、出力フォーマッティング116を構成することによって扱われる。小さい特徴タイルが用いられるとき、MMA104の出力からシームが除去される必要がある。ストライドSが特定されない場合、出力フォーマッティング116は、出力からサイズFc-1のBc-1シームを除去するように、及び出力から最後の32-Bc*Lc+Fc-1サンプルを除去し、(Lr-Fr+1)/Bcが整数でない場合、最後のサンプルを無視するように構成される。ストライドSが特定される場合、出力フォーマッティング116は、出力上でシーム除去を実施するように、及び出力から(S-1)/S行及び列を除去するように構成される。幾つかの例において、次の畳み込み層のためにゼロパディングが必要とされるとき、出力フォーマッティング116は、MMA104の出力にゼロパディングを付加するように構成される。
【0080】
図12は、
図1のデバイス100における行列行置換C=B(新しい指数、:))の実装を図示する例である。行置換はC=P*Bとして実装され得、ここで、置換行列Pは、各行及び列において単一の1を有し、その列位置は、Bの対応する要素に対する新しい行指数である。Pにおける他の全ての要素はゼロに設定される。
【0081】
この原始関数を実施するため、ストリーミングエンジン110は、MMA104のB行列バッファ144にロードするため、L2キャッシュ106からB行列の各行を提供するように構成される。従って、ストリーミングエンジン110からの第1のベクトルがB行列の第1の行、行0を含み、ストリーミングエンジン110からの第2のベクトルがB行列の第2の行を含む等となる。ストリーミングエンジン108は、A行列バッファ138にロードするために、L2キャッシュ106からP行列の各行を提供するように構成される。従って、ストリーミングエンジン108からの第1のベクトルがP行列の第1の行、行0を含み、ストリーミングエンジンからの第2のベクトルがA行列の第2の行を含む等となる。
【0082】
行置換を実施するため、適切に構成されたLSE命令がMMA104上で実行されて、B行列をB行列バッファ144にロードする。B行列バッファがロードされると、更なるLSE命令が実行されて、P行列の行をA行列バッファ138にロードし、行列乗算を実施し、結果をC行列バッファ134の対応する行にストアする。全ての行列乗算が完了すると、C行列バッファ134のコンテンツをMMA104の外に移動させるためのLSE命令が実行される。
【0083】
図13は、
図1のシステムにおけるベクトル列置換、c(k,:)=a(k,新しい指数))の実装を図示する例である。ベクトル列置換は、c(k,:)=a(k,:)*Pとして実装され得、ここで、置換行列Pは、各行及び列に単一の1を有し、その行位置は、aの要素に対する新しい列指数である。Pにおける他の全ての要素はゼロに設定される。
【0084】
この原始関数を実施するため、ストリーミングエンジン110は、MMA104のB行列バッファ144にロードするために、L2キャッシュ106からP行列の各行を提供するように構成される。従って、ストリーミングエンジン110からの第1のベクトルがP行列の第1の行、行0を含み、ストリーミングエンジンからの第2のベクトルがP行列の第2の行を含む等となる。ストリーミングエンジン108は、A行列バッファ138にロードするために、L2キャッシュ106からベクトルcを提供するように構成される。
【0085】
列置換を実施するため、適切に構成されたLSE命令がMMA104上で実行されて、P行列をB行列バッファ144にロードする。B行列バッファがロードされると、更なるLSE命令が実行されて、cベクトルをA行列バッファ138にロードし、行列乗算を実施し、結果をC行列バッファ134の対応する行にストアする。全ての行列乗算が完了すると、C行列バッファ134のコンテンツをMMA104の外に移動させるためにLSE命令が実行される。
【0086】
デバイス100はまた、インタリーブされた実数部と虚数部を用い、個別の実数部と虚数部を用いて、バッチ小一次元(1D)複素数-複素数高速フーリエ変換(FFT)を、インタリーブされた実数部と虚数部を用い、個別の実数部と虚数部を用いて、大1D複素数複素数FFTを実施するように構成される。下記のFFTの説明において、下付き文字「co」は複素数を示し、下付き文字「re」は実数を示し、下付き文字「im」は虚数を示す。
【0087】
インタリーブされた実数部と虚数部を有する長さN≦16の小複素数-複素数FFTが、下記のように、総当たり離散フーリエ変換(DFT)として計算され得る。
ここで、
である。本明細書に用いられるように、総当たりDFTは、DFT行列を用いて入力ベクトルを乗算し、入力のDFTである出力ベクトルを生成することである。
【0088】
N=16の場合、x
co
16及びy
co
16はインタリーブされた実数及び虚数の値を有する1×32ベクトルであり、F
co
16は32×32行列であるので、y
co
16=x
co
16*F
co
16を計算するために、ベクトル行列乗算が用いられ得る。従って、ベクトルx
co
16は、MMA104のA行列バッファ138にロードされ得、行列F
co
16はB行列バッファ144にロードされ得、行列積が計算され得、結果がC行列バッファ134にストアされ得る。より小さいN値の場合、
図7に関連して本明細書で上述したような小ベクトル行列乗算が、総当たりDFTのバッチを計算するために用いられ得る。
【0089】
個別の実数部と虚数部を備える小複素数-複素数FFTのバッチが、下記のように総当たり離散フーリエ変換(DFT)として計算され得る。
ここで、
であり、ここで、
である。
【0090】
Y
re
M,32及びY
im
M,32計算を下記のように2つの計算に分けることによって、行列行列乗算を用いて、個別の実数部と虚数部を備えるM32ポイント複素数-複素数FFTのバッチがデバイス100において計算され得る。
これらの計算を実施するため、ストリーミングエンジン108、110、及びMMA104は、行列行列乗算に対して構成される。また、入力フォーマッティング122は、入力を実数部と虚数部に分けるように構成される。
【0091】
個別の実数部と虚数部を有する一層小さい複素数-複素数FFTが、本明細書において上述したように、上記の式及びバッチ小行列行列乗算を用いて、バッチのバッチにおいてデバイス100において計算される。ここで、N=K=FFTサイズ≦32である。
【0092】
大複素数-複素数1D FFTが下記のように計算され得る。1)データXを連続順に行列の行にロードする。2)行列の列のFFTを実施する。3)IFFTの場合、ej*(2*π/N)*row*col、FFTの場合、e-j*(2*π/N)*row*colの回転因子によって行列を点状乗算する。4)行列の行のFFTを実施する。5)行列を転置する。6)結果の行列の行を連続順にストアする。
【0093】
この処理は、データ行列Xが与えられると、下記のようにデバイス100において実装される。Xの列のFFTを実施するため、行列XをB行列バッファ144にロードし、DFT行列FをA行列バッファ138にロードする。その後、本明細書に説明されるように行列行列点状乗算を用いて、回転因子を用いる乗算を実施する。Xの行のFFTを実施するため、DFT行列FをB行列バッファ144にロードし、行列XをA行列バッファ138にロードする。データ行列XをA行列バッファ又はB行列バッファにロードすることは、転置無しに、列又は行のFFTを可能にする。行列Xの最終転置は、MMA104又は出力フォーマッティング116において実施され得る。
【0094】
表7は、個別の実数部と虚数部を有する長さ1024の複素数-複素数1D FFTの計算を図示する例である。例えば、T
re
32=F
re
32及びT
im
32=F
im
32である。また、初期化ロードは例外であるが、明示的に言及される全てのロード演算は、B行列バッファ144に対するものであり、行列乗算と並行して実施される。入力フォーマッティング122は、入力を実数部と虚数部とに分けるように構成される。
【表7】
【0095】
また、デバイス100は、y=dct(x)に従って、一次元(1D)離散コサイン変換(DCT)を実施するように構成され得る。バッチ小一次元(1D)離散コサイン変換(DCT)及び大1D DCTの計算は、DCT行列が実数でありデータが実数であること以外、上述した小及び大1D複素数-複素数FFTに類似する。DCTサイズに関連する用語、小及び大は、用語、小及び大FFTサイズと同様に用いられる。小DCTは、行列ベクトル乗算を介して実装され得る。大DCTは、下記のように、事前処理(ステップ1)、FFT(ステップ2)、及び事後処理(ステップ3)を介して実装され得る。
n=0,1,...,N/2-1に対し、x’(n)=x(2*n)及びx’(N-1-n)=x(2*n-1) (ステップ1)
y’=FFT(x’)を計算 (ステップ2)
y(n)=real(exp(-j*n*pi/(2*N))*y(n)) (ステップ3)
上記のシーケンスにおけるステップ2を計算するため、上述した小FFT及び大FFTを含み、任意のFFT方法が用いられ得る。
【0096】
また、デバイス100は、
に従って、小及び大一次元(1D)畳み込み/フィルタリングを実施するように構成され得る。1D畳み込み/フィルタリングは、下記に従って計算され得る。
y(n)=Σh(τ)*x(n-τ),τ=0,...,L-1;n=L-1,L,...
ここで、Lはフィルタ長であり、τは畳み込みの定義に従ったフィルタ係数インデックスである。小畳み込みは、L<32であるものであり、大畳み込みは、L>32であるものである。小1D畳み込みの場合、フィルタ長Lが[1,32]にあり、n≧L-1の場合、出力が有効であると仮定する。小1D畳み込みは、下記に従って計算され得る。
C(t,:)=A(t,:)*B,t=0,1,...
ここで、
Bにおいて、全ての行の最後のL-1列はゼロであり、Cにおいて、最後のL-1エントリはゼロであり、変数tは、32-L出力が生成される回数を指数化するために用いられる。
【0097】
1D畳み込みを実施するため、ストリーミングエンジン110は、フィルタの33-LコピーをB行列バッファ144に初期的にロードするために、L2キャッシュ106からフィルタhの要素を提供するように構成される。hの複数のコピーがL2キャッシュ106にストアされるか又は単一のコピーがL2キャッシュ106にストアされ、入力フォーマッティング122を構成することによって複製される。ストリーミングエンジン108は、各サイクルで、L2キャッシュ106から33-Lのx(n)の新しい値を読み出し、A(t,:)を生成するように構成される。MMA104は、ベクトル行列乗算のために構成され、各サイクルで、MMA104は、C(t,:)におけるy(n)の33-Lの値を計算する。
【0098】
デバイス100において、大1D畳み込み/フィルタを計算するためのストラテジは、大フィルタを2つの一層小さいフィルタフラグメントに分解することに関する下記の観察に基づく。
ここで、τ=0,...,L-1、N=L-1,L,...であり、τ
1=0,...,L
1-1、τ
2=0,...,L
2-1である。
【0099】
フィルタhは、フィルタフラグメントが可能な限り最適なサイズになるまで、上記の分解の反復的適用を用いて一層小さいフラグメントに分解される。即ち、MMA104のスループットの最大化とフィルタの総数の最小化とのトレードオフとして、フィルタサイズが選択される。
図14のグラフは、フィルタフラグメントのサイズとMMA104のスループットとの間のトレードオフを図示する。このグラフが示すように、MMA104のための最適なフィルタフラグメントサイズは、バッファ138、144の幅の約二分の一であり、即ち、MMA104の計算原始関数サイズの幅の約二分の一である。幾つかの例において、一層小さいフィルタフラグメントのサイズを選択するための分解はオフラインで実施される。幾つかの例において、分解は、プロセッサ102によって実施される。入力の適切にシフトされたバージョンは、上記の式に従って、対応するフィルタフラグメントを用いてフィルタされ、結果が加算される。フィルタリングは、上述したように、ベクトル行列乗算を用いて実装される。
【0100】
また、デバイス100は、y=h★xに従って、1D相関を実施するように構成され得る。相関は、時間反転順に、フィルタ係数を用いる畳み込みと同じである。従って、1D相関は、上述したように、小又は大1D畳み込みを用いて実装され得、入力フォーマッティング122は、h又はxのいずれかにおいて時間反転を実施するように構成される。
【0101】
また、デバイス100は、C=A又はC=Bに従って、行列アサイメントを実装するように構成され得る。従って、アサイメントは、C=A*I又はC=I*Bとして、MMA104において実施され得る。ここで、Iは単位行列である。
【0102】
また、デバイス100は、行列転置BTを実装するように構成され得る。行列の転置は、新しい行列であり、そこでは、列が、元の行列の行である。転置演算を実施するため、MMA104は、A行列バッファ138における要素がB行列バッファ144の指定された列にコピーされるべきであることを特定する演算モード、即ち、コピー演算を含む。
【0103】
行列の転置を実施するため、ストリーミングエンジン108は、L2キャッシュ106から行列の行の要素を読み出すように、及びB行列バッファ144にロードするために行列の各行を提供するように構成される。従って、ストリーミングエンジン108からの第1のベクトルが行列の第1の行、行0を含み、ストリーミングエンジンからの第2のベクトルが行列の第2の行を含む等となる。その後、バッファ124から行列の行をロードし、要素をB行列バッファ144の連続する列にストアする、適切に構成されたLSE命令が実行される。行列の全ての行が転置されると、適切に構成されたLSE命令が実行されて、B行列バッファのコンテンツを、C行列バッファ134に移動し、MMA104の外に出す。
【0104】
その他の例
本明細書において、プロセッサがDSPであり、基本計算原始関数を実施するようにデバイス100を構成する制御ソフトウェアを実行し、原始関数の実行を制御する例が説明されてきた。他の例において、デバイス100に結合されるホストプロセッサが、基本計算原始関数を実行するために必要な制御演算の幾つか又は全てを実施する。プロセッサは、任意の適切なタイプの電子データプロセッサ及び電子データプロセッサの組み合わせであり得る。例えば、プロセッサは、インテル社製又はアドバンストマイクロデバイス社製の一つ又は複数のプロセッサ、一つ又は複数の縮小命令セットコンピュータ(RISC)、一つ又は複数の特定用途向け集積回路(ASIC)、一つ又は複数のデジタル信号プロセッサ(DSP)等であり得る。
【0105】
MMAのバッファの次元が1×32又は32×32である例が本明細書に説明されてきた。他の例において、MMAのバッファの次元は、これより小さくても大きくてもよい。
【0106】
特許請求の範囲内で、説明した実施形態における変更が可能であり、他の実施形態が可能である。