(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2022-08-04
(54)【発明の名称】深層学習アルゴリズムのための効率的なアーキテクチャ
(51)【国際特許分類】
G06F 15/80 20060101AFI20220728BHJP
G06F 9/34 20060101ALI20220728BHJP
G06F 9/38 20060101ALI20220728BHJP
【FI】
G06F15/80
G06F9/34 330
G06F9/38 370A
【審査請求】有
【予備審査請求】未請求
(21)【出願番号】P 2021563271
(86)(22)【出願日】2020-04-02
(85)【翻訳文提出日】2021-10-25
(86)【国際出願番号】 US2020026337
(87)【国際公開番号】W WO2020222971
(87)【国際公開日】2020-11-05
(32)【優先日】2019-04-29
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
(71)【出願人】
【識別番号】519182279
【氏名又は名称】デジラム コーポレーション
(74)【代理人】
【識別番号】110001379
【氏名又は名称】特許業務法人 大島特許事務所
(72)【発明者】
【氏名】チラッパガリ、シャシ キラン
(72)【発明者】
【氏名】リー、ウィンストン
【テーマコード(参考)】
5B013
5B033
【Fターム(参考)】
5B013DD01
5B013DD05
5B033DD01
5B033DD09
(57)【要約】
複数のSIMDエンジンと対応する複数の出力レジスタセットとを含むコンピュータシステム。オペランドAレジスタファイルは、各々が複数のオペランドワードを含む1つ以上のオペランドA値を格納する。オペランドBレジスタファイルは、各々が複数のオペランドワードを含む1つ以上のオペランドB値を格納する。オペランドA分配回路は、オペランドAレジスタファイルからオペランドA値を受信し、受信したオペランドA値のオペランドワードのうちの1つ以上を選択的にルーティングして複数の入力オペランドA値を作成し、複数の入力オペランドA値はSIMDエンジンに選択的にルーティングされる。オペランドB分配回路は、オペランドBレジスタファイルから1つ以上のオペランドB値を受信し、オペランドB値のオペランドワードのうちの1つ以上を選択的にルーティングして複数の入力オペランドB値を作成し、複数の入力オペランドB値はSIMDエンジンに選択的にルーティングされる。
【選択図】
図4
【特許請求の範囲】
【請求項1】
コンピュータシステムであって、
複数の単一命令複数データエンジンと、
各々が前記複数の単一命令複数データエンジンのうちの対応する1つに結合された、複数の出力レジスタセットと、
第1の複数のオペランド値を格納した第1のオペランドレジスタファイルであって、前記第1の複数のオペランド値の各々が複数のオペランドワードを含む、該第1のオペランドレジスタファイルと、
第2の複数のオペランド値を格納した第2のオペランドレジスタファイルであって、前記第2の複数のオペランド値の各々が複数のオペランドワードを含む、該第2のオペランドレジスタファイルと、
前記第1のオペランドレジスタファイルから第1のオペランド値を受信するように結合された第1の入力分配回路であって、前記第1の入力分配回路は、前記第1のオペランド値の前記オペランドワードのうちの1つ以上を選択的にルーティングして複数の第1の入力オペランド値を作成し、前記第1の入力オペランド値の各々は、前記複数の単一命令複数データエンジンのうちの対応する1つにルーティングされる、該第1の入力分配回路と、
前記第2のオペランドレジスタファイルから1つ以上の第2のオペランド値を受信するように結合された第2の入力分配回路であって、前記第2の入力分配回路は、前記1つ以上の第2のオペランド値の前記オペランドワードのうちの1つ以上を選択的にルーティングして複数の第2の入力オペランド値を作成し、前記第2の入力オペランド値の各々は、前記複数の単一命令複数データエンジンのうちの対応する1つにルーティングされる、該第2の入力分配回路と、を備える、コンピュータシステム。
【請求項2】
前記第1の入力分配回路は、前記第1のオペランド値を、前記第1の入力オペランド値として前記複数の単一命令複数データエンジンの各々に選択的にルーティングする、請求項1に記載のコンピュータシステム。
【請求項3】
前記第1の入力分配回路は、前記第1のオペランド値の前記オペランドワードのうちの単一の1つを選択的にルーティングして、前記第1の入力オペランド値のすべてを作成する、請求項1に記載のコンピュータシステム。
【請求項4】
前記第1の入力分配回路は、前記第1の入力オペランド値の各々が、前記第1のオペランド値の繰り返されたオペランドワードを含むように、前記第1のオペランド値の前記オペランドワードを選択的にルーティングする、請求項1に記載のコンピュータシステム。
【請求項5】
前記第2の入力分配回路は、異なる第2のオペランド値を前記複数の単一命令複数データエンジンの各々に選択的にルーティングする、請求項1に記載のコンピュータシステム。
【請求項6】
前記第2の入力分配回路は、異なる第2のオペランド値を前記複数の単一命令複数データエンジンのうちの少なくとも2つに選択的にルーティングする、請求項1に記載のコンピュータシステム。
【請求項7】
前記第2の入力分配回路は、同一の第2のオペランド値を前記複数の単一命令複数データエンジンの各々に選択的にルーティングする、請求項1に記載のコンピュータシステム。
【請求項8】
前記第2の入力分配回路は、第1の複数の第2のオペランドバッファを含み、前記第1の複数の第2のオペランドバッファの各々は、前記第2のオペランドレジスタファイルからの前記第2のオペランド値のうちの1つを格納するように構成されている、請求項1に記載のコンピュータシステム。
【請求項9】
前記第2のオペランドレジスタファイルは、各々が前記第2のオペランドバッファのうちの対応する1つに結合された複数のレジスタファイルを含む、請求項8に記載のコンピュータシステム。
【請求項10】
前記第2の入力分配回路は、前記第2のオペランドバッファを前記複数の単一命令複数データエンジンに並列に結合するための手段を含む、請求項8に記載のコンピュータシステム。
【請求項11】
前記第2の入力分配回路は、第2の複数の第2のオペランドバッファをさらに含み、前記第2の複数の第2のオペランドバッファの各々は、前記第2のオペランドレジスタファイルからの前記第2のオペランド値のうちの1つを格納するように構成されている、請求項8に記載のコンピュータシステム。
【請求項12】
前記第2のオペランドレジスタファイルは、複数のレジスタファイルを含み、前記複数のレジスタファイルは、前記第2の入力分配回路に並列に結合されている、請求項1に記載のコンピュータシステム。
【請求項13】
前記第2の入力分配回路は、前記第2のオペランドレジスタファイルの前記複数のレジスタファイルから複数の前記第2のオペランド値を受信するように結合されたシフトロジック回路を備え、前記シフトロジック回路は、前記複数の前記第2のオペランド値の前記オペランドワードをシフトさせて、複数の入力第2のオペランド値を作成するように構成されている、請求項12に記載のコンピュータシステム。
【請求項14】
前記シフトロジック回路から前記複数の入力第2のオペランド値を受信するように結合された、複数の第2のオペランドバッファをさらに備える、請求項13に記載のコンピュータシステム。
【請求項15】
前記複数の第2のオペランドバッファを前記複数の単一命令複数データエンジンに結合するスイッチング回路をさらに備える、請求項14に記載のコンピュータシステム。
【請求項16】
複数の出力レジスタセットを含む出力回路をさらに備え、前記出力レジスタセットの各々は、前記単一命令複数データエンジンのうちの対応する1つに結合されている、請求項1に記載のコンピュータシステム。
【請求項17】
前記出力レジスタセットの各々は、前記対応する単一命令複数データエンジンに累積値を提供するように、かつ前記対応する単一命令複数データエンジンによって提供される前記累積値を格納するように構成されている、請求項16に記載のコンピュータシステム。
【請求項18】
前記出力レジスタセットの各々は、独立してアドレス指定される、請求項16に記載のコンピュータシステム。
【請求項19】
前記単一命令複数データエンジンの各々は、前記第1の入力分配回路から受信した前記第1の入力オペランド値の前記オペランドワードを、前記第2の入力分配回路から受信した前記第2の入力オペランド値の前記オペランドワードを用いて乗算するように構成され、これによって、前記単一命令複数データエンジンの各々は対応する複数の積値を生成する、請求項1に記載のコンピュータシステム。
【請求項20】
複数の出力レジスタセットを含む出力回路をさらに備え、前記出力レジスタセットの各々は、前記単一命令複数データエンジンのうちの対応する1つに結合されている、請求項19に記載のコンピュータシステム。
【請求項21】
前記出力レジスタセットの各々は、対応する複数の累積値を前記単一命令複数データエンジンのうちの前記対応する1つに提供するように構成されて構成され、前記単一命令複数データエンジンの各々は、受信された前記累積値を、前記対応する生成された積値に追加するように構成され、これによって、前記単一命令複数データエンジンの各々は対応する複数の更新された累積値を生成する、請求項20に記載のコンピュータシステム。
【請求項22】
前記出力レジスタセットの各々は、前記単一命令複数データエンジンのうちの前記対応する1つから、前記対応する複数の更新された累積値を受信および格納するように構成されている、請求項21に記載のコンピュータシステム。
【請求項23】
複数の単一命令複数データエンジンと複数の対応する出力レジスタとを含むコンピュータシステムを使用して、第1の行列および第2の行列の行列乗算を実行する方法であって、前記方法は、
前記第1の行列に含まれる複数の非ゼロエントリを識別することであって、前記非ゼロエントリの各々が、前記第1の行列内に対応する列アドレスと対応する行アドレスとを有する、該識別することと、
識別された前記非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する行アドレスに応答して前記非ゼロエントリを処理するために、前記単一命令複数データエンジンのうちの1つおよび前記出力レジスタのうちの対応する1つを識別することと、
前記識別された単一命令複数データエンジンおよび対応する出力レジスタに基づいて前記非ゼロエントリをソートし、これによって複数の第1のオペランド値を作成することであって、前記第1のオペランド値の各々は、各々が異なる識別された単一命令複数データエンジンと対応する前記出力レジスタとを有する複数の前記非ゼロエントリを含む、該作成することと、
乗算演算を実行するために、前記第1のオペランド値を前記単一命令複数データエンジンにルーティングすることであって、前記ルーティングにより、前記第1のオペランド値に含まれる前記非ゼロエントリの各々が、前記識別された単一命令複数データエンジンに提供される、該ルーティングすることと、を含む、方法。
【請求項24】
前記識別された非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する列アドレスに応答して、前記第2の行列内のエントリの行を識別することと、
乗算演算を実行するために、識別された前記エントリの行を前記単一命令複数データエンジンにルーティングすることであって、前記単一命令複数データエンジンの前記各々は、前記非ゼロエントリをその識別されたエントリの行を用いて乗算する、該ルーティングすることと、をさらに含む、請求項23に記載の方法。
【請求項25】
前記識別された非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する行アドレスに応答して、前記出力レジスタのうちの前記対応する1つ内の行を識別することと、
前記出力レジスタの識別された前記行にアクセスすることによって、累積演算を実行することと、をさらに含む、請求項24に記載の方法。
【請求項26】
前記第1の行列の各行は、機械学習システムにおける重みベクトルを表し、前記第2の行列の各列は、前記機械学習システムにおける活性化ベクトルを表す、請求項23に記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
関連出願
【0002】
本出願は、2019年4月29日に出願された「Efficient Architectures for Deep Learning Algorithms」と題された米国特許出願第16/397,401号の優先権を主張し、参照により本明細書に組み込まれる。
【0003】
単一命令複数データ(SIMD)エンジンを使用して、行列乗算および畳み込みなどの計算を実行するための、複数のエネルギー効率の良いアーキテクチャが提供される。これらの演算は、コンピュータビジョン、機械翻訳、および自動音声認識などの様々なアプリケーションで現在実装されている様々な機械学習アルゴリズムの中心である。
【背景技術】
【0004】
従来のドット積および行列乗算について以下に詳細に説明する。
【0005】
2つのベクトルのドット積は以下のように定義できる。p=[p1 p2...pn]およびq=[q1 q2...qn]を、長さnの2つのベクトルとする。p・qで表されるpとqのドット積を、次のように定義する。
【0006】
【0007】
長さnの2つのベクトルのドット積を計算するには、n乗算および(n-1)加算が必要である。
【0008】
2つのベクトルの乗算は以下のように定義できる。Aを(m×n)行列とする(すなわち、Aはm行(水平)およびn列(垂直)を有する行列である)。ai,jは、行列Aのi番目の行とj番目の列の要素を表すとする。Bを(n×k)行列とする。行列AおよびBを以下に示す。
【0009】
【0010】
行列AおよびBは、それらの次元に互換性がある場合(すなわち、Aの列数がBの行数に等しい場合)にのみ乗算することができる。行列AとBの積であるCを以下に定義する。
【0011】
【0012】
式(3)から、行列Cはm行とk列を持つことが分かる。A×Bが存在する可能性はあるが、B×Aは存在しないことにも留意されたい。
【0013】
行列乗算の1つの考え方は以下のとおりである。行列Cのi番目の行およびj番目の列の要素は、行列Aのi番目の行と行列Bのj番目の列とのドット積である。行列Aのi番目の行をai,:で表し、行列Bのj番目の列をb:,jで表すと、以下のとおりとなる。
【0014】
【0015】
したがって、次元(m×n)および(n×k)の2つの行列の乗算は、長さnのベクトルの計算(m×k)ドット積からなる。
【0016】
上述したように、長さnの2つのベクトルのドット積を計算するには、n乗算および(n-1)加算が必要である。ドット積の計算は、一般に、一連の積和演算として実装される。積和演算は、2つの数値の積を計算し、その積を累積器に追加する。これは次のように表すことができる。
【0017】
【0018】
ここで、aとbは乗算された2つの数であり、cは累積器である。積和演算を行うハードウェアユニットは、乗算累積器(MAC)ユニットとして知られている。本書では、積和演算をMACとも呼ぶ。
図1は、簡略したMACユニット100のブロック図であり、それぞれオペランド値aおよびbを格納する入力オペランドレジスタ101および102、乗算回路103、加算回路104、および累積値cを格納する累積器レジスタ105を含む。
【0019】
上述したように、行列乗算は、複数のドット積を計算することを伴う。したがって、行列乗算は、複数のMACを使用することによって並列化することができる。
図2は、複数のドット積を並列に実施するための複数の並列MAC201~204を含む、システム200のブロック図である。MAC201、202、203、および204は、それぞれオペランドレジスタ211~212、213~214、215~216、および217~218を含み、それぞれ乗算回路221、222、223、および224を含み、それぞれ加算回路231、232、233、および234を含み、それぞれ累積器241、242、243、および244を含む。
【0020】
システム200は、4つの並列MACを含み、MAC201がa1,:とb:,1のドット積を計算し、MAC202がa2,:とb:,1のドット積を計算し、MAC203がa3,:とb:,1のドット積を計算し、MAC204がa4,:とb:,1のドット積を計算する。4つのMAC201~204は、異なる行の行列Aを使用するが、それらはすべて、同じ行列Bを使用することに留意されたい。MAC201~204に入力データを供給することは、解決されるべき課題である。したがって、MAC201~204などの演算ユニットに必要なデータを供給するための効率的な方法を有することが望ましいであろう。
【0021】
図2のすべてのMACユニット201~204は、同じ演算を実行しているが、異なる入力を有することに留意されたい。したがって、MAC201~204の各々に個別の命令を提供する代わりに、すべてのMAC201~204を一緒にグループ化して共通の命令に応答して動作する、単一命令複数データ(SIMD)エンジンを形成することが可能である。
【0022】
図3は、SIMDエンジン300のブロック図であり、MAC201~204のオペランドレジスタ211、213、215および217をグループ化して第1のオペランドレジスタ301を形成し、MAC201~204のオペランドレジスタ212、214、216および218をグループ化して第2のオペランドレジスタ302を形成する。MAC201~204の乗算回路221~224が組み合わされて乗算器321が形成され、MAC201~204の加算回路231~234が組み合わされて加算回路331が形成される。MAC201~204の累積器241~244が組み合わされて累積器341が形成される。このようにして、並列MAC201~204の様々な要素が組み合わされて、SIMDエンジン300が形成される。異なるMAC201~204のスカラー入力が組み合わされて、SIMDエンジン300内にベクトル入力が形成されることに留意されたい。さらに、SIMDエンジン300の累積器341の出力もベクトルとなる。
【0023】
SIMDエンジンは、ベクトル入力を使用した単純な積和演算よりもはるかに多くを達成することができることに留意されたい。一般に、SIMDエンジンは、異なる演算を実行できる命令セットを持つブロックとして設計されている。SIMDエンジンが組み立てられて処理し得る演算の一部として、ベクトル加算、ベクトル乗算、2つのベクトルのドット積、およびベクトル比較(最小および最大)が挙げられる(が、これらに限定されない)。
【0024】
SIMDエンジンの別の重要な特徴は、異なるレベルの精度を処理できることである。例えば、128ビットの入力ベクトル幅を有するSIMDエンジンは、入力ベクトルを、128ビットのスカラー1つ、64ビットのスカラー2つ、32ビットのスカラー4つ、16ビットのスカラー8つ、または8ビットのスカラー16つ、のように解釈することができる。したがって、SIMDエンジンは、8ビットモード、16ビットモード、または32ビットモードなどの異なる「モード」で動作することができる。
【0025】
SIMDエンジンは、ベクトルを処理するのに効率的であり、かつ様々な命令を実行することができるが、大量の制御ロジックおよびローカルメモリを必要とする。単位シリコン面積あたりの最大演算数を得るためには、SIMDエンジンの数を最大化する必要があることが分かる。これを達成する1つのやり方として、複数のSIMDエンジンが制御ロジックとメモリリソースを共有できるように設計することがある。しかしながら、これは、SIMDエンジンによって実行され得る演算の種類に制限を課し、SIMDエンジンを駆動するために追加のロジックを必要とし得る。したがって、SIMDエンジンを含む改善されたコンピュータアーキテクチャを有することが望ましいであろう。
【発明の概要】
【課題を解決するための手段】
【0026】
したがって、本発明は、並列に動作する複数の単一命令複数データ(SIMD)エンジンを含む改良されたコンピュータアーキテクチャを提供する。オペランドAレジスタファイルは、第1の1つ以上のオペランド値セット(オペランドA値)を格納し、オペランドA値の各々は、複数のオペランドワードを含む。オペランドBレジスタファイルは、第2の複数の1つ以上のオペランド値(オペランドB値)を格納し、オペランドB値の各々は、複数のオペランドワードを含む。特定の実施形態では、オペランドA値およびオペランドB値の各々は、4つの32ビットオペランドワードを含む。別の実施形態では、オペランドA値およびオペランドB値の各々は、8つの16ビットオペランドワードを含む。
【0027】
オペランドA分配回路とオペランドB分配回路を含む入力分配ブロック。
【0028】
オペランドA分配回路は、オペランドAレジスタファイルからオペランドA値を受信するように結合されている。オペランドA分配回路は、受信したオペランドA値のオペランドワードのうちの1つ以上を選択的にルーティングして、複数の入力オペランドA値を作成し、入力オペランドA値の各々は、複数のSIMDエンジンのうちの対応する1つにルーティングされる。
【0029】
1つのモードでは、オペランドA分配回路は、受信したオペランドA値をSIMDエンジンの各々に並列にルーティングするように制御される。例えば、受信したオペランドA値が4つのオペランドワード[w、x、y、z]を含み、かつ4つの並列SIMDエンジンがある場合、SIMDエンジンの各々が、この4つのオペランドワード[w、x、y、z]を受信する。
【0030】
別のモードでは、オペランドA分配回路は、受信したオペランドA値のオペランドワードのうちの1つを、SIMDエンジンの各々に並列にルーティングするように制御される。このモードでは、オペランドワードのうちのこの選択された1つが、入力オペランドA値の各々を作成するために複数回繰り返される。例えば、受信したオペランドA値が4つのオペランドワード[w、x、y、z]を含み、オペランドワード[w]が選択され、かつ4つの並列SIMDエンジンが存在する場合、SIMDエンジンの各々が、4つのオペランドワード[w、w、w、w]を含む入力オペランドA値を受信することとなる。
【0031】
さらに別のモードでは、オペランドA分配回路は、受信したオペランドA値の異なるオペランドワードを、SIMDエンジンの各々に並列にルーティングするように制御される。このモードでは、各異なるオペランドワードを複数回繰り返して、入力オペランドA値の各々を作成する。例えば、受信したオペランドA値が4つのオペランドワード[w、x、y、z]を含み、かつ4つの並列SIMDエンジンがある場合、4つのSIMDエンジンのうちの1つが入力オペランドA値[w、w、w、w]を受信することとなり、4つのSIMDエンジンのうちの1つが入力オペランドA値[x、x、x、x]を受信することとなり、4つのSIMDエンジンのうちの1つが入力オペランドA値[y、y、y、y]を受信することとなり、かつ4つのSIMDエンジンのうちの1つが入力オペランドA値[z、z、z、z]を受信することとなる。
【0032】
オペランドB分配回路は、オペランドBレジスタファイルから1つ以上のオペランドB値を受信するように結合される。オペランドB分配回路は、受信したオペランドB値のうちの1つ以上のオペランドワードのうちの1つ以上を選択的にルーティングして、複数の入力オペランドB値を作成し、入力オペランドB値の各々は、複数のSIMDエンジンのうちの対応する1つにルーティングされる。
【0033】
1つのモードでは、オペランドB分配回路は、受信したオペランドB値をSIMDエンジンの各々に並列にルーティングするように制御される。例えば、受信したオペランドB値が4つのオペランドワード[a、b、c、d]を含み、かつ4つの並列SIMDエンジンがある場合、SIMDエンジンの各々が、この4つのオペランドワード[a、b、c、d]を受信する。
【0034】
別のモードでは、オペランドB分配回路は、複数のオペランドB値を格納するための複数のバッファを含む。オペランドB選択ロジックを使用して、どのSIMDエンジンが、バッファされたうちのどのオペランドB値を受信するかを選択する。例えば、バッファされたオペランドB値が[a、b、c、d]、[e、f、g、h]、[i、j、k、l]および[m、n、o、p]を含み、かつ4つの並列SIMDエンジンがある場合、この4つのSIMDエンジンのうちの1つが入力オペランドB値[a、b、c、d]を受信する場合があり、4つのSIMDエンジンのうちの1つが入力オペランドB値[e、f、g、h]を受信する場合があり、4つのSIMDエンジンのうちの1つが入力オペランドB値[i、j、k、l]を受信する場合があり、かつ4つのSIMDエンジンのうちの1つが入力オペランドB値[m、n、o、p]を受信する場合がある。あるいは、4つのSIMDエンジンのうちの2つが入力オペランドB値[a、b、c、d]を受信する場合があり、4つのSIMDエンジンのうちの1つが入力オペランドB値[e、f、g、h]を受信する場合があり、かつ4つのSIMDエンジンのうちの1つが入力オペランドB値[i、j、k、l]を受信する場合がある。
【0035】
様々な実施形態では、オペランドBレジスタファイルは、(複数のオペランドB値がオペランドBバッファに連続してロードされるように)単一のレジスタファイルを含むことができ、または(複数のオペランドB値がオペランドBバッファに並行してロードされるように)複数のレジスタファイルを含むことができる。複数のレジスタファイルを使用してオペランドBレジスタファイルが実装される場合、オペランドBバッファは、ダブルバッファ構成を使用して実装することができ、オペランドB値は、オペランドB値がオペランドB分配回路からSIMDエンジンに転送されると同時に、オペランドBレジスタファイルからオペランドB分配回路に転送される。
【0036】
さらに別のモードでは、オペランドB分配回路は、オペランドBレジスタファイルから複数のオペランドB値を並列に受信する。これらの受信したオペランドB値は、オペランドB分配回路内のシフトロジック回路に提供される。制御ロジックは、シフトロジック回路が受信したオペランドB値に導入するシフト量を(オペランドワードで)指定する。シフトされたオペランドB値は、オペランドB分配回路内にバッファされ、次いでSIMDエンジンに並列にルーティングされる。
【0037】
改良されたコンピュータアーキテクチャはまた、各々が複数のSIMDエンジンのうちの対応する1つに結合された、複数の出力レジスタセットを含む。データ(例えば、ドット積の値)は、出力レジスタセットと対応するSIMDエンジンとの間で選択的に転送され、積和演算などの演算を可能にする。一実施形態では、複数の出力レジスタセットの各々は独立してアドレス指定され、実行される演算に柔軟性をもたらす。
【0038】
特定の実施形態では、本発明のコンピュータアーキテクチャは、効率的な疎行列の乗算を可能にする。
【0039】
本発明は、以下の説明および図面を考慮してより完全に理解されるであろう。
【図面の簡単な説明】
【0040】
【
図1】従来の乗算累積器(MAC)ユニットのブロック図である。
【
図2】複数のドット積を並列計算するための複数の並列MACユニットを含む、従来システムのブロック図である。
【
図3】
図2の複数の並列MACユニットの様々な要素をグループ化することによって作成される、従来の単一命令複数データ(SIMD)エンジンのブロック図である。
【
図4】本発明の一実施形態によるコンピュータシステムのブロック図である。
【
図5】4つの32ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ1A)を示すブロック図である。
【
図6】8つの16ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ1A)を示すブロック図である。
【
図7】4つの32ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ2A)を示すブロック図である。
【
図8】4つの32ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ2A)を示すブロック図である。
【
図9】8つの16ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ2A)を示すブロック図である。
【
図10】8つの16ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ2A)を示すブロック図である。
【
図11】4つの32ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ3A)を示すブロック図である。
【
図12】8つの16ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ3A)を示すブロック図である。
【
図13】8つの16ビットオペランドワードを有する第1のオペランド値(オペランドA)を、オペランドAレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ3A)を示すブロック図である。
【
図14】4つの32ビットオペランドワードを有する第2のオペランド値(オペランドB)を、オペランドBレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ1B)を示すブロック図である。
【
図15】8つの16ビットオペランドワードを有する第2のオペランド値(オペランドB)を、オペランドBレジスタファイルから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ1B)を示すブロック図である。
【
図16】4つの32ビットオペランドワードを有する第2のオペランド値(オペランドB)を、オペランドBレジスタファイルおよび複数のオペランドBバッファから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ2B)を示すブロック図である。
【
図17】4つの32ビットオペランドワードを有する第2のオペランド値(オペランドB)を、複数の並行オペランドBレジスタファイルおよび複数のオペランドBバッファから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ3B)を示すブロック図である。
【
図18】4つの32ビットオペランドワードを有する第2のオペランド値(オペランドB)を、複数の並行オペランドBレジスタファイルおよび複数のオペランドBダブルバッファから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ3B)を示すブロック図である。
【
図19】4つの32ビットオペランドワードを有する第2のオペランド値(オペランドB)を、複数の並行オペランドBレジスタファイル、シフトロジック回路および複数のオペランドBバッファから複数のSIMDエンジンにルーティングするための、本発明の一実施形態によるアーキテクチャ(アーキテクチャ4B)を示すブロック図である。
【
図20】4つの並列SIMDエンジンを有するSIMDブロックと、4つの並列出力レジスタセットを有する出力回路とを含む、本発明の一実施形態によるコンピュータシステムのブロック図である。
【
図21】4つの並列出力レジスタセットのアドレス指定を示す、本発明の一実施形態による
図20のコンピュータシステムのブロック図である。
【
図22】
図4~
図21によって指定される異なるオペランドおよび出力のための様々なアーキテクチャおよび特徴を統一する、本発明の一実施形態によるハードウェアシステムのブロック図である。
【
図23】本発明の一実施形態による、行列乗算の実行に使用するためのコンピュータシステムのブロック図である。
【
図24】本発明の一実施形態による、
図23のコンピュータアーキテクチャによって乗算される2つの行列IおよびJを示す図である。
【
図25】本発明の一実施形態による、
図24の行列Iおよび行列Jの内容をシステムメモリ内に論理的に格納する様式を示すブロック図である。
【
図26】本発明の一実施形態による、
図24の行列Iおよび行列Jの乗算結果を
図23のコンピュータアーキテクチャの出力レジスタセット内に格納する様式を示すブロック図である。
【
図27】本発明の一実施形態による、疎行列の乗算の様々な段階の間のコンピュータアーキテクチャのブロック図である。
【
図28】本発明の一実施形態による、疎行列の乗算の様々な段階の間のコンピュータアーキテクチャのブロック図である。
【
図29】本発明の代替実施形態による、疎行列の乗算の様々な段階の間のコンピュータアーキテクチャのブロック図である。
【
図30】本発明の代替実施形態による、疎行列の乗算の様々な段階の間のコンピュータアーキテクチャのブロック図である。
【
図31】本発明の代替実施形態による、疎行列の乗算の様々な段階の間のコンピュータアーキテクチャのブロック図である。
【発明を実施するための形態】
【0041】
以下のサブセクションでは、様々な効率的なSIMDエンジンアーキテクチャについて説明する。具体的には、複数のSIMDエンジンを並列に動作させるやり方を提案し、SIMDエンジンに入力を供給する様式を説明する。以下の説明では、128ビットのワイド入力オペランドと4つのSIMDエンジンとを実装する例を使用するが、記載される例は、より小さなもしくはより大きな入力オペランド幅および/またはより少ないもしくはより多くのSIMDエンジンに拡張することができることに留意されたい。
【0042】
図4は、一実施形態による、SIMDブロック401を動作させるために必要な様々なハードウェアリソースを含むコンピュータシステム400のブロック図である。これらのリソースは、オペランドバッファ410(オペランドAレジスタファイル411およびオペランドBレジスタファイル412を含む)、入力分配ブロック415(オペランドA分配回路416およびオペランドB分配回路417を含む)、SIMDブロック401、出力回路420、制御ロジック430(ステートマシンおよびスケジューラ431、制御レジスタ432、およびオペランドパッケージング回路433を含む)、ならびにシステムメモリ440を含む。SIMD演算の重要なパラメータには、オペランド、演算の種類、および出力回路のアドレスがある。これらのパラメータは、次のセクションでより詳細に説明されている。
【0043】
一般に、制御ロジック430は、オペランドAレジスタファイル411およびオペランドBレジスタファイル412へのオペランド値(例えば、行列エントリ)の書き込みを制御する。より具体的には、ステートマシンおよびスケジューラ431は、オペランドパッケージング回路433に、システムメモリ440に格納されている行列エントリを取得させる。オペランドパッケージング回路433は、実行される演算に従って、これらの行列エントリをパッケージ化して、オペランド値を形成する。一実施形態では、様々な演算が、制御レジスタ432内のエントリによって定義される。以下でより詳細に説明するように、いくつかの演算(例えば、疎行列の乗算)では、ゼロ値を有する行列エントリが、オペランドバッファ410に提供されるオペランド値から省略されることを必要とする。ステートマシンおよびスケジューラ431は、オペランドパッケージング回路433によって提供されるオペランド値の、オペランドAレジスタファイル411およびオペランドBレジスタファイル412への書き込みを制御する。ステートマシンおよびスケジューラ431はまた、オペランドAレジスタファイル411およびオペランドBレジスタファイル412からのオペランド値の読み取りを制御し、これらの読み取り値は、入力分配ブロック415内のオペランドA分配回路416およびオペランドB分配回路417に提供される。
【0044】
一般に、ステートマシンおよびスケジューラ431は、入力分配ブロック415にアドレスを提供し、これらのアドレスは、オペランドA分配回路416がオペランドAレジスタファイル411から受信したオペランドA値をSIMDブロック401にルーティングする様式を制御し、かつオペランドB分配回路417がオペランドBレジスタファイル412から受信したオペランドB値をSIMDブロック401にルーティングする様式をも制御する。以下でより詳細に説明するように、オペランドB分配回路417は、複数のオペランドB値を格納するためのバッファ、ならびにオペランドBレジスタファイル412から受信したオペランドB値に適用されるシフト量を制御するシフトロジックを含み得る。
【0045】
ステートマシンおよびスケジューラ431はまた、出力回路420内に含まれるメモリバンクにアクセスするために使用されるアドレスを提供する。これらのアドレスは、メモリバンクに格納された累積値を積和演算のためにSIMDブロック401にルーティングすることを可能にする読み取りアドレスと、SIMDブロック401によって提供された更新された累積値を出力回路420内のメモリバンクに書き戻すことを可能にする書き込みアドレスとを含む。
【0046】
制御レジスタ432は、ステートマシンおよびスケジューラ431が異なる動作モード(以下でより詳細に説明する)用の様々なアドレスを生成する様式を制御する値を格納する。コンピュータシステム400の様々な要素の演算は、様々なモード(すなわち、アーキテクチャ)について以下でより詳細に説明される。
【0047】
オペランドAのためのアーキテクチャ
【0048】
以下でより詳細に説明される3つのアーキテクチャが、入力オペランドAのために提案される。以下の例では、SIMDブロック401は、並列に動作する4つのSIMDエンジンを含み、この4つのSIMDエンジンの各々は、128ビット幅を有する対応する入力オペランドAを受信する。(オペランドバッファ410に含まれる)オペランドAレジスタファイル411の1つのエントリは128ビットである。以下、このエントリをレジスタファイルワードと呼ぶ。説明する実施形態では、SIMDブロック401内の4つのSIMDエンジンの各々は、
図3のSIMDエンジン300と同一である。
【0049】
アーキテクチャ1A
【0050】
SIMDブロック401にオペランドAを提供するための第1のアーキテクチャ(アーキテクチャ1A)では、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD0、SIMD1、SIMD2、SIMD3)の各々は、入力オペランドAとしてフルレジスタファイルワード(4つの32ビットワード値であるw、x、yおよびzを含む)を受信する。
【0051】
図5は、第1のオペランドAアーキテクチャ(アーキテクチャ1A)の一実施形態を示すブロック図であり、オペランドAレジスタファイル411に格納された4つの32ビット入力ワード[w、x、y、z]がオペランドA分配回路416にルーティングされる。一実施形態では、オペランドA分配回路416は、受信された入力ワード[w、x、y、z]を格納するバッファを含む。オペランドA分配回路416はまた、スイッチング機能/逆多重化機能を実行するための回路を含み、バッファされた入力ワード[w、x、y、z]は、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並列にルーティングされる。したがって、アーキテクチャ1Aでは、SIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々が、入力オペランドAとしてフルレジスタファイルワード[w、x、y、z]を受信する。
【0052】
図6は、第1のオペランドAアーキテクチャ(アーキテクチャ1A)の別の実施形態を示すブロック図であり、オペランドAレジスタファイル411に格納された8つの16ビット入力ワード[s、t、u、v、w、x、y、z]がオペランドA分配回路416にルーティングされる。これらの入力ワード[s、t、u、v、w、x、y、z]は、オペランドA分配回路416内にバッファされ、次いで、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並列にルーティングされる。再び、アーキテクチャ1Aでは、SIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々が、入力オペランドAとしてフルレジスタファイルワード[s、t、u、v、w、x、y、z]を受信する。
【0053】
アーキテクチャ2A
【0054】
SIMDブロック401にオペランドAを提供するための第2のアーキテクチャ(アーキテクチャ2A)では、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD0、SIMD1、SIMD2、SIMD3)の各々が、オペランドAレジスタファイル411から単一の入力ワードを受信し、この単一の入力ワードは、オペランドAの入力幅に一致するまで複数回繰り返される。入力分配ブロック415は、オペランドAレジスタファイル411内でブロードキャストされるべき単一の入力ワードのインデックスを指定することによって、この単一の入力ワードを選択する。
【0055】
図7は、第2のオペランドAアーキテクチャ(アーキテクチャ2A)の一実施形態を示すブロック図であり、オペランドAレジスタファイル411に格納された4つの32ビット入力ワード[w、x、y、z]がオペランドA分配回路416にルーティングされる。上述したように、オペランドA分配回路416は、受信した入力ワード[w、x、y、z]を格納するバッファを含む。ステートマシンおよびスケジューラ431は、オペランドA分配回路416にインデックス値を提供し、このインデックス値は、入力ワード[w]を指定する。これに応答して、オペランドA分配回路416は、スイッチング/逆多重化演算を実行し、入力ワード[w]は、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並列にルーティングされる。すなわち、32ビット入力ワード[w]が効果的に4回繰り返されて、4回繰り返された32ビットワード[w]からなる128ビット入力オペランドAを提供する。この128ビット入力オペランドA[w、w、w、w]が、SIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並行して提供される。
【0056】
図8は、第2のオペランドAアーキテクチャ(アーキテクチャ2A)の別の例を示すブロック図であり、ステートマシンおよびスケジューラ431は、入力ワードyを指定するインデックス値をオペランドA分配回路416に提供する。これに応答して、オペランドA分配回路416は、スイッチング/逆多重化演算を実行し、入力ワード[y]は、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並列にルーティングされる。すなわち、32ビット入力ワード[y]が効果的に4回繰り返されて128ビット入力オペランドA[y、y、y、y]を提供し、これがSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並行して提供される。
【0057】
図9は、第2のオペランドAアーキテクチャ(アーキテクチャ2A)の別の実施形態を示すブロック図であり、オペランドAレジスタファイル411からの8つの16ビット入力ワード[s、t、u、v、w、x、y、z]がオペランドA分配回路416にバッファされる。ステートマシンおよびスケジューラ431は、オペランドA分配回路416にインデックス値を提供し、このインデックス値は、入力ワード[u]を指定する。これに応答して、オペランドA分配回路416は、スイッチング/逆多重化演算を実行し、入力ワード[u]は、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並列にルーティングされる。すなわち、16ビット入力ワード[u]が効果的に8回繰り返されて128ビット入力オペランドA[u、u、u、u、u、u、u、u]を提供し、これがSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並行して提供される。
【0058】
図10は、第2のオペランドAアーキテクチャ(アーキテクチャ2A)の別の例を示すブロック図であり、オペランドAレジスタファイル411からの8つの16ビット入力ワード[s、t、u、v、w、x、y、z]がオペランドA分配回路416にバッファされる。ステートマシンおよびスケジューラ431は、オペランドA分配回路416にインデックス値を提供し、このインデックス値は、入力ワード[z]を指定する。これに応答して、オペランドA分配回路416は、スイッチング/逆多重化演算を実行し、入力ワード[z]は、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並列にルーティングされる。すなわち、16ビット入力ワード[z]が効果的に8回繰り返されて128ビット入力オペランドA[z、z、z、z、z、z、z、z]を提供し、これがSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並行して提供される。
【0059】
アーキテクチャ3A
【0060】
入力オペランドAをSIMDブロック401に提供するための第3のアーキテクチャ(アーキテクチャ3A)では、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD0、SIMD1、SIMD2、SIMD3)の各々は、オペランドAレジスタファイル411から単一の入力ワードを受信し、この単一の入力ワードは、オペランドAの入力幅に一致するまで複数回繰り返される。しかしながら、異なるSIMDエンジンには、異なる入力ワードが提供される。一実施形態では、入力ワードは、ラウンドロビン方式でSIMDエンジンに割り当てられる。入力分配ブロック415は、各SIMDに提供される各入力ワードのインデックスを指定することによって、各SIMDに対する単一の入力ワードを選択する。
【0061】
図11は、第3のオペランドAアーキテクチャ(アーキテクチャ3A)の一実施形態を示すブロック図であり、オペランドAレジスタファイル411に格納された4つの32ビット入力ワード[w、x、y、z]が、オペランドA分配回路416によって受信(かつオペランドA分配回路416にバッファ)される。ステートマシンおよびスケジューラ431は、オペランドA分配回路416にインデックス値を提供し、これらのインデックス値は、入力ワード[w、x、y、z]のうちのどれがSIMDエンジンに提供されるかを指定する。本実施例では、インデックス値は、入力ワードw、x、yおよびzがそれぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3に提供されることを指定する。インデックス値に応答して、オペランドA分配回路416は、スイッチング/逆多重化演算を実行し、32ビット入力ワード[w]は4回繰り返されて128ビットオペランドA値[w、w、w、w]を作成し、これがSIMD
0にルーティングされ、32ビット入力ワード[x]は4回繰り返されて128ビットオペランドA値[x、x、x、x]を作成し、これがSIMD
1にルーティングされ、32ビット入力ワード[y]は4回繰り返されて128ビットオペランドA値[y、y、y、y]を作成し、これがSIMD
2にルーティングされ、32ビット入力ワード[z]は4回繰り返されて128ビットオペランドA値[z、z、z、z]を作成し、これがSIMD
3にルーティングされる。前述の様式では、128ビットレジスタファイルワードの4つの32ビットエントリ[w、x、y、z]は、ラウンドロビン方式で4つのSIMDエンジンに分配される(すなわち、SIMD
0がwに割り当てられ、SIMD
1がxに割り当てられ、SIMD
2がyに割り当てられ、かつSIMD
3がzに割り当てられる)。
【0062】
図12は、第3のオペランドAアーキテクチャ(アーキテクチャ3A)の別の実施形態を示すブロック図であり、オペランドAレジスタファイル411に格納された8つの16ビット入力ワード[s、t、u、v、w、x、y、z]が、オペランドA分配回路416によって受信(かつオペランドA分配回路416にバッファ)される。ステートマシンおよびスケジューラ431は、オペランドA分配回路416にインデックス値を提供し、これらのインデックス値は、入力ワード[s、t、u、v、w、x、y、z]のうちのどれがSIMDエンジンに提供されるかを指定する。本実施例では、インデックス値は、入力ワードs、t、uおよびvが、それぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3に提供されることを指定する。インデックス値に応答して、オペランドA分配回路416は、スイッチング/逆多重化演算を実行し、16ビット入力ワード[s]は8回繰り返されて128ビットオペランドA値[s、s、s、s、s、s、s、s]を作成し、これがSIMD
0にルーティングされ、16ビット入力ワード[t]は8回繰り返されて128ビットオペランドA値[t、t、t、t、t、t、t、t]を作成し、これがSIMD
1にルーティングされ、16ビット入力ワード[u]は8回繰り返されて128ビットオペランドA値[u、u、u、u、u、u、u、u]を作成し、これがSIMD
2にルーティングされ、16ビット入力ワード[v]は8回繰り返されて128ビットオペランドA値[v、v、v、v、v、v、v、v]を作成し、これがSIMD
3にルーティングされる。前述の様式では、128ビットレジスタファイルワードの4つの16ビットエントリ[s、t、u、v]は、ラウンドロビン方式で4つのSIMDエンジンに分配される。
【0063】
図12に示す16ビット入力モードでは、レジスタファイルワードには、SIMDエンジンの数(4つ)よりも多くのエントリ(8つ)が存在することに留意されたい。したがって、同じレジスタファイルワードを2回使用することができ、すなわち、1回は最初の4つのエントリを4つのSIMDエンジンに分配し(
図12に示す)、もう1回は最後の4つのエントリを4つのSIMDエンジンに分配する(
図13に示す)。一実施形態では、ステートマシンおよびスケジューラ431によって提供されるインデックス値は、入力オペランドAを提供するために、レジスタファイルワードのどの4つのエントリが分配されるかを指定する。
【0064】
図13は、
図12で開始された分配の続きを示すブロック図であり、16ビット入力ワード[w]は8回繰り返されて128ビットオペランドA値[w、w、w、w、w、w、w、w]を作成し、これがSIMD
0にルーティングされ、16ビット入力ワード[x]は8回繰り返されて128ビットオペランドA値[x、x、x、x、x、x、x、x]を作成し、これがSIMD
1にルーティングされ、16ビット入力ワード[y]は8回繰り返されて128ビットオペランドA値[y、y、y、y、y、y、y、y]を作成し、これがSIMD
2にルーティングされ、16ビット入力ワード[z]は8回繰り返されて128ビットオペランドA値[z、z、z、z、z、z、z、z]を作成し、これがSIMD
3にルーティングされる。
【0065】
アーキテクチャ1A、2Aおよび3Aに従った入力オペランドAのルーティングに関するさらなる詳細は、
図22に関連して以下で提供する。
【0066】
アーキテクチャ1A、2Aおよび3Aの前述の説明は、32ビット入力モードおよび16ビット入力モードを実装することに留意されたい。ただし、これらの実施形態は例示のみを目的として提供される。この考えは一般的なものであり、他の入力モード(例えば、8ビット入力モード)に直接的に拡張することができる。さらに、アーキテクチャ1A、2Aおよび3Aは、4つのSIMDエンジンおよび128ビットレジスタファイルワードを含む実施形態に関連して説明されてきたが、他の実施形態では、他の数のSIMDエンジンおよびレジスタファイルワード幅が、直接的に使用され得る。
【0067】
実際のハードウェア実装では、ハードウェアリソースを共有することによって、複数のアーキテクチャを共に実装することができる。ハードウェアは、いくつかのレジスタ設定によって選択され得るモードとして、異なるアーキテクチャを動作させるようにプログラムされ得る。例えば、制御レジスタ432(
図4)は、オペランドAのためのアーキテクチャ1A、アーキテクチャ2Aまたはアーキテクチャ3Aを上述の様式でステートマシンおよびスケジューラ431に実装させる値を格納することができる。すなわち、制御レジスタ432によって格納された設定によって、オペランドA分配回路416に実装されたスイッチングおよび逆多重化ロジックが駆動され得る。
【0068】
例えば、アーキテクチャ2Aでは、ブロードキャストされる単一の値のインデックスが、オペランドA分配回路416に提供される必要がある。インデックスは、データが8ビット幅、16ビット幅または32ビット幅のいずれであるかによって異なる解釈を有することができる(これは、制御レジスタ設定によって指定され得る)。
【0069】
同様に、アーキテクチャ3Aにおいて、SIMD0にブロードキャストされる値のインデックスが、オペランドA分配回路416に提供される必要がある。このインデックスから、他のSIMDエンジン(SIMD1、SIMD2およびSIMD3)にブロードキャストされる値のインデックスが、インクリメントすることによりハードウェアによって推測され得る。または、4つのインデックスすべてをオペランドA分配回路416に提供してもよい。
【0070】
オペランドA分配回路416のバッファに格納されたデータは、レジスタファイルワードをオペランドAレジスタファイル411から毎サイクル読み取る必要がないように、複数サイクルにわたって再利用することができる。別個の制御ロジックは、オペランドAレジスタファイル411からデータをロードする必要があるサイクルを指定するフラグを供給することができる。さらに、オペランドA分配回路416は、書き込みおよび読み取りのために使用するバッファインデックスを指定する制御ロジックを有するレジスタファイルワードデータを保持するための、複数のバッファを含むことができる。一実施形態では、オペランドA分配回路416は、ピンポン方式で使用される、1つは書き込み用で1つは読み取り用の、2つのバッファを含む。ステートマシンおよびスケジューラ431は、読み取りおよび書き込みインデックスを自動的に管理する。このスキームは、一般にダブルバッファリングとして既知である。そのような場合、読み取りおよび書き込みのためのバッファインデックスを指定するための追加の制御ロジックは必要とされない。
【0071】
オペランドBのためのアーキテクチャ
【0072】
他の実施形態によれば、入力オペランドBをSIMDブロック401に提供するために、複数のアーキテクチャが使用される。以下で説明するように、オペランドB分配回路417は、入力オペランドBをSIMDブロック401に提供するように、4つの異なるアーキテクチャ(アーキテクチャ1B、アーキテクチャ2B、アーキテクチャ3Bおよびアーキテクチャ4B)で構成され得る。
【0073】
アーキテクチャ1B
【0074】
SIMDブロック401にオペランドBを提供するための第1のアーキテクチャ(アーキテクチャ1B)では、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD0、SIMD1、SIMD2、SIMD3)の各々は、入力オペランドBとしてフルレジスタファイルワード(4つの32ビットワード値であるa、b、cおよびdを含む)を受信する。SIMDブロック401にオペランドBを提供するためのアーキテクチャ1Bは、SIMDブロック401にオペランドAを提供するためのアーキテクチャ1Aに類似していることに留意されたい。
【0075】
図14は、第1のオペランドBアーキテクチャ(アーキテクチャ1B)の一実施形態を示すブロック図であり、オペランドBレジスタファイル412に格納された4つの32ビット入力ワード[a、b、c、d]がオペランドB分配回路417にルーティングされる。一実施形態では、オペランドB分配回路417は、受信された入力単ワード[a、b、c、d]を格納するバッファを含む。オペランドB分配回路417はまた、スイッチング機能/逆多重化機能を実行するための回路を含み、バッファされた入力ワード[a、b、c、d]は、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並列にルーティングされる。したがって、アーキテクチャ1Bでは、SIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々が、入力オペランドBとしてフルレジスタファイルワード[a、b、c、d]を受信する。
【0076】
図15は、第1のオペランドBアーキテクチャ(アーキテクチャ1B)の別の実施形態を示すブロック図であり、オペランドBレジスタファイル412に格納された8つの16ビット入力ワード[a、b、c、d、e、f、g、h]がオペランドB分配回路417にルーティングされる。これらの入力ワード[a、b、c、d、e、f、g、h]は、オペランドB分配回路417内にバッファされ、次いで、SIMDブロック401に含まれる4つのSIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々に並列にルーティングされる。ここでも、アーキテクチャ1Bでは、SIMDエンジン(SIMD
0、SIMD
1、SIMD
2、SIMD
3)の各々は、入力オペランドBとしてフルレジスタファイルワード[a、b、c、d、e、f、g、h]を受信する。
【0077】
アーキテクチャ2B
【0078】
これまでに考慮されたアーキテクチャ(オペランドAならびにオペランドB)では、すべてのSIMDエンジンは、特定の時点で単一のレジスタファイルワードからのデータを使用する。これにより、アーキテクチャを、サポート可能な演算の種類に関して堅牢にすることができる。一実施形態によれば、異なるSIMDエンジンには、オペランドレジスタファイルとは異なるレジスタファイルワードが提供される。
【0079】
これを達成するための1つの方法は、複数の読み取りをレジスタファイルに同時に許可することであろう。これは可能である一方、ハードウェアが非常に複雑になるおそれがある。
【0080】
一実施形態では、複数のエントリ(必ずしも別個ではない)は、オペランドBレジスタファイル412から同時に読み取ることができる。これを実装する最も一般的なやり方は、このレジスタファイル(オペランドBレジスタファイル412)を実装するためにマルチ読み取りポートメモリを使用することである。4つの読み取りポートを有するメモリは、オペランドBレジスタファイル412から4つのエントリを同時に読み取るために使用され得る。しかしながら、このようなメモリ構成は、ハードウェアの複雑性が高い(比較的広い面積を占め、比較的消費電力が大きい)。したがって、本発明の好適な実施形態は、異なるSIMDエンジンに(場合によっては)異なる入力オペランドB値を供給するための、複雑性の低い方法および構造を含む。これらの好適な実施形態は、広範な(複数の読み取りポート)方法ほど一般性をもたらさない場合もあるが、それらは実装されるアルゴリズムの目的のためには効率的である。
【0081】
一実施形態によれば、入力オペランドBをSIMDエンジンに提供するための第2のアーキテクチャ(アーキテクチャ2B)が提供され、オペランドBレジスタファイル412からの少数のエントリは、オペランドB分配回路417内にバッファされ、次いでSIMDブロック401のSIMDエンジンに分配される。直感的に、これは、少数のエントリからの任意のエントリにアドレス指定を可能にすることによって、各SIMDにある程度の柔軟性を与えるアプローチと考えることができる。これにより、ハードウェアの複雑さを小さく抑えることができる。
【0082】
入力オペランドBをSIMDブロック401に提供するための第2のアーキテクチャ(アーキテクチャ2B)の主な特徴は、以下のように定義され得る。オペランドB分配回路417は、オペランドBレジスタファイル412から読み取られた値を保持するための複数のオペランドBバッファを含む。これらのオペランドBバッファの各々は、1つのフルレジスタファイルワードを保持することができる。各SIMDは、オペランドBバッファのうちのいずれか1つに格納されたレジスタファイルワードを受信することができる。バッファ選択機構を使用して、オペランドBバッファのうちのどれがSIMDエンジンの各々に結合されているかを指定する。オペランドBバッファは、オペランドBレジスタファイル412から一度に1つずつ埋められる。オペランドBレジスタファイル412からオペランドBバッファに新しいレジスタファイルワードをロードする必要がある場合、以前のオペランドBバッファのうちの1つが上書きされる。オペランドBバッファを上書きする必要があるかどうかを判断するスキームは複数存在し得る。1つの簡単なスキームは、最も古いデータを持つオペランドBバッファが上書きされる(すなわち、オペランドBバッファがラウンドロビン方式で使用される)ことである。別のスキームでは、制御ロジック430は、どのオペランドBバッファを上書きする必要があるかを指定することができる。
【0083】
各サイクル中に、オペランドBレジスタファイル412からオペランドBバッファにデータをロードする必要はない。別個の制御ロジック430は、オペランドBレジスタファイル412からオペランドB分配回路417のオペランドBバッファに新しいデータを読み取る必要があるかどうかを示すために、サイクル毎にフラグを指定することができる。実際のハードウェア実装では、各オペランドBバッファは、オペランドBバッファへの読み取り動作および書き込み動作が同じサイクルで発生しないように、ダブルバッファリングスキームを使用してもよい。
【0084】
図16は、一実施形態による、入力オペランドBをSIMDエンジンに提供するための第2のアーキテクチャ(アーキテクチャ2B)のブロック図である。図示される例では、オペランドB分配ロジック(オペランドB分配回路417)は、4つのオペランドBバッファB0~B3を含み、それらの各々は、オペランドBレジスタファイル412からのフルレジスタワードを格納することができる。4つのオペランドBバッファが示されているが、オペランドバッファの数は1より大きい任意の数であり得ることが理解される。図示される例では、オペランドBバッファB0~B3は、オペランドBレジスタファイル412から受信したレジスタファイルワードを格納する。より具体的には、オペランドBバッファB0、B1、B2およびB3は、それぞれ、値[a、b、c、d]、[e、f、g、h]、[i、j、k、l]および[m、n、o、p]を格納する(ここで、値a~pの各々は、32ビットワードである)。
【0085】
オペランドBバッファ選択ロジック1601(これは、制御ロジック430のステートマシンおよびスケジューラ431に含まれてもよい)は、オペランドBバッファB0、B1、B2およびB3の内容が、SIMD0、SIMD1、SIMD2およびSIMD3に提供される様式を決定するために使用される。一実施形態では、オペランドBバッファ選択ロジック1601は、4つのバッファ選択エントリbs0、bs1、bs2およびbs3を含み、これらは、オペランドBバッファB0~B3のうちのどれが、それらのバッファの内容をそれぞれSIMD0、SIMD1、SIMD2およびSIMD3に提供するかを指定する値を格納する。図示される例では、4つのエントリbs0、bs1、bs2およびbs3は、それぞれオペランドBバッファB0、B0、B1およびB2を指定し、オペランドBバッファB0の内容(すなわち、[a、b、c、d])がSIMD0およびSIMD1に提供され、オペランドBバッファB1の内容(すなわち、[e、f、g、h])がSIMD2に提供され、オペランドBバッファB2の内容(すなわち、[i、j、k、l])がSIMD3に提供されることを示す。続くサイクルにおいて、バッファ選択は、バッファ選択エントリbs0、bs1、bs2およびbs3を変更することによって変化し得る。オペランドバッファの数が1に減少した場合、アーキテクチャ2Bはアーキテクチャ1Bと同等になるであろうことに留意されたい。
【0086】
アーキテクチャ3B
【0087】
オペランドBレジスタファイル412からの複数の読み取りを効果的に可能にするための別のアプローチは、複数のレジスタファイルを使用してオペランドBレジスタファイル412を実装することであり、それらのレジスタファイルの各々は、単一の読み取り動作が一度に実行されることを可能にする。前述したように、4つの読み取りポートを持つ1つの大きなメモリを有することは、各々が1つの読み取りポートを持つ4つのより小さなメモリよりも高価な場合がある。しかしながら、4つの読み取りポートを持つより大きなメモリは、読み取り可能なデータに関してより柔軟性を提供することに注目されたい。単一の読み取りポートを持つ4つのより小さなメモリを使用すると、4つのエントリを一度に読み取ることができるが、エントリの各々が異なるメモリに属している必要がある。これは、4つのエントリを同時に読み取ることができる4つの読み取りポートメモリの場合には当てはまらない。
【0088】
入力オペランドBをSIMDブロック401に提供するための第3のアーキテクチャ(アーキテクチャ3B)の主な特徴は、以下のように定義され得る。オペランドBに対して2つ以上のレジスタファイルがある。1つの特定の場合では、オペランドBのレジスタファイルの数は、SIMDブロック401に含まれるSIMDエンジンの数に等しい。したがって、4つのSIMDエンジンがある場合、対応するオペランドBレジスタファイルは4つとなる。しかしながら、他の場合も可能であり、それらの場合にアーキテクチャを拡張することは容易である。
【0089】
複数のオペランドBレジスタファイルを同時に読み取ることができる。単純な場合では、各SIMDは、その入力オペランドBを、オペランドBレジスタファイルのうちの1つから直接受信する。SIMDエンジンの数がオペランドBレジスタファイルの数に等しい場合、SIMDエンジンの各々は、オペランドBレジスタファイルのうちの対応する1つから入力オペランドBを受信することができる。
【0090】
一般的な場合では、オペランドB分配回路417は、オペランドBレジスタファイルから読み取られたデータを保持するためのオペランドバッファ(アーキテクチャ2Bに類似)を含むことができる。これにより、複数のサイクルが同じデータを使用することができる。また、バッファされたデータの再利用により、オペランドBレジスタファイルを毎サイクル読み取る必要はない。ロードフラグは、オペランドBレジスタファイルからオペランドB分配回路417にデータを読み取る必要があるサイクルを指定することができる。別個のブロックもまた、アーキテクチャ2Bに関連して上述したように、すべてのSIMDについてロードするバッファのアドレスを指定することができる。
【0091】
図17は、一実施形態による、入力オペランドBをSIMDブロック401に提供するための第3のアーキテクチャ(アーキテクチャ3B)のブロック図である。図示の例では、4つのオペランドBレジスタファイル412
0、412
1、412
2および413
3は、対応する4つのオペランドBレジスタワード(例えば、[a0、b0、c0、d0][e0、f0、g0、h0][i0、j0、k0、l0]および[m0、n0、o0、p0])をオペランドB分配回路417に提供する。図示される例では、オペランドB分配回路417は、オペランドBレジスタファイル412
0、412
1、412
2および413
3によって提供されるレジスタファイルワードを、オペランドB分配回路417内のバッファメモリ(オペランドBバッファBM
0、BM
1、BM
2およびBM
3)にそれぞれルーティングする。
【0092】
オペランドBバッファ選択ロジック1701(これは、制御ロジック430のステートマシンおよびスケジューラ431に含まれてもよい)は、オペランドBバッファBM0、BM1、BM2およびBM3の内容が、SIMD0、SIMD1、SIMD2およびSIMD3に提供される様式を決定するために使用される。一実施形態では、オペランドBバッファ選択ロジック1701は、4つのバッファ選択エントリbms0、bms1、bms2およびbms3を含み、これらは、オペランドBバッファBM0~BM3のうちのどれが、それらのバッファの内容をそれぞれSIMD0、SIMD1、SIMD2およびSIMD3に提供するかを指定する値を格納する。図示される例では、4つのエントリbms0、bms1、bms2およびbms3は、オペランドBバッファBM0、BM1、BM2およびBM3をそれぞれ指定し、オペランドBバッファBM0の内容(すなわち、[a0、b0、c0、d0])がSIMD0に提供され、オペランドBバッファBM1の内容(すなわち、[e0、f0、g0、h0])がSIMD1に提供され、オペランドBバッファBM2の内容(すなわち、[i0、j0、k0、l0])がSIMD2に提供され、オペランドBバッファBM3の内容(すなわち、[m0、n0、o0、p0])がSIMD3に提供されることを示す。続くサイクルにおいて、バッファ選択は、バッファメモリ選択エントリbms0、bms1、bms2およびbms3を変更することによって変化し得る。
【0093】
図18は、代替実施形態による、入力オペランドBをSIMDブロック401に提供するための第3のアーキテクチャ(アーキテクチャ3B)のブロック図である。
図18の実施形態では、オペランドB分配回路417は、それぞれオペランドBレジスタファイル412
0、412
1、412
2および413
3によって提供されるデータを格納する、ダブルオペランドBバッファB01~B02、B11~B12、B21~B22およびB31~B32を含む。図示される例では、オペランドBレジスタファイル412
0からのオペランドBレジスタファイルワード[a0、b0、c0、d0]および[a1、b1、c1、d1]は、それぞれオペランドBバッファB02およびB01に格納される。オペランドBレジスタファイル412
1からのオペランドBレジスタファイルワード[e0、f0、g0、h0]および[e1、f1、g1、h1]は、それぞれオペランドBバッファB12およびB11に格納される。オペランドBレジスタファイル412
2からのオペランドBレジスタファイルワード[i0、j0、k0、l0]および[i1、j1、k1、l1]は、それぞれオペランドBバッファB22およびB21に格納される。オペランドBレジスタファイル412
3からのオペランドBレジスタファイルワード[m0、n0、o0、p0]および[m1、n1、o1、p1]は、それぞれオペランドBバッファB32およびB31に格納される。
【0094】
オペランドBバッファ選択ロジック1801(これは、制御ロジック430のステートマシンおよびスケジューラ431に含まれてもよい)は、オペランドBバッファB01~B02、B11~B12、B21~B22およびB31~B32の内容が、SIMD0、SIMD1、SIMD2およびSIMD3に提供される様式を決定するために使用される。一実施形態では、オペランドBバッファ選択ロジック1801は、4つのバッファ選択エントリbs01、bs11、bs21およびbs31を含み、これらは、オペランドBバッファB01~B02、B11~B12、B21~B22およびB31~B32のうちのどれが、それらのバッファの内容をそれぞれSIMD0、SIMD1、SIMD2およびSIMD3に提供するかを指定する値を格納する。例示される例では、4つのエントリbs01、bs11、bs21およびbs31は、オペランドBバッファB02、B12、B22およびB32をそれぞれ指定し、オペランドBバッファB02の内容(すなわち、[a0、b0、c0、d0])がSIMD0に提供され、オペランドBバッファB12の内容(すなわち、[e0、f0、g0、h0])がSIMD1に提供され、オペランドBバッファB22の内容(すなわち、[i0、j0、k0、l0])がSIMD2に提供され、オペランドBバッファB32の内容(すなわち、[m0、n0、o0、p0])がSIMD3に提供されることを示す。一実施形態では、オペランドB分配回路417は、バッファ選択エントリbs01、bs11、bs21およびbs31に応答して上述のルーティングを実行する、スイッチング/逆多重化回路を含む。オペランドBバッファ選択ロジック1801は、オペランドバッファB01~B02、B11~B12、B21~B22およびB31~B32のいずれかを選択して、SIMDエンジンのうちのいずれかに入力オペランドBを提供できることに留意されたい。例えば、バッファ選択エントリbs01は、オペランドBバッファB31の内容(すなわち、[m1、n1、o1、p1])をSIMD0にルーティングさせる値(B31)を格納し得る。続くサイクルにおいて、バッファ選択は、バッファ選択エントリbs01、bs11、bs21およびbs31を変更することによって変化し得る。他の実施形態では、異なる数のオペランドBバッファがオペランドB分配回路417に含められ得ることに留意されたい。
【0095】
アーキテクチャ4B
【0096】
SIMDブロック401にオペランドBを提供するための第4のアーキテクチャ(アーキテクチャ4B)では、アーキテクチャ3Bに類似したアーキテクチャが提供され、各オペランドBレジスタファイルが一度に2つのエントリを読み取り、いくつかのシフト演算を適用することによって、1レジスタファイルワード分のデータを選択することを可能にするという、追加の特徴を持つ。制御ロジック340は、各オペランドBレジスタファイルから読み出される2つの行のアドレス、ならびにこれらの2つの行から読み取られるエントリに適用されるシフトの量を指定する。この機能は通常、ハードウェアで、各オペランドBレジスタファイルメモリを2つのメモリバンクとして実装することによって実現される。これにより、2つのエントリを同時に読み取ることができる。次いで、2つのレジスタファイルワードは、入力パラメータとしてシフト量を受信し、1レジスタファイルワード分のデータを出力するシフトロジックモジュールに入力される。2つのバンクのアドレスおよびシフト量は、ステートマシンおよびスケジューラ431によって供給される。
【0097】
図19は、一実施形態による、入力オペランドBをSIMDブロック401に提供するための第4のアーキテクチャ(アーキテクチャ4B)のブロック図である。図示される実施形態では、4つのオペランドBレジスタファイル1912
0~1912
3があり、これらのオペランドBレジスタファイルの各々は、2つのメモリバンクを含む。したがって、オペランドBレジスタファイル1912
0、1912
1、1912
2および1912
3は、それぞれメモリバンク1912
00~1912
01、1912
10~1912
11、1912
20~1912
21および1912
30~1912
31を含む。メモリバンク1912
00~1912
01、1912
10~1912
11、1912
20~1912
21および1912
30~1912
31のペアの各々は、異なるレジスタファイルワードを格納する。図示される例では、メモリバンク1912
00は、レジスタファイルワード[a0、b0、c0、d0]、[a2、b2、c2、d2]および[a4、b4、c4、d4]を格納し、メモリバンク1912
01は、レジスタファイルワード[a1、b1、c1、d1]、[a3、b3、c3、d3]および[a5、b5、c5、d5]を格納する。
【0098】
メモリバンク191210は、レジスタファイルワード[e0、f0、g0、h0]、[e2、f2、g2、h2]および[e4、f4、g4、h4]を格納し、メモリバンク191211は、レジスタファイルワード[e1、f1、g1、h1]、[e3、f3、g3、h3]および[e5、f5、g5、h5]を格納する。
【0099】
メモリバンク191220は、レジスタファイルワード[i0、j0、k0、l0]、[i2、j2、k2、l2]および[i4、j4、k4、l4]を格納し、メモリバンク191221は、レジスタファイルワード[i1、j1、k1、l1]、[i3、j3、k3、l3]および[i5、j5、k5、l5]を格納する。
【0100】
メモリバンク191230は、レジスタファイルワード[m0、n0、o0、p0]、[m2、n2、o2、p2]および[m4、n4、o4、p4]を格納し、メモリバンク191231は、レジスタファイルワード[m1、n1、o1、p1]、[m3、n3、o3、p3]および[m5、n5、o5、p5]を格納する。
【0101】
メモリバンク191200~191201、191210~191211、191220~191221および191230~191231のペアから読み取られたレジスタファイルワードは、オペランドB分配回路417内のシフトロジック回路1901に提供される。シフトロジック回路1901の出力は、オペランドB分配回路417内のオペランドBバッファB0、B1、B2およびB3に提供される。
【0102】
制御ロジック430(より具体的には、ステートマシンおよびスケジューラ431)は、メモリバンク191200~191201、191210~191211、191220~191221および191230~191231から読み取られたレジスタファイルワードを制御する。一般に、制御ロジック430は、メモリバンク191200~191201、191210~191211、191220~191221および191230~191231からレジスタファイルワードを同時に読み取らせる。メモリバンクペアの各々に提供されるアドレスは、2つの異なる連続したレジスタファイルワードがメモリバンクの各々から読み取られるように選択されてもよく、これによって、シフト演算を実行するために必要なレジスタファイルワードを提供する。例えば、レジスタファイルワード[a0、b0、c0、d0]および[a1、b1、c1、d1]は、それぞれメモリバンク191200および191201から同時に読み取られてよく、レジスタファイルワード[e0、f0、g0、h0]および[e1、f1、g1、h1]は、それぞれメモリバンク191210および191211から同時に読み取られてよく、レジスタファイルワード[i0、j0、k0、l0]および[i1、j1、k1、l1]は、それぞれメモリバンク191220および191221から同時に読み取られてよく、レジスタファイルワード[m0、n0、o0、p0]および[m1、n1、o1、p1]は、それぞれメモリバンク191230および191231から同時に読み取られてよい。シフトロジック回路1901は、オペランドBレジスタファイル19120~19123によって提供される8つのレジスタファイルワードを受信する。
【0103】
制御ロジック340はまた、シフトロジック回路1901によって導入されるシフトの量を制御する。一般に、以下の表1は、様々なシフト値について、本実施例ではシフトロジック回路1901によってオペランドBバッファB0~B3に提供される値を定義する。各シフト値は、受信したレジスタファイルワードのペアに追加の32ビットシフトを導入することに留意されたい。
図19にシフト値1の結果が示されている。
【0104】
【0105】
オペランドBバッファB0、B1、B2およびB3の内容は、入力オペランドBとして、それぞれSIMD0、SIMD1、SIMD2およびSIMD3にルーティングされる。前述の様式では、シフトは、オペランドBレジスタファイル19120~19123によって格納されるレジスタファイルワード内で効率的に実行され得る。
【0106】
ここでも、実際のハードウェア実装では、ハードウェアリソースを共有することによって、複数のアーキテクチャを共に実装することができる。ハードウェアは、レジスタによって選択され得るモードとして、異なるアーキテクチャを動作させるようにプログラムされ得る。
【0107】
アーキテクチャ1B、2B、3Bおよび4Bに従った入力オペランドBのルーティングに関するさらなる詳細は、
図22に関連して以下で提供する。
【0108】
アーキテクチャ1B、2B、3Bおよび4Bの先行する説明は、32ビット入力モードおよび16ビット入力モードを実装するが、これらのアーキテクチャは、他の幅の入力モード(例えば、8ビット入力モード)を実装するように容易に変更され得ることが理解される。さらに、アーキテクチャ1B、2B、3Bおよび4Bは、4つのSIMDエンジンおよび128ビットのレジスタファイルワードを含む実施形態に関連して説明されてきたが、他の実施形態では、他の数のSIMDエンジンおよびレジスタファイルワード幅が、直接的に使用され得る。
【0109】
実際のハードウェア実装では、ハードウェアリソースを共有することによって、複数のアーキテクチャを共に実装することができる。ハードウェアは、いくつかのレジスタ設定によって選択され得るモードとして、異なるアーキテクチャを動作させるようにプログラムされ得る。例えば、制御レジスタ432(
図4)は、オペランドBのためのアーキテクチャ1B、2B、3Bまたは4Bを上述の様式で実装するようにオペランドB分配回路(入力分配ブロック415)を構成する値を格納することができる。
【0110】
出力回路
【0111】
出力回路420(
図4)は、SIMDエンジン(SIMD
0、SIMD
1、SIMD
2およびSIMD
3)の出力を格納する(かつアドレスを指定する)ために使用される。各SIMDは、SIMD内で実行される演算の出力を、出力回路420内の特定の数の出力レジスタに書き込むことができる。
【0112】
図20は、対応するメモリバンク(出力レジスタセット2000
0~2000
3)に結合されたSIMDエンジン(SIMD
0、SIMD
1、SIMD
2およびSIMD
3)のそれぞれを示すブロック図であり、各メモリバンクはk行を含み、各行は出力レジスタを形成する。累積演算の場合、制御ロジック340は、以前に格納された累積値がメモリバンク(出力レジスタセット2000
0~2000
3)のアドレス指定された出力レジスタから読み取られ、対応するSIMDエンジン、SIMD
0~SIMD
3に提供されるように、メモリバンク(出力レジスタセット2000
0~2000
3)の各々内の行アドレスを指定する。これに応答して、SIMDエンジン(SIMD
0~SIMD
3)は、更新された累積値を生成するために積和演算を実行し、次いで、更新された累積値は、対応するメモリバンク(出力レジスタセット2000
0~2000
3)内のアドレス指定された出力レジスタに書き戻される。
【0113】
以下でより詳細に説明するように、各SIMDに関連付けられた出力レジスタの行アドレスは、SIMDエンジンへの入力信号として考えられることができる。行アドレスは、SIMD内の行のインデックス(SIMD内で相対インデックスと呼ばれる)である。
【0114】
図21は、出力レジスタセット2000
0、2000
1、2000
2および2000
3の内容がそれぞれSIMDエンジンSIMD
0、SIMD
1、SIMD
2およびSIMD
3に提供される様式を決定するために使用される、レジスタ選択ロジック2101を示すブロック図である。レジスタ選択ロジック2101は、制御ロジック430のステートマシンおよびスケジューラ431内に実装される。一実施形態では、レジスタ選択ロジック2101は、4つのレジスタ選択エントリR0、R1、R2およびR3を含み、これらは、出力レジスタセット2000
0、2000
1、2000
2および2000
3内の出力レジスタのうちのどれがそれらの内容を、それぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3に提供するか(または、それぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3から受信した値を格納するか)を指定する行アドレス値を格納する。図示される例では、4つのレジスタ選択エントリR0、R1、R2およびR3は、それぞれ、出力レジスタセット2000
0、2000
1、2000
2および2000
3の行1、行(K-1)、行0および行2の出力レジスタを指定する(これらの出力レジスタの内容が、それぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3に提供されることを示す)。
図21では、選択された出力レジスタがハイライト表示されていることに留意されたい。続くサイクルにおいて、レジスタ選択は、レジスタ選択エントリR0、R1、R2およびR3を変更することによって変化し得る。
【0115】
統一されたアーキテクチャ
【0116】
図22は、異なるオペランドおよび出力について上記で提案した様々なアーキテクチャおよび特徴を統一するハードウェアシステム(システム2200)のブロック図である。システム2200は、(1)オペランド(オペランドAおよびオペランドB)の各々を格納するための1つ以上のレジスタファイルを含むオペランドブロック2210、(2)オペランドの各々のための1つ以上のバッファおよびオペランドの各々のためのロジックブロックを含む入力分配ブロック(IDB)2220、(3)1つ以上のSIMDエンジンを含むSIMDブロック2230、および(4)SIMDエンジンの各々のための1つ以上の出力レジスタファイルを含む出力ブロック2240を含む。図示されるシステム2200では、オペランドブロック2210は、上述したオペランドAレジスタファイル411およびオペランドBレジスタファイル412の様々な実施形態を実装するために使用され得る、オペランドAレジスタファイル2211およびオペランドBレジスタファイル2212を含む。入力分配ブロック(IDB)2220は、上述したオペランドA分配回路416の様々な実施形態を実装するために使用され得る、オペランドA IDBバッファ2221およびオペランドA IDBロジック2223を含む。入力分配ブロック2220はまた、上述したオペランドB分配回路417の様々な実施形態を実装するために使用され得る、オペランドB IDBバッファ2222およびオペランドB IDBシフトロジック2224を含む。上述したSIMDブロック401の様々な実施形態を実装するために使用され得るSIMDブロック(出力ブロック2240)は、SIMD
0、SIMD
1、SIMD
2およびSIMD
3を含む。上述した出力回路420の様々な実施形態を実装するために使用され得る出力ブロック2240は、それぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3に結合された出力レジスタファイル2241、2242、2243および2244を含む。
【0117】
オペランドブロック2210は、オペランドデータを保持することに関与する。以下に説明する制御信号に基づいて、オペランドAレジスタファイル2211およびオペランドBレジスタファイル2212からのデータは、入力分配ブロック2220に転送される。システム2200の統一されたアーキテクチャの一実施形態では、オペランドAレジスタファイル2211は1つのレジスタファイルを含み、オペランドBレジスタファイル2212は4つのレジスタファイルを含む。さらに、オペランドBの4つのレジスタファイルは、2つの同時読み取りを可能にする(すなわち、メモリを2つのバンクに分割する)。一般的なシステムは、オペランドの各々のための任意の数のレジスタファイルを含むことができる一方で、最適なハードウェアは、最小数のレジスタファイルを使用するが必要なすべての演算をサポートするように設計する必要がある。
【0118】
図示される制御信号では、3つの制御信号、OP_A_RF_SRC_ADDR_SEL、OP_A_RF_DEST_ADDR_SELおよびOP_A_RF_LOAD_FLAGを使用して、オペランドAレジスタファイル2211の動作を制御する。同様に、3つの制御信号、OP_B_RF_SRC_ADDR_SEL、OP_B_RF_DEST_ADDR_SELおよびOP_B_RF_LOAD_FLAGを使用して、オペランドBレジスタファイル2212の動作を制御する。
【0119】
OP_A_RF_LOAD_FLAGおよびOP_B_RF_LOAD_FLAG信号は、それぞれオペランドAレジスタファイル2211およびオペランドBレジスタファイル2212から、それぞれオペランドA IDBバッファ2221およびオペランドB IDBバッファ2222に、データを転送する必要があるかどうかを指定する。OP_A_RF_LOAD_FLAG信号が1の値を有する場合、2つの関連する制御信号(OP_A_RF_SRC_ADDR_SELおよびOP_A_RF_DEST_ADDR_SEL)は、オペランドAデータの送信元アドレスと宛先アドレスを指定する。同様に、OP_B_RF_LOAD_FLAG信号が1の値を有する場合、2つの関連する制御信号(OP_B_RF_SRC_ADDR_SELおよびOP_B_RF_DEST_ADDR_SEL)は、オペランドBデータの送信元アドレスと宛先アドレスを指定する。すべての実施形態が、オペランドAデータおよびオペランドBデータのための宛先アドレスを必要するわけではないことに留意されたい(すなわち、オペランドAデータまたはオペランドBデータのための可能な宛先が1つしかない場合)。OP_A_RF_LOAD_FLAG信号またはOP_B_RF_LOAD_FLAG信号が0の値を有する場合、対応するオペランドAレジスタファイル2211またはオペランドBレジスタファイル2212からのデータの読み取りまたは転送は行われない。OP_A_RF_LOAD_FLAG信号およびOP_B_RF_LOAD_FLAG信号は、制御ロジック430のステートマシンおよびスケジューラ431によって生成され得る。
【0120】
OP_A_RF_SRC_ADDR_SEL信号は、読み取り対象のオペランドAレジスタファイル2211の行アドレスを指定する。上述した演算モードでは、OP_A_RF_SRC_ADDR_SEL信号は、読み取り対象のオペランドAレジスタファイルを指定する1つのアドレスのみを含む。OP_B_RF_SRC_ADDR_SEL信号は、読み取り対象のオペランドBレジスタファイル2212の行アドレスを指定する。動作モードに応じて、OP_B_RF_SRC_ADDR_SEL信号は、1つのアドレスのみ(アーキテクチャ1Bまたは2B)、または4つのアドレス(アーキテクチャ3B)、または8つのアドレス(アーキテクチャ4B)であり得る。ハードウェアは、異なる場合を処理するための適切なモードを有し、これらのモードは、制御ロジック430の制御レジスタ432によって指定される。上述した送信元アドレスは、制御ロジック430のステートマシンおよびスケジューラ431によってハードウェアで生成され得る。
【0121】
OP_A_RF_DEST_ADDR_SEL信号は、オペランドAレジスタファイル2211から読み込まれたデータが転送されるオペランドA IDBバッファ2221の宛先アドレスを指定する。同様に、OP_B_RF_DEST_ADDR_SEL信号は、オペランドBレジスタファイル2212から読み込まれたデータが転送されるオペランドB IDBバッファ2222(またはシフトロジック2224)の宛先アドレスを指定する。ここでも、動作モードに応じて、これらのアドレスは単一のアドレスまたは複数のアドレスであり得る。アドレスは、制御ロジック430のステートマシンおよびスケジューラ431によってハードウェアで生成され得る。
【0122】
複数のSIMDエンジンがオペランドレジスタファイルと制御ロジックを共有することに留意されたい。これにより、より高い計算密度、すなわち、単位シリコン面積当たりのより高い計算能力がもたらされる。オペランドレジスタファイルと制御ロジックを共有することは、電力とSRAM帯域幅の節約にもなる。SRAM帯域幅の節約は、複数のSIMDエンジンをサポートするために書き込まれる必要があるオペランドレジスタファイルが2つのみであるという事実によるものである。
【0123】
入力分配ブロック2220は、オペランドデータを保持するためのバッファ2221、2222、およびデータを操作するためのロジックブロック(IDBロジック2223、2224)を含む。
図22に示すように、オペランドAレジスタファイル2211からのオペランドA値は、オペランドA IDBロジック2223(上述したスイッチング/逆多重化機能を実行する)に提供される前に、バッファ2221に格納される。対照的に、オペランドBレジスタファイル2212からのオペランドBの値は、バッファ2222に格納される前に、シフトロジック2224を介してルーティングされる。したがって、オペランドAについては、データは最初にロードされ、次いでSIMDエンジン(SIMDブロック2230)への入力値を取得するように操作されるのに対し、オペランドBについては、データが最初に操作され(シフトされ)、次いでバッファされる。
【0124】
オペランドレジスタファイルから直接SIMDエンジンに供給する代わりに、入力分配ブロック2220は小さなキャッシュとして機能し、このキャッシュからオペランドがSIMDエンジンに供給される。入力分配ブロック2220は、単一の制御回路を使用して複数のSIMDエンジンを並列に動作させることを可能にする。上述したように、オペランドAレジスタファイル2211からのデータは、複数のSIMDエンジンに異なるデータを提供するように操作することができる。
【0125】
OP_A_IDB_ADDR_SEL信号は、各SIMDに使用すべきオペランドA IDBバッファのアドレスを指定する。議論されたすべてのアーキテクチャでは、オペランドAのために1つのレジスタファイルワードデータのみを使用してきたが、一般的な場合、バッファ2221が複数のレジスタファイルワードを保持することができ、SIMDエンジンの各々がバッファ2221から異なるレジスタファイルワードを選択することが可能である。典型的には、最適なアーキテクチャにはオペランドAバッファが1つのみ存在する。しかしながら、この単一のバッファは、1サイクルで同じバッファに読み書きが起こらないように、実際にはダブルバッファを使用して実装される。ハードウェアは、このダブルバッファを透過的に管理する。したがって、ほとんどの場合、この信号はハードウェアによって内部的に管理される。
【0126】
オペランドA IDBロジック2223を制御するOP_A_IDB_DATA_SEL信号は、各SIMDに転送する必要のあるデータを指定する。例えば、アーキテクチャ2Aでは、単一の値が効果的に複製され、すべてのSIMDエンジンにブロードキャストされる。この信号は、複製する必要のある値のインデックスを指定する。同様に、アーキテクチャ3Aでは、4つの連続した値が、レジスタファイルワードから取得され、それらの各々は効果的に複製され、1つのSIMDに送信される。この場合、OP_A_IDB_DATA_SEL信号は、SIMD0に対して複製する必要のある値のインデックスを指定する。他のSIMDエンジン(SIMD1~SIMD3)については、インデックス値はインクリメンタルである。アーキテクチャ1Aの場合、バッファ2221に格納されたフルレジスタワードは、すべてのSIMDエンジンに送信されるため、OP_A_IDB_DATA_SEL信号は必要ではない。
【0127】
オペランドB IDBシフトロジック2224を制御するOP_B_IDB_SHIFT_SEL信号は、オペランドBレジスタファイル2212から受信されたレジスタファイルワードがどのようにシフトされるかを制御するために(すなわち、オペランドBの同じレジスタファイルから2つのレジスタファイルワードを読み取るときに)使用される。OP_B_IDB_SHIFT_SEL信号(およびオペランドB IDBシフトロジック2224)は、システム2200がアーキテクチャ4Bを実装している場合にのみ必要とされることに留意されたい。この場合、OP_B_IDB_SHIFT_SEL信号は、1つのレジスタファイルワードを(上述した様式で)生成するために、2つのレジスタファイルワードをどのように操作する必要があるかを指定する。
【0128】
畳み込み演算は、典型的にはデータシフトを伴う。オペランドBレジスタファイル2212とSIMDエンジンとの間にオペランドBのシフトロジック2224を配置することは、データがオペランドBレジスタファイル2212から複数回読み取られることを可能にし、その都度データに異なるシフトを適用することによって、ハードウェアのオーバーヘッドを有利に低減する。シフトロジック2224がこのように実装されていない場合、シフトされたデータは、オペランドBレジスタファイル2212に書き込まれることが必要であろうため、提案されるアーキテクチャにおけるほど何度も再利用できない可能性がある。
【0129】
OP_B_IDB_ADDR_SEL値はオペランドB IDBバッファのアドレスを指定し、オペランドB IDBバッファはその内容をSIMDエンジンの各々の入力として提供する。この信号は、
図16のアーキテクチャ2Bに関して図示した。これは、このアーキテクチャで最も重要な信号の1つであり、実行可能な計算の種類に多くの柔軟性を提供する。OP_B_IDB_ADDR_SEL値は、典型的には、アーキテクチャ2Bに対応するモードのためのステートマシンおよびスケジューラ431から来るが、データアクセスパターンが予測可能である場合には、ハードウェアによっても管理され得る。
【0130】
入力分配ブロック2220において複数のオペランドBバッファ(IDBバッファ2222)を使用することは、異なるSIMDエンジンが所与のサイクルで異なるオペランドBデータを潜在的に取得することを可能にする。4つのオペランドBバッファ(IDBバッファ2222)(すなわち、SIMDエンジンの数と同じ)を使用することにより、4つの同時読み取りを可能にし、各SIMDが異なるデータを受信する。これは、オペランドBレジスタファイル2212を4ポートのメモリで実装する(4つの同時読み取り動作がSIMD0~SIMD3を供給することも可能であろう)よりも、(ハードウェアの観点から)はるかに低コストである。オペランドBバッファ(IDBバッファ2222)を提供して、オペランドBレジスタファイル2212からの少数のレジスタワードをバッファすることにより、SIMD0~SIMD3のいずれかによってアクセス可能な小さなキャッシュを効果的に提供する。これは、ハードウェアの複雑性と、一部のクラスのアルゴリズムに必要な柔軟性との間の良好な妥協点を提示する。
【0131】
SIMDブロック2230は、入力分配ブロック2220によって提供されるデータに対して実際の計算を実行する1つ以上のSIMDエンジンを含む。SIMDエンジンは異なる種類の演算をサポートできるため、実行すべき演算は入力として提供される必要がある。したがって、SIMD_OPERATION_SEL値は、SIMDエンジンによって実行されるべき演算を指定するために使用される。理論的には、異なるSIMDエンジンが異なる演算を実行することは可能だが、概して、同じ演算選択値SIMD_OPERATION_SELは、すべてのSIMDエンジンを駆動するために使用される。
【0132】
SIMDエンジンによって実行される計算の結果は、出力ブロック2240内の出力レジスタファイル2241~2244に書き込まれる必要がある。また、累積のような演算では、以前に累積された値を出力レジスタファイル2241~2244から読み取る必要がある(かつSIMDエンジンに提供される)。一般に、累積された値は、以前に累積された値と同じ場所に書き戻される。しかしながら、汎用性のために、出力ブロック2240には2つの制御値OUTPUT_RF_ADDR_SEL_0およびOUTPUT_RF_ADDR_SEL_1が提供され、これによって、出力レジスタファイル2241~2244の各々の読み取りアドレスおよび書き込みアドレスを個別に指定することが可能となる。一実施形態では、制御値OUTPUT_RF_ADDR_SEL_0は、出力レジスタファイル2241~2244の各々への書き込みアドレスを指定し、制御値OUTPUT_RF_ADDR_SEL_1は、出力レジスタファイル2241~2244の各々への読み取りアドレスを指定する。出力アドレスの指定については、出力回路420のアーキテクチャを議論する際に
図21を使用して例示した。
【0133】
出力レジスタファイル2241~2244の各々に複数の出力レジスタを含めることは、説明されるシステムアーキテクチャによって実行可能な演算の種類に関して柔軟性をもたらすのに有利であることに留意されたい。この柔軟性のいくつかの実施例は、以下でより詳細に説明する。
【0134】
ここで、本発明の特定の実施形態によるコンピュータアーキテクチャを動作させるための様々な実施例を説明する。
【0135】
図23は、本発明の一実施形態による、行列乗算を実行するために使用され得るコンピュータアーキテクチャ2300のブロック図である。
【0136】
図24は、
図23のコンピュータアーキテクチャ2300に乗算される2つの行列IおよびJを示す図である。行列Iは64行および16列、行列Jは16行および4列を有する。行列Iの各行は、重みベクトルを表し得、行列Jの各列は、機械学習システム内の活性化ベクトルを表し得る。行列Iは、図示されるように、1024個の(32ビット)値、w
0,0~w
63,15を含む。行列Jは、図示されるように、64個の(32ビット)値、a
0~a
15、b
0~b
15、c
0~c
15およびd
0~d
15を含む。
【0137】
行列Iおよび行列Jは、システムメモリ440に格納される(
図4)。
図25は、行列Iおよび行列Jの内容がシステムメモリ440内に論理的に格納される様式を示すブロック図である。行列Iは、256行を含むオペランドAメモリブロック441に格納され、各行は4つの重み値を含む。例えば、オペランドAメモリブロック441の第1の行(行0)は、重み値[w
0,0、w
1,0、w
2,0、w
3,0、]を含む。行列Iの第1の列(列0)(すなわち、値w
i,0、ここで、i=0~63)は、オペランドAメモリブロック441の第1の16個の連続する行に格納される。行列Iの第2の列(列1)(すなわち、値w
i,1、ここで、i=0~63)は、オペランドAメモリブロック441の16個の連続する行の第2のセットに格納される。行列Iの残りの列(列2~列15)は、図示されるように、オペランドAメモリブロック441内の16個の連続する行の連続するセットに格納される。
【0138】
行列Jは、各行が4つの活性化値を含む16行を含むオペランドBメモリブロック442に格納される。例えば、オペランドBメモリブロック442の最初の行は、行列Jの第1の行に含まれる活性化値[d0、c0、b0、a0]を含む。行列Jの残りの行(行1~行15)は、オペランドBメモリブロック442の連続する行(行1~行15)に格納される。
【0139】
行列Iと行列Jの乗算は以下のように行われる。
【0140】
ステートマシンおよびスケジューラ431(
図4)は、オペランドパッケージング回路433に、オペランドAメモリブロック441の第1の行から重み値(非ゼロエントリw
0,0、w
1,0、w
2,0およびw
3,0)を取得させ、かつオペランドBメモリブロック442の第1の行からエントリa
0、b
0、c
0およびd
0を取得させる。ステートマシンおよびスケジューラ431は、取得された重み値(非ゼロエントリw
0,0、w
1,0、w
2,0およびw
3,0)をオペランドAレジスタファイル411に書き込み、取得されたエントリa
0、b
0、c
0およびd
0をオペランドBレジスタファイル412に書き込む。この結果を
図23に示す。入力分配ブロック415内のオペランドA分配回路416は、オペランドAレジスタファイル411からの重み値(非ゼロエントリw
0,0、w
1,0、w
2,0およびw
3,0)を、それぞれ「オペランドA」として、SIMD
0、SIMD
1、SIMD
2およびSIMD
3に(上記
図11によって指定された様式で)ルーティングするように制御される。入力分配ブロック415内のオペランドB分配回路417は、オペランドBレジスタファイル412からのエントリa
0、b
0、c
0およびd
0を、(上記
図14によって指定された様式で)SIMD
0、SIMD
1、SIMD
2およびSIMD
3の各々にルーティングするように制御される。
【0141】
SIMDエンジン(SIMD0~SIMD3)の各々は、オペランドAとオペランドBとの対応するエントリを乗算し(例えば、SIMD0は、(a0×w0,0)、(b0×w0,0)、(c0×w0,0)、および(d0×w0,0)を実行し)、対応する積を生成する。
【0142】
図26は、本実施例による出力レジスタセット2000
0、2000
1、2000
2および2000
3の内容のマッピングを示す。出力レジスタセット2000
0、2000
1、2000
2および2000
3の各エントリは、最初はゼロ値に設定されている。出力レジスタセット2000
0、2000
1、2000
2および2000
3の各エントリは、行列の乗算のドット積に対応する。各ドット積は、行列Iの行と行列Jの列とによって指定される。例えば、(w
0,i a
i)とラベル付けされた出力レジスタセット2000
0のエントリは、行列Iの行0(w
0,0、w
0,1、w
0,2...w
0,15)と行列Jの列0(a
0、a
1、a
2...a
15)とのドット積を格納する。同様に、(w
26,i d
i)とラベル付けされた出力レジスタセット2000
2のエントリは、行列Iの行26(w
26,0、w
26,1、w
26,2...w
26,15)と行列Jの列3(d
0、d
1、d
2...d
15)とのドット積を格納する。
【0143】
ステートマシンおよびスケジューラ431は、出力レジスタセット2000
0、2000
1、2000
2および2000
3のアドレス指定を並列に制御する。(上述しかつ
図23に示した)初期計算の間、ステートマシンおよびスケジューラ431は、出力レジスタセット2000
0~2000
3の各々の行0をアドレス指定する。結果として、出力レジスタセット2000
0~2000
3の行0に格納されているゼロ値が、それぞれSIMD
0~SIMD
3に提供される。
【0144】
初期計算の間、SIMD0、SIMD1、SIMD2およびSIMD3の各々は累積演算を実行し、ここで出力レジスタセット20000~20003から取得されたゼロ値は、SIMD0~SIMD3によって計算された積に追加される。次いで、累積値を対応する出力レジスタセット20000~20003の行0に書き戻す。
【0145】
例えば、出力レジスタセット20000の行0のエントリ(w0,i di)、(w0,i ci)、(w0,i bi)および(w0,i ai)のゼロ値がSIMD0に提供される。次いで、SIMD0は、計算された積(w0,0×d0)、(w0,0×c0)、(w0,0×b0)および(w0,0×a0)をこれらの取得されたゼロ値に加算し、累積値を作成する。次いで、SIMD0は、これらの累積値を出力レジスタセット20000の行0のエントリ(w0,i di)、(w0,i ci)、(w0,i bi)および(w0,i ai)に書き戻す。同様の演算がSIMD1~SIMD3で実行される。
【0146】
次いで、ステートマシンおよびスケジューラ431は、オペランドAのメモリブロック(オペランドAメモリブロック441)にアクセスするために使用されるアドレスをインクリメントし、次の行の値(すなわち、w
4,0、w
5,0、w
6,0、およびw
7,0)を取得させ、オペランドAのレジスタファイル(オペランドAレジスタファイル411)に格納させる。オペランドA分配回路416は、
図23に関連して上述したのと同じ様式で、これらの受信された値をルーティングする。すなわち、値w
4,0、w
5,0、w
6,0およびw
7,0は、それぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3に提供される。オペランドBはこの時点では変更されないままである。
【0147】
SIMDエンジン(SIMD0~SIMD3)の各々は、オペランドAとオペランドBとの対応するエントリを乗算し(例えばSIMD0は、(a0×w4,0)、(b0×w4,0)、(c0×w4,0)、および(d0×w4,0)を実行し)、対応する積を提供する。
【0148】
この第2の計算の間、ステートマシンおよびスケジューラ431は、出力レジスタセット20000~20003の各々の行アドレスをインクリメントし、これによって、これらの出力レジスタセットの各々内の行1をアドレス指定する。結果として、出力レジスタセット20000~20003の行1に格納されているゼロ値が、SIMD0~SIMD3に提供される。
【0149】
第2の計算の間、SIMD0、SIMD1、SIMD2およびSIMD3の各々は累積演算を実行し、ここで出力レジスタセット20000~20003から取得されたゼロ値は、SIMDエンジンによって計算された積に追加される。次いで、累積値を出力レジスタセット20000~20003に書き戻す。
【0150】
例えば、出力レジスタセット20000の行1のエントリ(w4,i di)、(w4,i ci)、(w4,i bi)および(w4,i ai)のゼロ値がSIMD0に提供される。次いで、SIMD0は、計算された積(w4,0×d0)、(w4,0×c0)、(w4,0×b0)および(w4,0×a0)をこれらの取得されたゼロ値に加算し、累積値を作成する。次いで、SIMD0は、これらの累積値を出力レジスタセット20000の行1のエントリ(w4,i di)、(w4,i ci)、(w4,i bi)および(w4,i ai)に書き戻す。同様の演算がSIMD1~SIMD3で実行される。
【0151】
上述した処理は、オペランドA分配回路416が、重み値(非ゼロエントリw0,0~w63,0)のすべて(64個)を、行列Iの第1の列(列0)からSIMD0~SIMD3にオペランドA値として上述の様式で順次ルーティングするまで、繰り返される。
【0152】
行列Iの第1の列(列0)からの重み値が積和演算を実行するために使用された後(例えば、値w
0,0~w
63,0に関連付けられた積が計算された後)、ステートマシンおよびスケジューラ431は、出力レジスタセット2000
0~2000
3のアドレスを行0にリセットする。さらに、ステートマシンおよびスケジューラ431は、値(w
0,1、w
1,1、w
2,1、w
3,1)が取得され、オペランドAレジスタファイル411に格納されるように、オペランドAメモリブロック441にアクセスするために使用されるアドレスをインクリメントする。オペランドA分配回路416は、これらの値(w
0,1、w
1,1、w
2,1、w
3,1)をそれぞれ、SIMD
0、SIMD
1、SIMD
2およびSIMD
3に(
図23に関連して上述した様式で)ルーティングする。
【0153】
ステートマシンおよびスケジューラ431はまた、オペランドBメモリブロック442の行1からの値(a
1、b
1、c
1、d
1)が取得され、オペランドBレジスタファイル412に格納されるように、オペランドBメモリブロック442にアクセスするために使用されるアドレスを1つずつインクリメントする。オペランドB分配回路417は、これらの値(a
1、b
1、c
1、d
1)をSIMD
0、SIMD
1、SIMD
2およびSIMD
3の各々に、(
図23において、値(a
0、b
0、c
0、d
0)が以前にSIMD
0、SIMD
1、SIMD
2およびSIMD
3にルーティングされたのと同じ様式で)ルーティングする。
【0154】
SIMD0、SIMD1、SIMD2およびSIMD3は、受信した値に対して積和演算を実行し、その結果は、それぞれ出力レジスタセット20000、20001、20002および20003の行0に、上述したとおりに格納される。
【0155】
次いで、ステートマシンおよびスケジューラ431は、オペランドAのメモリブロック(オペランドAメモリブロック441)にアクセスするために使用されるアドレスをインクリメントし、次の行の値(すなわち、w
4,0、w
5,0、w
6,0、およびw
7,0)を取得させ、オペランドAのレジスタファイル(オペランドAレジスタファイル411)に格納させる。オペランドA分配回路416は、
図23に関連して上述したのと同じ様式で、これらの受信された値をルーティングする。すなわち、値w
4,0、w
5,0、w
6,0およびw
7,0は、それぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3に提供される。オペランドB(a
1、b
1、c
1、d
1)はこの時点では変更されないままである。SIMD
0、SIMD
1、SIMD
2およびSIMD
3は、受信したこれらの値に対して積和演算を実行し、その結果は、それぞれ出力レジスタセット2000
0、2000
1、2000
2および2000
3の行1に、上述したように格納される。
【0156】
上述した処理は、オペランドA分配回路416が、重み値(非ゼロエントリw0,1~w63,1)のすべて(64個)を、行列Iの第2の列(列1)からSIMD1~SIMD3にオペランドA値として順次ルーティングするまで、繰り返される(ただし、オペランドB(a1、b1、c1、d1)は変更されないままである)。
【0157】
次いで、行列Iの列(列0~列15)の各々と行列Jの行(行0~行15)の各々に対して積和演算が実行されるように、上述の処理が繰り返される。この処理の最後に、出力レジスタセット20000~20003は、行列Jの各列と行列Iの各行とのドット積を格納する。例えば、出力レジスタセット20000のエントリ(w0,i ai)は、行列Iの行0と行列Jの列0とのドット積を格納し、出力レジスタセット20001のエントリ(w29,i di)は、行列Iの行29と行列Jの列3とのドット積を格納する。
【0158】
有利には、本発明は、行列Iおよび行列Jを乗算するための効率的な構造を提供する。SIMD0~SIMD3は、高い処理並列性(例えば、同時に16個の並列積和演算)をもたらし、これは、行列乗算を実行するために必要とされる時間を有利に削減する。さらに、行列乗算を実装するために必要な制御回路も有利なことに簡素である。オペランドAメモリブロック441および出力レジスタセット20000~20003へのアドレス入力は、各積和演算の後に単純にインクリメントされ、オペランドBメモリブロック442へのアドレス入力は、16回の各積和演算の後に単純にインクリメントされる。入力分配ブロック415は、有利には、行列乗算全体の間、同じ構成を維持する。
【0159】
ゼロ値エントリを多数含む行列は、「疎(まばら)な」行列と呼ばれる。例えば、7/8以上のゼロ値エントリを含む行列は、疎行列と呼ばれ得る。疎行列を伴う乗算は、多数の不要な演算を伴う場合がある。上記の実施例において、行列Iのエントリの7/8がゼロの値を含むと仮定する。この場合、行列Iと行列Jとを乗算するためには、512(16×16×16×(1/8))の積和演算のみが必要となる。しかしながら、上述した4096(16×16×16)すべての演算が、
図23~
図26に関連して上述の方法によって実行される可能性がある。したがって、本発明の別の実施形態によれば、疎行列を用いて乗算を実行するための、
図23~
図26の構造の使用方法が提供される。
【0160】
行列Iが、エントリの8分の1のみが非ゼロエントリを有する疎行列であると仮定する。上述したように、処理は、行列Iの各列に対して順次実行される(例えば、行列Iの列0が最初に処理され、続いて行列Iの列1が処理される、など)。このように、行列Iの残りの列も同様に処理されることを理解しながら、行列Iの第1の列の処理について説明する。
【0161】
第1の実施例では、行列Iの列0の(合計64個のエントリのうちの)以下の8つのエントリ、すなわち、w3,0、w5,0、w8,0、w10,0、w11,0w24,0、w58,0、およびw61,0のみが、非ゼロエントリを有すると仮定する。
【0162】
最初に、オペランドパッケージング回路433は、行列I内の非ゼロエントリの行アドレスを識別する。したがって、本例では、オペランドパッケージング回路433は、非ゼロエントリw3,0、w5,0、w8,0、w10,0、w11,0、w24,0、w58,0、およびw61,0が、それぞれ、行列Iの行3、5、8、10、11、24、58および61に位置することを判定する。この行アドレス情報を使用して、オペランドパッケージング回路433は、識別された非ゼロエントリに関連付けられたドット積を格納するために、出力レジスタセット20000~20003のうちのどれが使用されるか決定する。概して、この決定は、オペランド行列(行列I)内の非ゼロエントリの行アドレスを「4」で除算し、次いで、この除算演算の余り(R)を使用して、出力レジスタセットを識別する(ここで、余り(R)は出力レジスタセット2000Rを識別する)ことによって行われる。
【0163】
オペランドパッケージング回路433はまた、ドット積が格納される出力レジスタセット内の行を決定する。概して、この決定は、行列I内の非ゼロエントリの行アドレスを「4」で除算し、余り(R)を無視することによって行われる。
【0164】
本実施例では、非ゼロエントリw
8,0およびw
24,0は、行列Iの行8および24に位置している。これらの行番号を4で割ると、余り「0」となり、これによって非ゼロエントリw
8,0およびw
24,0のドット積が出力レジスタセット2000
0に位置されることを示す。また、8/4=2、および24/4=6であるため、非ゼロエントリw
8,0およびw
24,0のドット積は、それぞれ出力レジスタセット2000
0の行2および行6に位置される。この結果は、出力レジスタセット2000
0が、出力レジスタセット2000
0の行2にドット積[(w
8,id
i)、(w
8,ic
i)、(w
8,ib
i)、(w
8,ia
i)]、および出力レジスタセット2000
0の行6にドット積[(w
24,id
i)、(w
24,ic
i)、(w
24,ib
i)、(w
24,ia
i)]を含むことを示す
図26によって確認される。
【0165】
本実施例では、非ゼロエントリw
5,0およびw
61,0は、行列Iの行5および61に位置している。これらの行番号を4で割ると、余り「1」となり、これによって非ゼロエントリw
5,0およびw
61,0のドット積が出力レジスタセット2000
1に位置されることを示す。また、5/4=1(余り1)、および61/4=15(余り1)であるため、非ゼロエントリw
5,0およびw
61,0のドット積は、それぞれ出力レジスタセット2000
1の行1および行15に位置される。この結果は、出力レジスタセット2000
1が、出力レジスタセット2000
1の行1にドット積[(w
5,i d
i)、(w
5,i c
i)、(w
5,i b
i)、(w
5,i a
i)]、および出力レジスタセット2000
1の行15にドット積[(w
61,i d
i)、(w
61,i c
i)、(w
61,i b
i)、(w
61,i a
i)]を含むことを示す
図26によって確認される。
【0166】
本実施例では、非ゼロエントリw
10,0およびw
58,0は、行列Iの行10および58に位置している。これらの行番号を4で割ると、余り「2」となり、これによって非ゼロエントリw
10,0およびw
58,0のドット積が出力レジスタセット2000
2に位置されることを示す。また、10/4=2(余り2)、および58/4=14(余り2)であるため、非ゼロエントリw
10,0およびw
58,0のドット積は、それぞれ出力レジスタセット2000
2の行2および行14に位置される。この結果は、出力レジスタセット2000
2が、出力レジスタセット2000
2の行2にドット積[(w
10,i d
i)、(w
10,i c
i)、(w
10,i b
i)、(w
10,i a
i)]、および出力レジスタセット2000
2の行14にドット積[(w
58,i d
i)、(w
58,i c
i)、(w
58,i b
i)、(w
58,i a
i)]を含むことを示す
図26によって確認される。
【0167】
本実施例では、非ゼロエントリw
3,0およびw
11,0は、行列Iの行3および11に位置している。これらの行番号を4で割ると、余り「3」となり、これによって非ゼロエントリw
3,0およびw
11,0のドット積が出力レジスタセット2000
3に位置されることを示す。また、3/4=0(余り3)、および11/4=2(余り3)であるため、非ゼロエントリw
3,0およびw
11,0のドット積は、それぞれ出力レジスタセット2000
3の行0および行2に位置される。この結果は、出力レジスタセット2000
3が、出力レジスタセット2000
3の行0にドット積[(w
3,i d
i)、(w
3,i c
i)、(w
3,i b
i)、(w
3,i a
i)]、および出力レジスタセット2000
3の行2にドット積[(w
11,i d
i)、(w
11,i c
i)、(w
11,i b
i)、(w
11,i a
i)]を含むことを示す
図26によって確認される。
【0168】
上記で指定された判定を行うと、オペランドパッケージング回路433は、行列Iの列0のw3,0、w5,0、w8,0、w10,0、w11,0、w24,0、w58,0、およびw61,0の非ゼロエントリを、オペランドAメモリブロック441に以下のようにソート(パック)する。後述の新たな記述を参照のこと。
【0169】
出力レジスタセット20000、20001、20002および20003に格納されたドット積を有する最初の非ゼロエントリは、オペランドAメモリブロック441の第1の行(行0)に格納される。したがって、本実施例では、それぞれ出力レジスタセット20000、20001、20002および20003にドット積を有する非ゼロエントリw8,0、w5,0、w10,0およびw3,0は、オペランドAメモリブロック441の行0に格納される。
【0170】
出力レジスタセット2000
0、2000
1、2000
2および2000
3に格納されたドット積を有する次の非ゼロエントリは、オペランドAメモリブロック441の第2の行(行1)に格納される。したがって、本実施例では、それぞれ出力レジスタセット2000
0、2000
1、2000
2および2000
3にドット積を有する非ゼロエントリw
24,0、w
61,0、w
58,0およびw
11,0は、オペランドAメモリブロック441の行1に格納される。
図27に、行列Iの列0の非ゼロエントリのオペランドAメモリブロック441への上述したソート/パックを示す。
【0171】
最初に、ステートマシンおよびスケジューラ431は、
図27に例示されるように、オペランドAメモリブロック441およびオペランドBメモリブロック442の第1の行を取得させ、それぞれオペランドAレジスタファイル411およびオペランドBレジスタファイル412にロードさせる。したがって、オペランドAレジスタファイル411は、行列Iの非ゼロ重み値(非ゼロエントリw
8,0、w
5,0、w
10,0およびw
3,0)を格納し、オペランドBレジスタファイル412は、行列Jの活性化値d
0、c
0、b
0およびa
0を格納する。ステートマシンおよびスケジューラ431は、オペランドA分配回路416に、非ゼロエントリw
8,0、w
5,0、w
10,0およびw
3,0を、オペランドAレジスタファイル411から、それぞれオペランドAとしてSIMD
0、SIMD
1、SIMD
2およびSIMD
3にルーティングさせる。同時に、ステートマシンおよびスケジューラ431は、オペランドB分配回路417に、値d
0、c
0、b
0およびa
0をオペランドBとしてSIMDエンジンの各々にルーティングさせる。これらの値d
0、c
0、b
0およびa
0は、オペランドBメモリブロック442の行0(すなわち、行列Jの行0)からルーティングされる。オペランドA値w
8,0、w
5,0、w
10,0およびw
3,0の各々は行列Iの列0から来ているためである。
図27は、上述の構成を示すブロック図である。
【0172】
SIMD0、SIMD1、SIMD2およびSIMD3は、受信したオペランドAおよびBを上述した様式で乗算する。ステートマシンおよびスケジューラ431は、非ゼロエントリw8,0、w5,0、w10,0およびw3,0に関連付けられた出力レジスタセット20000、20001、20002および20003内の、以前に決定された行を独立してアドレス指定する。すなわち、ステートマシンおよびスケジューラ431は、出力レジスタセット20000、20001、20002および20003内の行2、行1、行2、および行0をそれぞれアドレス指定する。上述したように、出力レジスタセットのすべての行は、最初に「0」値を格納する。
【0173】
SIMD0、SIMD1、SIMD2およびSIMD3は、累積演算を実行し、計算された積は、それぞれ出力レジスタセット20000、20001、20002および20003から取得されたゼロ値に追加される。次に、SIMD0、SIMD1、SIMD2およびSIMD3は、それぞれ、出力レジスタセット20000、20001、20002および20003のアドレス指定された行(それぞれ行2、行1、行2および行0)に累積値を書き込む。
【0174】
図28によって示されるように、ステートマシンおよびスケジューラ431は、次いで、オペランドAメモリブロック441の第2の行から非ゼロエントリw
24,0、w
61,0、w
58,0およびw
11,0を取得し、これらの非ゼロエントリをオペランドAレジスタファイル411に格納する。
【0175】
したがって、オペランドAレジスタファイル411は、行列Iの非ゼロ重み値(非ゼロエントリw
24,0、w
61,0、w
58,0およびw
11,0)を格納し、オペランドBレジスタファイル412は、行列Jの活性化値d
0、c
0、b
0およびa
0を格納する。ステートマシンおよびスケジューラ431は、オペランドA分配回路416に、非ゼロエントリw
24,0、w
61,0、w
58,0およびw
11,0を、オペランドAレジスタファイル411から、それぞれオペランドAとしてSIMD
0、SIMD
1、SIMD
2およびSIMD
3にルーティングさせる。同時に、ステートマシンおよびスケジューラ431は、オペランドB分配回路417に、値d
0、c
0、b
0およびa
0をオペランドBとしてSIMDエンジンの各々に継続してルーティングさせる。これらの値d
0、c
0、b
0およびa
0は、オペランドBメモリブロック442の行0(すなわち、行列Jの行0)からルーティングされる。オペランドA値w
24,0、w
61,0、w
58,0およびw
11,0の各々は行列Iの列0から来ているためである。
図28は、上述の構成を示すブロック図である。
【0176】
SIMD0、SIMD1、SIMD2およびSIMD3は、受信したオペランドAおよびBを上述した様式で乗算する。ステートマシンおよびスケジューラ431は、非ゼロエントリw24,0、w61,0、w58,0およびw11,0に関連付けられた出力レジスタセット20000、20001、20002および20003内の、以前に決定された行を独立してアドレス指定する。すなわち、ステートマシンおよびスケジューラ431は、出力レジスタセット20000、20001、20002および20003内の行6、行15、行14および行2をそれぞれアドレス指定する。
【0177】
SIMD0、SIMD1、SIMD2およびSIMD3は、累積演算を実行し、計算された積は、それぞれ出力レジスタセット20000、20001、20002および20003から取得されたゼロ値に追加される。次に、SIMD0、SIMD1、SIMD2およびSIMD3は、それぞれ、出力レジスタセット20000、20001、20002および20003のアドレス指定された行(それぞれ行6、行15、行14および行2)に累積値を書き込む。
【0178】
上述の演算は、行列Iの第1の列(列0)の処理を完了する。行列Iの残りの15列の各々について同じ処理ステップを実行し、それによって、「疎な」行列Iと行列Jとの乗算を完了する。これらの処理ステップでは、行列Iの列1の非ゼロエントリに行列Jの行1の値(すなわち、a1、b1、c1およびd1)を乗算し、行列Iの列2の非ゼロエントリに行列Jの行2の値(すなわち、a2、b2、c2およびd2)を乗算するなどであることに留意されたい。有利には、SIMDエンジンは、「疎な」行列Iと行列Jとの乗算を実行するために必要な積和演算の数を最小限に抑えながら、ビジー状態に維持される(すなわち、非ゼロ行列値の積和演算を実行する)。前述の様式で、コンピュータアーキテクチャは、非常に効率的な(かつ高速な)様式で疎行列の乗算を実行する。
【0179】
上述の疎行列の乗算の実施例は、出力レジスタセット20000~20003の間に均等に分配される行列Iの非ゼロエントリを含む(例えば、行列Iの列0の8つの非ゼロエントリは、出力レジスタセット20000~20003の各々が2つの非ゼロエントリに関連付けられるように、分配される)。ただし、他の実施例では、非ゼロエントリの分配は一様ではない場合がある。本発明の別の実施形態は、以下でより詳細に説明する様式で、非ゼロエントリの不均一な分配を処理する。
【0180】
行列Iの最初の3列内の最初の16個の非ゼロエントリが、非ゼロエントリw2,0、w12,0、w32,0、w38,0、w45,0、w56,0(行列Iの列0内)、w7,1、w14,1、w21,1、w25,1、w37,1、w43,1(行列Iの列1内)、w8,2、w10,2、w23,2およびw51,2(行列Iの列2内)であると仮定する。
【0181】
オペランドパッケージング回路433は、行列I内の非ゼロエントリの行アドレスを識別する(例えば、非ゼロエントリw2,0は行列Iの行2に位置する)。この行アドレス情報を使用して、オペランドパッケージング回路433は、出力レジスタセット20000~20003のうちのどれを使用して、上述の様式で識別された非ゼロエントリに関連付けられたドット積を格納するか決定する。オペランドパッケージング回路433はまた、上述した様式で、ドット積が格納される出力レジスタセット内の行を決定する。
【0182】
したがって、本実施例では、オペランドパッケージング回路433は、非ゼロエントリw12,0、w32,0、w56,0およびw8,2に関連付けられたドット積が、出力レジスタセット20000の行3、8、14および2にそれぞれマッピングされ、非ゼロエントリw45,0、w21,0、w25,0およびw37,2に関連付けられたドット積が、出力レジスタセット20001の行11、5、6および9にそれぞれマッピングされ、非ゼロエントリw2,0、w38,0、w14,1およびw10,2に関連付けられたドット積が、出力レジスタセット20002の行0、9、3および2にそれぞれマッピングされ、かつ重み値(非ゼロエントリw7,1、w43,1、w23,2およびw51,2)に関連付けられたドット積が、出力レジスタセット20003の行7、10、5および12にそれぞれマッピングされることを決定する。
【0183】
行列Iの列0の3つの非ゼロエントリ(w12,0、w32,0およびw56,0)は、出力レジスタセット20000にマッピングされ、行列Iの列0の1つの非ゼロエントリ(w45,0)は、出力レジスタセット20001にマッピングされ、行列Iの列0の2つの非ゼロエントリ(w2,0およびw38,0)は、出力レジスタセット20002にマッピングされ、行列Iの列0の非ゼロエントリは、出力レジスタセット20003にマッピングされないことに留意されたい。
【0184】
行列Iの列1の非ゼロエントリは、出力レジスタセット20000にマッピングされず、行列Iの列1の3つの非ゼロエントリ(w21,1、w25,1、w37,1)は、出力レジスタセット20001にマッピングされ、行列Iの列1の1つの非ゼロエントリ(w14,1)は、出力レジスタセット20002にマッピングされ、かつ行列Iの列0の2つの非ゼロエントリ(w7,1およびw43,1)は、出力レジスタセット20003にマッピングされる。
【0185】
行列Iの列2の1つの非ゼロエントリ(w8,2)は、出力レジスタセット20000にマッピングされ、行列Iの列2の非ゼロエントリは、出力レジスタセット20001にマッピングされず、行列Iの列2の1つの非ゼロエントリ(w10,2)は、出力レジスタセット20002にマッピングされ、かつ行列Iの列2の2つの非ゼロエントリ(w23,2およびw51,2)は、出力レジスタセット20003にマッピングされる。
【0186】
上記で指定した判定を行うと、オペランドパッケージング回路433は、行列Iの列0、1および2の非ゼロエントリを、オペランドAメモリブロック441に以下のようにソート(パック)する。出力レジスタセット20000、20001、20002および20003に格納されたドット積を有する最初の非ゼロエントリは、オペランドAメモリブロック441の第1の行(行0)に格納される。したがって、本実施例では、それぞれ出力レジスタセット20000、20001、20002および20003にドット積を有する非ゼロエントリw12,0、w45,0、w2,0およびw7,1は、オペランドAメモリブロック441の行0に格納される。
【0187】
出力レジスタセット20000、20001、20002および20003に格納されたドット積を有する次の非ゼロエントリは、オペランドAメモリブロック441の第2の行(行1)に格納される。したがって、本実施例では、それぞれ出力レジスタセット20000、20001、20002および20003にドット積を有する非ゼロエントリw32,0、w21,1、w38,0およびw23,2は、オペランドAメモリブロック441の行1に格納される。
【0188】
出力レジスタセット20000、20001、20002および20003に格納されたドット積を有する次の非ゼロエントリは、オペランドAメモリブロック441の第3の行(行2)に格納される。したがって、本実施例では、それぞれ出力レジスタセット20000、20001、20002および20003にドット積を有する重み値(非ゼロエントリw8,2、w37,1、w10,2およびw43,1)は、オペランドAメモリブロック441の行2に格納される。
【0189】
図29に、行列Iの列0、1および2の非ゼロエントリのオペランドAメモリブロック441への上述したソート/パックを示す。
【0190】
最初に、ステートマシンおよびスケジューラ431は、オペランドAメモリブロック441の行0を取得してオペランドAレジスタファイル411にロードさせ、次いでオペランドA分配回路416に転送させる。したがって、オペランドAレジスタファイル411は、行列Iの非ゼロ重み値(非ゼロエントリw12,0、w45,0、w2,0およびw7,1)を格納する。代替的な実施形態では、これらの非ゼロエントリw12,0、w45,0、w2,0およびw7,1は、オペランドA分配回路416内のバッファに格納されることに留意されたい。
【0191】
また、ステートマシンおよびスケジューラ431は、オペランドBメモリブロック442の行0および行1を取得してオペランドBレジスタファイル412にロードさせ、次いで、オペランドB分配回路417内のオペランドBバッファB0およびB1にそれぞれ転送させる。したがって、オペランドBレジスタファイル412およびオペランドBバッファB0は、行列Jの活性化値d
0、c
0、b
0およびa
0を格納し、オペランドBレジスタファイル412およびオペランドBバッファB1は、行列Jの活性化値d
1、c
1、b
1およびa
1を格納する。この状態を
図29に示す。
【0192】
ステートマシンおよびスケジューラ431は、オペランドBメモリブロック(制御レジスタ432)の行0および行1から活性化値を取得することに留意されたい。これらの2つの活性化値は、(行列Iの最初の2列から取り出された)オペランドAに含まれる取得された重み値に関連付けられた必要なドット積を計算するために必要であるためである。また、オペランドBレジスタファイル412は、オペランドBメモリブロック442から直列にまたは並列にロードされ得、オペランドB分配回路417のバッファB0~B3は、オペランドBレジスタファイル412から直列に(
図16)または並列に(
図17~
図18)ロードされ得ることに留意されたい。
【0193】
ステートマシンおよびスケジューラ431は、オペランドA分配回路416に、オペランドAレジスタファイル411から非ゼロエントリw
12,0、w
45,0、w
2,0およびw
7,1を、オペランドAとして、それぞれSIMD
0、SIMD
1、SIMD
2およびSIMD
3にルーティングさせる。同時に、ステートマシンおよびスケジューラ431は、オペランドB分配回路417に、値d
0、c
0、b
0およびa
0を、オペランドBとして、SIMD
0、SIMD
1およびSIMD
2の各々にルーティングさせ、また、オペランドB分配回路417に、値d
1、c
1、b
1およびa
1を、SIMD
3にルーティングさせる。
図29に示す実施形態では、オペランドB選択レジスタ(オペランドBバッファ選択ロジック1601)は、これらのオペランドB値のルーティングを可能にするオペランドB選択信号を格納する。
【0194】
SIMD0、SIMD1、SIMD2およびSIMD3は、受信したオペランドAおよびBを上述した様式で乗算する。ステートマシンおよびスケジューラ431は、非ゼロエントリw12,0、w45,0、w2,0およびw7,1に関連付けられた出力レジスタセット20000、20001、20002および20003内の、以前に決定された行を独立してアドレス指定する。すなわち、ステートマシンおよびスケジューラ431は、出力レジスタセット20000、20001、20002および20003内の行4、行11、行0および行1をそれぞれアドレス指定する。上述したように、出力レジスタセットのすべての行は、最初に「0」値を格納する。
【0195】
SIMD
0、SIMD
1、SIMD
2およびSIMD
3は、累積演算を実行し、計算された積は、それぞれ出力レジスタセット2000
0、2000
1、2000
2および2000
3から取得されたゼロ値に追加される。次に、SIMD
0、SIMD
1、SIMD
2およびSIMD
3は、それぞれ、出力レジスタセット2000
0、2000
1、2000
2および2000
3のアドレス指定された行(それぞれ行4、行11、行0および行1)に累積値を書き込む。
図29に示す実施形態では、レジスタ選択ロジック2101は、出力レジスタセット2000
0、2000
1、2000
2および2000
3への/からの値のルーティングを可能にするレジスタ選択エントリを格納する。
【0196】
図29に実装された積和演算は、行列Iの第1の列(すなわち、非ゼロエントリw
12,0、w
45,0およびw
2,0)、および行列Iの第2の列(すなわち、非ゼロエントリw
7,1)の両方からの非ゼロ重み値を有利に使用し、それによって効率を向上させることに留意されたい(行列Iの第1の列にはSIMDエンジンの4つすべてを供給するのに十分な非ゼロエントリがないにもかかわらず、いずれのSIMDエンジンもアイドル状態ではないため)。
【0197】
図30によって例示されるように、ステートマシンおよびスケジューラ431は、オペランドAメモリブロック441の行1を取得してオペランドAレジスタファイル411にロードさせ、次いでオペランドA分配回路416内のオペランドAバッファ内に転送させる。したがって、オペランドAレジスタファイル411およびオペランドA分配回路416は、行列Iの非ゼロ重み値(非ゼロエントリw
32,0、w
21,1、w
38,0およびw
23,2)を格納する。
【0198】
また、ステートマシンおよびスケジューラ431は、オペランドBメモリブロック442の行2を取得してオペランドBレジスタファイル412にロードさせ、オペランドB分配回路417内のオペランドBバッファB2に転送させる。したがって、オペランドBレジスタファイル412およびオペランドBバッファB0は、行列Jの活性化値d0、c0、b0およびa0を格納し、オペランドBレジスタファイル412およびオペランドBバッファB1は、活性化値d1、c1、b1およびa1を格納し、オペランドBレジスタファイル412およびオペランドBバッファB2は、活性化値d2、c2、b2およびa2を格納する。
【0199】
ステートマシンおよびスケジューラ431は、オペランドBメモリブロック(制御レジスタ432)の行0、1および2から活性化値を取得することに留意されたい。これらの3つの活性化値は、(行列Iの最初の3列から取り出された)オペランドAに含まれる取得された重み値に関連付けられた必要なドット積を計算するために必要であるためである。
【0200】
ステートマシンおよびスケジューラ431は、オペランドA分配回路416に、オペランドAレジスタファイル411から非ゼロエントリw32,0、w21,1、w38,0およびw23,2を、オペランドAとしてそれぞれSIMD0、SIMD1、SIMD2およびSIMD3ルーティングさせる。同時に、ステートマシンおよびスケジューラ431は、オペランドB分配回路417に、値d0、c0、b0およびa0を、オペランドBとして、SIMD0およびSIMD2の各々にルーティングさせ、オペランドB分配回路417に、値d1、c1、b1およびa1をSIMD1にルーティングさせ、オペランドB分配回路417に、値d2、c2、b2およびa2をSIMD3にルーティングさせる。
【0201】
SIMD0、SIMD1、SIMD2およびSIMD3は、受信したオペランドAおよびBを上述した様式で乗算する。ステートマシンおよびスケジューラ431は、非ゼロエントリw32,0、w21,1、w38,0およびw23,2に関連付けられた出力レジスタセット20000、20001、20002および20003内の、以前に決定された行を独立してアドレス指定する。すなわち、ステートマシンおよびスケジューラ431は、出力レジスタセット20000、20001、20002および20003内の行8、行5、行9および行5をそれぞれアドレス指定する。上述したように、出力レジスタセットのすべての行は、最初に「0」値を格納する。
【0202】
SIMD0、SIMD1、SIMD2およびSIMD3は、累積演算を実行し、計算された積は、それぞれ出力レジスタセット20000、20001、20002および20003から取得されたゼロ値に追加される。次に、SIMD0、SIMD1、SIMD2およびSIMD3は、それぞれ、出力レジスタセット20000、20001、20002および20003のアドレス指定された行(それぞれ行8、行5、行9および行5)に累積値を書き込む。
【0203】
図30に実装される積和演算は、行列Iの第1の列(すなわち、重み値(非ゼロエントリw
32,0およびw
38,0))、行列Iの第2の列(すなわち、非ゼロエントリw
21,1)ならびに行列Iの第3の列(すなわち、非ゼロエントリw
23,2)からの非ゼロ重み値を有利に使用し、それによって演算効率を向上させることに留意されたい(SIMDエンジンはいずれもアイドル状態ではないため)。
【0204】
図31によって例示されるように、ステートマシンおよびスケジューラ431は、オペランドAメモリブロック441の行2を取得してオペランドAレジスタファイル411にロードさせ、次いでオペランドA分配回路416内のオペランドAバッファ内に転送させる。したがって、オペランドAレジスタファイル411およびオペランドA分配回路416は、行列Iの非ゼロ重み値(非ゼロエントリw
8,2、w
37,1、w
10,2およびw
43,1)を格納する。
【0205】
すでにオペランドB分配のオペランドBバッファB1~B2に格納されている活性化値は、行列Iの非ゼロ重み値(非ゼロエントリw8,2、w37,1、w10,2およびw43,1)に関連付けられた積和演算で使用される。
【0206】
ステートマシンおよびスケジューラ431は、オペランドA分配回路416に、オペランドAレジスタファイル411から非ゼロエントリw8,2、w37,1、w10,2およびw43,1を、オペランドAとして、それぞれSIMD0、SIMD1、SIMD2およびSIMD3にルーティングさせる。同時に、ステートマシンおよびスケジューラ431は、オペランドB分配回路417に、値d2、c2、b2およびa2を、オペランドBとしてSIMD0およびSIMD2の各々にルーティングさせ、かつオペランドB分配回路417に、値d1、c1、b1およびa1をSIMD1およびSIMD3にルーティングさせる。
【0207】
SIMD0、SIMD1、SIMD2およびSIMD3は、受信したオペランドAおよびBを上述した様式で乗算する。ステートマシンおよびスケジューラ431は、非ゼロエントリw8,2、w37,1、w10,2およびw43,1に関連付けられた出力レジスタセット20000、20001、20002および20003内の、以前に決定された行を独立してアドレス指定する。すなわち、ステートマシンおよびスケジューラ431は、出力レジスタセット20000、20001、20002および20003内の行2、行9、行2および行10をそれぞれアドレス指定する。上述したように、出力レジスタセットのすべての行は、最初に「0」値を格納する。
【0208】
SIMD0、SIMD1、SIMD2およびSIMD3は、累積演算を実行し、計算された積は、それぞれ出力レジスタセット20000、20001、20002および20003から取得されたゼロ値に追加される。次に、SIMD0、SIMD1、SIMD2およびSIMD3は、それぞれ、出力レジスタセット20000、20001、20002および20003のアドレス指定された行(それぞれ行2、行9、行2および行10)に累積値を書き込む。
【0209】
図31に実装される積和演算は、行列Iの第2の列(すなわち、非ゼロエントリw
37,1およびw
43,1)ならびに行列Iの第3の列(すなわち、非ゼロエントリw
8,2およびw
10,2)からの非ゼロ重み値を有利に使用し、それによって演算効率を向上させることに留意されたい(SIMDエンジンのいずれもアイドル状態ではないため)。
【0210】
疎行列Iの3列のみの処理については、
図29~
図31の実施例で説明したが、疎行列Iの残りの列は、最初の3列と同様に処理することができることが理解される。上述の方法で疎行列Iの非ゼロ演算値をパックすることにより、疎行列Iと行列Jとを乗算するために必要な演算数を有利に最小化する。
【0211】
上述した実施形態では、オペランドパッケージング回路433は制御ロジック430の一部として示されているが、代替実施形態では、オペランドパッケージング回路433の機能はコンピュータシステム400の外部に実装可能であることが理解される。そのような代替実施形態では、ソフトウェアを使用して、行列Iの非ゼロエントリを識別し(行列Iのエントリによって表されるネットワークの重み値が既知であるため)、これらの非ゼロエントリに関連付けられた出力レジスタ(および出力レジスタ行アドレス)を決定し、行列Iの非ゼロエントリで積和演算を実行するために必要な行列Jの値のアドレスを識別し、かつ行列Iの非ゼロエントリがオペランドAレジスタファイル411内にパックされるべき様式を決定することが可能である。これらの決定を実施するための方法は、上記で詳細に説明される。パックされたオペランドA値は次いで、オペランドAレジスタファイル411(および/またはシステムメモリ440)に直接ロードされ得る。オペランドBレジスタファイル412をロードしそれにアクセスするために必要なアドレス、および出力レジスタセット20000~20003にアクセスするために必要なアドレスは、ステートマシンおよびスケジューラ431にロードされ得る。次いで、ステートマシンおよびスケジューラ431は、単にメモリから非ゼロエントリを取得し、余分にハードウェアを複雑にすることなく、ランタイム中に必要なアドレス信号を供給する。このようにして、この代替実施形態は、コンピュータシステム400のハードウェア要件を有利に低減する。
【0212】
本発明はいくつかの実施形態に関連して説明されてきたが、本発明は開示される実施形態に限定されず、当業者には明らかであろう様々な変更が可能であることが理解される。したがって、本発明は、以下の特許請求の範囲によってのみ限定される。
【手続補正書】
【提出日】2022-03-25
【手続補正1】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
単一命令複数データエンジンの複数の数(N)と対応する出力レジスタの複数の数(N)とを含むコンピュータシステムを使用して、第1の行列および第2の行列の行列乗算を実行する方法であって、前記方法は、
前記第1の行列に含まれる複数の非ゼロエントリを識別することであって、前記非ゼロエントリの各々が、前記第1の行列内に対応する列アドレスと対応する行アドレスとを有する、該識別することと、
識別された前記非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する行アドレスに応答して前記非ゼロエントリを処理するために、前記単一命令複数データエンジンのうちの1つおよび前記出力レジスタのうちの対応する1つを識別することと、
前記識別された単一命令複数データエンジンおよび対応する出力レジスタに基づいて前記非ゼロエントリをソートし、これによって複数の第1のオペランド値を作成することであって、前記第1のオペランド値の各々は、各々が異なる識別された単一命令複数データエンジンと対応する前記出力レジスタとを有する複数の前記非ゼロエントリを含む、該作成することと、
乗算演算を実行するために、前記第1のオペランド値を前記単一命令複数データエンジンにルーティングすることであって、前記ルーティングにより、前記第1のオペランド値に含まれる前記非ゼロエントリの各々が、前記識別された単一命令複数データエンジンに提供される、該ルーティングすることと、を含む、方法。
【請求項2】
前記識別された非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する列アドレスに応答して、前記第2の行列内のエントリの行を識別することと、
乗算演算を実行するために、識別された前記エントリの行を前記単一命令複数データエンジンにルーティングすることであって、前記単一命令複数データエンジンの前記各々は、前記非ゼロエントリをその識別されたエントリの行を用いて乗算する、該ルーティングすることと、をさらに含む、請求項1に記載の方法。
【請求項3】
前記識別された非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する行アドレスに応答して、前記出力レジスタのうちの前記対応する1つ内の行を識別することと、
前記出力レジスタの識別された前記行にアクセスすることによって、累積演算を実行することと、をさらに含む、請求項1に記載の方法。
【請求項4】
前記第1の行列の各行は、機械学習システムにおける重みベクトルを表し、前記第2の行列の各列は、前記機械学習システムにおける活性化ベクトルを表す、請求項1に記載の方法。
【請求項5】
前記第1の行列のゼロエントリを無視することをさらに含む、請求項1に記載の方法。
【請求項6】
前記行列乗算の各ドット積に前記出力レジスタ内の一意のエントリを割り当てることをさらに含む、請求項1に記載の方法。
【請求項7】
前記単一命令複数データエンジンの各々が前記非ゼロエントリのうちの1つの複数の複製を受信するように、前記第1のオペランド値が前記単一命令複数データエンジンにルーティングされている、請求項1に記載の方法。
【請求項8】
前記出力レジスタの識別された前記行の各々を独立してアドレス指定することをさらに含む、請求項3に記載の方法。
【請求項9】
前記第1の行列の前記エントリの8分の1以下が非ゼロエントリである、請求項1に記載の方法。
【請求項10】
前記非ゼロエントリの前記対応する行アドレスに応答して前記非ゼロエントリを処理するために、前記単一命令複数データエンジンのうちの1つおよび前記出力レジスタのうちの対応する1つを識別することが、前記第1の行列内の前記非ゼロエントリの前記行アドレスを前記数Nで除算することと、その後、前記単一命令複数データエンジンのうちの1つおよび前記出力レジスタのうちの前記対応する1つを識別するために、この除算演算の余りを使用することと、を含む、請求項1に記載の方法。
【請求項11】
前記非ゼロエントリの前記対応する行アドレスに応答して、前記出力レジスタのうちの前記対応する1つ内の行を識別することは、前記第1の行列内の前記非ゼロ値の前記行アドレスを前記数Nで除算することと、余りを無視することと、を含む、請求項3に記載の方法。
【請求項12】
前記非ゼロエントリの前記対応する列アドレスに応答して、前記第2の行列内のエントリの行を識別することは、前記非ゼロエントリの前記対応する列アドレスに等しい行アドレスを有する前記2の行列のエントリの行を識別することを含む、請求項2に記載の方法。
【請求項13】
コンピュータシステムであって、
単一命令複数データエンジンの複数の数(N)と、
対応する出力レジスタの複数の数(N)とを含み、
前記第1の行列に含まれる複数の非ゼロエントリを識別することであって、前記非ゼロエントリの各々が、前記第1の行列内に対応する列アドレスと対応する行アドレスとを有する、該識別することと、
識別された前記非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する行アドレスに応答して前記非ゼロエントリを処理するために、前記単一命令複数データエンジンのうちの1つおよび前記出力レジスタのうちの対応する1つを識別することと、
前記識別された単一命令複数データエンジンおよび対応する出力レジスタに基づいて前記非ゼロエントリをソートし、これによって複数の第1のオペランド値を作成することであって、前記第1のオペランド値の各々は、各々が異なる識別された単一命令複数データエンジンと対応する前記出力レジスタとを有する複数の前記非ゼロエントリを含む、該作成することと、
乗算演算を実行するために、前記第1のオペランド値を前記単一命令複数データエンジンにルーティングすることであって、前記ルーティングにより、前記第1のオペランド値に含まれる前記非ゼロエントリの各々が、前記識別された単一命令複数データエンジンに提供される、該ルーティングすることと、を実行することによって、第1の行列および第2の行列の行列乗算を実行するように構成された、コンピュータシステム。
【請求項14】
前記識別された非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する列アドレスに応答して、前記第2の行列内のエントリの行を識別することと、
乗算演算を実行するために、識別された前記エントリの行を前記単一命令複数データエンジンにルーティングすることであって、前記単一命令複数データエンジンの前記各々は、前記非ゼロエントリをその識別されたエントリの行を用いて乗算する、該ルーティングすることと、を実行するように構成された、請求項13に記載のコンピュータシステム。
【請求項15】
前記識別された非ゼロエントリの各非ゼロエントリについて、前記非ゼロエントリの前記対応する行アドレスに応答して、前記出力レジスタのうちの前記対応する1つ内の行を識別することと、
前記出力レジスタの識別された前記行にアクセスすることによって、累積演算を実行することと、を実行するように構成された、請求項13に記載のコンピュータシステム。
【請求項16】
前記第1の行列の各行は、機械学習システムにおける重みベクトルを表し、前記第2の行列の各列は、前記機械学習システムにおける活性化ベクトルを表す、請求項13に記載のコンピュータシステム。
【請求項17】
前記第1の行列のゼロエントリを無視することを実行するように構成された、請求項13に記載のコンピュータシステム。
【請求項18】
前記行列乗算の各ドット積に前記出力レジスタ内の一意のエントリを割り当てることを実行するように構成された、請求項13に記載のコンピュータシステム。
【請求項19】
前記単一命令複数データエンジンの各々が前記非ゼロエントリのうちの1つの複数の複製を受信するように、前記第1のオペランド値を前記単一命令複数データエンジンにルーティングすることを実行するように構成された、請求項13に記載のコンピュータシステム。
【請求項20】
前記出力レジスタの識別された前記行の各々を独立してアドレス指定することを実行するように構成された、請求項15に記載のコンピュータシステム。
【請求項21】
前記第1の行列の前記エントリの8分の1以下が非ゼロエントリである、請求項13に記載のコンピュータシステム。
【請求項22】
前記非ゼロエントリの前記対応する行アドレスに応答して前記非ゼロエントリを処理するために、前記単一命令複数データエンジンのうちの1つおよび前記出力レジスタのうちの対応する1つを識別することが、前記第1の行列内の前記非ゼロエントリの前記行アドレスを前記数Nで除算することと、その後、前記単一命令複数データエンジンのうちの1つおよび前記出力レジスタのうちの前記対応する1つを識別するために、この除算演算の余りを使用することと、を含む、請求項13に記載のコンピュータシステム。
【請求項23】
前記非ゼロエントリの前記対応する行アドレスに応答して、前記出力レジスタのうちの前記対応する1つ内の行を識別することは、前記第1の行列内の前記非ゼロ値の前記行アドレスを前記数Nで除算することと、余りを無視することと、を含む、請求項15に記載のコンピュータシステム。
【請求項24】
前記非ゼロエントリの前記対応する列アドレスに応答して、前記第2の行列内のエントリの行を識別することは、前記非ゼロエントリの前記対応する列アドレスに等しい行アドレスを有する前記2の行列のエントリの行を識別することを含む、請求項14に記載のコンピュータシステム。
【国際調査報告】