いくつかの具体例が下記に記載される。本技法はこれらの例に限定されないことが諒解されよう。
高精度アンカー(HPA)形式が下記に説明される。HPA形式に関するさらなる情報は、米国特許出願第62/074,149号、第14/582,974号、第14/582,875号、第14/582,812号、第14/582,836号、第14/582,978号、第14/606,510号、および第14/582,968号において見つけることができ、それらの内容は、参照によりその全体が本明細書に組み込まれる。
浮動小数点数
浮動小数(FP)は、少数のビットを使用して実数を近似する有用な方法である。IEEE754−2008のFP規格はFP数用の複数の異なるフォーマットを処理し、それらのうちのいくつかは、(倍精度またはDPとしても知られている)バイナリ64、(単精度またはSPしても知られている)バイナリ32、および(半精度またはHPとしても知られている)バイナリ16である。数字64、32、および16は、各フォーマットに必要なビット数を指す。
表現
FP数は、科学の授業で教えられる「科学的表記法」と非常に類似しており、ここでは、マイナス200万の代わりに−2.0×106と書く。この数字の部分は、符号(この場合は負)、仮数部(2.0)、指数部の基数(10)、および指数部(6)である。これらの部分のすべてはFP数における相似形をもっており、違いはあるが、その最も重要なことは、構成部分が2進数で格納され、指数部の基数が常に2であるということである。
より正確には、FP数は、符号ビット、いくつかの数のバイアスされた指数ビット、およびいくつかの数の小数ビットから構成される。特に、DP、SP、およびHPのフォーマットは、以下のビットから構成される。
符号は、負数の場合1、正数の場合0である。ゼロを含むあらゆる数は符号をもつ。
指数はバイアスされており、それは、真の指数が数に格納されている指数と異なることを意味する。たとえば、バイアスされたSPの指数は8ビット長であり、0から255の範囲である。指数0および255は特殊なケースであるが、すべての他の指数はバイアス127をもち、真の指数はバイアスされた指数よりも127小さいことを意味する。最小のバイアスされた指数は1であり、これは真の指数−126に相当する。最大のバイアスされた指数は254であり、これは真の指数127に相当する。HPおよびDPの指数は同じように機能し、バイアスは上記の表に示されている。
SPの指数255(またはDPの指数2047またはHPの指数31)は、NaN(数ではない)と呼ばれる無限大および特殊記号のために予約されている。(正または負であり得る)無限大はゼロの小数をもつ。指数255および非ゼロの小数を有するいかなる数もNaNである。無限大は飽和値を提供するので、実際には「この計算ではこのフォーマットで表現できる数値よりも大きな数が得られる」ようなことを意味する。NaNは、実数で数学的に定義されていない演算、たとえば、ゼロによる除算または負の数の平方根を取ることに対して返される。
指数ゼロは、任意のフォーマットで、非正規数およびゼロのために予約されている。通常の数は値:
−1sign×1.fraction×2e
を表し、ここで、eはバイアスされた指数から計算された真の指数である。1.fractionという用語は仮数と呼ばれ、1はFP数の一部として格納されず、代わりに指数から推論される。ゼロおよび最大指数を除くすべての指数は、1.fractionの形式の仮数を示す。指数ゼロは、0.fractionという形式の仮数、および所与のフォーマットの1−biasに等しい真の指数を示す。そのような数は非正規(subnormal)と呼ばれる(歴史的にこれらの数は非正規(denormal)と呼ばれていたが、現代の使用法では非正規(subnormal)という用語が好まれる)。
指数と小数の両方がゼロに等しい数はゼロである。
以下の表は、HP形式のいくつかの例示的な数を有する。エントリは2進数であり、読みやすくするために「_」文字が追加されている。非正規エントリ(指数部がゼロである表の4行目)は、前の行の正規エントリとは異なる仮数部を生成することに留意されたい。
FP実装の複雑さの大部分は非正規に起因し、したがって、それらはしばしばマイクロコードまたはソフトウェアによって処理される。一部のプロセッサはハードウェア内で非正規を処理し、ソフトウェアまたはマイクロコードの実装と比較して、10〜100倍これらの演算を高速化する。
整数、固定小数点、浮動小数点
符号を扱うFPの方法は符号絶対値と呼ばれ、それは、整数がコンピュータに格納される通常の方法(2の補数)とは異なる。符号絶対値表現では、同じ数の正と負のバージョンは符号ビットでのみ異なる。符号ビットおよび3つの仮数部ビットから構成される4ビットの符号絶対値整数は、
+1=0001
−1=1001
として、プラス1およびマイナス1を表す。
2の補数表現では、nビット整数iは、2進数のn+1ビットの値2n+iの下位nビットによって表されるので、4ビットの2の補数整数は、
+1=0001
−1=1111
として、プラス1およびマイナス1を表す。
2の補数形式は、コンピュータ演算を簡略化するので、符号付き整数にとって事実上汎用的である。
固定小数点数は整数と全く同じようであるが、実際には特定の数の小数ビットをもつ値を表す。センサデータはしばしば固定小数点形式であり、FPが広く採用される前に書かれた多くの固定小数点ソフトウェアが存在する。固定小数点数は、プログラマが「2進小数点」、すなわち数の整数部分と小数部分との間のセパレータを記録しなければならず、また正しい場所にビットを保持するために数を常にシフトしなければならないので、作業が非常に面倒である。FP数はこのような難点をもたず、したがって、固定小数点数とFP数との間を変換できることが望ましい。変換を行うことができるということは、固定小数点のソフトウェアおよびデータをまだ使用できることも意味するが、新しいソフトウェアを書くときは固定小数点に限定されない。
FP数の丸め
ほとんどのFP演算は、IEEE−754規格では、演算が非有界な範囲と精度で行われたかのように計算され、次いで、FP数に収まるように丸められる必要がある。計算がFP数と正確に一致する場合、その値は常に返されるが、通常、計算は2つの連続する浮動小数点数の間にある値をもたらす。丸めは、2つの連続する数のうちのどれを返すべきかを選択するプロセスである。
丸めモードと呼ばれる丸めの方法はいくつかあり、これらのうちの6つは以下の通りである。
この定義は、任意の実際的な方法においてどのように丸めるかを教えない。1つの一般的な実装は、演算を行い、切り捨てられる値(すなわち、FP形式に収まる値)ならびに残りのビットのすべてを調べ、次いで、特定の条件が成立した場合に切り捨てられる値を調整することである。これらの計算はすべて
L−(最小)切り捨てられる値の最下位ビット
G−(ガード)次の最上位ビット(すなわち、切捨てに含まれない最初のビット)
S−(スティッキー)切捨ての一部ではないすべての残りのビットの論理和
に基づく。
これらの3つの値および切り捨てられる値が与えられると、以下の表に従って、正しく丸められた値を常に計算することができる。
たとえば、2つの4ビット仮数部を乗算し、次いで、4ビット仮数部に丸めることを考えよう。
sig1=1011(10進数11)
sig2=0111(10進数7)
乗算は
をもたらす。
切り捨てられた4ビットの結果の最下位ビットはLとラベル付けされ、次のビットはGとラベル付けされ、Sはsとラベル付けされた残りのビットの論理和(すなわち、S=0|1=1)である。丸めるために、丸めモードおよび上記の表の計算に従って、4ビットの結果(1001)を調整する。そのため、たとえば、RNA丸めでは、Gは1001+1=1010を返すように設定される。RX丸めの場合G|Sは真なので、Lを1に設定し(それはすでに1なので、この場合何も変わらない)、1001を返す。
整数および固定小数点数の丸め
FP数を整数または固定小数点に変換する場合も丸める。概念は基本的にFPの丸めと同じである。たまたま整数であるFP数は、常にその整数に丸められる。すべての他のFP数は2つの連続する整数の間にあり、丸めにより、どの整数が返されるが規定される。残念ながら、整数用の丸めロジックは、2の補数と符号絶対値形式との間の差異のために、やや難しくなる。符号絶対値数を増分すると、常に大きさが増加するので、増分された数はゼロからさらに離れる。正の2の補数についても同じことが起こるが、負の2の補数は増分されるとゼロに近くなる。これは、整数が正か負かに基づいて丸めロジックが変わる必要があることを意味する。それはまた、基数値(増分されるかされない値)を慎重に選択する必要があることも意味する。正の整数の場合、その値は、ちょうど切り捨てられたFPの仮数部なので、1.37は1の基数値、および1または2のいずれかの結果を有する。負の整数の場合、再び仮数部を切り捨て、結果の1の補数を取り(1の補数はすべてのビットが反転した元の数である)、−1.37は1に切り捨てられ、次いで反転されて−2の基数値が与えられる。次いで、結果を−2または(増分のとき)−1のいずれかにしたいので、すべてがうまくいく。
事をさらに複雑にするために、我々の変換方法は、負の整数の場合、L、G、およびSを見つけるために何らかの計算を必要とする。正しく丸めることは、2の補数処理(反転および1の加算)を完了し、次いで、L、G、およびSを計算することを必要とするが、その1を加算することは反転だけに比べて遅い。理想的には、元のシフトされた入力から(すなわち、符号に関する何かを行う前に入力から、実際のL、G、およびSを計算したい。そのため、浮動小数点1.37または−1.37は、両方とも整数1に右シフトされる)。
反転の前にL0、G0、およびS0を最下位ビット(lsb)、ガード、およびスティッキーとし、反転の後にLi、Gi、およびSiをlsb、ガード、およびスティッキーとし、最後に、反転および1の加算の後にL、G、およびSをlsb、ガード、およびスティッキーとする。
S0がゼロである場合、Siに寄与するビットはすべて1であり、したがって(それらのSiビットに1を加算して得られた)Sもゼロである。S0が非ゼロである場合、Siはすべてが1ではなく、したがってSは非ゼロである。そのため、すべての場合S0=Sである。
G0がゼロである場合、Giは1であり、GもSビットからの桁上げインがある場合を除いて1であり、それはS0がゼロであるときにのみ起こる。G0が1である場合、Giはゼロであり、またGもSビットからの桁上げインがある場合を除いて1であり、それはS0がゼロであるときにのみ起こる。そのため、G=G0^S0である。
非常に類似するロジックにより、L=L0^(G0|S0)である。
今や負の整数と正の整数の両方の場合にL、G、およびSをもつので、丸め規則を考え出すことができる。
固定小数点数は、整数と全く同じ方法で丸められる。(整数または固定小数点への)符号なし変換用の規則は、正の変換用の規則と同じである。
注入丸め
丸めを行うより速い方法は、ほぼすべてのFP演算の一部である仮数部加算の一部として丸め定数を注入することである。これがどのように機能するかを見るには、ドルおよびセントで数を加算し、次いでドルに丸めることを考えられたい。加算した場合
合計3.62ドルは3ドルよりも4ドルに近いので、最近接丸めモードのいずれかは4ドルを返すはずである。2進数で数を表した場合、前のセクションからのL、G、S方法を使用して同じ結果を実現することができる。しかし、ちょうど50セントを加算し、次いで結果を切り捨てたと仮定する。
合計(4.12ドル)から金額(4ドル)をちょうど返した場合、RNA丸めモードを使用して正しく丸めた。0.50ドルではなく0.99ドルを加算した場合、RP丸めを使用して正しく丸めるはずである。RNEはもう少し複雑である:0.50ドルを加算し、切り捨て、次いで残りのセントを見る。残りのセントが非ゼロである場合、切り捨てられた結果は正しい。ゼロセントが残っている場合、注入前に2ドルの金額間に正確に入っていたので、同一ドルの金額を選択する。バイナリFPの場合、これはドル金額の最下位ビットをゼロに設定することになる。
3つの数を加算することは2つの数を加算することよりもわずかに遅いだけなので、2つの仮数部を加算し、L、G、およびSを調べ、次いで丸めモードに従って結果を増分した場合よりも、注入丸めを使用してよりいっそう迅速に丸め結果を得る。
注入丸めの実装
FPの場合、丸め注入は3つの異なる値、丸めモードおよび(時々)結果の符号に依存する値のうちの1つである。
RNAとRNEの両方は、Gの位置に1を注入することを必要とする(これはドルおよびセントの例において0.50ドルを加算するようなものである)。
RPおよびRMの丸めは、符号ならびにモードに依存する。RPは正の結果を切り上げる(正の無限大に向かって仮数部の大きさを増加させる)が、負の結果を切り捨てる(正の無限大に近い仮数部を選択する)。同様に、RMは負の結果を切り上げる(負の無限大に向かって仮数部の大きさを増加させる)が、正の結果を切り捨てる(負の無限大に近い仮数部を選択する)。したがって、符号が丸め方向に一致するときは切り上げる(RU)、符号が丸め方向と異なるときは切り捨てる(RZ)という2つのケースにRMおよびRPを分割する。RUの場合、Gビット位置に、およびSに論理的に寄与するすべての位置に1を注入する(これは、ドルおよびセントの例において0.99ドルを加算するようなものである)。
RZモードおよびRXモードの場合、ならびにRZモードに帰着するRPモードおよびRMモードの場合、ゼロを注入する。
ほとんどの丸めモードの場合、丸め注入を加算し、次いで切り捨てると、正しく丸められた結果が与えられる。2つの例外はRNEおよびRXであり、これにより、加算後にGおよびSを調べる必要がある。RNEの場合、GおよびSが両方ともゼロである場合、Lを0に設定する。RXの場合、GまたはSが非ゼロである場合、Lを1に設定する。
FP数は実数ではない
FP数は実数同然であると考えたくなるが、それらは、最も基本的な特性についても基本的に異なる。
それらは結合的ではない。たとえば、SPでは3つの数を加算し、100万または0を返し、おそらく人々が丸め誤差と考えるものではない。
(245 + −245) + 220 = 220
245 + (−245 + 220) = 0
それらは分配法に従わない。再びSPでは、
3,000,001×(4.00001+5.00001)=0x4bcdfe83
(3,000,001×4.00001)+(3,000,001×5.00001)=0x4bcdfe82
であり、オーバーフローが発生すると状況はさらに悪化する。
250 × (278 − 277) = 2127
(250 × 278) − (250 × 277) = 無限大
いくつかの実装形態の場合、一般に、nanA+nanB!=nanB+nanAなので、デフォルトのNaNモード(すべてのNaNを単一のNaNに変換するモード)でない限り、それらは可換でさえない。数の加算および乗算は可換である。
IEEEのNaN規則のために、乗法単位元または加法単位元は存在しない。1および0は数値用の単位元として機能する。
FP数のことを考える1つの有用な方法は、それらを多くても2、3(DPの場合は53)の連続ビットが非ゼロであり得る超長固定小数点数であると考えることである。たとえば、無限でないDP数は、2046箇所のいずれかに仮数部の最初のビットをもつことができ、その最初のビットに52個の他の仮数部ビットが続き、符号ビットがあるので、いかなる有限のDP数も、2046+52+1=2099ビットの固定小数点数として表すことができる。このように検討すると、2つのFP数を加算すると、一般に、別のFP数をもたらさないことが非常に明白になり、加算の結果は、FP数になるように丸められる必要がある。
浮動小数点(FP)演算に関する既知の問題は、それが非結合的であることであり、合計が問題になるという事実である。
・プログラマは、3つの数を加算するときでも、大きく異なる結果について心配する必要がある。
・プログラマは、大きく異なる結果を回避することを希望して、必要以上に広いフォーマットを使用する。
・プログラマは、正確に同じ順序で計算されない限り合計が再現できないので、コードを簡単に並列化することができない。
たとえば、単精度では、
220 + (−244 + 244) = 220
であるが、
(220 + −244) + 244 = 0
である。
演算が実行される順序に応じて、結果は100万またはゼロである。指数部が24異なるので、これは極端な例であるが、指数部が1異なる場合、または指数部がすべて同じであり、4つ以上のものを加算している場合でも、異なる答えを得る可能性がある。Cプログラミング言語は、順番に左から右に評価されるべき合計を要求することによって再現性問題に対処するが、これは正確さについては何もせず、並列化を不可能にする。
問題は、プログラムが何百万のものを加算する必要があり得る、高性能コンピューティング(HPC)にとって特に深刻である。プログラマは、これらの問題を並列化したいが、再現性の欠如は、デバッグを通常よりもさらに困難にする。それらのマシン用のリプログラミングが完全に行われた場合でも、異なるマシン構成は異なる答えを生み出す。
HPA表現
プログラマが選択可能な範囲で浮動小数点(FP)数を迅速かつ正確に累積することを可能にする新しいデータ型が開示されている。ほとんどの問題に対応する控えめな範囲の場合、累積は、FPの加算よりも速く、結合的である。結合加算は、さらに再現可能で正しい結果を与えながら問題を並列化することを可能にし、たとえば、既存のハードウェアと比較して100倍以上の高速化を可能にする。これらの利点は、高性能コンピューティング(HPC)空間では非常に魅力的であり、多くの非HPCアプリケーションにとって魅力があるものとなるであろう。
図1は、プログラム命令の制御下でデータ処理動作を実行するためのデータ処理装置2を概略的に示す。データ処理装置2は、処理されるべきプログラム命令6およびデータ8を記憶するメモリ4を含む。プロセッサコア10は、メモリ4に結合され、レジスタバンク12、処理回路14、命令フェッチユニット16、命令パイプラインユニット18、および命令デコーダ20を含む。実際には、データ処理システム2は多くのさらなる要素を含む場合があり、図1の表現は理解を助けるために簡略化されていることが諒解されよう。動作中、プログラム命令6は、命令フェッチユニット16によってメモリ4からフェッチされ、命令パイプライン18に供給される。プログラム命令が命令パイプライン18内の適切な段階に達すると、それらは命令デコーダ20によって復号され、復号されたプログラム命令によって指定された処理動作を実行するように、レジスタバンク12および処理回路14の動作を制御する働きをする制御信号を生成する。複数の入力オペランドは、レジスタバンク12から読み出され、処理回路14に供給され、そこで操作され、次いで、結果値がレジスタバンク12に書き戻される。
レジスタバンク12は、様々な異なる形態を有することができる。操作されるべきオペランドには、たとえば、浮動小数点オペランド、固定小数点オペランド、整数オペランド、および(後述されるような)HPA数オペランドまたはRHPA数オペランドが含まれる場合がある。レジスタバンク12は、レジスタバンク12の構成に応じて、これらのタイプのオペランドの混合物を格納するように働くことができる。オペランドは、それらのフォーマットによってあらかじめ定義されているように、またはHPA数オペランドに関して後述されるレジスタに関連付けられたメタデータを使用してプログラム可能に指定され得るように、異なる精度レベルを有することができる。
図1に示されたように、レジスタバンク12は、レジスタバンク12の対応するデータレジスタに格納されたHPA値またはRHPA値に関連付けられたメタデータを指定するためのメタデータレジスタ22を含む場合がある(メタデータの内容の例が下記に示される)。場合によっては、各データレジスタは対応するメタデータレジスタ22を有する場合があるが、他の場合には、2つ以上のデータレジスタは単一のメタデータレジスタ22によって指定されるメタデータを共有する場合がある。
図2は、浮動小数点オペランドを概略的に示す。浮動小数点オペランドは、符号、指数部、および仮数部から形成される。浮動小数点オペランドは、指数値によって示される多種多様な大きさを有する値を表すことができる。数を表現できる精度は、仮数部のサイズによって制限される。浮動小数点演算は、通常、整数演算よりも実施することが複雑で遅い。
図2は、64ビット整数オペランドも示す。そのような整数オペランドは、符号なし整数の場合0〜(264−1)、または符号付き整数の場合−263〜263−1の範囲の数を表すことができる。整数演算は、(浮動小数点演算と比較して)通常高速であり、実行するために消費するエネルギーが比較的少ないが、浮動小数点値によって表され得る数の範囲と比較して、数の指定され得る値の範囲が比較的限定されるという欠点がある。
図2はまた、この例では、各々が64ビット整数を含む複数の成分(この例では3つ)のベクトルを含むHPA(高精度アンカー)数も示す。HPA数は、それに関連付けられたメタデータを有する。メタデータは、HPA数の一部を形成する成分のビットの有効桁を示すアンカー値を含む。アンカー値は、直接的または間接的に、ビットの有効桁の下方境界およびビットの有効桁の上方境界を指定する。下記で使用されるメタデータという用語は、HPA数のビットの有効桁を指定するアンカー値を含むデータに相当すると考えることができる。様々な成分は、ビットの有効桁のこの範囲を連続してまたがるビット値を一緒に指定する。ビットの有効桁の下方境界およびビットの有効桁の上方境界の位置に応じて、ビットの有効桁の範囲は2進小数点位置を含む場合がある。2進小数点位置が、特定のHPA値に対して指定されたビットの有効桁の範囲外にあり得ることも可能である。
アンカー値は、浮動小数点値(たとえば、倍精度FP値)によって表され得る最小の有効桁から、浮動小数点値によって表され得る最大のビットの有効桁まで広がるビットの有効桁の範囲を表すことが可能なように提供される場合がある。
HPA数を形成する成分の数は、様々な実装の間で異なる可能性がある。成分のサイズは、いくつかの実施形態では固定されてもよいが、他の実施形態では変わってもよい。ビットの有効桁の範囲の全体的な幅は、いくつかの実施形態では、固定成分のサイズの単位で変わるように強制される場合がある(たとえば、64ビット成分では、ビットの有効桁の範囲は、たとえば、64、128、192、256、…の幅を有してもよい)。ビットの有効桁の範囲の幅は、1ビット幅のステップで連続的に変わることも可能である。
プログラマが対応するHPA値の有効桁を設定することができるように、(メタデータ内の)アンカー値はプログラム可能であり得る。アンカー値は、様々な異なる方法でビットの有効桁を指定することができる。1つの例は、各ベクトル成分のビットの有効桁の下方境界を指定することである。したがって、各ベクトル成分は、その成分内の最下位ビットの有効桁を表す(固定する)メタデータとともに、ビットの有効桁の全範囲内の値の有効ビットのその部分を表す整数値を含む場合がある。別の選択肢は、アンカー値が、ビットの有効桁の範囲の全幅とともに、HPA数全体のビットの有効桁の下方境界を指定することである。さらなる選択肢は、アンカー値が、ビットの有効桁の範囲の下方境界および上方境界を指定するデータを含んでもよいことである。それらの成分が固定幅成分であることが知られている成分の数とともに、ビットの有効桁の範囲の下方境界を含むアンカー値などの、またさらなる変形形態も可能である。
図3は、倍精度浮動小数点で表現可能な値の範囲と、HPA数の有効桁範囲との間の関係を概略的に示す。倍精度浮動小数点数の場合、指定され得るビット値の範囲は、おおよそ2−1074から2+1023(非正規を数えない)まで広がる。
図示されたように、HPA数は、浮動小数点値を使用して表現可能なビットの有効桁の範囲内のビットの有効桁のウィンドウとして考えられ得るプログラム可能なビットの有効桁の範囲を有する。このプログラム可能なビットの有効桁は、下方境界および上方境界によって指定される場合があり、下方境界および上方境界の値に応じて、浮動小数点値によって提供されるビットの有効桁の範囲に沿ってスライドすると考えることができる。ウィンドウの幅、ならびにその開始点および終了点は、ビットの有効桁を指定するプログラム可能な(アンカー値を含む)メタデータの適切な値によって指定される場合がある。したがって、HPA数は、実行されるべき計算に適合するようにプログラマによって選択された形式を有することができる。
HPA形式により、2つ以上の値の加算を迅速、正確、かつ結合的に実行することが可能になるが、さらに広範な有効桁にわたる値を表すことが可能になる。HPA値は単に2の補数なので、整数加算器を使用して加算することができ、浮動小数点演算のように丸めまたは正規化を行う必要がなく、値が加算される順序にかかわらず結果は同じになるので、一連の加算を並列化することが可能になる。それにもかかわらず、HPA値のプログラム可能な有効桁を指定するメタデータを定義することにより、等価な浮動小数点値の有効桁の全範囲をさらに表すことができるが、非常に広い加算器を設ける必要はなく(たとえば、倍精度浮動小数点値によって表現可能な全範囲にわたって2の補数を加算するためには、2098ビットの加算器を必要とする)、その代わり、プログラム可能な有効桁により、より小さい加算器がより広い範囲内のプログラム可能なビットの有効桁の特定のウィンドウに集中することが可能になる。実際には、大部分の計算は、倍精度浮動小数点に利用可能な有効桁の全範囲を必要としない。たとえば、原子より小さい問題は非常に小さい値を累積し、天体の複雑さは非常に大きな値を累積するかもしれないが、銀河間の距離に陽子の幅を加算することは、一般に有用ではない。高性能コンピューティングでの場合でも、ほとんどの累積は限られた範囲にわたって行われる。
通常、プログラムを書くプログラマは、(アプリケーションに応じて)有用な結果が収まる可能性がある値の予想範囲を知る。プログラマは、特定の合計についてのデータのすべてが260未満の大きさをもち、2−50を下回る大きさをもつ値がいかなる意味のある方法でも合計に影響を与えないと判断するかもしれないので、この場合、128ビットのデータ幅全体および最下位ビットの有効桁を−50と指定するアンカー値を有するHPA形式使用してデータを加算することにより、この特定の適用例についての数は任意の順序で結合的に加算することができる。
したがって、アンカー値を使用して結果が計算される有効範囲を制限することにより、プログラム可能に定義されたウィンドウ内の結果を計算するために、比較的小さなハードウェアを使用することができる。加算結果が、定義された範囲の有効桁の上方境界を超えるオーバーフローまたは有効桁の下方境界を下回るアンダーフローをもたらした場合、例外が発生する可能性があり、これにより、プログラマが誤った有効桁の境界を定義したこと、および結果についての有効桁の異なるウィンドウを定義するために、異なるメタデータ(たとえば、異なるアンカー値またはHPA値の異なる全体サイズ)で処理を繰り返す必要があることが通知される可能性がある。
2つのHPA値を加算または減算するとき、アンカー値は両方のHPA値で同じであり、結果も同じアンカー値を有する−これは浮動小数点演算とは異なり、浮動小数点演算では、2つの値を加算または減算すると、結果の正規化に起因して、いずれかの入力に異なる指数部を有する結果をもたらす可能性がある。入力が異なるアンカーメタデータを提供された場合、それらは、結果に必要な目標有効桁範囲とそれら自体を整合するようにシフトされる。入力がHPA以外の表現(たとえば、整数または浮動小数点)で提供された場合、それらは、同じアンカー値を共有するHPA値に変換され、加算されて、同じアンカー値を有する結果を形成する。したがって、HPAレジスタ用のメタデータは、そのレジスタ内で生成されるべき結果値についての有効桁の目標範囲を定義するものと見なすことができ、有効桁の目標範囲外のビットは、入力値の実際の有効桁にかかわらずハードウェアによって計算されない。
RHPA表現
HPA形式は浮動小数点に比べてはるかに高速な加算を可能にするが、HPA値のサイズが比較的大きくなると、整数演算を伴う2つのHPA値の加算は依然として比較的遅い場合がある。たとえば、HPA形式は、複数のレーンにまたがるオペランドの加算を必要とする場合があり、それは、より大きなベクトルの実装では望ましくない場合がある。たとえば、2つの256ビットまたは512ビットの値の加算は、次のレーンに入力される1つのレーンからの桁上げを収容するために、加算の各64ビットのレーンが順次実行される場合があるので、ある程度時間がかかる可能性がある。
この加算は、図4に示された冗長高精度アンカー(RHPA)形式を使用することによって高速に実行することができる。HPA形式におけるように、RHPA数は、処理回路14が各成分のビットの有効桁を識別することを可能にするアンカー値を定義するメタデータを有する可変数の成分を含む。ここでも、アンカー値はプログラム可能であってもよい。RHPAの場合、メタデータは、HPAについて上述されたいずれかの方法で各成分の有効桁を識別することができる。しかしながら、RHPA形式では、数値は、ベクトルの隣接するレーンが重複する有効桁のビットを含む冗長表現を使用して表され、それにより、計算されるレーンの数にかかわらず一定時間の加算が可能になる。冗長性により、加算、累算、および乗算などの演算が、より短い加算器で、加算器間で桁上げ情報を伝搬することなく実行されることが可能になる。これにより、データ値の処理が大幅に高速化される。
図4のパート(1)に示されたように、RHPA表現を使用するMビットのデータ値は、各々がNビットを含むそれぞれの(成分、要素、または部分とも呼ばれる)ベクトルレーンに分割され、ここで、N<Mである。この例では、Nは64ビットであるが、これは一例にすぎず、他のレーンサイズ(たとえば、32ビットまたは128ビット)も可能である。各Nビット部分は、ある数Vの重複ビットおよびN−Vの非重複ビットに分割される。この例では、重複ビットVの数は各Nビット部分に対して同じであるが、下記の図25に示されたように、異なる数の重複ビットをもつ異なるNビット部分を有することも可能である。
整数または浮動小数点数がRHPA形式に変換されると、非重複ビットの一部は、元の整数または浮動小数点数からマッピングされた非符号情報が格納され、重複ビットは符号ビットが格納される。レーンベースの加算および減算の目的のために、各レーンは(必要な場合非重複部分から重複部分に伝搬する桁上げを有する)Nビットの符号付き2の補数のように挙動するが、マルチレーンの観点から見ると、レーンは、より大きなPビット数の冗長混合符号表現を形成する。図4の例では、4つのレーンがあるのでM=256であるが、レーンの数は、ハードウェア実装および/または所与のRHPA数に対して定義されたメタデータに応じて変わる可能性がある。
図4のパート(2)は、パート(1)に示されたRHPA数の各ビットの相対的な有効桁を示す。最下位レーンの重複ビットV[0]は、次のレーンの非重複ビットNV[1]のVの最下位ビットと同じ有効桁を有する。同様に、重複ビットV[1]およびV[2]は、それぞれ、非重複ビットNV[2]およびNV[3]のVの最下位ビットと同じ有効桁を有する。レーン間の有効桁における重複は、RHPA数が全体として、格納されたビットの総数Mよりも小さいPビット値を表すことを意味する。Vが(先頭部分以外の)各Nビット部分に対して同じである場合、P=M−V(M/N−1)である。より一般的には、異なるレーンが異なる数の重複ビットを有することができる場合、P=M−ΣVであり、ここで、ΣVは先頭レーン以外の各レーン内の重複ビットの総数である。
Pビット値の各重複部分において、そのPビット数の実際のビット値は、(下位レーン内の非重複ビットNVと重複ビットを加算することによって引き起こされる可能性がある任意の桁上げを考慮に入れて)下位レーンの重複ビットVと上位レーン内の非重複ビットNVとの和によって表される。したがって、RHPA値を等価整数値に変換する1つの方法が図4のパート(3)に示され、ここで、各レーン内の重複ビットは符号拡張され、(各レーンの加算後に重複ビットを調整して、低次から高次に)上位レーンの非重複ビットに加算される。
RHPA数は、RHPA値のMビットを使用して、所与のPビット数を表す2つ以上の方法があるという点で、冗長である。たとえば、最下位の2つのレーンにおける重複を考慮すると、重複ビットの数V=4の例では、Pビット値の対応するビットが1111である場合、これを表す1つの方法は、下位レーン内の重複ビットV[0]=0b0000および次の最上位レーン内の非重複ビットNV[1]=0b1111である。しかしながら、同じ値を表す他の方法は、たとえば、V[0]=0b0101およびNV[1]=0b1010、またはV[0]=0b1111およびNV[1]=0b0000であり得る。
最上位レーン内の重複ビットV[3]は、重複する高次レーンが存在しないので、実際には重複ビットではないことに留意されたい。したがって、高次レーンをすべて非重複ビットと見なすことはしばしば有用であり得るし、下記の例のいくつかがこれを示す。したがって、場合によっては、先頭レーンは全体的に非重複ビットから形成されると考えることができる(その結果、Pビット値の最上位ビットは全体として、先頭レーン内のMビット値の最上位ビットに対応する)。
しかしながら、他の実施形態では、先頭レーンも重複ビットを有するものとして扱うことが好ましい場合があり、その結果、RHPAによって表されるPビット数値の最上位ビットは、先頭レーンの(重複部分を除く)非重複部分の最上位ビットに対応する。この手法により、(先頭レーンが他のレーンと比較して処理される方法に対する修正を少なくして)各レーンがより対称的な方式で処理されることが可能になる場合、回路の実装がより容易なる場合がある。
図4に示されたようにPビット数値を冗長形式で表現することにより、所与のレーン内の非重複部分の加算からのいかなる桁上げも、次のレーンまで桁上げを伝搬する必要なしに、同じレーンの重複部分内で収容することができるので、レーン間の桁上げなしでいくつかのRHPA数を加算することができる。各レーン内で実行される加算は、従来のNビットの2の補数加算を実行することによって加算される2つ以上のNビット符号付き整数を単に参照し、これは他のレーン内の対応するNビット加算から完全に独立している。これは、Nビット加算の各々が並列に実行できることを意味し、その結果、レーンの数にかかわらず、Nビット加算を実行するのにかかる時間内にMビット値全体を加算することができる。
実際には、少なくとも(2V−1−1)個のそのようなRHPA数は、レーン間の桁上げなしに加算することができ、非重複部分の加算からのいかなる桁上げも重複部分内で収集される(異なる数の重複ビットを有するレーンがある場合、この式のVは、重複ビットを有する任意の所与のレーン内の重複ビットの最小数のはずである)。(先頭重複ビットは符号ビットであり、すべてのビットが0であるRHPA数から始まるとき、最小2V−1個のさらなる加算が実行された後に発生する可能性がある、2番目の最上位重複ビットからの正または負のオーバーフローがあるときにレーンオーバーフローが発生するので)、(2V−1)番目の加算は、レーン間の桁上げを発生させる可能性がある最初のものである。たとえば、V=14の場合、これにより、単一レーンからオーバーフローする任意のリスクがある前に、少なくとも8191個のRHPA数がアキュムレータに加算される(すなわち、合計8192の値が加算される)ことが可能になる。これは、多くの入力値の加算が一般的な高性能コンピューティング分野に特に有用である。実際には、あらゆる加算がオーバーフロー部分への桁上げを引き起こすとは限らないので、時々、Nビット部分の先頭ビットからのオーバーフローなしに2V−1個を超える累積が可能である。
場合によっては、Nビットレーンの先頭ビットからのオーバーフローのリスク(または実際のオーバーフロー)を引き起こすのに十分な加算が実行された場合、重複ビットが所与のRHPA値の重複ビットよりも小さい大きさを表す第2のRHPA値に所与のRHPA値を変換して、より多くの桁上げを収容するための重複部分内のビット空間を効果的に解放するために、重複削減演算を実行することができる。また、RHPA数を整数または浮動小数点などの別のフォーマットに逆変換するとき、そのような重複削減が実行される場合もある。しかしながら、実際には、そのような重複削減演算はめったに必要とされる場合はないので、Nビット加算にかかる時間内に複数の入力のMビット加算が実行されることを可能にすることにより、RHPAは処理時間を大幅に節約することができる。「重複削減」という用語は、あらゆるレーン内の重複ビットを小さくしなければならないことを意味しないことに留意されたい。少なくとも1つのレーンの重複ビットが大きさを削減すれば十分であり、何らかの形態の重複削減(たとえば、下記で説明される図13の制限付き冗長の例)が、所与のレーン内の重複ビットの大きさの増大につながる可能性がある。重複削減演算のいくつかの例が下記に記載される。
図5は、RHPA値について定義されたメタデータの例を示す。この例では、メタデータは、RHPA値の対応するレーン内の最下位ビットの有効桁(または「重み」)を各々が指定するいくつかのアンカー要素w[i]を含むアンカーベクトルと、各レーン内の重複ビットの数を指定する重複サイズ値Vとを含む。
場合によっては、RHPA数用のメタデータは、(そこから、レーンサイズNが与えられると、レーンの数を決定することができる)ビットMの総数を識別することにより、明示的または暗示的にRHPA数によって含められたNビットレーンの数を識別することもできる。
連続するレーン内の重みw[i]、w[i+1]がレーンサイズNだけ異なるHPA形式とは対照的に、RHPA値の場合、連続するレーン内の重みw[i]、w[i+1]は、N−V(レーンサイズマイナス重複ビットの数)だけ異なる。したがって、処理回路14は、メタデータ内のアンカーベクトルおよび重複サイズから、RHPA値内の各ビットの有効桁を識別することができる。アンカー値w[i]を有する所与のレーンの所与のビットj(j=0〜N−1)の有効桁は、w[i]+jによって与えられる。2つ以上のRHPA数の加算中、アンカー値または重複サイズを考慮する必要はなく、数を単に加算して結果を形成することができる。アンカー値は、RHPA形式と整数または浮動小数点などの他のフォーマットとの間を変換するときにプロセッサによって使用され、重複サイズ値Vは、重複の伝搬または異なるフォーマット間の変換を実行するときに参照される。
図5は、アンカーベクトルとは別個のものとして重複サイズ値Vを示すが、別の例では、重複サイズVはアンカーベクトル自体の中で指定されてもよい。たとえば、RHPA値を保持するために使用されるレジスタ12と同じサイズのSIMD(単一命令多重データ)ベクトルレジスタは、メタデータを格納するために割り振られる場合があり、ベクトルレジスタの各レーンは、処理の対応するレーン用の対応するアンカー値w[i]および重複サイズVを保持する。
また、これらのパラメータが制御レジスタ内で定義されることは必須ではない。いくつかのシステムでは、重複サイズVは、所与のハードウェア実装の場合固定されてもよく、ユーザによってプログラム可能でなくてもよい。しかしながら、プログラマが重複サイズVを指定することを可能にすることは、所与のサイズPの値を加算するために必要なレーンの総数に対して、レーン間の桁上げを伝搬することなく実行され得る連続的な加算の数をトレードオフするために有用であり得る。一般に、重複サイズVが大きければ大きいほど、重複伝搬なしに実行され得る加算は多いが、これにより、所与のサイズPの数に対してより多くのレーンが必要とされるようになる。重複サイズVを縮小することにより、所与のサイズの数は、より少ないレーンを使用して加算することができ、これにより、より広いベクトルプロセッサのレーンのそれぞれのサブセットを使用してRHPA値の2つ以上の別々のセットを並行して加算することが可能になることによってパフォーマンス貯蓄が可能になる場合がある(たとえば、下記で説明される図21〜図24を参照)が、この場合、オーバーフロー境界に早く到達し、重複ビットを後続のレーンに伝搬する必要が生じる前に、より少ない数の加算を実行することができる。
他の例では、重複サイズVは、RHPA値の処理を制御するための命令の符号化において指定される可能性がある。同様に、アンカーベクトルも命令内で識別される可能性がある。いくつかの例では、各レーンの有効桁を別々に指定するアンカーベクトルの代わりに、メタデータは、RHPA値の所与のレーン内の所与のビットの有効桁を単に指定することができ、他のレーンの有効桁は、そのビットの有効桁から導出することができる。たとえば、最下位レーンのビットの有効桁のみが指定された場合、他のレーンの有効桁は、最下位レーンの有効桁にN−Vの倍数を加算することによって計算することができる。
図6は、RHPA形式を使用して累積演算を高速化する例を示し、これは、特に数千または数百万もの異なる値が一緒に加算される必要があり得る高性能コンピューティングでは、比較的一般的な演算である。アキュムレータレジスタ30は、今まで加算されたすべての値の中間合計を表すRHPA形式のアキュムレータ値を格納するために設けられる場合がある。各サイクルにおいて、RHPAアキュムレータ値に加算するために入力オペランド32が提供される。いくつかの命令の場合、入力オペランド32は、命令によって直接指定される可能性がある。他のタイプの命令の場合、入力オペランド32は、命令によって直接指定されたオペランドに適用される何らかの他の処理動作の結果であり得る(たとえば、多重加算命令は2つの値を乗算することによって入力オペランド32を生成することができる)。入力オペランド32は、整数値または浮動小数点値の可能性がある。
入力オペランド32は、RHPA数36の対応するNビット部分A[0]〜A[3]を生成するいくつかのレーン変換ユニット34に提供される。各レーン変換ユニット34は、RHPAアキュムレータ値に関連付けられたメタデータのアンカーベクトルの対応する要素によって定義されるものとしてそのレーンの有効桁w[i]を受け取り、これを使用して、入力オペランド32のビット(浮動小数点値の場合、仮数部のビット)を、そのレーン内の対応する有効桁のビットにマッピングする。いくつかのレーンの場合、そのレーン内のビットのうちのいずれかに有効桁で対応するビットが入力オペランド32内に存在しない場合があるので、そのようなレーンは、符号ビット(入力オペランド32が正の場合0、入力オペランド32が負の場合1)で完全に満たされる場合がある。各レーンの重複ビットは符号ビットに設定される。整数値または浮動小数点値のRHPAへの変換は、図10および図11において下記でより詳細に記載される。
次いで、生成されたRHPA値36の各Nビット部分は、レーンごとに並列に設けられたそれぞれの加算回路ユニット38により、アキュムレータ値の対応する部分に加算される。各加算回路ユニット38は、他の加算回路ユニット38と並列に、独立したNビット符号付き2の補数加算を実行して、結果の対応するNビット部分を生成し、結果は、アキュムレータレジスタ30の対応する部分に書き戻されて、アキュムレータの前の値を置き換える。桁上げがレーン間で伝搬されないという点で、加算は独立している。
累積演算を数回繰り返すことにより、一連の入力オペランドを迅速、正確、かつ結合的に加算することができ、入力オペランドが入力される順序は結果に影響を与えない。これは、累積がより速く実行され得ることを意味する。たとえば、図6に示された回路の2つ以上のインスタンスは、加算されるべき値のアレイのそれぞれのサブセットを加算して、いくつかの部分アキュムレータ値を形成するために、並列に設けることができる。次いで、各部分アキュムレータ値を加算して、最終結果を形成することができる。これは、浮動小数点の非結合的性質のために、浮動小数点演算では可能ではないはずである。
最終的な累積結果は、RHPA値としてのさらなる処理のためにアキュムレータレジスタ30に残すことができるか、または代替数表現に逆変換することができる。RHPAを整数または浮動小数点に変換するための技法が下記に記載される。
いくつかの例がここで役に立つ。説明を簡単にするために、4つの8ビットレーンに分割された32ビット数からなる小さなRHPA形式を考えてみよう。これらの例ではV=4なので、各レーンは4つの非重複ビットおよび4つの重複ビットを有する。FP数をこのフォーマットに変換しようとするのではなく、入力として16ビット符号絶対値整数を使用する。さらに、暗黙的な0のアンカーを仮定するので、すべての整数値に関心がある(初期値がFP形式であった場合、入力ビット数が少数であれば、それらは破棄されるが、符号絶対値整数入力ではこの可能性はない)。
例1:符号絶対値16進整数123aをRHPA形式に変換すると仮定する。アンカーはゼロなので、低次レーンの非冗長ビットは、重み2
0〜2
3、すなわちa=1010(2進数)を有する入力の一部を含む。数は正なので、低次レーンの重複ビットはゼロであり、2進数0000_1010の低次レーン値を与える。同様に、次のレーンは、重み2
4〜2
7、この場合3=0011(2進数)を有する入力の一部を含む。すべてのレーンを進んで(それらはすべて並行して計算される)、RHPA数を取得する。
例2:923aからRHPAに変換することは同様である(これは符号絶対値形式で−123aである)が、符号ビットが設定されているので、各レーンは前の例にはなかった2の補数を得る。
例3:123aに7fff(最大可能な正の入力)を加算すると、重複ビットの効用が示される。rhpaは小さなRHPA数の1つに16ビット符号絶対値数を加算する本明細書の小さなプログラムである。加算は、重複ビットのためにレーン間の桁上げなしで容易に処理される。
例4:923aに20f0を加算すると、異なるレーンは異なる符号を有することができ、レーンのうちの2つは正であり、2つは負であることが示される。
さらなる例が下記の付録Aに示される。
通常のHPAよりも狭い加算回路ユニットで値が加算されることを可能にすることに加えて、RHPAは、同時に複数の値を累積することができるので、はるかに高速になる可能性も有する。通常のHPAでは、所与の非常に広い加算器は一度に2つのHPA値を加算することのみができるが、RHPAでは、重複ビットは、レーンオーバーフローについて心配することなく、2V−1−1までの値の加算をアキュムレータに累積することができるので、これは、多くの値の加算が、いくつかの順次加算を必要とするのではなく、すべての値を同時に加算する単一の演算として実行できることを意味する。
たとえば、図7は、j個のRHPA値(jは3以上である)の加算を示し、各加算回路ユニット42は、j個の別々のNビット値を2つのNビット項に削減することができる、jから2への削減ツリー44(乗算器で使用されるものと同様のウォレスツリー)を含み、2つのNビット項を加算してNビットの結果値Rを生成するための桁上げ伝搬加算器46が続く。たとえば、jは4、8、または16の可能性があり、一度に単一の値を順次加算することと比較すると、これにより、所与の数のデータ値をかなりの量だけ加算するのにかかる時間を短縮することができる。RHPAではこれが可能である理由は、重複ビットが交差するレーン境界なしに複数の項目を加算することを可能にするためである。
図8に示されたように、ただ1度の演算で加算されるRHPA値は、入力ベクトル内で指定されたそれぞれの入力値から導出される可能性がある。この例では、入力ベクトルの各要素は、それぞれの浮動小数点値FP0〜FP3である。プロセッサは、各々が図6のレーン変換ユニットのように機能するが、異なる浮動小数点入力FPjまたはアンカー重みw[i]を受け取る、レーン変換ユニット34のアレイを有する。一般に、レーン変換ユニット34−jiは、元の入力ベクトルの浮動小数点値FPjに対応するRHPA値のi番目の要素を生成する。たとえば、対応するRHPA値RHPA0のそれぞれの要素RHPA0[0]〜RHPA0[3]を生成する最初の行のレーン変換ユニット34−00〜34−03の各々に、浮動小数点値FP0が与えられる。同様に、他の行は、浮動小数点値FP1〜FP3に対応するRHPA値RHPA1〜RHPA3の要素を生成する。次いで、各々の生成されたRHPA値の対応する要素が加算回路ユニットによって加算されて、アキュムレータ値の対応する結果が生成される。レーンごとの処理は、他のレーンと完全に並行して実行される。
図8は、入力ベクトル内の浮動小数点値の数がRHPA値の処理レーンの数と同じである例を示すが、これは必須ではない。たとえば、8要素の浮動小数点ベクトルは、各RHPA値の対応する要素を加算する4つの処理レーンを有する8つの4要素RHPA値にマッピングされる可能性がある。RHPA値内のレーンの数は、入力ベクトルのサイズではなく、RHPA値のメタデータに依存する。
また、説明を容易にするために図7および図8には示されていないが、場合によっては、加算されるRHPA値のうちの1つは、アキュムレータ値R自体の以前の値の可能性がある。
図9は、RHPA形式を使用して累積を実行する方法を示す。ステップ480において、1つまたは複数の次の入力値が受け取られる。これらの入力値は、命令によって直接指定されたオペランドの可能性があるか、または、たとえば乗算の積などの、命令に応答して実行される何らかの他の処理の結果の可能性がある。図7および図8に示されたように、場合によっては、2つ以上の入力値がこの時点で受け取られる場合がある。ステップ482において、受け取られた入力値がRHPA形式に変換される。変換の例は、図10および図11に関して下記に記載される。ステップ484において、並列加算回路ユニット38、42は、入力値の対応するNビット部分とアキュムレータ値との並列Nビット加算を実行して、結果の対応するNビット部分を生成し、その結果がアキュムレータレジスタ30に書き込まれる。各Nビット加算は、他の加算と完全に並行して実行することができる標準の2の補数Nビット加算である。あるいは、2つ以上の入力値がアキュムレータに加算されるとき、Nビット加算は、ウォレスツリーを使用する2つの項への項の数の削減と、桁上げ伝搬加算器を使用してその結果の対応するNビット部分を生成する2つの項の加算とを含むことができる。
ステップ486において、重複伝搬条件が満たされるかどうかが判定される。下記で説明されるように、たとえば、ある数の累積が実行されたとき、あるレーン内の重複ビットが所与の値に達したとき、またはステップ484において実行されたNビット加算のうちの1つの間に所与のレーンから実際のオーバーフローが発生したとき、重複伝搬条件が満たされたと考えることができる。重複伝搬条件が満たされた場合、ステップ488において、アキュムレータ値に対して重複伝搬演算が実行されて、重複ビットを1つのレーンから次のレーンに伝搬し、それにより、所与のレーンからのオーバーフローの可能性が低減される。重複伝搬演算の様々な例が下記に記載される。重複伝搬演算の結果は、アキュムレータレジスタに書き戻され、その結果、レーン間のオーバーフローの可能性を低減して、さらなる累積を実行することができる。一方、重複伝搬条件が満たされない場合、ステップ488は省略される。ステップ490において、考慮すべきさらなる入力値があるかどうかが判定され、そうである場合、方法はステップ480に戻る。そうでない場合、方法は終了するか、または任意選択で、ステップ492において、最終アキュムレータ結果を浮動小数点、固定小数点、または整数などの別の表現に変換することができる。この変換を実行するための技法は、図17〜図19に関して下記に記載される。
図6〜図8はRHPA形式の値に対して加算を実行する例を示すが、他の演算も実行することができる。たとえば、より一般的には、処理回路14は、2つ以上のRHPA値の対応するNビット部分の関数を計算して、同様にRHPA形式で結果値の対応するNビット部分を生成するために、独立したNビット演算を並列に実行するいくつかの演算回路ユニットを有することができる。たとえば、各Nビット演算は、以下の、加算または減算、乗算、論理演算(たとえば、AND、OR、NOR、XORなど)、ガロア体演算などのうちのいずれか、または2つ以上のそのような演算の組合せを含む場合がある。RHPA形式を使用すると、桁上げをもたらすNビット演算のステップが同じレーン内に収まることが可能になり、長い値の処理を高速化するのに役立つ。
RHPA表現への変換
図10および図11は、浮動小数点値をRHPA値に変換する例を示す。図10に示されたように、変換は、浮動小数点値の仮数部Fのビットを、RHPA値の対応する非重複ビットにマッピングし、RHPA値は、浮動小数点値の指数部Eおよび実行されるべきRHPA計算用のメタデータ内に定義されたアンカー値に応じて、2つ以上のレーンにまたがる可能性がある。浮動小数点値が負の場合、仮数ビットはRHPAの非重複ビットにそれらをマッピングする際にネゲートされる。一方、RHPA値の重複ビットは符号ビットで満たされる。浮動小数点値が(符号ビットS=0によって示される)正の場合、各レーンの重複ビットVはゼロのはずであり、浮動小数点値が負(符号ビットS=1)の場合、重複ビットVは1に設定される。
図11はより詳細に変換動作を示す。図11は、RHPA値の単一のNビットレーンを生成するための処理動作を示す。RHPA値全体を生成するために、図11に示された演算がレーンごとに(直列実装が使用される可能性もあるが、好ましくは並列で)実行されるはずである。したがって、図11は、たとえば、図6または図8に示された単一のレーン変換ユニット34の演算に対応する。
図11に示されたように、格納された小数Fは、暗黙のビット50を含めることによって実際の仮数部に拡張され、それは、浮動小数点値が正規かつ非ゼロの場合1に等しく、浮動小数点値が非正規またはゼロの場合0に等しい。また、実際の仮数部(1.Fまたは0.F)は、最上位端において「0」に等しいN−V個のビットで埋められる。得られた値は左シフト器52に入力され、左シフト器52は、ビット位置の数Lshiftだけその値を左シフトする。シフト量Lshiftは、変換されている浮動小数点値の指数部E、および処理されている特定のレーン用のレーンアンカー値w[i]に基づいて計算される。
一般に、Lshiftは以下の値に等価な値で計算され、ここでZ=E−B−w[i]+1であり、
・Z≦0の場合(これは、浮動小数点値が生成されるべきレーンのいずれのビットよりも下位である場合である)、Lshift=0であり、
・Z≧N−V+Fsizeの場合(これは、浮動小数点値が生成されるべきレーンのいずれのビットよりも上位である場合)、Lshift=0であり、
・それ以外の場合、Lshift=Zであるが、
ここで、
・Eは浮動小数点値の(バイアスされた)指数部であり、
・Bは、使用されている特定の浮動小数点表現のバイアス値、たとえば、単精度の場合B=127、倍精度の場合B=1023であり、
・w[i]は、生成されている現在のレーンのレーンアンカー値であり、それはそのレーン内の最下位ビットの有効桁を示し、
・Fsizeは、(0または1の暗黙ビットを含むが、N−V個の「0」ビットは含まない)実際の仮数部内のビットの数、たとえば、単精度の場合Fsize=24、または倍精度の場合54であり、
・Nはレーンサイズ(RHPA値の1レーン内のビットの総数)であり、
・Vは重複ビットの数である。
シフト量がこの厳密な演算セットで計算されることは必須ではないことが諒解されよう−等価な結果を与える任意の演算が使用される可能性がある。また、レーンアンカー値w[i]がレーンの最下位ビット以外のビットの有効桁を示す例では、それに応じてZ用の式を調整することができる。
シフト結果54の先頭N−Vビットが選択される。0<Z<N−V+Fsizeの場合、元の仮数部からの少なくとも1ビットがこのウィンドウにシフトされている。シフト結果54の先頭N−Vビットは、最上位端においてV個の重複ビットで埋められる。重複ビットは最初に0に設定される。この値は、元の浮動小数点値の符号ビットSが0であった(浮動小数点値が正であった)場合、現在のレーン用の変換されたNビットレーン値60として出力される。一方、浮動小数点値が負(符号ビット=1)であった場合、その値は62でネゲートされ(すべてのビットを反転し、1を加算する)、結果は変換されたNビットレーン値60として出力される。
要約すると、アンカー値w[i]は、(N−Vに対応するレーン間のアンカーにおける差で)現在のレーンについて関心がある最小ビットの重みを与える。レーンによって表される範囲内の適切な仮数部ビットは、シフト器52を使用して選択される。正の数を変換する場合、重複ビットは0を含み、負の数を変換する場合、シフト結果のNビット2の補数をレーンに格納し、それは重複ビットに1を格納する効果を有する。次いで、この演算は、RHPA値全体を生成するために、レーンごとに並行して実行することができる。
図10および図11は、浮動小数点値のRHPA値への変換を示す。固定小数点値または整数値を変換するとき、指数部が存在せず、上記の式における指数値Eが何らかの既知の値(整数の場合ゼロ、固定小数点値の場合非ゼロ)に効果的に固定され、元の値の中のビット数Fsizeが異なる場合があることを除き、演算は同じである。浮動小数点に関しては、元の値がそのレーンによって表される範囲と重複する場合、仮数部からのビットはNビットレーンの対応するビットにマッピングされるが、固定小数点値または整数値は、(FP数の符号絶対値表現とは対照的に)すでに符号付き数字表現を使用する2の補数なので、ネゲートは不要である。
重複削減
上述されたように、特定のNビットレーンの値が情報を失うように変わる状況であるレーンオーバーフローを心配することなく、少なくとも2V−1個の数を加算することができる。レーンの2番目の最上位重複ビットから桁上げアウトが発生すると、レーンオーバーフローが発生するはずである。情報を失うことを回避するために、レーンオーバーフロー境界またはその付近にいるとき、使用されている重複ビットの数を減らし、必要に応じて重複ビット内の空間を解放してさらなる桁上げを収容するために、重複削減演算を実行することができる。一般に、重複伝搬演算は、第1のRHPA値が第2のRHPA値に変換され、第2のRHPA値の少なくとも1つのNビット部分内の重複ビットは、第1のRHPA値の対応する部分内の重複ビットよりも小さい、任意の演算を含む場合がある。
重複削減を実行する1つの方法は、所与のレーンからの重複ビットが次の最上位レーンに伝搬され、そのレーン内の非重複ビットに加算される、重複伝搬演算を実行することである。重複ビットを次のレーンに伝搬することにより、先行レーン内の重複ビットがゼロに近づけられ、それにより、レーンオーバーフローを引き起こす別の加算の可能性が低減される。重複伝搬演算を実行する様々な方法があり、そのうちの3つが図12〜図14に関して下記に記載される。
図12は、所与のRHPA値が、各レーン内の重複ビットがすべて0であるRHPA値を参照する「非冗長」RHPA値に変換される、重複伝搬演算の第1の例を示す。「非冗長冗長HPA」値の概念は矛盾のように見えるかもしれないが、「非冗長」という用語は、(同じ数値を表す複数の方法を可能にするいくつかの非ゼロ重複ビットを有するRHPA値とは対照的に)すべての重複ビットが0であるRHPA値を使用して所与の値を表す方法が1つしかないという事実を指すために使用される。非冗長RHPA値では、非重複ビットNVは、対応するビットが正規の2の補数の整数値または固定小数点値において有するはずの同じビット値を有する。
図12に示されたように、所与のRHPA値を非冗長にするために、まず、最下位レーンからの重複ビットV[0]のNビット符号拡張バージョンを、次の最上位レーンの(非重複ビットNV[1]および重複ビットV[1]を含む)すべてのNビットに加算して、修正非重複ビットNV’[1]および修正重複ビットV’[1]を含むNビット値を生成するために、最初のNビット加算70が実行される。修正重複ビットV’[1]は、しばしば、元のRHPA値の対応する重複ビットV[1]と同一である可能性があるが、時々、下位レーンからの符号拡張重複ビットV[0]を加算すると、重複ビットへの桁上げ伝搬を生じる可能性があり、修正重複ビットV’[1]に対して異なる値がもたらされる。これが後続の加算が順次実行される理由である。したがって、最終レーンに達するまで、後続のレーンごとに、前の加算で生成された修正重複ビットV’[1]、V’[2]のNビット符号拡張を、次の最上位レーンのすべてのNビットに加算するために、さらなるNビット加算72、74が実行されて、さらなる修正非重複ビットおよび修正重複ビットを生成する。次いで、元のRHPA値から直接マッピングされている最下位レーン内の非重複ビットNV[0]で非冗長RHPA値が形成され、それぞれの加算70、72、74において生成された修正非重複ビットに対応する他のレーン内の非重複ビットNV’[1]、NV’[2]、NV’[3]、および生成された非冗長RHPA値内のすべての重複ビットが0に設定される。
要約すると、数を非冗長にすることは、先行レーンからの符号拡張重複ビットに所与のレーンの非重複ビットを加算し、低次レーンで始まり、高次レーンまで先行し、それらが次のレーンに伝搬された後に所与のレーン用の重複ビットをゼロにすることによって達成される。各加算は前回の加算によって生成された修正重複ビットを必要とするので、これは逐次プロセスであり、そのため、元のRHPA値のベクトルが比較的広い場合、このプロセスは遅くなり得る。
RHPA値を非冗長形式に変換する数値例が、再びV=4およびN=8を用いて下記に示される。
ステップ1:レーン0の重複ビットを符号拡張し、レーン1に加算し、レーン0の重複ビットをゼロにする
ステップ2:新しいレーン1の重複ビットを符号拡張し、レーン2に加算し、新しいレーン1の重複ビットをゼロにする
ステップ3:新しいレーン2の重複ビットを符号拡張し、レーン3に加算し、新しいレーン2の重複ビットをゼロにする
最終的な非冗長値:
図13は、RHPA値を「制限付き冗長」(または「最小冗長」)RHPA値に変換する重複伝搬演算の第2の例を示す。制限付き冗長RHPA値では、任意の所与のレーンにおいて、重複ビットの対応するセットは、+1、0、および−1のうちの1つに対応し、いかなる他の値も取ることができない。すなわち、所与のレーン内の重複ビットVのビットのパターンは、符号付き整数として解釈された場合、+1、0、および−1の値を有する。RHPA値全体における重複ビットVの有効桁を考慮すると、重複ビットは、実際には、+2W、0、または−2Wの値を表し、ここで、Wは次の最上位レーン内の最下位ビットの有効桁である。制限付き冗長形式では、異なるレーンは重複ビットについての異なる値を有することができるが、各レーンは、セット{+1,0,−1}のうちの1つに制限された重複ビットを有する。所与のレーン内の最下位の2つの重複ビットは、それぞれ、+1、0、−1を表す0b01、0b00、0b11であり、V>2の場合、同じレーンのいかなるそれ以上の重複ビットも、そのレーンの2番目の最下位重複ビットに等しくなる。
図13に示されたように、制限付き冗長変換の利点は、重複伝搬演算全体を並列に実行できることである。図13に示されたように、いくつかの並列Nビット加算76が実行され、各々が所与のレーン用の符号拡張重複ビットV[i]を、次の最上位レーンの非重複ビットNV[i+1]に加算する(次の最上位レーン内の重複ビットは0に設定されている)。これらの加算76の各々は、制限付き冗長RHPA値の対応するNビット部分を生成する。制限付き冗長RHPA値の最下位レーンは、単に、元のRHPA値内の最下位レーンの非重複ビットNV[0]を、制限付き冗長値の対応するビットに直接マッピングし、最下位レーン内の非重複ビットをゼロに設定することによって形成される。各レーンは、多くてもそれ自体のレーン内の情報および隣接する低次レーンからの重複ビットを使用して、すべてのステップを並列に処理するので、この方法はベクトルを非冗長にするためのプロセスよりもはるかに高速である。
RHPA値を制限付き冗長に変換する例が下記に示される。
ステップ1:隣接する低次レーンから符号拡張重複値を作成する
ステップ2:各レーンがそれ自体の重複値を0にする
ステップ3:ステップ1および2からの値を加算する
制限付き冗長値:
例6における制限付き冗長値は、セット{+1,0,−1}に限定された重複値を有することに注意されたい。また、制限付き冗長値は、上記に示された非冗長例内の同じ数を表す非冗長値とは全く異なることにも注意されたい。図12の逐次プロセスとは異なり、このタイプの変換は単一サイクルで行うことができる。
数が制限付き冗長になると、レーンオーバーフローを起こすことなく、最低2V−1−2のさらなるFP値を加算することができる。また、レーンオーバーフローを起こすことなく、最低2V−2個の制限付き冗長RHPA値を一緒に加算することもできる。この最後の境界は、他のSIMDユニットまたは他のプロセッサから来たかもしれない部分的な累積を組み合わせる点で興味深い。
図13の制限付き冗長重複伝搬演算では、すべての重複ビットV[i]が0であるレーンを元のRHPA値が有するとき、制限付き冗長RHPA値内の対応するレーンは、そのレーンの非重複ビットNV[i]と次の最下位レーンの重複ビットV[i−1]の加算によって引き起こされる桁上げに起因して、+1または−1を表す重複ビットV’[i]を有する可能性があることに留意されたい。したがって、「重複削減演算」という用語は、すべてのレーンがそれらの重複ビットの大きさを減らさなければならないことを意味せず、いくつかのレーンでは重複ビットの大きさが増える可能性があることが諒解されよう。しかしながら、一般に、重複削減演算は、少なくとも1つのレーンにおける重複ビットの大きさを減らす。
非冗長RHPA値が必要な場合、それは、図12の同じ逐次方法を実行することにより、制限付き重複RHPA値から生成することができる。しかしながら、非冗長RHPA値は、図13に関して説明された方法を使用して、最初に所与のRHPA値を制限付き冗長形式に変換し、次いで、図14に示されたように制限付き冗長値を非冗長RHPA値にマッピングすることによって生成することもできる。この手法の利点は、(図12のような逐次演算ではなく)一連の並列Nビット演算で非冗長RHPA値を生成できることである。
一般に、図14に示された方法は、非冗長形式に変換されるべき制限付き冗長RHPA値に基づいて、重複値および非重複値を生成する。重複値は、(各ビットの符号および相対的な有効桁を考慮に入れて)制限付き冗長RHPA値のすべての重複ビットの合計を表し、非重複値は、(ここでも、それらの符号および有効桁を考慮に入れて)すべての非重複ビットの合計を表す。図14のパートEに示されたように、重複値および非重複値が加算されて非冗長RHPA値を生成し、加算は並列加算器78によってNビットチャンク内で実行される。各加算器78は、非冗長RHPA値の対応する部分を生成するために、重複値および非重複値の完全なMビット加算が実行された場合、次の最下位レーンから伝搬するはずの桁上げ値を表す桁上げビットCとともに、非重複値および重複値の対応するNビット部分を加算する。
図14のパートEに示されたように、非重複値は、単に、0に設定された任意の重複ビットVを有する制限付き冗長RHPA値に対応する(上述されたように、先頭レーンはいかなる重複ビットももたないものとして扱うことができるので、非重複値において同じままであってもよい)。
(ここでも、N=8およびV=4を用いて)上記に示された制限付き冗長RHPA値を例として取り上げる:
対応する非重複値は以下のようになる。
一方、重複値の生成は、重複ビットのセットのうちのいくつかが−1を表す可能性があり、そのため、これらのビットの合計が+1または0を表す重複ビットの合計から減算されるので、もう少し複雑である。たとえば、制限付き冗長RHPA値では、以下のようになる。
重複ビットは以下を表すが、
これらは、以下のように、非重複値の次の最上位レーンに対する調整を示す。
(制限付き冗長RHPA値のレーン1内の重複ビットは、実際には、たとえばレーン2に対する調整値を表すことに留意されたい)。実際上、重複ビットは、+1、0、または−1の符号付き数字を有する高基数の2の補数値を表すことがわかる。たとえば、(レーン3に加算されるべき)制限付き冗長RHPA値のレーン2内の重複ビットは、1*2^w[3]を表す(ここで、w[3]はレーン3の最下位ビットの重みである)。同様に、制限付き冗長RHPA値のレーン1内の重複ビットは、−1*2^w[2]を表す、などである。
したがって、すべての重複ビットの合計に等価な2の補数値は、0または+1を表す重複ビットの合計から、−1を表す重複ビットの合計を減算することによって計算することができる。
例A:
(重複ビットが0または+1を表すレーン内の重複ビットの合計)
(重複ビットが−1を表すレーン内の重複ビットの合計)
(第2の値をネゲートした)等価加算として表されるものは、
である。
実際には、制限付き冗長RHPA値の場合と同様に、重複値の各セットは値−1、0、および+1しか取ることができず、レーン当たり最下位2重複ビットのみを考慮する必要があり(値0b11、0b00、または0b01のうちの1つを取る)、すべての他の重複ビットはレーンの2番目の最下位重複ビットに等しくなる。
したがって、図14のパートBに示されたように、レーン当たり2ビットしか考慮する必要がない。図14のパートBの左側に示されたように、第1の値VHR+は、最下位レーン以外の各レーンに対応する1対のビットを含めて形成され、ペアごとに、
−ペアの上位ビットは0に等しく、
−対応するレーン内の重複ビットが−1または0を表す場合、ペアの下位ビットは0に等しく、対応するレーン内の重複ビットが+1を表す場合、1に等しい。
この手法が上記の例に適用された場合、第1の値VHR+は、例Aに示された最上位値において太字で示されたビットと等価になることに留意されたい。
同様に、図14のパートBの右側に示されたように、第2の値VHR−は、(最下位レーンを除く)レーン当たり1対のビットを含めて形成することができ、ペアごとに、
−ペアの上位ビットは0に等しく、
−対応するレーン内の重複ビットが+1または0を表す場合、ペアの下位ビットは0に等しく、対応するレーン内の重複ビットが−1を表す場合、1に等しい。ここでも、これは、上記の例Aに示された最下位値において、(太字で示された)レーン当たり最下位2ビットを効果的に表すことに留意されたい。
次いで、第2の値VHR−は、重複値の対応する2ビット部分V’[0]、V’[1]、V’[2]を生成するために、第1の値VHR+から減算することができる(またはVHR+は、VHR−の2の補数に加算することができる)。これらの2ビット部分の各々は、重複値の対応するレーンの最下位2ビットと等価である(上記の例Aの重複値において太字で示されたレーン当たり2ビットを参照)。次いで、図14のパートEに示された重複値の対応するNビット部分を生成するために、各2ビット部分を符号拡張(先頭ビットが0の場合0で拡張し、先頭ビットが1の場合1で拡張)することができる。
パートA、C、およびDは、パートEにおける加算の対応するレーンに加算するための桁上げビットC[1]〜C[3](桁上げビットC[0]は常に0)を決定するための桁上げ先見方式を示す。
パートAに示されたように、最下位レーン以外の制限付き重複RHPA値のレーンごとに、非重複ビットNV[1]、NV[2]、NV[3]を検査するために、ロジック82が提供される。所与のレーンNV[i]用のロジック82は、対応する非重複ビットパターンNVP[i]を決定し、これは以下のビットパターンのうちの1つを示す。
・Propagate(p)−NV[i]のすべてのビットが1のとき
・NV[i]のすべてのビットが0である場合のKill(k)
・NV[i]の最下位ビットが1であり、すべての他のビットが0である場合のGenerate(g)
・NV[i]の最下位ビットが0であり、すべての他のビットが1である場合のDouble(d)
・任意の他のビットパターンに対応するUninteresting(u)。
元の制限付き冗長RHPA値に対して演算するのではなく、ビットパターン識別ロジック82は、パートEに示された非重複値内の非重複ビットのセットに適用される可能性もあることが諒解されよう。したがって、一般に、非重複ビットの各セットのビットパターンが識別される。
同様に、図14のパートCに示されたように、重複値のビットのペアを生成すると、ビットパターン識別ロジック82は、非重複値に関するのと同じ方法で、ビットの各ペアを、p、k、g、dのうちの1つとして分類する(重複値の場合、比較されるビットが2ビットしかないので、「興味のない」ケースuを有することは可能ではない)。ここでも、以前よりむしろ、ビットのペアを符号拡張して、パートEに示された完全な重複値を形成した後に、ビットパターン識別ロジック82を適用することは可能であるが、依然として、重複値の所与のレーンの第2のビットよりも上位のすべてのビットが第2のビットと同じ値を有するので、「興味のない」ケースuが生じる可能性はない。
ビットパターン識別ロジック82によって識別されたそれぞれの重複ビットパターンおよび非重複ビットパターンは、条件p、k、g、d、uのうちのどれが検出されたかを識別するために符号化されたマルチビット信号を使用して、または条件p、k、g、dのうちの1つに各々が対応する一連の1ビットの指示、およびその条件が検出されたかどうかを識別することによって表される可能性がある(uは条件p、k、g、dのうちのいずれかの不在によって表される可能性がある)。一般に、ビットパターン識別ロジック82は、(たとえば、ANDゲートおよびNORゲートを使用して)上記で説明された条件を判定するための一組のロジックゲートを含む場合がある。
図14のパートDに示されたように、最下位レーン以外のレーンごとに、桁上げ先見回路84は、そのレーン内の非重複ビットの非重複パターンNVP[i]および次の最下位レーン内の重複ビットの重複パターンVP[i−1]の指示を受け取り、これは、以下の表に従って、レーン生成信号giに、最下位レーンおよび2番目の最下位レーン以外のレーンの場合、レーン伝搬信号piにマッピングされる。
ここで:
・「G」とラベル付けされた場合、レーン生成信号gi=1およびレーン伝搬信号pi=0である
・「P」とラベル付けされた場合、レーン生成信号gi=0およびレーン伝搬信号pi=1である
・「K」とラベル付けされた場合、レーン生成信号gi=0およびレーン伝搬信号pi=0である
次いで、レーン生成信号およびレーン伝搬信号がプレフィックスロジック86に入力され、プレフィックスロジック86は、5つ以上のレーンが存在する場合、以下の式に従ってレーンごとに桁上げビットC[i]を生成する:
・C[0]=0
・C[1]=g1
・C[2]=g2 OR (p2 AND g1)
・C[3]=g3 OR (p3 AND g2) OR (p3 AND p2 AND g1)
などである。
本質的に、各レーン内の重複値および非重複値のビットパターンを調べることにより、そのレーンへの桁上げがあった場合、桁上げアウトが存在するかどうかを判定することができ、したがって、各桁上げビットCは、実際に加算を順次実行する必要なしに決定することができる。これにより、加算が連続して実行された場合と同じ結果を与えるために、パートEがいくつかの並列加算78を実行することが可能になる。
レーンごとの図14の演算はほとんど並列に実行することができるので、比較的広いベクトルの場合、最初に図13の制限付き冗長変換を実行し、次に図14の非冗長変換を実行することによって重複伝搬を実行することは、図12に示された非冗長プロセスを実行することよりも高速であり得る。
この重複伝搬方法のさらなる詳細は、下記の付録Bに提供される。
重複削減演算はまた、図15に示されたような重複累積演算を含む可能性もある。RHPAアキュムレータレジスタ90に格納されるべきRHPAアキュムレータ値を生成するために一連の累積を実行するとき、重複アキュムレータ値を格納するために第2のレジスタ92も割り振られる。図15に示されたように、重複アキュムレータレジスタ92は、入力オペランドをRHPAアキュムレータレジスタに累積することを開始する前に、最初に0に設定される。
重複削減が必要であるとき、RHPAアキュムレータ値からの重複ビットの各セットが符号拡張され、重複アキュムレータレジスタ90の対応する部分に加算される、重複累積演算94が実行される。RHPAアキュムレータレジスタ90の重複ビットはゼロにされ、次いで、オーバーフローのリスクなしに、RHPAアキュムレータレジスタ90へのさらなる累積を実行することができる。
RHPAアキュムレータレジスタ90が再びレーンオーバーフローのリスクがあるポイントに達した場合、RHPAアキュムレータ値からの符号拡張重複ビットを、重複アキュムレータ値の対応する部分の以前の内容に再び加算するために、別の重複累積演算94を実行することができる。
したがって、重複アキュムレータ値は、RHPAアキュムレータの各レーン内に生成された重複ビットの中間合計を効果的に保持し、RHPAアキュムレータが重複ビットを使い尽くし始めるたびに、これらのビットが重複アキュムレータ値に加えられ、その結果、RHPAアキュムレータの重複ビットをゼロにすることができる。重複アキュムレータ値は、(RHPAアキュムレータ内のようにVビットのみではなく)重複値を追跡するために利用可能なレーン当たりすべてのNビットを有するので、RHPAアキュムレータレジスタ90および重複アキュムレータレジスタ92の組合せからの情報を失う任意のリスクがある前に、RHPAアキュムレータへの非常に多数の累積を実行することができる。
RHPAアキュムレータレジスタ90への最終的な累積が完了すると、以下の3つのベクトルを加えることにより、RHPA形式で最終合計96を計算することができる。
・重複ビットが0にクリアされた最終RHPAアキュムレータ値に対応するベクトル97
・最下位レーンが0であり、各後続レーンが最終RHPAアキュムレータ値における次の最下位レーンからの重複ビットV”の符号拡張であるベクトル98
・最下位レーンが0であり、各後続レーンが重複アキュムレータレジスタ92内の次の最下位レーンの値に対応するベクトル99。すなわち、重複アキュムレータレジスタ92は、ベクトル99を生成するためにNビット左シフトすることができる。ベクトル99の各要素は、任意の以前の重複累積演算94において重複アキュムレータレジスタに加算されたすべての重複ビットの合計を表す。
最終合計96は、上述されたようにいくつかの並列Nビット加算回路ユニットを使用して、Nビットチャンク内で実行することができる。最終合計96は、図7の例のように3:2の削減および桁上げ伝搬加算を使用することにより、または通常のNビット加算器を使用して2つの連続する2入力整数加算を実行することにより、単一演算において計算される可能性がある。
重複伝搬に比べて重複累積演算の利点は、重複累積演算のために実行される処理が完全にレーン内に留まり、1つのレーンの重複ビットを別のレーンに伝搬するために必要とされるようなレーン間のデータのシフトがないことである。重複累積手法では、レーン間でデータをシフトすることは、各重複累積演算94ではなく、累積全体に対して一度実行されるはずの最終合計96の計算中にのみ必要とされる。
重複累積演算の別の利点は、(たとえば、多くの大きな数を加算することにより)全体としてRHPAベクトルをオーバーフローさせるが、次いで後に、(たとえば、大きな数を減算することにより)後続の累積の結果として範囲内に戻る合計が、(事実上高次レーンが重複ビットを得るので)情報の損失なしに正しく計算されることが可能になることである。
一方、重複累積演算は、重複アキュムレータ値を格納するために第2のレジスタが割り振られることを必要とする場合があるので、レジスタ圧が累積当たり2つのレジスタを提供するのに十分なレジスタがないことを意味する場合、情報がRHPAアキュムレータと同じレジスタ内に保持されるように、レーン間で重複ビットを伝搬することができる重複伝搬演算が好ましい場合がある。
したがって、重複削減は、重複伝搬または重複累積のいずれかによって達成される場合がある。
2V−1を超える浮動小数点値(Vは先頭レーン以外の任意のレーン内の最小重複ビット数である)を累積したい場合があり、この場合、レーン間のオーバーフローを回避するために、重複削減演算が周期的に必要とされる場合がある。どちらの重複削減方法が使用されるかにかかわらず(重複伝搬方法および重複累積方法のうちのいずれも実行される可能性がある)、プロセッサは、様々な方法で重複削減演算をいつ実行するかを決定することができる。たとえば、これをいつ行うかを決定する3つの方法は以下を含む:
(1)累積された値の数をカウントし、k回の加算または減算のたびに重複削減を行う(ここで、非冗長形式に変換する重複累積演算または重複伝搬演算を使用する場合、k≦2V−1−1であり、制限付き冗長形式に変換する重複伝搬演算を使用する場合、k≦2V−1−2である)。
(2)最大の正値(0b0111…)もしくは最大の負値(0b1000…)、または、ほぼ最大の正値もしくはほぼ最大の負値について重複ビットを調べることにより、レーンオーバーフロー状態に近いことを検出する。これらの状態が検出されると、重複削減を実行する。サイクル当たり2つ以上の値がアキュムレータレジスタに累積される場合、オーバーフロー危険検出は、サイクル当たり1つの値しか累積されないときよりも早く重複削減演算をトリガする必要があり得る−たとえば、重複ビットが(2つの増分または減分がレーンオーバーフローにつながる可能性があるような)0b011…110または0b100…001を表すとき、オーバーフロー削減がトリガされる可能性があるサイクル当たり2つの値が累積される。したがって、一般に、処理回路は、重複ビットがある所定の値を超えたときを検出し、次いで重複削減演算をトリガすることができる。
(3)高次重複ビット(符号ビット)からの桁上げインおよび桁上げアウトを調べることにより、実際のレーンオーバーフローがあることを検出する。しかしながら、オーバーフローしていない状態に戻るために、これはいくつかの追加ロジックを必要とする場合がある。
方法(1)に比べて方法(2)および(3)の理論的利点は、(1)のための計数方法が悲観的でなければならないことである。特に混合符号値を累積するとき、レーンオーバーフローのいかなる危険にもさらされる前に、2V−1を超える多くの累積が存在する可能性がある。一方、制限付き冗長形式への変換は非常に安価である(一部の実装では1サイクルで行うことができる)ので、実際には(1)が最もパフォーマンスが高い方法になる可能性が高い。
上記の例では、重複削減演算は、RHPA値への累積とは別に実行される。しかしながら、RHPAアキュムレータに別のRHPA値を加算するのと同時に、重複伝搬演算を実行することも可能である。
図16に示されたように、第1のRHPA値R1が制限付き冗長形式であるとき、第1のRHPA値R1と、入力オペランド(たとえば、浮動小数点値FP)をRHPA形式に変換すること(変換は、図10および図11について上述されたように実行することができる)によって生成された第3のRHPA値R3との和に対応する第2のRHPA値R2を生成するために、重複伝搬を実行することができる。制限付き冗長RHPA値R1は、2つのベクトル:第1のRHPA値R1のすべての重複ビットが0に設定された非重複ベクトルRNV、および最下位レーンが0である重複ベクトルRVにマッピングされ、他のレーンは、第1のRHPA値R1の先行レーンの重複ビットの符号拡張に設定される。
次いで、いくつかの3入力Nビット加算が並列に実行されて、第2のRHPA値R2の対応するNビット部分を生成するために、非重複ベクトルRNV、重複ベクトルRV、および第3のRHPA値R3の対応するNビット部分を加算する。これらの加算は、図7のように3:2の削減および桁上げ伝搬を使用して1ステップで、または標準の2入力加算器を使用して2ステップで実行される可能性がある。
次いで、第2のRHPA値R2は、異なる入力オペランドとの次の累積のための第1のRHPA値R1として使用することができる。
したがって、この手法では、累積とは別個の明確な重複伝搬演算を実行する必要はない。代わりに、別の値が累積されるたびに、制限付き冗長形式でRHPA値を保持するために重複伝搬を実行することもできる。したがって、この手法は、重複削減が必要な時点を追跡する際にオーバーヘッドを発生させる必要性を排除することができる。
図36〜図39は、RHPA変換された入力オペランドR3を、ベクトルRNV、非重複ビットに対応するRV、および制限付き冗長RHPA値の重複ビットに加算することが、制限付き冗長でもある別のRHPA値を生成する理由を説明する。浮動小数点数を変換し、制限付き冗長アキュムレータに加算していると仮定する。図36は、3つのレーンにわたって配置された2つのオペランドを示す。制限付き冗長RHPA数の先頭重複部分内のビット「s.ext」は、RHPA数が重複ビットにオーバーフローしていないことを示す。FP数の「s.ext」ビットおよび変換後のRHPAの先頭レーンは、0または−1のいずれかであり得るし、どちらの場合も、「s.ext」ビットが−1の場合、非重複ビットは非ゼロでなければならない(図37参照)。
次に、重複ビットを制限付き冗長RHPA数から1レーン左にシフトし、重複ビットを0にリセットする(図38参照)。最後に、レーンごとの加算を実行すると、図39に示されたように、制限付き冗長結果が残る。レーン0では、重複ビットは、入力FP数が正であり、その加算が桁上げアウトを引き起こす場合、+1として終了する可能性がある。レーン1では、シフトアップされた重複部分内の−1がFP数の非重複部分内の正のビットによって同化されるはずなので、FP変換が−1(の符号拡張)を残す場合、重複において−2を得ることはできない。同様に、2つの非重複部分を加算することが+1の桁上げを引き起こす可能性がある場合、レーン0からのシフトアップされた+1は第2の桁上げを引き起こす可能性はなく、逆もあり得るので、レーン1の重複において+2を得ることはできない。最後に、同じ理由で、レーン2の重複部分において−2を得ることはできない。しかしながら、オーバーフローがある場合に限り+1を得る可能性があり、また、レーン2の重複における−1は、次にオーバーフローを示す可能性がある。
したがって、FPの値および制限付き冗長RHPA値にかかわらず、加算の結果は依然として制限付き冗長である。FP値とアキュムレータとの加算および制限付き冗長重複伝搬を同時に実行するために図16の手法が使用されるとき、制限付き冗長値についての可能な重複値{+1,0,−1}は、2つの重複ビットのみで表すことができるので、(2番目の最下位重複ビットよりも上位のいかなるビットも、2番目の最下位重複ビットと同じ値を有するはずなので)レーン当たり3つ以上の重複ビットを提供する必要はないことに留意されたい。したがって、レーン当たりより多くのビットを非重複ビットとして使用することができ、所与のベクトル長を使用して表現され得る数値範囲が増大する。
RHPA表現からの変換
図17〜図19は、RHPA値を浮動小数点値に変換するための様々な技法を示す。一般に、RHPA値がすでに非冗長形式(図17もしくは図19)または制限付き冗長形式(図18)ではない場合、これが浮動小数点への変換を実行するより前のケースであることを保証するために、重複削減演算が実行される。
図17に示されたように、RHPAが非冗長形式で、N−V≦Fsize(ここで、Fsizeは暗黙の1ビットを含む、生成されるべき浮動小数点形式で格納された仮数部のビット数である)であるとき、各レーンの非重複ビットは、1つの浮動小数点値の仮数部内にちょうど収まるので、丸めに起因する情報のいかなる損失もなしに、非冗長RHPA値の対応するレーンに等価な浮動小数点値を含むベクトルの各要素を使用して、浮動小数点値の対応するベクトルを生成することができる。
したがって、最上位レーン以外の非重複ビットNV[i]の各レーンについて:
・N−V個の非重複ビットは、正規化されていない浮動小数点の仮数部の先頭N−Vビットに直接マッピングされる。Fsize>N−Vの場合、仮数部の最下位(Fsize−(N−V))ビットはゼロである。
・そのレーン用の指数部E[i]は、E[i]=w[i]+N−V−1+Bと等価に設定され、ここで、w[i]は(レーンの最下位ビットの有効桁を示す)そのレーン用のアンカー値であり、Nはレーンサイズであり、Vは重複ビットの数であり、Bは使用される浮動小数点表現のためのバイアス量である。
・(非冗長RHPA値では、先頭レーン以外のすべてのレーン内の重複ビットは、残りの非重複ビットについての正の値を示す0になるので)符号ビットSは0である。
一方、最上位レーン(この例ではNV[3])について:
・最上位非重複ビットが(RHPA値が全体として負であることを示す)1である場合、非重複ビットNV[3]はネゲートされて、正規化されていない仮数部の対応するビットNV’[3]が形成される。最上位非重複ビットが(正のRHPA値を示す)0である場合、非重複ビットNV[3]は、正規化されていない仮数部の対応するビットNV’[3]に直接マッピングされる。Fsize>N−Vの場合、仮数部の最下位(Fsize−(N−V))ビットはゼロである。
・指数部E[3]は、他のレーンの場合と同じように設定されるが、先頭レーン用のレーンアンカー値w[3]に基づいて設定される。
・符号ビットSは、先頭レーンの最上位非重複ビットに等しい。
各レーンの仮数部内の先頭「1」ビットが仮数部の最上位ビット以外のビット位置にある可能性があるので、これにより、正確であるが正規化されていない浮動小数点値のベクトルが生成される。したがって、レーンごとに、正規化回路100は、所与のレーンの仮数部をシフトして、最上位ビット位置に先頭「1」ビットを置き、それに応じて指数部Eを調整し、次いで、格納された浮動小数点表現内で暗黙の先頭「1」ビットを破棄して、正確で正規化された浮動小数点値を生成する。値が非正規である場合、指数部Eは0に設定される。
場合によっては、次いで、正確で正規化された浮動小数点ベクトルを、変換の結果として出力することができる。これは望ましい場合があり、その結果、浮動小数点形式に変換した後でも、元のRHPA値の向上した精度を保持することができる。
しかしながら、元のRHPA値と(少なくともほぼ)等価な単一の浮動小数点値に変換するために、(図17の下部に示されたように)ベクトルの浮動小数点要素を一緒に加算し、丸めて、最終的な浮動小数点結果を生成することができる。
上述されたように、浮動小数点加算は結合的ではなく、浮動小数点要素が加算される順序は最終結果に影響を与える。最終結果がRHPA値とほぼ等価であれば十分である場合、任意の順序で値を加算することが許容される場合がある。
しかしながら、RZ、RP、RM、RNA、またはRXのうちの1つの丸めに従って丸めたときに正しく丸められた結果を提供するために、浮動小数点要素は、最下位要素から始まり最上位要素で終わる順序で加算することができる。たとえば、4つの浮動小数点要素では、これらは((FP0+FP1)+FP2)+FP3のように加算されるはずであり、ここで、括弧の所与のセットの内側に示された加算は、括弧の外側の次の項を加算する前に実行されるはずである。FP数が高次レーンから低次レーンに加算された場合、各加算の後に丸め値を生成する丸め増分が存在する可能性があり、これにより、実行される増分が多過ぎることにつながる場合がある。たとえば、スティッキービットを含む最高次の数でRPの丸めを実行するとき、スティッキーの故にFPの結果はすでに増分されているが、それに加算された各低次のFP数で再び増分する。1024ビットの実装では、正しい値を計算した後にFP値を15回増分するかもしれない。この問題は、低次要素FP0およびFP1を最初に加算し、次いで、先頭要素FP3に達するまで、後続の加算における次の最上位要素において続けて加算することによって回避することができる。
RNEの丸めの場合、このように浮動小数点要素を加算すると、いつも正確に丸められた結果が得られるとは限らない場合がある。おおよその結果だけが必要な場合、これは問題ではないかもしれない。しかしながら、正確に丸められた結果が必要な場合、下記の図19に関して記載される方法を代わりに使用することができる。
図18は図17と同様の演算を示すが、元のRHPA値が最初に制限付き冗長形式に変換されている(またはすでに制限付き冗長であった)場合である。この場合、N−V個の非重複ビットに加えて、最下位重複ビットも所与のレーンについて生成された対応する浮動小数点値の仮数部に寄与するので、この手法はN−V≦Fsize−1であるときに機能する。また、制限付き冗長RHPA値の場合、レーンの各々は+1または−1の値を表す重複ビットを有する可能性があるので、レーンの各々は(図17の非冗長RHPAの例における先頭レーンと同様に)符号付きの値として扱われる。
したがって、各レーンiについて:
・N−V個の非重複ビットNV[i]およびそのレーンの最下位重複ビットV[i]は、正規化されていない浮動小数点仮数部の先頭N−V+1ビットにマッピングされ、そのレーン内のV[i]の2番目の最下位重複ビットが(負のレーンの重み付けを示す)1の場合、ネゲートが適用される。Fsize−1>N−Vである場合、仮数部の最下位Fsize−1−(N−V)ビットはゼロである。
・そのレーン用の指数部E[i]は、E[i]=w[i]+N−V+Bと等価に設定され、ここで、w[i]は(レーンの最下位ビットの有効桁を示す)そのレーン用のアンカー値であり、Nはレーンサイズであり、Vは重複ビットの数であり、Bは使用される浮動小数点表現のためのバイアス量である。重複部分からの追加ビットを考慮するので、この場合の指数部は図17の場合よりも1だけ高いことに留意されたい。
・レーンごとの符号ビットS[i]は、対応するレーン内の重複ビットV[i]の2番目の最下位ビットと等しい。
ここでも、結果として生じた正規化されていない浮動小数点値が正規化されて、正確で正規化された浮動小数点値のベクトルが生成され、ベクトルは、図17と同様に一緒に加算されて、最終的に丸められた浮動小数点値が生成される。
図17および図18に示された技法の利点は、変換がほとんど、並行して各レーンをそれぞれの浮動小数点値に変換し、次いで加算することができる、並列プロセスであることである。図17および図18の例は、先頭レーンが、他のレーンと同様にV個の重複ビットを含むものとして扱われる対称性のためであることを仮定する。
(図17の場合)N−V>Fsizeまたは(図18の場合)N−V>Fsize−1である場合、図17または図18に示された方法はまだ実行される可能性があるが、この場合、浮動小数点ベクトルは、元のRHPA値の対応する要素に正確に対応しない、丸められた浮動小数点値のベクトルのはずである。これは、非重複ビットの数が1つの浮動小数点値の仮数部よりも大きいレーンが存在するためであり、そのため、これらをそれぞれの浮動小数点値に変換することは丸めを必要とするはずである。この場合、FPベクトルはもはやRHPA値を正確に表さないが、図17および図18と同じようにそれぞれのFP要素を加算して、最終的に丸められたFP値を生成することは、RNE以外のすべての丸めモードに対して正確に丸められた結果をまだ与えることができる。
あるいは、図19に示されたように、RHPA値を浮動小数点値FPに変換する異なる手法を使用することができる。これは、RNEの丸めが使用されている場合に特に有用である。この方法は、RHPA値が最初に非冗長形式に変換されている(またはすでに非冗長であった)と仮定する。図19に示されたように、非冗長RHPA値の最上位ビットは、浮動小数点値FPの符号ビットSに直接マッピングされる。
浮動小数点値の仮数部Fを生成するために、以下のように一連の演算が実行される。非冗長RHPAベクトルViの最上位ビットが1である(すなわち、RHPA値が負である)場合、ステップ170において、値全体がネゲート(反転し、1を加算)されて、修正ベクトルVi’が生成される。正の値の場合、RHPAベクトルViはネゲートされず、変わらないままである(Vi’=Vi)。したがって、修正ベクトルVi’は、少なくとも1つの先行ゼロを有するので正の値を表す。修正ベクトルVi’の最上位レーンから始めて、仮数部生成演算が要素ごとに順次実行される。最上位要素のための処理レーンは、その要素内の最初の非符号ビット(すなわち、1の最初のビット値)を検索する。この例では、レーン3内の上位要素は非符号ビットを含まないので、処理は次のレーン2に移動する。
要素2についての処理は、1の非符号ビットを識別し、(重複ビットを含まない)非符号ビット1に先行するゼロの数を表す先行ゼロカウントLZCを決定する。次いで、部分仮数部が対応するデータ要素Vi’[2]のkビットから形成され、ここで、k=min(N−V−LZC、Fsize)であり、Fsizeは(暗黙のビットを含む)生成されるべきFP値の仮数部内のビット数であり、LZCは先行ゼロカウントである。kビットの部分仮数部の値は、仮数部についてさらに取得されるべき残りのビット数の指示(Fsize−k)、ガードビットG、およびスティッキービットStとともに出力される。N−V−LZC>Fsizeである場合、ガードビットGは、部分仮数部のために取られたビットの右側1桁の要素Vi’[2]のビットに等しく、N−V−LZC<=Fsizeである場合、G=0である。同様に、N−V−LZC>Fsize+1である場合、スティッキービットStは、ガードビットGの右側の要素Vi’[2]の任意のビットのビット論理和に等しく、そうでない場合、スティッキービットSt=0である。
次いで、処理は要素Vi’[1]用の次のレーンに移動し、そこで、別の部分仮数値が生成される。要素Vi’[1]の非重複ビットの上位部分は部分仮数部として選択され、ビットの数は、前のレーンから出力された値Fsize−kに対応して取られる。このレーンはまた、ガードビットGおよびスティッキービットStの値を更新し、ガードビットGは、部分仮数部用に取られた最下位ビットの右側の1桁の要素Vi’[1]のビットに等しく、スティッキービットStは、ガードビットGよりも下位の任意のビットのビット論理和に対応する。最下位要素Vi’[0]のための処理レーンは、上位レーンからスティッキービットStを受け取り、要素Vi’[0]のすべてのビットを前のレーンからのスティッキービットStと論理和することによってそれを更新する。
次いで、レーン2および1に対して生成された部分仮数部は、連結されて仮数値Fを形成する。仮数部は、任意の所望の丸めモードを使用して、ガードビットGおよびスティッキービットSの値に基づいて丸められる。浮動小数点値FP用の格納された仮数部は、次いで、丸められた仮数部の最上位ビットを無視して、丸められた仮数値から取得され、それは浮動小数点表現において暗黙である。
一方、浮動小数点値用のバイアスされた指部数Eは、
E=w[j]+N−V−LZC+B
のように決定され、ここで、w[j]は最上位非符号ビットが見つかったデータ要素Vi’[j]の最下位ビットの有効桁(たとえば、図19に示された例において要素w[2]用のアンカーポイント値によって示された有効桁)であり、Nはレーンサイズであり、Vは重複ビットの数であり、LZCは先行ゼロカウントであり、Bは使用されている浮動小数点表現のためのバイアス値である。
Fsize≦N−Vである場合、図19の例のように、多くても2つの隣接するデータ要素だけが丸められていない仮数部Fに寄与するビット値を含むことができ、他のレーンは符号ビットのみを含むより上位のレーンか、またはスティッキービットStのみに寄与するより下位のレーンのいずれかである。また、レーン内の最初の非符号ビットの位置に応じて、1つのレーン内のビット値から丸められていない仮数部が完全に形成され得ることも可能である。Fsize>N−Vであるとき、丸められていない仮数部Fが、ベクトルの3つ以上の隣接するデータ要素から選択されたビットから形成されることは可能であり得る。
RHPA値は、生成されるべき固定小数点形式または整数形式のビットと等価な有効桁のビットを単に選択することにより、固定小数点値または整数値にマッピングすることもできる。ただし、RHPA値が使用されている固定小数点形式または整数形式で表現可能な範囲外であるとき、これは時々オーバーフローまたはアンダーフローにつながる場合がある。したがって、RHPAと浮動小数点との間で変換することがより一般的であり得る。
図17〜図19に示された変換は、所与のRHPA値を入力オペランドとして取り、それを(必要に応じて最初にRHPA値を非冗長形式または制限付き冗長形式に変換することを含む)別のフォーマットの等価な値に変換する専用変換命令に応答して実行される場合がある。あるいは、変換動作は別の動作の一部であってもよい。たとえば、算術命令(たとえば、加算または乗算)は、RHPA値を使用して何らかの処理動作を実行し、その結果を浮動小数点、整数、または固定小数点などの別のフォーマットに逆変換するようにプロセッサを制御することができる。
乗算
図20は、RHPA形式を使用して2つの比較的長い整数の乗算を高速化する例を示す。RHPAがないと、乗算は一連の部分積の順次加算を必要とする場合があり、比較的長い入力の場合は遅くなる可能性がある。RHPAを使用することにより、部分積は、部分積のそれぞれのチャンク上で動作する並列加算を使用する単一演算で加算することができる、なぜなら、どの桁上げも重複ビット内に収容できるからである。これにより、(RHPA形式の)積がより高速に生成されることが可能になる。
たとえば、整数値が非冗長形式の2つのRHPA値A=(a2,a1,a0)およびB=(b2,b1,b0)にマッピングされ、各Nビット数字がVビットの重複を有する(たとえば、N=64およびV=10では、整数AおよびBが各々3×54=162ビットを有するはずである)場合、A×Bは以下のように計算することができる。
このベクトル×ベクトルの乗算は、ベクトル×要素の演算のシーケンスとして実装される可能性がある。命令MULは、2つの入力オペランドの積の下半分を計算し、命令MULHは、2つの入力オペランドの積の上半分を計算する。したがって、部分積行列は以下のようになるはずである。
元のオペランドaおよびbが、レーン当たりNビットを有するベクトルレジスタで利用可能である(たとえば、ベクトルレジスタが連続した負荷動作または同様の動作を格納された)場合、動作は、オペランドbの選択された要素(b0、b1、またはb2)を乗算ステップごとの所望のレーンに「スプラット」する必要があるはずであり、他のレーンは要素の少なくとも1つに「0」を含む。この「スプラット」動作のために専用の命令が提供される可能性があり、または、これはbの適切な要素を選択するための他の命令、次いでゼロ化を実行するマスクとのANDで実現される可能性もある。(「スプラット」を保存するために)乗算後、または(レーン間の移動データを保存するために)乗算前にシフトを行うことができる。
部分積を加算し、結果をRHPA形式で生成すると、積は(最初に非冗長RHPAに変換し、次いでベクトルを整数形式にまとめ直し、重複ビットを除去することにより)整数値に逆変換することができる。これは、専用命令または一連のシフトのいずれかを使用して行うことができる。あるいは、RHPA積の値は、整数に逆変換するのではなく、RHPA形式でさらに処理される可能性がある。
レーン位置情報
上述されたように、RHPA値の加算は、いくつかの並列加算回路ユニットを使用して効率的に実行することができる。通常、所与の実装のためのハードウェアは、所与の合計ベクトルサイズをサポートする特定の数の加算回路ユニット、たとえば、512ビットのハードウェア内の合計ベクトルサイズを与えるはずである、各々が64ビット加算を実行するための8つの並列加算ユニットを提供することができる。しかしながら、所与のRHPA値についての望ましい範囲は、実装されたベクトルサイズ、たとえば256ビットまたは1024ビットよりも大きくても小さくてもよい。RHPA値が実装されたベクトルサイズよりも小さいとき、2つ以上の別々のRHPA値が1つのベクトル内に収まることができ、それにより、ハードウェアによって提供される処理レーンの異なるサブセットにより、2つ以上の別個の演算が並列に処理されることが可能になる。
たとえば、図21に示されたように、64ビット加算器の8レーンを使用して、512ビットベクトルハードウェア実装のそれぞれの半分内に、2つの256ビットアキュムレータを並列に累積することができる。同様に、実装されたハードウェアベクトルサイズよりも大きいRHPA値を計算するために、1つの命令がより大きなRHPAアキュムレータの下半分の処理をトリガすることができ、ハードウェアの第2のパスにおいて、アキュムレータの上半分を処理することができる。
しかしながら、所与のRHPA値の最下位レーンおよび最上位レーンは、中間レーンとは異なるように処理される必要があるかもしれない。たとえば、所与のRHPA値の最上位レーンの場合、高次レーンからのオーバーフローが真のオーバーフロー条件、すなわち、より大きなアンカー値またはより大きなアキュムレータでの再計算を必要とするエラーなので、レーンオーバーフローは異なるように扱われるかもしれないが、他のレーンからのオーバーフローは、重複伝搬が必要であり得ることを示すに過ぎない。一方、重複伝搬中に、最下位レーンは、それに加算されるべき低次重複ビットが存在しない(たとえば、最下位レーンが単に元のRHPA値から直接マッピングされ、加算を必要としない図13を参照)ので、他のレーンとは異なるように扱われるが、このレーンでは、任意の重複ビットをゼロにする必要がない場合がある(ここでも、最上位レーンが中間レーンと異なる図13を参照)ので、最上位レーンが異なるように扱われる場合もある。
他のレーンからの情報を考慮せずに、処理の各レーンが他のレーンとは独立して動作することを可能にするために、生成される全体的な結果値内のレーンの位置を示すレーン位置インジケータを提供することが有用であり得る。たとえば、図21に示されたように、レーンごとに一連の2ビットタイプインジケータを含むレーン位置ベクトル200が設けられる場合があり、タイプインジケータは、レーンが低次レーン(L)であるか、中間レーン(I)であるか、または高次レーン(H)であるかを示す。この例では、レーン0およびレーン4は低次レーンとして示され、レーン3およびレーン7は高次レーンとして示され、その他のレーンは中間レーンとして示され、各々が4レーンにまたがる2つの独立した結果値を最終結果が含むことを示す。各加算回路ユニット38、42は、対応するレーン用のレーン位置インジケータを、そのレーンによって処理されるべきオペランドと一緒に受け取り、レーン位置インジケータに応じてオペランドをどのように処理するかを決定する。
たとえば、レーンオーバーフローが発生すると、加算回路ユニットは、レーン位置インジケータが、処理されている現在のレーンが対応する結果値内の最上位レーンであることを示すかどうかに応じて、いくつかのオーバーフロー処理応答のうちの1つを選択することができる。たとえば、処理は、現在のレーンが高次レーンであるときにオーバーフロー例外をトリガすることができ、そうでない場合、オーバーフロー例外を抑制することができる。高次レーン以外のレーンの場合、オーバーフローが発生すると、重複伝搬演算が実行される可能性がある。同様に、レーン位置インジケータは、上述されたように、重複伝搬がどのように実行されるかに影響を与える場合もある。
図22は、レーンの様々な構成を指定するレーン位置情報の他の例を示す。例1では、すべてのレーンは、各レーンが独立したNビットの結果に対応することを示す高次レーンとして示される。この状況は、すべてのレーンが低次レーンとして示されることによって表される可能性もあることが諒解されよう。
例2は、偶数レーンが低次レーンとして示され、奇数レーンが上位レーンとして示される場合を示し、その結果、要素の各ペアは2つの要素にまたがる結果値を表す。
例3および4は、RHPA全体の結果値が16レーンにまたがる場合を示すので、例3で定義されたレーン位置情報を伴う第1の計算は、(最下位レーンが低次レーンとして示され、他のレーンが中間レーンとして示された)結果の下半分を表し、例4で定義されたレーン位置情報を伴う第2の計算は、(上位レーンが高次レーンとして示され、他のレーンが中間レーンとして示された)結果の上半分を生成する。
したがって、レーンタイプインジケータは、実装よりも広いアキュムレータにも有用である。たとえば、256ビットの実装に適合しなければならない512ビットのアキュムレータを考えてみよう。各々の累積は2回の加算を必要とする。(整数値のみを累積しているように)ベースアンカー値が0であり、重複サイズがovlp=8であり、Hで高次レーンを、Iで中間レーンを、Lで低次レーンを示すと仮定する。そうすると、たとえば、レーンインジケータ、重複値、およびアンカー値を含む制御レーンは、I:8:168のようなものに見えるかもしれず、レーンが8つの重複ビットおよび168のアンカー値を有する中間レーンであることを意味する。512ビットアキュムレータの場合、低次アンカーベクトルは、値(I:8:168,I:8:112,I:8:56,L:8:0)を有するはずであり、高次アンカーベクトルは、値(H:8:392,I:8:336,I:8:280,I:8:224)を有するはずである。FP入力をこれらの256ビットベクトルの両方に累積すると、正しい512ビットRHPA値が与えられる。
また、例5に示されたように、この種のレーン位置情報を提供することにより、異なるサイズのアキュムレータが同じベクトル内で並列に累積されることが可能になる。たとえば、例5では、ベクトルは、レーン位置識別子を使用して示されたアキュムレータ間の境界を有する1つの4レーンアキュムレータ(H:I:I:L)と、2つの2レーンアキュムレータ(H:L)とを含む。したがって、すべてのRHPAアキュムレータが同じサイズを有することは必須ではない。
レーン位置情報は、プログラマが計算されているアキュムレータのサイズを設定できるように、プログラム可能であってもよい。場合によっては、レーン位置情報は命令の符号化内で識別される可能性があるが、しばしば、レジスタ内に保持される。図23に示されたように、レーンの有効桁を指定するレーンアンカー情報Wと、重複ビットの数を識別する重複値Vとを提供する同じメタデータレジスタ22内のそのレーンごとのレーン位置情報200を保持することが便利であり得る。現在の浮動小数点形式用の有用なアンカーは、16ビットに容易に適合することができるので、RHPAベクトル自体に使用されるようなアンカーおよびアキュムレータに同じSIMDレジスタセットを使用する実装は、レーンタイプインジケータ200も容易に保持することができる。
ハードウェアによって処理されたベクトルが2つ以上の独立した値を含むとき、正しい入力値が正しいレーンにマッピングされたことを保証するために何らかの制御が必要とされる場合がある。場合によっては、RHPA加算を適用する前に、関連するデータを正しいレーンに配置するために、1つまたは複数の命令が実行される場合がある。しかしながら、他の場合には、これは、累積をトリガする同じ命令に応答して、ハードウェアによって行われる可能性がある。
上述されたように、入力値がオペランドのベクトルとして指定されることが可能であり、オペランドのベクトルは、各々RHPA形式に変換し、次いで累積することができる。簡単な方法は、SIMDベクトル内の同じ相対位置にあるそれらの入力ベクトル要素を、各アキュムレータに加算させることのはずであり、その結果、8個のDP浮動小数点値の512ビットは、高次アキュムレータ内に累積された4つの高次DP値と、低アキュムレータ内に累積された4つの低次DP値とを有する可能性がある。
しかしながら、図24に示されたように、より柔軟な方法は、入力マップ情報302、304を使用して、入力浮動小数点ベクトル要素のどれが各レーン内に累積されるべきかを指定することであり得る。したがって、浮動小数点ベクトル300は、レーン位置情報200と、高次アキュムレータに加算されるべき浮動小数点値を識別する高入力マップ302と、低次アキュムレータによって加算されるべき浮動小数点値を指定する低入力マップ304とを一緒に提供される場合がある。この例では、高次は1111_0000であり、そのため、高次アキュムレータを累積するための回路310は、浮動小数点入力FP4〜FP7に対応するRHPA値を加算するはずである。同様に、低次入力マップ304は0000_1111であり、そのため、低次アキュムレータを生成するための回路312は、FP0〜FP3に対応するRHPA値を加算する。これらの加算を実行するための回路310、312は、たとえば、上記の図8に示された回路に相当する場合がある。
そのようなマッピングははるかに柔軟であり、これにより、1つのアキュムレータ内の浮動小数点ベクトル300の偶数レーン、および別のアキュムレータ内の奇数レーンを、(FP0+FP2+FP4+FP6およびFP1+FP3+FP5+FP7を計算するために)それぞれ入力マップ0101_0101および1010_1010を用いて累積することなどの、他のタイプの演算が可能になり得る。入力マップは、特定のレーン内の関連データを配置するために実行されるべき他の命令の必要性を減らすために、ハードウェアが所与のベクトルの要素を異なる方法で組み合わせることを可能にし、パフォーマンスを向上させるのに役立つことができる。ここでも、レーン位置情報200に関しては、入力マップデータは、アンカー値Wおよび重複ビットの数Vと同じメタデータレジスタ22内に配置される可能性もある。
上述の例は、一般に、重複ビットの数Vが(先頭レーン以外の)各レーン内で同じであることを仮定するが、これは必須ではない。図25に示されたように、異なる数Vの重複ビットを有する異なるレーンでRHPA値を定義することが可能である。たとえば、レーンごとに別々に重複ビットの数Vを指定する図23に示されたタイプのメタデータベクトルレジスタ22では、重複ビットの数は異なるレーンの場合異なるように設定することができる。
たとえば、図25では、メタデータベクトル22の各要素は、フォーマット{LP:V:W}の要素であり、ここで、LPはレーン位置情報であり、Vはそのレーンについての重複サイズであり、Wはそのレーン内の最下位ビットの有効桁を指定するアンカー値である)。この例では、512ビットのRHPA値は8つの64ビットレーンから形成される。メタデータ22は、最下位4レーンがレーン当たり12個の重複ビットを有し、次の3レーンがレーン当たり2つの重複ビットを有し、先頭レーンが0個の重複ビットを有することを指定する。図25の下部は、各64ビットレーンの相対的な有効桁を示し、下位4つのレーンは先頭4つのレーンよりも大きな数のビットだけ重複する。これは、隣接レーン用のレーンアンカーWが、最上位4レーンでは62(64−2)だけ異なるが、最下位4レーンでは52(64−12)だけ異なることを意味することに留意されたい。
この手法は、たとえば、所与の範囲の数値をRHPA形式に収める必要がある場合に有用である可能性があるが、実際には、ほとんどの値が全範囲を使用しない傾向がある。この場合、多くの値に対して、いくつかの上位ビットは符号ビットなので、一連のそのようなRHPA値に対して他の処理動作を追加および実行すると、上位レーン内のビットを非常に頻繁には変更しない場合がある。一方、下位レーン内のビットはより頻繁に変化し、桁上げをより頻繁に引き起こす場合がある。下位レーンは上位レーンよりもオーバーフローのリスクが大きいので、上位レーンよりも下位レーン内に重複ビットを多く設けることは有用であり得る。このようにして、下位レーンは依然としてレーンオーバーフローに対する保護を強化している可能性があるが、必要とされる可能性が低い上位レーン内に同じ数の重複ビットを不必要に割り振る必要はないので、代わりに、上位レーンのより多くのビットは、非重複ビットとして使用されて、RHPAベクトル全体の所与のビット数Mで表すことができる範囲を拡張することができる。このようにして、所与の範囲はより小さいベクトルを使用して表すことができるか、または所与のベクトルはより大きな範囲を表すことができる。
図25は、2つの異なる重複サイズを有する例を示すが、他の例は、下位レーンから上位レーンへの重複ビットの数のより漸進的な削減を提供する可能性があることが諒解されよう。また、他の例は、各レーンにより多くの任意の重複サイズを割り当てる可能性がある。ベクトルが(レーン位置情報によって示されるように)いくつかの独立したデータ値を含む例では、独立した値の各々に対して異なる重複サイズを定義することも可能なはずである。
長いオペランドの乗算
RHPA形式は、長整数値などの比較的長いオペランドの乗算を高速化するために使用することもできる。図26は、各々が4つの64ビット部分(a3,a2,a1,a0)、(b3,b2,b1,b0)に分割された2つの256ビット整数値a、bを乗算する例を示す。処理回路14は、乗算回路400と、変換回路34と、加算回路38とを含む。
乗算回路400は、第1の整数aの選択された64ビット部分ayと第2の整数bの選択された64ビット部分bzとを乗算することにより、128ビット部分積ay×bzを生成する64×64ビット乗算器を含む(ayはa3、a2、a1、a0のうちのいずれかであり、bzはb3、b2、b1、b0のうちのいずれかである)。
乗算回路400によって生成された128ビット部分積は、変換回路34に渡され、変換回路34は、上述された技法と同様の方法で、積をRHPA形式に変換する。したがって、変換回路は、冗長部分積の対応するレーンを生成するためのいくつかのレーン変換ユニット34−0〜34−xを含む場合がある。各レーン変換ユニット34−0〜34−xは、乗算回路400により生成された部分積ay×bzと、その部分積の有効桁を示す有効桁指示情報wとを供給される。たとえば、有効桁指示情報は、ay×bzの所与のビット(たとえば、最上位ビットまたは最下位ビット)の有効桁を示すことができる。各レーン変換ユニット34−0〜34−xは、部分積が対応するレーンの範囲内にある有効桁の任意のビットを有するかどうかを判定し、そうである場合、部分積のビットを対応するレーン内の対応するビットにマッピングする。図10および図11の例のように、下位レーンの重複ビットは符号ビットで埋められる。
一般に、図11に示された方法は、以下を除いて、各レーン変換ユニット34−0〜34−xによって使用されてもよい:
・図26で変換される積は、図11のようにFsizeビットではなく128ビットを有するので、Lshiftを0に設定するためのしきい値は、Z≧N−V+Fsizeではなく、Z≧N−V+128である(より一般的には、整数aおよびbがそれぞれXビットおよびYビットのチャンクに分割される場合、しきい値はZ≧N−V+X+Yである)。
・式Z=E−B−w[i]+1において、「E−B」はFP値の真の指数部を表し、これは仮数部の最上位ビットの有効桁を表す。したがって、これは、有効桁指示情報wによって明示的に識別されるか、または有効桁指示情報から導出され得る、部分積の最上位ビットの有効桁の指示と置き換えられる(たとえば、wが部分積の最下位ビットの有効桁を示す場合、E−Bは、w+127、またはより一般的にはw+X+Y−1と置き換えられるべきである)。
部分積をRHPA形式に変換すると、加算回路38は、同様にRHPA形式で表されたアキュムレータ値に変換された部分積を加算して、RHPA形式の更新アキュムレータを生成する。加算回路38は、変換された部分積の対応するレーンとアキュムレータとを加算して、更新アキュムレータの対応するレーンを生成するための、いくつかの並列加算回路ユニット38−0〜38−xを含む。加算は、いくつかのより小さい並列加算を使用して実行されるので、それは迅速に実行することができる。
この演算を選択された部分ay、bzとして整数a、bの部分の異なるペアを使用して何回か繰り返していくつかの部分積を生成し、各部分積をアキュムレータレジスタに累積することにより、アキュムレータレジスタ内の最終結果は、元の整数a、bの積に対応する。累積がRHPA形式で実行されるので、いくつかのより小さい(たとえば64ビットの)独立した加算を並列に使用して、長い(たとえば512ビットの)加算を実行することができ、重複ビットを使用して桁上げが収容されるので、乗算演算全体は、従来の技法よりもはるかに高速に実行することができる。
図27に示されたように、所与の部分積をアキュムレータに加算するための加算演算が、後続の部分積を生成するための乗算と並行して実行され得るように、乗算演算全体をパイプライン化することができる。この例では、表記ay×bz(w)は、部分積ay×bzの最下位ビットが有効桁wを有することを示す。図27の例では、各々の64*64ビット乗算は3サイクルかかり、加算は1サイクルかかるので、連続する乗算および加算をパイプライン化することにより、演算全体は、3+16サイクル=19サイクルしか必要としない。対照的に、以前の技法では、2つの256ビット整数の512ビット積を計算することは、通常60サイクル以上を必要としたはずである。
したがって、図27に示されたように、乗算は、一連の部分積累積演算として見ることができ、各部分積累積演算は、部分積を生成するオペランドの選択された部分ay、bzの乗算、部分積のRHPA形式で変換された部分積への変換、およびいくつかの並列小型加算を使用する変換された部分積のRHPA形式でのアキュムレータへの加算をトリガする。アキュムレータAccは、最初の積が累積される前にゼロに初期化されることに留意されたい。
場合によっては、オペランドa、bを指定する単一の乗算命令は、復号回路20によって、各々が部分積累積演算のうちの1つを実行するように処理回路14を制御するための別々の乗算−累積マイクロ演算に復号される可能性がある。たとえば、各マイクロ演算は、乗算されるべき整数の特定の部分ay、bzを識別することができる。他の例では、デコーダによって受け取られたプログラム命令は、部分積累積演算の各々に対応する別々の乗算累積命令をすでに含む場合がある。
部分積は、図27に示されたものとは異なる順序で計算される可能性があることが諒解されよう。どの順序で部分積が計算されたかにかかわらず、最終結果は同じである。
サイクル19の終了時に得られる積は、依然としてRHPA冗長形式である。積は、さらなる計算(たとえば、いくつかの積の合計を計算すること)のために使用される場合、このフォーマットに保持することができ、または、上述された変換方法のうちのいずれかを使用して、積を非冗長形式に変換することができる。
RHPA積を後の累積の一部と並行して非冗長形式に変換するための重複伝搬の実行を開始することが可能である。図12に示されたように、非冗長重複伝搬は、RHPA値の下端から上端まで上昇する一連の逐次加算を含む場合がある。図28に示されたように、部分積が有効桁の昇順で決定された場合、プロセスの特定のポイントを超えて、最終的なRHPA積のいくつかの下位レーンが完了し、その後の累積によって更新されないので、そのような下位レーンに作用する重複伝搬加算は、上位レーンに影響を与える累積が完了する前に実行することができる。
たとえば、図28は、各64ビットレーンが8つの重複ビット(N=64、V=8)を有するので、512ビット積を表すために10個の64ビットレーンが使用され、各レーンの最下位ビットは、それぞれ、有効桁{504,448,392,336,280,224,168,112,56,0}を有する。サイクル5の終わりまでに、すべての後続の累積が有効桁128以上のビットに作用するので、積のビット0〜127は完了する。したがって、(積のビット0〜111に対応する)最下位2つのレーンが完了しているので、サイクル6で重複伝搬加算を実行して、最下位レーンの重複ビットV[0]を次のレーンの非重複ビットNV[1]に加算し、その加算結果でアキュムレータのレーン1を更新することができる。
同様に、サイクル8の終わりまでに、有効桁191以下のビットはもはや更新されず、次の重複伝搬加算NV[2]+V’[1]に必要な先頭ビットは有効桁167を有するので、それはサイクル9において実行することができる。V’[1]は、サイクル6で実行された重複伝搬加算からもたらされる修正重複ビットであることに留意されたい)。
同様に、後続の重複伝搬加算の各々は、その加算によって必要とされるビットが完了するとすぐに実行することができ、いかなるその後の累積によってももはや更新されない。この例では、これにより、最初の5つの重複伝搬加算が上位レーンに影響を与える累積の一部と並行して実行されることが可能になり、その結果、非冗長重複伝搬の完了は、別の4サイクルしか必要とせず、乗算および非冗長形式への変換全体に合計23サイクルを与える。したがって、非冗長重複伝搬が使用される場合でも、重複伝搬のオーバーヘッドの一部が、累積と部分的に並行してそれを実行することによって回避することができるので、サイクルの総数は比較的低いままである。
各重複伝搬加算が実行され得る特定のタイミングは、(元の整数のサイズに依存する)生成される部分積の数、各乗算ステップによって生成される部分積のサイズ、RHPAアキュムレータに使用されるベクトルレーンサイズN、およびレーンごとに提供される重複ビットの数Vなどの因子に依存する。
あるいは、図27に示されたすべての累積が完了した後に、図12の非冗長変換を使用することにより、または、図13に示されたような制限付き冗長重複伝搬演算を実行し、次に図14に示された桁上げ先見方式を使用して非冗長形式に変換することにより、重複伝搬が実行される可能性がある。
長整数を乗算するためのこの方法は、いくつかの利点を有する。第1に、図6に示されたように、乗算器400およびRHPA数の加算を実行するための回路以上のさらなる回路をほとんど必要としない。RHPA処理レーンは、適切な場所に数の一部を累積する(レーン変換ユニット34を使用して、重み値wに基づいて入力から適切なレーンにデータをマッピングする)方法をすでに「知っている」ので、大きな整数乗算も以前よりはるかに高速であり得る。したがって、一例では、ハードウェアは単一のX*Yビットパイプライン化乗算器を含み、(X+Y)ビット積および別個の指数類似値wは、最小積ビットの値が何であるかを示す。乗算を実行し、その部分積をRHPAアキュムレータに加算する乗算累積演算が提供される。
したがって、乗算用のオペランドとして、より大きな整数の2つの下位部分ay、bz、RHPAアキュムレータ用の少なくとも1つのベクトルレジスタ(オプションとして、RHPAアキュムレータのアンカーを指定するために第2のベクトルレジスタも提供される場合がある)、および暗黙の指数部用の小さな定数(重みw)を指定する乗算累積命令が提供される場合がある。
上記に示された実施形態では、部分積ごとの重みwは常に64の倍数なので、実際には数ビットで十分である。3ビットの数は、暗黙の指数部0、64、128、192、256、320、384、および448を有する、256×256ビット積を扱うはずである。図27および図28には448は示されていないが、各部分積は128ビット幅なので、部分積の各64ビット部分に別々の重み値を割り振る方が簡単な場合があり、その結果、それらは64ビットレーン変換ユニットによって直接変換することができ、したがって、a3×b3の積の上半分の有効桁を示すために448が使用される場合がある。同様に、4ビットの数は512×512ビットの積を処理するはずである。
いくつかの例では、RHPAアキュムレータベクトルは、上述されたようにメタデータを表す様々な例のうちのいずれかを使用して定義され得る関連アンカー値を有してもよい。したがって、特定の数値範囲のみが対象である場合、アンカー値は、乗算中に計算されるレーンの数を制限するために使用することができ、積のビットの一部がアンカー値によって示された範囲外である場合、オーバーフローまたはアンダーフローが通知される。アンカー値が提供される場合、各レーン変換ユニットは、入力−(アンカーから決定されるような)RHPAベクトルの対応するレーンの有効桁を示す1つ、および現在のステップにおいて生成される部分積の有効桁を示す1つ(図26に示された重み値w)を示す2つの有効桁を受け取ることができる。これは、FP値の指数部Eおよびアンカー値w[i]を2つの有効桁指示入力として使用する図11に類似するはずである。
しかしながら、入力オペランドが整数である場合、それらは常にゼロに対応する最下位ビットを有する固定された有効桁を有する。したがって、RHPAベクトルが2つの整数の積をカバーするのに十分大きい(たとえば、2つの64ビット整数を乗算する例では少なくとも512ビット)場合、RHPAベクトル用の明示的なアンカーは必要としない。したがって、この演算のためにアンカーベクトルレジスタを割り振る必要はなくてもよい。たとえば、最下位レーン用のw[i]をデフォルトで0であると仮定してもよく、他のレーン用のw[i]は(N−V)の特定の倍数に対応してもよく、ここで、Nはレーンサイズであり、Vは重複サイズである。RHPAアキュムレータ用にRHPAアンカーが設けられていない場合、重複サイズVは命令から暗黙的になる場合がある(たとえば、上述されたタイプの乗算累積命令は、常に特定の重複サイズV(たとえば、8または12ビット)を使用するように暗黙的に仮定される可能性がある。
この技法の別の利点は、図20に示されたように入力オペランドをRHPA形式に変換する必要がないことである。部分は、より長い整数から簡単に抽出し、より小さい乗算器400を使用して乗算することができ、部分積のみをRHPAに変換し、それは部分積をアキュムレータに累積するのと同じサイクルで行うことができる。したがって、最初の乗算を実行する前に入力をRHPAに変換する際にさらなるサイクルを負う必要はない。
また、この技法は、既存の長い乗算器よりもはるかに高速である。たとえば、512ビットの積を計算することは、たとえば、図27に示された19サイクルとは対照的に、既存のハードウェア上で約60命令、およびさらに多くのサイクルを必要とするはずであると推定される。
図26に示された64×64ビットの乗算は単なる例であることが諒解されよう。任意のXビット×Yビット乗算器は許容可能なはずであり、ここで、XはYに等しい(等しいサイズのアイテムの乗算)か、またはYとは異なる(2つの異なるサイズのアイテムの乗算)場合がある。したがって、入力オペランドが等しいサイズの部分に分割されることは必須ではない。
また、入力オペランドが同じ数の部分をもつことは必須ではない。たとえば、64ビット部分a3、a2、a1、a0、およびb1、b0を使用して、128ビット整数による256ビット整数の乗算が実行される可能性がある。
場合によっては、入力オペランドのうちの1つは1つの部分のみを有する場合があり、他のオペランドは複数の部分を含む。たとえば、a7×b、a6×b、…、a0×bに対応する8つの部分積累積を使用することにより、64ビット部分a7〜a0から形成される512ビット整数は、64ビット整数bと乗算される可能性がある。
また、冗長アキュムレータのレーンサイズが、オペランドa、bが分割された部分のサイズと同じであることは必須ではない。より一般的には、冗長アキュムレータのレーンサイズは、入力オペランドに使用される部分サイズXまたはYとは異なる可能性があるNビットであってもよい。
したがって、入力オペランドの相対的なサイズ(または部分の数)、入力オペランドが分割される部分のサイズX、Y、および冗長アキュムレータによって使用されるレーンサイズNにかかわらず、オペランドのうちの少なくとも1つが比較的長い所与の乗算は、いくつかのより小さい部分積乗算に分解することができ、生成された部分積を冗長形式で加算して、演算全体が従来の整数表現を使用するよりも速く実行されることを可能にすることができる。
また、入力オペランドが整数であることは必須ではない。たとえば、入力オペランドの一方または両方は、FP値またはRHPA値である可能性がある。たとえば、RHPA値をDP FP値と乗算する場合、RHPA値の各レーンは、対応する部分積を生成するためにDP FP値の仮数部と乗算される可能性があり、部分積に関連付けられた重みwは、RHPAアンカーおよびFPの指数部から導出され、部分積の各々は、RHPA形式に変換され、図26に示されたのと同じ方法でRHPAレジスタに累積することができる。別の例では、暗号鍵は、一連のX*Yビット乗算を使用してより小さい値と乗算される可能性がある。
図26の例では、有効桁を示す値wは、積ay×bzとは別に表される。しかしながら、別の選択肢は、有効桁を示す値を積自体の中で直接符号化することである。
たとえば、図29に示されたように、代替の実施形態は、入力を53ビットのチャンクに分割し、適切な指数部で各チャンクを符号化ことのはずであり、その結果、入力オペランドは、浮動小数点要素のベクトルとして効果的に表される。したがって、乗算器に供給される部分ay、bzの各々の選択されたペアは、単にDP FP値のペアである。図30に示されたように、次いで、DP FP乗算器は、DP FP値のペアを乗算して、乗算される2つのFP値ay、bzの指数部の合計に対応する指数Eproductと一緒にフル精度106ビット部分積を生成するために、使用することができる。次いで、有効桁を示す値として指数部Eproductを使用して積をRHPAに変換し、上記のようにRHPA形式で累積することができる。この手法では、Eproductは、最下位ビットではなく、部分積の最上位ビットを示すであることに留意されたい。
図29および図30の方法は、指数部が数に組み込まれている(暗示的または明示的な重みを示す値wを必要としない)ので、命令符号化を簡略化するはずである。図29に示されたように長整数をDPチャンクに変換するために、ベクトルのそれぞれの64ビットレーン内に53ビットの各チャンクを配置するために、置換ユニットを制御するための追加命令が提供される場合がある。
置換の後、各レーンはその入力をDP数に変換する。レーンi用の指数部は、レーンiの低次53ビット内の先行ゼロをカウントしてLZC[i]を取得し、次いで指数部を53×(i+1)−LZC[i]に設定することによって計算される。仮数部は通常の方法で構築され、先頭の1を破棄して小数を左揃えにする。
概要
いくつかの特定の例が上述されたが、より一般的には、処理回路は、いくつかのNビット部分を使用してPビット数値を表す冗長表現を有するMビットデータ値を処理することができ、ここで、M>P>Nである。処理回路は、アンカー値に基づいて冗長表現の各Nビット部分のビットの有効桁を識別することができる。少なくとも2つの隣接するNビット部分のグループ内で、グループの下位部分の複数の重複ビットは、グループの少なくとも1つの上位部分の複数の最下位ビットと同じ有効桁を有する。処理回路は、いくつかの独立したNビット演算を並列に実行するいくつかの演算回路ユニットを有し、各Nビット演算は、冗長表現を有するMビット結果値の対応するNビット部分を生成するために、冗長表現を有する少なくとも2つのMビットオペランド値の対応するNビット部分の関数を計算することを含む。
この手法により、比較的長いオペランドが並行して実行されるより小さいNビット演算において処理されることが可能になるが、サポートされる範囲全体をカバーするのに十分広い加算器を提供するハードウェアのコストなしに、幅広い数値が表されることがさらに可能になる。アンカー値を使用することにより、計算されるべき有効桁の境界を制限することができ、その結果、必要とされるハードウェアがより少なくなり、実際には、これは最も実用的な計算が実行されるのに十分である。あらゆる加算にレーン間の伝搬を必要とするのではなく、レーン内で桁上げを収容することができるので、重複ビットにより、より短いNビットチャンク内の比較的長いMビットデータ値の高速処理が可能になる。
オペランド値の対応するNビット部分に対して、多くの様々な種類の処理動作を実行することができる。たとえば、各Nビット演算は、加算、減算、乗算、論理演算、ガロア体演算など、またはそのような演算のうちの2つ以上の組合せであり得る。
しかしながら、この技法は、Nビット演算が加算または減算である場合に特に有用である(一般に、A−BはA+〜B(ここで、〜BはBの2の補数)と等価なので、「加算」という用語は減算を含むと解釈されるべきである)。加算は多くの処理システムでは非常に一般的な演算であるので、(各レーン内に保持される桁上げを伴う)いくつかの並列Nビット演算でそれらが実行されることを可能にすることによってMビットデータ値の加算を高速化することは、所与の処理システムの処理パフォーマンスを改善するために有用である。Nビット演算が加算であるとき、これらは単純な加算命令だけでなく、乗算、乗算累積、または、演算の一部として加算を含む任意の他の種類の演算用の命令のなどの、他のタイプの命令も含む、広範囲のタイプの命令に応答して発生する可能性がある。
演算回路ユニットによって実行されるNビット演算は、異なるNビット演算の間で伝搬される桁上げがないという意味で「独立」であり得る。
処理回路は、プログラム可能アンカー値に基づいて冗長表現の各Nビット部分のビットの有効桁を識別することができるが、Nビット演算自体の間は、通常、アンカー値を考慮するいかなる必要性もない。アンカー値は、冗長表現と他のフォーマットとの間で変換するとき、たとえば、冗長表現内の値の通常の処理中でないとき、参照される場合がある。
一般に、処理回路は、冗長表現を有する変換されたMビットデータ値に入力値を変換する第1のタイプの変換動作を実行することをサポートすることができる。入力値は、たとえば、浮動小数点、整数、または固定小数点などの異なるフォーマットの範囲内の可能性がある。変換動作は、RHPA形式で変換されるべき所与のオペランドを指定するスタンドアロンの変換命令に応答して実行される可能性がある。あるいは、変換動作は、別のタイプの命令に応答して実行されるより一般的な処理動作の一部の可能性がある。たとえば、累積命令は、アキュムレータ値に加算される前に冗長表現に変換された入力値を指定する可能性があり、乗算変換命令は、2つのオペランドが一緒に乗算されることをトリガするする可能性があり、次いで、乗算の積は冗長表現に変換される場合がある。
変換動作では、入力値の符号に応じて、任意の重複ビットが設定される場合がある。したがって、重複ビットは、冗長表現の次のレーンに対する正または負の調整値の両方を示すことができる符号付き値であり得る。場合によっては、重複ビットは、入力値が正のときは0に設定され、入力値が負のときは1に設定される場合がある。
より詳細には、浮動小数点値を冗長表現に変換するために、変換動作は、プログラム可能なアンカー値および浮動小数点値の指数部に応じて、Mビットデータ値内の対応する有効桁のビットに浮動小数点値の仮数部のビットをマッピングすることであって、少なくとも1つのNビット部分のV個の重複ビットが0に設定され、入力値が正のとき、マッピングの結果を変換されたMビットのデータ値として出力する、マッピングすることと、入力値が負のとき、変換されたMビットデータ値を生成するためにマッピングの結果をネゲートすることとを含む場合がある。
アンカー値が、各レーンの有効桁を別々に指定するアンカー値のベクトルを含む実装では、変換動作は、そのレーンのアンカー値に基づいて対応するレーン内のビットに入力された浮動小数点値をマッピングするいくつかの並列変換で実行される場合がある。
処理回路はまた、冗長表現を有する第2のMビット値を生成するために、冗長表現を有する第1のMビット値に対する重複削減演算をサポートすることができ、第2のMビット値の少なくとも1つのNビット部分内の重複ビットは、第1のMビット値の少なくとも1つの対応するNビット部分の重複ビットよりも小さい大きさを表す。その後の加算中のさらなる桁上げを収容するための範囲がより大きくなるように、重複ビットの所与のセットをゼロに近く削減することにより、レーンオーバーフローの可能性が低減される。重複削減演算は、各演算の後に、周期的に、または下記に説明されるように特定の条件が満たされたときに実行することができる。
重複削減演算は、いくつかの例では、冗長表現内の第1のMビット値の1つまたは複数のNビット部分から、第1のMビット値の1つまたは複数の後続部分に重複ビットを伝搬して、冗長表現を有する第2のMビット値を生成する重複伝搬演算であり得る。第2のMビット値は、第1のMビット値と同じPビット数値を表すが、異なるパターンの重複ビットを使用する。重複削減演算を使用して重複削減を実現することは、重複削減で削減された重複ビットの値を保持するために加算レジスタを必要としないという利点を有する。重複ビットの値を次のレーンに伝搬することにより、次のレーン内の重複ビットを調整して、先行レーン内の重複ビットによって表されたものと同じ値を保持することができ、冗長に表された第2のMビット値に対してさらなる演算が実行されるとき、より多くの桁上げを収容するために先行レーンの重複ビット内の空間を解放する。
重複伝搬演算は、様々な方法で実行することができる。一例では、重複伝搬演算は、すべての重複ビットがゼロに等しい第2のMビット値に第1のMビット値を変換するようなものである。この場合、重複伝搬演算は、第1のMビット値の最下位Nビット部分の重複ビットをMビット値の次のNビット部分に加算して、修正非重複ビットおよび修正重複ビットを生成する初期加算と、先行加算からの修正重複ビットを第1のMビット値の次のNビット部分に加算して、修正非重複ビットおよび修正重複ビットを生成する少なくとも1つのさらなる加算と含む複数の順次加算を実行することを含む場合があり、処理回路は、各順次加算において生成され、重複ビットが0に設定された修正非重複ビットに基づいて、第2のMビット値を生成するように構成される場合がある。
一方、重複伝搬に対する第2の手法は、重複ビットを有する各Nビット部分が、00、01、11のうちの1つに等しい2つの最下位重複ビットを有する第2のMビット値に変換することであり、任意の残りの重複ビットは、2番目の最下位重複ビットと同じ値を有する。この場合、重複ビットの各セットのビットパターンは、セット{−1,0,+1}のうちの1つを効果的に表し、それは、完全に非冗長ではないが、依然としてオーバーフローのリスクが低減されることを可能にする。
第2の手法では、重複伝搬演算はいくつかの並列加算を含む場合があり、各加算は、第2のMビット値の対応する部分を生成するために、第1のMビット値の所与のNビット部分の重複ビットを後続のNビット部分の非重複ビットに加算することを含む。したがって、この手法は、加算が並行して実行されることを可能にすることにより、重複伝搬演算がより速く実行されることを可能にする。長いベクトルの場合、これは重要なパフォーマンスの利点になり得る。
より詳細には、各並列加算は、下位Nビット部分の重複ビットのNビット符号拡張(すなわち、最上位重複ビットに等しいビットで最上位端に埋められた重複ビット)を、重複ビットがゼロに設定された後続のNビット部分に対応するNビット値に加算することを含む場合がある。
第2の手法を使用して第1のMビット値を第2の(制限付き冗長)Mビット値に変換すると、次いで、第2のMビット値は、すべての重複ビットがゼロに等しい第3の(非冗長)Nビット値に変換することができる。これにより、複数のレーンを並行して処理しながら非冗長値が生成されることが可能になる。第2のNビット値の第3のNビット値への変換は、第2のMビット値の重複ビットの総数を表す重複値、および第2のMビット値の非重複ビットの総数を表す非重複値を生成することと、重複値および非重複値のビットパターンに応じて複数の桁上げ値を生成することと、複数の並列加算を実行することとを含む場合があり、各加算は、重複値および非重複値の対応する部分と桁上げ値のうちの1つを加算して、第3のMビット値の対応する部分を生成するためである。
重複削減演算を実行する別の方法は、重複累積演算を実行して、第1のMビット値の1つまたは複数のNビット部分の重複ビットを、重複アキュムレータ値の対応するNビット部分に加算し、第1のMビット値のそれらの1つまたは複数のNビット部分内の重複ビットをゼロに設定して第2のMビット値を生成することである。この手法は、重複アキュムレータ値を格納するために第2のレジスタを必要とする場合があるが、それは、最終結果が生成されるまで処理がレーン内に留めることができる値を有し、そのポイントで、重複アキュムレータ値のNビット部分を1レーンシフトアップし、最終結果の次のレーンに加えることができる。また、この手法は、一時的にオーバーフローするが、Mビット値によって表現可能な範囲に戻る計算が、オーバーフロー例外をトリガすることなく正確に計算されることを可能にするという利点を有する。
いくつかの例では、処理回路は、冗長表現内の第1のMビット値に対して重複削減条件が満たされているかどうかを検出し、そうである場合、第1のMビット値に対する重複削減演算の実行をトリガすることができる。一般に、重複削減条件は、Mビット値の所与のレーンからの実際のオーバーフローがあるとき、または別の加算を実行することがそのようなレーンオーバーフローを引き起こすリスクがあるときに満たされる場合がある。
第1の例では、第1のMビット値を生成するために特定のしきい値の数の加算が実行されたときに、重複削減条件が満たされる場合がある。たとえば、処理回路は、第1のMビット値を生成するために何回の演算(たとえば、加算)が実行されたかを示す演算カウントを保持し、演算回数が所定数以上であることを演算カウントが示すとき、第1のMビット値に対して重複削減演算を実行することができる。したがって、演算(たとえば、第1のMビット値を含むレジスタへの累積)が実行されるたびに、処理回路は、第1のMビット値を生成するために演算されている値の数だけ演算カウントを増分することができ、演算回数が所定数以上に達すると、これは実行されるべき重複削減演算をトリガすることができる。たとえば、演算の所定数は2V−1−1以下であってもよい。より詳細には、非冗長重複削減演算の場合、演算の所定数は2V−1−1以下であってもよく、制限付き冗長重複削減演算の場合、演算の所定数は、2V−1−2以下であってもよい。次にオーバーフローのリスクがあるまでカウント動作を再開するために、演算カウントは重複削減演算が実行されるたびにリセットすることができる。
第2の例では、第1のMビット値の所与のNビット部分用の重複ビットが所定値を有するとき、重複削減条件が満たされる場合がある。たとえば、所定値は、次の演算がそのNビット部分からのオーバーフローをトリガする可能性がある値(たとえば、重複ビットを使用して表現可能な最大の正の値または最大の負の値)に設定されてもよい。
第3の例では、その値に対して処理動作を実行するときに第1のMビットデータ値のNビット部分のうちの1つから実際のオーバーフローが発生したとき、重複削減条件が満たされる場合がある。この場合、処理回路は、オーバ−フローを検出し、次いで第1のMビット値の前の値に戻し、重複削減演算を使用してそれを第2のMビット値に変換し、次いで第2のMビット値に対する処理動作を繰り返すことができる。あるいは、第1のMビット値を処理するオーバーフロー結果を、第2のMビット値に直接マッピングすることができる(下記で説明される図34の例を参照)。
あるいは、いくつかの例では、冗長表現を有する値に対して演算が実行されるたびに、重複削減演算が実行される可能性があり、その結果、結果は非冗長形式または制付き冗長形式で効果的に保持される。たとえば、いくつかのレーン内に重複ビットが2つしかない場合、この選択肢が好ましい場合がある。
場合によっては、第2のMビット値を生成するために、第1のMビットデータ値に対して別のタイプの処理動作を実行するのと同時に、重複伝搬演算が実行される可能性がある。たとえば、入力オペランドを識別する所与の命令に応答して、重複伝搬演算はいくつかのNビット加算演算を含み、各Nビット加算演算は、第2のMビット値の対応するNビット部分を生成するために、第1のMビットデータ値の対応するNビット部分の非重複ビット、第1のMビットデータ値の先行するNビット部分の重複ビット、および冗長表現を有し、入力オペランドに対応する第3のMビット値の対応するNビット部分を加算することを含む。第1のMビットデータ値がすでに制限付き冗長形式である場合、この演算から生じる第2のMビット値も制限付き冗長である。このようにして、重複伝搬は本質的に加算と同時に実行することができるので、重複伝搬のオーバーヘッドは低減され、またMビットデータ値は制限付き冗長形式のままなので、レーン当たり2つの重複ビットしか必要とされず、Mビット値全体がより広い範囲を表すことができるように、非重複ビットとしての使用に利用可能なより多くのビットを残す。いくつかの例では、第3のMビット値はすでに冗長表現を有する可能性がある。他の例では、入力オペランドは異なる表現で表される場合があり、第1のMビット値の非重複ビットおよび重複ビットにそれを加算する前に、冗長表現を有する第3のMビット値に変換される場合がある。
処理回路はまた、第2のタイプの変換動作を実行して、冗長表現を有する第1のMビット値を異なる表現の変換値に変換することもできる。異なる表現は、整数、固定小数点、または浮動小数点を含む任意のフォーマットの可能性がある。場合によっては、第2のタイプの変換動作は、上述されたような重複伝搬演算を実行して、最初のMビット値を第1のMビット値にマッピングし、次いで重複伝搬演算によって生成された第1のMビット値を変換値に変換することを含む場合がある。重複伝搬演算は、非冗長バージョンまたは制限付き冗長バージョンの可能性がある。あるいは、変換されるべきMビット値がすでに非冗長形式または制限付き冗長形式である場合、初期重複伝搬演算を実行する必要はなく、第1のMビット値は、単に変換値に直接変換されてもよい。
一例では、第2のタイプの変換動作は、プログラム可能なアンカー値に基づいて、第1のMビット値の各Nビット部分を対応する浮動小数点値にマッピングすることを含む場合がある。この手法は、第2のMビット値の各要素を並行して処理できるという利点を有する。場合によっては、最終的な変換結果は、各要素が第1のMビット値のそれぞれのNビット部分からマッピングされた浮動小数点値のうちの1つであるベクトルの可能性がある。これは、その合計が初期冗長表現と等価な浮動小数点値のベクトルを提供することにより、浮動小数点形式で冗長表現のより高い精度を保持するために有用であり、したがって、丸めに起因する情報の損失を回避する。あるいは、処理回路は、第1のNビット値の各Nビット部分からマッピングされたそれぞれの浮動小数点値を加算して、必要に応じて丸めを伴って、変換値として単一の浮動小数点値を生成することができる。正しく丸められた結果を生成するために、第1のMビット値の最下位Nビット部分からマッピングされた浮動小数点値で始まり、第1のMビット値の最上位Nビット部分からマッピングされた浮動小数点値で終わる順序で、それぞれの浮動小数点値を加算することは有用であり得る。
あるいは、第2のタイプの変換動作は、ビットの選択されたグループよりも下位の第1のMビット値のビットに基づいて、第1のMビット値の少なくとも1つのNビット部分の非重複ビットの中から選択されたビットのグループを丸めることにより、浮動小数点値の仮数部を形成することによって実行することができる。この手法はより一般的に適用可能であるが、第1のNビット値の一部分から始まり、次いで次の部分に移動する何らかの順次処理が必要な場合があるため、遅くなる場合がある。
場合によっては、冗長表現内の所与のMビット値に関連付けられたアンカー値は、所与のハードウェア実装用に静的に選択された固定値の可能性がある。
しかしながら、プログラム可能なアンカー値を使用することにより、より大きな柔軟性を提供することができるので、プログラマは、冗長表現内の所与のMビット値を使用して表されるべき有効桁の範囲を指定することができる。これにより、プログラム可能なアンカー値を使用して、所与の演算で計算されるべき有効桁の可変ウィンドウを定義することにより、ハードウェアユニットの比較的狭いセットが広い数値範囲にわたって数値を処理することが可能になる。
一般に、所与のレーンの重複ビットは、符号付き整数値を表すことができるので、次のレーンに対する正と負の両方の調整値を表すことができる。
いくつかの実装形態は、所与のレーン内の重複ビット数がN/2よりも大きくなることを可能にすることができる。この場合、そのレーンの重複部分は、2つ以上の後続レーンにおける非重複部分と有効桁で重複する場合がある。したがって、3つ以上の隣接するNビット部分のグループでは、最下位部分の重複ビットは、2つ以上のさらなるNビット部分におけるいくつかの非重複ビットと等価な有効桁の重複ビットであり得る。この手法は、オーバーフローのリスクなしにさらに多くの演算が実行されることを可能にするが、ビットのより多くのクロスレーン組合せが必要とされる場合があるので、重複伝搬および変換動作を複雑にする可能性がある。
より簡単な手法は、各レーンがN/2以下の重複ビットを有するように、重複ビットの数を制限することであり得る。重複ビットの数をレーンサイズの半分以下に制限することにより、重複ビットの各セットがより少ないクロスレーンアクティビティを必要とする単一のより上位のレーンに対する調整値を表すので、ハードウェア実装ははるかに簡単である。所与の実装形態に対して、より大きい値の数の重複ビットが望ましい場合、レーンサイズNを増大させることができる。
いくつかの実装形態では、重複ビットの数Vは、ハードウェア実装によって固定化(ハードワイヤリング)されてもよい。それでも、同じコードが異なる重複サイズを使用するハードウェア実装に対して実行される場合でも、使用されている現在の重複サイズをプログラムが決定することを可能にするように、所与の実装形態によって使用される重複ビットの数を識別する重複サイズ値を提供することは、依然として有用であり得る。たとえば、制御レジスタは重複サイズを指定する可能性がある。
しかしながら、より柔軟な手法は、プログラマまたはコンパイラが実行されるべきアプリケーションに適した値に設定することができる、プログラム可能な重複サイズ値を提供することである。これにより、重複サイズ値における選択が可能になる。オーバーフローなしに多数の加算が実行されることを可能にすることが重要である場合、重複サイズを縮小することができる。必要であると予想される加算が少ない場合、重複サイズを縮小すると、Nビットレーンの処理を少なくして計算が実行されることを可能にすることができ、それは、複数のMビット計算がハードウェア内に設けられたNビット加算回路ユニットの様々なサブセットと並行して実行されることを可能にすることにより、パフォーマンスを改善する可能性がある。したがって、プログラマは、実行されるべき加算の予想回数、および必要なアプリケーション用に予想される数値の範囲に応じて、重複サイズ値を設定することができる。
重複サイズ値は、ある範囲の方法で指定される可能性があるが、場合によっては、ハードウェア内に設けられた制御レジスタにおいて指定される場合がある。場合によっては、制御レジスタは、各レーンの有効桁を設定するプログラム可能なアンカー値を格納するために使用される同じレジスタの可能性がある。
あるいは、重複サイズ値は、冗長表現を有する少なくとも1つのデータ値を処理するように処理回路を制御する命令によって指定される可能性がある。
場合によっては、重複ビットの数は、(上述されたようにいかなる重複ビットももたない場合がある最上位Nビット部分以外の)冗長表現の各Nビット部分について同じであってもよい。この場合、単一の重複サイズ値は、先頭レーン以外の冗長表現の各レーンで使用されるべき重複ビットの数を指定することができる。
しかしながら、異なる数の重複ビットを有する異なるレーンを設けることも可能である。たとえば、表現可能な極端な数字がまれである場合のように、上位レーンよりも多くの数の重複ビットを下位レーンに提供することは有用であり得るし、重複ビットへの桁上げが上位レーンよりも下位レーンにとってより一般的であることが予想される。したがって、場合によっては、冗長表現のNビット部分のうちの2つ以上に対して、重複ビットの数を別々に指定する重複サイズ値を提供することが有用であり得る。場合によっては、各レーンは別々に指定されたその重複サイズを有する可能性がある(または、少なくとも先頭レーン以外の各レーンは別々の重複サイズ値を有する可能性がある)。他の例では、レーンのいくつかのサブセットが各々別々の重複サイズ指示を有する可能性があるが、同じサブセット内のレーンはすべて同じ重複サイズを使用することができる。
上述されたように、冗長表現は、特にそれらが加算を含む場合、一連の演算に有用であり得る。しかしながら、それは特に少なくとも1つの値のアキュムレータレジスタへの累積をトリガする累積命令に有用である。
Nビットレーン間のオーバーフローのリスクなしに冗長表現内の複数の値を加算することができるので、この技法により、所与のタイプの命令が3つ以上の別々のMビットデータ値の加算を単一の演算でトリガすることも可能であり、そうでない場合、可能ではないはずである。これにより、データ値を累積するときのパフォーマンスをさらに高速化することが可能になる。各Nビット加算回路ユニットでは、ウォレスツリーは、少なくとも3つのMビット値の対応するNビット部分を結合して2つのNビット項を生成するために使用される場合があり、次いで、桁上げ伝搬加算器は、2つのNビット項を加算して、Mビット結果の対応するNビット部分を生成することができる。ウォレスツリーを実装するいくつかの方法があり、任意の既知の技法が使用され得ることが諒解されよう。
場合によっては、加算されるべき2つ以上のMビットデータ値は、入力ベクトルのそれぞれの要素から導出されてもよい。これにより、単一の命令が、たとえば、累積されるべき複数の入力値を指定することが可能になる。場合によっては、入力ベクトルのすべての要素に対応するMビットデータ値を一緒に加算して、対応する結果を形成する可能性がある。
しかしながら、入力ベクトルの入力データ要素の第1のサブセットに対応するMビットデータ値を加算するNビット加算の第1のセットによって生成された第1のMビット結果と、入力ベクトルの入力データ要素の第2のサブセットに対応するMビットデータ値を加算するNビット加算の第2のセットによって生成された第2のMビット結果とを有する、2つ以上の独立した結果を生成することも可能である。したがって、Mは、ハードウェア内に実装されるベクトル幅より小さくてもよい。どの入力データ要素が第1および第2のサブセットに対応するかの割振りは、静的(所与の実装形態の場合は固定)、またはプログラム可能入力マップ情報に基づいて可変である可能性がある。
本技法のための別のアプリケーションは、加算されるMビットオペランド値が、2つのオペランド値の乗算の間に生成された部分積である場合である。これは、いくつかのより小さい並列Nビット演算を使用してレーン幅Nよりも長い2つの値を乗算するのに特に有用であり得る。
別の例では、処理回路は、第1のデータ値に対して重複伝搬演算を実行して第2のデータ値を生成することができ、第1および第2のデータ値は、複数のNビット部分を含むMビットデータ値を使用してPビット数値を表す冗長表現を有し、ここで、M>P>Nであり、冗長表現において、最上位Nビット部分以外の各Nビット部分は、次のNビット部分の複数の最下位ビットと同じ有効桁を有する複数の重複ビットを含み、処理回路は、第1のデータ値の対応するNビット部分の非重複ビットを、第1のデータ値の先行するNビット部分の重複ビットに加算することを含む加算演算を実行することにより、最下位Nビット部分以外の第2のデータ値の各Nビット部分を生成するように構成される。
この手法は、並列技法を使用して冗長表現内で表現された値からオーバーフローする可能性を低減するのに役立つ。重複伝搬演算のこの特定の例は、(上述されたRHPA形式のように可変の有効桁を定義する関連するプログラム可能なアンカー値ではなく)固定の有効桁を有する冗長形式で表される長整数値または固定小数点値に適用される可能性があることが諒解されよう。そのような値に冗長表現を使用すると、長いオペランドの高速加算がさらに可能になり、上記で定義された重複伝搬演算により、比較的高速の並列動作を使用してレーン間のオーバーフローの可能性が低減されることが可能になる。
重複伝搬演算は、並列に実行された第2のデータ値のNビット部分のうちの少なくとも2つに対する加算演算を用いて実行することができる。すべての加算演算を並列に実行することは必須ではない。たとえば、いくつかの加算のみを並列に実行するのに十分なハードウェアを有するシステムは、非冗長形式への逐次変換のみを実装するシステムよりもさらに速い場合がある。それにもかかわらず、より良いパフォーマンスのために、処理回路は、最下位Nビット部分以外の第2のデータ値のNビット部分の各々に対して並列に加算演算を実行することができる。処理回路は、それぞれの加算演算を並列に実行するための並列加算回路ユニットを有することができる。
別の例では、処理回路は、少なくとも1つのオペランドベクトルのそれぞれのデータ要素に対して複数の処理レーンを実行して、結果ベクトルの対応する結果データ要素を生成することができる。レーン位置情報は、処理レーンごとに提供され、所与のレーンについてのレーン位置情報は、結果ベクトルの1つまたは複数の結果データ要素にまたがる対応する結果データ値内の所与のレーンによって生成されるべき対応する結果データ要素の相対位置を識別する。各処理レーンは、そのレーンについて識別されたレーン位置情報に応じて実行することができる。この手法により、所与のベクトルサイズをサポートする処理ハードウェアが、より大きいまたはより小さいサイズのデータ値の処理を柔軟にサポートすることが可能になる。
これは、通常、ベクトルの各要素に使用されるべき所与のデータ要素のサイズを指定するグローバル入力を受け取るハードワイヤリングされた回路を有するはずの標準の単一命令複数データ(SIMD)技法と対照的であり、それにより、たとえば、ベクトルの部分間の桁上げを伝搬するべきかどうかの判定が可能になる。そのようなSIMDでは、データ要素のサイズは、結果ベクトルの特定のデータ要素が所与の結果の下端または上端にあるかどうかを識別するのではなく、ベクトル全体に対してグローバルに指定される。生成されるべき対応する結果内の相対位置をレーンごとに別々に指定する能力を提供することにより、ハードウェアがベクトル幅より大きいサイズの結果を生成することを可能にすることと、異なるサイズの複数の結果が単一のベクトル内で並列に計算されることを可能にすることとを含む、所与のサイズのハードウェアを使用して異なるサイズの結果を計算するためのより大きい柔軟性が与えられ、これは標準のSIMD技法では可能でないはずである。
一般に、それぞれのデータ要素に対して実行される処理レーンは、対応するデータ要素に適用される任意の種類の演算を含む場合がある。これは、算術演算または論理演算だけでなく、たとえば、要素をある表現から別の表現に変換する(たとえば、上述されたRHPA形式に、またはRHPA形式から変換する)演算も含む場合がある。
レーン位置情報は様々な方法で表される可能性がある。場合によっては、レーン位置情報は、対応する結果データ要素が対応する結果データ値の最上位データ要素であるかどうかを識別することができる。いくつかのタイプの処理動作では、結果の最上位データ要素は、他の要素とは異なるように扱われる場合があるので、(たとえば、1ビットのインジケータを使用して)各要素が結果データ値の最上位ビット要素であるか否かを識別するだけで十分であり得る。
たとえば、所与のレーンについてオーバーフロー状態が検出されると、処理回路は、レーン位置情報がそのレーンを結果の最上位データ要素に対応するものとして識別するかどうかに基づいて、オーバーフローをどのように扱うかを選択することができる。たとえば、利用可能ないくつかのオーバーフロー処理応答が存在する場合があり、レーン位置情報に基づいて、これらのうちの1つが選択される場合がある。たとえば、オーバーフロー処理応答は、何もしないこと、オーバーフローが発生したことを示す情報を設定すること、例外をトリガしてオーバーフローを処理すること、または上述された重複伝搬演算の実行をトリガすることを含む可能性がある。これらのうちのどれが選択されるかは、生成される結果内のオーバーフローするレーンの位置に依存する場合がある。
レーン位置情報は、結果データ要素が結果の最下位データ要素であるかどうかを識別する可能性もある。たとえば、最下位データ要素の処理は、下位要素からのそのレーンへの桁上げが存在しない点で高次要素と異なる場合があり、いくつかの演算(たとえば、上述された重複伝搬演算)は、低次レーンを他のレーンと異なるように扱うことができる。したがって、最下位のデータ要素を識別することは有用であり得る。
より一般的には、レーン位置情報は、結果データ値の最下位要素、最上位要素、または中間要素のうちの1つを生成するものとして各レーンを識別する可能性がある。たとえば、2ビットのインジケータはこの情報を示すことができる。これは、最上位レーンと最下位レーンの両方が中間レーンとは異なるように扱われる必要があるときに有用である。
このタイプのレーン位置インジケータにより、所与のサイズのハードウェアがどのように値を処理するかにおける高度の柔軟性が可能になる。たとえば、処理の最上位レーンまたは最下位レーンについてのレーン位置情報が、対応する結果データ要素が中間データ要素であると識別すると、このことは、結果ベクトル自体よりも大きい数のビットを有する結果値の部分的な部分を表す結果ベクトルを生成するように、処理回路をトリガすることができる。一連のそのような動作は、結果データ値の各それぞれの部分を計算するために実行される場合がある。
あるいは、処理の中間レーンが対応する結果に対して最下位データ要素または最上位データ要素を生成することであるとレーン位置情報が識別すると、このことは、2つ以上の独立した結果データを含む結果ベクトルを生成するように、処理回路をトリガする。これにより、2つ以上の結果の並列生成を許可することによるパフォーマンスの向上が可能になる。
いくつかの例では、結果ベクトルが少なくとも2つの独立した結果データ値を含むとレーン位置情報が識別すると、複数の入力データ要素を含む入力ベクトルを識別する所定のタイプの命令に応答して、処理回路は、第1の独立した結果データ値を生成するために、入力ベクトルの入力データ要素の第1のサブセットからマッピングされた少なくとも1つのオペランドベクトルのデータ要素の第1のサブセット上の処理レーンの第1のサブセットを実行することができ、第2の独立した結果データ値を生成するために、入力ベクトルの入力データ要素の第2のサブセットからマッピングされた少なくとも1つのオペランドベクトルのデータ要素の第2のサブセット上の処理レーンの第2のサブセットを実行することができ、を実行することができる。したがって、元の入力ベクトルの要素のうちのいくつかは、処理レーンの第1のサブセット内で結合されてもよく、他の要素は、処理レーンの第2のサブセット内で処理されてもよい。処理回路は、プログラム可能な入力マップ情報に応じて、どの入力データ要素が第1のサブセットまたは第2のサブセットにあるかを選択することができる。これは、入力マップ情報の異なる値を設定することにより、同じタイプの命令が様々な組合せで入力ベクトルの入力データ要素を組み合わせることを可能にするのに有用である。入力マップ情報は、たとえば、命令によって参照されるレジスタに格納される可能性がある。
レーン位置情報は、レーンごとに処理を順次実行し、各レーンがいかなる他のレーンとも独立して実行されることを可能にするベクトル実装に有用であり得る。しかしながら、それは、複数の処理レーンを並列に実行するための並列回路ユニットが存在するときに特に有用である。
レーン位置情報は、特定のプログラムを書くプログラマが、処理されるべき値をハードウェア上にどのようにマッピングするかを設定できるようにプログラム可能であり得る。あるいは、レーン位置情報は、プログラマによって書かれたソースコードをコンパイルするコンパイラによって設定される可能性がある。
場合によっては、レーン位置情報はまた、ハードウェアによって決定される場合もあり、たとえば、プログラマは、生成されるべき全体的な結果サイズを指定することができ、次いでハードウェアは、指定された結果サイズおよび回路化された実装形態内に実装されたハードウェアベクトル長の指示に基づいて、レーン位置情報を決定することができる。これは、プログラマが所与の実装形態のためのハードウェア内に実装された特定のベクトルサイズを知らない場合に有用であり得る。
レーン位置情報は、たとえば、命令符号化、汎用レジスタ、または専用制御レジスタ内で、様々な方法で指定される可能性がある。
しかしながら、プログラマのアンカー値と上述された重複値の一方または両方と同じ制御レジスタ内のレーン位置情報を定義することは特に有用であり得る。
複数のXビット部分を含む第1のオペランドと、少なくとも1つのYビット部分を含む第2のオペランドとを乗算するための方法が提供され、方法は、
複数の部分積を生成するステップであって、各部分積が第1のオペランドの選択されたXビット部分と第2のオペランドの選択されたYビット部分との積を含む、ステップと、
部分積ごとに、部分積の有効桁を示す有効桁指示情報に応じて、部分積を冗長表現に変換するステップであって、前記冗長表現において、部分積が複数のNビット部分を使用して表され、冗長表現の少なくとも2つの隣接するNビット部分のグループ内で、グループの下位Nビット部分の複数の重複ビットが、グループの少なくとも1つの上位Nビット部分の複数の最下位ビットと同じ有効桁を有する、ステップと、
冗長表現において表された複数の部分積を加算するステップと
を含む。
この方法では、冗長表現を使用して部分積を加算することにより、どの桁上げも重複ビットに収容され、レーン間で桁上げを伝搬する必要性を回避することが可能になるので、比較的長いオペランドの乗算を以前の技法よりも高速に実行することができる。また、第1および第2のオペランドを冗長表現に変換する必要はない。
加算は、冗長表現で表される部分積のそれぞれのNビット部分を使用して独立したNビット加算を実行するための複数のNビット加算回路ユニットを使用して実行することができる。積の全幅に対応するより大きな加算ではなく、いくつかの並列Nビット加算を使用することにより、加算がより高速に行われ、比較的長いオペランドをより短時間で乗算することが可能になる。
場合によっては、最初にすべての部分積を計算し、次いで後続の追加ステップで積を一緒に加算することが可能である。しかしながら、部分積の数が比較的多い場合、これは、すべての部分積を格納するためにかなりの数のレジスタを必要とする場合があり、これにより、レジスタ圧力が増大し、レジスタを必要とする他の演算のパフォーマンスが低下する場合がある。
したがって、より効率的な技法は、前記冗長表現を有するアキュムレータ値を格納するアキュムレータレジスタに部分積を累積することであり得る。したがって、1つまたは複数の部分積が生成され、これまでに計算された部分積の中間合計を保持するアキュムレータ値に加算されてもよく、一連の積算が第1のオペランドと第2のオペランドの最終積を計算する。
より詳細には、第1のオペランドと第2のオペランドの乗算は、いくつかの部分積累積演算を使用して実装される場合があり、各部分積累積演算は、前記選択されたXビット部分および前記選択されたYビット部分として選択された異なるペアの部分に対応し、
選択されたXビット部分と選択されたYビット部分とを乗算して、前記複数の部分積のうちの1つを生成することと、
有効桁指示情報に応じて、前記複数の部分積のうちの前記1つを冗長表現に変換することと、
前記冗長表現内の前記複数の部分積のうちの前記1つを、前記冗長表現を有する累積値に加算して、更新されたアキュムレータ値を生成することと
を含み、
1つの部分積累積演算のための更新されたアキュムレータ値は、次の部分積累積演算のためのアキュムレータ値として使用される。
部分積を一度に1つ生成し、それらをアキュムレータ値に連続して累積することにより、アキュムレータ値を格納するために使用されるレジスタは1つしか必要とされず、他の演算のためにより多くのレジスタが利用可能なまま残る。
部分積累積演算はパイプライン化することができ、その結果、1つの部分積累積演算のための部分積とアキュムレータ値との加算は、後続の部分積累積演算のための乗算と並行して実行することができる。乗算自体もパイプライン化される可能性があり、その結果、乗算はいくつかの段階で実行されてもよく、前の部分積累積演算のための後の乗算段階は、後の部分積累積演算のための前の乗算段階と並行して実行されてもよい。
最終結果は依然として冗長表現であり得る。非冗長表現(たとえば、整数)が必要な場合、冗長表現内の複数の部分積を加算した結果に対して重複伝搬演算を実行して、結果の1つまたは複数のNビット部分の重複ビットを、結果の1つまたは複数の後続のNビット部分に伝搬することができる。1つのレーンから次のレーンに重複ビットを伝搬することにより(たとえば、次のレーンの非重複ビットに重複ビットを加算することにより)、重複ビットの各セットがゼロである非冗長形式を取得することができる。重複伝搬演算は、上述された技法のうちのいずれかを使用して実行される可能性がある。
他の例では、すべての累積が完了するまで待つのではなく、(1つのレーンの重複ビットを次のレーンの非重複ビットに加算する)少なくとも1つの重複伝搬加算が、少なくとも1つの部分積累積演算と並行して行われる可能性がある。たとえば、部分積累積演算が各部分積累積演算で生成された部分積の有効桁の昇順で実行される場合、入力オペランドの積を表す最終アキュムレータの1つまたは複数の下位レーンは、アキュムレータの上位レーンに影響を与える累積が終了する前に準備ができる場合があるので、下位レーンで実行される重複伝搬加算は、上位レーンに影響を与える累積と並行して実行することができる。
有効桁指示情報は様々な方法で表される場合がある。一般に、有効桁指示情報は、前記第1のオペランド内の前記選択されたXビット部分と前記第2のオペランド内の前記選択されたYビット部分との相対位置に依存する場合がある。
場合によっては、有効桁指示情報は、前記選択されたXビット部分および前記選択されたYビット部分のうちの少なくとも1つに関連付けられた有効桁指示パラメータに依存する場合がある。たとえば、入力オペランドがFP値である(またはFP値にマッピングされる)場合、有効桁指示情報はFP値の指数部に依存する可能性がある。
あるいは、有効桁指示情報は、前記部分積のうちの少なくとも1つを生成するように処理回路を制御するための命令によって指定されたパラメータに依存する場合がある。これは、生成されるべき部分積の有効桁を明示的に識別する命令のパラメータの可能性があり、または、有効桁指示情報は、第1のオペランドの少なくともどのXビット部分が前記選択されたXビット部分であるかを識別する命令のパラメータから暗示的である可能性がある(第2のオペランドが2つ以上のYビット部分を有する場合、どのYビット部分が選択されたYビット部分であるかを識別するパラメータも、部分積の有効桁を決定すると考えることができる)。
いくつかの例では、第1のオペランドおよび第2のオペランドは整数を含む。あるいは、第1/第2のオペランドは、FPまたは冗長表現などの他のフォーマットの可能性がある。また、場合によっては、第1のオペランドは、第2のオペランドとは異なるフォーマットの可能性がある。第1および第2の入力オペランドのフォーマットにかかわらず、それらは、いくつかのより小さい乗算を使用して入力オペランドの乗算を可能にするために、それぞれ、より小さいXビット部分およびYビット部分にマッピングすることができる。
いくつかの例では、第1および第2のオペランドが同じサイズの部分を有するように、X=Yである。あるいは、XとYは異なっていてもよい。
XおよびYが両方とも53に等しいか、または53より小さい場合、2つの倍精度浮動小数点値の仮数部を乗算するために提供される浮動小数点乗算回路を使用して、部分積乗算が実行される場合がある。XまたはYが53より小さい場合、これらの部分をパディングして、DP乗算器によって乗算されるべき53ビット値を生成することができる。したがって、これにより、既存の乗算ハードウェアが使用されることが可能になる。
同様に、XおよびYが両方とも24以下であるか、または11以下である場合、乗算はそれぞれ単精度または半精度の浮動小数点乗算器を再利用することができる。
あるいは、X*Yビットの乗算をサポートする既存の乗算回路が存在しない場合、特注の乗算器を設けてもよい。
一例では、方法は、第1のオペランドを浮動小数点値の対応するベクトルにマッピングするステップを含む場合があり、各浮動小数点値は、第1のオペランドのそれぞれのXビット部分からマッピングされた仮数部と、第1のオペランド内のそのXビット部分の有効桁に依存する指数部とを有し、所与の部分積についての有効桁指示情報は、前記所与の部分積を生成するために使用される選択されたXビット部分に対応する浮動小数点値の指数部に依存する。入力オペランドを浮動小数点値のベクトルにマッピングすることにより、さらなるパラメータを必要とするのではなく、有効桁指示情報が入力されたXビット部分およびYビット部分ならびに部分積自体の符号化内で明示的に表現することができるので、演算を簡略化することができる。また、これにより、既存の浮動小数点ハードウェアが再利用されることが可能になる。
データ処理装置は、上述されたように第1のオペランドと第2のオペランドを乗算するための方法を実行するように構成された処理回路を含む場合がある。
たとえば、データ処理装置は、
複数のXビット部分を含む第1のオペランドの選択されたXビット部分と、少なくとも1つのYビット部分を含む第2のオペランドの選択されたYビット部分とを乗算して、部分積を生成する乗算回路と、
部分積の有効桁を示す有効桁指示情報に応じて、冗長表現を有する変換部分積に部分積を変換する変換回路であって、前記冗長表現において、部分積が複数のNビット部分を使用して表され、冗長表現の少なくとも2つの隣接するNビット部分のグループ内で、グループの下位Nビット部分の複数の重複ビットが、グループの少なくとも1つの上位Nビット部分の複数の最下位ビットと同じ有効桁を有する、変換回路と、
前記冗長表現を有するアキュムレータ値に変換部分積を加算する加算回路と
を含む場合がある。
加算回路は、変換部分積の対応するNビット部分およびアキュムレータ値を使用して、独立したNビット加算を実行する複数のNビット加算回路ユニットを含む場合がある。これにより、冗長表現を使用して、より長い値の加算がより速く実行されることが可能になる。
前記選択されたXビット部分および前記選択されたYビット部分として選択された部分の様々な組合せに対応する、冗長表現内の複数の変換部分積を生成するように、乗算回路および変換回路を制御するために、かつ前記複数の部分積の各々をアキュムレータ値に加算するように加算回路を制御するために、少なくとも1つの乗算命令に応答する制御回路(たとえば、命令デコーダ)が設けられる場合がある。場合によっては、第1および第2のオペランドを指定する1つの乗算命令は、すべての部分積の生成を制御することができる。他の例では、乗算され、アキュムレータ値に累積されるべき選択されたXビット部分および選択されたYビット部分として様々な組合せの部分を各々が指定する、別個の乗算累積命令が提供される可能性がある。
さらなる例示的な構成は下記の条項において定義される。
1.M>P>Nとして、複数のNビット部分を使用してPビット数値を表す冗長表現を有するMビットデータ値を処理する処理回路を含む装置であって、
V<Nとして、前記処理回路が、アンカー値に基づいて前記冗長表現の各Nビット部分のビットの有効桁を識別するように構成され、少なくとも2つの隣接するNビット部分のグループ内で、当該グループの下位Nビット部分の複数の重複ビットが、当該グループの少なくとも1つの上位Nビット部分の複数の最下位ビットと同じ有効桁を有し、
前記処理回路が、複数の独立したNビット演算を並列に実行する複数の演算回路ユニットを含み、各Nビット演算が、前記冗長表現を有するMビット結果値の対応するNビット部分を生成するために、前記冗長表現を有する少なくとも2つのMビットオペランド値の対応するNビット部分の関数を計算することを含む、
装置。
2.前記複数の演算回路ユニットが、複数のNビット加算を並列に実行する複数の加算回路ユニットを含み、各Nビット加算が、前記少なくとも2つのMビットオペランド値の前記対応するNビット部分を、前記Mビット結果値の前記対応するNビット部分を生成するために加算することを含む、条項1に記載の装置。
3.前記処理回路が、入力値を、前記冗長表現を有する変換されたMビットデータ値に変換するために変換動作を実行するように構成される、条項1および2のいずれかに記載の装置。
4.前記変換動作が、前記入力値の符号に依存して前記重複ビットを設定することを含む、条項3に記載の装置。
5.前記入力値が正であるとき、前記処理回路が前記重複ビットを0に設定するように構成され、前記入力値が負であるとき、前記処理回路が前記重複ビットを1に設定するように構成される、条項4に記載の装置。
6.前記入力値が浮動小数点値を含むとき、前記変換動作が、
前記アンカー値および前記浮動小数点値の指数部に依存して、前記浮動小数点値の仮数部のビットを、前記Mビットデータ値内の対応する有効桁のビットに、少なくとも1つのNビット部分の前記重複ビットを0に設定して、マッピングすることと、
前記入力値が正であるとき、前記マッピングの結果を、前記変換されたMビットデータ値として出力することと、
前記入力値が負であるとき、前記変換されたMビットデータ値を生成するために、前記マッピングの前記結果をネゲートすることと
を含む、条項4および5のいずれかに記載の装置。
7.前記処理回路が、前記冗長表現を有する第1のMビット値に対して重複削減演算を実行して、前記冗長表現を有する第2のMビット値を生成するように構成され、前記第2のMビット値の少なくとも1つのNビット部分内の前記重複ビットが、前記第1のMビット値の少なくとも1つの対応するNビット部分の前記重複ビットよりも小さい大きさを表す、条項1から6のいずれかに記載の装置。
8.前記重複削減演算が、前記冗長表現を有する第1のMビット値の1つまたは複数のNビット部分の前記重複ビットを、前記第1のMビット値の1つまたは複数の後続のNビット部分に伝搬して、重複ビットの異なるパターンを使用して前記第1のMビット値と同じPビット数値を表す前記冗長表現を有する第2のMビット値を生成する重複伝搬演算を含む、条項7に記載の装置。
9.前記第2のMビット値において、前記重複ビットが0に等しい、条項8に記載の装置。
10.前記重複伝搬演算が、
前記第1のMビット値の最下位Nビット部分の前記重複ビットを、前記Mビット値の後続のNビット部分に加算して、修正された非重複ビットと修正された重複ビットとを生成する初期加算と、
前回の加算からの前記修正された重複ビットを、前記第1のMビット値の次のNビット部分に加算して、修正された非重複ビットと修正された重複ビットとを生成する少なくとも1つのさらなる加算と、
を含む、複数の逐次加算を実行することを含み、
前記処理回路が、各逐次加算で生成され、前記重複ビットが0に設定された、前記修正された非重複ビットに基づいて前記第2のMビット値を生成するように構成される、
条項8および9のいずれかに記載の装置。
11.前記第2のMビット値において、重複ビットを有するNビット部分ごとに、前記2つの最下位重複ビットが、値00、01、11のうちの1つを有し、任意の残りの重複ビットが、前記2番目の最下位重複ビットと同じ値を有する、条項8に記載の装置。
12.前記重複伝搬演算が、複数の並列加算を実行することを含み、
各並列加算が、前記第1のMビット値の所与のNビット部分の前記重複ビットを前記第1のMビット値の後続のNビット部分の非重複ビットに加算して、前記第1のMビット値の前記後続のNビット部分に有効桁において対応する前記第2のMビット値のNビット部分を生成することを含む、
条項8および11のいずれかに記載の装置。
13.各並列加算が、前記下位Nビット部分の前記重複ビットのNビット符号拡張を、任意の重複ビットが0に設定された前記後続のNビット部分に対応するNビット値に加算することを含む、条項11および12のいずれかに記載の装置。
14.前記重複伝搬演算が、前記第2のMビット値を、すべての重複ビットが0に等しい前記第3のMビット値に変換することを含む、条項11から13のいずれかに記載の装置。
15.前記第2のMビット値を前記第3のMビット値に変換することが、
前記第2のMビット値の前記重複ビットの総計を表す重複値と、前記第2のMビット値の前記非重複ビットの総計を表す非重複値と、を生成することと、
前記重複値と、前記非重複値と、のビットパターンに依存して複数の桁上げ値を生成することと、
各加算が、前記重複値および前記非重複値の対応する部分と前記桁上げ値のうちの1つを加算して、前記第3のMビット値の対応する部分を生成するためである、複数の並列加算を実行することと、
を含む、条項14に記載の装置。
16.前記重複削減演算が、前記第1のMビット値の1つまたは複数のNビット部分の前記重複ビットを、重複アキュムレータ値の対応するNビット部分に加算し、前記第1のMビット値の前記1つまたは複数のNビット部分の前記重複ビットをゼロに設定して前記第2のMビット値を生成する重複累積演算を含む、条項7に記載の装置。
17.前記処理回路が、前記第1のMビット値を生成するために実行された演算回数を示す演算カウントを保持し、前記演算回数が所定数以上であることを前記演算カウントが示すときに前記重複削減演算を実行するように構成される、条項7から16のいずれかに記載の装置。
18.演算の前記所定数が2V−1−1以下であり、ここでVは重複ビットを有する前記Nビット部分のうちのいずれかによって構成される重複ビットの前記最小数である、条項17に記載の装置。
19.前記処理回路が、前記重複削減演算が実行されたときに前記演算カウントをリセットするように構成される、条項17および18のいずれかに記載の装置。
20.前記処理回路が、前記第1のMビット値の前記Nビット部分のうちの1つのための前記重複ビットが所定値を有することを検出することに応答して、前記重複削減演算を実行するように構成される、条項7から16のいずれかに記載の装置。
21.前記処理回路が、前記第1のMビット値に対する処理動作を実行するときに前記第1のMビットデータ値の前記Nビット部分のうちの1つからのオーバーフローを検出することに応答して、前記重複削減演算を実行するように構成される、条項7から16のいずれかに記載の装置。
22.前記処理回路が、変換動作を実行して、前記冗長表現を有する第1のMビット値を異なる表現の変換値に変換するように構成される、条項1から21のいずれかに記載の装置。
23.前記変換動作が、重複伝搬演算を実行して、最初のMビット値の1つまたは複数のNビット部分の前記重複ビットを前記最初のMビット値の1つまたは複数の後続のNビット部分に伝搬して、前記冗長表現を有する前記第1のMビット値を生成することと、
前記第1のMビット値を前記変換値に変換することと、
を含む、条項22に記載の装置。
24.前記処理回路が、前記アンカー値に依存して、前記第1のMビット値の各Nビット部分を、対応する浮動小数点値にマッピングするように構成される、条項22に記載の装置。
25.前記処理回路が、前記変換された値として、前記第1のMビット値の各Nビット部分からマッピングされた前記それぞれの浮動小数点値を含むベクトルを出力するように構成される、条項24に記載の装置。
26.前記処理回路が、前記第1のMビット値の各Nビット部分からマッピングされた前記それぞれの浮動小数点値を加算して、前記変換された値として単一の浮動小数点値を生成するように構成される、条項24に記載の装置。
27.前記第1のMビット値が3つ以上のNビット部分を含むとき、前記処理回路が、前記第1のMビット値の前記最下位Nビット部分からマッピングされた前記浮動小数点値で始まり、前記第1のMビット値の前記最上位Nビット部分からマッピングされた前記浮動小数点値で終わる順序で、前記それぞれの浮動小数点値を加算するように構成される、条項26に記載の装置。
28.前記変換された値が浮動小数点値であるとき、前記処理回路が、前記第1のMビット値の少なくとも1つのNビット部分の非重複ビットの中から選択されたビットの選択されたグループを、ビットの前記選択されたグループよりも下位の前記第1のMビット値のビットに基づいて、丸めることにより、前記浮動小数点値の仮数部を形成するように構成される、条項22に記載の装置。
29.前記アンカー値がプログラム可能である、条項1から28のいずれかに記載の装置。
30.前記Nビット部分の各々が、N/2以下の重複ビットを有する、条項1から29のいずれかに記載の装置。
31.前記重複ビットが符号付き整数値を表す、条項1から30のいずれかに記載の装置。
32.前記処理回路が、重複サイズ値に基づいて、前記冗長表現の少なくとも1つのNビット部分のための重複ビットの前記数を識別するように構成される、条項1から31のいずれかに記載の装置。
33.前記重複サイズ値がプログラム可能である、条項32に記載の装置。
34.前記重複サイズ値が制御レジスタ内で指定される、条項32および33のいずれかに記載の装置。
35.前記アンカー値が、前記重複サイズ値と同じ前記制御レジスタ内で指定される、条項34に記載の装置。
36.前記重複サイズ値が、前記冗長表現を有する少なくとも1つのデータ値を処理するように前記処理回路を制御するためのデータ処理命令によって指定される、条項33に記載の装置。
37.前記重複サイズ値が、前記冗長表現の前記Nビット部分のうちの2つ以上に対して別々に重複ビットの前記数を指定する、条項32から36のいずれかに記載の装置。
38.累積命令に応答して、前記複数の加算回路ユニットが、アキュムレータレジスタに格納されたMビットアキュムレータ値を含む前記冗長表現を有する前記少なくとも2つのMビットデータ値のうちの1つとの、前記複数のNビット加算を実行するように構成され、前記処理回路が、前記アキュムレータレジスタに前記Mビット結果値を書き込むように構成される、条項2に記載の装置。
39.所定のタイプの命令に応答して、各Nビット加算が、少なくとも3つのMビットデータ値の対応するNビット部分を加算することを含む、条項2に記載の装置。
40.各加算回路ユニットが、前記少なくとも3つのMビット値の対応するNビット部分を結合して、2つのNビット項を生成するためのウォレスツリーと、前記2つのNビット項を加算して、前記Mビット結果値の前記対応するNビット部分を生成するための桁上げ伝搬加算器と、を含む、条項39に記載の装置。
41.複数の入力データ要素を含む入力ベクトルを識別する所定のタイプの命令に応答して、前記処理回路が、前記入力ベクトルの対応する入力データ要素内で指定されたそれぞれの値に対応する前記少なくとも2つのMビットデータ値によって、前記Nビット演算を実行するように構成される、条項1から40のいずれかに記載の装置。
42.前記所定のタイプの命令に応答して、前記処理回路が、前記入力ベクトルの入力データ要素の第1のサブセットに対応するMビットデータ値に対してNビット演算の第1のセットを、前記入力ベクトルの入力データ要素の第2のサブセットに対応するMビットデータ値に対してNビット加算の第2のセットを、実行するように構成される、条項41に記載の装置。
43.前記処理回路が、プログラム可能な入力マップ情報に依存して、どの入力データ要素が前記第1のサブセットまたは前記第2のサブセットにあるかを選択するように構成される、条項42に記載の装置。
44.前記少なくとも2つのMビットオペランド値が、2つのオペランド値を乗算するための少なくとも1つの乗算命令に応答して、前記処理回路によって生成された複数の部分積を含む、条項1から43のいずれかに記載の装置。
45.M>P>Nとして、複数のNビット部分を使用してPビット数値を表す冗長表現を有するMビットデータ値を処理するステップを含む、データ処理方法であって、
アンカー値に基づいて前記冗長表現の各Nビット部分のビットの有効桁が識別され、少なくとも2つの隣接するNビット部分のグループ内で、当該グループの下位Nビット部分の複数の重複ビットが、当該グループの少なくとも1つの上位Nビット部分の複数の最下位ビットと同じ有効桁を有し、
前記処理するステップが、複数の独立したNビット演算を並列に実行するステップを含み、各Nビット演算が、前記冗長表現を有するMビット結果値の対応するNビット部分を生成するために、前記冗長表現を有する少なくとも2つのMビットオペランド値の対応するNビット部分の関数を計算することを含む、
方法。
46.M>P>Nとして、複数のNビット部分を使用してPビット数値を表す冗長表現を有するMビットデータ値を処理するための手段を含む装置であって、
前記処理するための手段が、アンカー値に基づいて前記冗長表現の各Nビット部分のビットの有効桁を識別するように構成され、少なくとも2つの隣接するNビット部分のグループ内で、当該グループの下位Nビット部分の複数の重複ビットが、当該グループの少なくとも1つの上位Nビット部分の複数の最下位ビットと同じ有効桁を有し、
前記処理するための手段が、複数の独立したNビット演算を並列に実行するための手段を含み、各Nビット演算が、前記冗長表現を有するMビット結果値の対応するNビット部分を生成するために、前記冗長表現を有する少なくとも2つのMビットオペランド値の対応するNビット部分の関数を計算することを含む、
装置。
47.M>P>Nとして、第2のデータ値を生成するために第1のデータ値に対して重複伝搬演算を実行する処理回路であって、前記第1および第2のデータ値が、複数のNビット部分を含むMビットデータ値を使用してPビット数値を表す冗長表現を有し、前記冗長表現において、最上位Nビット部分以外の各Nビット部分が、後続のNビット部分の複数の最下位ビットと同じ有効桁を有する複数の重複ビットを含む処理回路を含む装置であって、
前記処理回路が、前記第1のデータ値の対応するNビット部分の非重複ビットを、前記第1のデータ値の先行するNビット部分の前記重複ビットに加算することを含む加算演算を実行することにより、最下位Nビット部分以外の前記第2のデータ値の各Nビット部分を生成するように構成される、
装置。
48.前記第2のデータ値において、重複ビットを有するNビット部分ごとに、前記2つの最下位重複ビットが、値00、01、11のうちの1つを有し、任意の残りの重複ビットが、前記2番目の最下位重複ビットと同じ値を有する、条項47に記載の装置。
49.前記処理回路が、前記第2のデータ値の前記Nビット部分のうちの少なくとも2つについて前記加算演算を並列に実行するように構成される、条項47および48のいずれかに記載の装置。
50.前記処理回路が、前記最下位Nビット部分以外の前記第2のデータ値の前記Nビット部分の各々について前記加算演算を並列に実行するように構成される、条項47から49のいずれかに記載の装置。
51.前記処理回路が、前記第2データ値の前記Nビット部分のうちの少なくとも2つについて前記加算演算を並列に実行する複数の並列加算回路ユニットを含む、条項47から50のいずれかに記載の装置。
52.前記加算演算が、前記先行するNビット部分の前記重複ビットのNビット符号拡張を、任意の重複ビットが0に設定された前記第1のデータ値の前記対応するNビット部分に等価なNビット値に加算することを含む、条項47から51のいずれかに記載の装置。
53.前記処理回路が、非重複ビットが前記第1のデータ値の前記最下位Nビット部分の対応する非重複ビットに等しく、前記重複ビットが0に設定された、前記第2のデータ値の前記最下位Nビット部分を生成するように構成される、条項47から52のいずれかに記載の装置。
54.前記重複伝搬演算が、前記第2のデータ値を、前記冗長表現を有する第3のデータ値に変換することをさらに含み、前記第3のデータ値のすべての重複ビットが0に等しい、条項47から53のいずれかに記載の装置。
55.前記処理回路が、
前記第2のMビット値の前記重複ビットの総計を表す重複値と、前記第2のMビット値の前記非重複ビットの総計を表す非重複値と、を生成することと、
前記重複値と、前記非重複値と、のビットパターンに依存して、複数の桁上げ値を生成することと、
各加算が、前記重複値および前記非重複値の対応する部分と前記桁上げ値のうちの1つを加算して、前記第3のデータ値の対応する部分を生成するためである、複数の並列加算を実行することと、
により、前記第3のデータ値を生成するように構成される、条項54に記載の装置。
56.入力オペランドを識別する命令に応答して、前記処理回路が、
前記加算演算が、
前記第1のデータ値の前記対応するNビット部分の前記非重複ビットと、
前記第1のデータ値の前記先行するNビット部分の前記重複ビットと、
前記冗長表現を有し前記入力オペランドに対応する第3のデータ値の対応するNビット部分と、
を加算することを含む、
前記重複伝搬演算を実行するように構成される、条項47から55のいずれかに記載の装置。
57.前記入力オペランドが前記冗長表現以外の表現を有し、前記命令に応答して、前記処理回路が前記入力オペランドを前記第3のデータ値に変換するように構成される、条項56に記載の装置。
58.前記重複ビットが符号付き整数値を表す、条項47から57のいずれかに記載の装置。
59.前記処理回路が、重複サイズ値に基づいて重複ビットの前記数を識別するように構成される、条項47から58のいずれかに記載の装置。
60.前記重複サイズ値がプログラム可能である、条項59に記載の装置。
61.前記処理回路が、アンカー値に基づいて前記冗長表現を使用して表されるデータ値の各Nビット部分のビットの有効桁を識別するように構成される、条項47から60のいずれかに記載の装置。
62.前記処理回路が、前記第1データ値を生成するために実行される演算の数を示す演算カウントを保持し、演算の前記数が所定数以上であることを前記演算カウントが示すときに前記重複伝搬演算を実行するように構成される、条項47から61のいずれかに記載の装置。
63.前記所定数が2V−1−2以下であり、ここでVは重複ビットを有する前記Nビット部分のうちのいずれかによって構成される重複ビットの前記最小数である、条項62に記載の装置。
64.前記処理回路が、前記重複伝搬演算が実行されたときに前記演算カウントをリセットするように構成される、条項62および63のいずれかに記載の装置。
65.前記処理回路が、前記第1のデータ値の前記Nビット部分のうちの1つのための前記重複ビットが所定値を有することを検出することに応答して、前記重複伝搬演算を実行するように構成される、条項47から61のいずれかに記載の装置。
66.前記処理回路が、前記第1のデータ値に対する処理動作を実行するときに前記第1のデータ値の前記Nビット部分のうちの1つからのオーバーフローを検出することに応答して、前記重複伝搬演算を実行するように構成される、条項47から61のいずれかに記載の装置。
67.M>P>Nとして、複数のNビット部分を含むMビットデータ値を使用してPビット数値を表す冗長表現を有する第1のデータを受け取るステップであって、前記冗長表現において、最上位Nビット部分以外の各Nビット部分が、後続のNビット部分の複数の最下位ビットと同じ有効桁を有する複数の重複ビットを含む、受け取るステップと、
前記冗長表現を有する第2のデータ値を生成するために、前記第1のデータ値に対して重複伝搬演算を実行するステップと、
を含む、データ処理方法であって、
前記第1のデータ値の対応するNビット部分の非重複ビットを、前記第1のデータ値の先行するNビット部分の前記重複ビットに加算することを含む加算演算を実行することにより、最下位Nビット部分以外の前記第2のデータ値の各Nビット部分が生成される、
方法。
68.M>P>Nとして、第2のデータ値を生成するために第1のデータ値に対して重複伝搬演算を実行するための手段であって、前記第1および第2のデータ値が、複数のNビット部分を含むMビットデータ値を使用してPビット数値を表す冗長表現を有し、前記冗長表現において、最上位Nビット部分以外の各Nビット部分が、後続のNビット部分の複数の最下位ビットと同じ有効桁を有する複数の重複ビットを含む実行するための手段を含む装置であって、
前記実行するための手段が、前記第1のデータ値の対応するNビット部分の非重複ビットを、前記第1のデータ値の先行するNビット部分の前記重複ビットに加算することを含む加算演算を実行することにより、最下位Nビット部分以外の前記第2のデータ値の各Nビット部分を生成するように構成される、
装置。
69.結果ベクトルの対応する結果データ要素を生成するために、少なくとも1つのオペランドベクトルのそれぞれのデータ要素に対して複数レーンの処理を実行する処理回路を含む装置であって、
前記処理回路が、処理のレーンごとにレーン位置情報を識別するように構成され、所与のレーン用の前記レーン位置情報が、前記結果ベクトルの1つまたは複数の結果データ要素にまたがる対応する結果データ値内で前記所与のレーンによって生成されるべき前記対応する結果データ要素の相対位置を識別し、
前記処理回路が、そのレーンについて識別された前記レーン位置情報に依存して、処理の各レーンを実行するように構成される、
装置。
70.前記所与のレーン用の前記レーン位置情報が、前記対応する結果データ要素が前記対応する結果データ値の最上位データ要素であるかどうかを識別する、条項69に記載の装置。
71.処理の前記レーンのうちの1つについて検出されたオーバーフロー状態に応答して、前記処理回路が、前記対応する結果データ要素が前記対応する結果データ値の前記最上位データ要素であることを、処理の前記レーンのうちの前記1つについての前記レーン位置情報が示すかどうかに依存して、複数のオーバーフロー処理応答のうちの1つを選択するように構成される、条項70に記載の装置。
72.前記所与のレーン用の前記レーン位置情報が、前記対応する結果データ要素が前記対応する結果データ値の最下位データ要素であるかどうかを識別する、条項69から71のいずれかに記載の装置。
73.前記所与のレーン用の前記レーン位置情報が、前記対応する結果データ要素を、
前記対応する結果データ値の最下位データ要素、
前記対応する結果データ値の最上位データ要素、
前記対応する結果データ値の中間データ要素、
のうちの1つとして識別する、条項69から72のいずれかに記載の装置。
74.前記レーン位置情報が2ビットインジケータを含む、条項73に記載の装置。
75.処理の最上位または最下位レーンについての前記レーン位置情報が、前記対応する結果データ要素を前記対応する結果データ値の中間データ要素として識別するとき、前記処理回路が、前記結果ベクトルよりも多い数のビットを有する結果データ値の部分的部分を表す前記結果ベクトルを生成するように構成される、条項73および74のいずれかに記載の装置。
76.処理の最上位または最下位レーン以外の処理の中間レーンについての前記レーン位置情報が、前記対応する結果データ要素を前記対応する結果データ値の前記最下位データ要素または前記最上位データ要素として識別するとき、前記処理回路が、2つ以上の独立した結果データ値を含む前記結果ベクトルを生成するように構成される、条項73から75のいずれかに記載の装置。
77.前記レーン位置情報が、前記結果ベクトルが少なくとも2つの独立した結果データ値を含むことを識別するとき、複数の入力データ要素を含む入力ベクトルを識別する所定のタイプの命令に応答して、前記処理回路が、少なくとも
前記独立した結果データ値の第1を生成するように前記入力ベクトルの入力データ要素の第1のサブセットからマッピングされた前記少なくとも1つのオペランドベクトルのデータ要素の第1のサブセットに対する処理のレーンの第1のサブセットと、
前記独立した結果データ値の第2を生成するように前記入力ベクトルの入力データ要素の第2のサブセットからマッピングされた前記少なくとも1つのオペランドベクトルのデータ要素の第2のサブセットに対する処理のレーンの第2のサブセットと、
を実行するように構成される、条項69から76のいずれかに記載の装置。
78.前記処理回路が、プログラム可能な入力マップ情報に依存して、どの入力データ要素が入力データ要素の前記第1のサブセットまたは入力データ要素の前記第2のサブセットにあるかを選択するように構成される、条項77に記載の装置。
79.前記処理回路が、前記複数の処理のレーンを並列に実行する複数の処理回路ユニットを含む、条項69から78のいずれかに記載の装置。
80.前記レーン位置情報がプログラム可能である、条項69から79のいずれかに記載の装置。
81.レーンごとの前記レーン位置情報が制御レジスタ内で指定される、条項69から80のいずれかに記載の装置。
82.前記処理回路が、アンカー値に基づいて、前記少なくとも1つのオペランドベクトルまたは前記結果ベクトルの各データ要素のビットの有効桁を識別するように構成される、条項69から81のいずれかに記載の装置。
83.前記レーン位置情報および前記プログラム可能なアンカー値が、同じ制御レジスタ内で指定される、条項82に記載の装置。
84.前記対応する結果値の最上位結果データ要素以外の結果データ要素が、後続の結果データ要素の複数の最下位ビットと同じ前記有効桁を有する複数の重複ビットを含む、条項69から83のいずれかに記載の装置。
85.前記レーン位置情報と重複ビットの前記数を識別する重複値とが、同じ制御レジスタ内で指定される、条項69から84のいずれかに記載の装置。
86.結果ベクトルの対応する結果データ要素を生成するために、少なくとも1つのオペランドベクトルのそれぞれのデータ要素に対して実行されるべき複数の処理レーンの各々についてのレーン位置情報を識別するステップであって、所与のレーン用の前記レーン位置情報が、前記結果ベクトルの1つまたは複数の結果データ要素にまたがる対応する結果データ値内で前記所与のレーンによって生成されるべき前記対応する結果データ要素の相対位置を識別する、識別するステップと、
そのレーンについて識別された前記レーン位置情報に依存して、処理の各レーンを実行するステップと
を含む、データ処理方法。
87.結果ベクトルの対応する結果データ要素を生成するために、少なくとも1つのオペランドベクトルのそれぞれのデータ要素に対して複数レーンの処理を実行するための手段
を含む装置であって、
前記実行するための手段が、処理のレーンごとにレーン位置情報を識別するように構成され、所与のレーン用の前記レーン位置情報が、前記結果ベクトルの1つまたは複数の結果データ要素にまたがる対応する結果データ値内で前記所与のレーンによって生成されるべき前記対応する結果データ要素の相対位置を識別し、
前記実行するための手段が、そのレーンについて識別された前記レーン位置情報に依存して、処理の各レーンを実行するように構成される、
装置。
88.複数のXビット部分を含む第1のオペランドと、少なくとも1つのYビット部分を含む第2のオペランドとを乗算するためのデータ処理方法であって、
各部分積が前記第1のオペランドの選択されたXビット部分と前記第2のオペランドの選択されたYビット部分との積を含む、複数の部分積を生成するステップと、
部分積ごとに、前記部分積の有効桁を示す有効桁指示情報に依存して、前記部分積を冗長表現に変換するステップであって、前記冗長表現において、前記部分積が複数のNビット部分を使用して表され、前記冗長表現の少なくとも2つの隣接するNビット部分のグループ内で、当該グループの下位Nビット部分の複数の重複ビットが、当該グループの少なくとも1つの上位Nビット部分の複数の最下位ビットと同じ有効桁を有する、変換するステップと、
前記冗長表現で表される前記複数の部分積を加算するステップと、
を含む、方法。
89.前記部分積を加算するステップが、前記冗長表現で表される前記部分積のそれぞれのNビット部分を使用して、独立したNビット加算を実行するための複数のNビット加算回路ユニットを使用して実行される、条項88に記載の方法。
90.前記部分積を加算するステップが、前記冗長表現を有するアキュムレータ値を格納するアキュムレータレジスタに前記部分積を累積するステップを含む、条項88および89のいずれかに記載の方法。
91.前記乗算が複数の部分積累積演算を含み、各部分積累積演算が、前記選択されたXビット部分および前記選択されたYビット部分として選択された異なるペアの部分に対応し、
前記複数の部分積のうちの1つを生成するために、前記選択されたXビット部分と前記選択されたYビット部分とを乗算するステップと、
前記有効桁指示情報に依存して、前記複数の部分積のうちの前記1つを前記冗長表現に変換するステップと、
更新されたアキュムレータ値を生成するために、前記冗長表現内の前記複数の部分積のうちの前記1つを、前記冗長表現を有する累積値に加算するステップと、
を含み、
1つの部分積累積演算のための前記更新されたアキュムレータ値が、次の部分積累積演算のための前記アキュムレータ値として使用される、
条項88から90のいずれかに記載の方法。
92.前記冗長表現における前記複数の部分積を加算した結果に対して重複伝搬演算を実行するステップを含み、前記重複伝搬演算が、前記結果の1つまたは複数のNビット部分の前記重複ビットを、前記結果の1つまたは複数の後続のNビット部分に伝搬することを含む、条項88から91のいずれかに記載の方法。
93.前記部分積累積演算が、各部分積累積演算において生成された前記部分積の有効桁の昇順で実行され、
当該方法が、各重複伝搬加算が、前記アキュムレータ値の所与のNビット部分の前記重複ビットを、前記アキュムレータ値の後続のNビット部分の非重複ビットに加算することを含む、複数の重複伝搬加算を実行するステップを含み、
前記複数の重複伝搬加算のうちの少なくとも1つが、前記部分積累積演算のうちの少なくとも1つの前記加算ステップと並列に実行される、
条項91に記載の方法。
94.前記有効桁指示情報が、前記第1のオペランド内の前記選択されたXビット部分と前記第2のオペランド内の前記選択されたYビット部分との相対位置に依存する、条項88から93のいずれかに記載の方法。
95.前記有効桁指示情報が、前記選択されたXビット部分および前記選択されたYビット部分のうちの少なくとも1つに関連付けられた有効桁指示パラメータに依存する、条項88から94のいずれかに記載の方法。
96.前記有効桁指示情報が、前記部分積のうちの少なくとも1つを生成するように処理回路を制御するための命令によって指定されたパラメータに依存する、条項88から95のいずれかに記載の方法。
97.前記有効桁指示情報が、前記第1のオペランドのどのXビット部分が前記選択されたXビット部分であるかを識別する前記命令のパラメータに依存する、条項88から96のいずれかに記載の方法。
98.前記第1のオペランドおよび前記第2のオペランドが整数を含む、条項88から97のいずれかに記載の方法。
99.X≦53およびY≦53である、条項88から98のいずれかに記載の方法。
100.各部分積が、2つの浮動小数点値の仮数部を乗算するための浮動小数点乗算回路を使用して生成される、条項99に記載の方法。
101.前記第1のオペランドを浮動小数点値の対応するベクトルにマッピングするステップを含み、各浮動小数点値が、前記第1のオペランドのそれぞれのXビット部分からマッピングされた仮数部と、前記第1のオペランド内のそのXビット部分の有効桁に依存する指数部とを有し、
所与の部分積についての前記有効桁指示情報が、前記所与の部分積を生成するために使用される前記選択されたXビット部分に対応する前記浮動小数点値の前記指数部に依存する、
条項88から100のいずれかに記載の方法。
102.X=Yである、条項88から101のいずれかに記載の方法。
103.XがYと異なる、条項88から102のいずれかに記載の方法。
104.条項88から103のいずれかに記載の方法を実行するように構成された処理回路を含むデータ処理装置。
105.部分積を生成するために、複数のXビット部分を含む第1のオペランドの選択されたXビット部分と、少なくとも1つのYビット部分を含む第2のオペランドの選択されたYビット部分とを乗算する乗算回路と、
前記部分積の有効桁を示す有効桁指示情報に依存して、前記部分積を、冗長表現を有する変換部分積に変換する変換回路であって、前記冗長表現において、前記部分積が複数のNビット部分を使用して表され、前記冗長表現の少なくとも2つの隣接するNビット部分のグループ内で、当該グループの下位Nビット部分の複数の重複ビットが、当該グループの少なくとも1つの上位Nビット部分の複数の最下位ビットと同じ有効桁を有する、変換回路と、
前記変換部分積を、前記冗長表現を有するアキュムレータ値に加算する加算回路と、
を含む、データ処理装置。
106.前記加算回路が、前記変換部分積の対応するNビット部分および前記アキュムレータ値を使用して、独立したNビット加算を実行する複数のNビット加算回路ユニットを含む、条項105に記載のデータ処理装置。
107.前記選択されたXビット部分および前記選択されたYビット部分として選択された部分の様々な組合せに対応する、前記冗長表現内の複数の変換部分積を生成するように、前記乗算回路および前記変換回路を、かつ、前記複数の部分積の各々を前記アキュムレータ値に加算するように前記加算回路を、制御するために、少なくとも1つの乗算命令に応答する制御回路を含む、条項105および106のいずれかに記載のデータ処理装置。
108.部分積を生成するために、複数のXビット部分を含む第1のオペランドの選択されたXビット部分と、少なくとも1つのYビット部分を含む第2のオペランドの選択されたYビット部分とを乗算するための手段と、
前記部分積の有効桁を示す有効桁指示情報に依存して、前記部分積を、冗長表現を有する変換部分積に変換するための手段であって、前記冗長表現において、前記部分積が複数のNビット部分を使用して表され、前記冗長表現の少なくとも2つの隣接するNビット部分のグループ内で、当該グループの下位Nビット部分の複数の重複ビットが、当該グループの少なくとも1つの上位Nビット部分の複数の最下位ビットと同じ有効桁を有する、変換するための手段と、
前記変換部分積を、前記冗長表現を有するアキュムレータ値に加算するための手段と、
を含む、データ処理装置。
本出願において、「…ように構成された」という単語は、装置の要素が定義された動作を実行することができる構成を有することを意味するために使用される。この文脈において、「構成」は、ハードウェアまたはソフトウェアの相互接続の配置または方式を意味する。たとえば、装置は、定義された動作を提供する専用のハードウェアを有してもよく、またはプロセッサもしくは他の処理デバイスは、機能を実行するようにプログラムされてもよい。「ように構成された」は、定義された動作を提供するために、装置要素が何らかの方法で変更される必要があることを意味しない。
本発明の例示的な実施形態が添付の図面を参照して本明細書に詳細に記載されたが、本発明はそれらの厳密な実施形態に限定されず、添付の特許請求の範囲によって規定される本発明の範囲および精神から逸脱することなく、様々な変更および修正が当業者によって達成され得ることが理解されるべきである。
付録A−冗長HPA、実例
(この付録では、m.s.b.は「最上位ビット」を指し、l.s.b.は「最下位ビット」を指す。)
累積用の高精度(HPA)形式は、累積値が符号を変えるにつれて非常に長い加算/減算および上位レーンにわたる面倒な符号計算を意味するクロスレーン加算を必要とする場合がある。また、HPAは、(好ましくは、ベクトルの各要素が独立して処理されることを可能にする)SIMDベクトル処理のまさしく概念に違反している。したがって、レーンにわたって桁上げを伝搬するべきではなく、レーン内で桁上げを収容できるいくつかの「重複」ビットをレーンが含む、冗長HPA(「RHPA」)が提案される。これにより、HPAのロングワード長加算がいくつかのより小さいSIMDの2の補数の加算として実行されることが可能になる。
ベクトルZw[3:0]が、4つの64ビットレーンの最下位ビットの重みを64ビット符号付き要素として含むと仮定する。RHPA値では、これらの値は、レーン幅(64)ではなく64−ovlpだけレーン間で異なり、ここで、ovlpは、隣接するレーン間にある重複ビット数を指定するために使用されるパラメータである。付録Aの例では、ovlp=4である。したがって、HPAのm.s.b.が(単精度IEEE浮動小数点数の最大指数部よりも数ビット多く、最終結果が倍精度に変換される必要があることを意味する)+140の有効桁に設定されている場合、ovlp=4である4つのレーン用のZw[n]の値は、{+77,+17,−43,−103}になる。これにより、非冗長表現の4×64ビットレーンHPAで取得可能な256ビットではなく、244ビットの有効HPAワード長が得られる。
FPからRHPAへの変換
入力FP数は各レーンにブロードキャストされる。各レーン内のロジックは、FPの指数部をそのローカルZw値と比較し、指数部がZw[n]よりも小さい場合、そのレーン内にビットは設定されず、指数部がZw[n]以上である場合、レーンはZw値、FP指数部、およびFP精度から計算された量だけFP数を左シフトし、左シフト値があるしきい値を上回る場合、そのレーン内にもビットは設定されない。
変換アルゴリズムの要約:
1.ベクトルレーンZa[n]にFP[31:0]をブロードキャストする
2.計算された量だけ各レーン内の仮数部を左シフトする(またはすべてのビットをゼロに設定する)
3.入力FP数が負であった場合、すべての符号ビットをovlpビットに格納するように、あらゆるレーンの2の補数を別々に取り、符号拡張する。
例1:正の単精度FP数をHPAに変換する
入力された32−bのFP数=+1.fffffe×239
指数部(FP)−4レーン用のZw[n](ovlp=4である、上記の紹介から取られたZw値):
レーン3:39−77=−38;負、したがってすべてゼロ
レーン2:39−17=+22;正、したがって22+1箇所左にシフトする
レーン1:39−−43=+82;正、したがって82+1箇所左にシフトする
レーン0:39−−103=+142;正、142+1=143≧60+24、したがってすべてゼロ
(注:レーン内の左シフト距離≧64−ovlp+仮数部ワード長である場合、仮数部はそのレーンの非重複範囲から完全にシフトされるので、レーンは64’b0に設定される。)
図31は最終結果を示し、ここで、下線付き16進数はovlpビットである。
4つのレーンの数値は以下の通りである(Zw[n]と乗算された2の補数として書かれている):
レーン3: 0
レーン2: 64’h0000_0000_007f_ffff×217=+7f_ffff×217
レーン1: 64’h0800_0000_0000_0000×2−43=+1×216
レーン0: 0
変換が成功したことを確認するために、レーンの合計は以下の通りである。
Σレーン=0+ff_fffe×216+1×216+0=ff_ffff×216=1.fffffe×239、入力FP数。
例2:負の単精度FP数をHPAに変換する
同じFP数に適用される変換手順があるが、次にネゲートされる。
入力された32−bのFP数=−1.fffffe×239
指数部(FP)−4つのレーン用のZw[n]は前と同じである:
レーン3:39−77=−38;負、したがってすべてゼロ
レーン2:39−17=+22;正、したがって22+1箇所左にシフトする
レーン1:39−−43=+82;正、したがって82+1箇所左にシフトする
レーン0:39−−103=+142;正、142+1=143≧60+24、したがってすべてゼロ
図32は最終結果を示し、ここで、下線付き16進数はovlpビットである。
4つのレーンの数値は以下の通りである(Zw[n]と乗算された2の補数として書かれている):
レーン3: 0(注:0の2の補数を取ると0が返される!)
レーン2: 64’hffff_ffff_ff80_0001×217=−7f_ffff×217
レーン1: 64’hf800_0000_0000_0000×2−43=−0800_0000_0000_0000×2−43=−1×216
レーン0: 0
Σレーン=0+−ff_fffe×216+−1×216+0=−ff_ffff×216=−1.fffffe×239
RHPAにおける加算
2つのRHPA数は、各レーン内で通常の2の補数加算を別々に実行することによって加算される。加算されるRHPA数のうちの1つがそのすべてのovlpビットが低く設定されていると仮定すると(たとえば、それは上述されたようにFP→RHPA変換の結果なので)、2ovlp−1−1のそのような加算は、レーンのいずれかがオーバーフローする危険なしに順番に実行することができる。ここには、冗長数表現を使用することによって得られる魅力的な利点が存在する。
例3:(「レーンオーバーフロー」を引き起こす)RHPA加算
図33の例では、すべての未指定の16進数はすべて「0」またはすべて「f」のいずれかである。レーン2は、2つの大きい正の数が加算されたためにオーバーフローしており、64−bの2の補数として表されるには正であり過ぎる合計を返す。同様に、レーン0は、2つの大きい負の数が加算されためにオーバーフローしており、64−bの2の補数として表されるには負であり過ぎる合計を返す。最初のケースでは、正しい結果は65−bの2の補数として表され、そのm.s.b.は「0」であり、同様に、2番目のケースでは、正しい結果は65−bの2の補数として表され、そのm.s.b.は「1」である。
標準的な2の補数のオーバーフローロジックは、RHPA加算に起因して任意のレーンでオーバーフローが発生したかどうかを検出する(すなわち、m.s.b.における桁上げインと桁上げアウトが同じであるかどうかをチェックする)ために使用することができる。(最上位を除く)任意のレーンにおいて「レーンオーバーフロー」が発生した場合、ovlpビットはオーバーフローしているレーンのm.s.b.から最上位レーンのl.s.b.にシフトされ、レーンの全幅に符号拡張され、そこにある値に加算される。また、オーバーフローしたレーン内のovlpビットは0にリセットされる。
しかしながら、オーバーフローしたそれらのレーンのみを修正すると、レーンに沿って伝搬する桁上げに起因して他の場所でオーバーフローが発生する可能性がある。したがって、1つまたは複数のレーンにおけるオーバーフロー状態に応答するためのより良い技法は、すべてのレーン内のovlpビットを1レーンシフトアップし、それらを既存値に加算することである。この手順は、(1対のレーンを他のレーンとは異なるように扱う必要がないおかげで)より簡単であるという利点を有するが、すべてのレーンを同時に更新することができるので遅くはない。
例4:RHPA数からレーンオーバーフローを除去する
図34の例では、例3からのオーバーフローする合計は、ovlpビットの並列加算によってオーバーフローしていない(制限付き冗長)表現に変換される。
RHPAからFPへの変換
最上位レーンから始めて、ガードビットおよびスティッキービットを含む目的フォーマットのFP数を形成するために、レーン内の2の補数をZwと結合する。最上位レーンの値が負の場合、これは、IEEE標準FP形式によって必要とされるように、符号絶対値結果を返すために、レーン内の値に対して2の補数演算を実行することを必要とする。次に、この最初のFP結果は、元のHPA特許明細書に記載されているように、次のレーンダウン内の64−b値およびZwの次の低い値と結合される。手順はすべてのレーンにわたって繰り返されて、最終的な変換結果に達する。
あるいは、レーン内の非重複ビットの数がFP形式の仮数部ビットの数よりも小さいか、または等しい場合、各レーンはそれぞれの浮動小数点値に並列にマッピングすることができ、次いで、それらは一緒に加算されて、最終的な変換結果を形成することができる。
RHPA内のアキュムレータオーバーフロー
HPA形式に冗長性を導入すると、ベクトルの全体にわたって桁上げを伝搬する必要なしに、非常に広い加算が可能になり、これにより、HPA加算が1サイクルで(快適に)完了することができるので、重要なパフォーマンス上の利点が構成される。しかしながら、すべての冗長数システムと共通して、全幅RHPAがベクトルをオーバーフローしたかどうかを正確に検出することは困難になる。すなわち、先頭レーンのみがオーバーフローの発生について評価された場合、2つの誤解を招くケースが発生する:
(i)先頭レーンがオーバーフローしたためオーバーフローが発生しているというフラグが立てられる場合があるが、下位レーンはHPAを範囲内に戻す反対の符号付きの値を含んでいる場合がある
(ii)先頭レーンがオーバーフローしていなくても、下位レーンがHPAを範囲外に促す同じ符号付きの値を含んでいる可能性があるため、オーバーフローが検出されなくなる場合がある。
アキュムレータオーバーフローを確実に検出するために、RHPAは非冗長形式に変換することができる。そのような変換を実行するためのアルゴリズムは簡単である:最下位レーンから始まり、ovlpビットを次の(符号拡張付き)最上位レーンに移動し、そこに含まれる値に加算し、最下位レーン内のovlpビットを0にリセットする。1つおいて次の最上位レーン内のovlpビットが先頭レーンに加算されるまで、この手順を一度に1レーン繰り返す。すべてのレーン内のovlpビットが0なので、RHPA値は次に非冗長2の補数として表される。この方法は、前に記載された「レーン重複」除去の直列版であり、リップル桁上げバイナリ加算に類似している。
例5:RHPA数を非冗長形式に変換する
図35の例では、RHPA数の先頭レーンがオーバーフローしている:RHPA値を非冗長形式に変換すると、RHPA数が範囲内にあることがわかる。
先頭レーンのみに基づく場合、アキュムレータのオーバーフロー検出がいかに不正確であるか、すなわち、どれほど多くの誤警報が発生したかについての疑問が残る。レーンの幅によれば、これは「それほど多くない」と信じられる。また、「本当の」重複条件は、パフォーマンスを改善するために、例えば加算の間ではなく複数のFP数の進行中の累積と並行して検出することができる。非冗長RHPAでは、アキュムレータオーバーフローの検出はもちろん簡単である。
概要
冗長高精度アキュムレータ(「RHPA」)が紹介された。RHPAは、そのレーンが次の上位64−bレーンのl.s.b.と同じ有効桁を有するいくつかのm.s.b.「重複」ビットを含むベクトルである。これにより、HPAがSIMDの64−bの2の補数の整数加算として実装されるために必要な非常に長いワード長の加算が可能になる。
RHPA数をその非冗長「正準」形式に変換して、それによりすべてのovlpビットをゼロに設定する方法も説明された。(同様の方式で、レーンオーバーフローを伴うRHPAをどのようにして「準正準」形式にすばやく変換できるかも示された)。非冗長RHPA表現は、アキュムレータのオーバーフローを正確に検出する信頼性の高い方法を提供する。
付録B−桁上げ先見方式による制限付き冗長RHPAから非冗長RHPAへの変換
最初に制限付き冗長形式に変換することにより、非冗長形式に変換するプロセスを高速化することができる。それは、伝搬または生成された+1および−1の値用の重複ビットと非重複ビットの両方を調べる桁上げ先見を行うことを含む。
「制限付き冗長形式への変換」演算の後、非重複ビットは、レーン当たり64−ovlpビットを有するレーンにわたって分割された2の補数を形成する。加えて、各レーンのlsbにおいて、その値が{−1,0,+1}に制限されている次の最下位レーンからの重複ビットが存在する。制限付き冗長形式から非冗長化形式への変換をすばやく完了するために、すべてのレーンにわたって、桁上げ先見ネットワーク用のビットを導出し、生成し、伝搬したい。
非冗長RHPA表現が高い基数の2の補数であれば、ovlpの2進符号付き数のベクトルを第2の高い基数の2の補数に変換することによって開始するべきである。次いで、2つの数字(non−ovlpおよびovlp)から桁上げ先見情報を抽出して、並列SIMD方式でそれらの加算を加速することに注目することができる。
4−bのnon−ovlp+4−bのovlpのフォーマット(上記で使用されたように、N=8、V=4)を使用して、ovlpビットを2の補数に変換するいくつかの例から始めよう。
例A:レーン0/1における−1のovlpがレーン2における+1のnon−ovlpと結合する;レーン2/3における+1のovlp
正しい非冗長形式は以下の通りである。
表現/レイアウトが異なる元の制限付き冗長値:
ovlpを基数16の2の補数に変換する:
レーンにわたる桁上げ伝搬とともにovlpビットとnon−ovlpビットを加算する:
正しい!
例B:レーン0/1における+1のovlpがレーン2/3における−1のovlpと結合する
正しい非冗長形式は以下の通りである。
表現/レイアウトが異なる元の制限付き冗長値:
ovlpを基数16の2の補数に変換し、レーンにわたる桁上げ伝搬とともにnon−ovlpビットに加算する:
正しい!
例C:レーン1/2における−1のovlpが、レーン2/3における+1のovlpではなく、レーン0/1における+1のovlpと結合する
正しい非冗長形式は以下の通りである。
表現/レイアウトが異なる元の制限付き冗長値:
ovlpを基数16の2の補数に変換し、レーンにわたる桁上げ伝搬とともにnon−ovlpビットに加算する:
正しい!
例D:レーン2/3における+1のovlpがレーン1/2およびレーン0/1における−1のovlpと結合する
正しい非冗長形式は以下の通りである。
表現/レイアウトが異なる元の制限付き冗長値:
ovlpを基数16の2の補数に変換し、レーンにわたる桁上げ伝搬とともにnon−ovlpビットに加算する:
正しい!
例E:すべてのレーンにおける−1のovlp
正しい非冗長形式は以下の通りである。
表現/レイアウトが異なる元の制限付き冗長値:
ovlpを基数16の2の補数に変換し、レーンにわたる桁上げ伝搬とともにnon−ovlpビットに加算する:
正しい!
これらの例から、ovlpビットは、先頭レーンを除くすべてのレーン内で、それらの数字が{0,1,24−1,24−2}に制限された数に変換されることがわかり、+ve個の数字{24−1,24−2}は単に{−1、−2}によって置き換えられる。
したがって、変換されたovlpベクトル内に4つの可能な結果数値しか存在しないので、ovlpビットを基数264−ovlpの数に変換するために、2−b/レーンの桁上げ伝搬加算器だけが必要である。
結果の最上位ビット(下線)は、符号付き数ではなく2の補数であるため、常に負の重み付けがされている。
または、(再び例A)−1のovlpの2の補数を取ると
同じ結果が得られる。
例D
は(2の補数で)、
になる(ダブルの場合「d」)。
2−b個の数字は、最後の加算のためにフルレーン幅に符号拡張される。次に、最後の加算がレーンにわたる桁上げを防ぐための桁上げ先見項を導出したい。
4つの可能なovlpの数字が与えられると、non−ovlpビットにおいて対象の4つの相補条件:すべて1(p)、すべて0(k)、1(g)、およびlsb以外すべて1(d)を有し、他の4つの条件の論理NORである1つの余分な条件がプラスされ、理解するために「u」と表記される。下記の表に示されたようにこれらを組み合わせて、レーンレベルのp、g、およびkの条件を導出する。
次いで、レーンごとのgビットが、古典的な接頭理論を使用して導出される
G[0]=g[0]<−レーン1への桁上げイン
G[1:0]=g[1]|p[1]&g[0]
G[2:0]=g[2]|p[2]&g[1]|p[2]&p[1]&g[0]
など
例A…Eでこれをチェックしてみよう.
例A:+ve&−veは、レーンにわたる借りでビットを桁上げする
正解は以下の通りであるべきである。
表現が異なる元の制限付き冗長値:
上述されたように、ovlpおよびnon−ovlpの数字を変換する。
ovlp項およびnon−ovlp項をビット単位で結合してレーンレベルの先見項を取得する:
桁上げ先見ビットを導出する
レーン間の桁上げを無視してSIMD加算を実行する:
正しい!
例B:レーン0/1における+1のovlpがレーン2/3における−1のovlpと結合する
正しい非冗長形式は以下の通りである。
表現が異なる元の制限付き冗長値:
上述されたように、ovlpおよびnon−ovlpの数字を変換する。
ovlp項およびnon−ovlp項をビット単位で結合してレーンレベルの先見項を取得する:
桁上げ先見ビットを導出する
レーン間の桁上げを無視してSIMD加算を実行する:
正しい!
例C:レーン1/2における−1のovlpが、レーン2/3における+1のovlpではなく、レーン0/1における+1のovlpと結合する
正しい非冗長形式は以下の通りである。
表現が異なる元の制限付き冗長値:
上述されたように、ovlpおよびnon−ovlpの数字を変換する。
ovlp項およびnon−ovlp項をビット単位で結合してレーンレベルの先見項を取得する:
桁上げ先見ビットを導出する
レーン間の桁上げを無視してSIMD加算を実行する:
正しい!
例D:レーン2/3における+1のovlpがレーン1/2およびレーン0/1における−1のovlpと結合する
正しい非冗長形式は以下の通りである。
表現が異なる元の制限付き冗長値:
上述されたように、ovlpおよびnon−ovlpの数字を変換する。
ovlp項およびnon−ovlp項をビット単位で結合してレーンレベルの先見項を取得する:
桁上げ先見ビットを導出する
レーン間の桁上げを無視してSIMD加算を実行する:
正しい!
例E:すべてのレーンにおける−1のovlp
正しい非冗長形式は以下の通りである。
表現が異なる元の制限付き冗長値:
上述されたように、ovlpおよびnon−ovlpの数字を変換する。
ovlp項およびnon−ovlp項をビット単位で結合してレーンレベルの先見項を取得する:
桁上げ先見ビットを導出する
レーン間の桁上げを無視してSIMD加算を実行する:
正しい!
方法の要約
1.入力された制限付き冗長数のovlp部およびnon−ovlp部用のレーンごとのp項、g項、k項、d項、およびu項を別々に並行して導出する
ovlp項は、2lビット加算器から取得することができ、lはレーン数である
non−ovlp項は、2lビット加算器と同様の深度を有する論理木として容易に実装される
2.ページ3の表を使用して、p項、g項、k項、d項(およびu項)の2つのセットを、p項、g項、およびk項のみに変換する
3.接頭方程式を使用して、ステップ2で取得されたpビット、gビット、kビットからレーン桁上げ入力を導出し、
ovlp項、p項、g項、k項、d項、およびu項を2ビットから64ビットに符号拡張する
4.SIMD方式でnon−ovlpビット、符号拡張されたovlpビット、および桁上げビットを加算して最終結果を取得する。これは、レーンごとの桁上げインを有する64−b加算器を必要とする。
ページ3の表についての論理式は以下のような可能性がある。