(57)【要約】【解決手段】  ベクトル命令を提供する1つ以上のプロセッサを含むコンピュータが、ソースデータセット上に直接畳み込みを実装してもよい。ソースデータセットが、１次元または多次元であり得る。ベクトル命令の所与のベクトル幅ｗに対して、出力データセットのｗ個の連続データ要素が、ベクトル命令を用いて並列に計算される。多次元データセットに対して、出力データセットの複数のベクトルが、ソースデータセットからのベクトルセットの単一ロードに対して計算される。畳み込みの性能を改善し、１つ以上のプロセッサ内の算術論理ユニットの完全な利用を可能にする新しいベクトル命令が開示される。
2020533691.tif 000002
【特許請求の範囲】
【請求項１】
ベクトルに対する畳み込みを実行するように構成されているプロセッサであって、前記ベクトルに対する前記畳み込みを実行するために、前記プロセッサが、複数のベクトル命令を実行するように構成されており、前記複数のベクトル命令の各々が、複数のデータビットの複数のデータレーンに対する演算を実行するように構成されており、前記複数のベクトル命令が、
複数のソースベクトルをロードすることであって、前記複数のソースベクトルをロードするために、前記複数のベクトル命令が、中央ベクトル、前記ベクトルの第１のデータレーンの前に１つ以上のデータレーンを開始する複数のデータレーンの左ベクトル、および前記ベクトルの前記第１のデータレーンの後に１つ以上のデータレーンを開始する複数のデータレーンの右ベクトルをロードするように構成されている、ロードすることと、
１つ以上の出力ベクトルを生成することであって、前記１つ以上の出力ベクトルを生成するために、前記複数のベクトル命令が、前記１つ以上の出力ベクトルに、前記畳み込みのためのそれぞれの重み付け値によってスケーリングされた前記複数のソースベクトルの各々を加算するように構成されている、生成することと、を含む、システム。
【請求項２】
前記左ベクトルおよび前記右ベクトルをロードするために、前記複数のベクトル命令が、
前記ベクトルの直前の前ベクトルをロードし、
前記ベクトルの直後に次ベクトルをロードし、
ベクトル抽出命令を実行して、前記前ベクトルと前記ベクトルを用いて前記左ベクトルを生成し、
別のベクトル抽出命令を実行して、前記ベクトルと前記次ベクトルを用いて前記右ベクトルを生成するように構成されている、請求項１に記載のシステム。
【請求項３】
前記ベクトル抽出命令が、
第１のベクトルレジスタを第２のベクトルレジスタに連結して、中間結果を生成し、
前記中間結果を複数のレーン左にシフトし、
前記中間結果の上部を含む出力ベクトルを生成するように構成されている、請求項２に記載のシステム。
【請求項４】
前記複数のベクトル命令は、さらに、前記畳み込みのための複数の重み付け値の１つ以上の重み付けベクトルをロードするように構成されており、
前記１つ以上の前記出力ベクトルのうちの特定の１つに、前記畳み込みのためのそれぞれの重み付け値によってスケーリングされた前記複数のソースベクトルの各々を加算するために、前記複数のベクトル命令は、前記複数のソースベクトルのそれぞれに対するベクトルスケーリング命令を含み、前記ベクトルスケーリング命令が、
前記１つ以上の重み付けベクトルのうちの特定の１つの特定のレーンから、前記畳み込みのためのそれぞれの重み付け値をロードし、
前記複数のソースベクトルのうちの１つの複数のデータレーンの各々に、前記それぞれの重み付け値を乗算して、スケーリングベクトルを生成し、
前記１つ以上の出力ベクトルのうちの前記特定の１つに前記スケーリングベクトルを加算する、ように構成されている、請求項１に記載のシステム。
【請求項５】
前記ベクトルに対する前記畳み込みは、ストライド値を実装し、含まれる各データレーンに対する前記畳み込みにおける省略されるデータレーンの値は、前記ストライド値に基づき、前記複数のソースベクトルをロードするために、前記複数のベクトル命令が、
前記ベクトルの直前の前ベクトルをロードし、
前記ベクトルの直後の次ベクトルをロードし、
ベクトル抽出命令を実行して、前記前ベクトル、前記ベクトルおよび前記次ベクトルを用いて第１の中間ベクトルおよび第２の中間ベクトルを生成し、
ベクトルシャッフル命令を実行して、前記第１の中間ベクトルおよび前記第２の中間ベクトルを用いて前記左ベクトルをロードし、
ベクトルシャッフル命令を実行して、前記ベクトルおよび前記次ベクトルを用いて前記中央ベクトルと前記右ベクトルをロードする、ように構成されている、請求項１に記載のシステム。
【請求項６】
前記畳み込みが多次元畳み込みであり、前記１つ以上の出力ベクトルが複数の出力ベクトルを含む、請求項１に記載のシステム。
【請求項７】
前記プロセッサが、畳み込みニューラルネットワークの一部として前記畳み込みを実行するように構成されている、請求項１に記載のシステム。
【請求項８】
ベクトル命令を実装するプロセッサを含むコンピュータによって、ベクトルの畳み込みを実行することであって、
中央ベクトル、前記ベクトルの第１のデータレーンの前に１つ以上のデータレーンを開始する複数のデータレーンの左ベクトル、および前記ベクトルの前記第１のデータレーンの後に１つ以上のデータレーンを開始する複数のデータレーンの右ベクトルを含む複数のソースベクトルをロードすることと、
前記複数のソースベクトルの重み付け和を含む１つ以上の出力ベクトルを生成することであって、前記１つ以上の出力ベクトルを生成することが、前記１つ以上の出力ベクトルに、前記畳み込みのためのそれぞれの重み付け値によってスケーリングされた前記複数のソースベクトルの各々を加算することを含む、生成することと、を含む、実行することとを含み、
ベクトル命令は、各々が複数のデータビットを含む複数のデータレーンを含む１つ以上のデータレジスタについて動作する命令である、方法。
【請求項９】
前記左ベクトルおよび右ベクトルの前記ロードが、
前記ベクトルの直前の前ベクトルをロードすることと、
前記ベクトルの直後の次ベクトルをロードすることと、
ベクトル抽出命令を実行して、前記前ベクトルと前記ベクトルを用いて前記左ベクトルを生成することと、
前記ベクトル抽出命令を実行して、前記ベクトルと前記次ベクトルを用いて前記右ベクトルを生成することと、を含む、請求項８に記載の方法。
【請求項１０】
前記ベクトル抽出命令を実行することが、
第１のベクトルレジスタを第２のベクトルレジスタに連結して、中間結果を生成することと、
前記中間結果を複数のレーン左にシフトすることと、
前記中間結果の上部を含む出力ベクトルを生成することと、含む、請求項９に記載の方法。
【請求項１１】
前記ベクトルに対する前記畳み込み演算を実行することが、さらに、前記畳み込みのための複数の重み付け値を含む１つ以上の重み付けベクトルをロードすることを含み、
前記１つ以上の前記出力ベクトルのうちの特定の１つに、前記畳み込みのためのそれぞれの重み付け値によってスケーリングされた前記複数のソースベクトルの各々を加えることが、前記複数のソースベクトルの各々に対してベクトルスケーリング命令を含み、前記ベクトルスケーリング命令を実行することが、
前記１つ以上の重み付けベクトルのうちの特定の１つの特定のレーンから、それぞれの重み付け値をロードすることと、
前記重み付け値によってスケーリングされた前記複数のソースベクトルのうちの前記１つのそれぞれのデータレーンを含むスケーリングベクトルを生成することと、
前記１つ以上の出力ベクトルのうちの前記特定の１つに前記スケーリングベクトルを加算することと、を含む、請求項８に記載の方法。
【請求項１２】
前記畳み込みが多次元畳み込みであり、前記１つ以上の出力ベクトルが複数の出力ベクトルを含む、請求項８に記載の方法。
【請求項１３】
前記畳み込みが、畳み込みニューラルネットワークの一部として行われる、請求項８に記載の方法。
【請求項１４】
複数のベクトル命令を記憶する非一時的コンピュータ読み取り可能記憶媒体であって、前記複数のベクトル命令が、プロセッサ上で実行されると、前記プロセッサにベクトルの畳み込みを実行させ、前記複数のベクトル命令が、
複数のソースベクトルをロードすることであって、ベクトルが複数のデータビットの複数のデータレーンを含み、前記複数のソースベクトルが、中央ベクトル、前記ベクトルの第１のデータレーンの前に１つ以上のデータレーンを開始するデータレーンを含む左ベクトル、および前記ベクトルの第１のデータレーンの後に１つ以上のデータレーンを開始するデータレーンを含む右ベクトルを含む、ロードすることと、
前記複数のソースベクトルの重み付け和を含む１つ以上の出力ベクトルを生成することであって、１つ以上の出力ベクトルを生成することが、前記１つ以上の出力ベクトルに、畳み込みのそれぞれの重み付け値によってスケーリングされた前記複数のソースベクトルの各々を加算することを含む、生成することと、を含む、非一時的コンピュータ読み取り可能記憶媒体。
【請求項１５】
前記左ベクトルおよび右ベクトルの前記ロードが、
前記ベクトルの直前の前ベクトルをロードすることと、
前記ベクトルの直後の次ベクトルをロードすることと、
ベクトル抽出命令を実行して、前記前ベクトルと前記ベクトルを用いて前記左ベクトルを生成することと、
前記ベクトル抽出命令を実行して、前記ベクトルと前記次ベクトルを用いて前記右ベクトルを生成することと、を含む、請求項１４に記載の非一時的コンピュータ読み取り可能記憶媒体。
【請求項１６】
前記ベクトル抽出命令を実行することが、
第１のベクトルレジスタを第２のベクトルレジスタに連結して、中間結果を生成することと、
前記中間結果を複数のレーン左にシフトすることと、
前記中間結果の上部を含む出力ベクトルを生成することと、含む、請求項１５に記載の非一時的コンピュータ読み取り可能記憶媒体。
【請求項１７】
前記ベクトルに前記畳み込み演算を実行することが、さらに、前記畳み込みのための複数の重み付け値を含む１つ以上の重み付けベクトルをロードすることを含み、
前記１つ以上の複数のソースベクトルのうちの特定の１つに、前記畳み込みのためのそれぞれの重み付け値によってスケーリングされた前記複数のソースベクトルのうちの各々を加算することが、前記複数のソースベクトルのうちの各々に対して、
前記１つ以上の重み付けベクトルのうちの指定された１つのレーンの特定のレーンからそれぞれの重み付け値をロードすることと、
前記重み付け値によってスケーリングされた前記複数のソースベクトルのうちの１つのそれぞれのデータレーンを含むスケーリングベクトルを生成することと、
前記１つ以上の出力ベクトルのうちの前記特定の１つに前記スケーリングベクトルを加算することと、行うベクトルスケーリング命令を実行することを含む、請求項１４に記載の非一時的コンピュータ読み取り可能記憶媒体。
【請求項１８】
前記ベクトル上の前記畳み込みがストライド値を実装し、含める各データレーンに対して前記畳み込みにおいて省略するデータレーンの値が前記ストライド値に基づき、前記複数のソースベクトルのロードが、
前記ベクトルの直前の前ベクトルをロードすることと、
前記ベクトルの直後の次ベクトルをロードすることと、
ベクトル抽出命令を実行して、前記前ベクトル、前記ベクトルおよび前記次ベクトルを用いて第１の中間ベクトルおよび第２の中間ベクトルを生成することと、
ベクトルシャッフル命令を実行して、前記第１の中間ベクトルおよび前記第２の中間ベクトルを用いて前記左ベクトルをロードすることと、
ベクトルシャッフル命令を実行して、前記ベクトルおよび前記次ベクトルを用いて前記中央ベクトルと前記右ベクトルをロードすることと、を含む、請求項１４に記載の非一時的なコンピュータ読み取り可能記憶媒体。
【請求項１９】
前記畳み込みが多次元畳み込みであり、前記１つ以上の出力ベクトルが複数の出力ベクトルを含む、請求項１４に記載の非一時的コンピュータ読み取り可能記憶媒体。
【請求項２０】
前記畳み込みが、畳み込みニューラルネットワークの一部である、請求項１４に記載の非一時的コンピュータ読み取り可能記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、一般に、デジタル信号処理、機械学習およびニューラルネットワークに関し、より詳細には、畳み込み演算を用いた信号をフィルタリングするためのシステムおよび方法に関する。
【背景技術】
【０００２】
デジタル信号処理では、畳み込みは、出力データセットの出力値を生成するデータセット内の入力値とその直近隣接値の重み付け和である。これらのデータセットが、入力値の直近隣接する値を決定する対応するデータ構成を備えた１次元または多次元であってもよい。畳み込みの重み付け値は、カーネルが入出力データセットと同じ次元数を有する畳み込みカーネルで指定される。畳み込み演算は、非常に多様な信号処理アプリケーションにおいて有用であり、ディープニューラルネットワークの多くの態様の演算に不可欠である。
【０００３】
畳み込みが、機械学習アプリケーションで広く使用されることがある。この文脈では、多くの小さな畳み込みカーネルを用いて単一のデータセットに畳み込みを適用することが一般的である。その結果、畳み込みは、機械学習アプリケーションの計算集約的な部分であることが多く、畳み込み演算を実行する効率的な手段が、ますます大きな価値を有する。
【０００４】
畳み込み効率を改善するための一般的なアプローチの１つである畳み込み低下は、畳み込み演算を、最適化された高密度線形代数によって解くことができる等価計算プロセスに変換することを伴う。これは、データの固有再利用を活用し、オフチップ帯域幅の必要性を最小化し、多くのコアに分散できる計算を細分化することに熟達した、最適化されたＧＥＭＭ（General  Matrix  Multiply）ルーチンの使用を可能にする。また、このアプローチには、畳み込み低下は、追加のプロセッサオーバヘッドを増加させ、データサイズを著しく増加させるという重大な欠点がある。データサイズの増加は、キャッシュを困難にし、オフチップ帯域幅の使用を増加させ、キャッシングおよび従来のメモリ技術の代わりに、高価で高性能なメモリを好むソリューションをもたらす。
【０００５】
第２のアプローチは、周波数領域における畳み込みを実行することである。これには、入力データセットと畳み込みカーネルをそれぞれ周波数ドメインに変換し、２つの変換データセットを乗算し、積に逆周波数変換を適用する必要があります。このアプローチは、畳み込み低下と同様の利点と欠点を提供し、乗算演算が再びＧＥＭＭルーチンによって実装され得るが、追加の計算オーバーヘッドが追加され、メモリフットプリントが、小さなカーネルサイズに対して劇的に増加することがある。多くの小さなカーネルが使用される機械学習アプリケーションでは、多くの小さなカーネルを周波数ドメインに変換する必要があるため、周波数ドメインにおける畳み込みは魅力的ではない。
【０００６】
一般に「直接畳み込み」と呼ばれる第３のアプローチは、畳み込みフィルタを時間または空間領域においてデータに直接適用する。このアプローチは、以前のアプローチの追加的な計算オーバーヘッドおよびメモリの増加を回避するが、プロセッサ利用率がはるかに低いこと、再利用の並列性および利用が少ないこと、または、畳み込みを解くことのみの専用のハードウェアに悩まされる。典型的には、このようなハードウェアは、従来のハードウェアの既存の資源を活用せず、所与のディープニューラルネットワークのためにプログラムし最適化することが重要である。
【発明の概要】
【０００７】
ベクトル命令を提供する中央処理装置（ＣＰＵ）を用いて効率的な直接畳み込み演算を提供するための方法およびシステムについて説明する。効率的な直接畳み込み演算は、畳み込み演算がかなりのメモリ帯域幅と計算資源を必要とし得る機械学習とディープニューラルネットワークアプリケーションにおいて有用である。これらの畳み込みアプリケーションは、一般に、より小さな畳み込みカーネルサイズを使用することによって特徴づけられ、ここで、直接畳み込みアプローチは、そうでなければ、メモリバンド幅が制約される。本明細書に開示されたアプローチを用いてメインＣＰＵに直接畳み込みを実装することによって、システムが専用ハードウェアアクセラレータまたは汎用ＧＰＵ（ＧＰＧＰＵ）ソリューションの必要性を回避することができ、従って、これらのアプリケーションにおいてより良好な性能スケーリングを可能にする一方で、機械学習アプリケーションにおいて典型的に使用されるより小さいカーネルサイズにおけるキャッシュおよびメモリ帯域幅だけでなく、計算資源を十分に利用することができる。
【０００８】
ハードウェアにおけるデータレベルの並列性を増加させるために、プロセッサが、ＳＩＭＤ（Single  Instruction  Multiple  Data）マイクロアーキテクチャのように、実行される各命令に対して並列実行レーンを提供するベクトル命令を含んでもよい。このタイプのマイクロアーキテクチャが、単一レーンまたは汎用マイクロアーキテクチャよりも、特定の用途に対してより高いスループットを提供することができる。汎用マイクロアーキテクチャはレジスタに含まれる単一レーンのデータで動作するが、ＳＩＭＤマイクロアーキテクチャは複数レーンの独立したデータで構成されるベクトルに含まれるデータに作用する。
【０００９】
いくつかの実施形態では、複数のＳＩＭＤソースベクトルがロードされ、１つのソースベクトルは計算される宛先ベクトルと整列し、１つ以上のソースベクトルは、宛先ベクトルに関して左部分データを含む、１つ以上のソースベクトルは、宛先ベクトルに関して右部分データを含む。これらのソースベクトルの各々は、それぞれの畳み込み係数ベクトルと乗算され、アキュムレータベクトルに加算される。全てのソースベクトルが処理されると、アキュムレータベクトルは宛先ベクトルに書き込まれる。
【００１０】
いくつかの実施形態において、行われる畳み込みが、多次元畳み込みであってもよい。これらの実施形態では、複数のアキュムレータベクトルが、同じロードされたソースベクトルを用いて同時に計算されてもよい。種々のソースベクトルが、畳み込みカーネルの他の次元に対応する他の畳み込み係数ベクトルと乗算されてもよく、複数のアキュムレータベクトルが、所与の宛先ベクトルに対する全てのソースベクトルが処理されるまで、書き込まれなくてもよい。
【００１１】
いくつかの実施形態において、ＳＩＭＤ命令が、整列されていないＳＩＭＤベクトルを一対の整列ＳＩＭＤベクトルから抽出するために提供されてもよい。これらの実施形態では、整列ソースベクトルおよび複数のシフトされたソースベクトルが、共通のデータソースからロードされてもよい。
【００１２】
いくつかの実施形態において、ＳＩＭＤ命令が、データベクトルの各レーンにスカラー量が乗算され、ベースベクトルの各レーンに加算されるＳＩＭＤスカラー多重加算演算を実行するために提供されてもよい。
【００１３】
いくつかの実施形態では、畳み込み演算が、インターリーブ前のソースデータを用いて部分解像度の出力データセットを計算することによって、複数の入力データセットについて同時に実行されてもよい。これらの実施形態において、部分解像度出力データベクトルを抽出するために、計算されたデータベクトルについてインターレース解除演算を行うために、ＳＩＭＤ命令が提供されてもよい。
【００１４】
開示された種々の実施形態は、従来メモリ帯域幅によって制限されていた演算から、キャッシュおよびメモリサブシステムの計算資源および帯域幅を十分に利用するものに直接畳み込みの計算を変換するが、メインＣＰＵのみを必要とし、これらの実施形態は、特に直接畳み込み計算に適しているが、これらの実施形態が、例えば、一般的な並列トラバーサル技術など、種々の計算タスクにより一般的に適用してもよいことに留意されたい。
【図面の簡単な説明】
【００１５】
【図１】コンピュータシステムの一実施形態のブロック図である。
【図２Ａ】３要素畳み込みカーネルを備えたデータ要素の１次元畳み込みを示すブロック図である。
【図２Ｂ】３×３要素畳み込みカーネルを備えたデータ要素の２次元畳み込みを示すブロック図である。
【図３】少なくともいくつかの実施形態による、３つの要素畳み込みカーネルと共に使用されるソースベクトルの整列されたロードをサポートする、左シフトされたデータストリームおよび右シフトされたデータストリームを示すブロック図である。
【図４】少なくともいくつかの実施形態による、それぞれのカーネルベクトルを備えた整列され、左シフト、および右シフトされたソースベクトルを用いた、３つの要素、１次元畳み込みの出力ベクトルの計算を示す。
【図５】入力データセットの３つの要素、１次元畳み込みを含むデータセットの一連の出力ベクトルを計算する方法の一実施形態を示すフロー図である。
【図６Ａ】少なくともいくつかの実施形態による、２つのソースベクトルの連結のサブセットを含むデータベクトルを生成する抽出ベクトル命令を示す。
【図６Ｂ】少なくともいくつかの実施形態による、整列逐次ソース入力ベクトルセットを用いた畳み込み演算のためのソースベクトルセットをロードするための、図６Ａの抽出ベクトル命令の使用を示す。
【図７】入力データセットの３つの要素、１次元畳み込みを含み、図６Ａの抽出ベクトル命令を用いて、データセットの一連の出力ベクトルを計算する方法の一実施形態を示すフロー図である。
【図８】スカラー値を導出し、ベクトルのデータレーンの各々をスカラー値によってスケーリングして、スケーリングベクトルを生成し、スケーリングベクトルをベースベクトルに加算して出力ベクトルを生成するスカラー多重加算ベクトル命令を示す。
【図９】入力データセットの３つの要素、１次元畳み込みを含み、図８のスカラー乗算加算ベクトル命令を用いて、データセットの一連の出力ベクトルを計算する方法の一実施形態を示すフロー図である。
【図１０】少なくともいくつかの実施形態による、それぞれのカーネルベクトルと共に整列された、左シフト、右シフトされたソースベクトルを用いた、３×３要素、２次元畳み込みに対する複数の出力ベクトルの部分的な計算を示す。
【図１１】入力データセットの３×３要素、２次元畳み込みを含み、図８のスカラー乗算加算ベクトル命令と、図６Ａの抽出ベクトル命令とを用いて、データセットの出力ベクトルの列を計算する方法の一実施形態を示すフロー図である。
【図１２Ａ】ストライド係数と開始ソースレーンを含む複数のインターレースソースベクトルの連結のシャッフルデータレーンを含むデータベクトルを生成するシャッフルベクトル命令の一実施形態を示す。
【図１２Ｂ】ストライド係数、開始ソースレーン、および開始出力レーンを含むインターレースソースベクトルから、デルインターレースされたデータレーンを含むデータベクトルを生成するシャッフルベクトル命令の一実施形態を示す。
【図１３】少なくともいくつかの実施形態による、２のストライド値を含み、整列逐次ソース入力ベクトルを用いた畳み込み演算のためのソースベクトルセットをロードするための、図６Ａの抽出ベクトル命令および図１２Ａのシャッフルベクトル命令の使用を示す。
【００１６】
本開示は、いくつかの実施形態および例示的な図面について例として本明細書に記載されているが、当業者は、本開示が記載された実施形態または図面に限定されないことを認識するであろう。本明細書の図面および詳細な説明は、開示された特定の形態に本開示を限定することを意図するものではなく、むしろ、本開示は、添付の特許請求の範囲によって定義される精神および範囲内にあるすべての修正、等価および代替をカバーするものであることを理解されたい。本明細書において使用されるいかなる見出しも、構成目的のためのものに過ぎず、明細書または特許請求の範囲を限定することを意図するものではない。本明細書中で使用される場合、用語「ｍａｙ」は、必須の意味（すなわち、意味しなければならない）ではなく、許容的な意味（すなわち、可能性を有することを意味する）で使用され、同様に、用語「ｉｎｃｌｕｄｅ」、「ｉｎｃｌｕｄｉｎｇ」および「ｉｎｃｌｕｄｅｓ」は、含むことを意味するが、これらに限定されない。
【００１７】
種々のユニット、回路、または他の構成要素が、タスクまたは複数のタスクを行うように「構成されている」と記載されてもよい。このような文脈において、「構成されている」とは、一般に、動作中にタスクまたは複数のタスクを行う「回路を有する」ことを意味する構造の広義の規定である。したがって、ユニット／回路／構成要素は、ユニット／回路／構成要素が現在オンになっていない場合でもタスクを実行するように構成されていることができる。一般に、「構成されている」に対応する構造を形成する回路が、ハードウェア回路を含んでもよい。同様に、様々なユニット／回路／構成要素が、説明の便宜上、タスクまたは複数のタスクを行うものとして記載されてもよい。このような記載は、「構成されている」という表現を含むものと解釈されるべきである。１つ以上のタスクを実行するように構成されているユニット／回路／構成要素を規定することは、そのユニット／回路／構成要素についての３５Ｕ．Ｓ．Ｃ§１１２（ｆ）の解釈を呼び出さないことを明確に意図している。
【００１８】
本明細書は、「一実施形態」または「ある実施形態」への言及を含む。「一実施形態において」または「一実施形態において」という表現が現れても、必ずしも同一の実施形態を指すものではないが、本明細書において明示的に否認されない限り、特徴の任意の組み合わせを含む実施形態が一般的に企図される。特定の特徴、構造、または特性が、本開示と矛盾しない任意の適切な方法で組み合わせられてもよい。
【発明を実施するための形態】
【００１９】
ディープニューラルネットワークは、大規模なデータセットと共に広範な一般的問題を解く際にますます重要になってきている。しかしながら、これらのネットワークは、ニューロンの重み付けを更新するために、トレーニングフェーズの間、パス当たり２倍以上の処理時間を有するかなりの量の処理時間を、畳み込みおよびマトリックス乗算に費やす。ゆっくりと収束するネットワークでは、さらに多数のパスが必要になることがある。その結果、効率的な畳み込み計算がますます重要になっている。
【００２０】
ベクトル命令を提供する中央処理装置（ＣＰＵ）を用いて効率的な直接畳み込み演算を提供するための方法およびシステムが記載される。効率的な直接畳込み演算は、ディープニューラルネットワークアプリケーションおよび畳込み演算がかなりの計算資源を必要とする他のアプリケーションにおいて有用である。メインＣＰＵに畳み込みを実装することにより、システムが、専用ハードウェアアクセラレータまたは汎用ＧＰＵ（ＧＰＧＰＵ）ソリューションの必要性を回避することができ、従って、畳み込みニューラルネットワークアプリケーションにおいてより良好な性能スケーリングを可能にする。
【００２１】
図１は、コンピュータシステムの一実施形態のブロック図を提供する。コンピュータシステム１００は、ＩＯバス１３０に取り付けられたプロセッサ１１０、メモリ１２０、およびマスストレージデバイス１４０を含む。プロセッサ１１０は、キャッシュ１１６に結合された、レジスタファイル１１４を含む実行コア１１２を含む。特定の構成要素がコンピュータシステム１００に示され記載されているが、代替的な実施形態では、異なる構成要素および異なるの数の構成要素が存在してもよいことに留意されたい。例えば、コンピュータシステム１００がマスストレージデバイス１４０を含まなくてもよく、プロセッサ１１０に類似の複数のプロセッサが含まれてもよい。追加的に、単一のキャッシュ１１６がプロセッサ１１０の内部に示されているが、プロセッサ１１０の内部および外部の両方の複数のレベルを含む階層的キャッシュが存在してもよい。コンピュータシステム１００がまた、グラフィックス・プロセッサ、ユーザ・インターフェース・デバイス、ネットワーク・カード、および／またはＩＯバス１３０、ネットワーク、または他の通信チャネルを用いてプロセッサ１１０に結合される他の周辺デバイスを含んでもよい。
【００２２】
様々な実施形態では、プロセッサ１１０が、計算演算を実行する汎用プロセッサを代表するものであってもよい。例えば、プロセッサ１１０が、マイクロプロセッサ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）などの中央処理装置（ＣＰＵ）であってもよい。プロセッサ１１０が、スタンドアロン構成要素であってもよく、もしくは他の構成要素（例えば、他のプロセッサ、システムオンチップの他の構成要素（ＳＯＣ）もしくはＦＰＧＡ）と一体化されてもよく、または他の構成要素とマルチチップモジュール（ＭＣＭ）内の構成要素であってもよい。プロセッサ１１０が、ベクトル処理のための１つ以上のメカニズム（例えば、ベクトル実行ユニット）を含んでもよい。
【００２３】
図１に示すように、プロセッサ１１０が、実行コア１１２を含んでもよい。実行コア１１２が、プロセッサ１１０によって実装される命令セットアーキテクチャに定義された命令を実行するように構成されてもよい。実行コア１１２が、所望により、様々なマイクロアーキテクチャの特徴および実装の特徴を有してもよい。例えば、実行コア１１２が、スーパースカラーまたはスカラー実装を含んでもよい。実行コア１１２が、順序通りまたは順序外れの実装、および投機的または非投機的実装を含んでもよい。実行コア１１２が、上記特徴の任意の組み合わせを含んでもよい。実装が、いくつかの実施形態においてマイクロコードを含んでもよい。実行コア１１２がまた、各々が様々な種類（例えば、整数、浮動小数点、ベクトル、マルチメディア、ロード／記憶など）の演算を実行するように構成されている様々な実行ユニットを含んでもよい。実行コア１１２が、異なる数のパイプライン段階および分岐予測のような種々の他の性能向上機能を含んでもよい。実行コア１１２が、命令デコードユニット、スケジューラまたは予約ステーション、リオーダバッファ、メモリ管理ユニット、Ｉ／Ｏインターフェースなどのうちの１つ以上を含んでもよい。
【００２４】
レジスタファイル１１４が、種々の命令のためのオペランドを記憶するために使用され得るレジスタセットを含み得る。レジスタファイル１１４が、オペランドのタイプに基づいて、様々なデータ・タイプのレジスタを含んでもよく、実行コア１１２は、レジスタ（例えば、整数、浮動小数点、マルチメディア、ベクトルなど）に記憶するように構成されている。レジスタファイル１１４が、アーキテクチャ化されたレジスタ（すなわち、プロセッサ１１０によって実装される命令セットアーキテクチャにおいて指定されるレジスタ）を含み得る。代替的または追加的に、レジスタファイル１１４が、物理レジスタを含み得る（例えば、レジスタリネームが実行コア１１２において実装される場合）。
【００２５】
キャッシュ１１６が、任意のキャッシュ構造を例示してもよい。例えば、キャッシュ１１６が、ハーバード・アーキテクチャ（命令フェッチのための別個の命令キャッシュと、メモリ参照演算のための実行ユニットによるデータ読み込み／書き込みのためのデータキャッシュ）として、共有命令、データキャッシュなどとして実装されてもよい。いくつかの実施形態において、ロード／記憶実行ユニットが、メモリ参照演算を実行するために設けられてもよい。
【００２６】
命令が、プロセッサ１１０によって実装される命令セットアーキテクチャにおいて定義される実行可能エンティティであってもよい。さまざまな命令セットアーキテクチャ（例えば、Ｉｎｔｅｌが元々開発したｘ８６アーキテクチャ、ＡＲＭ  ＨｏｌｄｉｎｇｓからのＡＲＭ、ＩＢＭ／ＭｏｔｏｒｏｌａからのＰｏｗｅｒ  ａｎｄ  ＰｏｗｅｒＰＣなど）がある。各命令は、メモリにおけるその符号化、その動作、およびレジスタ、メモリ位置、および／または他のプロセッサ状態に対するその影響を含む命令セットアーキテクチャにおいて定義される。命令セットアーキテクチャの所与の実装は、各命令を直接実行してもよいが、その形式が、プロセッサハードウェア内の復号および他の操作によって変更されてもよい。別の実装が、プロセッサ１１０内の実行ユニットによって実行されるために、少なくともいくつかの命令を複数の命令演算に復号してもよい。いくつかの命令が、いくつかの実施形態においてマイクロコード化されてもよい。
【００２７】
マスストレージデバイス１４０、メモリ１２０およびキャッシュ１１６は、プロセッサ１１０のためのデータおよび命令を記憶するメモリ階層を集合的に形成するストレージデバイスである。より詳細には、マスストレージデバイス１４０は、長いアクセス時間を有するディスクドライブ、大きなフラッシュメモリユニットなどの大容量の不揮発性メモリであってもよく、一方、キャッシュ１１６およびメモリ１２０が、より小さいが、アクセス時間がより短い。これらの高速な半導体メモリは、頻繁に使用されるデータのコピーを記憶する。メモリ１２０が、メモリデバイスのダイナミックランダムアクセスメモリ（ＤＲＡＭ）ファミリ内のメモリデバイスを表してもよい。メモリ１２０のサイズは、典型的には、キャッシュ１１６より大きいが、キャッシュ１１６は、典型的には、スタティックランダムアクセスメモリ（ＳＲＡＭ）ファミリのデバイスにおいて、より小さなデバイスを用いて実装される。いくつかの実施形態では、キャッシュ１１６、メモリ１２０、およびマスストレージデバイス１４０は、コンピュータシステム１００内の１つ以上のプロセッサ間で共有される。
【００２８】
データおよび命令が、コンピュータシステム（例えば、コンピュータシステム１００）によって使用されるコードおよび／またはデータを記憶することができる任意のデバイスまたは記憶媒体であってもよい、非一時的なコンピュータ読み取り可能記憶デバイスに記憶されてもよいことに留意されたい。一般に、非一時的コンピュータ読み取り可能記憶デバイスは、揮発性メモリ、不揮発性メモリ、ディスクドライブ、磁気テープ、コンパクトディスク（ＣＤ）、デジタル多用途ディスクまたはデジタルビデオディスク（ＤＶＤ）、現在公知のまたは後に開発されるコンピュータ読み取り可能媒体を記憶する能力がある他の媒体などの磁気および光記憶デバイスを含むが、これらに限定されない。従って、マスストレージデバイス１４０、メモリ１２０、およびキャッシュ１１６は全て、非一時的コンピュータ読み取り可能記憶媒体の例である。
【００２９】
上述のように、実行コア１１２が、ベクトル命令を実行するように構成されてもよい。ベクトル命令は、それらが複数のデータ要素について並列に実行されるべき同じ演算を定義し得るという点で、古典的な意味で単一命令多重データ（ＳＩＭＤ）命令として定義され得る。命令のインスタンスによって操作されるデータ要素が、ベクトルと称されてもよく、データレーンに編成される。これらのデータ要素は、オペランドのタイプに基づいて、実行コア１１２がレジスタに記憶するように構成されている種々のマルチビットデータタイプのデータ（例えば、整数、浮動小数点、マルチメディア、ベクトルなど）を含んでもよい。簡単のために、本開示のベクトルは、８つのデータレーンを含むものとして表現されるが、これは、本開示をこの特定のベクトル構成に限定することを意図するものではないことを理解すべきである。それどころか、当業者であれば、ベクトルが任意の数のデータレーンを提供するように構成されてもよいことを認識するであろう。いくつかの実施形態において、ベクトルレジスタファイル内に３２個のベクトルレジスタがあってもよく、各ベクトルレジスタが１２８ビットを含み得る。しかし、別の実施形態では、ベクトルレジスタの数が異なってもよく、および／またはレジスタ当たりのビット数が異なってもよい。一般に、ベクトル長は、２のべき乗（例えば、２、４、８など）として実装されてもよい。しかしながら、いくつかの実施形態では、ベクトル長は２のべき乗である必要はない。さらに、レジスタリネームを実装する実施形態が、アーキテクチャ化されたベクトルレジスタに割り当ててもよい任意の数の物理レジスタを含んでもよい。アーキテクチャ化されたレジスタが、ベクトル命令においてオペランドとして指定可能なレジスタであってもよい。
【００３０】
デジタル信号処理では、畳み込みは、出力データセットの出力値を生成するデータセット内の入力値とその直近隣接値の重み付け和である。これらのデータセットが、入力値の隣接する値を決定する対応するデータ構成を有する１次元または多次元であってもよい。畳み込みの重み付け値は、カーネルが入出力データセットと同じ次元数を持つ畳み込みカーネルで指定される。
【００３１】
図２Ａは、１次元畳み込み演算２２５を示す。図２Ａにおいて、ソースデータ２００のデータ要素ｓ２は、３要素の畳み込みカーネル２１０と畳み込みされて、出力データ２２０においてデータ要素ｏ２を生成する。追加的に、ソースデータ２００のデータ要素ｓ１およびｓ３は、データ要素ｓ２の直近の左隣接および右隣接として畳み込みのために必要とされる。出力データは、畳み込みカーネル２１０のそれぞれの重み付け係数ｋ１〜ｋ３を用いたソースデータ要素の重み付け和であり、すなわち、ｏ２＝ｋ１＊ｓ１＋ｋ２＊ｓ２＋ｋ３＊ｓ３である。
【００３２】
図２Ｂは、２次元畳み込み演算２７５を示す。図２Ｂにおいて、ソースデータ２５０のデータ要素ｓ５は、３×３要素の畳み込みカーネル２６０と畳み込みされて、出力データ２７０においてデータ要素ｏ５を生成する。追加的に、ソースデータ２５０のデータ要素ｓ１〜ｓ４およびｓ６〜ｓ９は、データ要素ｓ２の左、右、上および下の直近隣接として、畳み込みのために必要とされる。出力データは、畳み込みカーネル２６０のそれぞれの重み付け係数ｋ１〜ｋ９を用いたソースデータ要素の重み付け和であり、すなわち、ｏ５＝ｋ１＊ｓ１＋ｋ２＊ｓ２＋ｋ３＊ｓ３＋ｋ４＊ｓ４＋ｋ５＊ｓ５＋ｋ６＊ｓ６＋ｋ７＊ｓ７＋ｋ８＊ｓ８＋ｋ９＊ｓ９である。
【００３３】
１次元および２次元畳み込みの例は、本開示をこれらの特定の畳み込み構成に限定することを意図していないことを理解されたい。それどころか、当業者は、畳み込みが任意の次元数で行われてもよいことを認識するであろう。さらに、この実施例は、畳み込みを１次元あたり３つの要素に制限することを意図するものではなく、当業者であれば、畳み込みが１次元あたり他の数の要素で行われてもよいことを認識するであろう。
【００３４】
図３は、いくつかの実施形態によるソースデータセットの事前シフトの方法を示す。整列データ３００に加えて、図３は、ベクトル整列が左１つのデータレーンにシフトされたデータセットに対応する左シフトデータ３１０と、ベクトル整列が右１つのデータレーンにシフトされたデータセットに対応する右シフトデータ３２０を示す。３つのデータセット、３００、３１０および３２０は、３つの列からなる畳み込みカーネルを使用する畳み込み演算に対応する。そのような畳み込みが、１次元畳み込みまたは多次元畳み込みであり得る。さらに、データセットの事前シフトは、３つの列の畳み込みに限定されないことを理解されたい。当業者であれば、任意の数の列がサポートされてもよく、例えば、５列の畳み込みが、合計５つのソースデータセット、図３に示される、３００、３１０および３２０の３つ、ならびに２回左にシフトしたデータセットおよび２回右にシフトしたデータセットを有してもよいことを理解するであろう。
【００３５】
図４は、事前シフトされたソースベクトルが与えられた１次元の３要素畳み込みカーネルを用いた畳み込み出力ベクトルの計算を示す。事前シフトされたソースベクトルが、いくつかの実施形態では図３に示すような事前シフトされたデータセットからロードされてもよいが、他の実施形態では様々な他の方法を用いてロードされてもよい。カーネルベクトル４１０Ａ、４１０Ｂおよび４１０Ｃが、図２Ａの畳み込みカーネル２１０のベクトル表現である。各カーネルベクトルは、カーネルベクトルの全てのデータレーンに複製されたそれぞれの畳み込みカーネル重み付け値から構成される。例えば、カーネルベクトル４１０Ｂは、畳み込みカーネル２１０の中程度の重み付け値に対応し、したがって、その重み付け値ｋ２は、そのすべてのデータレーンに複製される。したがって、出力ベクトル４２０は、ソースベクトル４００にそれぞれのカーネルベクトル４１０を乗算したものの合計である。図４に示す畳み込み計算が、３つのカーネル列のみを伴う畳み込みの実行に限定されず、任意の数のカーネル列を実装するように拡張されてもよい。
【００３６】
図５は、いくつかの実施形態による複数のデータベクトルの１次元３要素畳み込みを示すフロー図である。本方法は、図４のカーネルベクトル４１０に対応する３つのカーネルベクトルｖＫＬｅｆｔ、ｖＫＣｅｎｔｅｒおよびｖＫＲｉｇｈｔを初期化するステップ５０２から開始する。これらのベクトルは、畳み込み演算の継続期間中、一定のままであるため、１回だけロードされてもよい。
【００３７】
本方法は、図４のベクトル４００に対応する整列およびシフトされたソースベクトルｖＬｅｆｔ、ｖＣｅｎｔｅｒおよびｖＲｉｇｈｔをロードするステップ５０４に進む。いくつかの実施形態では、ｖＬｅｆｔ、ｖＣｅｎｔｅｒおよびｖＲｉｇｈｔが、図３に示すような事前シフトされたデータセットからロードされてもよいが、他の実施形態では、他の手段を介してロードされてもよい。
【００３８】
次いで、本方法は、ベクトルアキュムレータｖＡｃｃに加算される３つの重み付け和を行うステップ５０６に進む。各重み付け値は、多くのＳＩＭＤアーキテクチャに共通の乗算加算ベクトル命令を用いて計算されるが、いくつかの実施形態では、算術ベクトル命令の組み合わせを用いて実装されてもよい。ステップ５０６において、乗算加算ベクトル命令は、３つのオペランド、すなわち、第１のオペランドは基本ベクトル、第２のオペランドはソースベクトル、および第３のオペランドはカーネルベクトルをとるＭＡＤＤ演算によって表される。ＭＡＤＤ演算は、第２と第３のオペランドを乗算した後、積を第１のオペランドに加算し、結果ベクトルを返す。第１のＭＡＤＤ演算では、指定されたベースベクトルｖＺｅｒｏは、全てのデータレーンで０の値を含むベクトルに対応し、多くのＳＩＭＤアーキテクチャに共通である。このようにしてｖＺｅｒｏを用いることは、ベクトルアキュムレータｖＡｃｃを初期化する効率的な手段を提供するが、いくつかの代替的な実施形態では、同等のｖＺｅｒｏベクトルを提供しないＳＩＭＤアーキテクチャでは、ベクトルアキュムレータｖＡｃｃは、まず、代替手段によって初期化されてもよい。残りの２つのＭＡＤＤ演算では、指定されたベースベクトルはアキュムレータｖＡｃｃである。３つのソースベクトルｖＬｅｆｔ、ｖＣｅｎｔｅｒ、ｖＲｉｇｈｔにそれぞれのカーネルベクトルｖＫＬｅｆｔ、ｖＫＣｅｎｔｅｒ、ｖＫＲｉｇｈｔを乗算し、アキュムレータｖＡｃｃに加算される。
【００３９】
ＭＡＤＤ演算が完了すると、本方法はステップ５０８に進み、アキュムレータベクトルが宛先アドレスに書き込まれる。ステップ５１０で残余ベクトルの数がチェックされ、プロセスは、全てのベクトルが生成されるまでステップ５０４で継続する。
【００４０】
図５に開示された実施形態は、３つの要素カーネルで１次元畳み込みを実行するが、この実施形態は、３つの要素に限定されることを意図するものではなく、種々のカーネル幅を含み得ることを理解されたい。図５の実施形態は、重み付け和の効率的な計算を実装するが、図３に示されているような事前シフトされたソースデータに依存し、カーネル幅を広くするために、これらの事前シフトされたデータセットの使用は、メモリおよびオフチップ帯域幅に対するより大きな需要をもたらす。このため、シフトされたソースデータを導出するためのベクトル命令が図６Ａに開示されている。このベクトル命令の使用は、図５の実施形態と組み合わされるときに、特により広いカーネル幅で、オフチップ帯域幅要件を最小化する。
【００４１】
いくつかの実施形態において、抽出ベクトル命令を用いて、一対の整列ソースベクトルを用いて、畳み込み計算に必要なシフトされたデータベクトルを生成してもよい。抽出ベクトル命令の使用は、畳み込み演算のために最初に供給されたソースデータの使用を可能にし、従って、メモリおよびキャッシュ帯域幅の効率的な使用を可能にする。図６Ａは、そのような抽出ベクトル命令６２０の一例を示す。図６Ａでは、２つの連続するソースベクトル６００Ａおよび６００Ｂが連結され、得られた二重幅ベクトルのサブセットが、シフト６０５によって指定されたオフセットデータレーンから開始して抽出され、出力ベクトル６１０を生成する。任意で、出力ベクトルが出力データレーンの全ベクトル幅未満を含むことを可能にする出力幅６１５が指定されてもよい。この場合、出力ベクトル６１０の最右レーンはゼロを含む。図６Ａでは、８つのデータレーンのベクトル幅が、４のシフト６０５値および６の出力幅６１５値で示されている。
【００４２】
抽出ベクトル命令を用いて、畳み込み演算の種々の実施形態が、３つの整列ソースベクトル、中央整列ベクトル、および整列ベクトルを、中央整列ベクトルの直近の左および直近の右の整列ベクトルを用いて、広範囲の多様なカーネル幅に対してシフトされたソースベクトルをロードしてもよい。
【００４３】
図６Ｂは、図４に示すような１次元３要素畳み込みに対するソースベクトルのロードを示す。３つの整列ソースベクトル、中央ソースベクトル６２５Ｂ、中央ベクトルの直近左ソースベクトル６２５Ａ、および中央ベクトルの直近右ソースベクトル６２５Ｃがロードされる。抽出左演算６３０は、左ソースベクトル６２５Ａおよび中央ソースベクトル６２５Ｂ、ならびに図６Ａの抽出ベクトル命令６２０を用いて、ベクトル内のデータレーンの数、実施例では８から１を引いた数に等しいシフト値を用いて実行される。この演算により、左ベクトル６５０をもたらす。同様に、抽出右演算６４０は、中央ソースベクトル６２５Ｂおよび右ソースベクトル６２５Ｃ、ならびに図６Ａの抽出ベクトル命令６２０を用いて、１のシフト値を用いて実行される。この演算により、右ベクトル６７０をもたらす。次いで、ベクトル６５０、６６０、および６７０のセットが、図５に示すような畳み込みで使用され得る。当業者であれば、図６Ｂに示す方法が、３要素畳み込み演算に限定されることを意図するものではなく、しばしば図６Ｂに示すものを超える追加のソースベクトル６２５をロードする必要なく、種々のカーネル幅の畳み込みを行うために必要なベクトルを生成するために使用されてもよいことを理解するであろう。さらに、抽出ベクトル命令６２０の使用は、図３に示すような事前シフトされたデータの必要性を排除し、これは、畳み込み演算のためのデータサイズの増加を排除する。
【００４４】
図７は、いくつかの実施形態による図６Ｂの抽出方法を使用した、複数のデータベクトルの１次元３要素畳み込みを示すフロー図である。図７の畳み込みは、ベクトルデータの主メモリへのロードおよび記憶の数を最小化し、ベクトルデータの予備計算なしで元のソースデータを使用する。さらに、メインメモリへのロードおよび記憶のシーケンスは、システムキャッシュの高性能を可能にし、計算上の要求とキャッシュおよびメモリ帯域幅とのバランスをとる高性能畳み込み実装をもたらす。
【００４５】
本方法は、図４のカーネルベクトル４１０に対応する３つのカーネルベクトルｖＫＬｅｆｔ、ｖＫＣｅｎｔｅｒおよびｖＫＲｉｇｈｔを初期化するステップ７０２で開始する。これらのベクトルは、畳み込み演算の継続期間中、一定のままであるため、１回だけロードされてもよい。追加的に、左整列ソースベクトルｖＳｒｃＬｅｆｔが初期化され、第１のソースベクトルがｖＣｅｎｔｅｒにロードされる。
【００４６】
本方法は、右整列ソースベクトルｖＳｒｃＲｉｇｈｔをロードするステップ７０４に進む。ｖＳｒｃＬｅｆｔおよびｖＣｅｎｔｅｒが既にロードされているので、いったんｖＳｒｃＲｉｇｈｔがロードされると、本方法はステップ７０６に進み、ここでは、抽出ベクトル命令６２０を用いて、畳み込み計算のために左シフトベクトルおよび右シフトベクトルｖＬｅｆｔおよびｖＲｉｇｈｔを生成する。ステップ７０６において、抽出ベクトル命令６２０は、４つのオペランド（第１および第２オペランドはソースベクトルであり、第３オペランドはシフト値であり、第４オペランドは出力幅である）をとるＥＸＴＲＡＣＴ演算によって表される。ステップ７０６は、左シフトおよび右シフトされたソースベクトルｖＬｅｆｔおよびｖＲｉｇｈｔを生成し、これは、中央ベクトルｖＣｅｎｔｅｒと組み合わされると、畳み込みを実行するために使用されるベクトルを形成する。
【００４７】
次いで、本方法は、ベクトルアキュムレータｖＡｃｃに加算された３つの重み付け和を行うステップ７０８に進む。各重み付け値は、多くのＳＩＭＤアーキテクチャに共通の乗算加算ベクトル命令を用いて計算されるが、いくつかの実施形態では、算術ベクトル命令の組み合わせを用いて実装されてもよい。ステップ７０８において、乗算加算ベクトル命令は、３つのオペランド（第１のオペランドはベースベクトルであり、第２のオペランドはソースベクトルであり、第３のオペランドはカーネルベクトルである）をとるＭＡＤＤ演算によって表される。ＭＡＤＤ演算は、第２と第３のオペランドを乗算した後、積を第１のオペランドに追加し、結果ベクトルを返す。第１のＭＡＤＤ演算では、指定されたベースベクトルｖＺｅｒｏは、すべてのデータレーンで０の値を含むベクトルに対応し、多くのＳＩＭＤアーキテクチャに共通である。このようにしてｖＺｅｒｏを使用することは、ベクトルアキュムレータｖＡｃｃを初期化する効率的な手段を提供するが、いくつかの代替実施形態では、同等のｖＺｅｒｏベクトルを提供しないＳＩＭＤアーキテクチャでは、ベクトルアキュムレータｖＡｃｃは、まず、代替手段によって初期化されてもよい。残りの２つのＭＡＤＤ演算では、指定されたベースベクトルはアキュムレータｖＡｃｃである。３つのソースベクトルｖＬｅｆｔ、ｖＣｅｎｔｅｒ、ｖＲｉｇｈｔにそれぞれのカーネルベクトルｖＫＬｅｆｔ、ｖＫＣｅｎｔｅｒ、ｖＫＲｉｇｈｔを乗算し、アキュムレータｖＡｃｃに加算される。
【００４８】
ＭＡＤＤ演算が完了すると、本方法はステップ７１０に進み、ここでは、アキュムレータベクトルが宛先アドレスに書き込まれる。ステップ７１２において、ｖＣｅｎｔｅｒおよびｖＳｒｃＲｉｇｈｔベクトルは、それぞれｖＳｒｃＬｅｆｔおよびｖＣｅｎｔｅｒベクトルとなるようにシフトされ、次いで、ステップ７１４において残余ベクトルの数がチェックされ、プロセスは、全てのベクトルが生成されるまでステップ７０４において継続する。
【００４９】
いくつかの実施形態において、スカラー乗算加算ベクトル命令が使用されてもよい。従来の乗算加算ベクトル命令では、２つのベクトルが乗算され、その積が第３のベクトルに加算されて出力ベクトルを生成する。図８に示される開示されたスカラー乗算加算ベクトル命令８６０では、ソースベクトル８００の各レーンにカーネルベクトル８１０のレーン８２０によって指定されたスカラー量を乗算してスケールベクトル８３０を形成し、これをベースベクトル８４０に加算して出力ベクトル８５０を生成する。このベクトル命令を使用することにより、畳み込みカーネルの重み付け係数を、各重み付け係数に対してベクトルを使用するのではなく、ベクトルの個々のレーンにコンパクトに記憶することが可能になる。これにより、レジスタファイル１１４の使用およびオフチップ・バンド幅要件が低減される。
【００５０】
図９は、いくつかの実施形態による、図８のスカラー乗算加算ベクトル命令８６０を使用した、複数のデータベクトルの１次元３要素畳み込みを示すフロー図である。本方法は、単一カーネルベクトルｖＫｅｒｎｅｌをベクトルの種々のレーンにおける重み付け係数で初期化するステップ９０２から開始する。このベクトルは、畳み込み演算の継続期間中、一定のままであるので、１回だけロードされてもよい。
【００５１】
本方法は、図４のベクトル４００に対応する整列およびシフトされたソースベクトルｖＬｅｆｔ、ｖＣｅｎｔｅｒおよびｖＲｉｇｈｔをロードするステップ９０４に進む。いくつかの実施形態では、ｖＬｅｆｔ、ｖＣｅｎｔｅｒ、およびｖＲｉｇｈｔは、図３に示されるような事前シフトされたデータセットからロードされてもよく、他の実施形態では、それらは、図６Ａおよび図６Ｂに示されるような抽出ベクトル命令６２０および方法を使用するなどの他の手段を介してロードされてもよい。
【００５２】
次いで、本方法は、ベクトルアキュムレータｖＡｃｃに対して３つの重み付け和を行うステップ９０６に進む。各重み付け値は、図８のスカラー乗算加算ベクトル命令８６０を用いて計算される。ステップ９０６において、スカラー乗算加算ベクトル命令８６０は、４つのオペランド（第１のオペランドがベースベクトルであり、第２のオペランドがソースベクトルであり、第３のオペランドがカーネルベクトルであり、および第４のオペランドがスケーリング係数を含むカーネルベクトルのレーンである）をとるＳＣＡＬＡＲ＿ＭＡＤＤ演算によって表される。ＳＣＡＬＡＲ＿ＭＡＤＤ演算は、第２オペランドの各レーンに第３および第４オペランドで指定されたレーンを乗算した後、積を第１オペランドに追加して結果ベクトルを返す。第１のＳＣＡＬＡＲ＿ＭＡＤＤ演算では、指定されたベースベクトルｖＺｅｒｏは、すべてのデータレーンで０の値を含むベクトルに対応し、多くのＳＩＭＤアーキテクチャに共通である。このようにしてｖＺｅｒｏを使用することは、ベクトルアキュムレータｖＡｃｃを初期化する効率的な手段を提供するが、いくつかの代替的な実施形態では、同等のｖＺｅｒｏベクトルを提供しないＳＩＭＤアーキテクチャでは、ベクトルアキュムレータｖＡｃｃは、まず、代替手段によって初期化されてもよい。残りの２つのＳＣＡＬＡＲ＿ＭＡＤＤ演算では、指定されたベースベクトルはアキュムレータｖＡｃｃである。３つのソースベクトルｖＬｅｆｔ、ｖＣｅｎｔｅｒ、およびｖＲｉｇｈｔには、カーネルベクトルｖＫｅｒｎｅｌのそれぞれのデータレーンからロードされたそれぞれのカーネルスカラー値が乗算され、アキュムレータｖＡｃｃに追加される。
【００５３】
ＳＣＡＬＡＲ＿ＭＡＤＤ演算が完了すると、本方法はステップ９０８に進み、ここでは、アキュムレータベクトルが宛先アドレスに書き込まれる。残余ベクトルの数は、ステップ９１０でチェックされ、プロセスは、全てのベクトルが生成されるまで、ステップ９０４において継続する。
【００５４】
図９に開示された実施形態は、３要素カーネルで１次元畳み込みを行うが、本実施形態は、３つの要素に限定されることを意図するものではなく、種々のカーネル幅を含んでもよいことを理解されたい。さらに、前述の種々の実施形態は、１次元畳み込み演算を実装しているが、論じた方法は、多次元畳み込み演算にも同様に適用することができることを理解されたい。多次元畳み込みの場合、図４に示すようなソースベクトルセットを複数のアキュムレータベクトルに同時に適用して、多次元畳み込みを実装してもよい。
【００５５】
図１０は、事前シフトされたソースベクトルが与えられた２次元３×３要素畳み込みカーネルを用いた畳み込み出力ベクトルの部分計算を示す。左ベクトル１００２、中央ベクトル１００４、および右ベクトル１００６を含む事前シフトされたソースベクトルは、いくつかの実施形態では、図３に示すような事前シフトされたデータセットからロードされてもよく、または、図６Ａおよび図６Ｂに示すような抽出ベクトル命令６２０および方法を使用することを含む種々の他の方法を用いてロードされてもよい。３×３カーネル１０１０の様々な重み付け係数が、いくつかの実施形態では、図４に示すようにカーネルベクトル４１０として記憶されてもよく、または、他の実施形態では、図８のスカラー乗算加算ベクトル命令８６０と共に使用するために、カーネルベクトルの個々のデータレーンとして記憶されてもよい。左ベクトル１００２、中央ベクトル１００４および右ベクトル１００６は、３×３カーネル１０１０内にそれぞれ左、中央、右の列を有し、ここで、各列は、３行の重み付け係数を含む。３×３カーネル１０１０の各行は、それぞれのアキュムレータベクトル、第１行のためのリーディングアキュムレータ１０１８、第２行のための中央アキュムレータ１０１６、および第３行のラギングアキュムレータ１０１４を有する。
【００５６】
乗算加算ベクトル命令は、ソースベクトル１００２、１００４、および１００６の各々に対して３回、３つのアキュムレータベクトルの各々に対して１回、実行される。これにより、合計９つの乗算加算ベクトル命令をもたらし、各カーネルの重み付け係数に対して１つずつ指定される。乗算加算ベクトル命令ごとに、カーネルの行と列は、演算のそれぞれのソースベクトルとアキュムレータベクトルに基づいて選択される。従って、リーディングアキュムレータ１０１８は、係数ｋ１を使用する左ベクトル１００２、係数ｋ２を使用する中央ベクトル１００４、および係数ｋ３を使用する右ベクトル１００６の重み付け和である。同様に、中央アキュムレータ１０１６は、係数ｋ４を使用する左ベクトル１００２、係数ｋ５を使用する中央ベクトル１００４、および係数ｋ６を使用する右ベクトル１００６の重み付け和である。最後に、ラギングアキュムレータ１０１４は、係数ｋ７を使用する左ベクトル１００２、係数ｋ８を使用する中央ベクトル１００４、および係数ｋ９を使用する右ベクトル１００６の重み付け和である。
【００５７】
図１０は、単一セットのソースベクトルに対する出力ベクトルの部分計算のみを示す。各出力ベクトルの完全な計算のために、各宛先ベクトルの直上および直下のベクトルの重み付け和も実行されなければならない。図１０に示す方法をソースデータの列にわたって反復することによって、各ソースベクトルを、その関連する左シフトベクトルおよび右シフトベクトルと共に、１回だけロードしながら、完全な畳み込み計算が実行されてもよい。
【００５８】
図１０は、単純化のために３×３畳み込みカーネルを備えた畳み込み計算を示しているが、当業者であれば、示された計算が３つの行または３つの列のいずれかに限定されず、他の数の行、列または行および列をサポートするために使用されてもよいことを認識するであろう。さらに、示された計算が、２次元畳み込み演算に限定されることを意図するものではなく、２次元よりも大きな畳み込みを実行するために採用されてもよい。
【００５９】
図１１は、いくつかの実施形態による、図８のスカラー乗算加算ベクトル命令８６０および図６Ａの抽出ベクトル命令６２０を用いて、複数のデータベクトルの２次元３要素畳み込みの一部を示すフロー図である。本方法では、カーネルベクトルｖＫｅｒｎｅｌとｖＫｅｒｎｅｌ２がすでに重み付け係数で初期化されていると仮定する。この例では、ベクトルは８レーンのデータを含むと仮定されているが、９つの重み係数が必要であるため、２つのカーネルベクトルが使用されるが、当業者であれば、ベクトルおよび畳み込みカーネル構成に応じて、より多くまたはより少なくカーネルベクトルが使用され得ることを認識するであろう。本方法は、中央ソースベクトルｖＣｅｎｔｅｒをロードするステップ１１１０から開始する。このベクトルがロードされると、畳み込み計算にすぐに利用可能となる。
【００６０】
次いで、本方法は、２つの機能を行うステップ１１０２に進む。第１に、左整列ソースベクトルがロードされる。いったんこのベクトルがロードされると、ｖＣｅｎｔｅｒと組み合わせて左シフトベクトルｖＬｅｆｔを生成してもよい。第２に、前のステップでロードされたｖＣｅｎｔｅｒベクトルは、図８のスカラー乗算加算ベクトル命令８６０を用いて重み付き和計算を行うために使用される。
【００６１】
スカラー乗算加算ベクトル命令８６０は、４つのオペランド（第１のオペランドは基本ベクトルであり、第２のオペランドはソースベクトルであり、第３のオペランドはカーネルベクトルであり、第４のオペランドはスケーリング係数を含むカーネルベクトルのレーンである）をとるＳＣＡＬＡＲ＿ＭＡＤＤ演算によって表される。ＳＣＡＬＡＲ＿ＭＡＤＤ演算は、第２のオペランドの各レーンに第３および第４のオペランドで指定されたレーンを乗算した後、積を第１オペランドに加算して結果ベクトルを返す。
【００６２】
ｖＴｏｐおよびｖＭｉｄアキュムレータベクトルは、本方法の以前の反復から部分的な結果を有する可能性があるため、初期化されない。ただし、ｖＢｔｍアキュムレータは初期化する必要がある。ステップ１１０２のｖＢｔｍ計算で指定されたベースベクトルｖＺｅｒｏは、すべてのデータレーンにおいて０の値を含むベクトルに対応し、多くのＳＩＭＤアーキテクチャに共通である。このようにしてｖＺｅｒｏを使用することは、ベクトルアキュムレータｖＢｔｍを初期化する効率的な手段を提供するが、いくつかの代替的な実施形態では、同等のｖＺｅｒｏベクトルを提供しないＳＩＭＤアーキテクチャでは、ベクトルアキュムレータが、まず、代替的な手段によって初期化されてもよい。ステップ１１０２は、ＳＣＡＬＡＲ＿ＭＡＤＤ演算を用いて、ｖＣｅｎｔｅｒソースベクトルと、３×３畳み込みカーネルの中央列に対応する３つの重み付け値とを用いて、３つの部分和を計算する。
【００６３】
次いで、本方法は、ｖＳｒｃＲｉｇｈｔソースベクトルをロードするステップ１１０４に進む。ステップ１１０４はまた、既にロードされたｖＳｒｃＬｅｆｔおよびｖＣｅｎｔｅｒベクトル、ならびに図６Ａの抽出ベクトル命令６２０を用いて、ｖＬｅｆｔベクトルをロードする。抽出ベクトル命令６２０は、４つのオペランド（第１および第２のオペランドはソースベクトルであり、第３のオペランドはシフト値であり、第４のオペランドは出力幅である）をとるＥＸＴＲＡＣＴ演算によって表される。
【００６４】
次いで、本方法は、既にロードされたｖＣｅｎｔｅｒベクトルおよびｖＳｒｃＲｉｇｈｔベクトル、ならびに図６Ａの抽出ベクトル命令６２０を用いてｖＲｉｇｈｔベクトルをロードするステップ１１０６に進む。追加的に、ステップ１１０４でロードされたｖＬｅｆｔベクトルは、３×３畳み込みカーネルの左列に対応する３つの重み付け値を用いて、図８のスカラー乗算加算ベクトル命令８６０を用いて重み付け和計算を行うために使用される。
【００６５】
次いで、本方法は、ステップ１１０６でロードされたｖＲｉｇｈｔベクトルが、３×３畳み込みカーネルの右列に対応する３つの重み付け値を用いて、図８のスカラー乗算加算ベクトル命令８６０を用いて重み付け和計算を行うために使用される。
【００６６】
次いで、本方法は、ソースベクトルの部分和がソース行について完了したステップ１１１０に進む。この時点で、アキュムレータｖＴｏｐはすべての行を完了し、宛先ベクトルに書き込まれてもよい。本方法は、ステップ１１１２に進み、ここで、残余２つのアキュムレータ、ｖＭｉｄおよびｖＢｔｍが、次の計算行の準備のために、それぞれｖＴｏｐおよびｖＭｉｄ位置にシフトされる。
【００６７】
図１１のフロー図は、簡略化のために３×３の畳み込みカーネルを備えた畳み込み計算を示しているが、当業者であれば、示された計算が３つの行または３つの列のいずれかに限定されず、他の数の行、列または行および列をサポートするために使用され得ることを認識するであろう。さらに、示された計算が、２次元畳み込み演算に限定されることを意図するものではなく、２次元よりも大きな畳み込みを実行するために使用されてもよい。
【００６８】
本明細書で論じる畳み込み演算の様々な実施形態が、非常に多様なアプリケーションに適用されてもよいが、様々な実施形態が、機械学習およびディープニューラルネットワークに適用するときに特に有用であり得る。これらのアプリケーションにおいて、畳み込みステップが、かなり時間集約的で資源効率の悪い演算として認識される。その結果、プロセッサは、この演算を加速するように調整され得る。畳み込み段階は、畳み込みネットワーク（Ｄ‐ＣＮＮ）、ＬＳＴＭのようなリカレントニューラルネットワーク、ジェネラルアドバサリアル（ＧＡＮ）などを含む、広範囲のディープニューラルネットワーク（ＤＮＮ）にますます追加されている。汎用ＣＰＵコア上で利用可能なＳＩＭＤ命令を用いて直接畳み込み演算を行うことによって、従来のプロセッサパイプラインに適合し、従って余分なハードウェアを最小化または排除しながら、特殊化された空間畳み込みニューラルネットワークハードウェアを使用することを可能とする効率的またはより効率的な畳み込みが実行されてもよい。さらに、これらのアプリケーションにおける畳み込みは、多くの小さな畳み込みカーネルを使用する所与のデータセットに対して反復して採用されることが多いので、このアプローチは、個々の畳み込み演算が個々のプロセッサコアに専用とすることができるので、優れたプロセッサ利用を可能にし、単に追加のプロセッサ資源を追加することによってシステムをうまくスケールすることを可能にする。最後に、本明細書に記載されるＳＩＭＤ命令の様々な実施形態が、畳み込みを超える広範囲の動作に利点を提供してもよい。
【００６９】
いくつかの実施形態では、畳み込み演算の計算要求および出力サイズを低減するために、ストライドが使用されてもよい。この場合、ストライド値は、計算されたすべてのデータ要素に対してスキップできるデータ要素の数を指定する。例えば、２のストライドが採用される場合、他のすべてのデータ要素はスキップされ、データ要素の半分のみが計算される。多次元畳み込み次元の場合、データ要素の行をスキップすることによって、ストライドを効率的に採用することができるが、本明細書に記載される種々の実施形態における１次元畳み込みの場合、ストライド係数は、実行コアの算術論理ユニットの利用を低下させるのに役立つ。この理由のために、シャッフルされたデータセットを採用して、ベクトル命令の他に利用されていないデータレーンの使用を可能にすることができる。この場合、シャッフルベクトル命令の様々な実施形態が開示されており、シャッフルされたソースデータベクトルが、１よりも大きいストライド値を有する畳み込みの実装のためにロードされることを可能にする。
【００７０】
図１２Ａは、いくつかの実施形態による、そのようなシャッフルベクトル命令１２４０の実施例を示す。図１２Ａでは、ソースベクトル１２００が連結され、得られたベクトルのサブセットが、ソースレーン１２１０から始まり、ストライド１２２０によって指定されたストライド値を実装して、抽出される。結果は、出力ベクトル１２３０に書き込まれる。必要とされるソースベクトル１２００の数は、ストライド１２２０と等しく、すべてのデータレーン内のデータ要素を含む出力ベクトルをもたらす。いくつかの実施形態において、ソースベクトル１２００の各々は、命令オペランドを用いて指定されてもよい。他の実施形態において、ソースベクトル１２００は、ベクトルの範囲を指定するオペランドを用いて指定されてもよい。
【００７１】
図１２Ｂは、いくつかの実施形態による、シャッフルベクトル命令１２９０の別の実施例を示す。図１２Ｂでは、１つ以上のベクトルを含むソースベクトル１２５０の固定数が連結され、得られたベクトルのサブセットが、ソースレーン１２６０から始まり、ストライド１２６５によって指定されたストライド値を実装して、抽出される。結果は出力ベクトル１２８０に書き込まれる。ソースベクトル１２５０の数は固定され、ストライド１２６５よりも小さくてもよいので、出力ベクトルが、すべてのデータレーンの連続するサブセットのみを含んでもよい。この理由のために、第１の出力レーン１２７０を指定して出力データレーンを抽出するために、追加のオペランドが提供されてもよい。
【００７２】
図１３は、２のストライド値を含む１次元３要素畳み込みに対するソースベクトルのロードを示す。３つの整列ソースベクトルがロードされ、中央ソースベクトル１３００Ｂ、中央ベクトルの直近左ソースベクトル１３００Ａ、および中央ベクトルの直近右ソースベクトル１３００Ｃがロードされる。抽出演算１３１０Ａは、図６Ａの左および中央ソースベクトル１３００Ａおよび１３００Ｂ、ならびに抽出ベクトル命令６２０を用いて、ベクトル内のデータレーン数に等しいシフト値、実施例では８から１を引いた値を用いて行われる。同様に、抽出演算１３１０Ｂは、中央および右ソースベクトル１３００Ｂおよび１３００Ｃ、ならびに図６Ａの抽出ベクトル命令６２０を用いて、１のシフト値を用いて実行される。抽出演算１３１０Ａおよび１３１０Ｂは、中間ソースベクトル１３２０Ａおよび１３２０Ｂをもたらし、それらはシャッフル演算１３３０Ａに入力される。シャッフル演算１３３０Ａは、ソースレーン１２１０の値がゼロであり、ストライド１２２０の値が２である図１２Ａのシャッフルベクトル命令１２４０を採用して、ソースベクトル１３００Ａのデータレーンｌ８で開始する元のソースベクトル１３００の交互のデータレーンを含む左ベクトル１３４０Ａを生成する。
【００７３】
次いで、ソースベクトル１３００Ｂおよび１３００Ｃがシャッフル演算１３３０Ｂおよび１３３０Ｃに入力される。シャッフル演算１３３０Ｂは、中央ベクトル１３４０Ｂを生成するために、ソースレーン１２１０の値がゼロであり、ストライド１２２０の値が２である図１２Ａのシャッフルベクトル命令１２４０を使用し、シャッフル演算１３３０Ｃは、ソースレーン１２１０の値が１であり、ストライド１２２０の値が２である図１２Ａのシャッフルベクトル命令１２４０を用いて、右ベクトル１３４０Ｂを生成する。したがって、中央ベクトル１３４０Ｂは、ソースベクトル１３００Ｂのデータレーンｃ１から開始する元のソースベクトル１３００の交互のデータレーンを含み、右ベクトル１３４０Ｃは、ソースベクトル１３００Ｂのデータレーンｃ２から開始する元のソースベクトル１３００の交互のデータレーンを含む。
【００７４】
次いで、ベクトル１３４０のセットを、図５に示すような畳み込みで、または図１１に示す方法と組み合わせて用いて、ストライドによる多次元畳み込みを実装してもよい。当業者であれば、図１３に示す方法が、３要素の畳み込み演算または２のストライド値に限定されることを意図するものではなく、図１３に示すものを超える追加のソースベクトル１３００をロードする必要がなく、種々のカーネルの幅およびストライド値に対して畳み込みを実行するために必要なベクトルを生成するために使用されてもよいことを認識するであろう。また、当業者であれば、３を超えるカーネル幅および／または２を超えるストライドを実装する実施形態は、図１３に示されるものを超えるさらなるソースベクトル１３００を必要とし得ること、ならびにさらなる抽出演算１３１０が、これらの特定の実施形態によって必要とされることを認識するであろう。抽出ベクトル命令６２０およびシャッフルベクトル命令１２４０または１２９０の使用は、図３に示されるような事前シフトされたデータの必要性を排除し、ストライド特徴を実装する畳み込み演算のためのデータサイズの増加を排除する。
【図１】
2020533691.tif 000003
【図２Ａ】
2020533691.tif 000004
【図２Ｂ】
2020533691.tif 000005
【図３】
2020533691.tif 000006
【図４】
2020533691.tif 000007
【図５】
2020533691.tif 000008
【図６Ａ】
2020533691.tif 000009
【図６Ｂ】
2020533691.tif 000010
【図７】
2020533691.tif 000011
【図８】
2020533691.tif 000012
【図９】
2020533691.tif 000013
【図１０】
2020533691.tif 000014
【図１１】
2020533691.tif 000015
【図１２Ａ】
2020533691.tif 000016
【図１２Ｂ】
2020533691.tif 000017
【図１３】
2020533691.tif 000018
【国際調査報告】
2020533691.tif 000019
2020533691.tif 000020
2020533691.tif 000021
2020533691.tif 000022