(57)【特許請求の範囲】
【請求項１】
データを処理するための装置であって、
ビット有効度に関して、１つ以上の入力オペランドのうちのいずれかを、出力記憶素子について指定されたプログラム可能な有効度パラメータに対して整合させて、１つ以上の整合された入力オペランドを提供するための整合回路であって、前記プログラム可能な有効度パラメータは、前記出力記憶素子に記憶される結果値の各ビットにより２の何乗と表すのかを示す、前記整合回路と、
前記１つ以上の整合された入力オペランドを受信し、前記１つ以上の整合された入力オペランドに対して演算動作を実行して前記結果値を生成し、前記結果値を前記出力記憶素子に記憶するように、前記整合回路に連結された演算回路と、を備え、
前記プログラム可能な有効度パラメータが、前記結果値とは独立している、装置。
【請求項２】
前記演算回路が、整数加算器である、請求項１に記載の装置。
【請求項３】
前記演算回路が、整数乗算器である、請求項１に記載の装置。
【請求項４】
前記１つ以上の入力オペランドのうち少なくとも１つが、指数値および仮数部値を有する浮動小数点入力オペランドであり、前記整合回路が、前記プログラム可能な有効度パラメータおよび前記指数値に応答して、ビット有効度に関して前記仮数部値を前記結果値と整合させる、請求項１〜３のいずれか一項に記載の装置。
【請求項５】
前記１つ以上の入力オペランドのうち少なくとも１つが、プログラム可能な入力オペランド有効度を有するアンカー固定オペランドであり、前記整合回路が、前記プログラム可能な有効度パラメータおよび前記プログラム可能な入力オペランド有効度に応答して、ビット有効度に関して、前記アンカー固定オペランドを前記結果値と整合させる、請求項１〜４のいずれか一項に記載の装置。
【請求項６】
前記プログラム可能な入力オペランド有効度が、有効度下方境界と有効度上方境界との間の範囲を指定する、請求項５に記載の装置。
【請求項７】
前記プログラム可能な有効度パラメータが、前記１つ以上の入力オペランドとは独立して、前記出力記憶素子に対して設定される、請求項１〜６のいずれか一項に記載の装置。
【請求項８】
前記プログラム可能な有効度パラメータが、前記１つ以上の入力オペランドのうちのいずれかの最も高い有効度と一致するように、前記出力記憶素子に対して設定される、請求項１〜７のいずれか一項に記載の装置。
【請求項９】
前記出力記憶素子が出力レジスタであり、前記プログラム可能な有効度パラメータが前記結果値のビット有効度を指示し、
前記整合回路が、前記結果値のビット長を指示するプログラム可能な長さパラメータにより指定されたサイズを有する前記結果値を生成するよう構成された、請求項１〜８のいずれか一項に記載の装置。
【請求項１０】
データを処理するための装置であって、
ビット有効度に関して、１つ以上の入力オペランドのうちのいずれかを、出力記憶素子について指定されたプログラム可能な有効度パラメータに対して整合させて、１つ以上の整合された入力オペランドを提供するための整合手段であって、前記プログラム可能な有効度パラメータは、前記出力記憶素子に記憶される結果値の各ビットにより２の何乗と表すのかを示す、前記整合手段と、
前記１つ以上の整合された入力オペランドを受信し、前記１つ以上の整合された入力オペランドに対して演算動作を実行して前記結果値を生成し、前記結果値を前記出力記憶素子に記憶するための、前記整合手段に連結された演算手段と、を備え、
前記プログラム可能な有効度パラメータが、前記結果値とは独立している、装置。
【請求項１１】
データを処理する方法であって、
ビット有効度に関して、１つ以上の入力オペランドのうちのいずれかを、出力記憶素子について指定されたプログラム可能な有効度パラメータに対して整合させて、１つ以上の整合された入力オペランドを提供することであって、前記プログラム可能な有効度パラメータは、前記出力記憶素子に記憶される結果値の各ビットにより２の何乗と表すのかを示す、前記提供することと、
前記１つ以上の整合された入力オペランドを受信することと、
前記１つ以上の整合された入力オペランドに対して演算動作を実行して前記結果値を生成することと、
前記結果値を前記出力記憶素子に記憶することと、を含み、
前記プログラム可能な有効度パラメータが、前記結果値とは独立している、方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、データ処理の分野に関する。
【背景技術】
【０００２】
整数演算および浮動小数点演算をサポートするデータ処理システムを提供することは知られている。
【発明の概要】
【０００３】
本開示の少なくともいくつかの実施形態は、データを処理するための装置であって、
ビット有効度に関して、１つ以上の入力オペランドのうちのいずれかを、出力記憶素子について指定されたプログラム可能な有効度（ｓｉｇｎｉｆｉｃａｎｃｅ）パラメータに対して整合させて、１つ以上の整合された入力オペランドを提供するための整合（ａｌｉｇｎｍｅｎｔ）回路と、
該１つ以上の整合された入力オペランドを受信し、該１つ以上の整合された入力オペランドに対して演算動作を実行して結果値を生成し、該結果値を該出力記憶素子に記憶するように、該整合回路に連結された演算回路と、を備え、
該プログラム可能な有効度パラメータが、該整合された結果値とは独立している（無関係である）、装置を提供する。
【０００４】
本開示の少なくともいくつかの実施形態は、データを処理するための装置であって、
ビット有効度に関して、１つ以上の入力オペランドのうちのいずれかを、出力記憶素子について指定されたプログラム可能な有効度パラメータに対して整合させて、１つ以上の整合された入力オペランドを提供するための整合手段と、
該１つ以上の整合された入力オペランドを受信し、該１つ以上の整合された入力オペランドに対して演算動作を実行して結果値を生成し、該結果値を該出力記憶素子に記憶するための、該整合手段に連結された演算手段と、を備え、
該プログラム可能な有効度パラメータが、該整合された結果値とは独立している、装置を提供する。
【０００５】
本開示の少なくともいくつかの実施形態は、データを処理する方法であって、
ビット有効度に関して、１つ以上の入力オペランドのうちのいずれかを、出力記憶素子について指定されたプログラム可能な有効度パラメータに対して整合させて、１つ以上の整合された入力オペランドを提供することと、
該１つ以上の整合された入力オペランドを受信することと、
該１つ以上の整合された入力オペランドに対して演算動作を実行して結果値を生成することと、
該結果値を該出力記憶素子に記憶することと、を含み、
該プログラム可能な有効度パラメータが、該整合された結果値とは独立している、方法を提供する。
【０００６】
ここで、添付の図面を参照しながら、単なる例として実施形態例を説明する。
【図面の簡単な説明】
【０００７】
【図１】桁上げ選択加算器を概略的に例示する。
【図２】桁上げ先見加算器を概略的に例示する。
【図３】浮動小数点数をＨＰＡ数に加算する一例を示す。
【図４】ある数のＨＰＡ表現例を示す。
【図５】ＨＰＡ数を浮動小数点数に変換するときの仮数部（ｓｉｇｎｉｆｉｃａｎｄ）の生成の一例である。
【図６】ＨＰＡ数がハードウェアサイズに収まる場合に、ＨＰＡ演算を使用していくつかの浮動小数点値を加算する一例を示す。
【図７】ＨＰＡ数がハードウェアサイズよりも幅広である場合に、ＨＰＡ演算を使用していくつかの浮動小数点値を加算する一例を示す。
【図８】データ処理システムを概略的に例示する。
【図９】データ処理システム内で操作される数を表現するための異なる形式を概略的に例示する。
【図１０】倍精度浮動小数点値とＨＰＡ値との間の関係例を概略的に例示する。
【図１１】結果ＨＰＡレジスタを用いて入力オペランドを整合するための回路を概略的に例示する。
【図１２】ベクトルＨＰＡ数に対する処理動作を、そのＨＰＡ数内のコンポーネントの数とプログラム命令との両方に従って実行するための回路を概略的に例示する図であり、異なるコンポーネントが並列に処理されている。
【図１３】ベクトルＨＰＡ数に対する処理動作を、そのＨＰＡ数内のコンポーネントの数とプログラム命令との両方に従って実行するための回路を概略的に例示する図であり、異なるコンポーネントが連続して処理されている。
【図１４】ＨＰＡ数を使用して実行される処理に関する例外指示の生成を概略的に例示する。
【図１５】プログラム可能な制御データによって指定された目標有効度および／または目標サイズに基づいて結果を生成するための処理回路を有する装置の一例を示す。
【図１６】演算動作に対する有効度の上方境界および下方境界を設定する一例を示す。
【図１７】高精度アンカー固定（ｈｉｇｈ−ｐｒｅｃｉｓｉｏｎ  ａｎｃｈｏｒｅｄ）（ＨＰＡ）データ形式の一例を示す。
【図１８】対応するデータ記憶素子内に記憶されるデータ値の目標有効度を指示するメタデータ（アンカー値ａを含む）を記憶するためのメタデータ記憶素子の一例を示す。
【図１９】並列レーンの処理を実行するためのいくつかの処理ユニットを含む処理回路の一例を示す。
【図２０】一連の浮動小数点値を加算するための累算動作の一例を示す。
【図２１】浮動小数点値をＨＰＡデータ形式の値に変換する一例を示す。
【図２２】ＨＰＡデータ形式の値を浮動小数点値に変換する一例を示す。
【発明を実施するための形態】
【０００８】
プログラマ選択可能範囲内にある浮動小数点（ＦＰ）数の素早く正確な累算を可能にする、新たなデータタイプおよび新たな命令が開示される。ほとんどの問題に適応する適度な範囲では、累算はＦＰ加算より素早く、また結合的である。結合加算により、再現可能かつ正確な結果を依然としてもたらすと同時に問題を並列化することができ、例えば既存のハードウェアと比較して１００倍以上の高速化が可能となる。我々は、これらの利益は高性能コンピューティング（ＨＰＣ）スペースにおいて非常に魅力的となり、多くの非ＨＰＣアプリケーションでも注目に値すると考える。
【０００９】
浮動小数点（ＦＰ）演算に関する既知の問題は、それが非結合的であることであり、この事実は、和を問題含みにする。
●プログラマは、３つの数を加算するときでさえ非常に異なる結果を心配する必要がある。
●プログラマは、非常に異なる結果を回避することを望んで、必要以上に幅広い形式を使用する。
●全く同じ順序で計算されない限り和が再現可能でないため、プログラマは、コードを容易に並列化することができない。
【００１０】
例えば、単精度では、
２２０＋（−２４４＋２４４）＝２２０
しかし
（２２０＋−２４４）＋２４４＝０
である。実行される動作の順序に応じて、結果は１００万またはゼロである。指数が２４分異なるためこれは極例であるが、指数が１だけ異なる場合、または指数のすべてが同じであり、３つより多くの事物を加算している場合でも、異なる答えが得られる場合がある。Ｃプログラミング言語は、和が左から右へ順番に評価されることを要することによって再現性問題に対処するが、これは正確性に対しては何の効果もなく、並列化を不可能にする。
【００１１】
こうした問題は、プログラムが数百万の事物を加算することを要し得る高性能コンピューティング（ＨＰＣ）にとって特に重大である。プログラマはこれらの問題の並列化を望むが、再現性の欠如により、デバッグが通常よりもさらに難しくなる。異なる構成の機械は、そうした機械の再プログラミングが完璧に行われたとしても、異なる答えをもたらすであろう。
【００１２】
浮動小数点数
浮動小数点（ＦＰ）は、少数のビットを使用して実数を近似する有用な方法である。ＩＥＥＥ  ７５４−２００８  ＦＰ規格は、複数の異なるＦＰ数形式を提案し、その一部は、バイナリ６４（別称、倍精度すなわちＤＰ）、バイナリ３２（別称、単精度すなわちＳＰ）、およびバイナリ１６（別称、半精度すなわちＨＰ）である。６４、３２、および１６という数は、各形式(フォーマット)に必要なビット数を指す。
【００１３】
表現
ＦＰ数は、負の２００万の代わりに−２．０×１０６と記述する、科学の授業で教えられる「科学的記数法」と非常に似ている。この数の部分は、符号部（この場合は負）、仮数部（２．０）、指数の基数部（１０）、および指数部（６）である。これらの部分はすべてＦＰ数における類似物を有するが、それらには相違点があり、そのうち最も重要なのは、構成要素の部分は二進数として記憶され、指数の基数は常に２であるということである。
【００１４】
より精確には、ＦＰ数は、符号ビットと、何らかの数のバイアス付き指数ビットと、何らかの数の小数部ビット（ｆｒａｃｔｉｏｎ  ｂｉｔ）とから成る。具体的には、ＤＰ、ＳＰ、およびＨＰ形式は、以下のビットから成る。
【表１】
0006694880.tif 000002
符号は、負数では１であり、正数では０である。ゼロを含むすべての数が符号を有する。
【００１５】
指数にはバイアスが付いており、これは、真の指数が、その数に記憶されている指数と異なることを意味する。例えば、バイアス付きＳＰ指数は、８ビット長であり、０〜２５５の範囲である。指数０および２５５は特殊な事例であるが、他の指数はすべてバイアス１２７を有し、これは真の指数がバイアス付き指数よりも１２７小さいことを意味する。最小のバイアス付き指数は１であり、これは−１２６という真の指数に対応する。最大のバイアス付き指数は２５４であり、これは１２７という真の指数に対応する。ＨＰおよびＤＰ指数は同じように機能し、そのバイアスは上記の表に示されている。
【００１６】
ＳＰ指数２５５（またはＤＰ指数２０４７、またはＨＰ指数３１）は、無限大（ｉｎｆｉｎｉｔｉｅｓ）、およびＮａＮ（非数（ｎｏｔ  ａ  ｎｕｍｂｅｒ））と呼ばれる特殊記号のために予約されている。無限大（正であっても負であってもよい）は、ゼロの小数部を有する。指数２５５および非ゼロ小数部を有する数はいずれもＮａＮである。無限大は飽和値をもたらすため、これは実際には、「この計算は、この形式で表すことができるものよりも大きな値をもたらした」というようなことを意味する。ＮａＮは、実数に対する数学的に定義されない動作、例えばゼロによる除算、または負数の平方根の計算について返される。
【００１７】
指数ゼロは、いずれの形式においても、非正規数およびゼロのために予約されている。正規数は、次の値を表し、
−１ｓｉｇｎ×１．ｆｒａｃｔｉｏｎ×２ｅ
式中、ｅは、バイアス付き指数から計算される真の指数である。１．ｆｒａｃｔｉｏｎという用語は仮数部と呼ばれ、１はＦＰ数の一部としては記憶されないが、その代わりに指数から推測される。ゼロおよび最大指数を除いたすべての指数が、１．ｆｒａｃｔｉｏｎ形態の仮数部を示す。指数ゼロは、０．ｆｒａｃｔｉｏｎ形態の仮数部、および所与の形式の１−バイアスに等しい真の指数を示す。そのような数は、非正規（ｓｕｂｎｏｒｍａｌ）と呼ばれる（歴史的にこれらの数は「ｄｅｎｏｒｍａｌ」と称されたが、現代の用法では「ｓｕｂｎｏｒｍａｌ」という用語が好まれる）。
【００１８】
ゼロに等しい指数と小数部との両方を有する数はゼロである。
【００１９】
以下の表は、ＨＰ形式におけるいくつかの例示的な数を有する。エントリは二進法であり、読みやすさを向上させるために「＿」の文字が付加されている。非正規エントリ（指数がゼロである表の４番目のライン）が、先行のラインの正規エントリとは異なる仮数部をもたらすことに留意されたい。
【表２】
0006694880.tif 000003
【００２０】
ＦＰ実装形態の複雑さの大部分は非正規数によるものであり、したがって、それらはマイクロコードまたはソフトウェアによって処理されることが多い。一部のプロセッサは、ハードウェア内で非正規数を処理し、これらの動作をソフトウェアまたはマイクロコード実装形態と比較して１０〜１００倍高速化させる。
【００２１】
整数、固定小数点、浮動小数点
符号を処理するＦＰ方式は、符号マグニチュード（ｓｉｇｎ−ｍａｇｎｉｔｕｄｅ）と呼ばれ、これは、整数がコンピュータに記憶される通常の方式（２の補数）とは異なる。符号マグニチュード表現では、同じ数の正数と負数とは、符号ビットのみ異なる。１個の符号ビットと３個の仮数ビットとから成る４ビットの符号マグニチュード整数は、プラス１およびマイナス１を次のように表すことになる。
＋１＝０００１
−１＝１００１
２の補数表現では、ｎビットの整数ｉは、二進法ｎ＋１−ビット値２ｎ＋ｉの下位ｎビットによって表され、そのため、４ビットの２の補数整数は、プラス１およびマイナス１を次のように表すことになる。
＋１＝０００１
−１＝１１１１
２の補数形式は、コンピュータ演算を簡略化するため、符号付き整数については事実上万能である。
【００２２】
固定小数点数は、まさに整数のように見えるが、実際には、ある特定の数の小数部ビットを有する値を表す。センサデータは固定小数点形式であることが多く、ＦＰの採用の普及前に書かれた固定小数点ソフトウェアが多数存在する。固定小数点数は扱いが非常に面倒であるが、これは、プログラマが「二進小数点」すなわち数の整数部と小数部との間の分離子を把握しなければならず、またビットを正しい場所に保つために数を絶えずシフトしなければならないからである。ＦＰ数はこの難点を有しないため、固定小数点数とＦＰ数とで変換可能であることが望ましい。変換の実行が可能であることは、固定小数点ソフトウェアおよびデータを依然として使用することができるが、新たなソフトウェアを書く際に固定小数点に制限されないことも意味する。
【００２３】
ＦＰ数の丸め
ほとんどのＦＰ動作は、動作が無制限の範囲および精度で行われたかのように計算され、ＦＰ数に収まるように丸められることがＩＥＥＥ−７５４規格では必要とされる。計算がＦＰ数と正確に一致する場合、常にその値が返されるが、計算は通常、２つの連続した浮動小数点数間に位置する値をもたらす。丸めは、この２つの連続した数のうちのどちらが返されるべきかを選ぶプロセスである。
【００２４】
丸めモードと呼ばれる丸めの方法がいくつか存在し、これらのうちの６つは以下の通りである。
【表３】
0006694880.tif 000004
この定義は、実際にどの方法で丸めるかについては述べていない。一般的な実装形態の１つは、動作を行い、切り捨て値（すなわち、ＦＰ形式に収まる値）ならびに残りのビットのすべてに注目して、ある特定の条件が適用される場合は切り捨て値を調整することである。これらの計算はすべて、以下に基づく。
Ｌ−（最小（ｌｅａｓｔ））切り捨て値の最小有効ビット（least significant bit）
Ｇ−（ガード（ｇｕａｒｄ））次の最大有効ビット(most significant bit)（すなわち、切り捨てに含まれない第１のビット）
Ｓ−（スティッキー（ｓｔｉｃｋｙ））切り捨ての一部でない残りのビットすべての論理ＯＲ
これらの３つの値および切り捨て値を考慮すると、以下の表に従って正しく丸められた値を常に計算することができる。
【表４】
0006694880.tif 000005
例えば、２つの４ビット仮数部を乗算し、その後４ビット仮数部に丸めることを考察する。
ｓｉｇ１＝１０１１（十進法の１１）
ｓｉｇ２＝０１１１（十進法の７）
乗算結果
ｓｉｇ１×ｓｉｇ２＝１００１＿１０１（十進法の７７）
Ｌ  Ｇｓｓ
切り捨てられた４ビットの結果の最小有効ビットはＬ、次のビットはＧと表示され、Ｓは、ｓと表示される残りのビットの論理ＯＲである（すなわち、Ｓ＝０｜１＝１）。丸めるには、この４ビットの結果（１００１）を、上記の表中の丸めモードおよび計算に従って調整する。つまり、例えばＲＮＡ丸めにおいて、Ｇは設定されているため１００１＋１＝１０１０を返す。ＲＸ丸めではＧ｜Ｓが真であるため、Ｌを１に設定し（これは既に１であるため、この場合は何も変化しない）、１００１を返す。
【００２５】
整数および固定小数点数の丸め
ＦＰ数を整数または固定小数点に変換する場合も丸めを行う。その概念は、ＦＰ丸めと基本的に同じである。たまたま整数であるＦＰ数は、常にその整数に丸められる。他のＦＰ数はすべて、２つの連続した整数間に位置し、丸めが、どの整数が返されるかを左右する。残念ながら、整数の丸め論理は、２の補数と符号マグニチュード形態との間の相違のために難度が幾分か高い。符号マグニチュード数のインクリメントは常にマグニチュードを増加させるため、インクリメントした数は、ゼロからさらに遠く離れる。同じことが正の２の補数の数にも起こるが、負の２の補数の数は、インクリメントするとゼロにより近くなる。これは、整数が正であるか負であるかに基づいて丸め論理が変更されなければならないことを意味する。これはまた、基底値（インクリメントされるまたはされない値）を選ぶ際に注意しなければならないことも意味する。正の整数では、その値は、単に切り捨てられたＦＰ仮数部であり、そのため、１．３７は、１の基底値および１または２のいずれかの結果を有することになる。負の整数では、この場合もやはり仮数部を切り捨て、その結果の１の補数（１の補数は、元々の数のすべてのビットを反転したものである）を取り、−１．３７を切り捨てて１にし、その後反転させ、−２の基底値が与えられる。すると、ここで望まれるのはこの結果を−２または（インクリメントされる場合は）−１のいずれかとすることであるため、すべてが解決する。
【００２６】
事態をさらに複雑にすることに、この変換方法は、負の整数のＬ、Ｇ、およびＳを見出すためにいくらかの計算を必要とする。正確な丸めには、２の補数プロセスを完了し（反転および１の加算）、その後Ｌ、Ｇ、およびＳを計算することが必要になるが、この１の加算は、単に反転することと比較して遅い。理想的には、元々のシフトされた入力から実際のＬ、Ｇ、およびＳを計算することが望まれる（すなわち、符号について何かを行う前の入力から。そのため、浮動小数点１．３７または−１．３７が両方とも整数１へと右にシフトされることになる）。
【００２７】
Ｌ０、Ｇ０、およびＳ０を、反転前の最小有効ビット（ｌｓｂ）、ガード、およびスティッキーとし、Ｌｉ、Ｇｉ、およびＳｉを、反転後のｌｓｂ、ガード、およびスティッキーとし、最後に、Ｌ、Ｇ、およびＳを、反転および１の加算後のｌｓｂ、ガード、およびスティッキーとする。
【００２８】
Ｓ０がゼロである場合、Ｓｉに寄与するビットはすべて１であり、故にＳ（それらのＳｉビットに１を加算することによって得られる）もゼロである。Ｓ０が非ゼロである場合、Ｓｉはすべて１ではなく、故にＳは非ゼロである。このように、すべての場合でＳ０＝Ｓである。
【００２９】
Ｇ０がゼロである場合、Ｇｉは１であり、Ｓ０がゼロである場合にのみ起こるＳビットからのキャリーイン（ｃａｒｒｙ−ｉｎ）が存在する場合を除いて、Ｇも１である。Ｇ０が１である場合、Ｇｉはゼロであり、この場合もやはり、Ｓ０がゼロである場合にのみ起こるＳビットからのキャリーインが存在する場合を除いて、Ｇも１である。このように、Ｇ＝Ｇ０＾Ｓ０である。
【００３０】
非常に似た論理によって、Ｌ＝Ｌ０＾（Ｇ０｜Ｓ０）である。
【００３１】
負と正との両方の整数に関するＬ、Ｇ、およびＳが得られたので、ここでの丸め規則を考え出すことができる。
【表５】
0006694880.tif 000006
固定小数点数は、整数と全く同じ方法で丸められる。符号なしの（整数または固定小数点への）変換に関する規則は、正の変換に関する規則と同じである。
【００３２】
挿入丸め（Ｉｎｊｅｃｔｉｏｎ  Ｒｏｕｎｄｉｎｇ）
丸めをより素早く行う方法は、ほぼすべてのＦＰ動作の一部である仮数部加算の一部として丸め定数を挿入することである。これがどのように機能するかを確かめるために、ドルおよびセント単位の数を加算し、その後ドルに丸めることを考察する。次の加算をすると
＄１．２７
＋＄２．３５
＄３．６２
となる。和＄３．６２は、＄３よりも＄４に近いことが分かり、したがって、最近接丸めモードのいずれも＄４を返すはずである。これらの数を二進法で表した場合、直前の節のＬ、Ｇ、Ｓ方法を使用して同じ結果が得られ得る。しかし、５０セントだけ加算し、結果を切り捨てると想定するとどうだろう。
１．２７
＋２．３５
＋０．５０（丸め挿入）
４．１２
この和（＄４．１２）からドル額（＄４）がちょうど返されたら、ＲＮＡ丸めモードを使用して正しく丸められたことになる。＄０．５０の代わりに＄０．９９を加算した場合、ＲＰ丸めを使用して正しく丸めることになる。ＲＮＥはこれよりわずかに複雑である。＄０．５０を加算し、切り捨て、その後残りのセントに注目する。残りのセントが非ゼロである場合、切り捨て結果は正しい。ゼロセントが残っていれば、挿入前は２ドル額のちょうど中間であり、そのため偶数のドル額が選ばれる。二進法ＦＰでは、これは、ドル額の最小有効ビットをゼロに設定することを意味する。
【００３３】
３つの数の加算は、２つの数の加算よりわずかに遅いのみであるため、挿入丸めを使用することによって、２つの仮数部を加算し、Ｌ、Ｇ、およびＳを検査し、その後丸めモードに従ってその結果をインクリメントした場合よりも大幅に迅速に、丸められた結果が得られる。
【００３４】
挿入丸めの実装
ＦＰにおいて、丸め挿入は、３つの異なる値のうちの１つであり、これらの値は、丸めモードおよび（時として）結果の符号に依存する。
【００３５】
ＲＮＡとＲＮＥとの両方で、Ｇ位置に１を挿入することが必要とされる（これは、ここでのドルおよびセントの例に＄０．５０を加算するようなことである）。
【００３６】
ＲＰおよびＲＭ丸めは、モードのみならず符号にも依存する。ＲＰは、正の結果を切り上げる（仮数部のマグニチュードを正の無限大の方向に増加させる）が、負の結果を切り捨てる（正の無限大により近い仮数部を選ぶ）。同様に、ＲＭは、負の結果を切り上げる（仮数部のマグニチュードを負の無限大の方向に増加させる）が、正の結果を切り捨てる（負の無限大により近い仮数部を選ぶ）。このように、ＲＭおよびＲＰは、２つの種類：符号が丸め方向と一致するときの切り上げ（ＲＵ）、および符号が丸め方向と異なるときの切り捨て（ＲＺ）に分けられる。ＲＵの場合では、Ｇビットの場所、およびＳに論理的に寄与するすべての場所で１が挿入される（これは、ここでのドルおよびセントの例に＄０．９９を加算するようなことである）。
【００３７】
ＲＺおよびＲＸモードでは、そしてＲＺモードに変わるＲＰおよびＲＭモードでは、ゼロが挿入される。
【００３８】
丸めモードの大部分において、丸め挿入を加算し、その後切り捨てることで、正しく丸められた結果が与えられる。２つの例外はＲＮＥおよびＲＸであり、これらは、加算後にＧおよびＳを検査することを要する。ＲＮＥでは、ＧとＳとの両方がゼロである場合、Ｌを０に設定する。ＲＸでは、ＧまたはＳが非ゼロである場合、Ｌを１に設定する。
【００３９】
ＦＰ数は実数ではない
ＦＰ数は実数と同様であるものと考えたくなるが、それらは、最も基本的な特性についてでさえ本質的に異なる。
１．それらは結合的ではない。例えばＳＰでは、３つの数を加算し、１００万またはゼロを返す場合があり、恐らく人々が丸め誤差と考えるものではない。
（２４５＋  −２４５）＋２２０＝２２０
２４５＋（−２４５＋２２０）＝０
２．それらは分配法則に従わない。かさねて、ＳＰでは、
３，０００，００１＊（４．００００１＋５．００００１）＝０ｘ４ｂｃｄｆｅ８３
（３，０００，００１＊４．００００１）＋（３，０００，００１＊５．００００１）＝０ｘ４ｂｃｄｆｅ８２
となり、オーバーフローの存在下において、事態はより悪化する。
２５０＊（２７８−２７７）＝２１２７
（２５０＊２７８）−（２５０＊２７７）＝ｉｎｆｉｎｉｔｙ
３．一部の実装形態では、それらは、デフォルトＮａＮモード（すべてのＮａＮを単一のＮａＮに変換するモード）にある場合を除いて可換ですらなく、これは概して、ｎａｎＡ＋ｎａｎＢ！＝ｎａｎＢ＋ｎａｎＡであるからである。数値の加算および乗算は可換である。
４．ＩＥＥＥ  ＮａＮ規則のために、乗法または加法の単位元が存在しない。１およびゼロが、数値の単位元として機能する。
【００４０】
ＦＰ数について考える１つの有用な方法は、それらを、多くても２、３個（ＤＰでは５３個）の連続したビットが非ゼロであり得る非常に長い固定小数点数と見なすことである。例えば、非無限ＤＰ数は、仮数部の第１のビットを２０４６個の場所のうちのいずれに有してもよく、その第１のビットには５２個の他の仮数ビットが続き、符号ビットが存在するため、いかなる有限ＤＰ数も、２０４６＋５２＋１＝２０９９ビット固定小数点数として表すことができる。この方法で検査すると、２つのＦＰ数の加算は概して、別のＦＰ数をもたらすことが非常に明白になる：加算の結果は、それがＦＰ数になるように丸められなければならない。
【００４１】
高精度アンカー固定数
高精度アンカー固定（ＨＰＡ：high-precision anchored）数は、２の補数の長整数ｉ（一般に１２８ビット以上）と、ｉのビットの重みを（典型的には、ｉの最小ビットの指数値を指定することによって）表すより小さなアンカー整数ａとから成るペア（ｉ，ａ）である。アンカー整数ａは、プログラム可能な有効度パラメータ／値をもたらすものと見なされ得る。アンカー整数ａは、例外情報：無限、符号、ＮａＮなどの加算情報を含み得るＨＰＡ数に関するメタデータの一部を形成し得る。このペアは、ＦＰ数の仮数部および指数値と幾分か類似しているが、長整数ｉが正規化されず、かつ通常はＦＰ仮数部よりも大幅に大きく、また、アンカー値ａが和に対する入力のすべてに対して固定されていてもよいという点で異なる。ＦＰ数の加算は指数の変化を引き起こすが、ＨＰＡ数の加算は、アンカーを変化させない。
【００４２】
自明な例として、１０ビットのｉと−４のａアンカー値とから成るＨＰＡ表現を考察する。この形式のいくつかの値は、表１に与えられる。
【表６】
0006694880.tif 000007
これらの数のうちの２つ、例えば０．５および１．５を加算するとき、アンカーは変化せず、和は、単にｉ部分を加算することによって簡便に与えられる。ＨＰＡの和は単に２の補数の加算であることから、ＨＰＡの和は結合的である。
【００４３】
実現可能なＨＰＡ累算器を製造する方法の１つは、以下を用いる。
１．ＨＰＡ累算器が巨大である必要がないように必要とされる数の範囲を限定する方法。
２．大きな２の補数の数を迅速に加算する方法。
３．ＦＰからＨＰＡに変換するための高速ユニット、および
４．ＨＰＡからＦＰに変換するためのユニット。
【００４４】
以下の節において、これらの要件のそれぞれを取り上げる。
【００４５】
範囲の限定
ＦＰ数は、広い範囲を有する。倍精度（ＤＰ）数は、２−１０００より小さく、２１０００より大きいものとすることができるが、ほとんどの累算はこの範囲全体に及ばない。実際に、その範囲のすべてにわたる値を有意義に累算するであろう種類の問題を想像するのは難しい。原子寸法より小さい問題は非常に小さな値を累算し得、天文学的計算は非常に大きな値を累算し得るが、陽子の幅を銀河系間の距離に加算することは一般的に有用ではない。高性能計算であっても、ほとんどの累算は限定された範囲にわたって起こる。
【００４６】
多くのプログラマは、ＦＰの範囲のためではなく利便性のためにＦＰを使用する。音声コーデックはＦＰを使用し得、音声データは、周波数と容量との両方で限定された範囲を有する。ＦＰでプログラムする方が容易であり、これはプログラマにとって魅力的である。
【００４７】
プログラマが、特定の和に関するデータのすべてが２６０未満のマグニチュードを有し、２−５０未満のマグニチュードを有する値が多少なりとも有意義に和に影響しないであろうと判断した場合、そのデータが、ＨＰＡ形式（ｉ，−５０）を使用し、１２８ビットのｉを用いて加算されれば、その累算は結合的であり、任意の順序で数を加算することができる。
【００４８】
大きな数の加算
我々は、６４ビット整数のベクトルをより長い１つの整数と見なすことを提案する。例えば、２５６ビット整数は、４つの６４ビット整数から成ることになる。
【００４９】
そのような２つのベクトルを考慮すると、６４ビットＳＩＭＤ加算器（ＡＲＭ  ＬｉｍｉｔｅｄのＮＥＯＮ  ＳＩＭＤエンジンのようなもの）に適度な変更を行って、２５６ビットの和ａ＋ｂを計算することができる。加算は、下位の６４ビットを加算し、その後次の６４ビットを下位加算のキャリーアウト（ｃａｒｒｙ  ｏｕｔ）と一緒に加算することなどによって達成される。実際のところ、これは、かなり大きなＳＩＭＤユニットでは単一サイクルで実装可能であり得、１０２４ビット加算器が恐らく達成可能である。
【００５０】
適度なサイズ（例えば最大２５６ビット）のための１つの方法は、図１にあるような桁上げ選択加算器を構築することである。各レーンｉは、ａｉ＋ｂｉおよびａｉ＋ｂｉ＋１を計算し、レーンｉ−１のキャリーアウトは、２つの和のどちらかを選択するために使用される。我々は、これは現行のＣＰＵで単一サイクルにおいて容易に計算され得ると考える。
【００５１】
より幅広のＳＩＭＤユニット（例えば最大１０２４ビット）では、図２のもののような桁上げ先見（ｃａｒｒｙ−ｌｏｏｋａｈｅａｄ）加算器は、単一サイクル性能を保つことができる。前述同様に、各レーンｉは、ａｉ＋ｂｉおよびａｉ＋ｂｉ＋１を計算するが、このレーンは、その和がすべて１（ｐｉ）であるかどうか、すなわち、レーンｉの和が入力キャリーをレーンｉ＋１に伝搬するかどうかも計算する。
【００５２】
短期で実装される可能性が高いＳＩＭＤ幅、例えば１２８または２５６ビットでは、プロセッサは、ベクトルキャリーアウトおよびベクトルキャリーインを把握する必要がある。１０２４ビットの加算は、２５６ビットの実装形態では４サイクルで達成され得る。減算は、下位ベクトル上の下位レーンへのキャリーインと共に、各レーンｉがａｉ−ｂｉを
【数１】
0006694880.tif 000008
として計算する通常の方法で行われることになる。
【００５３】
我々は、多桁加算（ｌｏｎｇ  ａｄｄｉｔｉｏｎ）および減算を達成するための４つの新たな命令を提案する。
１．ＬＯＮＧＡＤＤ  Ｖｄ，Ｖｍ，Ｖｎ
Ｖｄ＝Ｖｍ＋Ｖｎであり、各ＳＩＭＤベクトルを単一の長整数として扱う。この命令はキャリーアウトＣも作り出し、和の上位レーンからのキャリーアウトが存在する場合はＣ＝１であり、さもなければＣ＝０である。
２．ＬＯＮＧＡＤＤＣ  Ｖｄ，Ｖｍ，Ｖｎ
Ｖｄ＝Ｖｍ＋Ｖｎ＋Ｃであり、各ＳＩＭＤベクトルを単一の長整数として扱う。以前に生成されたキャリーアウトＣが和に加算され、新たなキャリーアウトが生成される。
３．ＬＯＮＧＳＵＢ  Ｖｄ，Ｖｍ，Ｖｎ
Ｖｄ＝Ｖｍ−Ｖｎ＝Ｖｍ＋〜Ｖｎ＋１であり、各ＳＩＭＤベクトルを単一の長整数として扱う。この命令はキャリーアウトＣも作り出し、和の上位レーンからのキャリーアウトが存在する場合はＣ＝１であり、さもなければＣ＝０である。
４．ＬＯＮＧＳＵＢＣ  Ｖｄ，Ｖｍ，Ｖｎ
Ｖｄ＝Ｖｍ−Ｖｎ＋Ｃ＝Ｖｍ＋〜Ｖｎ＋１＋Ｃであり、各ＳＩＭＤベクトルを単一の長整数として扱う。以前に生成されたキャリーアウトＣが和に加算され、新たなキャリーアウトが生成される。
【００５４】
実際には、これらの命令は、次のように使用される。２５６ビットのＳＩＭＤ実装形態があり、１０２４ビットのベクトルｘおよびｙを加算したいと想定する。Ｃにおいて、これらのベクトルは次のように宣言される。
ｌｏｎｇ  ｌｏｎｇ  ｘ［１５：０］，ｙ［１５：０］；
ロード／ストアセマンティクスで行き詰まらないように、これらのベクトルが既にレジスタファイル内にあると仮定しよう。すると１０２４ビットの加算および減算は以下のように見える。
／／  Ｖ０はｘ［３：０］を含み、Ｖ１はｘ［７：４］を含み、
／／  Ｖ２はｘ［１１：８］を含み、Ｖ３はｘ［１５：１２］を含む
／／  Ｖ４はｙ［３：０］を含み、Ｖ５はｙ［７：４］を含み、
／／  Ｖ６はｙ［１１：８］を含み、Ｖ７はｙ［１５：１２］を含む
／／  ｘ［１５：０］＋ｙ［１５：０］を出力する多桁加算
／／  （Ｖ１３，Ｖ１２，Ｖ１１，Ｖ１０）において
ＬＯＮＧＡＤＤ  Ｖ１０，Ｖ０，Ｖ４；
ＬＯＮＧＡＤＤＣ  Ｖ１１，Ｖ１，Ｖ５；
ＬＯＮＧＡＤＤＣ  Ｖ１２，Ｖ３，Ｖ６；
ＬＯＮＧＡＤＤＣ  Ｖ１３，Ｖ４，Ｖ７；
／／  ｘ［１５：０］−ｙ［１５：０］を出力する多桁減算
／／  （Ｖ２３，Ｖ２２，Ｖ２１，Ｖ２０）において
ＬＯＮＧＳＵＢ  Ｖ２０，Ｖ０，Ｖ４；
ＬＯＮＧＳＵＢＣ  Ｖ２１，Ｖ１，Ｖ５；
ＬＯＮＧＳＵＢＣ  Ｖ２２，Ｖ３，Ｖ６；
ＬＯＮＧＳＵＢＣ  Ｖ２３，Ｖ４，Ｖ７；
２５６ビットの実装形態を考慮すると、１０２４ビットの加算および減算には、それぞれ４サイクルかかり得る。このような能力は、暗号アプリケーションを含むＦＰ累算以外のことに有用となるであろう。
【００５５】
ＦＰからＨＰＡへの変換、加算、減算
ＨＰＡ数はペア（ｉ，ａ）であり、ｉは、２の補数の長整数であり、ａは、その整数の最小有効ビットの重み（ひいては、その整数のビットのすべての重み）を与えるアンカー値である。ここでの長整数はＳＩＭＤユニットで処理されることになるため、ｉおよびａについてもう少し具体的に説明しよう。２５６ビットのＳＩＭＤユニットがあると想定する。すると、ｉの下位２５６ビットは４つの６４ビット部分、Ｖｉ［３：０］に分けられる。アンカーを４つの部分、Ｖａ［３：０］内に有することも簡便であり、ここで、Ｖａ［０］＝ａであり、ｉ＞０についてはＶａ［ｉ］＝Ｖａ［ｉ−１］＋６４である。ここでは特に何も変更していないが、ＨＰＡ数（ｉ，ａ）の下位２５６ビットが（Ｖｉ，Ｖａ）と表される、より簡便なＳＩＭＤ表現を採用しているだけである。
【００５６】
図３は、ＦＰ数ＦをＨＰＡ数（Ｖｉ，Ｖａ）に加算する効率的な方法を示す。ＳＩＭＤユニットの各レーンは、（Ｖｉ，Ｖａ）のレーン特有値を有し、すなわち、レーンｊは、Ｖｉ［ｊ］およびＶａ［ｊ］を有する。各レーンは、Ｆのコピーも受信する。各レーンは、Ｆの指数をそのアンカー値Ｖａ［ｊ］と比較し、Ｆの仮数部の適切なビットをそのレーンに投入する。レーンのうち多くても２つが、仮数ビットを含むことになる。各レーンは、その６４ビット変換値を独立して計算し、結果として得られる２５６ビット整数は、４つの６４ビットレーン値を含む。その２５６ビット値はその後、場合によりキャリーイン値ｃｉｎと共にＶｉに加算され、その結果が、キャリーアウト値ｃｏｕｔと一緒に（Ｖｉ，Ｖａ）＋Ｆを表す新たな２５６ビット値である。両方の値が同一のアンカーを有するため、これら２つの２５６ビット値を整数として加算することは有意義であることに留意されたい。
【００５７】
１２８ビットのＳＩＭＤユニットがあり、−５０のアンカーを使用して値を変換したいと想定する。これは、１２８ビットｉの最下位ビットが２−５０に対応し、次のビットが２−４９に対応するなどということを意味する（図４参照）。Ｖｉ［０］の上位ビットは２１３に対応し、一方でＶｉ［１］が２１４に対応する場合の下位ビット。そのため、値２１４＋２１３＝２４，５７６を有するＨＰＡ数は、これら２つのビットが設定されていることになる。ｉのビット１２７（Ｖｉ［１］の上位ビット）は、符号ビットである。代替的な実施形態は、ＨＰＡ数のＶｉ部分によって表される値が符号なしである、符号なしＨＰＡ形式を使用してもよい。この場合では、ｉのビット１２７は、値２＾（１２７＋ａ）を有することになり、式中、ａはアンカー値である。
【００５８】
ＨＰＡへのＦＰ変換において、各レーンは、Ｆの真の指数を検査し、その後、それをレーン特有のアンカーと比較する。同じアンカー（−５０）がすべての実施例に使用され、実施例は、図４を参照することによって理解しやすくなるであろう。
【実施例】
【００５９】
例１。ＤＰ数Ｆ＝１．０−ｕｌｐ＝３ｆｅｆ＿ｆｆｆｆ＿ｆｆｆｆ＿ｆｆｆｆをＨＰＡに変換したいと想定する。バイアス付き指数は３ｆｅであり、真の指数は−１であり、仮数部は５３個の１である。上のレーンは、指数が低すぎること（レーンの最小重みが１４であること）を確認し、そのため、そのビットをゼロで満たす。下のレーンは、ビット［６３：５０］をゼロに、そしてビット［４９：０］を１に設定する。３個の１（値２−５１＋２−５２＋２−５３に対応する）が仮数部内に残っているが、それらの重みがアンカー値−５０未満であるため、これらは変換から除外される。代替的な実装形態は、この変換値を丸める場合があるが、ここでは切り捨てを仮定しよう。
【００６０】
例２。Ｆ＝２２０−ｕｌｐ＝４１２ｆ＿ｆｆｆｆ＿ｆｆｆｆ＿ｆｆｆｆ。真の指数は１９であり、そのためビット［１２７：７０］はゼロであり、［６９：１７］は１であり、［１６：０］はゼロである。この数はぴったり収まるため、丸めは無関係である。各レーンは依然として、独立してそれ自体の６４ビットを処理することに留意されたい。
【００６１】
例３。Ｆ＝−２２０＝ｃ１３０＿００００＿００００＿００００。真の指数は２０であるが、ここでは符号に対処しなければならない。１つの方法は、正数について行ったように変換を行うが、各レーンで計算する値の１の補数を返し、その後１２８ビット値に１を加算することである。この場合では、ビット７０は、１の補数の前の１セットビットであり、つまりそれは、１の補数の後の１ゼロビットである。１２８ビット値に１を加算すると、１に設定されたビット［１２７：７０］、およびゼロに設定されたビット［６９：０］が与えられる。
【００６２】
例４。Ｆ＝２８０＝４４ｆ０＿００００＿００００＿００００。真の指数は８０であるが、ここでの最大重みは７６であり、そのためオーバーフローフラグを設定する。この場合では、ゼロ、またはことによると上位レーン内の最大値および他の場所のゼロを返すことを提案する（下位レーンはオーバーフローのことを知らないため、整数変換の例に従い最大整数を返すことができない）。これは深刻なエラーであり、そのため結果はいずれの場合も無意味になるであろう。
【００６３】
例５。Ｆ＝無限大またはＮａＮ。ゼロを返し、ＯＦＣ（無限大）またはＩＯＣ（ＮａＮ）を設定する。
【００６４】
各レーンは、同じ方法で変換を行う。１つの方法は、レーンの６４ビットのちょうど右に仮数部を位置付け、その後、値ｌｓｈｉｆｔ＝ｅ−ｂｉａｓ−Ｖａ［ｉ］＋１によって仮数部を左にシフトすることである。ｅ’−ｂｉａｓが真の指数ｅであり、ｌｓｈｉｆｔ値が負またはゼロである場合は、シフティングが行われないことに留意されたい。
【００６５】
概念上、シフタへの入力は、６４個のゼロとその後の仮数部から成る６４＋５３＝１１７ビット値である（実際には、６４個のゼロは入力上必要とされない）。シフタの出力は、レーンの６４ビット値である。有意義なシフト距離（すなわち、仮数ビットをレーン内に出力することができるシフト距離）は、１から６４＋５２＝１１６の範囲である。この範囲外のＬｓｈｉｆｔ値は、常にゼロを返すことになるため、いかなるシフティングも必要としない。
【００６６】
実施例１では、ｅ＝−１であるため、上位レーンはｌｓｈｉｆｔ［１］＝−１−１４＋１＝−１４を有し（負であるためシフトはなく、レーンはすべてゼロを含む）、下位レーンはｌｓｈｉｆｔ［０］＝−１−（−５０）＋１＝５０を有し、そのためこのレーンの下位の５０ビットは仮数部の上位５０ビットを含む。
【００６７】
実施例２では、ｅ＝１９であるため、ｌｓｈｉｆｔ［１］＝１９−１４＋１＝６（仮数部の上位６ビットがシフトインされる）であり、ｌｓｈｉｆｔ［０］＝１９−（−５０）＋１＝７０である。仮数部の上位６ビットは、レーン０の６４ビットを超えてシフトされるため、そのレーンに関しては破棄されることに留意されたい。
【００６８】
実施例３では、ｅ＝２０であるため、ｌｓｈｉｆｔ［１］＝７であり、ｌｓｈｉｆｔ［０］＝７１である。入力が負であるため、各レーンは、そのシフトした値の１の補数（および範囲外シフトについてはすべて１）を返す。１２８ビット加算器へのキャリーインは、変換または加算（ＨＰＡ＋ＦＰ）のための２の補数動作を完了するように設定される。減算（ＨＰＡ−ＦＰ）については、変換はＦＰ数を正として扱い、動作を加算に変更するべきである。
【００６９】
我々は、ＤＰ数のための３つの新たな命令を提案する。
１．ＡＤＤＯ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
オーバーフローを伴う加算：Ｖａのアンカー値を使用してＦをＨＰＡに変換し、その後Ｖｉに加算する。Ｆのビットが、Ｖｉにおける最大重みビットより大きい場合、または和が（整数）オーバーフローを引き起こす場合、オーバーフローフラグを設定する。この実施例では、Ｖｉの上位レーンのみがオーバーフローフラグを設定することができるため、実装形態は、そのレーンを下位レーンから区別することに留意されたい。
２．ＳＵＢＯ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
オーバーフローを伴う減算：Ｖａのアンカー値を使用してＦをＨＰＡに変換し、その後Ｖｉから減算する。Ｆのビットが、Ｖｉにおける最大重みビットより大きい場合、または差が（整数）オーバーフローを引き起こす場合、オーバーフローフラグを設定する。かさねて、この実施例では、Ｖｉの上位レーンのみがオーバーフローフラグを設定することができるため、実装形態は、そのレーンを下位レーンから区別することに留意されたい。
３．ＣＶＴＯ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
オーバーフローを伴う変換：Ｖａのアンカー値を使用してＦをＨＰＡに変換する。Ｆのビットが、Ｖｉにおける最大重みビットより大きい場合、オーバーフローフラグを設定する。かさねて、この実施例では、Ｖｉの上位レーンのみがオーバーフローフラグを設定することができるため、実装形態は、そのレーンを下位レーンから区別することに留意されたい。
【００７０】
少なくともいくつかの実施形態例において、これらの動作は、ベクトル長がＳＩＭＤ実装形態に収まれば２つの完全パイプライン化サイクルで行うことができることに留意されたい。
【００７１】
ＳＩＭＤ実装形態よりも広いベクトルでは、変換および加算は、下位部分から上位部分へと、ばらばらに行われる。上述の多桁加算および減算命令でまさにそうであったように、より上位の部分は、より下位の部分によって生成されたキャリーフラグに対処し、そのため、それを行うバージョンの命令も存在する。
１．ＡＤＤＣＯ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
キャリーおよびオーバーフローを伴う加算：Ｖａのアンカー値を使用してＦをＨＰＡに変換し、その後Ｖｉに加算する。キャリーフラグが高である場合、ＨＰＡ数の整数部に１を加算する。Ｆのビットが、Ｖｉにおける最大重みビットより大きい場合、または和が（整数）オーバーフローを引き起こす場合、オーバーフローフラグを設定する。
２．ＳＵＢＣＯ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
キャリーおよびオーバーフローを伴う減算：Ｖａのアンカー値を使用してＦをＨＰＡに変換し、その後Ｖｉから減算する。キャリーフラグが高である場合、ＨＰＡ数の整数部に１を加算する。Ｆのビットが、Ｖｉにおける最大重みビットより大きい場合、または差が（整数）オーバーフローを引き起こす場合、オーバーフローフラグを設定する。
３．ＣＶＴＣＯ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
キャリーおよびオーバーフローを伴う変換：Ｖａのアンカー値を使用してＦをＨＰＡに変換する。キャリーフラグが高である場合、ＨＰＡ数の整数部に１を加算する。Ｆのビットが、Ｖｉにおける最大重みビットより大きい場合、オーバーフローフラグを設定する。
【００７２】
動作の下位部分がオーバーフローフラグを設定しないように、オーバーフローしないバージョンの命令も存在する。
【００７３】
１．ＡＤＤ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
２．ＳＵＢ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
３．ＣＶＴ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
４．ＡＤＤＣ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
５．ＳＵＢＣ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
６．ＣＶＴＣ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｆ
ＳＰ数について、類似した命令が存在する。
【００７４】
変換命令は厳密には必要でないが、それは、それらがＨＰＡ数の整数部がすべてゼロである加算命令と同等であるからである。
【００７５】
ＨＰＡ数が１２８ビットのベクトルとして実装されると想定する。以下の実施例は、これらの命令がどのように使用され得るかを示す。
【００７６】
例６。ＨＰＡ数は、１２８ビット値に収まる。すると、ＨＰＡ数（Ｖ０，Ｖ１０）へのＤＰ数Ｄ０の加算は単純に、以下の通りである。
ＡＤＤＯ＿ＨＰＡ＿ＤＰ  Ｖ０，Ｖ１０，Ｄ０
より上位の項が存在しないため、キャリーは必要とされないが、オーバーフロー検出は重要である。
【００７７】
例７。ＨＰＡ数は２５６ビット幅であるが、ハードウェアは一度に１２８ビットを処理する。ＨＰＡ数は、下位部分（Ｖ０，Ｖ１０）と上位部分（Ｖ１，Ｖ１１）とに分割される。ＤＰ数Ｄ０の加算は、今度は以下の通りである。
ＡＤＤ＿ＨＰＡ＿ＤＰ  Ｖ０，Ｖ１０，Ｄ０
ＡＤＤＣＯ＿ＨＰＡ＿ＤＰ  Ｖ１，Ｖ１１，Ｄ０
両方の命令が、同じＤＰ数Ｄ０を受け取ることに留意されたい。このことが必要なのは、Ｄ０の仮数部のビットがどこに存在するのか、（Ｖ０，Ｖ１０）内なのか、（Ｖ１，Ｖ１１）内なのか、または両方のベクトルにわたって広がっているのかが、我々には分からないからである。下位ビットから出るオーバーフローは問題にならないため、下位部分はオーバーフロー検出なしで加算される。上位部分は、下位部分からのキャリーを処理しなければならず、上位ビットから出るオーバーフローは常に問題となることからオーバーフローも検出する。
【００７８】
例８。ＨＰＡ数は３８４ビット幅であるが、ハードウェアは一度に１２８ビットを処理する。ＨＰＡ数は、下位部分（Ｖ０，Ｖ１０）と、中間部分（Ｖ１，Ｖ１１）と、上位部分（Ｖ２，Ｖ１２）とに分割される。
【００７９】
ＡＤＤ＿ＨＰＡ＿ＤＰ  Ｖ０，Ｖ１０，Ｄ０
ＡＤＤＣ＿ＨＰＡ＿ＤＰ  Ｖ１，Ｖ１１，Ｄ０
ＡＤＤＣＯ＿ＨＰＡ＿ＤＰ  Ｖ２，Ｖ１２，Ｄ０
実施例に概説されたものと同じ理由で、３つすべての命令が同じＤＰ数Ｄ０を受け取ることに留意されたい。下位部分および中間部分から出るオーバーフローは問題にならないため、これらの部分両方がオーバーフロー検出なしで加算される。中間部分は、下位部分のキャリーアウトに対処する必要がある。上位部分は、中間部分からのキャリーを処理しなければならず、上位ビットから出るオーバーフローは常に問題となることからオーバーフローも検出する。
【００８０】
例９。ＨＰＡ数は、１２８ビット値に収まる。すると、ＨＰＡ数（Ｖ０，Ｖ１０）からのＤＰ数Ｄ０の減算は単純に、以下の通りである。
ＳＵＢＯ＿ＨＰＡ＿ＤＰ  Ｖ０，Ｖ１０，Ｄ０
より上位の項が存在しないため、キャリーは必要とされないが、オーバーフロー検出は重要である。減算は、Ｄ０が変換された１２８ビット項を反転し、その後１を加算する、通常の方法で行われる。
【００８１】
例１０。ＨＰＡ数は３８４ビット幅であるが、ハードウェアは一度に１２８ビットを処理する。ＨＰＡ数は、下位部分（Ｖ０，Ｖ１０）と、中間部分（Ｖ１，Ｖ１１）と、上位部分（Ｖ２，Ｖ１２）とに分割される。
【００８２】
ＳＵＢ＿ＨＰＡ＿ＤＰ  Ｖ０，Ｖ１０，Ｄ０
ＳＵＢＣ＿ＨＰＡ＿ＤＰ  Ｖ１，Ｖ１１，Ｄ０
ＳＵＢＣＯ＿ＨＰＡ＿ＤＰ  Ｖ２，Ｖ１２，Ｄ０
実施例に概説されたものと同じ理由で、３つすべての命令が同じＤＰ数Ｄ０を受け取ることに留意されたい。この実施例では、すべての場合において、減算される数は反転され（１の補数）、しかし２の補数動作を完了するためのキャリーインは、この実施例では、下位命令であるＳＵＢ＿ＨＰＡ＿ＤＰのためにしか生成されない。２の補数動作を完了するためのキャリーインは、この実施例では、非キャリーバージョンの減算動作、ＳＵＢ＿ＨＰＡ＿ＤＰおよびＳＵＢＯ＿ＨＰＡ＿ＤＰのためにしか設定されない。この時点で、命令は、まさに実施例３の加算のように進行する。
【００８３】
ＨＰＡからＦＰへの変換
上記のように、ＨＰＡ数（ｉ，ａ）はベクトル表現（Ｖｉ，Ｖａ）も有するものと見なし、ここで、Ｖｉは６４ビット整数のベクトルであり、Ｖａは、重みＶａ［０］＝ａおよびｉ＞０についてはＶａ［ｉ］＝Ｖａ［ｉ−１］＋６４のベクトルである。ＦＰに変換するためには、Ｖｉの符号を記録し、Ｖｉにおける第１の非符号ビットを見出し、それと形式により指定される数の後続ビット（ＤＰでは５２、ＳＰでは２３）とから仮数部を構築し、仮数部を丸め、第１のビットの場所および対応する重みから適切な指数を構築する必要がある。
【００８４】
簡略化のために、（ｉ，ａ）をＤＰ（５３ビット仮数部）に変換していると仮定しよう。より詳細には、変換ステップは以下の通りである。
１．符号ビットは、ｉの上位ビットである。それが設定されている場合、ＨＰＡ数は負であり、それが正数になるように符号反転される。これを行う方法の１つは、ＨＰＡ数の整数部をゼロから減算することである。元々の符号はＦＰ数の構築に必要とされるために記憶されるが、この変換の残りでは、変換されている値は非負であると仮定される。
２．上位レーンから開始して、各レーンは、先行ゼロカウント（ｃｏｕｎｔ  ｌｅａｄｉｎｇ  ｚｅｒｏ）動作（ＣＬＺ）を行って、レーン内の最初の１の前のゼロの数を判定する。この数、すなわち先行ゼロ数（ＬＺＣ）は、１が存在する場合は０〜６３の範囲である。１が見出されれば、レーンは、そのビット位置から開始してｋ＝ｍｉｎ（６４−ＬＺＣ，５３）ビットの仮数部を返し、６４−ＬＺＣ＞５３である場合、仮数部の右側の次のビット（Ｇ）を返し、６４−ＬＺＣ＞５４である場合、Ｇの右側のすべてのビット（Ｓ）の論理ＯＲを返す。レーンｊからのこの情報のすべてが、レーンｊ−１の上位ビットから取るべき仮数部のビット数である計数５３−ｋと共に、次のレーンｊ−１に渡される。図５は、様々なＬＺＣの２つの隣接するレーンから仮数部がどのように構築されるかを示す。最初の１がレーンｊで見出された場合、そのレーンのアンカーを使用して、（バイアスなしの）指数：e=Va[j]+63-LZCを計算する。
３．符号、指数、仮数部、Ｇ、およびＳは、下位レーンに達するまで右側に動かされる。各中間レーン（下位レーンを含む）は、そのビットのすべての論理ＯＲを用いてＳを更新する。下位レーンは、ＤＰ数を構築し、何であれ指定された丸めモードに従ってそれを丸める。
【００８５】
ＨＰＡからＦＰへの変換は、ＦＰからＨＰＡよりもわずかに遅い。記載のように実装された場合、１２８ビットのＨＰＡ数は、ＦＰ出力を構築するのに３サイクル（ＨＰＡ数を正にするために１サイクル、上位レーンを処理するために１サイクル、そして下位レーンを処理し丸められた結果をもたらすために１サイクル）を要することになる。累算毎にそのような変換が１つ存在するため、このことが問題になる可能性は低い。より大きな実装形態、例えば２５６または５１２ビットのベクトルでは、ＬＺＣおよびレーン結果がレーン毎にすべて同時に計算され、個別のレーン結果が二進方式で組み合わせられる、より並列な手法の使用が望まれ得る。
【００８６】
積和
上述の構築物は、積和を処理するように拡張することができる。丸められた積を加算したい場合は何の変更も必要なく、任意の他のＦＰ数と同様にただ乗算し、その後その積を加算するだけである。丸められていない完全長の積を累算するには、新たな命令が必要になる。
１．ＭＡＤＤ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｄｎ，Ｄｋ。乗算−累算：丸めなしでＤｎ＊Ｄｋを計算し（すなわち、完全な１０６ビットの仮数部積を保持し）、その後、Ｖａのアンカー値を使用してその積をＨＰＡに変換し、その後、変換された積をＶｉに加算する。
２．ＭＡＤＤＯ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｄｎ，Ｄｋ。ＭＡＤＤ＿ＨＰＡ＿ＤＰと同じだが、変換または加算がオーバーフロー（この実施例では上位レーンのみ）を引き起こした場合、オーバーフローフラグを設定する。
３．ＭＡＤＤＣ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｄｎ，Ｄｋ。ＭＡＤＤ＿ＨＰＡ＿ＤＰと同じだが、キャリーに応答もする。
４．ＭＡＤＤＣＯ＿ＨＰＡ＿ＤＰ  Ｖｉ，Ｖａ，Ｄｎ，Ｄｋ。ＭＡＤＤ＿ＨＰＡ＿ＤＰと同じだが、キャリーに応答もし、変換または加算がオーバーフロー（この実施例では上位レーンのみ）を引き起こした場合、オーバーフローフラグを設定する。
【００８７】
少なくともいくつかの実施形態例において、これらの命令は、５サイクル（乗算に３サイクル、ＨＰＡへの変換に１サイクル、そしてＨＰＡ加算に１サイクル）を要することになると予測される。変換は上に示したものと本質的に同じだが、３つの６４ビットレーンに及び得る、より幅広の仮数部を用いる。単一のＤＰ数を各レーンにブロードキャストする代わりに、倍長のＤＰ積が各レーンにブロードキャストされる。
【００８８】
乗算・ＨＰＡ変換命令は単に、Ｖｉ＝０のＭＡＤＤ命令である。当然ながら、ＳＰの変種、また場合により乗算−減算の変種が存在するであろう。
【００８９】
これらの命令は依然として完全にパイプライン化されており、各サイクルで発行され得るため、ＨＰＡ数がハードウェア長レジスタ内に収まる場合、ｎ個の積の和はｎ＋４サイクルを要することになる。
【００９０】
高正確度入力、およびスカラー値によるＨＰＡ数の乗算
多項式近似、またはテイラー級数、または初等関数のための範囲縮小など、高い内部正確度を必要とするある特定のアプリケーションでは、ＦＰ入力で表現することができるＨＰＡ数により高い正確度を含めることが有用であり得る。例えば、定数１／ｐｉを１２８ビット以上の正確度で表現することが望まれる場合がある。これは、所望の値を計算し、それを（６４ビットのベクトル部分における）長整数として、正しいアンカーと一緒に記憶することによって、容易に達成される。結果として得られるＨＰＡ数は、いずれの他のものとも同様に使用することができる。
【００９１】
ＨＰＡ数（ｉ，ａ）にＦＰ数ｆを乗算することが望まれる場合がある。ｆが仮数部ｓと真の指数ｅとを有する場合、その結果はＨＰＡ数（ｉ＊ｓ，ａ＋ｅ）である。（ｉ，ａ）がベクトル（Ｖｉ，Ｖａ）によって表現される場合、これを行う方法の１つは、上位および下位部分を有するスカラー乗算によるベクトルを用いるものである。
ＭＵＬ＿ＶＥＣ＿ＳＣＡＬＡＲ＿ｌｏｗ  Ｖｄ，Ｖｉ，ｓ
は、Ｖｉの６４ビットコンポーネントのそれぞれにスカラー６４ビットｓを乗算し、各レーンが、Ｖｄの対応する部分内にある積の下位６４ビットを返す。
ＭＵＬ＿ＶＥＣ＿ＳＣＡＬＡＲ＿ｈｉｇｈ  Ｖｄ，Ｖｉ，ｓ
は、Ｖｉの６４ビットコンポーネントのそれぞれにスカラー６４ビットｓを乗算し、各レーンが、Ｖｄの対応する部分内にある積の上位６４ビットを返す。
【００９２】
上位部分はその後、下位部分に加算され得るようにシフトされる。アンカーは、ａおよびｅを加算する別々の命令、またはＶａ内のエントリのそれぞれにｅを加算するスカラー加算によるベクトルによって調整され得る。
【００９３】
積（ｉ＊ｓ，ａ＋ｅ）は、元々の（ｉ，ａ）よりも多くのビットを整数部内に有するため、元々の正確度に再変換し、結果アンカーを調整する命令を有することが有用であり得る。
【００９４】
アプリケーション
この節では、サンプルアプリケーションを使用して、いくつかの実施形態例におけるＨＰＡの性能およびエネルギー利益の一部を示す。
【００９５】
アプリケーション１。ＨＰＡを使用してｎ個のＦＰ項目を加算する（ここで、ＨＰＡ数はハードウェアサイズに収まる（例えば、１２８ビットＳＩＭＤ上の１２８ビットＨＰＡ））。変換・加算命令は２サイクルの待ち時間を有し、１サイクル当たり１つのＨＰＡ加算のスループットで完全パイプライン化されている。図６は、ＨＰＡ数（Ｖｉ，Ｖａ）への４つのＦＰ数の加算を示す。命令は上から下に進み、サイクルは左から右に読み取られ、したがってサイクル１では、第１の加算命令がＦＰ−ＨＰＡ変換（表中Ｃ）を行っており、サイクル２では、第１の加算命令からの変換値が加算され（表中Ａ）、同時に第２の加算命令がそのＦＰ−ＨＰＡ変換（Ｃ）を行っている。
【００９６】
概して、演算が結合的かつ（プログラマによって指定される正確度まで）正しいため、ｎ個の値は、ｎ＋１のサイクルで加算することができる。対照的に、Ｃ規則に従って行われる通常のＦＰ加算は、ａ×ｎのサイクル（ここでａはＦＰ加算の待ち時間である）、つまりＡＲＭの最速のＦＰＵ上で３ｎのサイクルを要することになる。これすら、ＨＰＡの利点を控えめに述べるものである。ＡＲＭの「大型」コアは２つの１２８ビットＳＩＭＤ整数パイプラインを有し、ＨＰＡ加算が結合的であることから、容易に２つの累算器を使用し、ｎ個のＦＰ数を約ｎ／２のサイクルで累算し、その後２つの累算器の値を加算して最終和を得ることができる。これは、ＡＲＭコア上でのＨＰＡ累算が、同じコア上でのＦＰ累算よりも６倍素早くなり得ることを意味する。
【００９７】
アプリケーション２。ＨＰＡを使用してｎ個のＦＰ項目を加算する（ここで、ＨＰＡ数はＳＩＭＤハードウェアサイズよりも幅広である（例えば、１２８ビットＳＩＭＤ上の２５６ビットＨＰＡ））。変換・加算命令は依然として同じ待ち時間を有するが、各ＨＰＡ値につき２つの変換および加算が必要である。図７は、ＨＰＡ数（Ｖｉ，Ｖａ）への２つのＦＰ数の加算を示す。ＶｉおよびＶａは、上位および下位部分に分けられ、各ＦＰ数はまず下位部分に加算され、その後、より下位の部分のキャリーアウトと共に上位部分に加算される。
【００９８】
ｎ個の項目をこの方法で加算するには、２ｎ＋１のサイクルを要するが、それでもＦＰ累算より素早い。アプリケーション１で示したように、第２のＳＩＭＤユニットを使用することにより、この待ち時間を半減させることもできる。
【００９９】
アプリケーション３。ＦＰ  ＡＭＲコーデック。このコーデックは、その処理時間の大部分を、ＤＰを使用して４０個のＳＰ積を加算しＳＰに再変換する単純なサブルーチンＤｏｔｐｒｏｄｕｃｔ４０に費やす。このサブルーチンは当然、切り捨て誤差がＳＰにおいて問題含みであったため、累算にＤＰを使用する。ＡＲＭの最速ＦＰＵ上では、このルーチンは最低１２６サイクル（４０のＳＰ乗算、４０のＳＰ−ＤＰ変換、３９のＤＰ加算、加えて１のＳＰへの再変換）を要するであろう。Ｃ順序付け規則のため、ＤＰ加算単独で３９×３＝１１７サイクルを要する。ＨＰＡを使用して同じことを行えば、Ｄｏｔｐｒｏｄｕｃｔ４０は、１つのＳＩＭＤユニット上で４７サイクル（４０のＨＰＡ乗算−加算、および１のＨＰＡ−ＳＰ変換）において行われ得る。アプリケーション１で示したように、第２のＳＩＭＤユニットを使用することにより、この待ち時間を半減させることもできる。より素早いことに加えて、ＨＰＡソリューションは、大幅に少ない制御論理を使用し（命令の約１／３、多数のフェッチ、デコード、発行、およびリタイアリソースを節約する）、そのため、大幅に少ない電力を要すると考えられる。大幅に少ないエネルギーを要するのは確かであろう。
【０１００】
アプリケーション４。密行列乗算、最も単純なアルゴリズム。これは、すべての行にすべての列を掛けた一連のドット積である。ＨＰＡ乗算−加算は、いかなる数のプロセッサ上でも再現可能な（そして正しい）方法でこれを行うことができる。高速化は、単一のプロセッサで３または６倍となり得、並列処理を使用する能力のおかげではるかに大規模な高速化が可能である。
【０１０１】
例外
ＨＰＡの範囲縮小のため、範囲外の数が生じる可能性が大幅に高い。プログラマが正しい境界を確立することができるようなツールおよび手段を提供する必要があるが、特に、境界が侵害されたときに情報を提供する必要がある。我々は、アンダーフロー（ｕｎｄｅｒｆｌｏｗ）、不正確（ｉｎｅｘａｃｔ）、およびオーバーフロー例外（ｏｖｅｒｆｌｏｗ  ｅｘｃｅｐｔｉｏｎ）（ＦＰにより使用される例外と同じ例外、さもなければ新たなＨＰＡ特有の例外のいずれか）を使用して境界問題を示すことを提案する。
【０１０２】
２５６ビットＨＰＡ数（ｉ，ａ）があると想定する。下位側にａ、そして上位側にａ＋２５４の、２つの境界が存在する。重みが２ａ未満のビットを有するあらゆるＦＰ数は、変換時に何らかの情報を失うことになる。プログラマは重みａを選ぶことによって２ａ未満の値が重要でないことを示しているので、これは通常問題にならない。そうは言っても、ビットが失われた事実にフラグを立てる必要がまだある。これを行う方法の１つは、ＨＰＡへの変換が下位側のいくつかのビットを破棄するときに不正確フラグを、そしてＦＰ入力全体が破棄されるときにアンダーフローフラグを設定することである。この実施例では、これらの計算は、その非桁上げ命令（ｎｏｎ−ｃａｒｒｙｉｎｇ  ｉｎｓｔｒｕｃｔｉｏｎｓ）については下位レーンにしか適用されないため、実装形態は、そのレーンを区別することができるはずである。
【０１０３】
２ａ＋２５４よりも大きなマグニチュードを有する数の変換は、オーバーフロー例外を設定し、これは常に、プログラムが異なるアンカーを使用して再計算することを要する深刻な問題である。同じ例外が整数加算器におけるオーバーフローに対して起こり、この場合もやはり、解決策は異なるアンカーを使用して再計算することである。ＨＰＡプログラムは、プログラムの結果が有意義であるかどうかを確認するためにオーバーフローフラグを調べる必要がある。
【０１０４】
ほとんどの累算は、ＦＰ数の範囲のごく一部を使用するため、それらは、ＨＰＡ数を使用してより素早くかつ正しく計算することができる。ＨＰＡ累算は、再現可能かつ並列化可能であり、データ境界を割り出した後は、プログラマにとってＦＰよりさほど難しくない。当然ながら、ＦＰの結合性の欠如が問題を引き起こす場合では、ＨＰＡはプログラマにとって大幅に容易である。ＦＰが不良な結果をもたらす状況を分析するために訓練されている人々は非常に少ない。ありがちな応答の１つは、より幅広いＦＰ形式を使用して再符号化することであるが、このことは、ＤＰより大きなものすべてに対して不良な成果を有する。ＨＰＡの使用は、より良好な成果をもたらし、切り捨て問題のうち最も有害なものを排除する。
【０１０５】
ＨＰＡはまた、実装が簡単であり、ＡＲＭのＳＩＭＤユニットに適度な変更を要する。これらの変更はＳＩＭＤユニット自体に面積および電力を少しだけ追加するが、コアレベルでは電力そして特にエネルギーは大幅に低くなる。実行ユニットは、アウトオブオーダーマシン（ｏｕｔ−ｏｆ−ｏｒｄｅｒ  ｍａｃｈｉｎｅ）においてエネルギーが主に費やされる場所ではなく、累算の高速化により、エネルギーが費やされている場所で制御論理を停止することが可能になる。
【０１０６】
図８は、プログラム命令の制御下でデータ処理動作を実行するためのデータ処理装置２を概略的に例示する。データ処理装置２は、プログラム命令６と操作されるデータ８とを記憶するメモリ４を備える。プロセッサコア１０は、メモリ４に連結されており、レジスタバンク１２、処理回路１４、命令フェッチユニット１６、命令パイプラインユニット１８、および命令デコーダ２０を含む。実際にはデータ処理システム２は多くの付加的な要素を含み得ること、また図８の表現は理解を助けるために簡略化されていることは理解されるであろう。動作中、プログラム命令６は、命令フェッチユニット１６によってメモリ４からフェッチされ、命令パイプライン１８に供給される。プログラム命令が命令パイプライン１８内の適切な段階に達すると、それらは命令デコーダ２０によってデコードされ、デコードされたプログラム命令によって指定される処理動作（複数可）を実行するようにレジスタバンク１２および処理回路１４の動作を制御するよう機能する制御信号を生成する。複数の入力オペランドがレジスタバンク１２から読み取られ、処理回路１４に供給されてもよく、ここでそれらは操作され、その後、結果値がレジスタバンク１２に書き戻される。
【０１０７】
レジスタバンク１２は、多様な異なる形態を有することができる。操作されるオペランドとしては、例えば、浮動小数点オペランド、固定小数点オペランド、整数オペランド、およびＨＰＡ数オペランド（後述される）を挙げることができる。レジスタバンク１２は、レジスタバンク１２の構成に応じて、これらの種類の混合型のオペランドを記憶するように機能してもよい。オペランドは、それらの形式によって予め定義され得るように、またはＨＰＡ数オペランドに関連して後述されるようにレジスタに関連付けられたメタデータを使用してプログラム可能に指定され得るように、異なるレベルの精度を有し得る。
【０１０８】
図９は、浮動小数点オペランドを概略的に例示する。浮動小数点オペランドは通常、符号、指数、および仮数部から形成される。浮動小数点オペランドは、それらの指数値によって指示される多種多様なマグニチュードを有する値を表現することができる。数が表現され得る精度は、仮数部のサイズによって限定される。浮動小数点動作は典型的に、整数演算よりも複雑であり、実装が遅い。
【０１０９】
図９はまた、６４ビットの整数オペランドを例示する。このような整数オペランドは、符号なし整数では０〜（２６４−１）、または符号付き整数では−２６３〜２６３−１の範囲内の数を表現することができる。整数演算は典型的に迅速であり、実行に比較的少ないエネルギーを消費するが、比較的限定された範囲の値をもつ数が、浮動小数点値により表現され得る数の範囲と比較して指定される場合があるという不利点を有する。
【０１１０】
図９はまた、それぞれ６４ビット整数を含む複数コンポーネント（この実施例では３つ）のベクトルを含むＨＰＡ数を例示する。ＨＰＡ数は、それに関連付けられたメタデータを有する。メタデータは、ＨＰＡ数の一部を形成するコンポーネントのビットのプログラム可能な有効度を示すアンカー値を含む。アンカー値（複数可）は、ビット有効度の下方境界およびビット有効度の上方境界を、直接的または間接的に指定する。以下で使用するメタデータという用語は、ＨＰＡ数のビット有効度を指定するアンカー値（複数可）を含むデータに対応するものと見なすことができる。異なるコンポーネントが一緒に、ビット有効度のこの範囲に隣接して広がるビット値を指定する。ビット有効度の下方境界およびビット有効度の上方境界の位置に応じて、ビット有効度の範囲は、二進小数点位置を含み得る。二進小数点位置が、特定のＨＰＡ値について指定されたビット有効度の範囲外に位置し得る可能性もある。
【０１１１】
アンカー値（複数可）は、ある浮動小数点値（例えば倍精度ＦＰ値）によって表現され得る最小の有効度に対応するビット有効度の下方境界から、その浮動小数点値によって表現され得る最高のビット有効度に対応するビット有効度の上方境界まで及ぶ、ある範囲のビット有効度を表現することができるように提供されてもよい。
【０１１２】
ＨＰＡ数を形成するコンポーネントの数は、異なる実装形態間で様々であり得る。コンポーネントのサイズは、一部の実施形態では固定されていてもよいが、他の実施形態では異なってもよい。範囲ビット有効度の全体幅は、一部の実施形態では、固定されたコンポーネントサイズのユニットで変化するように制約され得る（例えば６４ビットコンポーネントでは、ビット有効度の範囲は、例えば６４、１２８、１９２、２５６、…の幅を有し得る）。ビット有効度の範囲の幅が１ビット幅のステップで連続的に変動し得る可能性もある。
【０１１３】
前述のように、（メタデータ内の）アンカー値（複数可）は、プログラム可能なビット有効度を多様な異なる方法で指定し得る。一例は、各ベクトルコンポーネントの下方境界ビット有効度を指定することである。したがって、各ベクトルコンポーネントは、そのコンポーネント内の最下位ビットの有効度を表す（アンカリングする）メタデータと一緒に、ビット有効度の全体範囲内にあるその有効ビットの部分を表す整数値を含み得る。別の選択肢は、アンカー値（複数可）が、ビット有効度の範囲の全幅と一緒にＨＰＡ数全体のビット有効度の下方境界を指定することである。さらなる選択肢は、アンカー値（複数可）が、ビット有効度の範囲の下方境界および上方境界を指定するデータを含み得ることである。固定幅コンポーネントであることが既知であるコンポーネントの数と一緒にビット有効度の範囲の下方境界を含むアンカー値（複数可）といった、なおもさらなるバリエーションも可能である。
【０１１４】
図１０は、倍精度浮動小数点により表現可能な値のサイズとＨＰＡ数の有効度範囲との間の関係を概略的に例示する。倍精度浮動小数点数の場合では、指定され得るビット値のサイズは、およそ２−１０２２〜２＋１０２３に及ぶ（非正規数は計数していない）。２０を表す二進値は、この範囲のおよそ中間に位置する。
【０１１５】
例示されるように、ＨＰＡ数は、浮動小数点値を使用して表現可能なビット有効度の範囲内のビット有効度の枠（ｗｉｎｄｏｗ）として見なされ得る、プログラム可能なビット有効度範囲を有する。このプログラム可能なビット有効度は、下方境界および上方境界によって指定され得、下方境界と上方境界との値に応じて、浮動小数点値により提供されるビット有効度の範囲に沿ってスライドすると見なされ得る。枠の幅、ならびにその始点および終点は、ビット有効度を指定する（アンカー値（複数可）を含む）プログラム可能なメタデータの適切な値によって指定され得る。したがって、ＨＰＡ数は、実行される計算に適合するようにプログラマによって選択される形態を有し得る。
【０１１６】
図１１は、図１の処理回路１４の一部を形成し得る回路２２を概略的に例示する。回路２２は整合回路２４、２６を含み、これらは、結果レジスタ２８に対して指定され、結果レジスタ２８に関連付けられた（アンカー値（複数可）を記憶する）メタデータ記憶装置３０内に記憶された、プログラム可能な有効度値に従って、入力オペランドに対して整合動作を実行するように機能する。入力オペランドは、浮動小数点数、固定小数点数、整数値、ＨＰＡ数、またはこれらの混合物であり得、それらの整数ビットの値が、結果レジスタ２８内に記憶されるべき結果値が決定される前に結果レジスタ２８に対して指定されたビット有効度と整合されるように、整合される。整合回路２４、２６は、演算回路３２に供給される、整合された入力オペランドを生成する。演算回路３２は、例えば、整数加算器または整数乗算器であり得、これは、整合された入力オペランドを整数値として扱い、それに従って、比較的高速かつ低エネルギーの演算動作をこれらの整合された入力オペランドに対して実行する。演算回路３２によって生成された結果値は、結果レジスタ２８のプログラム可能な有効度に既に整合されており、結果レジスタ２８内にＨＰＡ数として記憶される。
【０１１７】
整合回路２４、２６に供給される入力オペランドのうちの１つ以上が浮動小数点値である場合には、整合回路２４、２６は、結果レジスタ２８に対して指定されたビット有効度と一致するように浮動小数点値の仮数部がどのように整合されるべきかを判断する際に、浮動小数点値の指数値にも応答する。
【０１１８】
メタデータ記憶素子３０内に記憶されたプログラム可能なビット有効度パラメータ（アンカー値（複数可））は、演算回路３２によって生成される整合された結果値とは独立しているため、ＨＰＡ数の正規化が実行されないことは理解されるであろう。したがって、以後説明するように、ＨＰＡ数に実行される処理に関連して、オーバーフロー、アンダーフロー、および他の例外条件が可能である。
【０１１９】
図１１の例において、プログラム可能な有効度パラメータ（アンカー値（複数可））は、処理が実行される前にメタデータ記憶素子３０内に記憶される。他の実施形態では、結果レジスタ２８のプログラム可能な有効度パラメータは、入力オペランドのうちの１つ以上がＨＰＡオペランドである場合、それらと関連付けられたプログラム可能な有効度パラメータから取られ得る（例えば、ＨＰＡ入力オペランドのいずれかのプログラム可能な有効度パラメータのうち最大のものが取られ、結果レジスタ２８のプログラム可能な有効度パラメータとして使用され得る）可能性もある。
【０１２０】
図１２は、いくつかの実施形態例において図１の処理回路１４の一部を形成し得る回路を概略的に例示する。この回路３４は、それぞれのベクトル記憶素子３６、３８、４０、４２内に記憶された複数コンポーネントを含むベクトルの形態のＨＰＡ数に処理を実行する。メタデータ記憶素子４４（例えばメタデータレジスタ）は、少なくともいくつのコンポーネントが特定のベクトルＨＰＡ数を形成するかを含むメタデータを記憶するように機能する。そのベクトルのうち有効度が最も低いコンポーネントがベクトル記憶素子４２内に記憶され、有効度がより上位のコンポーネントは、必要に応じてベクトル記憶素子４０、３８、３６内に記憶される。
【０１２１】
回路３４は、ベクトルＨＰＡ数のそれぞれのコンポーネントに関連付けられ、実行されているプログラム命令によって指定される加算、減算、および乗算などの動作を実行するように構成され得る、処理回路４６、４８、５０、５２をさらに含む。実際には、処理回路４６、４８、５０、および５２により実行される処理は、いくつのコンポーネントがベクトルＨＰＡ数値を構成するかと、実行されているプログラム命令との両方に依存する。具体的には、ベクトルＨＰＡ数が複数コンポーネントから構成されている場合、キャリーアウト値は、最小有効ビット側から開始して処理回路４６、４８、５０、５２の異なる部分間に伝搬する。
【０１２２】
図１２に示される例では、４つの別々の処理レーンが例示されている。ベクトルＨＰＡ数が４つのコンポーネントを含む場合、これら４つのレーンのすべてが並列に使用され得る。ＨＰＡ数が２つのコンポーネントを含む場合、そのような２コンポーネントＨＰＡ数が２つ並列で図１２の回路内において処理され得、処理回路５０および４８のコンポーネント間でキャリーを実行しないことも可能である。
【０１２３】
図１３は、図１２の回路の変種を例示する。図１３の回路５４において、ベクトルＨＰＡ数値は、この場合もやはり、プログラム命令により指定される処理に依存する。この場合、処理回路５８は、プログラム命令と、いくつのコンポーネントがベクトルＨＰＡ数内に存在するかを示すメタデータとに従って、マイクロ動作生成回路６０によって生成される、マイクロ動作命令によって制御される。具体的には、２つの４コンポーネントＨＰＡ数間の加算を実行するために４つのペアのコンポーネントが加算される必要がある場合、これら４つの加算は、処理回路５８によって連続して実行される。これらの加算のうち最初のものは、キャリーイン入力を有せず、マイクロ動作命令ＡＤＤによって表現され得る。次の３つの加算は、前の加算からキャリー入力を受け取り、マイクロ動作命令ＡＤＤＣによって指定され得る。最終結果のベクトルＨＰＡ数が、結果レジスタ６２に書き込まれる。
【０１２４】
図１４は、図１の処理回路１４の一部を形成し得る回路６４を概略的に例示する。回路６４は図１１のものと同様だが、この場合は例外生成回路６６を付加的に含む。例外生成回路６６は、整合回路６８、７０および処理回路７２からの入力に応答して、多様な例外条件の発生を識別する。これらの例外条件は、入力オペランドのうちの１つが非正規浮動小数点数である；ある数の形式間での変換が不正確であった；生成された結果値が結果レジスタ７４のプログラム可能な有効度範囲をアンダーフローさせた；生成された結果値が結果レジスタ７４のプログラム可能な範囲の有効度をオーバーフローさせ、ある入力オペランドが無限大の値を有する；非数である；または符号なしの目標値に変換されるときに符号付き値である、という条件のうちの１つ以上を含み得る。様々な他の形態の例外指示が可能であることは理解されるであろう。例外は、それらが発生するとき、大域的例外記憶装置７６内に注記され得る。代替的に、例外は、個別のＨＰＡ数と関連付けられ、これらのＨＰＡ値と関連付けられたメタデータの一部を形成してもよい。他の構成も可能である。
【０１２５】
本開示の少なくともいくつかの実施形態は、浮動小数点（ＦＰ）値を表すＨＰＡ数の変換および演算例外を処理するための方法を含む。いくつかの実施形態の目標は、ＦＰ数を加算する際にもたらされるであろうものと同じ例外（不正確以外）をもたらすこと（例えば、＋無限大を−無限大に加算するとＮａＮおよび無効動作例外ＩＯＣが返される）、ならびに、アンカーベクトルによって指定された有効度が小さすぎるかどうかを検出するために必要な情報をプログラマに与えることであり得る。
【０１２６】
完全幅または部分幅の浮動小数点値を表現するためのＨＰＡデータタイプの使用は、ＩＥＥＥ  ７５４例外処理の問題を引き起こす。表２は、ＤＺＣ（ゼロによる除算、変換ではなく除算中に起こる例外）以外のＦＰ例外のエントリ、ならびに無限大、ＮａＮ、および符号に対するメタデータエントリを含む。これらの例外は、大域的な例外ワードに直ちに記録されてもよいし、またはＨＰＡデータタイプが標準的なＦＰデータタイプ（ＳＰまたはＤＰ）に変換された後に記録されてもよいし、または大域的なワードに一度も記録されなくてもよい。それらは、そのデータタイプのメタデータに組み込まれても組み込まれなくてもよい。一部は非標準的な例外であり、その他はＩＥＥＥ  ７５４指定である。
【０１２７】
表２のＦＰ−＞ｉｎｔおよびｉｎｔ−＞ＦＰ列は、ＦＰと６４または３２ビット整数との間のＩＥＥＥ−７５４変換中に何が起こるかを示す。これらは、ＩＥＥＥ−７５４の挙動に関する手引きを提供するために含まれている。最後の３つの列は、ＨＰＡ値が関与する変換および加算に対してどの例外が可能であるか、ならびにこれらの動作が無限大およびＮａＮにどのように対処することができるかを示す。
【０１２８】
ＨＰＡ数ベクトルがＦＰタイプを正確に表現するのに十分大きければ、例外のほとんどは起こらないであろう。あらゆる有限ＦＰ数には特有のＨＰＡ数が存在するため、ＨＰＡ数への変換では、オーバーフローおよびアンダーフローは発生しないはずであり、不正確ですら発生しないはずである。加算および減算はアンダーフローを引き起こすことができず、またそれらは正確であるため、例外は生じないはずである。最後に、最大限のＨＰＡ精度が使用されれば、ＦＰへの再変換はアンダーフローしないはずである。
【０１２９】
オーバーフローは、加算とＦＰへの再変換との両方で起こり得る。単純に最大の正ＦＰ数のＨＰＡ等価物をそれ自体に加算すると、（ＨＰＡ数にいくつのビットを与えるかに応じて）加算をオーバーフローさせ得る結果がもたらされ、それはＦＰへの再変換をオーバーフローさせる。
【０１３０】
より小さなベクトルを使用すれば（性能の理由でプログラマが行いたいであろうこと）、例外のうちより多くが可能になる。さらに、この演算でなし得る１つの目的は再現可能かつ正確であることであるため、これらの例外はプログラマにとって有意義となる。概して、オーバーフロー、アンダーフロー、または不正確があるということは、ＨＰＡ数を記憶するにはより大きなベクトルが必要であることを示す。
【０１３１】
表２は、例外指示を処理／生成する一実施形態の一例であり、例外ビットの他の定義および他の状況が可能であり得る。「ＦＰ−＞ｉｎｔ」という列は、標準的な浮動小数点データタイプ（例えば、ＳＰおよびＤＰ）から標準的な整数形式（完全または任意精度）への変換であり、「ｉｎｔ−＞ＦＰ」は、逆変換であり、「ＦＰ−＞ＡＨＰ」は、標準的な浮動小数点形式またはＦＰ値の計算された積からＨＰＡデータタイプへの変換であり、「ＨＰＡ−＞ＦＰ」は、ＨＰＡデータタイプから標準的なＦＰ形式への逆変換であり、「ＡＰ加算／減算」は、ＨＰＡデータの加算または減算を考察する。
【０１３２】
表２は、どの例外が可能であるか（ｙによって示される）、どの例外が起こり得ないか（「いいえ（ｎｏ）」のｎまたは「該当なし（ｎｏｔ  ａｐｐｌｉｃａｂｌｅ）」のＮＡによって示される）を示し、脚注は、例外的挙動をより詳細に説明する。
【表７】
0006694880.tif 000009
（ａ）整数より小さい数は、例外フラグを設定することなくゼロに変換される。
（ｂ）整数が保持できるより大きい数は、最大の正整数または最大の負整数に変換され、ｏｆｃではなくｉｏｃが返される。
（ｃ）整数が保持できるより大きい数、符号なし形式に変換された負数、入力無限大、または入力ＮａＮは、すべて無効である。返される整数は、ゼロ、または最大正数もしくは最大負数である。
（ｄ）これらは、最大の正整数または最大の負整数に変換され、ＩＯＣを返す。
（ｅ）これらは、ゼロに変換され、ＩＯＣを返す。
（ｆ）十分大きな宛先（ｄｅｓｔｉｎａｔｉｏｎ）ベクトルを考慮すると、この例外は起こらないが、プログラマはより小さな宛先を指定することができる（プログラマが、すべての入力が２＾−１００〜２＾＋１００の範囲内にあることを知っているとして）。このフラグは、プログラマが間違っていたことを示す。
（ｇ）（ｆ）のように、このフラグは、プログラマのエラー、すなわち入力値が所与のアンカー固定点範囲内で表現され得るものよりも小さいことを示し得る。プログラマが行おうとしていることに応じて、これは深刻である場合もそうでない場合もある（例えば、プログラマは、とても小さな数を破棄したいかもしれない）。一部の実装形態では、ＩＸＣとＵＦＣとの組み合わせは付加的情報をもたらす。ＵＦＣは、ビットのうちのいずれも変換されなかったことしか意味しないが、ＵＦＣおよびＩＸＣは、部分的変換を意味する。部分的変換を丸めるための試みは行われない。
（ｈ）このフラグは、深刻な問題、すなわち入力値が所与のＨＰＡベクトルにおいて表現され得るものよりも大きいことを示す。（ｇ）と同様に、変換の部分的な成功を示すためにＩＸＣフラグを使用することになるが、いかなる場合でもこのフラグは、より大きなＨＰＡベクトルを用いた再試行が必要であることを示す。
（ｉ）このフラグは、深刻な問題を示す。我々は、それを入力無限大またはＮａＮに設定し、（符号なしＨＰＡ形式を作る場合は）負の非ゼロを符号なしＨＰＡ形式に変換することを提案する。入力無限大またはＮａＮは、メタデータフラグを調整する必要もある。
（ｊ）以下のメタデータの説明を参照されたい。無限大およびＮａＮの記号が関与するＦＰ計算と同じ結果をもたらすためには、所与の数が無限大またはＮａＮであるという何らかの指示、ならびに無限大の符号が必要である。これらは、ＨＰＡ数の作成中に生成された例外の何らかの記録と一緒に、理想的には第２のメタデータベクトルの一部として、ＨＰＡ数と共に記憶されるのが最良である。
【０１３３】
本開示の少なくともいくつかの実施形態は、ＨＰＡ数もしくは整数、すなわち、６４ビットより幅広の数を加算または減算するために、ＳＩＭＤ様ハードウェアを使用することを含む。拡張可能なレジスタを使用すると、一部の実装形態では、何であれ実装されるベクトル長の単一サイクル加算を用いて、数千ビット長の数を加算することが可能となり得る（少なくとも、あり得そうな実装形態については）。
【０１３４】
ＳＩＭＤ様システムは、拡張可能なベクトルレジスタを含み得、これらのレジスタは、複数の６４ビット値を含むことができる。新たな加算および減算命令の目的のために、拡張可能なベクトルレジスタが、ｎ個の６４ビット数のレジスタではなく、１つの長い６４＊ｎビットの２の補数整数と見なされることが提案される。ＳＩＭＤスキームに従って、加算または減算は、ハードウェアによって実装時定義のチャンク（例えば２５６ビットまたは５１２ビット）に分割され、下位チャンクから上位チャンクに加算される。各チャンクは、単一サイクルで実行し得る（少なくとも最大１０２４ビットのチャンク）。
【０１３５】
チャンクがキャリーアウトを生成する場合、そのキャリーアウトは、次のチャンクへの入力であり得る。これは、述語条件フラグを使用して指示／制御することができる。これは、述語条件の非標準的用途である。
【０１３６】
チャンクに対する各加算または減算は、キャリー述語条件フラグ（以降ＰＣＡＲＲＹと称す）の読み書きの両方を行い、ＰＣＡＲＲＹが設定された場合は加算または減算へのキャリーインを設定し、その後そのチャンクからのキャリーアウトの存在に基づいてＰＣＡＲＲＹを設定またはクリアする。
【０１３７】
減算は、通常の２の補数方法、すなわち、Ａ−Ｂ＝Ａ＋〜Ｂ＋１で行われ得る。＋１は、下位チャンク（キャリーを生成するためにより下位のものが何も存在しないため、これは使用されない）へのキャリーインとして処理されることになる。
【０１３８】
チャンクに対する単一サイクル加算は、既存の６４ビット加算器を使用して行われ、チャンクサイズが何であれ、加算を拡張するために桁上げ選択論理が使用される。いくつかの６４−ｂ加算器から構築された２５６ビット加算器の一例が、図１に示されている。
【０１３９】
代替的な「桁上げ先見」手法（図２に例示される）を用いて、図２に示される加算器に沿ったキャリー入力を加速することができ、ここで、ｇｎは、６４−ｂキャリー生成信号であり、ｐｎは、６４−ｂキャリー伝搬信号であり、Ｇｎ：０は、有効度６４×（ｎ＋１）から下の６４−ｂ加算器生成および伝搬信号をすべて合わせたキャリー信号である。
【０１４０】
桁上げ先見手法は、最大１０２４ビットのサイズの和の単一サイクル実行を可能にし得る。
【０１４１】
加算／減算命令が述語レジスタも使用した場合、述語ビットを使用して、キャリーが任意の所与の６４ビット境界で伝搬し得るか否かを制御してもよい。これにより、ベクトルが、１２８ビットまたはより大きな整数値を複数含むことが可能になるであろう。つまり、１０２４ビットベクトルレジスタは、１６個の６４ビット値、または４個の２５６ビット値、または単一の１０２４ビット値と見なされ得、単一の加算命令がすべての場合で正しく機能するであろう。
【０１４２】
これの可能な実装形態の１つは、「ＰＣＡＲＲＹを有効にする（ｅｎａｂｌｅ  ＰＣＡＲＲＹ）」を意味する述語ビットを有することであり、これは、いずれかの６４ビット要素について設定されると、その特定の加算器へのキャリーインを可能にする。このより一般的なスキームにおける減算（Ａ−Ｂ）は、（すべての６４ビット位置において）Ｂを反転させ、「ＰＣＡＲＲＹを有効にする」ビットが設定されていない場所で１を加算することによって実装される。
【０１４３】
このスキームは、既存の加算命令が現在動作するのと全く同じように動作することを可能にするが（「ＰＣＡＲＲＹを有効にする」ビットが設定されていなければ）、入力ベクトルが、より高精度の数の任意の混合物を含むものと解釈されることも可能にするであろう。表３にあるように、「ＰＣＡＲＲＹを有効にする」ビットを含んだ述語と併せて５１２ビットベクトルの加算を考察する。
【表８】
0006694880.tif 000010
ケース（ａ）では、新たな述語ビット（ＰＣｉと表記される）のうちのいずれも設定されておらず、そのためこの加算は、８個の６４ビット値のそれぞれの別々の加算と解釈される。
ケース（ｂ）では、述語ビットが、奇数の６４ビットレジスタから偶数の６４ビットレジスタへのキャリーを可能にし、これは、加算が今度は１２８ビット値を扱っていることを意味する。
（ｃ）および（ｄ）では、これらのキャリーが、漸進的に大きな数に許可される。
ケース（ｅ）は、所与のベクトルに関して混合解釈すら可能であることを示す。
【０１４４】
図１５は、１つ以上のオペランドを受信し、そのオペランドに応答して結果を生成する処理回路１０２を備える装置の一例を示す。処理回路は、結果値の目標有効度および目標サイズ（長さ）のうち少なくとも１つを指定するプログラム可能な制御データ１０４を受信する。プログラム可能な制御データＣ４に応答して、処理回路１０２は、処理回路１０２に供給されたオペランドの値に関係なく、目標有効度および／または目標サイズを有する結果値を生成する。入力オペランドに対する処理動作（例えば乗算または加算）の実行が、指定された目標有効度および目標サイズを有する結果値において表現可能でない値を与える場合、処理回路は、結果値が正確でないことを示す例外信号１０６を出力し得る。例えば、例外指示は、次のうちの１つを示し得る。
●処理動作の結果が、指定された有効度およびサイズの結果値を使用して表現可能なものよりも大きい場合のオーバーフロー条件、
●結果が、指定された有効度およびサイズを有する結果値により表現可能なものよりも小さい場合のアンダーフロー条件、または
●結果が、目標有効度およびサイズを有する値を使用して表現可能なものよりも精確である場合の不正確条件。
【０１４５】
真の処理結果がその有効度の外側に位置する場合でさえ、処理回路が指定された有効度の結果を生成することが許可されるべきであるのは、直感に反するように思えるかもしれない。しかしながら、図１６の例に示されるように、このことは、結果がより少数のビットに収まることが概して予想される場合に、非常に大きな数を処理する必要がないように、必要とされる処理の量を限定するために有用となり得る。例えば、制御データ１０４は、有効度下方境界１１０と有効度上方境界１１２との一方または両方を指定し得る。処理回路１０２は、指定された有効度境界１１０、１１２内に位置する結果値のビット値を判定し、境界の外側に位置するビット値を判定しないように、その処理を限定し得る。故に、結果値は、広範囲の数空間１１４内にある数を表現することができる形式を有するが、制御データ１０４が数空間内の可変長および位置の枠を定義し、処理回路１０２は、処理を高速化しエネルギー消費量を低減させるように、指定された枠内のビットのみを計算する。例えば、プログラマは、有効なオペランド値および結果がある特定の有効度範囲内に位置すると予想されることを知らない場合があり、そのため、制御データを適切に設定することにより、予想される範囲より低い有効度または高い有効度のビット値を計算するのに処理リソースが浪費されない。そうは言っても、処理が実行される枠は、広範囲の値が（しかしより小さなハードウェアオーバーヘッドで）サポートされ得るようにプログラム可能な制御データを変更することによって、調整することができる。
【０１４６】
一部の場合では、結果値のサイズは固定されていてもよく、制御データ１０４は有効度の下方および上方境界１１０、１１２のうちの一方のみを指定してもよく、もう一方は、指定された境界および既知の結果サイズから判定される。代替的に、サイズは可変であってもよく、制御データ１０４において明確に指定されてもよいし、またはある特定のビット数の倍数（例えば３２または６４ビット）として表現されてもよい。別の例では、制御データ１０４は、有効度の下方および上方境界１１０、１１２の両方を指定してもよく、これは、境界間の差としてサイズを効率的に識別する。このように、結果値の目標サイズおよび目標有効度が制御データから判定され得る、いくつかの方法が存在する。
【０１４７】
図１７は、高精度アンカー固定（ＨＰＡ）データ形式におけるデータ値の一例を示す。ＨＰＡ数は、それぞれが（正規化されていない）二進値のそれぞれの部分を表す２の補数の数を含むいくつかのデータ要素ｄ［０］〜ｄ［３］を含む、データベクトルＶｉと、それぞれがデータベクトルＶｉ内の対応するデータ要素の有効度（「重み」）を指定するアンカー値要素ａ［０］〜ａ［３］を含む、メタデータベクトルまたは「アンカー」ベクトルＶａと、を含む。例えば、各アンカー値要素ａ［ｉ］は、対応するデータベクトルＶｉ内の最小有効ビットの有効度を指定し得る。図１７は、ベクトルＶｉ、Ｖａが４つのデータ要素（これらは６４または１２８ビットなどのある特定の要素サイズであり得る）を含む例を示すが、ベクトルが様々な数のデータ要素を有してもよいことは理解されるであろう。ベクトル内の要素の数は、例えば、使用されていない任意のベクトルレーンのアンカー値要素ａ［ｉ］内に所定のビットパターンまたは状態フラグを提供し、その結果、処理される要素の数がそのビットパターンを有しないアンカー値要素によって示されるようにすることによって、アンカー値Ｖａ内に示されてもよい。例えば、重みを有するアンカー値ベクトルＶａ（Ｘ，１１８，５４，−１０）（ここでＸは未使用のレーンを示すビットパターンまたは状態フラグである）は、６４ビットデータ要素ｄ［２］と、ｄ［１］と、ｄ［０］とが一緒に、有効度２−１０の最小有効ビットと有効度２１８１の最大有効ビットとを有する１９２ビットの二進値を表すことを示し得る。代替的に、ＨＰＡ数は、このＨＰＡ数において処理される要素の数を指定する、何らかのさらなるメタデータ１２０を有してもよい。また、アンカー値ベクトルＶａまたはさらなるメタデータ１２０は、データベクトルＶｉにより表されるデータ値の符号、ベクトルの処理中に生じ得たあらゆる例外条件（例えば、オーバーフロー、アンダーフロー、不正確、無効動作、または入力非正規例外）を示す例外情報、または、例えばデータ値が無限大、非数（ＮａＮ）、もしくはゼロであるかどうかを示す特徴情報といった、他の情報を指定してもよい。ＨＰＡ値を加算または減算する際、アンカー値は、その加算／減算への様々な入力に対して固定され、同じアンカー値を用いて結果が生成される。これは、単純な固定小数点加算器を使用してＨＰＡ値を処理することができ、したがって丸めおよび正規化をサポートする浮動小数点加算回路は必要とされず、これにより、一連の加算または減算の処理がより素早くなり得ることを意味する。アンカー値は、ＨＰＡ形式と、浮動小数点または整数もしくは固定小数点形式といった他の形式との間の変換時に、適切な有効度を有する値を生成するために使用される。非常に大きな累算器を要することなく、様々な有効度の可変長値の処理を効率的に処理することを可能にするため、値をこの方法でベクトルとして表現することは有用である（例えば以下の図１９参照）。
【０１４８】
図１８は、ＨＰＡ数形式のデータ値をサポートする記憶ユニット（例えばレジスタファイル）１３０の一例を示す。本開示のいずれの実施形態に示される装置も、図１８に示される記憶ユニットを備えてよい。記憶ユニットは、それぞれが対応するメタデータ記憶素子（レジスタ）１３４を有するいくつかのデータ記憶素子（レジスタ）１３２を含む。一部の例では、メタデータレジスタ１３４は、データ記憶レジスタ１３２とは別々のレジスタファイル内にあってもよい。代替的に、データレジスタおよびメタデータレジスタは、単一のレジスタファイルの一部であってもよく、または同じレジスタの異なる部分を構成してもよい。各データ記憶レジスタ１３２は、所与のＨＰＡ数に関するデータベクトルＶｉを記憶し得る。対応するメタデータ記憶レジスタ１３４は、そのＨＰＡ値に関するアンカーベクトルＶａおよび任意のさらなるメタデータ１２０（提供される場合）を記憶する。
【０１４９】
一部の例では、メタデータ記憶レジスタ１３４内のメタデータは、対応するデータ記憶レジスタ内の特定のデータ値よりもむしろ、対応するデータ記憶レジスタ１３２自体に関連付けられていると見なされ得る。つまり、アンカー値Ｖａは、いかなる値がデータ記憶レジスタ内に記憶するために実際に計算される前に、所与のレジスタについて定義されてもよい。データ記憶レジスタ１３２のうちの１つを宛先レジスタとして指定する処理動作を実行する際、処理回路１０２は、対応するメタデータレジスタ１３４からアンカー値を読み取り、処理動作に対するいかなる入力の値または有効度とも独立して、アンカー値（複数可）によって指定された目標有効度および／または目標長を有する結果値を生成する。アンカー値は、プログラマにより供給される制御データに基づいてプログラム可能である。一部の場合では、プログラマは、アンカー値を直接指定してもよいが、他の例では、ライブラリまたは他のソフトウェアプログラムが、プログラマにより入力された制御データを、処理回路１０２によって読み取られ得る好適な形式のアンカー値（複数可）へと変換してもよい（この手法は、プログラマが、ハードウェアにより使用される内部メタデータ形式を理解する必要なしにアンカー値を設定することを可能にする）。
【０１５０】
ＨＰＡ数が、単一のデータレジスタ１３２内に記憶され得るよりも多くの要素を必要とする場合、そのＨＰＡ数は、いくつのレジスタがＨＰＡ数に対応するかを識別し、各データ要素により表される所与の二進値の部分の有効度を定義する対応するメタデータを含む、複数のレジスタにまたがる場合がある。
【０１５１】
図１９は、ＨＰＡ形式の数を処理するための処理回路１０２の一例を示す。処理回路１０２は、所与のＨＰＡ数の対応するメタデータベクトルＶａ内のアンカー値に基づいて、データベクトルＶｉのそれぞれのデータ要素に対して並列レーンの処理（例えば変換または演算動作）を実行するための、いくつかの処理ユニット１４０を有し得る。一部の場合では、処理回路１０２は、２つのＨＰＡ数に作用してもよく、各レーンが、２つのＨＰＡ数の対応する要素ｄ０［ｉ］、ｄ１［ｉ］を受信してもよい。この場合では、ＨＰＡ数は同じアンカー値を共有し、対応する結果のデータ要素ｒ［ｉ］が、同様に入力と同じアンカー値を有するＨＰＡ形式の結果値をもたらすように生成される。処理の実行前に同じアンカー値を有するＨＰＡ数に対して異なるアンカー値を有するＨＰＡ数をマッピングすることが可能である。
【０１５２】
代替的に、命令がソースオペランドとして１つのＨＰＡ数および浮動小数点数を指定することに応答して、その浮動小数点数（または複数の浮動小数点オペランドに実行された演算動作から得られた浮動小数点数）を、他方のＨＰＡ数と組み合わせられる前にＨＰＡ形式にマッピングしてもよい。各レーンは、アンカーベクトルＶａの対応するアンカー値ａ［ｉ］を受信し、これは、浮動小数点オペランドＦＰがＨＰＡ数の対応する要素にどのようにマッピングされるかを制御し得る。
【０１５３】
所与の計算のために処理される要素の数は、メタデータに応じて様々であり得る。処理ユニット１４０は、ある特定の数のレーンのために提供されるが、特定の計算にすべてのレーンが必要とされるわけではない場合、未使用のレーンは、電力を節約するために、パワーゲーティングされる、すなわちレーン内での内部ビット状態のトグリングを防止するためにゼロ入力を提供される。その一方で、メタデータまたはアンカー値が、ハードウェア内に備えられた処理ユニット１４０の数よりも大きな数の要素を指定する場合は、ＨＰＡ数は、ハードウェアの複数のパスにおいて処理され得る。
【０１５４】
要約すると、本明細書に記載される高精度固定小数点演算システムは、「高精度アンカー固定」（ＨＰＡ）データタイプを組み込む。ＨＰＡデータタイプはベクトルペアであり得、その一方は、固定長整数の順序集合（例えば、８つの６４ビット整数の順序集合）を含み、他方は、固定長整数のそれぞれ１つがハードウェアによりどのように解釈されるべきかを指定するメタデータ（アンカー値）（例えば、整数内の各ビットの指数重みを与える範囲情報）を含む。各レーンが、データと、そのデータに特有のメタデータとの両方を受信するため、レーンは、全体としてベクトルに有意義な結果をもたらす異なる動作を行うことができる。例えば、ＨＰＡ値は、例えば、浮動小数点数または固定小数点形態の積を表す２００〜４０００ビット長の、非常に長い整数を表し得る。この長整数の各６４ビット部分に関連付けられたアンカー要素は、どのようにその６４ビット整数を解釈すべきかを６４ビットレーンに伝える。したがって、データと、そのデータに関連付けられたメタデータと、それぞれがそのデータ項目に特有のメタデータを有する複数のデータ項目を作成する能力とから成るデータタイプが提供される。
【０１５５】
ＨＰＡデータは、フルサイズデータタイプであっても、またはフルサイズデータタイプの範囲および精度の一部分であってもよい。フルサイズデータタイプは、例えば、２０９９ビット（すべての倍精度数を保持するため）、もしくは４１９８ビット（すべての倍精度積を保持するため）、または、これらの値の多くをオーバーフローさせることなく加算することを可能にするさらに大きな何らかのサイズであってもよい。明らかにこれはより大きなビット数であり、これらのデータタイプに対する動作は複数サイクルを要することになり、記憶装置はかなりのものになるであろう。しかしながら、多くの場合において、実行されている機能またはアプリケーションは、完全なデータタイプを必要とせず、データタイプの一部分のみを必要とし、これは、数値解析およびシミュレーションによってプログラマに既知となるであろう。例えば、特定のプログラムは、非正規入力を決して有しないかもしれないし、または何らかの他の範囲制限を有するかもしれない。これらの場合、より小さなＨＰＡデータを使用することができる。
【０１５６】
このデータタイプは、ほんの少数の特徴により定義され得る。これらは、一部の場合ではビットもしくはベクトルレーンサイズの倍数におけるデータタイプのサイズを含むか、またはそれは、３２ビットもしくは６４ビットなどの固定データサイズの観点から定義される場合もある。さらに、データタイプは、表現され得る最も低い指数によって定義されてもよい。例えば、アルゴリズムが［＋／−１０２５，１０４５］の範囲内の単精度データを処理し、すべての中間計算が同じ範囲内にある場合（中間計算の範囲は入力データ範囲より大きくても小さくてもよいが、最終範囲はほとんどの場合両方の範囲の広がりを組み込むべきである）、データタイプは、この範囲内のデータを表現するのに必要な数のビットのみを含むことになる。この例において、１０２５は２８３よりもわずかに大きく、１０４５は２１５０よりも少しだけ小さいため、このアルゴリズムに適切なデータタイプは９１ビット（１５０−８３＋２４）となり、アンカー値は、８３として表現可能な最小の指数を識別することになる。このデータ項目への合計には、最大限の２０９９ビットではなく９１ビットのデータタイプが関与し、計算時間および記憶装置要件の大幅な縮小がもたらされるであろう。
【０１５７】
浮動小数点例外を処理するためには、各ＨＰＡ数に関するメタデータが少なくとも以下の情報を含むことも有用となり得る。
●符号（値が正であるか負であるか）
●例外ビット、例えばＩＥＥＥ  ７５４−２００８定義ビット−ＩＸＣ（不正確例外（ｉｎｅｘａｃｔ  ｅｘｃｅｐｔｉｏｎ））、ＩＯＣ（無効動作例外（ｉｎｖａｌｉｄ  ｏｐｅｒａｔｉｏｎ  ｅｘｃｅｐｔｉｏｎ））、ＵＦＣ（アンダーフロー例外（ｕｎｄｅｒｆｌｏｗ  ｅｘｃｅｐｔｉｏｎ））、ＯＦＣ（オーバーフロー例外（ｏｖｅｒｆｌｏｗ  ｅｘｃｅｐｔｉｏｎ））；または実装定義ビット−ＩＤＣ（入力非正規例外（ｉｎｐｕｔ  ｄｅｎｏｒｍａｌ  ｅｘｃｅｐｔｉｏｎ））。ＤＺＣ（ゼロによる除算（ｄｉｖｉｓｉｏｎ  ｂｙ  ｚｅｒｏ））例外ビットは、ＨＰＡ数の除算が必要とされない場合は、必要とされない場合がある。
●特徴的なビット（例えば、値が無限大、ＮａＮ（非数）、ゼロであるかどうかを示すもの）
これらのビットはデータタイプの一部であり、すべてのレーンについて必ずしも複製されるわけではない。
【０１５８】
図２０は、ＨＰＡ値を使用して実行され得る動作の一例を示す。この場合では、その動作は、一連の浮動小数点値の和を見出すための累算動作である。これらが浮動小数点演算で処理された場合、浮動小数点値ペアの各加算は丸めおよび正規化が原因で不精確性をもたらし得るため、浮動小数点値が加算される順序が結果に影響し、そのため浮動小数点加算は結合的ではない。したがって、予測可能な結果を与えるためには、浮動小数点加算を使用した一連の浮動小数点値の累算は、加算が固定順序で順次実行されることを必要とし、このことは、それを迅速に実行することを困難にする。
【０１５９】
対照的に、ＨＰＡ数の加算は結合的であるため、ＨＰＡ形式を使用することにより性能を大幅に向上させることができ、そのため、一部の加算がマルチプロセッサシステム内で並列に実行される場合でも、または、どのオペランドが最初に利用可能になるかに応じて加算が再順序付けされる場合でも、その結果は依然として正しくかつ繰り返し可能となる。図２０は、１つの加算で実行され、その後、各浮動小数点値を累算するために何回か繰り返され得るステップを示す。各加算において、入力浮動小数点値ＦＰが、ＨＰＡ形式のデータベクトルＶｉ１に対して、そのＨＰＡ数について前もって指定されているプログラム可能なアンカーベクトルＶａに基づいてマッピングされる。浮動小数点値ＦＰの仮数部Ｆは、アンカーベクトルＶａおよびその浮動小数点値の指数Ｅにおいて定義された有効度境界に応じて、データベクトルＶｉ１の１つ以上の要素の一部分に対してマッピングされる。ベクトルが浮動小数点値の仮数部Ｆより大幅に大きいため、典型的にベクトルのほんの少数のレーンにのみ仮数部からのビット値が投入され、より上位のレーンにはもっぱら符号ビットが投入され、より下位のレーンにはゼロが投入される。変換動作は、以下でより詳細に説明する。
【０１６０】
このように、変換されたデータベクトルＶｉ１は事実上、浮動小数点値により表される二進値の代替的表現を提供する、長い固定小数点値である。このことは、それが、浮動小数点演算に関する整合、正規化、丸め、および指数調整ステップを必要とすることなく、単純な整数加算によってＨＰＡ形式の別のデータベクトルＶｉ０（これはＶｉ１と同じアンカー値を有する）に加算され得ることを意味する。これは、加算動作が他の加算と結合的であり、そのため並列に実行することができるか、または性能を向上させるように再順序付けすることができることを意味する。ベクトルＶｉＲは、データベクトルＶｉ０、Ｖｉ１を加算することによって生成され、これは、Ｖｉ０、Ｖｉ１と同じアンカーベクトルＶａを有するＨＰＡ形式の結果値のデータベクトルを表す。これが累算の最後の加算でなければ、結果ベクトルＶｉＲは次の加算のための第２のベクトルＶｉ０となり、このとき、別の浮動小数点値ＦＰが入力され、ＨＰＡ形式に変換され、前の累算結果に加算される。これらのステップを数回繰り返すことによって、精度を損失せずに、一連の浮動小数点値を非常に迅速に加算することができ、これは、浮動小数点演算では不可能である。最終累算結果を生成したら、結果のデータベクトルＶｉＲはその後、所望であれば浮動小数点値に再変換されてもよく、アンカーベクトルＶａは、浮動小数点値が結果値に対応する二進値を表すように（必要であれば丸めを用いて）変換が実行される方法を制御する。
【０１６１】
このように、浮動小数点（ＦＰ）数または積は、高精度アンカー固定（ＨＰＡ）数に変換され得る。これらのＨＰＡ数は数百（単精度）または数千（倍精度）のビット長であり得るが、それらはＦＰ入力の正確な表現であり得、ＦＰ数とは異なり、これらの数は、演算の通常の結合的特性に従う。
【０１６２】
ここで、ＦＰ数からＨＰＡ数への変換をより詳細に説明する。単精度浮動小数点（ＳＰ）数は、符号ビットと、８個の指数ビットと、２３個の小数部ビットとを含む。１．ｆｒａｃｔｉｏｎまたは０．ｆｒａｃｔｉｏｎ形態の仮数部を構築するために使用される隠れビット（ｈｉｄｄｅｎ  ｂｉｔ）（指数に基づく）も存在する。最大指数および最小指数は特殊な数のために予約されているが、仮数部の第１のビットは、指数により指定される他の２８−２＝２５４個の位置のうちいずれに現れてもよい。仮数部の第１のビットには小数部が続き、符号を表す１個の付加的なビットが存在するため、いかなる有限ＳＰ数も、２５４＋２３＋１＝２７８ビットの固定小数点数として表すことができる。この数を保持するために５つの６４ビット値のベクトルを構築するとした場合、下位ベクトル要素はビット０〜６３を保持し、次の要素はビット６４〜１２７を保持するなどということになり、上位要素はビット２５６〜２７９を保持する。
【０１６３】
これはどのようにベクトルプロセッサ内に収まるのだろうか。ＳＰ浮動小数点数ＳｉをＨＰＡ数Ｖｉ，Ｖａ（ここで、Ｖｉはデータベクトルであり、Ｖａはアンカーベクトルである）に変換するための命令、
ＣＶＴ＿ＳＰ＿ｔｏ＿ＨＰＡ  Ｖｉ，Ｖａ，Ｓｉ
があると想定すると、Ｖｉは、２７９ビットの固定小数点結果を含むことになる。Ｖａは、Ｖｉにおける５つの６４ビットの宛先のそれぞれに関する境界情報を含むことになるため、上記の例では、Ｖａ＝＜２５６，１９２，１２８，６４，０＞である。各６４ビットレーンは、ＳＰ数Ｓｉのコピーを得ることになり、Ｖｉの適切な部分にどのビットを設定するかを計算するために、境界情報およびＳＰ数の指数を使用する。Ｖｉ＝＜Ｄ４，Ｄ３，Ｄ２，Ｄ１，Ｄ０＞とする。Ｓｉが指数７０を有する場合、Ｖｉのビット［７０：６４］（すなわち、Ｄ１のビット［６：０］）は、Ｓｉの仮数部の上位７ビットに設定され、Ｖｉのビット［６３：４７］（すなわち、Ｄ０のビット［６３：４７］）は、Ｓｉの仮数部の下位１７ビットに設定される。残りのビットのすべては、ゼロに設定されることになる（簡略化のために、ここでは正数を仮定しよう）。各レーンは、Ｖａの対応するエントリから完全な仮数部、指数、および境界情報を受信する。
【０１６４】
通常の場合では、Ｖａは、全面的にその下位６４ビットにおける基底値によって決定され、次に続く各６４ビット値は、前の６４ビットにおける値よりも６４多いため、すべてのレーンがＶａ内のその場所を「知って」いたら、スカラー基底値で事足りるかもしれない。しかしながら、一部のベクトル処理回路では、各レーンがベクトル内におけるその位置を承知している必要がないように基底値のベクトルを含めることがより明快であり得るが、代替的な実装形態では、単一の基底値で十分であることが想像され得る。
【０１６５】
Ｖｉにより表される二進値は２の補数の数であるため、２４ビット仮数部を２の補数の数に変更する（変換後に２の補数に変更してもよいが、２７９ビット値の変換は２４ビット値の変換よりも大幅に遅い）。２の補数は通常の方法で変換する：数が正である場合何もせず、さもなければ〜ｓｉｇｎｉｆｉｃａｎｄ＋１の値を使用する。この変換後、２７９ビットの変換は、場合により改変されている仮数部を使用し、仮数部の左側のビットをゼロの代わりに符号ビットに設定することを除いて、先行の段落と全く同じように進行する。
【０１６６】
本方法の美点はその柔軟性にある。プログラマがＦＰ数を表現するために使用したいと思うかもしれない、可能な固定小数点数は多数存在する。ＦＰ仮数ビットのすべてが７０〜１９７の範囲内に落ち着くことをプログラマが確信していたとするとどうだろう。その場合はＶａ内のエントリを適切に改変することにより、固定小数点数が１２８ビットの宛先に保持され得る。１２８ビットの固定小数点数に対処することは、場合により大幅に大きな固定小数点数に対処することよりもずっと素早い。
【０１６７】
ＦＰ数の積を精確に加算することも望ましく、我々の方法は、これを可能にするように容易に発展する。提案される命令は次のものである。
ＭＵＬ＿ＳＰ＿ｔｏ＿ＨＰＡ  Ｖｉ，Ｖａ，Ｓｎ，Ｓｍ
Ｖｉは、固定小数点結果を含み、この場合もやはり、Ｖａは、各レーンに対する境界情報を含むことになる。２つのＳＰ数ＳｎおよびＳｍは、丸めなしで乗算され、仮数部の完全な４８ビットの積を保持し、積指数の９ビットバイアス付き（２５５過剰）表現である新たな指数を計算する。２つのＳＰ数の積は１つのＳＰ数より大幅に大きくも大幅に小さくもなり得るため、余剰の指数ビットが提供される。変換は、ＣＶＴ＿ＳＰ＿ｔｏ＿ｆｉｘｅｄ命令と全く同じように起こり、積の２の補数を取り、その後各レーンに、固定小数点数が何らかの仮数ビットを有するかどうかをＶａに基づいて計算させ、仮数部の左側に符号ビット、そして右側にゼロで、残りのビットを満たす。
【０１６８】
提案された２つのＳＰ命令に加えて、２つの類似したＤＰ命令、または任意の他の浮動小数点形式のための命令が存在する。それらは同じ方法で機能するが、ＤＰ入力または積（より幅広の仮数部および指数）の解釈の仕方を知っている。固定小数点ベクトルのサイズは、ＤＰに対して大幅に高い場合がある。巨大な（表現可能より大きな）、またはとても小さな（表現可能より小さな）数を除外した方がいいかもしれない。関心のある主な事例に関する最大サイズは次の通りである。
【表９】
0006694880.tif 000011
「ｆｉｒｓｔ  ｂｉｔ」列は、いくつの可能性のある場所が仮数部の第１のビットを保持し得るかを示し、「ｆｒａｃ  ｂｉｔｓ」は、いくつの小数部ビットがその仮数部に続くかを示す（これらの数は積に関してより高い）。「ｌｅｎｇｔｈ」のフィールドは、単にｆｉｒｓｔ＿ｂｉｔ＋ｆｒａｃ＿ｂｉｔｓ＋１の和であり、これは、指定された入力に関する固定小数点形態のすべての数を保持するのに必要とされる最小の長さである。「６４−ｂｉｔ  ｗｏｒｄｓ」の列は、指定された入力に関する固定小数点形態のすべての数を保持するのに必要とされる６４ビットワードの最小の数である。
【０１６９】
行エントリは、ＤＰ（すべてのＤＰ数）、ＤＰ  ｐｒｏｄ（すべての可能なＤＰ積）、ＤＰ  ｐｒｏｄ  ｎｏｎｔｉｎｙ（ＤＰ最小非正規数未満のあらゆるビットを無視したすべての積）、およびＤＰ  ｐｒｏｄ  ｎｏｎｔｉｎｙ＋ｎｏｎｈｕｇｅ（ＤＰ非正規数未満またはＤＰ最大超のあらゆるビットを無視したすべての積）である。ＳＰの行は同様の説明を有する。関心をもっているビットを反映するように境界ベクトルＶａをただ調整することができるため、これらの関心のある事例のすべてに対して別々の命令は必要ない。
【０１７０】
プログラマは独自の境界を作成するであろうと考えられる。恐らく、２−５０よりも小さい積は、特定の計算には無関係である。こうした種類の事例は、単純に境界ベクトルＶａを調整することによって容易に管理される。
【０１７１】
図２１は、ＨＰＡデータ形式を有する値への浮動小数点値の変換の一例をより詳細に示す。変換が、同じ結果をもたらす図２１に示されるものとは異なる一連の動作で実装され得ることは理解されるであろう。図２１は、対応するアンカーベクトルＶａ［ｘ］に基づいてＨＰＡ値のデータベクトルの単一のデータ要素Ｖｉ１［ｘ］を生成するように実行されるステップを示すが、同じステップをベクトル内の他のデータ要素それぞれに対して実行してもよい。図２１に示されるように、ステップ１５０において、浮動小数点値の符号ビットＳが１である場合、（１の暗黙ビット（ｉｍｐｌｉｃｉｔ  ｂｉｔ）を含む）浮動小数点値の仮数部Ｆは、ステップ１５０において符号反転される。符号反転は、仮数部値Ｆの２の補数を見出すために、仮数部のビットを反転させ１を加算することによって実行され得る。代替的に、変換されたＨＰＡ値に加算が実行される予定であれる場合（例えば上記の図２０にあるように）、ステップ１５０において、仮数部Ｆを反転させて仮数部の１の補数を生成し、この段階では１を加算せず、後に加算を実行する際に加算器へのキャリー入力をアサートして、２の補数を完成させてもよい（１つの加算ステップを省略することにより、この手法はより素早いかもしれない）。いずれにしても、符号反転は、浮動小数点形式において、符号ビットが１である場合は仮数部のすべてのビットに負の重みが付けられるように、値が符号マグニチュード形式で表されるという事実の主な原因であり、一方ＨＰＡ形式では、ベクトルは２の補数値を表し、最大有効ビットが１であっても、それより低い有効度のビットすべてに正の重みが付けられる。
【０１７２】
その後、中間値１６２が、仮数部Ｆ、または符号反転ステップ１５０から生じる修正された仮数部−Ｆから形成される。仮数部Ｆまたは修正された仮数部−Ｆは、中間値１６２の最小有効部分に置かれ、中間値１６２の上位部分は、ある特定の数、Ｌｓｉｚｅの０を含み、Ｌｓｉｚｅは、ベクトルレーンサイズ（１つのデータ要素内のビット数）である。例えば、Ｌｓｉｚｅは、６４、１２８、または２５６ビットであり得る。その後、シフタ１６０が、次のように決定されるシフト量Ｌｓｈｉｆｔによって指示される場所の数だけ中間値１６２を左シフトする。
●Ｚ＞０およびＺ＜Ｌｓｉｚｅ＋Ｆｓｉｚｅである場合、Ｌｓｈｉｆｔ＝Ｚ＝Ｅ−Ｂ−Ｖａ［ｘ］＋１であり、式中、
○Ｅは、ＦＰ値のバイアス付き指数であり、
○Ｂは、ＦＰ値に対するバイアス量（例えば、ＤＰでは１０２３、ＳＰでは１２７）であり、
○Ｖｍ［ｘ］は、アンカー点値Ｖａから決定される、処理されているデータ要素の最小有効ビットの目標有効度であり、
○Ｌｓｉｚｅは、データ要素内のビット数（ベクトルレーンサイズ）であり、
○Ｆｓｉｚｅは、ＦＰ値の仮数部内のビット数である（暗黙ビットを含まない）。
●Ｚ≦０またはＺ＞Ｌｓｉｚｅ＋Ｆｓｉｚｅである場合、Ｌｓｈｉｆｔ＝０である。
【０１７３】
事実上、ＦＰ値の仮数部Ｆのビットのいずれもが、現在処理されているデータ要素のビットの有効度に対応する有効度を有しない場合、Ｌｓｈｉｆｔは０である。Ｌｓｈｉｆｔが非ゼロである場合、Ｌｓｈｉｆｔビット位置だけ中間値１６２を左シフトすることにより、ＦＰ仮数部の少なくとも一部が、ＨＰＡベクトルのデータ要素内にある対応する有効度のビットに対してマッピングされる。その後、データ要素Ｖｉ［ｘ］のＬｓｉｚｅビット値が、シフトの結果からの上位Ｌｓｉｚｅビットとして選択される。
【０１７４】
同じ動作をベクトルの他のデータ要素それぞれに対して同様の方法で実行して、各データ要素が浮動小数点値に対応する二進値のそれぞれの部分を表す、ＨＰＡ値の全体的なベクトルＶｉ１を生成することができる。
【０１７５】
ベクトルの最大有効データ要素に適用される処理に関しては、シフタ１６０により適用されるシフトが、仮数部Ｆのいずれかの非符号拡張ビットがシフト結果の最大有効ビットを超えてシフトアウトされることをもたらす場合、オーバーフロー条件の信号となる例外指示が生成され得、これは、浮動小数点値が指示されるメタデータを使用してＨＰＡベクトルによって表現され得るよりも大きかったことを示す。同様に、ベクトルの最小有効要素に適用される処理に関しては、浮動小数点値ＦＰのすべてのビットがその要素の最小有効ビットの有効度よりも小さい有効度を有する場合、アンダーフロー例外の信号が送られ得る。また、浮動小数点仮数部のビットの一部が、変換されたＨＰＡベクトルで表現されるが、他のビットがベクトルの最小有効ビットよりも低有効度であった場合、不正確例外の信号が送られ得る。これらの例外条件は、メタデータＶｍにおいて設定された有効度境界が、処理されている現在の浮動小数点値に対して不適切であったことの信号となり得る。
【０１７６】
図２１に示される変換動作は、浮動小数点値を対応するＨＰＡ値に変換するための専用の変換命令に応答して実行され得る。代替的に、変換は、何らかの演算も実行する演算命令に応答して実行されてもよい。例えば、加算または減算命令が、浮動小数点値を別のＨＰＡ値と加算もしくは減算する前にＨＰＡ形態に変換させてもよく、または乗算・変換命令が、２つの浮動小数点オペランドの乗算をトリガしてもよく、その後、浮動小数点形態におけるこれらのオペランドの積が、図Ｃ７に示される動作を使用してＨＰＡ値に変換されてもよい。
【０１７７】
同様に、ＨＰＡ数を浮動小数点数に変換することができる。ＳＰに対する基本的な命令は、
ＣＶＴ＿ＨＰＡ＿ｔｏ＿ＳＰ  Ｓｄ，Ｖｄ，Ｖａ
であり、ここで、Ｓｄは、宛先ＳＰ数であり、Ｖｄは、高精度固定小数点データを含むデータベクトルであり、Ｖａは、Ｖｄの各６４ビットレーンに関する境界情報を含むアンカーベクトルである。Ｖｄは、２の補数の数であり、Ｖｄのすべてのビットは、Ｖａの境界情報に基づく重みを有し、そのため、Ｖａの下位６４ビットワードが１００を含む場合、Ｖｄにおける下位ワードの下位ビットは重み１００を有し、次のビットは重み１０１を有するなどである。通常の場合では、Ｖａは、全面的にその下位６４ビットにおける基底値によって決定され、次に続く各６４ビットは６４異なる。したがってこの場合では、
Ｖａ＝＜…，２９６，２２８，１６４，１００＞
である。これらすべての値を有するようにベクトルＶａを提供する理由は、各６４ビットレーンがそのベクトルＶｄの部分を大域的な知識一切なしで解釈するからである。レーンがより大きなベクトル内のそれら自体の場所を「知って」いたら、基底値（この場合は１００）は、変換を完了するのに十分な情報を与えるであろう。
【０１７８】
基底値は、浮動小数点数の指数に正確に対応する。Ｖｄの下位ワードのビット６２で開始する仮数部を構築し、Ｖａは上記の通りであった場合、その仮数部に対応する指数は、全面的に仮数部位置（６２）および基底値（１００）によって決定される。ＳＰ数については、その指数は１００＋６２−２３＝１３９となる。この−２３は、ＳＰ値の小数部ビットの数に由来する。すべてのＳＰ数を表現することが望まれる場合では、高精度固定小数点数は２７８ビット長となり、その下位ビットは非正規数の下位ビットに対応することになる。第１の可能な正規の仮数部は指数１を有し、Ｖｄのビット［２３：０］に位置することになる。
【０１７９】
ＶｄをＳＰに変換するには、２つの基本的な方法、左から右または右から左がある。
【０１８０】
左から右への変換はより明快である。Ｖｄの最上位の第１のビットは符号ビットであり、それがＳＰ結果Ｓｄの符号となる。その後、第１の非符号ビット（符号が１である場合ゼロ、符号がゼロである場合１）を検索する。そのビットが仮数部の第１のビットとなり、それから次の２３ビットを小数部として、第２４番目のビットをガードビットとして、そして残りのビットすべての論理ＯＲをスティッキービットとして取る。指数は、第１の非符号ビットが見出されるレーンの重み（Ｗ）、第１の非符号ビットの場所（Ｌ）、およびＳＰ数における小数部ビットの数（２３）に基づいて計算され、Ｗ＋Ｌ−２３の指数が与えられる。指数計算がゼロ未満の値を返す場合、返される指数はゼロである。入力が負であり、最初のゼロが２４個以上のゼロの列の一部である場合、指数は１だけインクリメントされる。小数部は正の入力については変更されず、さもなければ小数部の２の補数が使用される。結果として得られる数は、丸めモード、小数部の最小有効ビット、ガード、そして最後にスティッキービットに基づいて、通常の方法で丸められる。倍精度では、動作は同じだが、より大きな仮数部および指数を用いる。
【０１８１】
図２２は、データベクトルＶｉおよびメタデータＶｍを用いてＨＰＡ値を浮動小数点値ＦＰに変換するために左から右への変換を使用する一例を示す。この場合もやはり、これは、スタンドアロンの変換命令、または何らかの演算のみならず変換も含む演算命令に応答して実行され得る。データベクトルＶｉの最大有効ビットは、浮動小数点値ＦＰの符号ビットＳに対して直接マッピングされる。
【０１８２】
浮動小数点値の仮数部Ｆを生成するために、一連の動作が次のように実行される。ベクトルの最大有効ビットが１である（すなわちＨＰＡ値が負である）場合、ステップ１７０において、修正されたベクトルＶｉ’をもたらすようにベクトルＶｉが符号反転される（反転および１の加算）。正値の場合、ベクトルＶｉは変更されない。故に、ベクトルＶｉ’は少なくとも１つの先行ゼロを有し、そのため正値を表す。ベクトルの最大有効要素から開始して、仮数部生成動作が要素毎に順次実行される。最大有効要素の処理レーンは、その要素内の第１の非符号ビット（すなわち、最初の１のビット値）を検索する。この例では、上位要素Ｖｉ［３］はいかなる非符号ビットも含まず、そのため処理は次のレーンＶｉ［２］に移る。
【０１８３】
要素Ｖｉ［２］の処理は、１の非符号ビットを識別し、非符号ビット１に先行するゼロの数を表す先行ゼロカウントＬＺＣを判定する。その後、部分的な仮数部が対応するデータ要素Ｖｉ［２］のｋビットから形成され、ここで、ｋ＝ｍｉｎ（Ｌｓｉｚｅ−ＬＺＣ，Ｆｓｉｚｅ）であり、式中、Ｌｓｉｚｅは、１つのデータ要素内のビット数であり、Ｆｓｉｚｅは、生成されるＦＰ値の仮数部内のビット数（暗黙ビットを含む）であり、ＬＺＣは、先行ゼロカウントである。ｋビットの部分的な仮数部値は、仮数部、ガードビットＧ、およびスティッキービットＳについて依然として得られるべき残りのビットの数の指示（Ｆｓｉｚｅ−ｋ）と一緒に出力される。Ｌｓｉｚｅ−ＬＺＣ＞Ｆｓｉｚｅである場合、ガードビットＧは、部分的な仮数部について取られたビットの１つ右側の場所の要素Ｖｉ［２］のビットに等しく、Ｌｓｉｚｅ−ＬＺＣ≦Ｆｓｉｚｅである場合、Ｇ＝０である。同様に、Ｌｓｉｚｅ−ＬＺＣ＞Ｆｓｉｚｅ＋１である場合、スティッキービットＳは、ガードビットＧの右側にある要素Ｖｉ［２］のあらゆるビットのビットＯＲに等しく、さもなければスティッキービットＳ＝０である。
【０１８４】
その後処理は要素Ｖｉ［１］に関する次のレーンに移り、ここで別の部分的な仮数部値が生成される。要素Ｖｉ［１］の上位部分が、前のレーンから出力された値Ｆｓｉｚｅ−ｋに対応して取られたビット数と共に、部分的な仮数部として選択される。このレーンはまた、ガードおよびスティッキービットＧ、Ｓの値を更新し、ガードビットＧは、部分的な仮数部について取られた最下位ビットの１つ右側の場所の要素Ｖｉ［１］のビットに等しく、スティッキービットＳは、ガードビットＧより低い有効度のあらゆるビットのビットＯＲに対応する。最小有効要素Ｖｉ［０］の処理レーンは、より上位のレーンからスティッキービットＳを受信し、要素Ｖｉ［０］のすべてのビットに前のレーンからのスティッキービットＳを論理和する（ＯＲｉｎｇ）ことによってそれを更新する。
【０１８５】
レーン２および１について生成された部分的な仮数部は、その後連結されて仮数部値Ｆを形成する。仮数部は、任意の所望の丸めモードを使用し、ガードおよびスティッキービットＧ、Ｓの値に基づいて丸められる。その後、浮動小数点値ＦＰに関する記憶された仮数部が、浮動小数点表現において暗黙的である丸められた仮数部の最大有効ビットを無視して、丸められた仮数部値から得られる。
【０１８６】
一方で、浮動小数点値のバイアス付き指数Ｅは、次のように決定され、
Ｅ＝Ｖａ［ｊ］＋Ｌｓｉｚｅ−ＬＺＣ＋Ｂ
式中、Ｖａ［ｊ］は、最大有効非符号ビットが見出されたデータ要素Ｖｉ［ｊ］の最小有効ビットの有効度（例えば、図２２に示される例において要素Ｖｉ［２］のアンカー点値によって指示される有効度）であり、Ｌｓｉｚｅは、１つのデータ要素内のビット数であり、ＬＺＣは、先行ゼロカウントであり、Ｂは、使用されている浮動小数点表現のバイアス値である。
【０１８７】
Ｆｓｉｚｅ＜Ｌｓｉｚｅである場合、図２２の例にあるように、多くても２つの隣接するデータ要素のみが、丸められていない仮数部Ｆに寄与するビット値を含むことができ、他のレーンは、符号ビットのみを含んだより高有効度のレーン、またはスティッキービットＳにのみ寄与するより低い有効度のレーンのいずれかになる。丸められていない仮数部は、レーン内の第１の非符号ビットの位置に応じて、もっぱら１つのレーン内のビット値から形成され得る可能性もある。しかしながら、Ｌｓｉｚｅ＜Ｆｓｉｚｅである場合、丸められていない仮数部に寄与するレーンがより多く存在し得る。
【０１８８】
図２２は、ＨＰＡ値の各データ要素を左から右へ順次処理する一例を示す。しかしながら、ベクトルサイズが大きくなるにつれて、これは比較的遅くなり得る。これは常に問題とはならないかもしれない。例えば、図２０に示される累算動作では、ＦＰからＨＰＡへの変換は、ＨＰＡからＦＰへの再変換より大幅に高頻度で発生し得る（ＦＰ−ＨＰＡ変換は各加算について発生するが、ＨＰＡ−ＦＰ変換は最終結果が生成された時点でしか発生しない）。しかしながら、処理を高速化することが所望される場合、いくつかのレーンで動作を並列に実行することが可能である。例えば、図１９に示される形態の処理回路が使用され得る。この場合では、各レーンが最も高い非符号ビットを検出し、部分的な仮数部をそれがベクトル全体中に最も高い非符号ビットを含むと仮定して生成してもよく、それから、処理回路が後に、第１の非符号ビットを実際に含むレーンからＦｓｉｚｅビットを得ることによって部分的な仮数部を組み合わせ、必要であれば次の下のレーンからＦｓｉｚｅ−ｋビットを得てもよい。
【０１８９】
最小有効要素がまず処理される、右から左への変換も可能である。Ｖｄ＝＜Ｄ４，Ｄ３，Ｄ２，Ｄ１，Ｄ０＞（これはあらゆるＳＰ数を保持するのに十分である）と想定し、Ｖａ＝＜２５６，１９２，１２８，６４，０＞とする。ＶａベクトルがＶｄソースに関する別の範囲を指定し得ることを思い返されたい。右から左への変換には２つの方法が使用され得る。
１．Ｄ０を保持するレーンが、ＳＰ数を、これら６４ビットのみが利用可能であるかのように、左から右への変換と同じアルゴリズムを使用し、しかし丸めまたは符号ベースの操作を一切行わずに計算する。返される値は、３５ビットベクトル＜ｓｉｇｎ，ｅｘｐｏｎｅｎｔ［７：０］，ｓｉｇｎｉｆｉｃａｎｄ［２３：０］，ｇｕａｒｄ，ｓｔｉｃｋｙ＞である。Ｄ１を保持するレーンは同じことを行うが、Ｄ０レーンによって生成されるデータにも注目する。Ｄ１レーンがすべて符号ビットである場合、Ｄ０結果が上位に渡される。さもなければ、新たなＳＰ数が、第１の非符号ビットの新たな場所に基づいて計算される。この新たな数の小数部ビットの一部はＤ０に由来し得るが、我々はそのレーンから返された３５ビットベクトルからのそれらのビットに関する情報を有する。新たな指数、符号、ガードおよびスティッキービットも計算される。このプロセスは、Ｄ２、それからＤ３について繰り返され、最後にＤ４レーンから返されたベクトルを丸めることによって終了する。ＤＰ変換は全く同じ方法で機能するが、より大きな指数および仮数部を有する。
２．第２の方法では、各Ｄｘブロックがその他とは独立して３５ビットベクトルを計算する。４つのＤｘブロックがハードウェア内に実装されているシステムでは、各３５ビットベクトルが、４つのＤｘブロックのセットに対して単一の３５ビットベクトルを計算する第２のブロックに出力される。この値が保持され、同様の様式で、次のデータビットセットの出力からの３５ビットベクトルと組み合わせられる。上記の例において、２５６ビットのＳｈｏｊｉエンジンを用いると、６４ビットチャンクＤ３〜Ｄ０は、第１の反復で処理され、各Ｄｘブロックが３５ビットベクトルをもたらし、最終的なベクトルがＤ３〜Ｄ０セットについて生成されることになる。第２のパスが、Ｄ４ブロック内のビットに対して別の３５ビットベクトルを生成し、第２のブロックが、このベクトルを、より下位のＤ３−Ｄ０ブロックからのベクトルと組み合わせて、最終的なベクトルを生成する。この最終的なベクトルは、指定またはデフォルトの丸めモードに従って丸められて、最終的な単精度結果をもたらすことになる。方法１と同じく、ＤＰ変換は同様に機能するが、その大きな指数および仮数部のために異なる実装形態を要するであろう。
【０１９０】
境界ベクトルが、可能性のある範囲を限定する値を含む場合は、２７８個の可能性のあるビットすべてにＳＰ数を生成させる必要はなく、同様に、境界ベクトルが範囲を限定する場合は、２０９９個の可能性のあるビットすべてにＤＰ数を生成させる必要はない。また、いくつかの数は、ＳＰまたはＤＰ数の範囲を超え得ることに留意されたい。これは、積和の変換時に特に起こり得るが、多くの大きな数を加算する際にも起こり得る。ＤＰまたはＳＰ最大値よりも大きな数は、通常の丸め変換（通常は無限大を返す）に従うべきであり、ＤＰまたはＳＰ最小非正規数よりも小さな数は、丸め前にスティッキービットを調整すべきである。これをサポートするために、オーバーフローを捕捉する手段が必要となり、一実施形態では、オーバーフロー条件を識別する単一のビットで十分であろう。
【０１９１】
高精度固定小数点和がその入力と異なる形式に変換されることを妨げるものは何もない。例えば、半精度および四倍精度（ｑｕａｄ−ｐｒｅｃｉｓｉｏｎ）（１２８ビット形式）は、いかなる想像可能な整数もしくは固定小数点形式または十進法浮動小数点形式も実装され得るのと同様に、上述のものと同じ方法を使用して実装され得る。
【０１９２】
装置は、演算動作を実行するための処理回路を有し得る。処理回路は、結果値の目標有効度を示すプログラム可能な有効度データに応答して、その目標有効度を有する結果値を生成し得る。これは、どの範囲の有効度が所与のアプリケーションに関する典型的なデータ値を収容すると予想されるか、例えば、地球上の温度センサによって測定されるデータが、センサの場所またはセンサの精度に応じて、比較的制限された値の範囲に限定される可能性が高いということを、実際にはプログラマが承知しているという認識を利用するものである。したがってプログラマは、予想される結果の有効度を指定するように、プログラム可能な有効度データを設定することができる。すると、処理回路は、結果のうちこれらの境界の外側の部分を計算する必要がなく、エネルギーが節約され、より素早い処理が提供される。
【０１９３】
例えば、プログラム可能な有効度データは、処理回路に、結果値を生成するために使用される少なくとも１つのオペランドの有効度とは独立して、目標有効度を有する結果値を生成させてもよい。故に、オペランドが、所与の演算動作の結果がプログラム可能な有効度データによって指示される有効度の外側になるべきであるような値を有する場合でも、不正確であり得ようとも指示された有効度を有する結果が依然として生成される。一部の場合では、結果値は、整数もしくは固定小数点データ値、または上述のＨＰＡ形式で表される値であってもよい。一部の例では、プログラム可能な有効度データは、結果値に関する少なくとも１つの有効度の境界を示す境界情報を含み得る。処理回路は、境界情報に応答して、少なくとも１つの有効度の境界内の有効度を有する結果値のビット値を判定してもよい。処理回路は、例えば例えば、処理を、結果値のうち指示された境界内の部分を判定することに限定してもよい。
【０１９４】
一部の例では、境界情報は、それぞれ結果値の最小有効ビットおよび最大有効ビットの有効度を示す、有効度下方境界および有効度上方境界のうちの少なくとも１つを示し得る。一部の場合では、下方境界と上方境界との両方が、境界情報によって明確に指示されてもよい。代替的に、これらのうちの１つが指示されてもよく、他方は、処理されている値のサイズ（長さ）から暗黙的であり得る。サイズは固定されている場合もあり、または境界情報において指定される可変サイズである場合もある。一部の例では、プログラム可能なデータによって指示される目標サイズは、ハードウェアでサポートされる値のサイズとは独立していてもよい。例えば、ハードウェアは、最大Ｎビットの結果値を並列に生成することしかできない場合がある。プログラム可能なサイズ情報がＮビットより大きなサイズを示す場合、演算動作は、ハードウェアの複数のパスにおいて実行されてもよい。サイズがＮビット未満である場合、ハードウェアのすべてが使用されるわけではないかもしれない。
【０１９５】
例えば、並列レーンの処理を実行するための処理ユニットが、処理回路内に提供されてもよく、プログラム可能な有効度データが、いくつのレーンが使用されるべきかを指定してもよい。プログラム可能な有効度データが、レーンのうちの１つの有効度を指示し、他のレーンの有効度が、この指示から判定されてもよい。代替的に、有効度は、各レーンにつき別々に表現されてもよく、これは、全体的なベクトル内のそのレーンの位置に関する「大域的な知識」を一切必要とすることなく、各レーンにそのレーンのデータ要素を処理させるために有用となり得る。
【０１９６】
別の例において、装置は、少なくとも１つのデータ記憶素子と、少なくとも１つの対応するデータ記憶素子に関するメタデータを記憶するためのメタデータ記憶素子とを有してもよい。メタデータ（例えば、上述のアンカー点値）は、対応するデータ記憶素子内に記憶されるデータ値の目標有効度および目標長を示してもよい。故に、メタデータは、データ記憶素子内に記憶されたいずれかの特定のデータ値よりもむしろ、記憶素子に関連付けられてもよい。データ記憶素子内に置かれるデータ値を生成する際、処理回路は、メタデータ記憶素子内の対応するメタデータを参照して、生成されるデータ値の有効度およびサイズを判定してもよい。これにより、処理回路が、メタデータにより指定された目標有効度およびサイズによって定義される枠内のビット値を生成するように、その処理を限定することが可能になる。
【０１９７】
かさねて、メタデータはプログラム可能であり得る。一部の場合では、メタデータ記憶素子は、データ記憶素子とは別々の記憶素子であってもよい。他の例では、メタデータ記憶素子は、対応するデータ記憶素子の一部を構成し得る。
【０１９８】
一部の場合では、１つのメタデータ記憶素子は、いくつかのデータ記憶素子がそれぞれ同じメタデータを共有するように、それらの間で共有されてもよい。データ記憶素子は、どのメタデータ記憶素子がそれと関連付けられるべきかを示すプログラム可能な値を含んでもよい。
【０１９９】
メタデータによって指示される目標サイズは、データ記憶素子自体の物理的サイズとは独立していてもよい。故に、メタデータは、データ記憶素子の記憶素子サイズより大きな目標サイズを指定してもよい。目標サイズがデータ記憶素子サイズより大きい場合、データ値は、いくつかのデータ記憶素子にまたがって記憶されてもよい。メタデータは、いくつのデータ記憶素子が同じデータ値の部分を表すかを指定する情報を含んでもよい。
【０２００】
メタデータはまた、対応するデータ記憶素子内でのデータ値の生成中に例外条件が生じたかどうかを示す例外情報、データ値が正か負かを示す符号情報、または、データ値の特徴、例えばそれがゼロ、無限大、もしくは非数であるかどうかなどを示す特徴情報といった、他の情報を表現してもよい。例えば、例外情報は、データ記憶素子内に記憶されるデータ値を生成するための演算動作の結果が、メタデータにおいて指示された目標有効度および長さを有する値を使用して表現可能であるよりも大きかった場合、オーバーフロー条件を指示してもよい。
【０２０１】
他の例では、装置は、浮動小数点値を、その浮動小数点値に対応する二進値のそれぞれのビット有効度部分を表す複数のデータ要素を含むベクトルに変換するための変換動作を実行するための処理回路を備えてもよい。これは、浮動小数点値自体を使用した浮動小数点演算よりも容易に並列化される、ベクトル形式を使用した演算をサポートするのに有用である。二進値をベクトル形態で表現することが有用であるのは、これにより、ベクトルのデータ要素の数に応じてハードウェアが実施する処理の量を見積もるためにハードウェアを処理することを可能にするフレームワークが提供されるからである。例えば、ベクトルは、上述のＨＰＡ形式を有し得る。ベクトルは、精度を向上させるために、浮動小数点値の仮数部よりも大きなビット数を有してもよい。
【０２０２】
変換動作は、処理回路が浮動小数点値および制御情報に基づいてベクトルの各データ要素に関する値を選択するように、プログラム可能な制御情報に応答してもよい。制御情報は、変換動作を行うために実行される命令内のパラメータとして、例えば、制御情報を記憶するレジスタを識別する中間値もしくはレジスタ指定子として指定されてもよいし、または制御レジスタなどの専用の場所に提供されてもよい。
【０２０３】
一例において、制御情報は、変換動作において生成されるベクトルのデータ要素によって表現されるビット有効度部分のうち少なくとも１つの有効度を指示してもよい。故に、ベクトルは、プログラム可能に選択される有効度の二進値を表現してもよい。一部の場合では、制御情報は、ベクトルの所定のデータ要素に関する有効度を指示してもよく、他の要素の有効度は、所定のデータ要素（例えば、既知のデータ要素サイズのインターバルのカウントアップ）の有効度に由来する。しかしながら、他の例は、各要素について有効度の別々の指示を提供し得る。これは、各ベクトルレーンがそのデータ要素の部分を他の要素と比較して考慮する必要がないように、ベクトル処理を簡略化するのに有用である。
【０２０４】
制御情報はまた、ベクトルのデータ要素の変数を指示してもよい。これは、データ要素の数を指定する明確なサイズ指示を用いて、または各レーンに対する有効度指示を使用することによって行うことができる。例えば、特定のデータ要素の有効度について指示される所定のビットパターンは、このデータ要素が現在の計算において使用されていないことの信号となり得る。
【０２０５】
制御情報は、変換されている浮動小数点値とは独立していてもよい。したがって、浮動小数点値の有効度または値に関係なく、浮動小数点値が、制御情報において指示される有効度および／またはサイズのベクトルによって正確に表現され得ない値を有する場合でも、この有効度およびサイズを有するベクトルが生成され得る。
【０２０６】
一部の実装形態は、ベクトルの要素を一度に１つだけ生成する処理回路を使用し得る。しかしながら、性能を向上させるために、処理回路は、ベクトルに対するデータ要素のうちの少なくとも２つを並列に生成するための処理ユニットを有してもよい。
【０２０７】
変換は、異なる方法で実行されてもよい。一例において、各データ要素に対し、処理回路は、浮動小数点値の指数と、そのデータ要素によって表現される二進値の部分の有効度とに基づいて、そのデータ要素に、浮動小数点値に基づいて選択されるビット値を投入すべきかどうかを判定し得る。例えば、一部のデータ要素は、浮動小数点仮数部のビットのいずれの有効度にも対応しない有効度を有する場合があり、その場合、これらの要素には、浮動小数点仮数部から選択されるいかなるビット値も投入されない。一例において、各データ要素に対し、処理回路は、浮動小数点値の仮数部に応じて初期値を形成し、その後その初期値を、浮動小数点値の指数と、そのデータ要素に関する制御情報によって指示される有効度とに依存するシフト量だけシフトさせてもよい。これにより、各処理レーンがいかなる他のレーンとも独立してそのデータ要素を生成することができる比較的単純な技術が提供され、これは、ベクトル処理の順次または並列いずれの実装形態をサポートするのにも有用である。その後、結果ベクトルを、各レーンについてシフタにより生成された値からアセンブルすることができる。シフト動作は、オーバーフロー、アンダーフロー、または、浮動小数点値に対応する二進値がメタデータにおいて指示された有効度またはサイズを有するベクトルによって正確に表現され得ないときの不精確条件を指示する例外情報を生成するのにも有用であり得る。そのような例外情報は、プログラマによって設定された有効度が変換されている浮動小数点値の現在値を処理するのに好適でないときをシステムが判定することを可能にし得る。
【０２０８】
概して、各データ要素は、２の補数値を含み得る（符号マグニチュード形態における浮動小数点値の仮数部に対するものとして）。したがって、浮動小数点値が負である場合、ベクトルの少なくとも１つのデータ要素が、浮動小数点値の仮数部に対して符号反転されている値と共に生成されるように、符号反転動作が変換動作中に実行されてもよい。これにより、ベクトルが浮動小数点値と同じ符号の値を表すことが確実となる。
【０２０９】
概して、処理回路は、変換のみを実行するためのスタンドアロンの変換命令、または演算動作を変換と組み合わせる演算命令であってもよい第１の命令に応答して、変換動作を実行し得る。例えば、演算命令に応答して、処理回路は、演算動作（例えば乗算）を行って結果の浮動小数点値を生成してもよく、この値はその後、変換動作中にベクトルに変換することができる。他の例では、変換をまず実行してもよく、その後、変換されたベクトルおよびさらなるベクトルに演算動作（例えば加算または減算）を適用してもよい。
【０２１０】
また、変換動作は、上述の形態のベクトルを、ベクトルのそれぞれのビット有効度部分によって表される二進値の代替的表現を表すスカラー値に変換するように実行されてもよい。例えば、スカラー値は、二進法もしくは十進法の浮動小数点値、整数値、または固定小数点値であってもよい。これにより、上述のベクトル形態が、必要に応じて外部表現可能な形式にマッピングし戻されることが可能になる。例えば、他のデバイスとの互換性に関して、内部処理に使用されるベクトル形式を固定小数点、整数、または浮動小数点形式に対してマッピングすることが有用であり得る。
【０２１１】
かさねて、ベクトル−スカラー変換動作は、プログラム可能な制御情報に応答して、ベクトルに従うスカラー値を生成してもよい。制御情報は、中間値もしくはレジスタ指定子によって命令内で指定されてもよいし、または固定制御レジスタ内に置かれてもよい。制御情報は、単一の値として、あるいは各要素につき別々に指定される複数の値として、ベクトルのデータ要素によって表現されるビット有効度部分の有効度を指示してもよい。制御情報はまた、ベクトルのデータ要素がいくつ存在するかを指定してもよい。これにより、ベクトルが可変サイズおよび有効度の二進値を表現することができるようにプログラマが制御情報を定義することが可能となる。ベクトルは、要素毎に順次、または、データ要素のうち少なくとも２つを並列に処理するように処理ユニットで並列に処理することができる。
【０２１２】
スカラーが整数または固定小数点値である場合、ベクトルのデータ要素の少なくとも一部に関して、処理回路は、制御情報によって指示される有効度に基づいて、スカラー値のビット部分に対応する有効度を有するデータ要素の１個以上のビットを選択し、その後、選択されたビットに基づいてスカラー値を形成してもよい。
【０２１３】
ベクトルを浮動小数点値に変換するために、処理回路は、ベクトルの最大有効非符号ビットの位置と、最大有効符号なしビットを有するベクトルのデータ要素に関する制御情報によって指示される有効度とに基づいて、指数を判定してもよい。浮動小数点値の仮数部は、ベクトルの要素のうち少なくとも１つに関する部分的な仮数部値を生成し、浮動小数点値の仮数部が各要素につき生成された部分的な仮数部値に基づいて形成されるように、仮数部生成動作を実行することによって生成されてもよい。例えば、所与のデータ要素に対する仮数部生成動作は、その要素が少なくとも１つの非符号ビットを有するかどうかを検出することと、そうであれば、部分的な仮数部値として、データ要素の最大有効非符号ビットと、最大有効符号なしビットの位置に応じて選択されるデータ要素の低有効度ビットの数とを出力することと、を含み得る。
【０２１４】
一部の実装形態では、仮数部生成動作は、処理を高速化するために、データ要素のうち少なくとも一部に対して並列に実行されてもよい。それから、各要素に対する結果が後に組み合わされて、全体的な仮数部を決定され得る。例えば、各処理レーンは、ベクトルのその要素がベクトル全体の最大有効非符号ビットを含むという仮定の上で、仮数部生成動作を実行してもよい。処理回路はその後、各レーンの結果が分かった時点で、どのレーンが最大有効非符号ビットを実際に含むかに基づいて浮動小数点値の仮数部を形成し得る。
【０２１５】
代替的に、有効生成動作は、要素のうち少なくとも一部に対して順次実行されてもよい。これは処理を簡略化し得、それは、少なくともいくつかのレーンに関しては、仮数部がもっぱら他のレーンについて生成された部分的な仮数部値から形成されることが既知であれば、部分的な仮数部を生成する必要がない場合があるからである。後の要素に対する仮数部生成動作は、必要な処理量を低減させるために、より前の要素に対する仮数部生成動作において生成された情報に依存し得る。一例において、仮数部生成動作は、ベクトルの最大有効要素から開始して最小有効要素で終わるように左から右へ順次実行されてもよい。この場合では、非符号ビットを有する最大有効要素が置かれるとき、その要素に対して生成された部分的な有効値が浮動小数点値の仮数部に必要な合計ビット数よりも少ないビットを有する場合、生成される残りのビットの数を指示する制御値が出力され得、これは、次の要素に対する仮数部生成動作において、必要な残りのビット数を選択するために使用され得る。これにより、各要素について完全な仮数部生成動作を実行する必要性が回避される。ベクトルの低有効度要素に関する処理レーンは、部分的な仮数部の生成を必要とするのではなく、むしろ、丸めに使用されるガード／スティッキービットなどの状態情報を単に更新するだけの場合がある。
【０２１６】
他の例では、仮数部生成動作は、最小有効部分から開始してベクトルのより高有効度の部分で終わるように右から左へ順次適用され得る。
【０２１７】
スカラー値が浮動小数点値を含み、ベクトルが負の二進値を表すとき、浮動小数点値の仮数部が、ベクトルの少なくとも一部に対して符号反転されている二進値を有するように、符号反転動作が変換動作中に実行されてもよい。これにより、ベクトル形式で表現された数の符号が保たれる。
【０２１８】
浮動小数点−ベクトル変換に関しては、ベクトル−スカラー変換が、専用の変換命令、または変換を演算動作と組み合わせる演算命令に応答して実行されてもよい。
【０２１９】
概して、変換は、本明細書で説明された高位値アンカー固定点（ＨＰＡ）形式を有する値と、ＨＰＡデータ値により表される二進値の代替的表現を提供する別のデータ値との間で、いずれの方向で実行されてもよい。
【０２２０】
本明細書に記載される少なくともいくつかの実施形態例において、演算回路の上流に配設された整合回路は、プログラム可能な有効度パラメータに従って１つ以上の入力オペランドを整合させるように、例えば、等しい有効度をもつ入力オペランドのビット位置が、演算回路の対応するビット入力に供給され、演算回路がその後、例えば、整数演算動作によって入力オペランドを処理し得るように、入力オペランドを整合させるように機能する。プログラム可能な有効度パラメータは、整合された結果値とは独立していてもよい（例えば、結果値は正規化されない）。むしろ、プログラム可能な有効度パラメータは、例えば結果値の有効度に従って、または入力オペランドの有効度に従って、別様に設定されてもよい。
【０２２１】
演算回路は、多様な異なる形態をとることができる。演算回路のいくつかの形態例は、整数加算器および／または整数乗算器を含む。他の形態の演算回路も可能である。
【０２２２】
入力オペランドが多様な異なる形態を有することができることは理解されるであろう。いくつかの実施形態例では、入力オペランドのうちの１つ以上が、浮動小数点入力オペランドであり得る。この場合、浮動小数点入力オペランドの指数値も、浮動小数点入力オペランドの仮数部値の整合をプログラム可能な有効度パラメータと指数値との両方に従って制御するために、整合回路に供給されてもよい。
【０２２３】
他の実施形態では、場合により、１つ以上の浮動小数点入力オペランドと組み合わせて、アンカー固定オペランドがまた、整合回路に対する入力として機能し得る。そのようなアンカー固定オペランドは、それ自体のプログラム可能な入力オペランド有効度を有し、整合回路は、このプログラム可能な入力オペランド有効度と、前述のプログラム可能な有効度パラメータとの両方に応答し得る。
【０２２４】
プログラム可能な入力オペランド有効度は、多様な異なる方法で指定され得る。いくつかの実施形態例では、プログラム可能な入力オペランド有効度は、有効度下方境界と有効度上方境界との間の範囲を指定するように機能する。これは例えば、境界値を直接指定すること、１つの境界値および幅を指定すること、１つの境界値と、それぞれ既知の幅をもつベクトルのコンポーネントの数とを指定することなどによって達成され得る。
【０２２５】
一部の実施形態では、プログラム可能な有効度パラメータは、入力オペランドの形態または相対的な有効度とは独立して、出力記憶素子に対して設定されてもよい。例えば、結果値が書き込まれる結果レジスタは、関連付けられたプログラム可能な有効度パラメータを有し得、入力オペランドは、結果レジスタの有効度に対応し、かつ未だ計算されていない結果値とは独立した有効度を有するために、演算回路の動作の前に整合回路により整合されている。
【０２２６】
他の実施形態例において、プログラム可能な有効度パラメータは、その代わりに、１つ以上の入力オペランドのうちのいずれかの最も高い有効度と一致するように、出力記憶素子に対して設定されてもよい。
【０２２７】
添付の図面を参照しながら本発明の例示的な実施形態を本明細書に詳細に記載してきたが、本発明はこれらの精確な実施形態に限定されないこと、そして、添付の特許請求の範囲によって定義される本発明の範囲および主旨から逸脱することなく様々な変更、追加、および修正が当業者によって本発明に行われ得ることを理解されたい。例えば、本発明の範囲から逸脱することなく、独立請求項の特徴と従属請求項との特徴の様々な組み合わせがなされ得る。
【図１】
0006694880.tif 000012
【図２】
0006694880.tif 000013
【図３】
0006694880.tif 000014
【図４】
0006694880.tif 000015
【図５】
0006694880.tif 000016
【図６】
0006694880.tif 000017
【図７】
0006694880.tif 000018
【図８】
0006694880.tif 000019
【図９】
0006694880.tif 000020
【図１０】
0006694880.tif 000021
【図１１】
0006694880.tif 000022
【図１２】
0006694880.tif 000023
【図１３】
0006694880.tif 000024
【図１４】
0006694880.tif 000025
【図１５】
0006694880.tif 000026
【図１６】
0006694880.tif 000027
【図１７】
0006694880.tif 000028
【図１８】
0006694880.tif 000029
【図１９】
0006694880.tif 000030
【図２０】
0006694880.tif 000031
【図２１】
0006694880.tif 000032
【図２２】
0006694880.tif 000033