【実施例】
【0059】
例1。DP数F=1.0−ulp=3fef_ffff_ffff_ffffをHPAに変換したいと想定する。バイアス付き指数は3feであり、真の指数は−1であり、仮数部は53個の1である。上のレーンは、指数が低すぎること(レーンの最小重みが14であること)を確認し、そのため、そのビットをゼロで満たす。下のレーンは、ビット[63:50]をゼロに、そしてビット[49:0]を1に設定する。3個の1(値2
−51+2
−52+2
−53に対応する)が仮数部内に残っているが、それらの重みがアンカー値−50未満であるため、これらは変換から除外される。代替的な実装形態は、この変換値を丸める場合があるが、ここでは切り捨てを仮定しよう。
【0060】
例2。F=2
20−ulp=412f_ffff_ffff_ffff。真の指数は19であり、そのためビット[127:70]はゼロであり、[69:17]は1であり、[16:0]はゼロである。この数はぴったり収まるため、丸めは無関係である。各レーンは依然として、独立してそれ自体の64ビットを処理することに留意されたい。
【0061】
例3。F=−2
20=c130_0000_0000_0000。真の指数は20であるが、ここでは符号に対処しなければならない。1つの方法は、正数について行ったように変換を行うが、各レーンで計算する値の1の補数を返し、その後128ビット値に1を加算することである。この場合では、ビット70は、1の補数の前の1セットビットであり、つまりそれは、1の補数の後の1ゼロビットである。128ビット値に1を加算すると、1に設定されたビット[127:70]、およびゼロに設定されたビット[69:0]が与えられる。
【0062】
例4。F=2
80=44f0_0000_0000_0000。真の指数は80であるが、ここでの最大重みは76であり、そのためオーバーフローフラグを設定する。この場合では、ゼロ、またはことによると上位レーン内の最大値および他の場所のゼロを返すことを提案する(下位レーンはオーバーフローのことを知らないため、整数変換の例に従い最大整数を返すことができない)。これは深刻なエラーであり、そのため結果はいずれの場合も無意味になるであろう。
【0063】
例5。F=無限大またはNaN。ゼロを返し、OFC(無限大)またはIOC(NaN)を設定する。
【0064】
各レーンは、同じ方法で変換を行う。1つの方法は、レーンの64ビットのちょうど右に仮数部を位置付け、その後、値lshift=e−bias−Va[i]+1によって仮数部を左にシフトすることである。e’−biasが真の指数eであり、lshift値が負またはゼロである場合は、シフティングが行われないことに留意されたい。
【0065】
概念上、シフタへの入力は、64個のゼロとその後の仮数部から成る64+53=117ビット値である(実際には、64個のゼロは入力上必要とされない)。シフタの出力は、レーンの64ビット値である。有意義なシフト距離(すなわち、仮数ビットをレーン内に出力することができるシフト距離)は、1から64+52=116の範囲である。この範囲外のLshift値は、常にゼロを返すことになるため、いかなるシフティングも必要としない。
【0066】
実施例1では、e=−1であるため、上位レーンはlshift[1]=−1−14+1=−14を有し(負であるためシフトはなく、レーンはすべてゼロを含む)、下位レーンはlshift[0]=−1−(−50)+1=50を有し、そのためこのレーンの下位の50ビットは仮数部の上位50ビットを含む。
【0067】
実施例2では、e=19であるため、lshift[1]=19−14+1=6(仮数部の上位6ビットがシフトインされる)であり、lshift[0]=19−(−50)+1=70である。仮数部の上位6ビットは、レーン0の64ビットを超えてシフトされるため、そのレーンに関しては破棄されることに留意されたい。
【0068】
実施例3では、e=20であるため、lshift[1]=7であり、lshift[0]=71である。入力が負であるため、各レーンは、そのシフトした値の1の補数(および範囲外シフトについてはすべて1)を返す。128ビット加算器へのキャリーインは、変換または加算(HPA+FP)のための2の補数動作を完了するように設定される。減算(HPA−FP)については、変換はFP数を正として扱い、動作を加算に変更するべきである。
【0069】
我々は、DP数のための3つの新たな命令を提案する。
1.ADDO_HPA_DP Vi,Va,F
オーバーフローを伴う加算:Vaのアンカー値を使用してFをHPAに変換し、その後Viに加算する。Fのビットが、Viにおける最大重みビットより大きい場合、または和が(整数)オーバーフローを引き起こす場合、オーバーフローフラグを設定する。この実施例では、Viの上位レーンのみがオーバーフローフラグを設定することができるため、実装形態は、そのレーンを下位レーンから区別することに留意されたい。
2.SUBO_HPA_DP Vi,Va,F
オーバーフローを伴う減算:Vaのアンカー値を使用してFをHPAに変換し、その後Viから減算する。Fのビットが、Viにおける最大重みビットより大きい場合、または差が(整数)オーバーフローを引き起こす場合、オーバーフローフラグを設定する。かさねて、この実施例では、Viの上位レーンのみがオーバーフローフラグを設定することができるため、実装形態は、そのレーンを下位レーンから区別することに留意されたい。
3.CVTO_HPA_DP Vi,Va,F
オーバーフローを伴う変換:Vaのアンカー値を使用してFをHPAに変換する。Fのビットが、Viにおける最大重みビットより大きい場合、オーバーフローフラグを設定する。かさねて、この実施例では、Viの上位レーンのみがオーバーフローフラグを設定することができるため、実装形態は、そのレーンを下位レーンから区別することに留意されたい。
【0070】
少なくともいくつかの実施形態例において、これらの動作は、ベクトル長がSIMD実装形態に収まれば2つの完全パイプライン化サイクルで行うことができることに留意されたい。
【0071】
SIMD実装形態よりも広いベクトルでは、変換および加算は、下位部分から上位部分へと、ばらばらに行われる。上述の多桁加算および減算命令でまさにそうであったように、より上位の部分は、より下位の部分によって生成されたキャリーフラグに対処し、そのため、それを行うバージョンの命令も存在する。
1.ADDCO_HPA_DP Vi,Va,F
キャリーおよびオーバーフローを伴う加算:Vaのアンカー値を使用してFをHPAに変換し、その後Viに加算する。キャリーフラグが高である場合、HPA数の整数部に1を加算する。Fのビットが、Viにおける最大重みビットより大きい場合、または和が(整数)オーバーフローを引き起こす場合、オーバーフローフラグを設定する。
2.SUBCO_HPA_DP Vi,Va,F
キャリーおよびオーバーフローを伴う減算:Vaのアンカー値を使用してFをHPAに変換し、その後Viから減算する。キャリーフラグが高である場合、HPA数の整数部に1を加算する。Fのビットが、Viにおける最大重みビットより大きい場合、または差が(整数)オーバーフローを引き起こす場合、オーバーフローフラグを設定する。
3.CVTCO_HPA_DP Vi,Va,F
キャリーおよびオーバーフローを伴う変換:Vaのアンカー値を使用してFをHPAに変換する。キャリーフラグが高である場合、HPA数の整数部に1を加算する。Fのビットが、Viにおける最大重みビットより大きい場合、オーバーフローフラグを設定する。
【0072】
動作の下位部分がオーバーフローフラグを設定しないように、オーバーフローしないバージョンの命令も存在する。
【0073】
1.ADD_HPA_DP Vi,Va,F
2.SUB_HPA_DP Vi,Va,F
3.CVT_HPA_DP Vi,Va,F
4.ADDC_HPA_DP Vi,Va,F
5.SUBC_HPA_DP Vi,Va,F
6.CVTC_HPA_DP Vi,Va,F
SP数について、類似した命令が存在する。
【0074】
変換命令は厳密には必要でないが、それは、それらがHPA数の整数部がすべてゼロである加算命令と同等であるからである。
【0075】
HPA数が128ビットのベクトルとして実装されると想定する。以下の実施例は、これらの命令がどのように使用され得るかを示す。
【0076】
例6。HPA数は、128ビット値に収まる。すると、HPA数(V0,V10)へのDP数D0の加算は単純に、以下の通りである。
ADDO_HPA_DP V0,V10,D0
より上位の項が存在しないため、キャリーは必要とされないが、オーバーフロー検出は重要である。
【0077】
例7。HPA数は256ビット幅であるが、ハードウェアは一度に128ビットを処理する。HPA数は、下位部分(V0,V10)と上位部分(V1,V11)とに分割される。DP数D0の加算は、今度は以下の通りである。
ADD_HPA_DP V0,V10,D0
ADDCO_HPA_DP V1,V11,D0
両方の命令が、同じDP数D0を受け取ることに留意されたい。このことが必要なのは、D0の仮数部のビットがどこに存在するのか、(V0,V10)内なのか、(V1,V11)内なのか、または両方のベクトルにわたって広がっているのかが、我々には分からないからである。下位ビットから出るオーバーフローは問題にならないため、下位部分はオーバーフロー検出なしで加算される。上位部分は、下位部分からのキャリーを処理しなければならず、上位ビットから出るオーバーフローは常に問題となることからオーバーフローも検出する。
【0078】
例8。HPA数は384ビット幅であるが、ハードウェアは一度に128ビットを処理する。HPA数は、下位部分(V0,V10)と、中間部分(V1,V11)と、上位部分(V2,V12)とに分割される。
【0079】
ADD_HPA_DP V0,V10,D0
ADDC_HPA_DP V1,V11,D0
ADDCO_HPA_DP V2,V12,D0
実施例に概説されたものと同じ理由で、3つすべての命令が同じDP数D0を受け取ることに留意されたい。下位部分および中間部分から出るオーバーフローは問題にならないため、これらの部分両方がオーバーフロー検出なしで加算される。中間部分は、下位部分のキャリーアウトに対処する必要がある。上位部分は、中間部分からのキャリーを処理しなければならず、上位ビットから出るオーバーフローは常に問題となることからオーバーフローも検出する。
【0080】
例9。HPA数は、128ビット値に収まる。すると、HPA数(V0,V10)からのDP数D0の減算は単純に、以下の通りである。
SUBO_HPA_DP V0,V10,D0
より上位の項が存在しないため、キャリーは必要とされないが、オーバーフロー検出は重要である。減算は、D0が変換された128ビット項を反転し、その後1を加算する、通常の方法で行われる。
【0081】
例10。HPA数は384ビット幅であるが、ハードウェアは一度に128ビットを処理する。HPA数は、下位部分(V0,V10)と、中間部分(V1,V11)と、上位部分(V2,V12)とに分割される。
【0082】
SUB_HPA_DP V0,V10,D0
SUBC_HPA_DP V1,V11,D0
SUBCO_HPA_DP V2,V12,D0
実施例に概説されたものと同じ理由で、3つすべての命令が同じDP数D0を受け取ることに留意されたい。この実施例では、すべての場合において、減算される数は反転され(1の補数)、しかし2の補数動作を完了するためのキャリーインは、この実施例では、下位命令であるSUB_HPA_DPのためにしか生成されない。2の補数動作を完了するためのキャリーインは、この実施例では、非キャリーバージョンの減算動作、SUB_HPA_DPおよびSUBO_HPA_DPのためにしか設定されない。この時点で、命令は、まさに実施例3の加算のように進行する。
【0083】
HPAからFPへの変換
上記のように、HPA数(i,a)はベクトル表現(Vi,Va)も有するものと見なし、ここで、Viは64ビット整数のベクトルであり、Vaは、重みVa[0]=aおよびi>0についてはVa[i]=Va[i−1]+64のベクトルである。FPに変換するためには、Viの符号を記録し、Viにおける第1の非符号ビットを見出し、それと形式により指定される数の後続ビット(DPでは52、SPでは23)とから仮数部を構築し、仮数部を丸め、第1のビットの場所および対応する重みから適切な指数を構築する必要がある。
【0084】
簡略化のために、(i,a)をDP(53ビット仮数部)に変換していると仮定しよう。より詳細には、変換ステップは以下の通りである。
1.符号ビットは、iの上位ビットである。それが設定されている場合、HPA数は負であり、それが正数になるように符号反転される。これを行う方法の1つは、HPA数の整数部をゼロから減算することである。元々の符号はFP数の構築に必要とされるために記憶されるが、この変換の残りでは、変換されている値は非負であると仮定される。
2.上位レーンから開始して、各レーンは、先行ゼロカウント(count leading zero)動作(CLZ)を行って、レーン内の最初の1の前のゼロの数を判定する。この数、すなわち先行ゼロ数(LZC)は、1が存在する場合は0〜63の範囲である。1が見出されれば、レーンは、そのビット位置から開始してk=min(64−LZC,53)ビットの仮数部を返し、64−LZC>53である場合、仮数部の右側の次のビット(G)を返し、64−LZC>54である場合、Gの右側のすべてのビット(S)の論理ORを返す。レーンjからのこの情報のすべてが、レーンj−1の上位ビットから取るべき仮数部のビット数である計数53−kと共に、次のレーンj−1に渡される。
図5は、様々なLZCの2つの隣接するレーンから仮数部がどのように構築されるかを示す。最初の1がレーンjで見出された場合、そのレーンのアンカーを使用して、(バイアスなしの)指数:e=V
a[j]+63-LZCを計算する。
3.符号、指数、仮数部、G、およびSは、下位レーンに達するまで右側に動かされる。各中間レーン(下位レーンを含む)は、そのビットのすべての論理ORを用いてSを更新する。下位レーンは、DP数を構築し、何であれ指定された丸めモードに従ってそれを丸める。
【0085】
HPAからFPへの変換は、FPからHPAよりもわずかに遅い。記載のように実装された場合、128ビットのHPA数は、FP出力を構築するのに3サイクル(HPA数を正にするために1サイクル、上位レーンを処理するために1サイクル、そして下位レーンを処理し丸められた結果をもたらすために1サイクル)を要することになる。累算毎にそのような変換が1つ存在するため、このことが問題になる可能性は低い。より大きな実装形態、例えば256または512ビットのベクトルでは、LZCおよびレーン結果がレーン毎にすべて同時に計算され、個別のレーン結果が二進方式で組み合わせられる、より並列な手法の使用が望まれ得る。
【0086】
積和
上述の構築物は、積和を処理するように拡張することができる。丸められた積を加算したい場合は何の変更も必要なく、任意の他のFP数と同様にただ乗算し、その後その積を加算するだけである。丸められていない完全長の積を累算するには、新たな命令が必要になる。
1.MADD_HPA_DP Vi,Va,Dn,Dk。乗算−累算:丸めなしでDn*Dkを計算し(すなわち、完全な106ビットの仮数部積を保持し)、その後、Vaのアンカー値を使用してその積をHPAに変換し、その後、変換された積をViに加算する。
2.MADDO_HPA_DP Vi,Va,Dn,Dk。MADD_HPA_DPと同じだが、変換または加算がオーバーフロー(この実施例では上位レーンのみ)を引き起こした場合、オーバーフローフラグを設定する。
3.MADDC_HPA_DP Vi,Va,Dn,Dk。MADD_HPA_DPと同じだが、キャリーに応答もする。
4.MADDCO_HPA_DP Vi,Va,Dn,Dk。MADD_HPA_DPと同じだが、キャリーに応答もし、変換または加算がオーバーフロー(この実施例では上位レーンのみ)を引き起こした場合、オーバーフローフラグを設定する。
【0087】
少なくともいくつかの実施形態例において、これらの命令は、5サイクル(乗算に3サイクル、HPAへの変換に1サイクル、そしてHPA加算に1サイクル)を要することになると予測される。変換は上に示したものと本質的に同じだが、3つの64ビットレーンに及び得る、より幅広の仮数部を用いる。単一のDP数を各レーンにブロードキャストする代わりに、倍長のDP積が各レーンにブロードキャストされる。
【0088】
乗算・HPA変換命令は単に、Vi=0のMADD命令である。当然ながら、SPの変種、また場合により乗算−減算の変種が存在するであろう。
【0089】
これらの命令は依然として完全にパイプライン化されており、各サイクルで発行され得るため、HPA数がハードウェア長レジスタ内に収まる場合、n個の積の和はn+4サイクルを要することになる。
【0090】
高正確度入力、およびスカラー値によるHPA数の乗算
多項式近似、またはテイラー級数、または初等関数のための範囲縮小など、高い内部正確度を必要とするある特定のアプリケーションでは、FP入力で表現することができるHPA数により高い正確度を含めることが有用であり得る。例えば、定数1/piを128ビット以上の正確度で表現することが望まれる場合がある。これは、所望の値を計算し、それを(64ビットのベクトル部分における)長整数として、正しいアンカーと一緒に記憶することによって、容易に達成される。結果として得られるHPA数は、いずれの他のものとも同様に使用することができる。
【0091】
HPA数(i,a)にFP数fを乗算することが望まれる場合がある。fが仮数部sと真の指数eとを有する場合、その結果はHPA数(i*s,a+e)である。(i,a)がベクトル(Vi,Va)によって表現される場合、これを行う方法の1つは、上位および下位部分を有するスカラー乗算によるベクトルを用いるものである。
MUL_VEC_SCALAR_low Vd,Vi,s
は、Viの64ビットコンポーネントのそれぞれにスカラー64ビットsを乗算し、各レーンが、Vdの対応する部分内にある積の下位64ビットを返す。
MUL_VEC_SCALAR_high Vd,Vi,s
は、Viの64ビットコンポーネントのそれぞれにスカラー64ビットsを乗算し、各レーンが、Vdの対応する部分内にある積の上位64ビットを返す。
【0092】
上位部分はその後、下位部分に加算され得るようにシフトされる。アンカーは、aおよびeを加算する別々の命令、またはVa内のエントリのそれぞれにeを加算するスカラー加算によるベクトルによって調整され得る。
【0093】
積(i*s,a+e)は、元々の(i,a)よりも多くのビットを整数部内に有するため、元々の正確度に再変換し、結果アンカーを調整する命令を有することが有用であり得る。
【0094】
アプリケーション
この節では、サンプルアプリケーションを使用して、いくつかの実施形態例におけるHPAの性能およびエネルギー利益の一部を示す。
【0095】
アプリケーション1。HPAを使用してn個のFP項目を加算する(ここで、HPA数はハードウェアサイズに収まる(例えば、128ビットSIMD上の128ビットHPA))。変換・加算命令は2サイクルの待ち時間を有し、1サイクル当たり1つのHPA加算のスループットで完全パイプライン化されている。
図6は、HPA数(Vi,Va)への4つのFP数の加算を示す。命令は上から下に進み、サイクルは左から右に読み取られ、したがってサイクル1では、第1の加算命令がFP−HPA変換(表中C)を行っており、サイクル2では、第1の加算命令からの変換値が加算され(表中A)、同時に第2の加算命令がそのFP−HPA変換(C)を行っている。
【0096】
概して、演算が結合的かつ(プログラマによって指定される正確度まで)正しいため、n個の値は、n+1のサイクルで加算することができる。対照的に、C規則に従って行われる通常のFP加算は、a×nのサイクル(ここでaはFP加算の待ち時間である)、つまりARMの最速のFPU上で3nのサイクルを要することになる。これすら、HPAの利点を控えめに述べるものである。ARMの「大型」コアは2つの128ビットSIMD整数パイプラインを有し、HPA加算が結合的であることから、容易に2つの累算器を使用し、n個のFP数を約n/2のサイクルで累算し、その後2つの累算器の値を加算して最終和を得ることができる。これは、ARMコア上でのHPA累算が、同じコア上でのFP累算よりも6倍素早くなり得ることを意味する。
【0097】
アプリケーション2。HPAを使用してn個のFP項目を加算する(ここで、HPA数はSIMDハードウェアサイズよりも幅広である(例えば、128ビットSIMD上の256ビットHPA))。変換・加算命令は依然として同じ待ち時間を有するが、各HPA値につき2つの変換および加算が必要である。
図7は、HPA数(Vi,Va)への2つのFP数の加算を示す。ViおよびVaは、上位および下位部分に分けられ、各FP数はまず下位部分に加算され、その後、より下位の部分のキャリーアウトと共に上位部分に加算される。
【0098】
n個の項目をこの方法で加算するには、2n+1のサイクルを要するが、それでもFP累算より素早い。アプリケーション1で示したように、第2のSIMDユニットを使用することにより、この待ち時間を半減させることもできる。
【0099】
アプリケーション3。FP AMRコーデック。このコーデックは、その処理時間の大部分を、DPを使用して40個のSP積を加算しSPに再変換する単純なサブルーチンDotproduct40に費やす。このサブルーチンは当然、切り捨て誤差がSPにおいて問題含みであったため、累算にDPを使用する。ARMの最速FPU上では、このルーチンは最低126サイクル(40のSP乗算、40のSP−DP変換、39のDP加算、加えて1のSPへの再変換)を要するであろう。C順序付け規則のため、DP加算単独で39×3=117サイクルを要する。HPAを使用して同じことを行えば、Dotproduct40は、1つのSIMDユニット上で47サイクル(40のHPA乗算−加算、および1のHPA−SP変換)において行われ得る。アプリケーション1で示したように、第2のSIMDユニットを使用することにより、この待ち時間を半減させることもできる。より素早いことに加えて、HPAソリューションは、大幅に少ない制御論理を使用し(命令の約1/3、多数のフェッチ、デコード、発行、およびリタイアリソースを節約する)、そのため、大幅に少ない電力を要すると考えられる。大幅に少ないエネルギーを要するのは確かであろう。
【0100】
アプリケーション4。密行列乗算、最も単純なアルゴリズム。これは、すべての行にすべての列を掛けた一連のドット積である。HPA乗算−加算は、いかなる数のプロセッサ上でも再現可能な(そして正しい)方法でこれを行うことができる。高速化は、単一のプロセッサで3または6倍となり得、並列処理を使用する能力のおかげではるかに大規模な高速化が可能である。
【0101】
例外
HPAの範囲縮小のため、範囲外の数が生じる可能性が大幅に高い。プログラマが正しい境界を確立することができるようなツールおよび手段を提供する必要があるが、特に、境界が侵害されたときに情報を提供する必要がある。我々は、アンダーフロー(underflow)、不正確(inexact)、およびオーバーフロー例外(overflow exception)(FPにより使用される例外と同じ例外、さもなければ新たなHPA特有の例外のいずれか)を使用して境界問題を示すことを提案する。
【0102】
256ビットHPA数(i,a)があると想定する。下位側にa、そして上位側にa+254の、2つの境界が存在する。重みが2
a未満のビットを有するあらゆるFP数は、変換時に何らかの情報を失うことになる。プログラマは重みaを選ぶことによって2
a未満の値が重要でないことを示しているので、これは通常問題にならない。そうは言っても、ビットが失われた事実にフラグを立てる必要がまだある。これを行う方法の1つは、HPAへの変換が下位側のいくつかのビットを破棄するときに不正確フラグを、そしてFP入力全体が破棄されるときにアンダーフローフラグを設定することである。この実施例では、これらの計算は、その非桁上げ命令(non−carrying instructions)については下位レーンにしか適用されないため、実装形態は、そのレーンを区別することができるはずである。
【0103】
2
a+254よりも大きなマグニチュードを有する数の変換は、オーバーフロー例外を設定し、これは常に、プログラムが異なるアンカーを使用して再計算することを要する深刻な問題である。同じ例外が整数加算器におけるオーバーフローに対して起こり、この場合もやはり、解決策は異なるアンカーを使用して再計算することである。HPAプログラムは、プログラムの結果が有意義であるかどうかを確認するためにオーバーフローフラグを調べる必要がある。
【0104】
ほとんどの累算は、FP数の範囲のごく一部を使用するため、それらは、HPA数を使用してより素早くかつ正しく計算することができる。HPA累算は、再現可能かつ並列化可能であり、データ境界を割り出した後は、プログラマにとってFPよりさほど難しくない。当然ながら、FPの結合性の欠如が問題を引き起こす場合では、HPAはプログラマにとって大幅に容易である。FPが不良な結果をもたらす状況を分析するために訓練されている人々は非常に少ない。ありがちな応答の1つは、より幅広いFP形式を使用して再符号化することであるが、このことは、DPより大きなものすべてに対して不良な成果を有する。HPAの使用は、より良好な成果をもたらし、切り捨て問題のうち最も有害なものを排除する。
【0105】
HPAはまた、実装が簡単であり、ARMのSIMDユニットに適度な変更を要する。これらの変更はSIMDユニット自体に面積および電力を少しだけ追加するが、コアレベルでは電力そして特にエネルギーは大幅に低くなる。実行ユニットは、アウトオブオーダーマシン(out−of−order machine)においてエネルギーが主に費やされる場所ではなく、累算の高速化により、エネルギーが費やされている場所で制御論理を停止することが可能になる。
【0106】
図8は、プログラム命令の制御下でデータ処理動作を実行するためのデータ処理装置2を概略的に例示する。データ処理装置2は、プログラム命令6と操作されるデータ8とを記憶するメモリ4を備える。プロセッサコア10は、メモリ4に連結されており、レジスタバンク12、処理回路14、命令フェッチユニット16、命令パイプラインユニット18、および命令デコーダ20を含む。実際にはデータ処理システム2は多くの付加的な要素を含み得ること、また
図8の表現は理解を助けるために簡略化されていることは理解されるであろう。動作中、プログラム命令6は、命令フェッチユニット16によってメモリ4からフェッチされ、命令パイプライン18に供給される。プログラム命令が命令パイプライン18内の適切な段階に達すると、それらは命令デコーダ20によってデコードされ、デコードされたプログラム命令によって指定される処理動作(複数可)を実行するようにレジスタバンク12および処理回路14の動作を制御するよう機能する制御信号を生成する。複数の入力オペランドがレジスタバンク12から読み取られ、処理回路14に供給されてもよく、ここでそれらは操作され、その後、結果値がレジスタバンク12に書き戻される。
【0107】
レジスタバンク12は、多様な異なる形態を有することができる。操作されるオペランドとしては、例えば、浮動小数点オペランド、固定小数点オペランド、整数オペランド、およびHPA数オペランド(後述される)を挙げることができる。レジスタバンク12は、レジスタバンク12の構成に応じて、これらの種類の混合型のオペランドを記憶するように機能してもよい。オペランドは、それらの形式によって予め定義され得るように、またはHPA数オペランドに関連して後述されるようにレジスタに関連付けられたメタデータを使用してプログラム可能に指定され得るように、異なるレベルの精度を有し得る。
【0108】
図9は、浮動小数点オペランドを概略的に例示する。浮動小数点オペランドは通常、符号、指数、および仮数部から形成される。浮動小数点オペランドは、それらの指数値によって指示される多種多様なマグニチュードを有する値を表現することができる。数が表現され得る精度は、仮数部のサイズによって限定される。浮動小数点動作は典型的に、整数演算よりも複雑であり、実装が遅い。
【0109】
図9はまた、64ビットの整数オペランドを例示する。このような整数オペランドは、符号なし整数では0〜(2
64−1)、または符号付き整数では−2
63〜2
63−1の範囲内の数を表現することができる。整数演算は典型的に迅速であり、実行に比較的少ないエネルギーを消費するが、比較的限定された範囲の値をもつ数が、浮動小数点値により表現され得る数の範囲と比較して指定される場合があるという不利点を有する。
【0110】
図9はまた、それぞれ64ビット整数を含む複数コンポーネント(この実施例では3つ)のベクトルを含むHPA数を例示する。HPA数は、それに関連付けられたメタデータを有する。メタデータは、HPA数の一部を形成するコンポーネントのビットのプログラム可能な有効度を示すアンカー値を含む。アンカー値(複数可)は、ビット有効度の下方境界およびビット有効度の上方境界を、直接的または間接的に指定する。以下で使用するメタデータという用語は、HPA数のビット有効度を指定するアンカー値(複数可)を含むデータに対応するものと見なすことができる。異なるコンポーネントが一緒に、ビット有効度のこの範囲に隣接して広がるビット値を指定する。ビット有効度の下方境界およびビット有効度の上方境界の位置に応じて、ビット有効度の範囲は、二進小数点位置を含み得る。二進小数点位置が、特定のHPA値について指定されたビット有効度の範囲外に位置し得る可能性もある。
【0111】
アンカー値(複数可)は、ある浮動小数点値(例えば倍精度FP値)によって表現され得る最小の有効度に対応するビット有効度の下方境界から、その浮動小数点値によって表現され得る最高のビット有効度に対応するビット有効度の上方境界まで及ぶ、ある範囲のビット有効度を表現することができるように提供されてもよい。
【0112】
HPA数を形成するコンポーネントの数は、異なる実装形態間で様々であり得る。コンポーネントのサイズは、一部の実施形態では固定されていてもよいが、他の実施形態では異なってもよい。範囲ビット有効度の全体幅は、一部の実施形態では、固定されたコンポーネントサイズのユニットで変化するように制約され得る(例えば64ビットコンポーネントでは、ビット有効度の範囲は、例えば64、128、192、256、…の幅を有し得る)。ビット有効度の範囲の幅が1ビット幅のステップで連続的に変動し得る可能性もある。
【0113】
前述のように、(メタデータ内の)アンカー値(複数可)は、プログラム可能なビット有効度を多様な異なる方法で指定し得る。一例は、各ベクトルコンポーネントの下方境界ビット有効度を指定することである。したがって、各ベクトルコンポーネントは、そのコンポーネント内の最下位ビットの有効度を表す(アンカリングする)メタデータと一緒に、ビット有効度の全体範囲内にあるその有効ビットの部分を表す整数値を含み得る。別の選択肢は、アンカー値(複数可)が、ビット有効度の範囲の全幅と一緒にHPA数全体のビット有効度の下方境界を指定することである。さらなる選択肢は、アンカー値(複数可)が、ビット有効度の範囲の下方境界および上方境界を指定するデータを含み得ることである。固定幅コンポーネントであることが既知であるコンポーネントの数と一緒にビット有効度の範囲の下方境界を含むアンカー値(複数可)といった、なおもさらなるバリエーションも可能である。
【0114】
図10は、倍精度浮動小数点により表現可能な値のサイズとHPA数の有効度範囲との間の関係を概略的に例示する。倍精度浮動小数点数の場合では、指定され得るビット値のサイズは、およそ2
−1022〜2
+1023に及ぶ(非正規数は計数していない)。2
0を表す二進値は、この範囲のおよそ中間に位置する。
【0115】
例示されるように、HPA数は、浮動小数点値を使用して表現可能なビット有効度の範囲内のビット有効度の枠(window)として見なされ得る、プログラム可能なビット有効度範囲を有する。このプログラム可能なビット有効度は、下方境界および上方境界によって指定され得、下方境界と上方境界との値に応じて、浮動小数点値により提供されるビット有効度の範囲に沿ってスライドすると見なされ得る。枠の幅、ならびにその始点および終点は、ビット有効度を指定する(アンカー値(複数可)を含む)プログラム可能なメタデータの適切な値によって指定され得る。したがって、HPA数は、実行される計算に適合するようにプログラマによって選択される形態を有し得る。
【0116】
図11は、
図1の処理回路14の一部を形成し得る回路22を概略的に例示する。回路22は整合回路24、26を含み、これらは、結果レジスタ28に対して指定され、結果レジスタ28に関連付けられた(アンカー値(複数可)を記憶する)メタデータ記憶装置30内に記憶された、プログラム可能な有効度値に従って、入力オペランドに対して整合動作を実行するように機能する。入力オペランドは、浮動小数点数、固定小数点数、整数値、HPA数、またはこれらの混合物であり得、それらの整数ビットの値が、結果レジスタ28内に記憶されるべき結果値が決定される前に結果レジスタ28に対して指定されたビット有効度と整合されるように、整合される。整合回路24、26は、演算回路32に供給される、整合された入力オペランドを生成する。演算回路32は、例えば、整数加算器または整数乗算器であり得、これは、整合された入力オペランドを整数値として扱い、それに従って、比較的高速かつ低エネルギーの演算動作をこれらの整合された入力オペランドに対して実行する。演算回路32によって生成された結果値は、結果レジスタ28のプログラム可能な有効度に既に整合されており、結果レジスタ28内にHPA数として記憶される。
【0117】
整合回路24、26に供給される入力オペランドのうちの1つ以上が浮動小数点値である場合には、整合回路24、26は、結果レジスタ28に対して指定されたビット有効度と一致するように浮動小数点値の仮数部がどのように整合されるべきかを判断する際に、浮動小数点値の指数値にも応答する。
【0118】
メタデータ記憶素子30内に記憶されたプログラム可能なビット有効度パラメータ(アンカー値(複数可))は、演算回路32によって生成される整合された結果値とは独立しているため、HPA数の正規化が実行されないことは理解されるであろう。したがって、以後説明するように、HPA数に実行される処理に関連して、オーバーフロー、アンダーフロー、および他の例外条件が可能である。
【0119】
図11の例において、プログラム可能な有効度パラメータ(アンカー値(複数可))は、処理が実行される前にメタデータ記憶素子30内に記憶される。他の実施形態では、結果レジスタ28のプログラム可能な有効度パラメータは、入力オペランドのうちの1つ以上がHPAオペランドである場合、それらと関連付けられたプログラム可能な有効度パラメータから取られ得る(例えば、HPA入力オペランドのいずれかのプログラム可能な有効度パラメータのうち最大のものが取られ、結果レジスタ28のプログラム可能な有効度パラメータとして使用され得る)可能性もある。
【0120】
図12は、いくつかの実施形態例において
図1の処理回路14の一部を形成し得る回路を概略的に例示する。この回路34は、それぞれのベクトル記憶素子36、38、40、42内に記憶された複数コンポーネントを含むベクトルの形態のHPA数に処理を実行する。メタデータ記憶素子44(例えばメタデータレジスタ)は、少なくともいくつのコンポーネントが特定のベクトルHPA数を形成するかを含むメタデータを記憶するように機能する。そのベクトルのうち有効度が最も低いコンポーネントがベクトル記憶素子42内に記憶され、有効度がより上位のコンポーネントは、必要に応じてベクトル記憶素子40、38、36内に記憶される。
【0121】
回路34は、ベクトルHPA数のそれぞれのコンポーネントに関連付けられ、実行されているプログラム命令によって指定される加算、減算、および乗算などの動作を実行するように構成され得る、処理回路46、48、50、52をさらに含む。実際には、処理回路46、48、50、および52により実行される処理は、いくつのコンポーネントがベクトルHPA数値を構成するかと、実行されているプログラム命令との両方に依存する。具体的には、ベクトルHPA数が複数コンポーネントから構成されている場合、キャリーアウト値は、最小有効ビット側から開始して処理回路46、48、50、52の異なる部分間に伝搬する。
【0122】
図12に示される例では、4つの別々の処理レーンが例示されている。ベクトルHPA数が4つのコンポーネントを含む場合、これら4つのレーンのすべてが並列に使用され得る。HPA数が2つのコンポーネントを含む場合、そのような2コンポーネントHPA数が2つ並列で
図12の回路内において処理され得、処理回路50および48のコンポーネント間でキャリーを実行しないことも可能である。
【0123】
図13は、
図12の回路の変種を例示する。
図13の回路54において、ベクトルHPA数値は、この場合もやはり、プログラム命令により指定される処理に依存する。この場合、処理回路58は、プログラム命令と、いくつのコンポーネントがベクトルHPA数内に存在するかを示すメタデータとに従って、マイクロ動作生成回路60によって生成される、マイクロ動作命令によって制御される。具体的には、2つの4コンポーネントHPA数間の加算を実行するために4つのペアのコンポーネントが加算される必要がある場合、これら4つの加算は、処理回路58によって連続して実行される。これらの加算のうち最初のものは、キャリーイン入力を有せず、マイクロ動作命令ADDによって表現され得る。次の3つの加算は、前の加算からキャリー入力を受け取り、マイクロ動作命令ADDCによって指定され得る。最終結果のベクトルHPA数が、結果レジスタ62に書き込まれる。
【0124】
図14は、
図1の処理回路14の一部を形成し得る回路64を概略的に例示する。回路64は
図11のものと同様だが、この場合は例外生成回路66を付加的に含む。例外生成回路66は、整合回路68、70および処理回路72からの入力に応答して、多様な例外条件の発生を識別する。これらの例外条件は、入力オペランドのうちの1つが非正規浮動小数点数である;ある数の形式間での変換が不正確であった;生成された結果値が結果レジスタ74のプログラム可能な有効度範囲をアンダーフローさせた;生成された結果値が結果レジスタ74のプログラム可能な範囲の有効度をオーバーフローさせ、ある入力オペランドが無限大の値を有する;非数である;または符号なしの目標値に変換されるときに符号付き値である、という条件のうちの1つ以上を含み得る。様々な他の形態の例外指示が可能であることは理解されるであろう。例外は、それらが発生するとき、大域的例外記憶装置76内に注記され得る。代替的に、例外は、個別のHPA数と関連付けられ、これらのHPA値と関連付けられたメタデータの一部を形成してもよい。他の構成も可能である。
【0125】
本開示の少なくともいくつかの実施形態は、浮動小数点(FP)値を表すHPA数の変換および演算例外を処理するための方法を含む。いくつかの実施形態の目標は、FP数を加算する際にもたらされるであろうものと同じ例外(不正確以外)をもたらすこと(例えば、+無限大を−無限大に加算するとNaNおよび無効動作例外IOCが返される)、ならびに、アンカーベクトルによって指定された有効度が小さすぎるかどうかを検出するために必要な情報をプログラマに与えることであり得る。
【0126】
完全幅または部分幅の浮動小数点値を表現するためのHPAデータタイプの使用は、IEEE 754例外処理の問題を引き起こす。表2は、DZC(ゼロによる除算、変換ではなく除算中に起こる例外)以外のFP例外のエントリ、ならびに無限大、NaN、および符号に対するメタデータエントリを含む。これらの例外は、大域的な例外ワードに直ちに記録されてもよいし、またはHPAデータタイプが標準的なFPデータタイプ(SPまたはDP)に変換された後に記録されてもよいし、または大域的なワードに一度も記録されなくてもよい。それらは、そのデータタイプのメタデータに組み込まれても組み込まれなくてもよい。一部は非標準的な例外であり、その他はIEEE 754指定である。
【0127】
表2のFP−>intおよびint−>FP列は、FPと64または32ビット整数との間のIEEE−754変換中に何が起こるかを示す。これらは、IEEE−754の挙動に関する手引きを提供するために含まれている。最後の3つの列は、HPA値が関与する変換および加算に対してどの例外が可能であるか、ならびにこれらの動作が無限大およびNaNにどのように対処することができるかを示す。
【0128】
HPA数ベクトルがFPタイプを正確に表現するのに十分大きければ、例外のほとんどは起こらないであろう。あらゆる有限FP数には特有のHPA数が存在するため、HPA数への変換では、オーバーフローおよびアンダーフローは発生しないはずであり、不正確ですら発生しないはずである。加算および減算はアンダーフローを引き起こすことができず、またそれらは正確であるため、例外は生じないはずである。最後に、最大限のHPA精度が使用されれば、FPへの再変換はアンダーフローしないはずである。
【0129】
オーバーフローは、加算とFPへの再変換との両方で起こり得る。単純に最大の正FP数のHPA等価物をそれ自体に加算すると、(HPA数にいくつのビットを与えるかに応じて)加算をオーバーフローさせ得る結果がもたらされ、それはFPへの再変換をオーバーフローさせる。
【0130】
より小さなベクトルを使用すれば(性能の理由でプログラマが行いたいであろうこと)、例外のうちより多くが可能になる。さらに、この演算でなし得る1つの目的は再現可能かつ正確であることであるため、これらの例外はプログラマにとって有意義となる。概して、オーバーフロー、アンダーフロー、または不正確があるということは、HPA数を記憶するにはより大きなベクトルが必要であることを示す。
【0131】
表2は、例外指示を処理/生成する一実施形態の一例であり、例外ビットの他の定義および他の状況が可能であり得る。「FP−>int」という列は、標準的な浮動小数点データタイプ(例えば、SPおよびDP)から標準的な整数形式(完全または任意精度)への変換であり、「int−>FP」は、逆変換であり、「FP−>AHP」は、標準的な浮動小数点形式またはFP値の計算された積からHPAデータタイプへの変換であり、「HPA−>FP」は、HPAデータタイプから標準的なFP形式への逆変換であり、「AP加算/減算」は、HPAデータの加算または減算を考察する。
【0132】
表2は、どの例外が可能であるか(yによって示される)、どの例外が起こり得ないか(「いいえ(no)」のnまたは「該当なし(not applicable)」のNAによって示される)を示し、脚注は、例外的挙動をより詳細に説明する。
【表7】
(a)整数より小さい数は、例外フラグを設定することなくゼロに変換される。
(b)整数が保持できるより大きい数は、最大の正整数または最大の負整数に変換され、ofcではなくiocが返される。
(c)整数が保持できるより大きい数、符号なし形式に変換された負数、入力無限大、または入力NaNは、すべて無効である。返される整数は、ゼロ、または最大正数もしくは最大負数である。
(d)これらは、最大の正整数または最大の負整数に変換され、IOCを返す。
(e)これらは、ゼロに変換され、IOCを返す。
(f)十分大きな宛先(destination)ベクトルを考慮すると、この例外は起こらないが、プログラマはより小さな宛先を指定することができる(プログラマが、すべての入力が2^−100〜2^+100の範囲内にあることを知っているとして)。このフラグは、プログラマが間違っていたことを示す。
(g)(f)のように、このフラグは、プログラマのエラー、すなわち入力値が所与のアンカー固定点範囲内で表現され得るものよりも小さいことを示し得る。プログラマが行おうとしていることに応じて、これは深刻である場合もそうでない場合もある(例えば、プログラマは、とても小さな数を破棄したいかもしれない)。一部の実装形態では、IXCとUFCとの組み合わせは付加的情報をもたらす。UFCは、ビットのうちのいずれも変換されなかったことしか意味しないが、UFCおよびIXCは、部分的変換を意味する。部分的変換を丸めるための試みは行われない。
(h)このフラグは、深刻な問題、すなわち入力値が所与のHPAベクトルにおいて表現され得るものよりも大きいことを示す。(g)と同様に、変換の部分的な成功を示すためにIXCフラグを使用することになるが、いかなる場合でもこのフラグは、より大きなHPAベクトルを用いた再試行が必要であることを示す。
(i)このフラグは、深刻な問題を示す。我々は、それを入力無限大またはNaNに設定し、(符号なしHPA形式を作る場合は)負の非ゼロを符号なしHPA形式に変換することを提案する。入力無限大またはNaNは、メタデータフラグを調整する必要もある。
(j)以下のメタデータの説明を参照されたい。無限大およびNaNの記号が関与するFP計算と同じ結果をもたらすためには、所与の数が無限大またはNaNであるという何らかの指示、ならびに無限大の符号が必要である。これらは、HPA数の作成中に生成された例外の何らかの記録と一緒に、理想的には第2のメタデータベクトルの一部として、HPA数と共に記憶されるのが最良である。
【0133】
本開示の少なくともいくつかの実施形態は、HPA数もしくは整数、すなわち、64ビットより幅広の数を加算または減算するために、SIMD様ハードウェアを使用することを含む。拡張可能なレジスタを使用すると、一部の実装形態では、何であれ実装されるベクトル長の単一サイクル加算を用いて、数千ビット長の数を加算することが可能となり得る(少なくとも、あり得そうな実装形態については)。
【0134】
SIMD様システムは、拡張可能なベクトルレジスタを含み得、これらのレジスタは、複数の64ビット値を含むことができる。新たな加算および減算命令の目的のために、拡張可能なベクトルレジスタが、n個の64ビット数のレジスタではなく、1つの長い64*nビットの2の補数整数と見なされることが提案される。SIMDスキームに従って、加算または減算は、ハードウェアによって実装時定義のチャンク(例えば256ビットまたは512ビット)に分割され、下位チャンクから上位チャンクに加算される。各チャンクは、単一サイクルで実行し得る(少なくとも最大1024ビットのチャンク)。
【0135】
チャンクがキャリーアウトを生成する場合、そのキャリーアウトは、次のチャンクへの入力であり得る。これは、述語条件フラグを使用して指示/制御することができる。これは、述語条件の非標準的用途である。
【0136】
チャンクに対する各加算または減算は、キャリー述語条件フラグ(以降PCARRYと称す)の読み書きの両方を行い、PCARRYが設定された場合は加算または減算へのキャリーインを設定し、その後そのチャンクからのキャリーアウトの存在に基づいてPCARRYを設定またはクリアする。
【0137】
減算は、通常の2の補数方法、すなわち、A−B=A+〜B+1で行われ得る。+1は、下位チャンク(キャリーを生成するためにより下位のものが何も存在しないため、これは使用されない)へのキャリーインとして処理されることになる。
【0138】
チャンクに対する単一サイクル加算は、既存の64ビット加算器を使用して行われ、チャンクサイズが何であれ、加算を拡張するために桁上げ選択論理が使用される。いくつかの64−b加算器から構築された256ビット加算器の一例が、
図1に示されている。
【0139】
代替的な「桁上げ先見」手法(
図2に例示される)を用いて、
図2に示される加算器に沿ったキャリー入力を加速することができ、ここで、g
nは、64−bキャリー生成信号であり、p
nは、64−bキャリー伝搬信号であり、G
n:0は、有効度64×(n+1)から下の64−b加算器生成および伝搬信号をすべて合わせたキャリー信号である。
【0140】
桁上げ先見手法は、最大1024ビットのサイズの和の単一サイクル実行を可能にし得る。
【0141】
加算/減算命令が述語レジスタも使用した場合、述語ビットを使用して、キャリーが任意の所与の64ビット境界で伝搬し得るか否かを制御してもよい。これにより、ベクトルが、128ビットまたはより大きな整数値を複数含むことが可能になるであろう。つまり、1024ビットベクトルレジスタは、16個の64ビット値、または4個の256ビット値、または単一の1024ビット値と見なされ得、単一の加算命令がすべての場合で正しく機能するであろう。
【0142】
これの可能な実装形態の1つは、「PCARRYを有効にする(enable PCARRY)」を意味する述語ビットを有することであり、これは、いずれかの64ビット要素について設定されると、その特定の加算器へのキャリーインを可能にする。このより一般的なスキームにおける減算(A−B)は、(すべての64ビット位置において)Bを反転させ、「PCARRYを有効にする」ビットが設定されていない場所で1を加算することによって実装される。
【0143】
このスキームは、既存の加算命令が現在動作するのと全く同じように動作することを可能にするが(「PCARRYを有効にする」ビットが設定されていなければ)、入力ベクトルが、より高精度の数の任意の混合物を含むものと解釈されることも可能にするであろう。表3にあるように、「PCARRYを有効にする」ビットを含んだ述語と併せて512ビットベクトルの加算を考察する。
【表8】
ケース(a)では、新たな述語ビット(PCiと表記される)のうちのいずれも設定されておらず、そのためこの加算は、8個の64ビット値のそれぞれの別々の加算と解釈される。
ケース(b)では、述語ビットが、奇数の64ビットレジスタから偶数の64ビットレジスタへのキャリーを可能にし、これは、加算が今度は128ビット値を扱っていることを意味する。
(c)および(d)では、これらのキャリーが、漸進的に大きな数に許可される。
ケース(e)は、所与のベクトルに関して混合解釈すら可能であることを示す。
【0144】
図15は、1つ以上のオペランドを受信し、そのオペランドに応答して結果を生成する処理回路102を備える装置の一例を示す。処理回路は、結果値の目標有効度および目標サイズ(長さ)のうち少なくとも1つを指定するプログラム可能な制御データ104を受信する。プログラム可能な制御データC4に応答して、処理回路102は、処理回路102に供給されたオペランドの値に関係なく、目標有効度および/または目標サイズを有する結果値を生成する。入力オペランドに対する処理動作(例えば乗算または加算)の実行が、指定された目標有効度および目標サイズを有する結果値において表現可能でない値を与える場合、処理回路は、結果値が正確でないことを示す例外信号106を出力し得る。例えば、例外指示は、次のうちの1つを示し得る。
●処理動作の結果が、指定された有効度およびサイズの結果値を使用して表現可能なものよりも大きい場合のオーバーフロー条件、
●結果が、指定された有効度およびサイズを有する結果値により表現可能なものよりも小さい場合のアンダーフロー条件、または
●結果が、目標有効度およびサイズを有する値を使用して表現可能なものよりも精確である場合の不正確条件。
【0145】
真の処理結果がその有効度の外側に位置する場合でさえ、処理回路が指定された有効度の結果を生成することが許可されるべきであるのは、直感に反するように思えるかもしれない。しかしながら、
図16の例に示されるように、このことは、結果がより少数のビットに収まることが概して予想される場合に、非常に大きな数を処理する必要がないように、必要とされる処理の量を限定するために有用となり得る。例えば、制御データ104は、有効度下方境界110と有効度上方境界112との一方または両方を指定し得る。処理回路102は、指定された有効度境界110、112内に位置する結果値のビット値を判定し、境界の外側に位置するビット値を判定しないように、その処理を限定し得る。故に、結果値は、広範囲の数空間114内にある数を表現することができる形式を有するが、制御データ104が数空間内の可変長および位置の枠を定義し、処理回路102は、処理を高速化しエネルギー消費量を低減させるように、指定された枠内のビットのみを計算する。例えば、プログラマは、有効なオペランド値および結果がある特定の有効度範囲内に位置すると予想されることを知らない場合があり、そのため、制御データを適切に設定することにより、予想される範囲より低い有効度または高い有効度のビット値を計算するのに処理リソースが浪費されない。そうは言っても、処理が実行される枠は、広範囲の値が(しかしより小さなハードウェアオーバーヘッドで)サポートされ得るようにプログラム可能な制御データを変更することによって、調整することができる。
【0146】
一部の場合では、結果値のサイズは固定されていてもよく、制御データ104は有効度の下方および上方境界110、112のうちの一方のみを指定してもよく、もう一方は、指定された境界および既知の結果サイズから判定される。代替的に、サイズは可変であってもよく、制御データ104において明確に指定されてもよいし、またはある特定のビット数の倍数(例えば32または64ビット)として表現されてもよい。別の例では、制御データ104は、有効度の下方および上方境界110、112の両方を指定してもよく、これは、境界間の差としてサイズを効率的に識別する。このように、結果値の目標サイズおよび目標有効度が制御データから判定され得る、いくつかの方法が存在する。
【0147】
図17は、高精度アンカー固定(HPA)データ形式におけるデータ値の一例を示す。HPA数は、それぞれが(正規化されていない)二進値のそれぞれの部分を表す2の補数の数を含むいくつかのデータ要素d[0]〜d[3]を含む、データベクトルViと、それぞれがデータベクトルVi内の対応するデータ要素の有効度(「重み」)を指定するアンカー値要素a[0]〜a[3]を含む、メタデータベクトルまたは「アンカー」ベクトルVaと、を含む。例えば、各アンカー値要素a[i]は、対応するデータベクトルVi内の最小有効ビットの有効度を指定し得る。
図17は、ベクトルVi、Vaが4つのデータ要素(これらは64または128ビットなどのある特定の要素サイズであり得る)を含む例を示すが、ベクトルが様々な数のデータ要素を有してもよいことは理解されるであろう。ベクトル内の要素の数は、例えば、使用されていない任意のベクトルレーンのアンカー値要素a[i]内に所定のビットパターンまたは状態フラグを提供し、その結果、処理される要素の数がそのビットパターンを有しないアンカー値要素によって示されるようにすることによって、アンカー値Va内に示されてもよい。例えば、重みを有するアンカー値ベクトルVa(X,118,54,−10)(ここでXは未使用のレーンを示すビットパターンまたは状態フラグである)は、64ビットデータ要素d[2]と、d[1]と、d[0]とが一緒に、有効度2
−10の最小有効ビットと有効度2
181の最大有効ビットとを有する192ビットの二進値を表すことを示し得る。代替的に、HPA数は、このHPA数において処理される要素の数を指定する、何らかのさらなるメタデータ120を有してもよい。また、アンカー値ベクトルVaまたはさらなるメタデータ120は、データベクトルViにより表されるデータ値の符号、ベクトルの処理中に生じ得たあらゆる例外条件(例えば、オーバーフロー、アンダーフロー、不正確、無効動作、または入力非正規例外)を示す例外情報、または、例えばデータ値が無限大、非数(NaN)、もしくはゼロであるかどうかを示す特徴情報といった、他の情報を指定してもよい。HPA値を加算または減算する際、アンカー値は、その加算/減算への様々な入力に対して固定され、同じアンカー値を用いて結果が生成される。これは、単純な固定小数点加算器を使用してHPA値を処理することができ、したがって丸めおよび正規化をサポートする浮動小数点加算回路は必要とされず、これにより、一連の加算または減算の処理がより素早くなり得ることを意味する。アンカー値は、HPA形式と、浮動小数点または整数もしくは固定小数点形式といった他の形式との間の変換時に、適切な有効度を有する値を生成するために使用される。非常に大きな累算器を要することなく、様々な有効度の可変長値の処理を効率的に処理することを可能にするため、値をこの方法でベクトルとして表現することは有用である(例えば以下の
図19参照)。
【0148】
図18は、HPA数形式のデータ値をサポートする記憶ユニット(例えばレジスタファイル)130の一例を示す。本開示のいずれの実施形態に示される装置も、
図18に示される記憶ユニットを備えてよい。記憶ユニットは、それぞれが対応するメタデータ記憶素子(レジスタ)134を有するいくつかのデータ記憶素子(レジスタ)132を含む。一部の例では、メタデータレジスタ134は、データ記憶レジスタ132とは別々のレジスタファイル内にあってもよい。代替的に、データレジスタおよびメタデータレジスタは、単一のレジスタファイルの一部であってもよく、または同じレジスタの異なる部分を構成してもよい。各データ記憶レジスタ132は、所与のHPA数に関するデータベクトルViを記憶し得る。対応するメタデータ記憶レジスタ134は、そのHPA値に関するアンカーベクトルVaおよび任意のさらなるメタデータ120(提供される場合)を記憶する。
【0149】
一部の例では、メタデータ記憶レジスタ134内のメタデータは、対応するデータ記憶レジスタ内の特定のデータ値よりもむしろ、対応するデータ記憶レジスタ132自体に関連付けられていると見なされ得る。つまり、アンカー値Vaは、いかなる値がデータ記憶レジスタ内に記憶するために実際に計算される前に、所与のレジスタについて定義されてもよい。データ記憶レジスタ132のうちの1つを宛先レジスタとして指定する処理動作を実行する際、処理回路102は、対応するメタデータレジスタ134からアンカー値を読み取り、処理動作に対するいかなる入力の値または有効度とも独立して、アンカー値(複数可)によって指定された目標有効度および/または目標長を有する結果値を生成する。アンカー値は、プログラマにより供給される制御データに基づいてプログラム可能である。一部の場合では、プログラマは、アンカー値を直接指定してもよいが、他の例では、ライブラリまたは他のソフトウェアプログラムが、プログラマにより入力された制御データを、処理回路102によって読み取られ得る好適な形式のアンカー値(複数可)へと変換してもよい(この手法は、プログラマが、ハードウェアにより使用される内部メタデータ形式を理解する必要なしにアンカー値を設定することを可能にする)。
【0150】
HPA数が、単一のデータレジスタ132内に記憶され得るよりも多くの要素を必要とする場合、そのHPA数は、いくつのレジスタがHPA数に対応するかを識別し、各データ要素により表される所与の二進値の部分の有効度を定義する対応するメタデータを含む、複数のレジスタにまたがる場合がある。
【0151】
図19は、HPA形式の数を処理するための処理回路102の一例を示す。処理回路102は、所与のHPA数の対応するメタデータベクトルVa内のアンカー値に基づいて、データベクトルViのそれぞれのデータ要素に対して並列レーンの処理(例えば変換または演算動作)を実行するための、いくつかの処理ユニット140を有し得る。一部の場合では、処理回路102は、2つのHPA数に作用してもよく、各レーンが、2つのHPA数の対応する要素d0[i]、d1[i]を受信してもよい。この場合では、HPA数は同じアンカー値を共有し、対応する結果のデータ要素r[i]が、同様に入力と同じアンカー値を有するHPA形式の結果値をもたらすように生成される。処理の実行前に同じアンカー値を有するHPA数に対して異なるアンカー値を有するHPA数をマッピングすることが可能である。
【0152】
代替的に、命令がソースオペランドとして1つのHPA数および浮動小数点数を指定することに応答して、その浮動小数点数(または複数の浮動小数点オペランドに実行された演算動作から得られた浮動小数点数)を、他方のHPA数と組み合わせられる前にHPA形式にマッピングしてもよい。各レーンは、アンカーベクトルVaの対応するアンカー値a[i]を受信し、これは、浮動小数点オペランドFPがHPA数の対応する要素にどのようにマッピングされるかを制御し得る。
【0153】
所与の計算のために処理される要素の数は、メタデータに応じて様々であり得る。処理ユニット140は、ある特定の数のレーンのために提供されるが、特定の計算にすべてのレーンが必要とされるわけではない場合、未使用のレーンは、電力を節約するために、パワーゲーティングされる、すなわちレーン内での内部ビット状態のトグリングを防止するためにゼロ入力を提供される。その一方で、メタデータまたはアンカー値が、ハードウェア内に備えられた処理ユニット140の数よりも大きな数の要素を指定する場合は、HPA数は、ハードウェアの複数のパスにおいて処理され得る。
【0154】
要約すると、本明細書に記載される高精度固定小数点演算システムは、「高精度アンカー固定」(HPA)データタイプを組み込む。HPAデータタイプはベクトルペアであり得、その一方は、固定長整数の順序集合(例えば、8つの64ビット整数の順序集合)を含み、他方は、固定長整数のそれぞれ1つがハードウェアによりどのように解釈されるべきかを指定するメタデータ(アンカー値)(例えば、整数内の各ビットの指数重みを与える範囲情報)を含む。各レーンが、データと、そのデータに特有のメタデータとの両方を受信するため、レーンは、全体としてベクトルに有意義な結果をもたらす異なる動作を行うことができる。例えば、HPA値は、例えば、浮動小数点数または固定小数点形態の積を表す200〜4000ビット長の、非常に長い整数を表し得る。この長整数の各64ビット部分に関連付けられたアンカー要素は、どのようにその64ビット整数を解釈すべきかを64ビットレーンに伝える。したがって、データと、そのデータに関連付けられたメタデータと、それぞれがそのデータ項目に特有のメタデータを有する複数のデータ項目を作成する能力とから成るデータタイプが提供される。
【0155】
HPAデータは、フルサイズデータタイプであっても、またはフルサイズデータタイプの範囲および精度の一部分であってもよい。フルサイズデータタイプは、例えば、2099ビット(すべての倍精度数を保持するため)、もしくは4198ビット(すべての倍精度積を保持するため)、または、これらの値の多くをオーバーフローさせることなく加算することを可能にするさらに大きな何らかのサイズであってもよい。明らかにこれはより大きなビット数であり、これらのデータタイプに対する動作は複数サイクルを要することになり、記憶装置はかなりのものになるであろう。しかしながら、多くの場合において、実行されている機能またはアプリケーションは、完全なデータタイプを必要とせず、データタイプの一部分のみを必要とし、これは、数値解析およびシミュレーションによってプログラマに既知となるであろう。例えば、特定のプログラムは、非正規入力を決して有しないかもしれないし、または何らかの他の範囲制限を有するかもしれない。これらの場合、より小さなHPAデータを使用することができる。
【0156】
このデータタイプは、ほんの少数の特徴により定義され得る。これらは、一部の場合ではビットもしくはベクトルレーンサイズの倍数におけるデータタイプのサイズを含むか、またはそれは、32ビットもしくは64ビットなどの固定データサイズの観点から定義される場合もある。さらに、データタイプは、表現され得る最も低い指数によって定義されてもよい。例えば、アルゴリズムが[+/−10
25,10
45]の範囲内の単精度データを処理し、すべての中間計算が同じ範囲内にある場合(中間計算の範囲は入力データ範囲より大きくても小さくてもよいが、最終範囲はほとんどの場合両方の範囲の広がりを組み込むべきである)、データタイプは、この範囲内のデータを表現するのに必要な数のビットのみを含むことになる。この例において、10
25は2
83よりもわずかに大きく、10
45は2
150よりも少しだけ小さいため、このアルゴリズムに適切なデータタイプは91ビット(150−83+24)となり、アンカー値は、83として表現可能な最小の指数を識別することになる。このデータ項目への合計には、最大限の2099ビットではなく91ビットのデータタイプが関与し、計算時間および記憶装置要件の大幅な縮小がもたらされるであろう。
【0157】
浮動小数点例外を処理するためには、各HPA数に関するメタデータが少なくとも以下の情報を含むことも有用となり得る。
●符号(値が正であるか負であるか)
●例外ビット、例えばIEEE 754−2008定義ビット−IXC(不正確例外(inexact exception))、IOC(無効動作例外(invalid operation exception))、UFC(アンダーフロー例外(underflow exception))、OFC(オーバーフロー例外(overflow exception));または実装定義ビット−IDC(入力非正規例外(input denormal exception))。DZC(ゼロによる除算(division by zero))例外ビットは、HPA数の除算が必要とされない場合は、必要とされない場合がある。
●特徴的なビット(例えば、値が無限大、NaN(非数)、ゼロであるかどうかを示すもの)
これらのビットはデータタイプの一部であり、すべてのレーンについて必ずしも複製されるわけではない。
【0158】
図20は、HPA値を使用して実行され得る動作の一例を示す。この場合では、その動作は、一連の浮動小数点値の和を見出すための累算動作である。これらが浮動小数点演算で処理された場合、浮動小数点値ペアの各加算は丸めおよび正規化が原因で不精確性をもたらし得るため、浮動小数点値が加算される順序が結果に影響し、そのため浮動小数点加算は結合的ではない。したがって、予測可能な結果を与えるためには、浮動小数点加算を使用した一連の浮動小数点値の累算は、加算が固定順序で順次実行されることを必要とし、このことは、それを迅速に実行することを困難にする。
【0159】
対照的に、HPA数の加算は結合的であるため、HPA形式を使用することにより性能を大幅に向上させることができ、そのため、一部の加算がマルチプロセッサシステム内で並列に実行される場合でも、または、どのオペランドが最初に利用可能になるかに応じて加算が再順序付けされる場合でも、その結果は依然として正しくかつ繰り返し可能となる。
図20は、1つの加算で実行され、その後、各浮動小数点値を累算するために何回か繰り返され得るステップを示す。各加算において、入力浮動小数点値FPが、HPA形式のデータベクトルVi1に対して、そのHPA数について前もって指定されているプログラム可能なアンカーベクトルVaに基づいてマッピングされる。浮動小数点値FPの仮数部Fは、アンカーベクトルVaおよびその浮動小数点値の指数Eにおいて定義された有効度境界に応じて、データベクトルVi1の1つ以上の要素の一部分に対してマッピングされる。ベクトルが浮動小数点値の仮数部Fより大幅に大きいため、典型的にベクトルのほんの少数のレーンにのみ仮数部からのビット値が投入され、より上位のレーンにはもっぱら符号ビットが投入され、より下位のレーンにはゼロが投入される。変換動作は、以下でより詳細に説明する。
【0160】
このように、変換されたデータベクトルVi1は事実上、浮動小数点値により表される二進値の代替的表現を提供する、長い固定小数点値である。このことは、それが、浮動小数点演算に関する整合、正規化、丸め、および指数調整ステップを必要とすることなく、単純な整数加算によってHPA形式の別のデータベクトルVi0(これはVi1と同じアンカー値を有する)に加算され得ることを意味する。これは、加算動作が他の加算と結合的であり、そのため並列に実行することができるか、または性能を向上させるように再順序付けすることができることを意味する。ベクトルViRは、データベクトルVi0、Vi1を加算することによって生成され、これは、Vi0、Vi1と同じアンカーベクトルVaを有するHPA形式の結果値のデータベクトルを表す。これが累算の最後の加算でなければ、結果ベクトルViRは次の加算のための第2のベクトルVi0となり、このとき、別の浮動小数点値FPが入力され、HPA形式に変換され、前の累算結果に加算される。これらのステップを数回繰り返すことによって、精度を損失せずに、一連の浮動小数点値を非常に迅速に加算することができ、これは、浮動小数点演算では不可能である。最終累算結果を生成したら、結果のデータベクトルViRはその後、所望であれば浮動小数点値に再変換されてもよく、アンカーベクトルVaは、浮動小数点値が結果値に対応する二進値を表すように(必要であれば丸めを用いて)変換が実行される方法を制御する。
【0161】
このように、浮動小数点(FP)数または積は、高精度アンカー固定(HPA)数に変換され得る。これらのHPA数は数百(単精度)または数千(倍精度)のビット長であり得るが、それらはFP入力の正確な表現であり得、FP数とは異なり、これらの数は、演算の通常の結合的特性に従う。
【0162】
ここで、FP数からHPA数への変換をより詳細に説明する。単精度浮動小数点(SP)数は、符号ビットと、8個の指数ビットと、23個の小数部ビットとを含む。1.fractionまたは0.fraction形態の仮数部を構築するために使用される隠れビット(hidden bit)(指数に基づく)も存在する。最大指数および最小指数は特殊な数のために予約されているが、仮数部の第1のビットは、指数により指定される他の2
8−2=254個の位置のうちいずれに現れてもよい。仮数部の第1のビットには小数部が続き、符号を表す1個の付加的なビットが存在するため、いかなる有限SP数も、254+23+1=278ビットの固定小数点数として表すことができる。この数を保持するために5つの64ビット値のベクトルを構築するとした場合、下位ベクトル要素はビット0〜63を保持し、次の要素はビット64〜127を保持するなどということになり、上位要素はビット256〜279を保持する。
【0163】
これはどのようにベクトルプロセッサ内に収まるのだろうか。SP浮動小数点数SiをHPA数Vi,Va(ここで、Viはデータベクトルであり、Vaはアンカーベクトルである)に変換するための命令、
CVT_SP_to_HPA Vi,Va,Si
があると想定すると、Viは、279ビットの固定小数点結果を含むことになる。Vaは、Viにおける5つの64ビットの宛先のそれぞれに関する境界情報を含むことになるため、上記の例では、Va=<256,192,128,64,0>である。各64ビットレーンは、SP数Siのコピーを得ることになり、Viの適切な部分にどのビットを設定するかを計算するために、境界情報およびSP数の指数を使用する。Vi=<D4,D3,D2,D1,D0>とする。Siが指数70を有する場合、Viのビット[70:64](すなわち、D1のビット[6:0])は、Siの仮数部の上位7ビットに設定され、Viのビット[63:47](すなわち、D0のビット[63:47])は、Siの仮数部の下位17ビットに設定される。残りのビットのすべては、ゼロに設定されることになる(簡略化のために、ここでは正数を仮定しよう)。各レーンは、Vaの対応するエントリから完全な仮数部、指数、および境界情報を受信する。
【0164】
通常の場合では、Vaは、全面的にその下位64ビットにおける基底値によって決定され、次に続く各64ビット値は、前の64ビットにおける値よりも64多いため、すべてのレーンがVa内のその場所を「知って」いたら、スカラー基底値で事足りるかもしれない。しかしながら、一部のベクトル処理回路では、各レーンがベクトル内におけるその位置を承知している必要がないように基底値のベクトルを含めることがより明快であり得るが、代替的な実装形態では、単一の基底値で十分であることが想像され得る。
【0165】
Viにより表される二進値は2の補数の数であるため、24ビット仮数部を2の補数の数に変更する(変換後に2の補数に変更してもよいが、279ビット値の変換は24ビット値の変換よりも大幅に遅い)。2の補数は通常の方法で変換する:数が正である場合何もせず、さもなければ〜significand+1の値を使用する。この変換後、279ビットの変換は、場合により改変されている仮数部を使用し、仮数部の左側のビットをゼロの代わりに符号ビットに設定することを除いて、先行の段落と全く同じように進行する。
【0166】
本方法の美点はその柔軟性にある。プログラマがFP数を表現するために使用したいと思うかもしれない、可能な固定小数点数は多数存在する。FP仮数ビットのすべてが70〜197の範囲内に落ち着くことをプログラマが確信していたとするとどうだろう。その場合はVa内のエントリを適切に改変することにより、固定小数点数が128ビットの宛先に保持され得る。128ビットの固定小数点数に対処することは、場合により大幅に大きな固定小数点数に対処することよりもずっと素早い。
【0167】
FP数の積を精確に加算することも望ましく、我々の方法は、これを可能にするように容易に発展する。提案される命令は次のものである。
MUL_SP_to_HPA Vi,Va,Sn,Sm
Viは、固定小数点結果を含み、この場合もやはり、Vaは、各レーンに対する境界情報を含むことになる。2つのSP数SnおよびSmは、丸めなしで乗算され、仮数部の完全な48ビットの積を保持し、積指数の9ビットバイアス付き(255過剰)表現である新たな指数を計算する。2つのSP数の積は1つのSP数より大幅に大きくも大幅に小さくもなり得るため、余剰の指数ビットが提供される。変換は、CVT_SP_to_fixed命令と全く同じように起こり、積の2の補数を取り、その後各レーンに、固定小数点数が何らかの仮数ビットを有するかどうかをVaに基づいて計算させ、仮数部の左側に符号ビット、そして右側にゼロで、残りのビットを満たす。
【0168】
提案された2つのSP命令に加えて、2つの類似したDP命令、または任意の他の浮動小数点形式のための命令が存在する。それらは同じ方法で機能するが、DP入力または積(より幅広の仮数部および指数)の解釈の仕方を知っている。固定小数点ベクトルのサイズは、DPに対して大幅に高い場合がある。巨大な(表現可能より大きな)、またはとても小さな(表現可能より小さな)数を除外した方がいいかもしれない。関心のある主な事例に関する最大サイズは次の通りである。
【表9】
「first bit」列は、いくつの可能性のある場所が仮数部の第1のビットを保持し得るかを示し、「frac bits」は、いくつの小数部ビットがその仮数部に続くかを示す(これらの数は積に関してより高い)。「length」のフィールドは、単にfirst_bit+frac_bits+1の和であり、これは、指定された入力に関する固定小数点形態のすべての数を保持するのに必要とされる最小の長さである。「64−bit words」の列は、指定された入力に関する固定小数点形態のすべての数を保持するのに必要とされる64ビットワードの最小の数である。
【0169】
行エントリは、DP(すべてのDP数)、DP prod(すべての可能なDP積)、DP prod nontiny(DP最小非正規数未満のあらゆるビットを無視したすべての積)、およびDP prod nontiny+nonhuge(DP非正規数未満またはDP最大超のあらゆるビットを無視したすべての積)である。SPの行は同様の説明を有する。関心をもっているビットを反映するように境界ベクトルVaをただ調整することができるため、これらの関心のある事例のすべてに対して別々の命令は必要ない。
【0170】
プログラマは独自の境界を作成するであろうと考えられる。恐らく、2
−50よりも小さい積は、特定の計算には無関係である。こうした種類の事例は、単純に境界ベクトルVaを調整することによって容易に管理される。
【0171】
図21は、HPAデータ形式を有する値への浮動小数点値の変換の一例をより詳細に示す。変換が、同じ結果をもたらす
図21に示されるものとは異なる一連の動作で実装され得ることは理解されるであろう。
図21は、対応するアンカーベクトルVa[x]に基づいてHPA値のデータベクトルの単一のデータ要素Vi1[x]を生成するように実行されるステップを示すが、同じステップをベクトル内の他のデータ要素それぞれに対して実行してもよい。
図21に示されるように、ステップ150において、浮動小数点値の符号ビットSが1である場合、(1の暗黙ビット(implicit bit)を含む)浮動小数点値の仮数部Fは、ステップ150において符号反転される。符号反転は、仮数部値Fの2の補数を見出すために、仮数部のビットを反転させ1を加算することによって実行され得る。代替的に、変換されたHPA値に加算が実行される予定であれる場合(例えば上記の
図20にあるように)、ステップ150において、仮数部Fを反転させて仮数部の1の補数を生成し、この段階では1を加算せず、後に加算を実行する際に加算器へのキャリー入力をアサートして、2の補数を完成させてもよい(1つの加算ステップを省略することにより、この手法はより素早いかもしれない)。いずれにしても、符号反転は、浮動小数点形式において、符号ビットが1である場合は仮数部のすべてのビットに負の重みが付けられるように、値が符号マグニチュード形式で表されるという事実の主な原因であり、一方HPA形式では、ベクトルは2の補数値を表し、最大有効ビットが1であっても、それより低い有効度のビットすべてに正の重みが付けられる。
【0172】
その後、中間値162が、仮数部F、または符号反転ステップ150から生じる修正された仮数部−Fから形成される。仮数部Fまたは修正された仮数部−Fは、中間値162の最小有効部分に置かれ、中間値162の上位部分は、ある特定の数、Lsizeの0を含み、Lsizeは、ベクトルレーンサイズ(1つのデータ要素内のビット数)である。例えば、Lsizeは、64、128、または256ビットであり得る。その後、シフタ160が、次のように決定されるシフト量Lshiftによって指示される場所の数だけ中間値162を左シフトする。
●Z>0およびZ<Lsize+Fsizeである場合、Lshift=Z=E−B−Va[x]+1であり、式中、
○Eは、FP値のバイアス付き指数であり、
○Bは、FP値に対するバイアス量(例えば、DPでは1023、SPでは127)であり、
○Vm[x]は、アンカー点値Vaから決定される、処理されているデータ要素の最小有効ビットの目標有効度であり、
○Lsizeは、データ要素内のビット数(ベクトルレーンサイズ)であり、
○Fsizeは、FP値の仮数部内のビット数である(暗黙ビットを含まない)。
●Z≦0またはZ>Lsize+Fsizeである場合、Lshift=0である。
【0173】
事実上、FP値の仮数部Fのビットのいずれもが、現在処理されているデータ要素のビットの有効度に対応する有効度を有しない場合、Lshiftは0である。Lshiftが非ゼロである場合、Lshiftビット位置だけ中間値162を左シフトすることにより、FP仮数部の少なくとも一部が、HPAベクトルのデータ要素内にある対応する有効度のビットに対してマッピングされる。その後、データ要素Vi[x]のLsizeビット値が、シフトの結果からの上位Lsizeビットとして選択される。
【0174】
同じ動作をベクトルの他のデータ要素それぞれに対して同様の方法で実行して、各データ要素が浮動小数点値に対応する二進値のそれぞれの部分を表す、HPA値の全体的なベクトルVi1を生成することができる。
【0175】
ベクトルの最大有効データ要素に適用される処理に関しては、シフタ160により適用されるシフトが、仮数部Fのいずれかの非符号拡張ビットがシフト結果の最大有効ビットを超えてシフトアウトされることをもたらす場合、オーバーフロー条件の信号となる例外指示が生成され得、これは、浮動小数点値が指示されるメタデータを使用してHPAベクトルによって表現され得るよりも大きかったことを示す。同様に、ベクトルの最小有効要素に適用される処理に関しては、浮動小数点値FPのすべてのビットがその要素の最小有効ビットの有効度よりも小さい有効度を有する場合、アンダーフロー例外の信号が送られ得る。また、浮動小数点仮数部のビットの一部が、変換されたHPAベクトルで表現されるが、他のビットがベクトルの最小有効ビットよりも低有効度であった場合、不正確例外の信号が送られ得る。これらの例外条件は、メタデータVmにおいて設定された有効度境界が、処理されている現在の浮動小数点値に対して不適切であったことの信号となり得る。
【0176】
図21に示される変換動作は、浮動小数点値を対応するHPA値に変換するための専用の変換命令に応答して実行され得る。代替的に、変換は、何らかの演算も実行する演算命令に応答して実行されてもよい。例えば、加算または減算命令が、浮動小数点値を別のHPA値と加算もしくは減算する前にHPA形態に変換させてもよく、または乗算・変換命令が、2つの浮動小数点オペランドの乗算をトリガしてもよく、その後、浮動小数点形態におけるこれらのオペランドの積が、
図C7に示される動作を使用してHPA値に変換されてもよい。
【0177】
同様に、HPA数を浮動小数点数に変換することができる。SPに対する基本的な命令は、
CVT_HPA_to_SP Sd,Vd,Va
であり、ここで、Sdは、宛先SP数であり、Vdは、高精度固定小数点データを含むデータベクトルであり、Vaは、Vdの各64ビットレーンに関する境界情報を含むアンカーベクトルである。Vdは、2の補数の数であり、Vdのすべてのビットは、Vaの境界情報に基づく重みを有し、そのため、Vaの下位64ビットワードが100を含む場合、Vdにおける下位ワードの下位ビットは重み100を有し、次のビットは重み101を有するなどである。通常の場合では、Vaは、全面的にその下位64ビットにおける基底値によって決定され、次に続く各64ビットは64異なる。したがってこの場合では、
Va=<…,296,228,164,100>
である。これらすべての値を有するようにベクトルVaを提供する理由は、各64ビットレーンがそのベクトルVdの部分を大域的な知識一切なしで解釈するからである。レーンがより大きなベクトル内のそれら自体の場所を「知って」いたら、基底値(この場合は100)は、変換を完了するのに十分な情報を与えるであろう。
【0178】
基底値は、浮動小数点数の指数に正確に対応する。Vdの下位ワードのビット62で開始する仮数部を構築し、Vaは上記の通りであった場合、その仮数部に対応する指数は、全面的に仮数部位置(62)および基底値(100)によって決定される。SP数については、その指数は100+62−23=139となる。この−23は、SP値の小数部ビットの数に由来する。すべてのSP数を表現することが望まれる場合では、高精度固定小数点数は278ビット長となり、その下位ビットは非正規数の下位ビットに対応することになる。第1の可能な正規の仮数部は指数1を有し、Vdのビット[23:0]に位置することになる。
【0179】
VdをSPに変換するには、2つの基本的な方法、左から右または右から左がある。
【0180】
左から右への変換はより明快である。Vdの最上位の第1のビットは符号ビットであり、それがSP結果Sdの符号となる。その後、第1の非符号ビット(符号が1である場合ゼロ、符号がゼロである場合1)を検索する。そのビットが仮数部の第1のビットとなり、それから次の23ビットを小数部として、第24番目のビットをガードビットとして、そして残りのビットすべての論理ORをスティッキービットとして取る。指数は、第1の非符号ビットが見出されるレーンの重み(W)、第1の非符号ビットの場所(L)、およびSP数における小数部ビットの数(23)に基づいて計算され、W+L−23の指数が与えられる。指数計算がゼロ未満の値を返す場合、返される指数はゼロである。入力が負であり、最初のゼロが24個以上のゼロの列の一部である場合、指数は1だけインクリメントされる。小数部は正の入力については変更されず、さもなければ小数部の2の補数が使用される。結果として得られる数は、丸めモード、小数部の最小有効ビット、ガード、そして最後にスティッキービットに基づいて、通常の方法で丸められる。倍精度では、動作は同じだが、より大きな仮数部および指数を用いる。
【0181】
図22は、データベクトルViおよびメタデータVmを用いてHPA値を浮動小数点値FPに変換するために左から右への変換を使用する一例を示す。この場合もやはり、これは、スタンドアロンの変換命令、または何らかの演算のみならず変換も含む演算命令に応答して実行され得る。データベクトルViの最大有効ビットは、浮動小数点値FPの符号ビットSに対して直接マッピングされる。
【0182】
浮動小数点値の仮数部Fを生成するために、一連の動作が次のように実行される。ベクトルの最大有効ビットが1である(すなわちHPA値が負である)場合、ステップ170において、修正されたベクトルVi’をもたらすようにベクトルViが符号反転される(反転および1の加算)。正値の場合、ベクトルViは変更されない。故に、ベクトルVi’は少なくとも1つの先行ゼロを有し、そのため正値を表す。ベクトルの最大有効要素から開始して、仮数部生成動作が要素毎に順次実行される。最大有効要素の処理レーンは、その要素内の第1の非符号ビット(すなわち、最初の1のビット値)を検索する。この例では、上位要素Vi[3]はいかなる非符号ビットも含まず、そのため処理は次のレーンVi[2]に移る。
【0183】
要素Vi[2]の処理は、1の非符号ビットを識別し、非符号ビット1に先行するゼロの数を表す先行ゼロカウントLZCを判定する。その後、部分的な仮数部が対応するデータ要素Vi[2]のkビットから形成され、ここで、k=min(Lsize−LZC,Fsize)であり、式中、Lsizeは、1つのデータ要素内のビット数であり、Fsizeは、生成されるFP値の仮数部内のビット数(暗黙ビットを含む)であり、LZCは、先行ゼロカウントである。kビットの部分的な仮数部値は、仮数部、ガードビットG、およびスティッキービットSについて依然として得られるべき残りのビットの数の指示(Fsize−k)と一緒に出力される。Lsize−LZC>Fsizeである場合、ガードビットGは、部分的な仮数部について取られたビットの1つ右側の場所の要素Vi[2]のビットに等しく、Lsize−LZC≦Fsizeである場合、G=0である。同様に、Lsize−LZC>Fsize+1である場合、スティッキービットSは、ガードビットGの右側にある要素Vi[2]のあらゆるビットのビットORに等しく、さもなければスティッキービットS=0である。
【0184】
その後処理は要素Vi[1]に関する次のレーンに移り、ここで別の部分的な仮数部値が生成される。要素Vi[1]の上位部分が、前のレーンから出力された値Fsize−kに対応して取られたビット数と共に、部分的な仮数部として選択される。このレーンはまた、ガードおよびスティッキービットG、Sの値を更新し、ガードビットGは、部分的な仮数部について取られた最下位ビットの1つ右側の場所の要素Vi[1]のビットに等しく、スティッキービットSは、ガードビットGより低い有効度のあらゆるビットのビットORに対応する。最小有効要素Vi[0]の処理レーンは、より上位のレーンからスティッキービットSを受信し、要素Vi[0]のすべてのビットに前のレーンからのスティッキービットSを論理和する(ORing)ことによってそれを更新する。
【0185】
レーン2および1について生成された部分的な仮数部は、その後連結されて仮数部値Fを形成する。仮数部は、任意の所望の丸めモードを使用し、ガードおよびスティッキービットG、Sの値に基づいて丸められる。その後、浮動小数点値FPに関する記憶された仮数部が、浮動小数点表現において暗黙的である丸められた仮数部の最大有効ビットを無視して、丸められた仮数部値から得られる。
【0186】
一方で、浮動小数点値のバイアス付き指数Eは、次のように決定され、
E=Va[j]+Lsize−LZC+B
式中、Va[j]は、最大有効非符号ビットが見出されたデータ要素Vi[j]の最小有効ビットの有効度(例えば、
図22に示される例において要素Vi[2]のアンカー点値によって指示される有効度)であり、Lsizeは、1つのデータ要素内のビット数であり、LZCは、先行ゼロカウントであり、Bは、使用されている浮動小数点表現のバイアス値である。
【0187】
Fsize<Lsizeである場合、
図22の例にあるように、多くても2つの隣接するデータ要素のみが、丸められていない仮数部Fに寄与するビット値を含むことができ、他のレーンは、符号ビットのみを含んだより高有効度のレーン、またはスティッキービットSにのみ寄与するより低い有効度のレーンのいずれかになる。丸められていない仮数部は、レーン内の第1の非符号ビットの位置に応じて、もっぱら1つのレーン内のビット値から形成され得る可能性もある。しかしながら、Lsize<Fsizeである場合、丸められていない仮数部に寄与するレーンがより多く存在し得る。
【0188】
図22は、HPA値の各データ要素を左から右へ順次処理する一例を示す。しかしながら、ベクトルサイズが大きくなるにつれて、これは比較的遅くなり得る。これは常に問題とはならないかもしれない。例えば、
図20に示される累算動作では、FPからHPAへの変換は、HPAからFPへの再変換より大幅に高頻度で発生し得る(FP−HPA変換は各加算について発生するが、HPA−FP変換は最終結果が生成された時点でしか発生しない)。しかしながら、処理を高速化することが所望される場合、いくつかのレーンで動作を並列に実行することが可能である。例えば、
図19に示される形態の処理回路が使用され得る。この場合では、各レーンが最も高い非符号ビットを検出し、部分的な仮数部をそれがベクトル全体中に最も高い非符号ビットを含むと仮定して生成してもよく、それから、処理回路が後に、第1の非符号ビットを実際に含むレーンからFsizeビットを得ることによって部分的な仮数部を組み合わせ、必要であれば次の下のレーンからFsize−kビットを得てもよい。
【0189】
最小有効要素がまず処理される、右から左への変換も可能である。Vd=<D4,D3,D2,D1,D0>(これはあらゆるSP数を保持するのに十分である)と想定し、Va=<256,192,128,64,0>とする。VaベクトルがVdソースに関する別の範囲を指定し得ることを思い返されたい。右から左への変換には2つの方法が使用され得る。
1.D0を保持するレーンが、SP数を、これら64ビットのみが利用可能であるかのように、左から右への変換と同じアルゴリズムを使用し、しかし丸めまたは符号ベースの操作を一切行わずに計算する。返される値は、35ビットベクトル<sign,exponent[7:0],significand[23:0],guard,sticky>である。D1を保持するレーンは同じことを行うが、D0レーンによって生成されるデータにも注目する。D1レーンがすべて符号ビットである場合、D0結果が上位に渡される。さもなければ、新たなSP数が、第1の非符号ビットの新たな場所に基づいて計算される。この新たな数の小数部ビットの一部はD0に由来し得るが、我々はそのレーンから返された35ビットベクトルからのそれらのビットに関する情報を有する。新たな指数、符号、ガードおよびスティッキービットも計算される。このプロセスは、D2、それからD3について繰り返され、最後にD4レーンから返されたベクトルを丸めることによって終了する。DP変換は全く同じ方法で機能するが、より大きな指数および仮数部を有する。
2.第2の方法では、各Dxブロックがその他とは独立して35ビットベクトルを計算する。4つのDxブロックがハードウェア内に実装されているシステムでは、各35ビットベクトルが、4つのDxブロックのセットに対して単一の35ビットベクトルを計算する第2のブロックに出力される。この値が保持され、同様の様式で、次のデータビットセットの出力からの35ビットベクトルと組み合わせられる。上記の例において、256ビットのShojiエンジンを用いると、64ビットチャンクD3〜D0は、第1の反復で処理され、各Dxブロックが35ビットベクトルをもたらし、最終的なベクトルがD3〜D0セットについて生成されることになる。第2のパスが、D4ブロック内のビットに対して別の35ビットベクトルを生成し、第2のブロックが、このベクトルを、より下位のD3−D0ブロックからのベクトルと組み合わせて、最終的なベクトルを生成する。この最終的なベクトルは、指定またはデフォルトの丸めモードに従って丸められて、最終的な単精度結果をもたらすことになる。方法1と同じく、DP変換は同様に機能するが、その大きな指数および仮数部のために異なる実装形態を要するであろう。
【0190】
境界ベクトルが、可能性のある範囲を限定する値を含む場合は、278個の可能性のあるビットすべてにSP数を生成させる必要はなく、同様に、境界ベクトルが範囲を限定する場合は、2099個の可能性のあるビットすべてにDP数を生成させる必要はない。また、いくつかの数は、SPまたはDP数の範囲を超え得ることに留意されたい。これは、積和の変換時に特に起こり得るが、多くの大きな数を加算する際にも起こり得る。DPまたはSP最大値よりも大きな数は、通常の丸め変換(通常は無限大を返す)に従うべきであり、DPまたはSP最小非正規数よりも小さな数は、丸め前にスティッキービットを調整すべきである。これをサポートするために、オーバーフローを捕捉する手段が必要となり、一実施形態では、オーバーフロー条件を識別する単一のビットで十分であろう。
【0191】
高精度固定小数点和がその入力と異なる形式に変換されることを妨げるものは何もない。例えば、半精度および四倍精度(quad−precision)(128ビット形式)は、いかなる想像可能な整数もしくは固定小数点形式または十進法浮動小数点形式も実装され得るのと同様に、上述のものと同じ方法を使用して実装され得る。
【0192】
装置は、演算動作を実行するための処理回路を有し得る。処理回路は、結果値の目標有効度を示すプログラム可能な有効度データに応答して、その目標有効度を有する結果値を生成し得る。これは、どの範囲の有効度が所与のアプリケーションに関する典型的なデータ値を収容すると予想されるか、例えば、地球上の温度センサによって測定されるデータが、センサの場所またはセンサの精度に応じて、比較的制限された値の範囲に限定される可能性が高いということを、実際にはプログラマが承知しているという認識を利用するものである。したがってプログラマは、予想される結果の有効度を指定するように、プログラム可能な有効度データを設定することができる。すると、処理回路は、結果のうちこれらの境界の外側の部分を計算する必要がなく、エネルギーが節約され、より素早い処理が提供される。
【0193】
例えば、プログラム可能な有効度データは、処理回路に、結果値を生成するために使用される少なくとも1つのオペランドの有効度とは独立して、目標有効度を有する結果値を生成させてもよい。故に、オペランドが、所与の演算動作の結果がプログラム可能な有効度データによって指示される有効度の外側になるべきであるような値を有する場合でも、不正確であり得ようとも指示された有効度を有する結果が依然として生成される。一部の場合では、結果値は、整数もしくは固定小数点データ値、または上述のHPA形式で表される値であってもよい。一部の例では、プログラム可能な有効度データは、結果値に関する少なくとも1つの有効度の境界を示す境界情報を含み得る。処理回路は、境界情報に応答して、少なくとも1つの有効度の境界内の有効度を有する結果値のビット値を判定してもよい。処理回路は、例えば例えば、処理を、結果値のうち指示された境界内の部分を判定することに限定してもよい。
【0194】
一部の例では、境界情報は、それぞれ結果値の最小有効ビットおよび最大有効ビットの有効度を示す、有効度下方境界および有効度上方境界のうちの少なくとも1つを示し得る。一部の場合では、下方境界と上方境界との両方が、境界情報によって明確に指示されてもよい。代替的に、これらのうちの1つが指示されてもよく、他方は、処理されている値のサイズ(長さ)から暗黙的であり得る。サイズは固定されている場合もあり、または境界情報において指定される可変サイズである場合もある。一部の例では、プログラム可能なデータによって指示される目標サイズは、ハードウェアでサポートされる値のサイズとは独立していてもよい。例えば、ハードウェアは、最大Nビットの結果値を並列に生成することしかできない場合がある。プログラム可能なサイズ情報がNビットより大きなサイズを示す場合、演算動作は、ハードウェアの複数のパスにおいて実行されてもよい。サイズがNビット未満である場合、ハードウェアのすべてが使用されるわけではないかもしれない。
【0195】
例えば、並列レーンの処理を実行するための処理ユニットが、処理回路内に提供されてもよく、プログラム可能な有効度データが、いくつのレーンが使用されるべきかを指定してもよい。プログラム可能な有効度データが、レーンのうちの1つの有効度を指示し、他のレーンの有効度が、この指示から判定されてもよい。代替的に、有効度は、各レーンにつき別々に表現されてもよく、これは、全体的なベクトル内のそのレーンの位置に関する「大域的な知識」を一切必要とすることなく、各レーンにそのレーンのデータ要素を処理させるために有用となり得る。
【0196】
別の例において、装置は、少なくとも1つのデータ記憶素子と、少なくとも1つの対応するデータ記憶素子に関するメタデータを記憶するためのメタデータ記憶素子とを有してもよい。メタデータ(例えば、上述のアンカー点値)は、対応するデータ記憶素子内に記憶されるデータ値の目標有効度および目標長を示してもよい。故に、メタデータは、データ記憶素子内に記憶されたいずれかの特定のデータ値よりもむしろ、記憶素子に関連付けられてもよい。データ記憶素子内に置かれるデータ値を生成する際、処理回路は、メタデータ記憶素子内の対応するメタデータを参照して、生成されるデータ値の有効度およびサイズを判定してもよい。これにより、処理回路が、メタデータにより指定された目標有効度およびサイズによって定義される枠内のビット値を生成するように、その処理を限定することが可能になる。
【0197】
かさねて、メタデータはプログラム可能であり得る。一部の場合では、メタデータ記憶素子は、データ記憶素子とは別々の記憶素子であってもよい。他の例では、メタデータ記憶素子は、対応するデータ記憶素子の一部を構成し得る。
【0198】
一部の場合では、1つのメタデータ記憶素子は、いくつかのデータ記憶素子がそれぞれ同じメタデータを共有するように、それらの間で共有されてもよい。データ記憶素子は、どのメタデータ記憶素子がそれと関連付けられるべきかを示すプログラム可能な値を含んでもよい。
【0199】
メタデータによって指示される目標サイズは、データ記憶素子自体の物理的サイズとは独立していてもよい。故に、メタデータは、データ記憶素子の記憶素子サイズより大きな目標サイズを指定してもよい。目標サイズがデータ記憶素子サイズより大きい場合、データ値は、いくつかのデータ記憶素子にまたがって記憶されてもよい。メタデータは、いくつのデータ記憶素子が同じデータ値の部分を表すかを指定する情報を含んでもよい。
【0200】
メタデータはまた、対応するデータ記憶素子内でのデータ値の生成中に例外条件が生じたかどうかを示す例外情報、データ値が正か負かを示す符号情報、または、データ値の特徴、例えばそれがゼロ、無限大、もしくは非数であるかどうかなどを示す特徴情報といった、他の情報を表現してもよい。例えば、例外情報は、データ記憶素子内に記憶されるデータ値を生成するための演算動作の結果が、メタデータにおいて指示された目標有効度および長さを有する値を使用して表現可能であるよりも大きかった場合、オーバーフロー条件を指示してもよい。
【0201】
他の例では、装置は、浮動小数点値を、その浮動小数点値に対応する二進値のそれぞれのビット有効度部分を表す複数のデータ要素を含むベクトルに変換するための変換動作を実行するための処理回路を備えてもよい。これは、浮動小数点値自体を使用した浮動小数点演算よりも容易に並列化される、ベクトル形式を使用した演算をサポートするのに有用である。二進値をベクトル形態で表現することが有用であるのは、これにより、ベクトルのデータ要素の数に応じてハードウェアが実施する処理の量を見積もるためにハードウェアを処理することを可能にするフレームワークが提供されるからである。例えば、ベクトルは、上述のHPA形式を有し得る。ベクトルは、精度を向上させるために、浮動小数点値の仮数部よりも大きなビット数を有してもよい。
【0202】
変換動作は、処理回路が浮動小数点値および制御情報に基づいてベクトルの各データ要素に関する値を選択するように、プログラム可能な制御情報に応答してもよい。制御情報は、変換動作を行うために実行される命令内のパラメータとして、例えば、制御情報を記憶するレジスタを識別する中間値もしくはレジスタ指定子として指定されてもよいし、または制御レジスタなどの専用の場所に提供されてもよい。
【0203】
一例において、制御情報は、変換動作において生成されるベクトルのデータ要素によって表現されるビット有効度部分のうち少なくとも1つの有効度を指示してもよい。故に、ベクトルは、プログラム可能に選択される有効度の二進値を表現してもよい。一部の場合では、制御情報は、ベクトルの所定のデータ要素に関する有効度を指示してもよく、他の要素の有効度は、所定のデータ要素(例えば、既知のデータ要素サイズのインターバルのカウントアップ)の有効度に由来する。しかしながら、他の例は、各要素について有効度の別々の指示を提供し得る。これは、各ベクトルレーンがそのデータ要素の部分を他の要素と比較して考慮する必要がないように、ベクトル処理を簡略化するのに有用である。
【0204】
制御情報はまた、ベクトルのデータ要素の変数を指示してもよい。これは、データ要素の数を指定する明確なサイズ指示を用いて、または各レーンに対する有効度指示を使用することによって行うことができる。例えば、特定のデータ要素の有効度について指示される所定のビットパターンは、このデータ要素が現在の計算において使用されていないことの信号となり得る。
【0205】
制御情報は、変換されている浮動小数点値とは独立していてもよい。したがって、浮動小数点値の有効度または値に関係なく、浮動小数点値が、制御情報において指示される有効度および/またはサイズのベクトルによって正確に表現され得ない値を有する場合でも、この有効度およびサイズを有するベクトルが生成され得る。
【0206】
一部の実装形態は、ベクトルの要素を一度に1つだけ生成する処理回路を使用し得る。しかしながら、性能を向上させるために、処理回路は、ベクトルに対するデータ要素のうちの少なくとも2つを並列に生成するための処理ユニットを有してもよい。
【0207】
変換は、異なる方法で実行されてもよい。一例において、各データ要素に対し、処理回路は、浮動小数点値の指数と、そのデータ要素によって表現される二進値の部分の有効度とに基づいて、そのデータ要素に、浮動小数点値に基づいて選択されるビット値を投入すべきかどうかを判定し得る。例えば、一部のデータ要素は、浮動小数点仮数部のビットのいずれの有効度にも対応しない有効度を有する場合があり、その場合、これらの要素には、浮動小数点仮数部から選択されるいかなるビット値も投入されない。一例において、各データ要素に対し、処理回路は、浮動小数点値の仮数部に応じて初期値を形成し、その後その初期値を、浮動小数点値の指数と、そのデータ要素に関する制御情報によって指示される有効度とに依存するシフト量だけシフトさせてもよい。これにより、各処理レーンがいかなる他のレーンとも独立してそのデータ要素を生成することができる比較的単純な技術が提供され、これは、ベクトル処理の順次または並列いずれの実装形態をサポートするのにも有用である。その後、結果ベクトルを、各レーンについてシフタにより生成された値からアセンブルすることができる。シフト動作は、オーバーフロー、アンダーフロー、または、浮動小数点値に対応する二進値がメタデータにおいて指示された有効度またはサイズを有するベクトルによって正確に表現され得ないときの不精確条件を指示する例外情報を生成するのにも有用であり得る。そのような例外情報は、プログラマによって設定された有効度が変換されている浮動小数点値の現在値を処理するのに好適でないときをシステムが判定することを可能にし得る。
【0208】
概して、各データ要素は、2の補数値を含み得る(符号マグニチュード形態における浮動小数点値の仮数部に対するものとして)。したがって、浮動小数点値が負である場合、ベクトルの少なくとも1つのデータ要素が、浮動小数点値の仮数部に対して符号反転されている値と共に生成されるように、符号反転動作が変換動作中に実行されてもよい。これにより、ベクトルが浮動小数点値と同じ符号の値を表すことが確実となる。
【0209】
概して、処理回路は、変換のみを実行するためのスタンドアロンの変換命令、または演算動作を変換と組み合わせる演算命令であってもよい第1の命令に応答して、変換動作を実行し得る。例えば、演算命令に応答して、処理回路は、演算動作(例えば乗算)を行って結果の浮動小数点値を生成してもよく、この値はその後、変換動作中にベクトルに変換することができる。他の例では、変換をまず実行してもよく、その後、変換されたベクトルおよびさらなるベクトルに演算動作(例えば加算または減算)を適用してもよい。
【0210】
また、変換動作は、上述の形態のベクトルを、ベクトルのそれぞれのビット有効度部分によって表される二進値の代替的表現を表すスカラー値に変換するように実行されてもよい。例えば、スカラー値は、二進法もしくは十進法の浮動小数点値、整数値、または固定小数点値であってもよい。これにより、上述のベクトル形態が、必要に応じて外部表現可能な形式にマッピングし戻されることが可能になる。例えば、他のデバイスとの互換性に関して、内部処理に使用されるベクトル形式を固定小数点、整数、または浮動小数点形式に対してマッピングすることが有用であり得る。
【0211】
かさねて、ベクトル−スカラー変換動作は、プログラム可能な制御情報に応答して、ベクトルに従うスカラー値を生成してもよい。制御情報は、中間値もしくはレジスタ指定子によって命令内で指定されてもよいし、または固定制御レジスタ内に置かれてもよい。制御情報は、単一の値として、あるいは各要素につき別々に指定される複数の値として、ベクトルのデータ要素によって表現されるビット有効度部分の有効度を指示してもよい。制御情報はまた、ベクトルのデータ要素がいくつ存在するかを指定してもよい。これにより、ベクトルが可変サイズおよび有効度の二進値を表現することができるようにプログラマが制御情報を定義することが可能となる。ベクトルは、要素毎に順次、または、データ要素のうち少なくとも2つを並列に処理するように処理ユニットで並列に処理することができる。
【0212】
スカラーが整数または固定小数点値である場合、ベクトルのデータ要素の少なくとも一部に関して、処理回路は、制御情報によって指示される有効度に基づいて、スカラー値のビット部分に対応する有効度を有するデータ要素の1個以上のビットを選択し、その後、選択されたビットに基づいてスカラー値を形成してもよい。
【0213】
ベクトルを浮動小数点値に変換するために、処理回路は、ベクトルの最大有効非符号ビットの位置と、最大有効符号なしビットを有するベクトルのデータ要素に関する制御情報によって指示される有効度とに基づいて、指数を判定してもよい。浮動小数点値の仮数部は、ベクトルの要素のうち少なくとも1つに関する部分的な仮数部値を生成し、浮動小数点値の仮数部が各要素につき生成された部分的な仮数部値に基づいて形成されるように、仮数部生成動作を実行することによって生成されてもよい。例えば、所与のデータ要素に対する仮数部生成動作は、その要素が少なくとも1つの非符号ビットを有するかどうかを検出することと、そうであれば、部分的な仮数部値として、データ要素の最大有効非符号ビットと、最大有効符号なしビットの位置に応じて選択されるデータ要素の低有効度ビットの数とを出力することと、を含み得る。
【0214】
一部の実装形態では、仮数部生成動作は、処理を高速化するために、データ要素のうち少なくとも一部に対して並列に実行されてもよい。それから、各要素に対する結果が後に組み合わされて、全体的な仮数部を決定され得る。例えば、各処理レーンは、ベクトルのその要素がベクトル全体の最大有効非符号ビットを含むという仮定の上で、仮数部生成動作を実行してもよい。処理回路はその後、各レーンの結果が分かった時点で、どのレーンが最大有効非符号ビットを実際に含むかに基づいて浮動小数点値の仮数部を形成し得る。
【0215】
代替的に、有効生成動作は、要素のうち少なくとも一部に対して順次実行されてもよい。これは処理を簡略化し得、それは、少なくともいくつかのレーンに関しては、仮数部がもっぱら他のレーンについて生成された部分的な仮数部値から形成されることが既知であれば、部分的な仮数部を生成する必要がない場合があるからである。後の要素に対する仮数部生成動作は、必要な処理量を低減させるために、より前の要素に対する仮数部生成動作において生成された情報に依存し得る。一例において、仮数部生成動作は、ベクトルの最大有効要素から開始して最小有効要素で終わるように左から右へ順次実行されてもよい。この場合では、非符号ビットを有する最大有効要素が置かれるとき、その要素に対して生成された部分的な有効値が浮動小数点値の仮数部に必要な合計ビット数よりも少ないビットを有する場合、生成される残りのビットの数を指示する制御値が出力され得、これは、次の要素に対する仮数部生成動作において、必要な残りのビット数を選択するために使用され得る。これにより、各要素について完全な仮数部生成動作を実行する必要性が回避される。ベクトルの低有効度要素に関する処理レーンは、部分的な仮数部の生成を必要とするのではなく、むしろ、丸めに使用されるガード/スティッキービットなどの状態情報を単に更新するだけの場合がある。
【0216】
他の例では、仮数部生成動作は、最小有効部分から開始してベクトルのより高有効度の部分で終わるように右から左へ順次適用され得る。
【0217】
スカラー値が浮動小数点値を含み、ベクトルが負の二進値を表すとき、浮動小数点値の仮数部が、ベクトルの少なくとも一部に対して符号反転されている二進値を有するように、符号反転動作が変換動作中に実行されてもよい。これにより、ベクトル形式で表現された数の符号が保たれる。
【0218】
浮動小数点−ベクトル変換に関しては、ベクトル−スカラー変換が、専用の変換命令、または変換を演算動作と組み合わせる演算命令に応答して実行されてもよい。
【0219】
概して、変換は、本明細書で説明された高位値アンカー固定点(HPA)形式を有する値と、HPAデータ値により表される二進値の代替的表現を提供する別のデータ値との間で、いずれの方向で実行されてもよい。
【0220】
本明細書に記載される少なくともいくつかの実施形態例において、演算回路の上流に配設された整合回路は、プログラム可能な有効度パラメータに従って1つ以上の入力オペランドを整合させるように、例えば、等しい有効度をもつ入力オペランドのビット位置が、演算回路の対応するビット入力に供給され、演算回路がその後、例えば、整数演算動作によって入力オペランドを処理し得るように、入力オペランドを整合させるように機能する。プログラム可能な有効度パラメータは、整合された結果値とは独立していてもよい(例えば、結果値は正規化されない)。むしろ、プログラム可能な有効度パラメータは、例えば結果値の有効度に従って、または入力オペランドの有効度に従って、別様に設定されてもよい。
【0221】
演算回路は、多様な異なる形態をとることができる。演算回路のいくつかの形態例は、整数加算器および/または整数乗算器を含む。他の形態の演算回路も可能である。
【0222】
入力オペランドが多様な異なる形態を有することができることは理解されるであろう。いくつかの実施形態例では、入力オペランドのうちの1つ以上が、浮動小数点入力オペランドであり得る。この場合、浮動小数点入力オペランドの指数値も、浮動小数点入力オペランドの仮数部値の整合をプログラム可能な有効度パラメータと指数値との両方に従って制御するために、整合回路に供給されてもよい。
【0223】
他の実施形態では、場合により、1つ以上の浮動小数点入力オペランドと組み合わせて、アンカー固定オペランドがまた、整合回路に対する入力として機能し得る。そのようなアンカー固定オペランドは、それ自体のプログラム可能な入力オペランド有効度を有し、整合回路は、このプログラム可能な入力オペランド有効度と、前述のプログラム可能な有効度パラメータとの両方に応答し得る。
【0224】
プログラム可能な入力オペランド有効度は、多様な異なる方法で指定され得る。いくつかの実施形態例では、プログラム可能な入力オペランド有効度は、有効度下方境界と有効度上方境界との間の範囲を指定するように機能する。これは例えば、境界値を直接指定すること、1つの境界値および幅を指定すること、1つの境界値と、それぞれ既知の幅をもつベクトルのコンポーネントの数とを指定することなどによって達成され得る。
【0225】
一部の実施形態では、プログラム可能な有効度パラメータは、入力オペランドの形態または相対的な有効度とは独立して、出力記憶素子に対して設定されてもよい。例えば、結果値が書き込まれる結果レジスタは、関連付けられたプログラム可能な有効度パラメータを有し得、入力オペランドは、結果レジスタの有効度に対応し、かつ未だ計算されていない結果値とは独立した有効度を有するために、演算回路の動作の前に整合回路により整合されている。
【0226】
他の実施形態例において、プログラム可能な有効度パラメータは、その代わりに、1つ以上の入力オペランドのうちのいずれかの最も高い有効度と一致するように、出力記憶素子に対して設定されてもよい。
【0227】
添付の図面を参照しながら本発明の例示的な実施形態を本明細書に詳細に記載してきたが、本発明はこれらの精確な実施形態に限定されないこと、そして、添付の特許請求の範囲によって定義される本発明の範囲および主旨から逸脱することなく様々な変更、追加、および修正が当業者によって本発明に行われ得ることを理解されたい。例えば、本発明の範囲から逸脱することなく、独立請求項の特徴と従属請求項との特徴の様々な組み合わせがなされ得る。