(57)【特許請求の範囲】
【請求項１】
第１の行列と第２の行列との積を計算するための行列乗算デバイスであって、
該第１の行列のデータ要素を格納するための第１のメモリと、該第２の行列のデータ要素を格納するための第２のメモリと、
複数のクロックサイクルに従って作動される複数の乗算器−加算器ユニットであって、該複数の乗算器−加算器ユニットのそれぞれが、積の値を生成するために、該第１の行列の該データ要素からのデータ要素と、該第２の行列の該データ要素からのデータ要素とを乗算するように構成された乗算器回路と、結果値を生成するために、現在のクロックサイクルにおいて該乗算器回路により計算された該積の値を被加数の値で加算するように構成された加算器回路とを備えている、複数の乗算器−加算器ユニットと、
複数の格納ロケーションを備えている格納ユニットと
を備えており、
該複数の乗算器−加算器ユニットは、
Ｎ個の計算ステージにおいて該第１の行列と該第２の行列との該乗算を実行することであって、Ｎは、該第１の行列の行数であり、Ｎは、１よりも大きい、ことと、
１からＮまでの各整数ｊに対して、ｊ番目の計算ステージの間に、該第１のメモリからの該第１の行列のｊ番目の行のデータ要素と、該第２のメモリからの該第２の行列のｊ番目の列のデータ要素とを読み取ることと
を行うように構成されており、
１からＮまでの各整数ｊに対して、ｊ番目の計算ステージの間に、該格納ユニットが、該複数の乗算器−加算器ユニットが該ｊ番目の計算ステージの後の計算ステージにおいて使用するために該第１の行列のｊ番目の行のデータ要素と該第２の行列のｊ番目の列のデータ要素とを格納し、
該複数の乗算器−加算器ユニットは、
該ｊ番目の計算ステージの間に、該複数の乗算器−加算器ユニットのうちの２ｊ−１個を使用して、該第１の行列の該ｊ番目の行のデータ要素に、該第２の行列の該ｊ番目の列のデータ要素と、該格納ユニットに格納された該ｊ番目の列に先行する該第２の行列の各列のデータ要素とを乗算し、該格納ユニットに格納された該ｊ番目の行に先行する該第１の行列の各行のデータ要素に、該第２の行列の該ｊ番目の列のデータ要素を乗算するようにさらに構成されており、
第１のクロックサイクルにおいて、該被加数の値は、ゼロに等しく、後続のクロックサイクルにおいて、該被加数の値は、その計算ステージに対する先のクロックサイクルにおいて該加算器回路により計算された結果値に等しい、デバイス。
【請求項２】
第１の入力ポートおよび第２の入力ポートと、前記第１のメモリと該第１の入力ポートとの間でデータを結合する第１のバスと、前記第２のメモリと該第２の入力ポートとの間でデータを結合する第２のバスとをさらに備えており、各乗算器−加算器ユニットは、該第１の入力ポートに接続された第１の入力と、該第２の入力ポートに接続された第２の入力とを備えている、請求項１に記載のデバイス。
【請求項３】
前記第１の入力は、前記第１の行列のデータ要素を受信し、前記第２の入力は、前記第２の行列のデータ要素を受信する、請求項２に記載のデバイス。
【請求項４】
前記ｊ番目の計算ステージの間、それぞれの格納ロケーションが、前記第１の行列の前記ｊ番目の行に関するデータ要素と、全ての先行する行に関するデータ要素と、前記第２の行列の前記ｊ番目の列に関するデータ要素と、全ての先行する列に関するデータ要素とを格納し、前記格納ユニットのそれぞれの格納ロケーションは、それぞれの乗算器−加算器ユニットの前記第１の入力または前記第２の入力のいずれかに接続される、請求項３に記載のデバイス。
【請求項５】
前記複数のクロックサイクルは、前記第１の行列の行数と数が等しい、請求項１に記載のデバイス。
【請求項６】
前記第１の行列の第１の行に対応する第１の計算ステージの間、単一の乗算器−加算器ユニットが、該第１の行列の第１の行のデータ要素を、前記第２の行列の第１の列のデータ要素と乗算するために使用される、請求項３に記載のデバイス。
【請求項７】
第１の行列と第２の行列とを乗算する行列乗算ハードウェアデバイスであって、
該第１の行列のデータ要素を格納するための第１のメモリと、該第２の行列のデータ要素を格納するための第２のメモリと、
複数のクロックサイクルに従って作動される複数の乗算器−加算器ユニットであって、該複数の乗算器−加算器ユニットのそれぞれは、積の値を生成するために、該第１の行列からの第１のデータ要素に、該第２の行列からの第２のデータ要素を乗算し、結果値を生成するために、現在のクロックサイクルにおいて該乗算器−加算器ユニットにより計算された該積の値を被加数の値と加算するように構成されている、複数の乗算器−加算器ユニットと、
複数のレジスタを備えている格納ユニットであって、該複数のレジスタは、乗算器−加算器ユニットへの入力としての連続する供給のために、該第１の行列のデータ要素と、該第２の行列のデータ要素とを格納する、格納ユニットと
を備えており、
該複数の乗算器−加算器ユニットは、
Ｎ個の計算ステージにおいて該第１の行列と該第２の行列との該乗算を実行することであって、Ｎは、該第１の行列の行数であり、Ｎは、１よりも大きい、ことと、
１からＮまでの各整数ｊに対して、ｊ番目の計算ステージの間に、該第１のメモリからの該第１の行列のｊ番目の行のデータ要素と、該第２のメモリからの該第２の行列のｊ番目の列のデータ要素とを読み取ることと
を行うように構成されており、
１からＮまでの各整数ｊに対して、ｊ番目の計算ステージの間に、該格納ユニットが、該複数の乗算器−加算器ユニットが該ｊ番目の計算ステージの後の計算ステージにおいて使用するために該第１の行列のｊ番目の行のデータ要素と該第２の行列のｊ番目の列のデータ要素とを格納し、
該複数の乗算器−加算器ユニットは、
該ｊ番目の計算ステージの間に、該複数の乗算器−加算器ユニットのうちの２ｊ−１個を使用して、該第１の行列の該ｊ番目の行のデータ要素に、該第２の行列の該ｊ番目の列のデータ要素と、該格納ユニットに格納された該ｊ番目の列に先行する該第２の行列の各列のデータ要素とを乗算し、該格納ユニットに格納された該ｊ番目の行に先行する該第１の行列の各行のデータ要素に、該第２の行列の該ｊ番目の列のデータ要素を乗算するようにさらに構成されており、
第１のクロックサイクルにおいて、該被加数の値は、ゼロに等しく、後続のクロックサイクルにおいて、該被加数の値は、その計算ステージに対する先のクロックサイクルにおいて該乗算器−加算器ユニットにより計算された結果値に等しい、デバイス。
【請求項８】
前記ｊ番目の計算ステージの間、前記第１の行列の前記ｊ番目の行に関するデータ要素と、全ての先行する行に関するデータ要素と、前記第２の行列の前記ｊ番目の列に関するデータ要素と、全ての先行する列に関するデータ要素とは、該ｊ番目の計算ステージの後の計算ステージにおける使用のために、前記格納ユニットのそれぞれの格納ロケーションに格納される、請求項７に記載のデバイス。
【請求項９】
前記複数のクロックサイクルは、前記第１の行列の行数と数が等しい、請求項７に記載のデバイス。
【請求項１０】
各乗算器−加算器回路は、加算器回路を備えており、該加算器回路は、前記現在のクロックサイクルにおいて前記乗算器回路によって計算された前記積の値を、その計算ステージに対する先のクロックサイクルにおいて該加算器回路によって計算された前記結果値と加算する、請求項９に記載のデバイス。
【請求項１１】
第１の行列と第２の行列とを乗算する方法であって、
第１のメモリが、該第１の行列のデータ要素を格納し、第２のメモリが、該第２の行列のデータ要素を格納することと、
複数のクロックサイクルに従って作動される複数の乗算器−加算器ユニットが、積の値を生成するために、該第１の行列の１つのデータ要素に、該第２の行列のデータ要素を乗算し、結果値を生成するために、現在のクロックサイクルにおいて該乗算器−加算器ユニットにより計算された該積の値を被加数の値と加算することと
を包含し、
該複数の乗算器−加算器ユニットは、Ｎ個の計算ステージにおいて該第１の行列と該第２の行列との該乗算を実行し、Ｎは、該第１の行列の行数であり、Ｎは、１よりも大きく、
１からＮまでの各整数ｊに対して、該複数の乗算器−加算器ユニットは、ｊ番目の計算ステージの間に、該第１のメモリからの該第１の行列のｊ番目の行のデータ要素と、該第２のメモリからの該第２の行列のｊ番目の列のデータ要素とを読み取り、
ｊ番目の計算ステージの間に、格納ユニットが、該ｊ番目の計算ステージの後の計算ステージにおいて使用するためにそれぞれの格納ロケーションにおいて該第１の行列のｊ番目の行に関するデータ要素と全ての先行する行に関するデータ要素とを格納し、
該ｊ番目の計算ステージの間に、該複数の乗算器−加算器ユニットのうちの２ｊ−１個は、該第１の行列の該ｊ番目の行のデータ要素に、該第２の行列の該ｊ番目の列のデータ要素と、該格納ユニットに格納された該ｊ番目の列に先行する該第２の行列の各列のデータ要素とを乗算し、該格納ユニットに格納された該ｊ番目の行に先行する該第１の行列の各行のデータ要素に、該第２の行列の該ｊ番目の列のデータ要素を乗算し、
第１のクロックサイクルにおいて、該被加数の値は、ゼロに等しく、後続のクロックサイクルにおいて、該被加数の値は、その計算ステージに対する先のクロックサイクルにおいて該乗算器−加算器ユニットにより計算された結果値に等しい、方法。
【請求項１２】
前記複数のクロックサイクルは、前記第１の行列の行数と数が等しい、請求項１１に記載の方法。
【請求項１３】
加算器回路が、前記現在のクロックサイクルにおいて乗算器−加算器ユニットによって計算された前記積の値を、先のクロックサイクルにおいて該乗算器−加算器ユニットによって計算された結果によって計算された前記結果値と加算することをさらに包含する、請求項１２に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、行列乗算ハードウェアモジュールまたはコアに関し、さらに詳細には、行列乗算演算のステージの間に乗算されるデータ要素に基づいた、可変の数の乗算器−加算器の使用に関する。
【背景技術】
【０００２】
行列乗算は、多くの科学的用途および工学的用途における必要な計算の演算である。例えば、ナビゲーションの用途および制御の用途は、多くの場合に、行列乗算を必要としており、時には、非常に大きな行列の乗算を必要とする。
【０００３】
行列乗算は、かなりの数の計算のリソースを必要とする。２つのＮｘＮの行列を乗算するために、Ｎ＊Ｎ＊Ｎの乗算演算と、（Ｎ−１）＊Ｎ＊Ｎの加算演算とが必要とされる。全ての行列乗算の解は、分散されたデータまたは分散された演算のいずれかに依存する。しかしながら、これまでに知られている全ての行列乗算の解は、一定の数の利用可能な乗算器と加算器とが存在するという想定に基づいている。
【０００４】
行列乗算演算の一定の用途は、最少の計算と最少のリソースとを使用し、かつ、できる限り電力消費を抑えて迅速に結果を生成するために、リソースの効率性の高い使用を必要とする。かかる用途の例は、宇宙船、および限られた供給電力を有する他の器具である。
【発明の開示】
【課題を解決するための手段】
【０００５】
簡潔に述べると、行列乗算モジュールと行列乗算方法とが提供され、該行列乗算モジュールと行列乗算方法とは、計算プロセスにおける特定の時点またはステージにおける処理のために利用可能な、または必要とされる行列のデータ要素の量に基づいて、可変の数の乗算器−加算器ユニットを使用する。より多くのデータ要素が利用可能となるか、または必要とされるにつれ、より多くの乗算器−加算器ユニットが、必要な乗算および加算の演算を行うために使用される。
【０００６】
従って、行列乗算ハードウェアモジュールまたはデバイスが提供されており、該行列乗算ハードウェアモジュールまたはデバイスは、複数の乗算器−加算器ユニットを備えており、該複数の乗算器−加算器ユニットのそれぞれは、積の値を生成するために２つのデータ要素を乗算する乗算器回路と、結果値を生成するために積の値を被加数の値で加算する加算器回路とを備えている。乗算演算が第１の行列と第２の行列とにおいて実行されるときに使用される乗算器−加算器ユニットの数は、第１の行列のどの行に対応するどの計算ステージにおいて、乗算演算が実行されるかに依存して変化する。
【０００７】
同様に、第１の行列と第２の行列とを乗算するための方法が提供されており、該方法は、複数の乗算器−加算器ユニットを提供することであって、該複数の乗算器−加算器ユニットのそれぞれは、積の値を生成するために、第１の行列の１つのデータ要素を、第２の行列のデータ要素と乗算することが可能であり、かつ、結果値を生成するために、積の値を被加数の値と加算することが可能である、ことと、ある数の複数の乗算器−加算器ユニットを使用することであって、その数は、計算が、第１の行列の第１の行から第１の行列の残りの行へと進捗するにつれ増加する、こととを包含する。
【０００８】
本発明はさらに以下の手段を提供する。
【０００９】
（項目１）  
複数の乗算器−加算器ユニットを備えている行列乗算デバイスであって、該複数の乗算器−加算器ユニットのそれぞれが、積の値を生成するために２つのデータ要素を乗算する乗算器回路と、結果値を生成するために該積の値を被加数の値で加算する加算器回路とを備えており、乗算演算が第１の行列と第２の行列とにおいて実行されるときに使用される乗算器−加算器ユニットの数は、乗算演算が実行されているのが、第１の行列のどの行に対応するどの計算ステージであるかに依存して変化する、デバイス。
【００１０】
（項目２）  
複数の格納ロケーションを備えている格納ユニットをさらに備えており、該格納ユニットは、第１の行列および第２の行列のデータ要素を格納し、該データ要素は、次の計算ステージにおける使用のための計算ステージの間に、上記乗算器−加算器ユニットに適用される、項目１に記載のデバイス。
【００１１】
（項目３）  
第１のメモリおよび第２のメモリをさらに備えており、該第１のメモリは、上記第１の行列のデータ要素を格納し、該第２のメモリは、該第２の行列のデータ要素を格納する、項目２に記載のデバイス。
【００１２】
（項目４）  
第１の入力ポート、および第２の入力ポート、上記第１のメモリと該第１の入力ポートとの間でデータを結合する第１のバス、ならびに上記第２のメモリと該第２の入力ポートとの間でデータを結合する第２のバスをさらに備えている、項目３に記載のデバイス。
【００１３】
（項目５）  
各乗算器−加算器ユニットは、上記第１の行列のデータ要素を受信する第１の入力と、上記第２の行列のデータ要素を受信する第２の入力とを備えている、項目４に記載のデバイス。
【００１４】
（項目６）  
上記第１の行列のｊ番目の行に対応するｊ番目の計算ステージの間、使用される乗算器−加算器ユニットの上記数は、該第１の行列の該ｊ番目の行に関するデータ要素に、上記第２の行列のｊ番目の列と該第２の行列の全ての先行する列とに関するデータ要素を乗算するために、そして、該ｊ番目の行に先行する、該第１の行列の全ての行に関するデータ要素に、該第２の行列の該ｊ番目の列に関するデータ要素を乗算するために充分である、項目５に記載のデバイス。
【００１５】
（項目７）  
上記ｊ番目の計算ステージの間、上記第１の行列の上記ｊ番目の行に関するデータ要素と、全ての先行する行に関するデータ要素とは、該ｊ番目の計算ステージの後の計算ステージにおける使用のために、上記格納ユニットのそれぞれの格納ロケーションに格納される、項目６に記載のデバイス。
【００１６】
（項目８）  
各計算ステージの間、使用される上記各乗算器−加算器ユニットは、上記第１の行列の行数と数が等しい複数のクロックサイクルの間、演算させられる、項目６に記載のデバイス。
【００１７】
（項目９）  
上記各乗算器−加算器ユニットにおける上記加算器回路は、現在のクロックサイクルにおいて上記乗算器回路によって計算された上記積の値を、その計算ステージに対する先のクロックサイクルにおいて該加算器回路によって計算された上記結果値と加算する、項目８に記載のデバイス。
【００１８】
（項目１０）  
上記第１の行列の第１の行に対応する第１の計算ステージの間、単一の乗算器−加算器ユニットが、該第１の行列の第１の行のデータ要素を、上記第２の行列の第１の列のデータ要素と乗算するために使用される、項目５に記載のデバイス。
【００１９】
（項目１１）  
ＮｘＭのデータ要素を備えている第１の行列に、ＭｘＮのデータ要素備えている第２の行列を乗算するときには、計算ステージの連続の間に使用される乗算器−加算器ユニットの数は、｛１，３，５，…２＊Ｎ−１｝となる、項目１に記載のデバイス。
【００２０】
（項目１２）  
第１の行列と第２の行列とを乗算する行列乗算ハードウェアのコアであって、
ａ．複数の乗算器−加算器ユニットであって、該複数の乗算器−加算器ユニットのそれぞれは、積の値を生成するために、該第１の行列からの第１のデータ要素に、該第２の行列からの第２のデータ要素を乗算し、結果値を生成するために、該積の値を被加数の値と加算し、該第１の行列と該第２の行列とを乗算するときに使用される乗算器−加算器ユニットの数は、計算が、該第１の行列の第１の行から該第１の行列の残りの行へと進捗するにつれ増加する、複数の乗算器−加算器ユニットと、
ｂ．複数のレジスタを備えている格納ユニットであって、該複数のレジスタは、乗算器−加算器ユニットへの入力としての連続する供給のために、該第１の行列の１つ以上の行に関するデータ要素と、該第２の行列の１つ以上の列に関するデータ要素とを格納する、格納ユニットと
を備えている、行列乗算ハードウェアのコア。
【００２１】
（項目１３）  
上記第１の行列のｊ番目の行に対応するｊ番目の計算ステージの間、使用される乗算器−加算器ユニットの上記数は、該第１の行列の該ｊ番目の行に関するデータ要素に、上記第２の行列のｊ番目の列と該第２の行列の全ての先行する列とに関するデータ要素を乗算するために、そして、該ｊ番目の行に先行する、該第１の行列の全ての行に関するデータ要素に、該第２の行列の該ｊ番目の列に関するデータ要素を乗算するために充分である、項目１２に記載のデバイス。
【００２２】
（項目１４）  
上記ｊ番目の計算ステージの間、上記第１の行列の上記ｊ番目の行に関するデータ要素と、全ての先行する行に関するデータ要素とは、該ｊ番目の計算ステージの後の計算ステージにおける使用のために、上記格納ユニットのそれぞれの格納ロケーションに格納される、項目１３に記載のデバイス。
【００２３】
（項目１５）  
各計算ステージの間、使用される上記各乗算器−加算器ユニットは、上記第１の行列の行数と数が等しい複数のクロックサイクルの間、演算させられる、項目１３に記載のデバイス。
【００２４】
（項目１６）  
上記各乗算器−加算器ユニットは、加算器回路を備えており、該加算器回路は、現在のクロックサイクルにおいて上記乗算器回路によって計算された上記積の値を、その計算ステージに対する先のクロックサイクルにおいて該加算器回路によって計算された上記結果値と加算する、項目１５に記載のデバイス。
【００２５】
（項目１７）  
上記第１の行列が、ＮｘＭのデータ要素を備え、上記第２の行列が、ＭｘＮのデータ要素を備えているときには、計算ステージの進行の間に使用される乗算器−加算器ユニットの数は、｛１，３，５，…２＊Ｎ−１｝となる、項目１２に記載のデバイス。
【００２６】
（項目１８）  
第１の行列と第２の行列とを乗算する方法であって、
ａ．複数の乗算器−加算器ユニットを提供することであって、該複数の乗算器−加算器ユニットのそれぞれは、積の値を生成するために、該第１の行列の１つのデータ要素に、該第２の行列のデータ要素を乗算することが可能であり、かつ、結果値を生成するために、該積の値を被加数の値と加算することが可能である、ことと、
ｂ．ある数の該複数の乗算器−加算器ユニットを使用することであって、該数は、計算が、該第１の行列の第１の行から該第１の行列の残りの行へと進捗するにつれ増加する、ことと、
を包含する、方法。
【００２７】
（項目１９）  
上記（ｂ）使用することは、第１の行列のｊ番目の行に対応するｊ番目の計算ステージの間、ある数の乗算器−加算器ユニットを使用することであって、該数は、該第１の行列の該ｊ番目の行に関するデータ要素に、上記第２の行列のｊ番目の列と該第２の行列の全ての先行する列とに関するデータ要素を乗算するために、そして、該ｊ番目の行に先行する、該第１の行列の全ての行に関するデータ要素に、該第２の行列の該ｊ番目の列に関するデータ要素を乗算するために充分である、項目１８に記載の方法。
【００２８】
（項目２０）  
上記ｊ番目の計算ステージの間、該ｊ番目の計算ステージの後の計算ステージにおける使用のために、それぞれの格納ロケーションに、上記第１の行列の上記ｊ番目の行に関するデータ要素と、全ての先行する行に関するデータ要素とを格納することをさらに包含する、項目１９に記載の方法。
【００２９】
（項目２１）  
各計算ステージの間、上記第１の行列の行数と数が等しい複数のクロックサイクルの間に、上記各乗算器−加算器ユニットに演算させることをさらに包含する、項目１９に記載の方法。
【００３０】
（項目２２）  
現在のクロックサイクルにおいて乗算器−加算器ユニットによって計算された上記積の値を、先のクロックサイクルにおいて該乗算器−加算器ユニットによって計算された結果によって計算された上記結果値と加算することをさらに包含する、項目２１に記載の方法。
【００３１】
（項目２３）  
上記第１の行列が、ＮｘＭのデータ要素を備え、上記第２の行列が、ＭｘＮのデータ要素を備えているときには、使用することは、数列｛１，３，５，…２＊Ｎ−１｝に従った計算ステージの連続の間に上記数の乗算器−加算器ユニットを使用することを包含する、項目１８に記載の方法。
【００３２】
（摘要）
行列乗算モジュールと行列乗算方法とが提供され、該行列乗算モジュールと行列乗算方法とは、計算プロセスにおける特定の時点またはステージにおける処理のために利用可能な、または必要とされる行列のデータ要素の量に基づいて、可変の数の乗算器−加算器ユニットを使用する。より多くのデータ要素が利用可能となるか、または必要とされるにつれ、より多くの乗算器−加算器ユニットが、必要な乗算および加算の演算を行うために使用される。ＮｘＭの行列にＭｘＮの行列を乗算するために、使用されるＭＡＣユニットの総（最大）数は、「２＊Ｎ−１」となる。使用されるＭＡＣユニットの数は、一（１）つから始まり、各計算ステージにおいて、すなわち、第１の行列の各新たな行に関するデータ要素の読み取りの開始時において、２つのユニットずつ増加する。ＭＡＣユニットの数の数列は、計算ステージに対して｛１，３，５，…２＊Ｎ−１｝となり、計算ステージのそれぞれは、第１の行列とも呼ばれる左側の行列の各新たな行に関するデータ要素の読み取りに対応する。２つの８ｘ８の行列の乗算に関して、性能は、クロックサイクル毎に１６個の浮動小数点演算となる。１００ＭＨｚで走るＦＰＧＡに関して、性能は、毎秒１．６ギガの浮動小数点演算となる。ＦＰＧＡが許すときには、性能は、クロック周波数の増加およびより大規模な行列の使用と共に増加する。非常に大規模の行列は、ＦＲＧＡのリソースに適合するようにより小さいブロックに分割される。部分行列の乗算からの結果が、大規模な行列の最終的な結果を形成するように組み合わせられる。
【発明を実施するための最良の形態】
【００３３】
本発明に従って、（「コア」とも呼ばれる）行列乗算ハードウェアモジュールが提供され、該行列乗算ハードウェアモジュールは、処理のために利用可能なデータ要素の数に基づいて、可変の数の乗算器−加算器（ＭＡＣ）ユニットを使用する。２つの行列の乗算の間に使用されるＭＡＣユニットの数は、行列の計算のステージに依存して時と共に変化する。一実施形態において、ＭＡＣユニットの数は、２つの行列の計算の間、時と共に増加する。
【００３４】
使用されるＭＡＣユニットの総（最大）数は、乗算される行列のサイズに基づいている。行列の特定のサイズに対して、使用されるＭＡＣユニットの数は、２つの行列の計算セッションの間のデータの利用可能性に従って増加する。例えば、各行列から第１の成分を読み取るときには、１つのＭＡＣユニットだけが、乗算／加算の演算を行うために必要とされる。計算が行列を介して進捗するにつれ、読み取られるデータが多くなれば多くなるほど、より多くのＭＡＣユニットが、乗算／加算の演算を行うために使用される。従って、一実施形態において、行列乗算モジュールは、動的に増加する数のＭＡＣユニットを有する。
【００３５】
まず、図１を参照すると、行列乗算ハードウェアモジュールが、参照番号１０で示されている。行列乗算ハードウェアモジュール１０は、複数のＭＡＣユニット２０（１）〜２０（Ｎ）と、以下ではレジスタのアレイ（ＲＡ）３０と呼ばれるデュアルポートのレジスタのアレイ３０とを備えている。第１のメモリバンク４０と、第２のメモリバンク５０と、第１のバス６０と、第２のバス７０とが存在し、該第１のバス６０と該第２のバス７０とは、モジュール１０にデータを供給し、かつ、モジュール１０からデータを供給される。各メモリバンク４０および５０は、乗算される２つの入力行列のうちの１つに割り当てられている。別々のデータバス６０および７０は、モジュール１０によって同時に読み取られ得る。このアーキテクチャに関して、各入力行列から１つのデータ要素を同時に読み取ることが可能である。出力結果は、いずれかのメモリバンクにセーブされ得る。メモリバンク４０は、バス６０に接続されており、メモリバンク５０は、バス７０に接続されている。モジュール１０は、第１の入力ポート（Ｉｎ０）８０と第２の入力ポート（Ｉｎ１）９０とをそれぞれ備え、かつ、出力ポート（Ｏｕｔ）９５を備えている。バス６０は、第１の入力ポート８０に接続しており、バス７０は、第２の入力ポート９０に接続している。行列乗算モジュールの出力ポート９５は、バス６０またはバス７０のいずれかに接続され得る。
【００３６】
図１において参照番号１００で示されたボックスは、ボックス１００の中のコンポーネントが、任意のプログラム可能なまたは固定の論理技術、例えば、フィールドプログラム可能なゲートのアレイ（ＦＰＧＡ）、アプリケーション固有の集積回路（ＡＳＩＣ）、再構成可能な固定論理回路、プログラム可能な計算構造などに実装され得るということを示すために提供される。乗算される第１の行列と第２の行列とに関するデータ要素は、コンフィギュレーションレジスタ１１０によって、要求デバイスまたは要求ソフトウェアから受信される。コンフィギュレーションレジスタ１１０は、第１の行列および第２の行列の大きさに従って行列乗算ハードウェアモジュール１０を構成する。
【００３７】
図２を参照すると、ＭＡＣユニット２０（ｉ）のポートが記述されている。ＭＡＣユニット２０（ｉ）は、乗算器回路２２と加算器回路２４とを備えている。乗算器回路の出力２５は、加算器回路の１つの入力に接続されている。合計（ＳＵＭＭ）ポート２８が、加算回路２４の別の入力に接続される。以下で記述されるように、ＳＵＭＭポート２８は、加算器回路２４によって生成され、かつ、出力２５に供給された、先の計算サイクルにおいて計算された結果値から被加数の値を受信する。２つの入力ポート（Ｐ０）２６と入力ポート（Ｐ１）２７とがそれぞれ存在しており、該２つの入力ポート（Ｐ０）２６と入力ポート（Ｐ１）２７とは、乗算される２つのデータ要素をＭＡＣユニット２０（ｉ）に供給する。入力ポート２６は、第１の入力８０に接続されており、該第１の入力８０は、次に、第１のバス６０に接続されており、該第１のバス６０から、第１の行列のデータ要素が獲得される。同様に、入力ポート２７は、第２の入力９０に接続されており、該第２の入力９０は、次に、第２のバス７０に接続し、該第２のバス７０から、第２の行列のデータ要素が獲得される。このようにして、２つの行列が乗算されたときには、各ＭＡＣユニットは、第１の行列のデータ要素と第２の行列のデータ要素とを受信する。ＳＵＭＭポート２８は、第３の入力ポートであり、演算においては、ＳＵＭＭポート２８は、別のＭＡＣユニットからデータを受信する。ＭＡＣユニット２０（ｉ）の出力ポート２９は、結果（ＲＥＳ）データを含み、該結果（ＲＥＳ）データは、ＳＵＭＭポートにおけるデータと乗算器２２における出力２５におけるデータとの合計である。
【００３８】
ここで、図３に参照が行われ、図３においては、レジスタのアレイ（ＲＡ）３０が、さらに詳細に示されている。ＲＡ３０は、ずらりと並んだ（複数の）レジスタを備えているレジスタのアレイのブロックのタイプであり、該レジスタは、１つのポートを経由して書き込まれ得、かつ、別のポートを経由して読み取られ得る。ＲＡ３０は、「レジスタ＃０」〜「レジスタ＃Ｎ−１」と示される「Ｎ」個のレジスタ３２（０）〜３２（Ｎ−１）を備えている。各レジスタのセルは、乗算される行列のデータ要素を表すために必要とされるビット数と等しい数のビットを備えている。
【００３９】
読み取られるか、または書き込まれる、アレイ内の特定のレジスタを示すために、レジスタのポインタ（Ｒｅｇｉｓｔｅｒ＿Ｐｔｒ）３３が使用される。入力データバス（Ｄａｔａ＿Ｉｎ）３４は、レジスタのアレイ内のレジスタのうちの任意のものに書き込むために使用されるバスである。出力データバス（Ｄａｔａ＿Ｏｕｔ）３５は、レジスタのアレイ内のレジスタのうちの任意のものから読み取るために使用されるバスである。書き込み入力信号（Ｗｒｉｔｅ）３６は、レジスタのアレイ内のレジスタのうちの任意のものに入力データの書き込み動作の信号を送信するために使用される。読み取り入力信号（Ｒｅａｄ）３７は、レジスタのアレイ内のレジスタのうちの任意のものからの出力データの読み取り動作の信号を送信するために使用される。
【００４０】
このように、ＲＡ３０は、複数の格納ロケーションを備えている格納ユニットであり、格納ロケーションのそれぞれが、次の計算ステージ（実際には、いくつかの次の計算ステージ）における使用のために、１つの計算ステージの間に、ＭＡＣユニットに供給される第１の行列の行からのデータ要素と第２の行列の列からのデータ要素とを格納する。デュアルポートのブロックのＲＡＭまたはデュアルポートのメモリチップのような、デュアルポートの格納ロケーションの任意のアレイが、ＲＡ３０の機能に役立つように使用される。
【００４１】
上に示されたように、使用されるＭＡＣユニットの数は、乗算される行列のサイズに依存する。２つの単純な例が、行列乗算ハードウェアモジュール１０の演算を例示するために提供される。乗算される２つの行列からデータを読み取る間に、全乗算演算が行われる。全ての被演算子データが読み取られるときまでには、積（２つの行列の乗算の結果）の準備ができる。これは、（図１に示されているように）２つの独立したメモリバンクが存在し、各入力行列が対応するメモリバンクに格納され、それにより２つの成分、すなわち、対応するメモリバンクに格納された各行列からの成分が、同時に読み取られ得ることを想定する。さらに、２つの行列を乗算することと関連付けられる演算ステージの数は、第１の行列における行の数に依存しており、かつ、実際には、第１の行列における行の数と等しい。
【００４２】
例えば、第１の行列「ｍ１」に関するデータがメモリバンク４０に格納され、第２の行列「ｍ２」に関するデータがメモリバンク５０に格納されている。行列ｍ１ｘ行列ｍ２の乗算の結果が、メモリバンク４０内の行列「ｍ３」に格納される。行列ｍ１からのデータは、入力ポート８０を介して、一度に１つの成分を読み取られる。行列ｍ２からのデータは、入力ポート９０を介して、一度に１つの成分を読み取られる。行列乗算ハードウェアモジュール１０は、２つのメモリバンク４０および５０からデータを読み取りながら、行列乗算プロセスを行う。行列乗算モジュールが、２つの入力行列ｍ１およびｍ２のデータ要素を読み取ることを終えるときまでには、出力結果は、出力ポート９５において、行列ｍ３としてメモリバンク４０に格納される準備が整う。
【００４３】
バスの幅に関しては制限がない。唯一の制限は、モジュール１０を実装するために選択される論理技術おいて利用可能なリソースである。
【００４４】
ここで、行列乗算ハードウェアモジュール１０の演算が、図４〜図７を参照してさらに詳細に記述される。図４に示されているように、この例においては、行列Ａと行列Ｂとの計算における各行列は、２ｘ２の行列である。計算ＡｘＢからの結果の行列は、行列Ｃとして格納される。
【００４５】
結果の行列の成分は、
Ｃ１＝Ａ１＊Ｂ１＋Ａ２＊Ｂ２
Ｃ２＝Ａ１＊Ｂ３＋Ａ２＊Ｂ４
Ｃ３＝Ａ３＊Ｂ１＋Ａ４＊Ｂ２
Ｃ４＝Ａ３＊Ｂ３＋Ａ４＊Ｂ４
となるべきである。
【００４６】
行列乗算ハードウェアモジュール１０において、２つの入力行列がメモリに格納され、それにより乗算される２つの入力行列のうちの第１の行列（すなわち、左側の行列、この例においては行列Ａ）が、メモリバンク４０に「列方向」に格納され、第２の行列（この例においては行列Ｂ）が、メモリバンク５０に「行方向」に格納される。図５に示されているように、これは、第１の行列（行列Ａ）のデータ要素が、次の順次：
Ａ１→Ａ２→Ａ３→Ａ４
で逐次的にメモリから読み取られることを意味する。
【００４７】
第２の行列（行列Ｂ）のデータ要素は、次の順序：
Ｂ１→Ｂ２→Ｂ３→Ｂ４
で逐次的にメモリから読み取られる。
【００４８】
さらに詳細には、図５に示されているように、２ｘ２の行列乗算演算に関する入力データの流れは、次の通りである。第１のクロックサイクルにおいて、データ要素Ａ１およびＢ１が、入力ポート８０および９０のそれぞれに存在する。次のクロックサイクルにおいて、データ要素Ａ２およびＢ２が、それぞれ入力８０および９０のそれぞれに存在する。次のクロックサイクルにおいて、データ要素Ａ３およびＢ３が、それぞれ入力８０および９０のそれぞれに存在する。最後のクロックサイクルにおいて、データ要素Ａ４およびＢ４が、入力８０および９０のそれぞれに存在する。
【００４９】
２ｘ２の行列乗算の場合において、計算は、行列Ａに対して２つの計算ステージに分割される。行列Ａの第１の行が読み取られるときの第１の計算ステージの間、行列乗算モジュール１０は、単一のＭＡＣユニットだけを使用する。行列Ａの第２の行が読み取られるときの第２の計算ステージの間、行列乗算モジュールは、３つのＭＡＣユニットを使用する。
【００５０】
ここで、クロックサイクルごとのベースで行列乗算モジュールの演算の詳細な説明に関して、図６、図７Ａ、図７Ｂ、図８、図９Ａ、図９Ｂ、図１０Ａ、図１０Ｂ、図１１Ａおよび図１１Ｂに参照が行われる。図６、図７Ａおよび図７Ｂは、単一のＭＡＣユニットが使用されているときの第１のクロックサイクルおよび第２のクロックサイクルの間の演算を例示する。この例において、単一のＭＡＣユニットを使用する、第１のクロックサイクルおよび第２のクロックサイクルが、第１の演算ステージである。図８、図９Ａ、図９Ｂ、図１０Ａ、図１０Ｂ、図１１Ａおよび図１１Ｂは、３つのＭＡＣユニットが使用されるときの（第２の計算ステージを構成する）第３のクロックサイクルおよび第４のクロックサイクルの間の演算を例示する。このようにして、最大で３つのＭＡＣユニットが、２つの２ｘ２の行列を乗算するときのいかなるときにおいても使用され、全行列乗算演算は、４クロックサイクルの時間間隔の間、継続し、２つの計算ステージが存在しており、２つの計算ステージのうちのそれぞれが、２つのクロックサイクルを含む。
【００５１】
最初の２つのクロックサイクルの間、データは、第１のＭＡＣユニット２０（１）の入力に適用される。特に、図６を続けて参照すると共に、図７Ａに示されているように、第１のクロックサイクルの間、データ要素Ａ１およびＢ１は、メモリ（図１に示されているように、それぞれメモリバンク４０および５０）から読み取られ、第１のＭＡＣユニット２０（１）の入力ポート２６および２７のそれぞれに適用される。同時に、データ要素Ａ１およびＢ１は、第２の計算ステージの間の使用のために、入力データ要素Ａ１およびＢ１のそれぞれの遅延バージョンＡ１ｑおよびＢ１ｑを生成するために、ＲＡ３０のそれぞれの格納ロケーションに適用される。
【００５２】
図６を続けて参照すると共に、図７Ｂに示されているように、第２のクロックサイクルの間、データ要素Ａ２およびＢ２が、メモリから読み取られ、ＭＡＣユニット２０（１）の入力ポート２６および２７のそれぞれに適用され、同時に、第２の計算ステージの間の使用のために、それぞれのデータ要素の遅延バージョンＡ２ｑおよびＢ２ｑを生成するために、ＲＡ３０のそれぞれの格納ロケーションに適用される。第２のクロックサイクルの間、ＳＵＭＭポート２８における入力は、第１のクロックサイクルの終了時のＡ１＊Ｂ１の乗算結果からの結果として受け取られる。このようにして、第１のクロックサイクルの終了時におけるポート２９における出力は、第２のクロックサイクルの間に行われる計算の準備をするために、ＳＵＭＭポート２８にループバックさせる。データ要素Ａ２およびＢ２は、入力ポート２６および２７のそれぞれに供給され、それによりＭＡＣユニット２０（１）における乗算器回路が、Ａ２＊Ｂ２を計算し、ＭＡＣユニット２０（１）における加算器回路が、ＳＵＭＭ入力ポート２８において、Ａ２＊Ｂ２の結果をＡ１＊Ｂ１に加算する。Ａ１＊Ｂ１＋Ａ２＊Ｂ２の最終的な結果が、出力ポート２９に提供される。
【００５３】
このようにして、第２のクロック信号の後の、ＭＡＣユニット２０（１）の出力は、結果の行列Ｃのデータ要素Ｃ１である。Ａ１＝Ａ１ｑ、Ａ２＝Ａ２ｑ、Ｂ１＝Ｂ１ｑ、およびＢ２＝Ｂ２ｑであるということが理解されるべきである。
【００５４】
図８、図９Ａ、図９Ｂ、図１０Ａ、図１０Ｂ、図１１Ａおよび図１１Ｂを参照すると、第３のクロックサイクルと第４のクロックサイクルとを備えている第２の計算ステージの間の演算が記述される。さらに２つのＭＡＣユニット２０（２）および２０（３）が、第３のクロックサイクルの間と第４のクロックサイクルの間とに使用される。図９Ａ、図１０Ａおよび図１１Ａは、第３のクロックサイクルの間の、３つのＭＡＣユニット２０（１）、２０（２）および２０（３）の演算を例示し、図９Ｂ、図１０Ｂおよび図１１Ｂは、第４のクロックサイクルの間の、３つのＭＡＣユニット２０（１）、２０（２）および２０（３）の演算を例示する。データ要素Ａ３およびＢ３は、メモリから読み取られ、図８および図９Ａに示されているように、第１のＭＡＣユニット２０（１）の入力２６および２７のそれぞれに適用される。図８および図１０Ａに示されるように、データ要素Ａ１ｑが、ＲＡ３０から読み取られ、第２のＭＡＣユニット２０（２）の入力２６に適用され、データ要素Ｂ３が、メモリから読み取られ、ＭＡＣユニット２０（２）の入力２７に適用される。最後に、図８および図１１Ａに示されているように、第３のクロックサイクルの間、データ要素Ａ３が、メモリから読み取られ、第３のＭＡＣユニット２０（３）の入力２６に適用され、データ要素Ｂ１ｑが、ＲＡ３０から読み取られ、第３のＭＡＣユニット２０（３）の入力２７に適用される。このようにして、第３のクロックサイクルの間、ＭＡＣユニット２０（１）は、Ａ３＊Ｂ３を計算し、ＭＡＣユニット２０（２）は、Ａ１ｑ＊Ｂ３を計算し、ＭＡＣユニット２０（３）は、Ａ３＊Ｂ１ｑを計算する。
【００５５】
図８および図９Ｂを参照すると、第４のクロックサイクルの間、データ要素Ａ４およびＢ４が、メモリから読み取られ、ＭＡＣユニット２０（１）の入力２６および２７のそれぞれに適用される。さらに、第３のクロックサイクルの間にＭＡＣユニット２０（１）によって計算されたＡ３＊Ｂ３の結果は、第４のクロックサイクルの開始時に、ＭＡＣユニット２０（１）のＳＵＭＭ入力ポートにループバックされる。このようにして、第４のクロックサイクルの間、ＭＡＣユニット２０（１）は、Ａ４＊Ｂ４を計算し、Ａ４＊Ｂ４をＡ３＊Ｂ３に加算する。第４のクロックサイクルの終了時におけるＭＡＣユニット２０（１）の結果の出力は、結果の行列Ｃのデータ要素Ｃ４に対応する。
【００５６】
図８および図１０Ｂを参照すると、第４のクロックサイクルの間、データ要素Ａ２ｑが、ＤＰＲ３０から読み取られ、ＭＡＣユニット２０（２）の入力２６に適用され、データ要素Ｂ４は、ＭＡＣユニット２０（２）の入力２７に適用される。第３のクロックサイクルの間にＭＡＣユニット２０（２）によって計算されたＡ１＊Ｂ３の結果は、第４のクロックサイクルの開始時に、ＭＡＣユニット２０（２）のＳＵＭＭ入力ポートにループバックされる。このようにして、第４のクロックサイクルの間、ＭＡＣユニット２０（２）は、Ａ２＊Ｂ４を計算し、Ａ２＊Ｂ４をＡ１＊Ｂ３に加算し、そうする際に、その結果の出力時の出力は、結果の行列Ｃのデータ要素Ｃ２を出力する。
【００５７】
最後に、図８および図１１Ｂを参照すると、第４のクロックサイクルの間、データ要素Ａ３が、ＭＡＣユニット２０（３）の入力２６に適用され、データ要素Ｂ２ｑは、ＲＡ３０から読み取られ、ＭＡＣユニット２０（３）の入力２７に適用される。第３のクロックサイクルの間にＭＡＣユニット２０（３）によって計算されたＡ３＊Ｂ１の結果は、第４のクロックサイクルの開始時に、ＭＡＣユニット２０（３）のＳＵＭＭ入力ポートにループバックされる。続けて、第４のクロックサイクルの間、ＭＡＣユニット２０（３）は、Ａ４＊Ｂ２を計算し、その結果をＡ３＊Ｂ１と加算することにより、その出力時に、結果の行列Ｃに関するデータ要素Ｃ３を生成する。
【００５８】
図６、図７Ａおよび図７Ｂから注目すべきことは、行列Ａの２つの行に関するデータ要素を読み取るときには、同じＭＡＣユニット、すなわち、ＭＡＣユニット２０（１）が使用されることである。従って、ＭＡＣユニット２０（１）が、４クロックサイクルの間、使用され、ＭＡＣユニット２０（２）は、２クロックサイクルの間、使用され、そしてＭＡＣユニット２０（３）は、２クロックサイクルの間、使用される。各ＭＡＣユニットに対するＳＵＭＭ入力ポートは、第１の行列、すなわち、行列Ａから読み取られる（データ要素の新たな行に対応する）各計算ステージの開始時に０にリセットされる。
【００５９】
同じ概念が、２つの４ｘ４の行列を乗算する例に適用される。図１２は、２つの４ｘ４の行列を例示する。図１３Ａ、図１３Ｂ、図１３Ｃおよび図１３Ｄは、図１２に示された行列ＡおよびＢを乗算するための乗算演算の詳細を示す。演算は、１６個のクロックサイクルを必要し、７個だけのＭＡＣユニットを使用する。図１３Ａは、第１の計算ステージであり、図１３Ｂは、第２の計算ステージであり、図１３Ｃは、第３の計算ステージであり、そして図１３Ｄは、第４の計算ステージである。図１３Ａ〜図１３Ｄに示された計算ステージのそれぞれは、各ＭＡＣユニットに関する４つのデータ要素のスタックによって示されているように、４クロックサイクル継続する。
【００６０】
動作の間、図１３Ａに示されているように、行列Ａの第１の行を読み取るときに、１つのＭＡＣユニットが使用される。図１３Ｂに示されているように、行列Ａの第２の行を読み取るときには、２つの追加のＭＡＣユニットが使用され、合計で３つのＭＡＣユニットとなる。行列Ａの第３の行から読み取るときには、さらに２つのＭＡＣユニットが使用され、合計で５つのＭＡＣユニットとなることを、図３は示す。最後に、図１３Ｄに示されているように、行列Ａの第４の行から読み取るときには、合計で７つのＭＡＣユニットが使用される。「ループバック」演算を行うことが図１３Ａ〜図１３Ｄに示されていなくても、図１２および図１３Ａ〜図１３Ｄの４ｘ４の行列乗算の例に示された各ＭＡＣユニットは、各ＭＡＣユニットの出力からＳＵＭＭ入力への「ループバック」演算を行うことが、上に記述した２ｘ２の行列乗算の例から理解されるべきである。例えば、第１の計算ステージの間、第２のクロックサイクルにおいて、ＭＡＣユニット２０（１）は、第１のクロックサイクルの間に計算され、かつ、（図１３Ａには示されていないが）ＭＡＣユニット２０（１）のＳＵＭＭ入力にループバックされたＡ１＊Ｂ１を、第２のクロックサイクルの間に計算されたＡ２＊Ｂ２に加算する。さらに、Ａ１＊Ｂ１＋Ａ２＊Ｂ２の加算は、ＭＡＣユニット２０（１）のＳＵＭＭ入力にループバックされ、それにより第３のクロックサイクルの間、ＭＡＣユニット２０（１）は、Ａ３＊Ｂ３を計算し、Ａ３＊Ｂ３の積の値をＡ１＊Ｂ１＋Ａ２＊Ｂ２に加算する。最後に、図１３Ａに示された第１の計算ステージの第４のクロックサイクルの間、ＭＡＣユニット２０（１）は、Ａ４＊Ｂ４を計算し、Ａ４＊Ｂ４の積の値を、第３のクロックサイクルの終了時にＭＡＣユニット２０（１）のＳＵＭＭ入力にループバックされたＡ１＊Ｂ１＋Ａ２＊Ｂ２＋Ａ３＊Ｂ３の値に加算する。このようにして、図１２に示された行列の乗算に関する結果の行列Ｃの第１の成分Ｃ１が、ＭＡＣユニット２０（１）によって、４クロックサイクルで計算される。同様なループバック加算機能が、図１３Ｂ、図１３Ｃおよび図１３Ｄのそれぞれによって表された第２、第３および第４の計算ステージにおいて、ＭＡＣユニットのそれぞれによって行われる。さらに、１つの計算ステージの間に、メモリから読み取られ、かつ、ＭＡＣユニットに供給された、ＡおよびＢの行列に関するデータ要素は、２ｘ２の行列計算の例において上に記述されたものとほぼ同じ方法で、次の計算ステージの間での使用のためにＲＡに書き込まれる。
【００６１】
第１の行列の第１の行に対応する第１の計算の間、単一のＭＡＣユニットが、第１の行列の第１の行のデータ要素を第２の行列の第１の列のデータ要素と乗算するために使用される。行列の第１の行は、行列の一番上の行である必要はなく、行列の第１の列は、行列の一番左の列である必要はないことが理解されるべきである。概して、ＭＡＣユニットの総（最大）数は、左側の行列の行の総数に依存する。ＮｘＭの行列にＭｘＮの行列を乗算するために、使用されるＭＡＣユニットの総（最大）数は、「２＊Ｎ−１」となる。使用されるＭＡＣユニットの数は、第１の計算ステージ（左の行列の第１の行）の間、一（１）つから始まり、各次の計算ステージ（左の行列の各次の行）において２つのユニットずつ増加する。ＭＡＣユニットの数の数列は、計算ステージに対して｛１，３，５，…２＊Ｎ−１｝となり、ここでもやはり、各計算ステージは、第１の行列とも呼ばれる左側の行列の各新たな行に関するデータ要素の読み取りに対応する。第１の行列のｊ番目の行に対応するｊ番目計算ステージの間、使用される乗算器−加算器ユニットの数が、（ｉ）第１の行列のｊ番目の行に関するデータ要素を、ｊ番目の列に関するデータ要素で乗算するために、そして（ｉｉ）ｊ番目の行に先行する、第１の行列の全ての行に関するデータ要素を、第２の行列のｊ番目の列に関するデータ要素で乗算するために必要とされる量に制限されるように、行列乗算モジュール１０は演算する。さらに、ｊ番目の計算ステージの間、第１の行列のｊ番目の行に関するデータ要素と、全ての先行する行に関するデータ要素とは、ｊ番目の計算ステージの後の計算ステージにおける使用のために、格納ユニットのそれぞれの格納ロケーションに格納される。またさらに、各計算ステージの間、使用される各ＭＡＣユニットは、第１の行列の行数と数が等しい複数のクロックサイクルの間、演算させられる。各ＭＡＣユニットにおける加算器回路は、現在のクロックサイクルにおいて乗算器回路によって計算された積の値を、その計算ステージに対する先のクロックサイクルにおいて加算器回路によって計算された結果値と加算する。加算が、計算ステージの開始時（第１のクロックサイクル）である場合には、各ＭＡＣユニットに対するＳＵＭＭ入力が０にリセットされる。
【００６２】
行列乗算モジュール１０は、拡大縮小が可能であり、大規模な行列での使用に適合され得る。例えば、モジュール１０が比較的大規模なＦＰＧＡに実装される場合には、モジュール１０は、１６ｘ１６または３２ｘ３２の行列を乗算するために使用され得る。行列乗算モジュール１０は、（３００万個のゲートのＦＰＧＡチップのフォームファクタの）Ｘｉｌｉｎｘ  Ｖｅｒｔｉｘ２  ＦＰＧＡを用いて構築された。２つの８ｘ８の行列の乗算に関して、クロックサイクル毎に１６回の浮動小数点演算のピーク性能が達成された。１００ＭＨｚでＦＰＧＡを走られると、毎秒１．６ギガの浮動小数点演算（ＧＦＬＯＰＳ／ｓｅｃ）のピーク性能が獲得され得る。このようにして、１６ｘ１６または３２ｘ３２の行列を乗算することが、１００ＭＨｚの速度において、それぞれ３２および６４ＧＦＬＯＰＳ／ｓｅｃで実行される。概して、性能は、クロック毎に２＊Ｎ回の浮動小数点演算に等しく、ここで、Ｎは、第１（左側）の行列の列の数には関係なく、第１（左側）の行列の行の数となる。
【００６３】
本明細書において記述された行列乗算の例は、正方行列を含む。しかしながら、同じ概念が、非正方行列に適用され得る。性能は、左側の行列の数に基づいている。従って、同じ概念が、１６または３２に等しい行数を有する左側の行列に適用されることにより、１００ＭＨｚのクロックでそれぞれ走る、３．２または６．４ＧＦＬＯＰＳ／ｓｅｃの性能を与え得る。性能は、より速いクロック周波数を使用すると増加する。
【００６４】
上に記述された行列乗算モジュールは、非正方行列を乗算するために使用され得る。４ｘＮの行列とＮｘ４の行列とを乗算することは、２つの４ｘ４の行列を乗算する例と同様である。唯一の違いは、Ｎクロックサイクルが、第１（左側）の行列の行を読み取るために必要とされる。しかしながら、性能は、上に記述された行列乗算モジュールと同じであり、第１の行列が、４行を有する場合には、クロックサイクル毎に８回の浮動小数点演算であり、第１の行列が、８行を有する場合には、クロックサイクル毎に１６回の浮動小数点演算である。
【００６５】
非常に大規模な行列の場合において、ＦＰＧＡチップのリソースは、１つのブロックにおける乗算プロセスを処理するために充分ではないことがあり得る。この場合、行列は、より小さなブロックに分割され得、それにより各ブロックがＦＰＧＡのリソースに適合し得る。行列乗算演算は、ブロック毎に実行され、次に、個々のブロックの乗算結果が、結果の行列を形成するために組み合わせられる。
【００６６】
しかしながら、行列乗算モジュール１０は、３２ビットの単精度浮動小数点データおよび６４ビットの倍精度浮動小数点データのような様々なデータのタイプを使用して、２つの行列を乗算するために利用され得る。さらに、モジュール１０は、使用されるメモリバンクの幅に基づいて、３２ビットまたは６４ビットの整数または固定少数点のデータを使用して演算し得る。さらにまた、任意の非標準的なデータのタイプが使用され得る。
【００６７】
ＲＡ３０のレジスタのアレイは、上で述べられたように、次のクロックサイクルの間の使用ためにデータ要素をバッファリングするときには、データ要素のうちの少なくとも２つの行（各入力行列から１行）を格納するために充分な深さであることを必要とする。そうでなければ、レジスタのアレイのサイズが、設計者に委ねられる。
【００６８】
本明細書に記述されたシステムおよび方法は、本発明の精神または重要な特性を逸脱することなく、他の特定の形式で体現され得る。従って、上記の実施形態は、あらゆる局面において例示と考えられ、限定することを意味していない。
【図面の簡単な説明】
【００６９】
【図１】図１は、本発明の実施形態に従った行列乗算ハードウェアモジュールのブロック図である。
【図２】図２は、本発明の実施形態に従った行列乗算ハードウェアモジュールにおいて使用される乗算器−加算器ユニットのブロック図である。
【図３】図３は、本発明の実施形態に従った行列乗算ハードウェアモジュールの一部分を形成するデュアルポートのレジスタのアレイのブロック図である。
【図４】図４は、本発明に従った行列乗算モジュールによって乗算される２つの２ｘ２の行列の成分を例示している図である。
【図５】図５は、本発明の実施形態に従った、図４に示された２つの行列の乗算に関する入力データの流れを例示する。
【図６】図６は、図４および図５に示された行列乗算の例における第１の乗算器−加算器ユニットの演算を例示する。
【図７Ａ】図７Ａは、図６に描かれた第１のクロックサイクルの間の、第１の乗算器−加算器によって行われた計算を例示する図である。
【図７Ｂ】図７Ｂは、図６に描かれた第２のクロックサイクルの間の、第１の乗算器−加算器によって行われた計算を例示する図である。
【図８】図８は、図４および図５に示された行列乗算の例における３つの乗算器−加算器ユニットの演算を例示する。
【図９Ａ】図９Ａおよび図９Ｂは、図４および図５に示された行列乗算の例における連続的なクロックサイクルの間の、第１の乗算器−加算器ユニットの演算を例示する。
【図９Ｂ】図９Ａおよび図９Ｂは、図４および図５に示された行列乗算の例を用いた、連続的なクロックサイクルの間の、第１の乗算器−加算器ユニットの演算を例示する。
【図１０Ａ】図１０Ａおよび図１０Ｂは、図４および図５に示された行列乗算の例における連続的なクロックサイクルの間の、第２の乗算器−加算器ユニットの演算を例示する。
【図１０Ｂ】図１０Ａおよび図１０Ｂは、図４および図５に示された行列乗算の例における連続的なクロックサイクルの間の、第２の乗算器−加算器ユニットの演算を例示する。
【図１１Ａ】図１１Ａおよび図１１Ｂは、図４および図５に示された行列乗算の例における連続的なクロックサイクルの間の、第３の乗算器−加算器ユニットの演算を例示する。
【図１１Ｂ】図１１Ａおよび図１１Ｂは、図４および図５に示された行列乗算の例における連続的なクロックサイクルの間の、第３の乗算器−加算器ユニットの演算を例示する。
【図１２】図１２は、本発明に従った、行列乗算モジュールによって乗算された２つの４ｘ４の行列の例を例示する。
【図１３Ａ】図１３Ａは、図１２に示された行列乗算の例の第１の計算ステージ間の、第１の乗算器−加算器ユニットの演算を例示する。
【図１３Ｂ】図１３Ｂは、図１２に示された行列乗算の例の第２の計算ステージ間の、３つの乗算器−加算器ユニットの演算を例示する。
【図１３Ｃ】図１３Ｃは、図１２に示された行列乗算の例の第３の計算ステージ間の、５つの乗算器−加算器ユニットの演算を例示する。
【図１３Ｄ】図１３Ｄは、図１２に示された行列乗算の例の第４の計算ステージ間の、７つの乗算器−加算器ユニットの演算を例示する。
【符号の説明】
【００７０】
１０  行列乗算ハードウェアモジュール
２０（１）〜２０（Ｎ）  ＭＡＣユニット
３０  レジスタのアレイ（ＲＡ）
４０  第１のメモリバンク
５０  第２のメモリバンク
６０  第１のバス
７０  第２のバス
８０  第１の入力ポート
９０  第２の入力ポート
１００  ボックス
１１０  コンフィギュレーションレジスタ
【図１】
0005408913.tif 000002
【図２】
0005408913.tif 000003
【図３】
0005408913.tif 000004
【図４】
0005408913.tif 000005
【図５】
0005408913.tif 000006
【図６】
0005408913.tif 000007
【図７Ａ】
0005408913.tif 000008
【図７Ｂ】
0005408913.tif 000009
【図８】
0005408913.tif 000010
【図９Ａ】
0005408913.tif 000011
【図９Ｂ】
0005408913.tif 000012
【図１０Ａ】
0005408913.tif 000013
【図１０Ｂ】
0005408913.tif 000014
【図１１Ａ】
0005408913.tif 000015
【図１１Ｂ】
0005408913.tif 000016
【図１２】
0005408913.tif 000017
【図１３Ａ】
0005408913.tif 000018
【図１３Ｂ】
0005408913.tif 000019
【図１３Ｃ】
0005408913.tif 000020
【図１３Ｄ】
0005408913.tif 000021