前に述べたように、浮動小数点演算に関する問題は、計算が一般に非結合的であることであり、和が問題になることである。例えば、いくつかの浮動小数点値を加算するとき、別の値が前の加算の結果に加算されるたびに、結果は丸められ正規化され、それは、値が加算される順序によって、全体の結果が異なることを意味する。これは、和が正確に同じ順序で計算されない限り再現可能でないので、浮動小数点算術を並列化することを困難にする。再現性のある結果を生成するには、一連の加算又は減算が、一般に、順を追って実行されなければならず、それは、浮動小数点演算を比較的に遅くする可能性がある。
それゆえに、プログラマは、そのような異なる結果を避けることを目指して、必要とするよりも高い精度を使用する。それゆえに、プログラマは、和が正確に同じ順序で計算されない限り再現可能でないので、コードを容易に並列化することができない。
その問題は、プログラムが何百万もの値を加算する必要がある可能性がある高性能コンピューティング(HPC)では特に深刻である。プログラマはこれらの問題を並列化することを望むが、再現性の欠如がデバッグを困難にしている。すべての異なるマシン構成は、それらのマシンのための再プログラミングが完全に行われた場合でさえ、異なる答えをもたらすであろう。
上記のように、結合性の問題に対処しようとして、高精度アンカー固定(HPA)数と呼ばれる新しいデータタイプが提案された。HPA数は、長い2の補数整数i(例えば、200ビット)と、一般にiの最小ビットの有効桁を指定することによってiのビットの重みを表すより小さいアンカー整数aとからなるペア(i,a)である。ペアは、FP数の仮数及び指数値に多少類似しているが、長整数iが正規化されておらず、通常、FP仮数よりもはるかに大きい点で、及びアンカー値aが、HPA演算のすべてのオペランドに対して固定されている点で異なる。FP数の加算は、指数を変化させることがあるが、HPA数の加算はアンカーを変化させない。
自明な実例として、10ビットのiとアンカー値a=−4とからなるHPA表現を考える。この形式(format)でのいくつかの値が、表1に与えられている。
これらの数のうちの2つ、例えば、0.5及び1.5を加算する場合、アンカー(−4)は変化せず、和は、i値を単に加算することによって便利に与えられる。HPAの和は単に2の補数の加算であるので、範囲が十分である場合、HPAの和は結合的で、正確で、反復可能である。
FP数は大きい範囲を有する。倍精度数(FP64)は、2−1000よりも小さく、21000よりも大きくすることができるが、大部分の累積はこの範囲全体にまたがらない。実際は、その範囲のすべてわたる値を有意義に累積するという種類の問題を想像することは難しく、HPCの場合でさえ、大部分の累積は限られた範囲にわたって起こる。倍長精度演算よりも広いことを必要とするほとんどすべての用途にとって、200ビット程度が十分以上であると予想される。プログラマは、特定の和のためのデータのすべてが2100より小さい大きさを有し、2−50未満の大きさを有するビットが、有意義には和に影響を与えないはずであると決定すると仮定する。データが、200ビットのiを用い、HPA形式(i,−50)を使用して加算される場合、累積は結合的であり、これらの数のうちの少なくとも249は、オーバーフローを心配することなく任意の順序で加算することができる。
ほとんどの最新のアーキテクチャは、長整数を表すために使用することができるSIMD(単一命令多重データ)ユニットを有する。64ビット・レーン間の桁上げを容易にするための少しの追加の論理により、256ビットSIMDユニットを使用して256ビット整数を加算することができる。代替として、レーン間の桁上げは、後でより詳細に論じる冗長表現を使用することによって、大部分の加算では避けることができる。これらの方法は両方とも単一のSIMDレジスタ内に長整数を保持する。
しかしながら、HPA整数をそのようなSIMDユニット内で処理することができる効率は、SIMDユニットのベクトル幅に依存する。その結果、特定のSIMDユニットによって処理されるベクトル幅と無関係である、HPA数を扱うとき処理を必要とするものなどの長整数値の効率的な処理を可能にし、それゆえに、この技法を多種多様な異なるシステムで取り入れられることを可能にする機構を提供することが望ましい。
1つの実例の形成によれば、ベクトル・データ記憶要素のセットを有する装置が提供され、各ベクトル・データ記憶要素は、データ値を格納するための複数のセクションを提供する。複数のレーンが、ベクトル・データ記憶要素のセットを通って延び、その結果、各レーンが、各ベクトル・データ記憶要素からの対応セクションを含むと考えられる。記憶要素は、様々な形態をとることができるが、1つの実例の形成では、ベクトル・レジスタ・ファイルのベクトル・レジスタがある。
処理回路は、複数の部分を含む入力オペランド値に算術演算を実行するように構成される。算術演算は、複数の部分の各々に独立した算術演算を実行することによって実施され、複数の結果部分を含む結果値を作り出すことになる。
しかしながら、単一のベクトル・データ記憶要素内に結果値を格納するのではなく、代わりに、記憶回路が、複数のレーンのうちの選択されたレーン内に結果値を格納するように構成される。そのような手法によって、各結果部分は、次いで、選択されたレーンの対応セクション内の異なるベクトル記憶要素に格納される。
上述の技法によれば、結果値は、今後、複数のベクトル・データ記憶レジスタにわたって共通レーンに格納されることが分かる。これにより、多くの柔軟性が提供される。特に、結果値のサイズは、個々のベクトル・データ記憶要素の幅によって制約されず、代わりに、最大サイズは、セット内のベクトル・データ記憶要素の数によってのみ制限される。
さらに、そのような手法により、ベクトル・データ記憶要素の非効率的な利用が避けられる。特に、ベクトル・データ記憶要素のサイズと結果値のサイズとの間の不整合によって、ベクトル・データ記憶要素内のスペースを無駄にする必要がない。実際、1つの実例の形成では、多数の入力オペランド値の並列処理をSIMD方法で実行することができ、対応する結果値は関連するレーンに格納される。1つの実例の形成では、これは、個々のベクトル・データ記憶要素は、そのそれぞれのセクション内に多数の結果値の対応部分を格納することができ、各結果値は、それぞれのレーン内の多数のベクトル・データ記憶要素を通って延びることを意味する。
その結果、上述の方法で結果値を格納することによって、これは、入力オペランド値及び結果値の選ばれるサイズが装置により処理されるベクトルの幅によって制約されないという点で、著しくスケーラビリティを改善し、ベクトル長不依存の技法を提供することが分かる。
1つの実例では、処理回路は、独立した算術演算を実行するときにオペランド値の各部分を整数値として処理するように構成される。これにより、多数の入力オペランド値は、完全に結合的な方法で任意の順序で確実に処理することができる。
本明細書に記載の技法を使用して、任意の形態の整数値を処理することができる。しかしながら、1つの特定の実例では、入力オペランド値は、HPA数の長整数成分である。関連するアンカー値に関する情報を別々に維持することができ、次いで、同じアンカーを有する多数のHPA数の長整数オペランドを、上述の技法を使用して完全に結合的な方法で非常に効率的に処理することができる。
1つの実例では、処理回路は、処理回路が独立した算術演算を実行するたびに選択されたレーン内に結果値の結果部分のうちの1つを作り出すために、独立した算術演算を順を追って多数回実行するように構成される。独立した算術演算の順序づけは、所望に応じて変えることができる。例えば、1つの実例では、独立した算術演算は、部分の処理が、上位ビットを表すものから始めて低位ビットを表すものに進むように順序づけられてもよいが、代替として、独立した算術演算は、低位ビットに関連する部分が上位ビットに関連する部分の前に処理されるように逆の順序で処理されてもよい。実際、それらの部分によって表されるビットの有効桁によって規定される順序でそれらの部分を処理することも必要でない。
実行される算術演算は様々な形態をとることができる。しかしながら、1つの実例の形成では、処理回路は、複数の結果部分を含む結果値を作り出すために、入力オペランド値を、複数の部分を含む別のオペランド値と累積するための累積演算を算術演算として実行するように構成される。
そのような累積演算は、大量の数を一緒に加算する必要がある高性能コンピュータ環境では頻繁に必要とされており、その結果、上述の機構はそのような数を処理するために非常に効率的な技法を提供することができる。他のオペランド値は様々な形態をとることがあるが、1つの実施例では既存の結果値であり、処理回路は、累積演算を実行して、更新された結果値を生成し、それによって、選択されたレーンに格納されるべき結果値を形成するように構成される。
1つの実例では、記憶回路は、選択されたレーン内の多数のベクトル・データ記憶要素にわたって既存の結果値を格納し、累積演算を実行したときに処理回路によって生成された結果値の対応結果部分を既存の結果値の各部分に上書きするように構成することができる。その結果、多数の入力オペランドの対応部分を一緒に加算して累積結果部分を作り出すために、同じ独立した累積演算を繰り返して何回も実行することができる。次いで、そのプロセスを部分の各々に対して順番に繰り返して、多くの入力オペランド値の累積を表す結果値を作り出すことができる。さらに、前に述べたように、このプロセスを多数のレーンにわたって並列に繰り返すことができ、各レーンは異なる多入力オペランド値を処理し、それにより、多くの入力オペランド値を累積するための非常に高い性能技法が提供される。
1つの実例の形成では、処理回路は、アンカー値に基づいて入力オペランド値の各部分のビットの有効桁を識別するように構成される。そのような形成では、入力オペランド値はHPA数の長整数部分を表し、長整数は多数の部分に分割される。アンカー値が分かれば、処理回路は、次いで、各部分によって表されたビットの有効桁を決定することができる。この有効桁は、様々な方法で表すことができる。例えば、それは、各部分の最下位ビットの有効桁を識別することができる。
この有効桁情報を維持する方法は、実装に応じて変わることができる。1つの実例では、装置は、選択されたレーンのメタデータを保持するためのメタデータ記憶装置をさらに含み、メタデータは、入力オペランド値の各部分に対するメタデータ部分を含み、処理回路が入力オペランド値の各部分のビットの有効桁を識別できるようにする情報を提供する。
したがって、単に実例として、入力オペランド値が4つの部分を含む場合、選択されたレーンに関して保持されているメタデータは、4つの部分の各々に対してメタデータ部分を識別することになる。各独立した算術演算がそれらの部分のうちの1つに実行されるので、対応するメタデータ部分は、必要に応じてアクセスされ得る。
1つの実例では、処理回路は、提供された値及び対応するメタデータ部分から入力オペランド値の各部分を生成するための変換回路を含む。したがって、そのような実例では、提供された値を入力オペランド値に変換しようとするとき、関連するメタデータ部分が参照される。
1つの特定の実例では、提供された値は、浮動小数点値であり、各独立した算術演算に関連して、変換回路は、浮動小数点値及び対応するメタデータ部分から入力オペランド値の対応部分を生成するために使用される。特に、メタデータ部分は、入力オペランド値の対応部分に関連するビットの有効桁を識別することになるので、変換回路は、浮動小数点値から、もしあれば、浮動小数点値の仮数のどのビットを入力オペランド値の現在の部分内に表す必要があるかを決定し、それらのビットが、メタデータ部分によって提供された有効桁情報を考慮して、入力オペランド値の部分内の適切なビット位置に位置づけられるように準備をする。
1つの実例では、処理回路は、結果値の対応結果部分を作り出すために、入力オペランド値からの対応部分を、複数の部分を含む別のオペランド値の対応部分と累積するための独立した累積演算を独立した算術演算として行うように構成され、変換回路は、浮動小数点値と、対応部分に関連するメタデータ部分とから入力オペランド値の対応部分を生成するために、独立した累積演算の間、使用される。
したがって、そのような形成では、入力オペランド値の対応部分は、独立した累積演算の実行の間に変換回路によって「オンザフライで」生成され、その結果、次いで、別のオペランド値の対応部分に加算されて、結果値の対応結果部分を作り出すことができる。これにより、累積を実行するための非常に効率的な技法が提供される。
1つの実例では、入力オペランド値及び別のオペランド値の対応部分は、同じビット有効桁を有する。
入力オペランド値の多数の部分は、1つの実施例では、離散的で重複しない部分となるように構成することができる。しかしながら、1つの実例では、様々な部分は、いくつかのビットだけ重複するように構成される。特に、そのような実例では、入力オペランド値は、複数の部分を使用してPビット数値を表す冗長表現を有するMビット値を含むことができ、ここで、各部分はNビットを含み、M>P>Nである。処理回路は、アンカー値に基づいて冗長表現の各Nビット部分のビットの有効桁を識別するように構成することができ、少なくとも2つの隣接するNビット部分のグループ内で、グループの下位のNビット部分の複数の重複ビットは、グループの少なくとも1つの上位のNビット部分の複数の最下位ビットと同じ有効桁を有する。そのような手法によって、結果値のより重要なビットを表す次の部分へのオーバーフローの可能性を考慮する必要なしに、特定の部分に対して独立した算術演算の多数のインスタンスを実行することが可能である。代わりに、演算は、さらなる演算が重複ビットからのオーバーフローをもたらすことがあると評価される時点に達するまで続くことができる。その時点に、次いで、重複ビットで表されている情報を次の最上位結果部分に移動させるためのステップを行うことができ、その後、その部分の独立した処理を続けることができる。これにより、潜在的なオーバーフローを考慮する必要がある頻度を低減することによって著しく向上した性能が提供される。
1つの実施例では、処理回路は、提供された値を冗長表現を有する変換済みMビット・データ値に変換する変換演算を実行するための変換回路を含む。1つの特定の実例では、前に論じたように、変換回路は、関連するNビット部分に関連してオンザフライで変換を実行することができ、その結果、関連するNビット部分は、提供された値(例えば、浮動小数点値)から作り出され、次いで、関連する独立した算術演算によって処理されて結果部分を作り出す。
前に述べたように、メタデータ記憶装置を使用して、選択されたレーンのメタデータを保持することができる。入力オペランド値が冗長表現を有する上述の実例では、メタデータは、入力オペランド値の各Nビット部分に対するメタデータ部分を含み、処理回路が各Nビット部分のビットの有効桁と各Nビット部分のいくつかの重複ビットとを識別できるようにする情報を提供することができる。所望ならば、例えば、当該の部分が、入力オペランド値の最下位ビット、入力オペランド値の最上位ビットを表しているか、又は中間部分であるかを識別するために、他の情報が、さらに、メタデータ内に含まれてもよい。
前に述べたように、冗長表現を使用すると、オーバーフローの可能性への配慮が必要になる前、独立した算術演算の多数の繰返しを部分に実行することができる。しかしながら、潜在的なオーバーフロー状態が近づいていると決定されると、処理回路は、1つの実例では、冗長表現を有する第1のMビット値に重複削減演算を実行して、冗長表現を有する第2のMビット値を生成するように構成することができ、第2のMビット値の少なくとも1つのNビット部分の重複ビットは、第1のMビット値の少なくとも1つの対応するNビット部分の重複ビットよりも小さい大きさを表す。後続の加算の間のさらなる桁上げを収容するためにより多くの余地があるように重複ビットの所与のセットをゼロまで低減することによって、部分間のオーバーフローの機会が低減される。
重複削減演算は、いくつかの実例では、冗長表現の第1のMビット値の1つ又は複数のNビット部分から第1のMビット値の1つ又は複数の後続の部分に重複ビットを伝搬させて、冗長表現を有する第2のMビット値を生成するための重複伝搬演算とすることができる。第2のMビット値は、第1のMビット値と同じPビット数値を表すが、異なるパターンの重複ビットを使用する。重複削減を達成するために重複伝搬演算を使用することには、重複削減で削減された重複ビットの値を保存するために追加レジスタが必要とされないという利点がある。重複ビットの値を次の部分に伝搬させることによって、次の部分内の重複していないビットは、前の部分の重複ビットによって表された値と同じ値を保存するように調節されて、さらなる演算が冗長的に表された第2のMビット値に実行されるとき、より多くの桁上げを収容するために前の部分の重複ビットの空間を解放することができる。
重複伝搬演算は、様々な方法で実行することができる。1つの実例では、重複伝搬演算は、すべての重複ビットがゼロに等しい第2のMビット値に第1のMビット値を変換するようなものである。
前に述べたように、上述の技法は、多数のレーン内に複製されて、多数の入力オペランド値の処理のための非常に高い性能の機構を生じさせることができる。特に、1つのそのような実例では、処理回路は、複数の選択されたレーンの各々に対して複製され、入力オペランド値が、前記複数の選択されたレーンの各々に提供され、複数の入力オペランド値の各々は複数の部分を含み、各独立した算術演算が、複数の選択されたレーンにわたって並列に実行されて、各々が複数の結果部分を含む複数の結果値を作り出すように構成される。記憶回路は、複数の選択されたレーンのうちの対応する選択されたレーン内に複数の結果値の各々を格納するように構成され、その結果、各結果値の対応結果部分は、同じベクトル・データ記憶要素の対応セクションに格納される。
使用されるレーンの数は所望に応じて変更することができるが、1つの実例では、すべてのレーンを利用することができ、その結果、多数のベクトル・データ記憶要素内の記憶空間全体をプロセスの間利用することができる。単に実例として、各オペランド値が3つの部分を有する場合、3つのベクトル・データ記憶要素が多数の結果値の結果部分を保持するために指定され、各レジスタがそれらの結果値の対応部分を格納してもよい。ベクトル・データ記憶要素の幅が、例えば、16個のレーンを設けることができるようなものである場合、これにより、16個の入力オペランド値に並列に演算を実行することが可能になり、関連する結果値は、関連するレーン内に格納されて、3つのベクトル・データ記憶要素にわたって分配される。
そのような形成では、メタデータ記憶装置は、選択されたレーンごとにメタデータを保持するように構成することができ、メタデータは、対応する入力オペランド値の各部分に対するメタデータ部分を含み、処理回路が、対応する入力オペランド値の各部分のビットの有効桁を識別できるようにする情報を提供する。任意の特定のレーン内で、処理されたオペランド値は、一般に、同じ有効桁を有するように構成されることになる。所望ならば、異なるレーンは、他のレーンによって処理されたオペランド値には、異なる有効桁を有するオペランド値で演算することができる。しかしながら、1つの実例では、複数の選択されたレーンに関連する複数の入力オペランド値の対応部分は、同じビット有効桁を有し、メタデータは選択されたレーンごとに複製される。そのような手法によって、同じ有効桁を有する多数の入力オペランド値は、多数のレーンを使用して並列に処理することができ、同じメタデータがレーンのすべてにわたって使用される。
そのような手法の結果として、レーンにわたって並列に算術演算を実行すると、関連する結果部分を有する多数の結果値が生成されることになることが理解されよう。その場合、それらの結果値の各々の対応結果部分は同じ有効桁を有することになる。
所望のとき、1つの実施例では、処理回路は、次いで削減演算を実行して多数の結果値を単一の結果値に結合させるようにさらに構成することができる。多数の結果値の対応部分は同じ有効桁を有するので、そのような演算は、それらの多数の結果値から単一の結果値を作り出すために容易に実行することができる。所望ならば、次いで、その単一の結果値は、別の形態に変換することができ、例えば、1つ又は複数の浮動小数点値に変換し直すことができる。そのような変換を実行して浮動小数点形式に戻すことによって、アンカー情報を別々に維持する必要がなく、それにより、値をメモリに格納し直すことができる。
次に、図を参照して特定の実例を説明する。
高精度アンカー(HPA)形式を以下で論じる。HPA形式に関するさらに多くの情報は、米国特許出願第62/074,149号、第14/582,974号、第14/582,875号、第14/582,812号、第14/582,836号、第14/582,978号、第14/606,510号、及び第14/582,968号に見いだすことができ、それらの内容は、参照によりその全体が本明細書に組み込まれる。
浮動小数点数
浮動小数点(FP)は、少数のビットを使用して実数を近似する有用な方法である。IEEE 754−2008 FP規格は、FP数のための多数の異なる形式を提案しており、それらのうちのいくつかは、2進数64(倍精度又はDPとしても知られている)、2進数32(単精度又はSPとしても知られている)、及び2進数16(半精度又はHPとしても知られている)である。数字64、32、及び16は、各形式で必要とされるビット数を指す。
表現
FP数は、科学の授業で教えられる「科学的記数法」に完全に似ており、ここで、マイナス200万の代わりに、−2.0×106と書く。この数の部分は、符号(この場合は負)、仮数(2.0)、指数の底(10)、及び指数(6)である。これらの部分はすべてFP数では類似形を有しているが、違いがあり、その最も重要なことは、構成部分が2進数で格納され、指数の底が常に2であることである。
より正確には、FP数は、符号ビット、いくつかの数のバイアスされた指数ビット、及びいくつかの数の小数ビットからなる。特に、DP、SP、及びHP形式は、以下のビットからなる。
符号は、負数では1、正数では0である。0を含むすべての数には符号がある。
指数はバイアスされ、それは、真の指数が、数に格納されているものと異なることを意味する。例えば、バイアスされたSP指数は、8ビット長であり、0から255の範囲である。指数0及び255は特殊な場合であるが、すべての他の指数はバイアス127を有し、それは、真の指数が、バイアスされた指数よりも127小さいことを意味する。最小のバイアスされた指数は1であり、これは、真の指数−126に対応する。最大のバイアスされた指数は254であり、それは真の指数127に対応する。HP及びDPの指数は同じように機能し、バイアスは上記の表に示されている。
SPの指数255(又はDPの指数2047、又はHPの指数31)は、NaN(数ではない)と呼ばれる無限大及び特殊記号のために予約されている。無限大(正又は負であり得る)は、ゼロの小数を有する。指数255及び非ゼロ小数をもついかなる数もNaNである。無限大は飽和値を提供し、そこで、それは、実際には、「この計算は、この形式で表すことができるものよりも大きい数をもたらした」のようなことを意味する。NaNは、実数に対して数学的に定義されていない演算、例えば、ゼロでの除算、又は負の数の平方根をとることに対して返される。
指数ゼロは、形式のいずれにおいても、非正規数及びゼロのために予約されている。正規数は、値の−1sign×1.fraction×2eを表し、ここで、eはバイアスされた指数から計算された真の指数である。1.fractionという用語は仮数と呼ばれ、1はFP数の一部として格納されないが、代わりに指数から推測される。ゼロ及び最大指数を除くすべての指数は、1.fractionの形態の仮数を示す。指数ゼロは、0.fractionという形態の仮数、及び所与の形式の1−biasに等しい真の指数を示す。そのような数は非正規(subnormal)と呼ばれる(歴史的に、これらの数は非正規(denormal)と呼ばれていたが、最近の用法では非正規(subnormal)という用語が好まれる)。
指数と小数の両方がゼロに等しい数はゼロである。
以下の表は、HP形式のいくつかの例示の数を有する。エントリは2進数であり、読みやすくするために「_」文字が追加されている。非正規エントリ(指数部がゼロである表の4行目)は、前の行の正規エントリと異なる仮数を生成することに注目されたい。
FP実装の複雑さの大部分は非正規に起因しており、それゆえに、非正規は、多くの場合、マイクロコード又はソフトウェアによって処理される。一部のプロセッサは、非正規をハードウェアで処理し、ソフトウェア又はマイクロコードの実施と比較して、これらの演算を10倍から100倍高速化する。
整数、固定小数点、浮動小数点
FPの符号処理方法は符号絶対値と呼ばれ、それは、整数がコンピュータに格納される通常の方法(2の補数)とは異なる。符号絶対値表現では、同じ数の正と負のバージョンは、符号ビットにおいてのみ異なる。符号ビットと3つの仮数ビットからなる4ビットの符号絶対値整数は、
+1=0001
−1=1001
としてプラス1及びマイナス1を表すことになる。
2の補数表現では、nビット整数iは、2進数n+1ビット値2n+iの下位nビットによって表され、そこで、4ビットの2の補数整数は、プラス1及びマイナス1を、
1=0001
−1=1111
として表すことになる。
2の補数形式は、コンピュータ算術を簡易化するので、符号付き整数では事実上普遍的である。
固定小数点数は、全く整数のように見えるが、実際には、特定の数の小数ビットを有する値を表す。センサ・データは、多くの場合、固定小数点形式であり、FPが広く採用される前に書かれた多量の固定小数点ソフトウェアが存在する。固定小数点数は、プログラマが「2進小数点」、すなわち数の整数部と小数部との間の分離記号を把握しなければならず、さらに、正しい場所にビットを保つために数を絶えずシフトしなければならないので、作業するのが全く冗長である。FP数にはこの難点がなく、そこで、固定小数点数とFP数との間で変換できることが望ましい。変換を行うことができるということは、固定小数点のソフトウェア及びデータを依然として使用できるが、新しいソフトウェアを書くときに固定小数点に限定されないことも意味する。
FP数の丸め
ほとんどのFP演算は、演算が無限の範囲と精度で行われたかのように計算され、次いで、FP数に収まるように丸められることをIEEE−754規格によって要求されている。計算がFP数と正確に一致する場合、その値は常に返されるが、通常、計算は2つの連続する浮動小数点数の間に位置する値をもたらす。丸めは、2つの連続する数のうちのどちらが返されるべきかを選ぶプロセスである。
丸めモードと呼ばれるいくつかの丸めの方法がありこれらのうちの6つは以下の通りである。
この定義は、実際の方法でどのように丸めるかを教えていない。1つの一般の実施態様は、演算を行い、切捨て値(すなわち、FP形式に収まる値)並びに残りのすべてのビットを調べ、次いで、特定の条件が当てはまる場合切り捨てられる値を調節することである。これらの計算はすべて以下に基づく。
L−(最小)切捨て値の最下位ビット
G−(ガード)次の最上位ビット(すなわち、切捨てに含まれない最初のビット)
S−(スティッキー)切捨ての部分ではないすべての残りのビットの論理和
これらの3つの値及び切捨て値が与えられると、以下の表に従って、正しく丸められた値を常に計算することができる。
例えば、2つの4ビット仮数を乗算し、次いで、4ビットの仮数に丸めることを考える。
sig1=1011(10進数11)
sig2=0111(10進数7)
乗算は、
sig1×sig2=1001_101(10進数77)
L Gss
をもたらす。
切り捨てられた4ビットの結果の最下位ビットはLとラベル付けされ、次のビットはGとラベル付けされ、Sはsとラベル付けされた残りのビットの論理和(すなわち、S=0|1=1)である。丸めるために、丸めモード及び上記の表の計算に従って、4ビットの結果(1001)を調節する。そこで、例えば、RNA丸めでは、Gが設定され、そこで、1001+1=1010を返す。RX丸めでは、G|Sは真であり、そこで、Lを1に設定し(それは既に1であり、そこで、この場合、何も変わらない)、1001を返す。
整数及び固定小数点数の丸め
FP数を整数又は固定小数点に変換する場合、同様に丸める。概念は、基本的に、FPの丸めと同じである。偶然にも整数であるFP数は、常にその整数に丸められる。すべての他のFP数は2つの連続する整数の間にあり、丸めはどの整数が戻されるかを規定する。残念ながら、整数の丸め論理は、2の補数と符号絶対値形態との間の差異のために、若干難しくなる。符号絶対値数をインクリメントすると、常に大きさが増加するので、そこで、インクリメントされた数はゼロからさらに離れる。同じことが正の2の補数にも起こるが、負の2の補数はインクリメントされるとゼロに近くなる。これは、整数が正であるか負であるかに基づいて丸め論理が変更されなければならないことを意味する。それはまた基底値(インクリメントされるか又はされない値)を選ぶ際に注意しなければならないことを意味する。正の整数では、その値は単に切り捨てられたFPの仮数であり、そこで、1.37は、1の基底値と、1又は2のいずれかの結果とを有することになる。負の整数では、この場合もやはり仮数を切り捨て、その結果の1の補数(1の補数は、元の数のすべてのビットを反転したものである)を取り、−1.37は1に切り捨てられ、次いで反転され、−2の基底値が与えられる。次いで、結果を−2又は(インクリメントされる場合)−1のいずれかにしたいので、すべてが良い結果となる。
さらに複雑なこととして、この変換の方法は、負の整数ではL、G、及びSを見いだすために若干の計算を必要とする。正確な丸めには、2の補数プロセスを完了し(反転及び1の加算)、次いで、L、G、及びSを計算することが必要とされるが、その1の加算は、単に反転することと比べて遅い。理想的には、元のシフトされた入力から実際のL、G、及びSを計算したい(すなわち、符号について何かを行う前の入力から。そのため、浮動小数点1.37又は−1.37は両方とも整数1へと右にシフトされることになる)。
L0、G0、及びS0を反転の前の最下位ビット(lsb)、ガード、及びスティッキーとし、Li、Gi、及びSiを反転の後のガード、及びスティッキーとし、最後に、L、G、及びSを反転及び1の加算の後のlsb、ガード、及びスティッキーとする。
S0がゼロである場合、Siに寄与するビットはすべて1であり、したがって、S(それらのSiビットに1を加算して得られる)もゼロである。S0が非ゼロである場合、Siはすべてが1ではなく、したがって、Sは非ゼロである。そこで、すべての場合にS0=Sである。
G0がゼロである場合、Giは1であり、Gはまた、S0がゼロである場合にのみ起こるSビットからの桁上げイン(carry−in)が存在する場合を除いて、1である。G0が1である場合、Giはゼロであり、この場合もやはり、Gはまた、S0がゼロである場合にのみ起こるSビットからの桁上げインが存在する場合を除いて、1である。そこで、G=G0^S0である。
非常に似た論理によって、L=L0^(G0|S0)である。
いまや負の整数と正の整数の両方に対するL、G、及びSがあるので、丸め規則を考え出すことができる。
固定小数点数は、整数と全く同じ方法で丸められる。符号なしの変換(整数又は固定小数点への)に関する規則は、正の変換に関する規則と同じである。
注入丸め
丸めを行うためのより速い方法は、ほぼすべてのFP演算の一部である仮数加算の一部として丸め定数を注入することである。これがどのように機能するかを調べるために、ドル及びセントの数を加算し、次いで、ドルに丸めることを考える。加算の場合、
である。
和3.62ドルは3ドルよりも4ドルに近く、そこで、最近接丸めモードのいずれも4ドルを返すべきであることが分かる。2進数で数を表した場合、前のセクションからのL、G、S方法を使用して同じ結果に達することができる。しかし、50セントだけ加算し、次いで、結果を切り捨てると仮定する。
和(4.12ドル)から金額(4ドル)をちょうど返した場合、RNA丸めモードを使用して正しく丸めている。0.50ドルの代わりに0.99ドルを加算した場合、RP丸めを使用して正しく丸めることになる。RNEはわずかに複雑であり、0.50ドルを加算し、切り捨て、次いで、残りのセントを調べる。残っているセントが非ゼロである場合、切り捨てられた結果は正しい。ゼロセントが残っている場合、注入前に2ドルの金額のちょうど中間にあり、そこで、偶数ドルの金額を選ぶ。2進FPでは、これはドル金額の最下位ビットをゼロに設定することになる。
3つの数の加算は2つの数の加算よりもわずかに遅いだけであり、そこで、2つの仮数を加算し、L、G、及びSを検査し、次いで、丸めモードに従って結果をインクリメントした場合よりも、注入丸めの使用によって、大幅に速く丸め結果を得る。
注入丸めの実装
FPでは、丸め注入は、3つの異なる値のうちの1つであり、これらの値は、丸めモードと、(時には)結果の符号とに依存する。
RNAとRNEの両方は、Gの位置に1を注入することを必要とする(これはドル及びセントの実例では0.50ドルを加算するようなものである)。
RP及びRMの丸めは、符号並びにモードに依存する。RPは、正の結果を丸める(仮数の大きさを正の無限大に向かって増加させる)が、負の結果を切り捨てる(正の無限大により近い仮数を選ぶ)。同様に、RMは負の結果を切り上げる(仮数の大きさを負の無限大に向かって増加させる)が、正の結果を切り捨てる(負の無限大により近い仮数を選ぶ)。このように、RM及びRPは、2つの場合、すなわち、符号が丸め方向に一致するときに切り上げる(RU)と、符号が丸め注入と異なるときに切り捨てる(RZ)とに分けられる。RUの場合には、Gビットの位置と、Sに論理的に寄与するすべての位置とに1を注入する(これは、ドル及びセントの実例では0.99ドルを加算するようなものである)。
RZモード及びRXモードでは、並びにRZモードに変わるRPモード及びRMモードでは、ゼロを注入する。
丸めモードの大部分では、丸め注入を加算し、次いで、切り捨てると、正しく丸められた結果が与えられる。2つの例外は、RNE及びRXであり、これらは、加算の後G及びSを検査することを必要とする。RNEでは、G及びSが両方ともゼロである場合、Lを0に設定する。RXでは、G又はSが非ゼロである場合、Lを1に設定する。
FP数は実数ではない
FP数は実数と同様であると考えたくなるが、FP数は、最も基本的な特性についてでさえ基本的に異なる。
FP数は結合的ではない。例えば、SPでは、3つの数を加算し、100万又は0を返すことがあり、おそらく人々が丸め誤差と考えるものではない。
(245+−245)+220=220
245+(−245+220)=0
FP数は分配法則に従わない。再びSPでは、
3,000,001*(4.00001+5.00001)=0x4bcdfe83
(3,000,001*4.00001)+(3,000,001*5.00001)=0x4bcdfe82
であり、オーバーフローがある状態では、事態はより悪化する。
250*(278−277)=2127
(250*278)−(250*277)=無限大
いくつかの実施態様では、FP数は、一般に、nanA+nanB!=nanB+nanAであるので、デフォルトのNaNモード(すべてのNaNを単一のNaNに変換するモード)でない限り、可換でさえない。数値の加算及び乗算は可換である。
IEEE NaN規則のために、乗法的単位元又は加法的単位元は存在しない。1及びゼロが、数値の単位元として機能する。
FP数について考える1つの有用な方法は、FP数を、せいぜい2、3個(DPでは53個)の連続したビットが非ゼロであり得る非常に長い固定小数点数であると考えることである。例えば、無限でないDP数は、2046桁のいずれかに仮数の最初のビットを有することができその最初のビットに52個の他の仮数ビットが続き、そして符号ビットがあり、そこで、いかなる有限のDP数も、2046+52+1=2099ビットの固定小数点数として表すことができる。この方法で検査すると、2つのFP数の加算は、一般に、別のFP数をもたらさないことが非常に明白になり、加算の結果は、FP数になるように丸められる必要がある。
浮動小数点(FP)演算に関する既知の問題は、計算が非結合的であることであり、和が問題になることである。
・プログラマは、3つの数を加算する場合でさえ、大きく異なる結果について心配する必要がある。
・プログラマは、大きく異なる結果を避けることを希望して、必要以上に広い形式を使用する。
・プログラマは、正確に同じ順序で計算されない限り和が再現可能でないので、コードを簡単に並列化することができない。
例えば、単精度では、
220+(−244+244)=220
であるが、
(220+−244)+244=0
である。
演算が実行される順序によって、結果は100万又はゼロである。これは、指数が24だけ異なるので、極端な実例であるが、指数が1だけ異なる場合、又は指数のすべてが同じであり、4つ以上のものを加算する場合でも、異なる答えを得ることがある。Cプログラミング言語は、和が左から右へ順番に評価されることを要求することによって再現性問題に対処するが、これは正確性に対しては何の効果もなく、並列化を不可能にする。
この問題は、プログラムが何百万のものを加算する必要があり得る高性能コンピューティング(HPC)にとって特に深刻である。プログラマはこれらの問題を並列化することを望むが、再現性の欠如が、デバッグを通常よりもさらに困難にする。異なる構成のマシンは、それらのマシンの再プログラミングが完璧に行われた場合でさえ、異なる答えを生成することになる。
HPA表現
プログラマの選択可能な範囲で浮動小数点(FP)数の速くて正確な累積を可能にする新しいデータタイプが開示されている。ほとんどの問題に適合する適度の範囲では、累積は、FP加算よりも速く、結合的である。結合的な加算は、依然として再現可能で正しい結果を与えながら問題を並列化することを可能にし、例えば、既存のハードウェアと比較して100倍以上の高速化を可能にする。これらの利点は、高性能コンピューティング(HPC)空間では非常に魅力的であり、多くの非HPCアプリケーションにとって注目せずにはいられないものとなると考えられる。
図1は、プログラム命令の制御下でデータ処理動作を実行するためのデータ処理装置2を概略的に示す。データ処理装置2は、プログラム命令6及び処理されるべきデータ8を格納するメモリ4を含む。プロセッサ・コア10は、メモリ4に結合され、レジスタ・バンク12、処理回路14、命令フェッチ・ユニット16、命令パイプライン・ユニット18、及び命令デコーダ20を含む。実際には、データ処理システム2は、多くの追加の要素を含むことがあり、図1の表現は理解を助けるために簡略化されていることが理解されよう。動作中、プログラム命令6は、命令フェッチ・ユニット16によってメモリ4から取り出され、命令パイプライン18に供給される。プログラム命令が命令パイプライン18内の適切な段階に達すると、プログラム命令は、命令デコーダ20によって復号され、復号されたプログラム命令によって指定された処理動作を実行するように、レジスタ・バンク12及び処理回路14の動作を制御する働きをする制御信号を生成する。多数の入力オペランドが、レジスタ・バンク12から読み出され、処理回路14に供給され、操作され、次いで、結果値がレジスタ・バンク12に書き戻される。
レジスタ・バンク12は、様々な異なる形態を有することができる。操作されるべきオペランドは、例えば、浮動小数点オペランド、固定小数点オペランド、整数オペランド、及びHPA数オペランド又はRHPA数オペランド(後述されるような)を含むことができる。レジスタ・バンク12は、レジスタ・バンク12の構成に応じてこれらのタイプのオペランドの混合物を格納するように働くことができる。オペランドは、それらの形式によって事前定義され得るように、又はHPA数オペランドに関して後述するようなレジスタに関連するメタデータを使用してプログラム可能に指定され得るように、異なる精度レベルを有することができる。
図1に示すように、レジスタ・バンク12は、レジスタ・バンク12の対応するデータレジスタに格納されたHPA値又はRHPA値に関連するメタデータを指定するためのメタデータ・レジスタ22を含むことができる(メタデータの内容の実例が以下で与えられる)。ある場合には、各データレジスタは、対応するメタデータ・レジスタ22を有することができ、一方、他の場合には、2つ以上のデータレジスタが、単一のメタデータ・レジスタ22によって指定されたメタデータを共有することができる。
図2は、浮動小数点オペランドを概略的に示す。浮動小数点オペランドは、符号、指数、及び仮数から形成される。浮動小数点オペランドは、指数値によって示される多種多様な大きさをもつ値を表すことができる。数が表すことができる精度は、仮数のサイズによって制限される。浮動小数点演算は、一般に、整数演算よりも実施することが複雑で遅い。
図2は、64ビット整数オペランドも示す。そのような整数オペランドは、符号なし整数では0から(264−1)、又は符号付き整数では−263から263−1の範囲の数を表すことができる。整数演算は、一般に高速であり、実行するのに比較的少ないエネルギーしか消費しない(浮動小数点演算と比較して)が、浮動小数点値によって表され得る数の範囲と比較して、指定され得る数の値の範囲が比較的限定されるという欠点がある。
図2は、さらに、この実例では、各々が64ビット整数を含む多数の成分(この実例では3つ)のベクトルを含むHPA(高精度アンカー)数を示す。HPA数は、それに関連するメタデータを有する。メタデータは、HPA数の一部を形成する成分のビットの有効桁を示すアンカー値を含む。アンカー値は、直接的に又は間接的に、ビット有効桁の下方境界及びビット有効桁の上方境界を指定する。以下で使用するメタデータという用語は、HPA数のビット有効桁を指定するアンカー値を含むデータに対応すると考えることができる。様々な成分は、一緒に、ビット有効桁のこの範囲を連続してまたがるビット値を指定する。ビット有効桁の下方境界及びビット有効桁の上方境界の位置に応じて、ビット有効桁の範囲は2進小数点位置を含むことがある。2進小数点位置が、特定のHPA値に対して指定されたビット有効桁の範囲の外にあり得ることも可能である。
アンカー値は、浮動小数点値(例えば、倍精度FP値)によって表され得る最小の有効桁から、その浮動小数点値によって表され得る最大のビット有効桁まで延びるビット有効桁の範囲を表すことができるように定められてもよい。
HPA数を形成する成分の数は、様々な実装の間で異なってもよい。成分のサイズは、ある実施例では固定されることがあり、他の実施例では変わることがある。ビット有効桁の範囲の全幅は、実施例によっては、固定成分サイズの単位で変わるように制約されることがある(例えば、64ビット成分では、ビット有効桁の範囲は、例えば、64、128、192、256、…の幅を有してもよい)。ビット有効桁の範囲の幅は、1ビット幅のステップで連続的に変わることも可能である。
アンカー値(メタデータ内の)は、プログラマが、対応するHPA値の有効桁を設定できるようにプログラム可能とすることができる。アンカー値は、様々な異なる方法でビット有効桁を指定することができる。1つの実例は、各ベクトル成分のビット有効桁の下方境界を指定することである。したがって、各ベクトル成分は、その成分内の最下位ビットの有効桁を表す(アンカーする)メタデータと一緒に、ビット有効桁の全範囲内の値の有効ビットの部分を表す整数値を含むことができる。別のオプションは、アンカー値が、ビット有効桁の範囲の全幅と一緒にHPA数全体のビット有効桁の下方境界を指定することである。さらなるオプションは、アンカー値が、ビット有効桁の範囲の下方境界及び上方境界を指定するデータを含むことができるというものである。固定幅成分であることが分かっている成分の数と一緒にビット有効桁の範囲の下方境界をアンカー値が含むなどのさらなる変形形態も可能である。
図3は、倍精度浮動小数点で表現可能な値の範囲と、HPA数の有効桁範囲との間の関係を概略的に示す。倍精度浮動小数点数の場合、指定することができるビット値の範囲は、ほぼ2−1074から2+1023に及ぶ(非正規数を数えない)。
図示のように、HPA数は、浮動小数点値を使用して表現可能なビット有効桁の範囲内のビット有効桁のウィンドウとして考えることができるプログラム可能なビット有効桁の範囲を有する。このプログラム可能なビット有効桁は、下方境界及び上方境界によって指定することができ、下方境界及び上方境界の値に応じて、浮動小数点値によって与えられるビット有効桁の範囲に沿ってスライドすると考えることができる。ウィンドウの幅、並びにその開始点及び終了点は、ビット有効桁を指定するプログラム可能なメタデータ(アンカー値を含む)の適切な値で指定することができる。したがって、HPA数は、実行されるべき計算に適合するようにプログラマによって選択された形態を有することができる。
HPA形式は、2つ以上の値の加算を速く、正確に、及び結合的に実行することを可能にするが、依然として、広範囲の有効桁にわたる値を表すことを可能にする。HPA値は単に2の補数なので、それは、整数加算器を使用して加算することができ、浮動小数点演算のように丸め又は正規化を行う必要がなく、それにより、値が加算される順序に関係なく結果は同じであるので一連の加算を並列化することが可能になる。それにもかかわらず、次いで、HPA値のプログラム可能な有効桁を指定するメタデータを定義することによって、等価な浮動小数点値の有効桁の全範囲をさらに表すことができるが、非常に広い加算器を用意する必要がなく(例えば、倍精度浮動小数点値によって表現可能な全範囲にわたって2の補数を加算するには、2098ビット加算器を必要とする)、その代わり、プログラム可能な有効桁により、より小さい加算器がより広い範囲内のプログラム可能なビット有効桁の特定のウィンドウに集中することが可能になる。実際には、大部分の計算は、倍精度浮動小数点で利用可能な有効桁の全範囲を必要としない。例えば、原子内部での問題は、非常に小さい値を累積することがあり、天体の複雑な状況は、非常に大きい値を累積することがあるが、陽子の幅を銀河間の距離に加算することは、一般に、有用ではない。高性能コンピューティングの場合でさえ、ほとんどの累積は限定された範囲にわたって行われる。
通常、プログラムを書くプログラマは、(用途に応じて)有用な結果が収まる可能性がある値の予想範囲を知るであろう。プログラマは、特定の和のためのデータのすべてが260よりも小さい大きさを有し、2−50未満の大きさをもつ値がいかなる意味でも和に影響を与えないと決定することができ、そこで、この場合、128ビットのデータ幅全体と、最下位ビットの有効桁を−50と指定するアンカー値とを有するHPA形式使用してデータを加算することによって、この特定の適用での数値は任意の順序で結合的に加算することができる。
したがって、結果が計算されている有効範囲を制限するためにアンカー値を使用することによって、比較的小さいハードウェアを使用して、プログラム可能に定義されたウィンドウ内で結果を計算することができる。加算結果が、定義された範囲の上方有効桁境界を超えるオーバーフロー又は下方有効桁境界を下回るアンダーフローをもたらす場合、例外が起こることがあり、これは、プログラマが誤った有効桁境界を定義したこと、及び結果に対して異なる有効桁ウィンドウを定義するために、異なるメタデータ(例えば、異なるアンカー値又はHPA値の異なる全サイズ)を用いて処理を繰り返すべきであることを知らせることができる。
2つのHPA値を加算又は減算するとき、アンカー値は両方のHPA値に対して同じであり、結果も同じアンカー値を有する、− これは、2つの値の加算又は減算が、結果の正規化に起因して入力のいずれかに異なる指数をもつ結果をもたらすことがある浮動小数点演算とは異なる。入力が、異なるアンカー・メタデータを与えられた場合、入力は、結果のための必要とされる目標有効桁範囲と入力を整合させるようにシフトされる。入力がHPA以外の表現(例えば、整数又は浮動小数点)で供給された場合、入力は、同じアンカー値を共有するHPA値に変換され、加算されて、同じアンカー値を有する結果を形成する。したがって、HPAレジスタのためのメタデータは、そのレジスタで生成されるべき結果値に対する有効桁の目標範囲を定義するものと見なすことができ、有効桁の目標範囲外のビットは、入力値の実際の有効桁に関係なくハードウェアによって計算されないことになる。
RHPA表現
HPA形式は浮動小数点に比べてはるかに速い加算を可能にするが、HPA値のサイズが比較的大きくなると、整数算術を用いた2つのHPA値の加算は依然として比較的遅いことがある。例えば、HPA形式は、複数のレーンにまたがるオペランドの加算を必要とすることがあり、それは、より大きいベクトルの実装では望ましくないことがある。例えば、2つの256ビット又は512ビット値の加算は、入力される1つのレーンから次のレーンへの桁上げを収容するために、加算の各64ビットのレーンが順次実行されることがあるので、ある程度時間がかかることがある。
加算は、図4に示す冗長高精度アンカー(RHPA)形式を使用することによってより速く実行することができる。HPA形式におけるように、RHPA数は、処理回路14が各成分のビットの有効桁を識別することを可能にするアンカー値を定義するメタデータをもつ可変数の成分を含む。再び、アンカー値はプログラム可能とすることができる。RHPAでは、メタデータは、HPAに関して上述した方法のいずれかで各成分の有効桁を識別することができる。しかしながら、RHPA形式では、数値は、ベクトルの隣接するレーンが重複する有効桁のビットを含む冗長表現を使用して表され、それにより、計算されているレーンの数に関係なく一定時間の加算が可能になる。冗長性は、加算、累積、及び乗算などの演算を、より短い加算器で、加算器間で桁上げ情報を伝搬することなく実行することを可能にする。これは、データ値の処理を大幅に高速化する。
図4のパート(1)に示すように、RHPA表現を使用するMビット・データ値は、各々がNビットを含むそれぞれのベクトル・レーン(成分、要素、又は部分とも呼ばれる)に分割され、ここで、N<Mである。この実例では、Nは64ビットであるが、これは単に1つの実例であり、他のレーン・サイズ(例えば、32ビット又は128ビット)も可能である。各Nビット部分は、ある数Vの重複ビットと、N−Vの非重複ビットとに分割される。この実例では、重複ビットの数Vは、各Nビット部分に対して同じであるが、異なる数の重複ビットをもつ異なるNビット部分を有することも可能である。
整数又は浮動小数点数がRHPA形式に変換されると、非重複ビットの一部は、元の整数又は浮動小数点数からマッピングされた非符号情報が入れられ、一方、重複ビットは符号ビットが入れられる。レーンベースの加算及び減算の目的のために、各レーンは(必要な場合、非重複部分から重複部分に伝搬する桁上げを有する)Nビットの符号付きの2の補数のように振る舞うが、マルチレーンの観点から見ると、レーンは、より大きいPビット数の冗長混合符号表現を形成する。図4の実例では、4つのレーンがあり、そこで、M=256であるが、レーンの数は、ハードウェア実装及び/又は所与のRHPA数に対して定義されたメタデータに応じて変わることができる。
図4のパート(2)は、パート(1)に示したRHPA数の各ビットの相対的な有効桁を示す。最下位レーンの重複ビットV[0]は、次のレーンの非重複ビットNV[1]のVの最下位ビットと同じ有効桁を有する。同様に、重複ビットV[1]及びV[2]は、それぞれ、非重複ビットNV[2]及びNV[3]のVの最下位ビットと同じ有効桁を有する。レーン間の有効桁の重複は、RHPA数が、全体として、格納されるビットの総数Mよりも小さいPビット値を表すことを意味する。Vが各Nビット部分(先頭部分以外の)に対して同じである場合、
である。より一般的には、異なるレーンが異なる数の重複ビットを有することができる場合、P=M−ΣVであり、ここで、ΣVは先頭レーン以外の各レーンの重複ビットの数の合計である。
Pビット値の重複部分ごとに、そのPビット数の実際のビット値は、下位レーンの重複ビットVと上位レーン内の非重複ビットNVとの和によって表される(下位レーン内の非重複ビットNVと重複ビットとを加算することによって引き起こされることがある任意の桁上げを考慮に入れて)。したがって、RHPA値を等価な整数値に変換する1つの方法が、図4のパート(3)に示され、ここで、各レーンの重複ビットは符号拡張され、上位レーンの非重複ビットに加算される(低次から高次に、各レーンの加算後に重複ビットを調整する)。
RHPA数は、RHPA値のMビットを使用して所与のPビット数を表すための2つ以上の方法があるという意味で冗長である。例えば、最下位の2つのレーンの重複を考えると、重複ビットの数V=4の一実例では、Pビット値の対応ビットが1111である場合、これを表す1つの方法は、下位レーンで重複ビットV[0]=0b0000、及び次の高位のレーンで非重複ビットNV[1]=0b1111を有することである。しかしながら、同じ値を表す他の方法は、例えば、V[0]=0b0101及びNV[1]=0b1010、又はV[0]=0b1111及びNV[1]=0b0000とすることができる。
最上位レーンの重複ビットV[3]は、重複する高次レーンがないので、実際には重複ビットではないことに留意されたい。したがって、高次レーンをすべて非重複ビットを有すると考えることは多くの場合有用であり得る。したがって、場合によっては、先頭レーンは、完全に非重複ビットから形成されると考えることができる(その結果、Pビット値の最上位ビットは全体として、先頭レーンのMビット値の最上位ビットに対応する)。
しかしながら、他の実施例では、RHPAによって表されるPビット数値の最上位ビットが、先頭レーンの非重複部分(重複部分を除く)の最上位ビットに対応するように、先頭レーンも重複ビットを有するとして扱うことが好ましいことがある。この手法は、各レーンをより対称的な方法で処理できる(他のレーンと比較して先頭レーンを処理する方法への少ない修正で)場合、回路実現をより容易にすることができる。
図4に示したようにPビット数値を冗長形式で表現することによって、所与のレーン内の非重複部分の加算からのいかなる桁上げも、次のレーンまで桁上げを伝搬する必要なしに同じレーンの重複部分内に収容することができるので、レーン間の桁上げなしに、いくつかのRHPA数を加算することができる。各レーンで実行される加算は、従来のNビットの2の補数加算を実行することによって加算される2つ以上のNビット符号付き整数を単に参照し、これは、他のレーンの対応するNビット加算とは完全に独立している。これは、Nビット加算の各々を並列に実行することができることを意味し、その結果、レーンの数に関係なく、Nビット加算を実行するのにかかる時間内でMビット値全体を加算することができる。
実際には、少なくとも(2V−1−1)個のそのようなRHPA数は、レーン間の桁上げなしに加算することができ、非重複部分の加算からのいかなる桁上げも重複部分に収集される(異なる数の重複ビットを有するレーンがある場合、この式のVは、重複ビットを有する任意の所与のレーンの重複ビットの最小数になる)。(2V−1)番目の加算は、レーン間の桁上げを生成する可能性がある最初のものである(その理由は、先頭重複ビットが符号ビットであり、すべてのビットが0であるRHPA数から始まるとき、最少の2V−1個のさらなる加算が実行された後に発生することがある2番目の最上位重複ビットからの正又は負のオーバーフローがあるときにレーン・オーバーフローが発生するからである)。例えば、V=14の場合、これは、単一レーンからオーバーフローするリスクが生じる前に、少なくとも8191個のRHPA数をアキュムレータに追加する(すなわち、合計8192個の値を追加する)ことを可能にする。これは、多くの入力値の加算が一般的である高性能コンピューティング分野にとって特に有用である。実際には、すべての加算がオーバーフロー部分への桁上げを引き起こすのではないので、時には、Nビット部分の先頭ビットからのオーバーフローなしに2V−1個を超える累積が可能である。
場合によっては、Nビット・レーンの先頭ビットからのオーバーフローのリスク(又は実際のオーバーフロー)を引き起こすのに十分な加算が実行された場合、重複ビットが所与のRHPA値の重複ビットよりも小さい大きさを表す第2のRHPA値に所与のRHPA値を変換して、より多くの桁上げを収容するための重複部分のビット空間を効果的に解放するために、重複削減演算を実行することができる。また、RHPA数を整数又は浮動小数点などの別の形式に変換し直すとき、そのような重複削減が、さらに、実行されてもよい。しかしながら、実際には、そのような重複削減演算は多くの場合必要とされず、そこで、Nビット加算にかかる時間内に多数の入力のMビット加算を実行できるようにすることによって、RHPAは処理時間を大幅な節約を可能にする。「重複削減」という用語は、すべてのレーン内の重複ビットがより小さい大きさにされなければならないことを意味していないことに留意されたい。少なくとも1つのレーンが重複ビットの大きさを削減することで十分であり、いくつか形態の重複削減は、所与のレーン内の重複ビットの大きさを増加させる可能性がある。
HPA数の効率的な記憶及び操作
以下の説明では、使用されるHPA形態は、各部分がいくつかの重複ビットを含む上述で論じたRHPA形態であると仮定するが、本明細書で説明する技法は、他のHPA形式、例えば、異なる部分が重複ビットを含まないHPA形態に同様に適用可能である。今後、HPAという用語は、HPA値が冗長形態であるかどうかに関係なく、操作されているHPA値を参照するために使用される。
前に論じた図4から明らかであるように、HPA数の異なるHPA部分は、単一のベクトル・レジスタの異なるレーン内に配置することができる。しかしながら、これは、いくつかの潜在的な問題を引き起こす。例えば、浮動小数点オペランドからHPA形態を作り出すとき、浮動小数点オペランドの小数は、所望のアンカー値と一緒に、関連するベクトル・レジスタ内のレーンのすべてに伝搬される必要がある。次いで、各レーンは、アンカー値に基づいて異なるレーン・アンカーを有することになる。さらに、それは、ベクトル・レジスタがHPA数の長整数値よりも著しく大きい状況では、例えば、1024ビットレジスタがHPA数の200ビットの長整数を保持する状況では、ベクトル・レジスタ・リソースの無駄な使用をもたらすことがある。さらに、ベクトル・レジスタがHPA数の長整数の部分のすべてを表すには不十分なビット数を有している場合、例えば、ベクトル・レジスタが128ビット幅であり、HPA数の200ビットの長整数を表す必要がある場合、処理が問題となることがある。
以下で論じる実例では、代替の記憶設置が、HPA数の様々な部分に対して提供される。特に、HPA数の長整数は、図5に概略的に示されるように、多数のベクトル・レジスタにわたって共通レーン内に格納されるように構成される。特に、1組のベクトル・レジスタ100が設けられ、各ベクトル・レジスタは、データ値を格納するための複数のセクションからなると考えることができる。さらに、複数のレーンがベクトル・レジスタを通って(図5に示された方位において垂直方向に)延びると考えることができ、最初の4つのレーンが、図5において参照番号102、104、106、108によって表されている。次いで、HPA数の長整数は、HPA整数値の異なる部分を異なるベクトル・レジスタに格納することによって、共通レーン内に格納することができる。これが、例示のHPA整数110に対して概略的に示されており、それは、4つの部分からなり、1つの部分が、ベクトル・レジスタZ0、Z1、Z2、及びZ3の各々に格納されていると考えられる。さらに、部分のすべては、共通レーン102内に格納されている。HPA数の整数をこのように格納することによって、これは、いくつかの著しい利益を生み出す。例えば、整数のサイズは、個々のベクトル・レジスタの幅によって制約されない。さらに、多数のHPA整数を、異なるレーンにおいて、様々なベクトル・レジスタにわたって格納することができ、次いで、それらの整数値をSIMD方式で並列に演算することができるので、ベクトル・レジスタの非効率な利用を避けることができる。例えば、図5を考えると、図5に示したベクトル・レジスタの各々が16個のレーンを備える場合、16個のHPA数を、4つのベクトル・レジスタZ0からZ3内に格納することができ、各HPA数は異なるレーンを占める。したがって、この手法は、スケーラビリティを著しく改善し、ベクトル長不依存の技法を提供することが分かる。したがって、これにより、この技法は、各々が異なるサイズのベクトル・レジスタを使用して演算することができる多種多様の異なるシステムに採用され得る。したがって、HPA値のためのそのような記憶技法の使用は、著しい性能利益を生み出すことになる多くの用途があるが、1つの実例は、ARM Limitedによって提案されたスケーラブル・ベクトル拡張(SVE)を採用するシステムに関連する。
ARM Limitedは、科学HPC用途を対象とする64ビットISAへのスケーラブル・ベクトル拡張(SVE)を発表した。SVEは、現在、HPAサポートを含んでいないが、進化し続けており、その命令セットへのいくつかのわずかな追加により、非常に高いHPA性能が可能になる。SVEの「スケーラブルな」部分は、すべての実装に同じベクトル長を必要としないことを意味し、SVEベクトルは、64ビット・レーンの倍数のペアとしてハードウェアに、128ビットから2048ビットまで実装することができる。小さいチップは128ビット・ベクトルしか実装することができないが、スーパーコンピュータは1024ビット・ベクトル又は2048ビット・ベクトルさえ実装することができる。単一のSVEレジスタ内に200ビットの整数を保持することは、128ビット実装では不可能であり、2048ビット実装では無駄であるが、これらのレジスタのうちの4つにわたって分配されたいくつかの200ビット整数を保持することは、SVEのスケーラビリティを全面的に利用しており、小さいものから大きいものまで任意のハードウェア実装で十分に機能する。それにより、さらに、プログラマは、必要に応じて自由により短い又はより長い整数を自由に使用することができ、100ビット整数は、2つのベクトル・レジスタの対応するレーンに入れることができ、500ビット整数は、10個のベクトル・レジスタの対応するレーンに入れることができる。
性能と面積の理由で、SVEは、64ビット・レーン内の算術を実行する。発明者等は、大きいi HPA数を小さい冗長部分に分けることによってHPA加算を行うことを提案する。各64ビット・レーンは、iの指定された部分を保持することになり(例えば、p=50ビットであるが、これはプログラマブルとすることができる)、残りの64−pビットは、レーン内の桁上げを保つために使用される。これらの残りのビットは、それらが次の最上位レーンのlsbと同じ数的重みを有するので、「重複」ビットと呼ばれる。レーン内の加算は、単に通常の64ビットの整数加算である。264−pサイクルごとに(すなわち、p=50では16000サイクル程度ごとに)、冗長度除去ステップが、レーン・オーバーフローを防止するために必要とされることがあり、非冗長な答えを得るために、すべての計算の終わりに、レーンごとのプロセスが必要とされることになる。
FP入力fをHPA数形式(i,a)に変換するために、各64ビット・レーンは、fの指数を検査し、それをアンカーaと比較し、次いで、fの仮数のいずれかの部分が検討中のiの部分に追加されるべきかどうかを決定する。この比較は、すべての適用可能なレーンにわたって並列に行うことができる。fの仮数は2つの部分(又はpの値に応じて、FP64製品では3つの部分)にまたがることがあるが、各部分は、独立に作り出し操作することができる。
aが0になるように選ばれ、pが50になるように選ばれている2つの部分HPAへのFP32数の実例の変換が、以下に記載される。この実例では、FP32数はベクトル・レジスタ・レーンの「右側」の32最下位ビットを占めると仮定され、HPA数は64ビットレジスタ・レーン(50ビット値と14重複ビットとを含む)を占めると仮定される。FP数が
f=+1.0110 1011 1010 0010 1111 011 × 260
である場合、
FP32仮数、f[23:0]=1 0110 1011 1010 0010 1111 011
である。
HPA数の部分1は、調節部分アンカー=50を有し、以下のように計算される。
i[1]=(指数−23)だけ左シフトされたf[23:0]−部分アンカー=37−50=−13桁
(−ve左シフトは+ve右シフトであり、−> i[1]={{14 0’s},{39 0’s},f[23:13]=1 0110 1011 10})
(23だけ指数を調節するのは、浮動小数点値の指数が23ビットの小数の最上位ビットの左側の暗黙の10進小数点の有効桁を表し、一方、アンカーは小数の最下位ビットの有効桁を表すことを考慮している)。
HPA数の部分0は調節部分アンカー=0を有することになり、以下のように計算される。
i[0]=(指数−23)だけ左シフトされたf[23:0]−部分アンカー=37−0=37桁−>i[1]={{14 0’s},f[12:0]=10 0010 1111 011,{37 0’s}}
これは、以下のようなHPA形態をもたらす。
一般的に言えば、HPA結果を単一のFP結果に正しく丸めるには、桁上げ及び丸め情報のレーンごとの伝搬を必要とする逐次プロセスでなければならない。それは、数サイクルを必要とすることになるが、累積ごとに1回だけ生じる必要がある。代替として、p≦53である場合、いくつかの64ビット・レーンを占める非冗長HPA数は、FP64数のベクトルに並列に変換することができる。次いで、結果として生じるベクトルは、最上位要素が0.5ulpの精度まで完全HPA数を表すように「再正規化」されるべきである。
ここでHPA処理の基本を高いレベルで説明したので、次に、HPAアキュムレータをSVEにどのように実装することができるかを極めて詳しく説明する。
SVEは、k×128ビットのベクトル・レジスタ長を、現在の最大の2048ビット(すなわち1≦k≦16)までサポートし、「ベクトル長不依存」(VLA)処理の概念に基づいており、それによって、異なるSVEベクトル・レジスタ長をもつ異なるCPUがすべて同じSVEプログラムを実行することができる。SVEプログラムは、システム・レジスタから利用可能なベクトル長を読み取り、利用可能なベクトル・レジスタ長を利用するために「自己調節する」。その結果、SVEプログラムは、128ビット・グラニュール内で実行され、CPUは、利用可能なベクトル・ハードウェア長がサポートできるのと同じ数のグラニュールを並列に処理する。
図5を参照して前に述べたように、ベクトル長不依存を達成するために、HPA数は、多数のSVEレジスタにわたって配置することができる。各レジスタは、異なるHPA数の同じ有効桁のビットを保持することができる、すなわち、各レジスタは、HPA数の各部分の位置に対して調節された数のアンカーの値を与える有効桁に関連する。
p=50が各部分に保持されている200ビットHPA数の前の実例に戻ると、HPA数のアンカーが−80である場合、4つの部分の有効桁情報は、64ビット部分当たり14個の重複ビットをもつ(+70、+20、−30、−80)となることになる。HPA数の個々の部分が図5の実例の通りに連続したレジスタに格納される必要はないことに留意されたい。
このようにHPA数を配置することの主な利点は、HPA数(又は長整数)を、長いHPA数よりも短いことがあるSIMD実装(例えば、128ビット・ベクトル)にわたってさえ、SIMD方式で扱うことができることである。二次的な利点は、より長いSIMD実装(例えば、1024ビット・ベクトル)が、各ベクトル内に非常に短いHPA数を格納することによって無駄にされないことである。十分に多くの整数又はHPA数がある場合は、ベクトルは、SVE実装長に関係なく完全に利用される。
HPA数をいくつかのレジスタにわたって配置することにより、さらに、FP数のベクトルをそれ自体の64ビット・レーン内に累積してHPA算術を高度に並列化することができる。加えて、メモリからの大量のFP数のロードは、簡単で効率的な連続したベクトル・ロードになる。最後に、HPA数のこの配置により、いくつかのHPA整数をすべて下位ビットから上位ビットまで並列で処理することができるので、既存のSVE命令を使用して重要なHPA計算(冗長度を除去すること、又はHPA数を一緒に加算することなど)を実行することができる。この方式はまた、この場合もやはり、多数のHPA数をすべて上位レーンから下位レーンまで又は下位レーンから高位レーンまで同時に処理できるので、HPA数からFPへの変換及び再正規化を高速化する。
図6は、図5で論じた方法で配置されたHPA数を、次いで、SIMD方法でどのように処理できるかを示す。特定のこの実例では、一連の浮動小数点数がソース・ベクトル・レジスタ165にロードされると仮定する。この実例では、各浮動小数点数は倍精度浮動小数点数であり、したがって、各浮動小数点数はソース・レジスタ165内の64ビット・セクションを占めると仮定する。
複数の64ビット・レーン152、154、156は、ベクトル・レジスタのセットを通って延びると考えられ、別個の変換及び処理回路170、172、174が各レーンに関連している。回路170、172、174は、宛先レジスタ180に格納されるべき対応結果部分を作り出すために、一度ずつHPA数の単一の部分に演算するように構成される。HPA結果数の各結果部分は異なる宛先レジスタを占めることになり、その結果、回路がHPA数の異なる部分を処理するとき、対応結果部分は異なる宛先レジスタに書き込まれることになることが、前に論じた図5から理解されよう。
後でより詳細に論じるように、メタデータは、変換及び処理ステップを実行するとき、変換及び処理回路170、172、174による参照のために提供される。特に、この実例では、メタデータは、レーンごとに、さらなるソース・レジスタ160内に格納される。レーンのメタデータ内で、メタデータ部分は、そのレーン内で処理されるHPA数の部分ごとに提供される。メタデータは、対応部分に関連する有効桁(調節されたアンカー)を識別することになり、重複ビットの数などの他の情報を識別することができる。回路170、172、174は、HPA数の特定の部分を処理しているとき、ソース・レジスタ160内に維持されているレーン・メタデータから関連するメタデータ部分を検索することになる。
図6に示した実例では、各変換及び処理回路は、入力浮動小数点オペランドと、処理されるべきHPA数の部分に対するに関連するメタデータ部分とを受け取ることになり、次いで、例えば、表7に示した実例を参照して前に説明した技法を使用して、入力浮動小数点オペランドから関連するHPA部分を生成することになる。次いで、生成されたHPA部分は、結果レジスタ180に直接格納することができ、又は関連する結果部分を生成するためにいくつかの処理機能を受けることができる。例えば、1つの実施例では累積演算を実行することができ、現在のHPA結果部分が、宛先レジスタから検索され、次いで、入力浮動小数点オペランドから生成されたHPA部分と累積されて、更新された結果部分を作り出し、次いで、それは宛先レジスタ180の関連セクションに書き戻される。
そのような手法によって、多数の繰返しの実行を介して、多数の累積演算が、各レーン内で並列に実行されて、累積結果を表す結果部分を生成することができることが分かる。このプロセスを、さらに、HPA数の部分の各々に対して繰り返して、一連の結果部分を各レーン内に作り出し、それらは、ひとまとめにして結果HPA値を表すことができる。
1つの実例の形成では、HPA処理は、アンカー、レーン重複、及びレーン・タイプ又は広い数の内の位置、すなわち、上部、下部、若しくは中間部に関する情報(「メタデータ」)を必要とする。HPA数は、一般に、HPAアキュムレータが通常せいぜい4つの部分を含むようにIEEE FP32と同様のアンカー範囲をもつせいぜい200ビット幅になると予想される。次いで、4つの64ビット部分を横切る200ビット・アキュムレータのためのHPAメタデータは、図7に示すように、4つの16ビット・フィールドとして組織化することができる。
特に、ソース・レジスタ160を指定することができ、各レーン(例えば、64ビット)内に、参照番号162、164、166、168によって示されるような4つのメタデータ部分が設けられる。次いで、各メタデータ部分は、アキュムレータ結果の関連部分にメタデータを提供することができる。図7の拡大部分によって示されるように、有効桁(調節されたアンカー)情報は、例えば9ビットを使用して第1のサブ部分192に含まれ得るが、重複情報は、例えば5ビットを含む第2のサブ部分194に捕捉され得る。所望ならば、関連する部分が、上部部分(すなわち、最上位ビットを表す)、下部部分(最下位ビットを表す)、又は中間部分であるかどうかを識別するために、タイプ情報が、さらに、第3のサブ部分196に捕捉されてもよい。
特定のレーン内で、累積されるHPA値はすべて同じアンカーを有するように構成されることになり、その結果、レーンのメタデータは、レーン内で処理されるHPA値のすべてに同じように適用することになる。
原理的に、異なるメタデータが、レーンの各々に指定されてもよく、その結果、1つのレーンで処理される値は、別のレーンで処理される値と同じアンカーを有する必要はない。しかしながら、多くの場合、すべてのレーン内で処理されるすべての値がすべて同じアンカー値を有するように構成されるということであり、この場合には、64ビットのメタデータは、ベクトル・レジスタ160全体にわたって格納及び複製され得る。これにより、レーンの各々に対して作り出された様々なHPA結果は、次いで、やがて、容易に互いに累積されて、単一のスカラーHPA結果を作り出すことができる。
そのような形成では、メタデータを参照する必要があるHPAのためのSVE命令は、処理されているHPA部分の特定の16ビットのメタデータへの2ビット・ポインタと一緒に、メタデータ・レジスタを指定することができる。
図7はメタデータを提供するための1つの機構を示しているが、より圧縮した方法でメタデータを格納する代替の方式が、例えば、8レーンのメタデータを64ビットで格納できるように工夫することもできることに留意されたい。特に、「タイプ」フィールドは必要とされないことがあり、ovlp及び有効桁フィールドは、多分、限られた数の利用可能な構成を反映するようにサイズを減少させることができる。
単一の最も重要なHPA演算は、FP数をHPA形式に変換し累積することである。この演算は、累積されるべきすべてのFP数に実行されなければならないが、他のHPA演算(FPへの変換戻し、HPA冗長度の除去など)は、数千分の1の頻度でしか行われない。その結果、FP数を変換し累積するために効率的なハードウェア・サポートを提供することが望ましい。
図8は、ベクトル・ユニットにわたって繰り返されることになるこの演算のための可能な64ビット・データ経路を示しており、したがって、図8は、図6に示した変換及び処理回路170、172、174の各々のための実例の構成をより詳細に示している。
入力浮動小数点データ210は、符号部分212、指数部分214、及び小数部分216からなる。次いで、レーンに対して保持されているメタデータからの関連するメタデータ部分が、メタデータ部分200として抽出され、これは、タイプ・フィールド202、重複フィールド204、及び有効桁フィールド206を含む。OR機能220が、指数のビットにOR演算を実行して仮数の最上位ビットを生成し、それは、次いで、小数ビット216の先頭に追加されて仮数が形成される。特に指数がゼロでない場合、これは、浮動小数点数が通常の浮動小数点数であり、その結果、仮数の最上位ビットが論理1の値であることを示している。しかしながら、指数のビットのすべてがゼロである場合、これは非正規値を示しており、その結果、仮数の最上位ビットは0に設定されるべきである。
シフト量を作り出し、次いで、それを使用して、適切な量だけ浮動小数点仮数をシフトさせるようにシフト回路224を制御する(必要に応じて右シフト又は左シフトのいずれかを実行する)ために、減算ブロック222は、例えば、表7を参照して前に説明した技法を使用して、指数214から有効桁206を減算するように構成される(指数バイアス及び小数ワード長に対して必要に応じて調節される)。
次いで、AND回路226は、重複情報204を受け取り、シフト回路からの出力を特定の数の重複ビット(64−pに等しい)だけマスクする。その後、XOR回路228は、浮動小数点数が符号値212によって示されたとき負であった場合、AND回路226からの出力に2の補数関数を実行する。この時点で、所与の有効桁及び重複量をもつ特定のHPA部分に関係のある入力浮動小数点数のビットは、2の補数として利用可能であり、1つの入力として加算器回路230に供給することができる(加算器は、さらに、浮動小数点オペランドが負である場合、1の桁上げイン値をとる)。その結果、関連するHPA部分が、入力浮動小数点値から「オンザフライで」生成され、次いで、対応結果部分を生成するために適切な処理演算を受けることができることが分かる。
図示の実例では、処理演算は選択的な累積演算であると仮定する。特に、AND回路240を選択的に使用して、レジスタ235に保持されている現在値を第2の入力として加算器230に伝搬して戻し、それにより、前の結果部分が、変換回路からの入力オペランド部分出力と累積されて、レジスタ235に格納される更新された結果部分を作り出すことができる。64ビット加算器とレジスタを図示の方法で合体させると、連続的なHPA変換−累積命令のパイプライン化された実行がサポートされる。
上述の演算を実行するために図8に示した回路をトリガできるいくつかの方法があるが、1つの実施例では、単一の命令を使用して、図8の上述の機能を開始する。そのような命令は、FPからHPAへの変換−加算命令と呼ぶことができる。
1つの実例におけるFPからHPAへの変換−加算命令のためのオペコード(ニーモニック「FCVTH{A}」、ここで、{A}はオプションの累積を表す)は、FPソース・レジスタ、メタデータ・レジスタ、宛先アキュムレータ・レジスタ、及びメタデータ・レジスタのサブフィールドを選択するためのインデクスのための識別子を含む。これは、オペコードがせいぜい3つのベクトル・レジスタを参照するというSVE ISA設計原理に十分適合する。
他の重要なHPA演算を実施する既存のSVE命令の短いシーケンスを構築することができる。
定期的に、部分オーバーフローを避けるためにHPA数の冗長度を除去することが重要である。これは、下位HPA部分の重複領域内の累積された桁上げビットを次に高いHPA部分のLSBに単に追加することによって達成することができる。SVEでは、これは、3つの命令手順で達成することができる。
(i)下部部分をp桁だけ右に算術シフトする、
(ii)シフトされた重複ビットを次に高いHPA部分に追加する、
(iii)下位HPA部分のpから導き出されたマスクを用いて重複ビットをANDイミディエートして、重複ビットを強制的にゼロにする。
この手順は、最下位レーンから上方に作業して、隣接するHPA部分のすべてのペアに適用することができる。
大量のFP数が累積された後、その結果は、いくつかのSVEレーンにわたって用意された多数のアキュムレータに格納されることになる。次いで、これらのアキュムレータを一緒に加算して、同じインデクスをもつHPAレーンのベクトルごとにスカラー結果を返すことができる。SVEでは、これは、スカラーHPA結果を形成するために、多数のHPAレーンに保持されているアキュムレータにベクトル縮減を実行することによって容易に達成することができる。結果として生じるスカラーHPA数は、各部分の重複領域に桁上げビットをかなり含むことがあり、したがって、次いで、冗長度除去ルーチンをスカラーHPA数に実行し、その後、それをFP形態に変換し直すことができる。
最後に、累積された再現可能なHPA結果は、浮動小数点形式に変換し直すことができる。HPA部分を正規化FP64数に正確に変換する(すなわち、p≧53を仮定して)ためのアルゴリズムは、以下の通りである。
(i)先頭の「1」の位置を捜し出すためにCLZを実行する、
(ii)有効桁+(63−CLZ)+FP64指数バイアスとして指数を計算する、
(iii)最も高いHPA部分以外のすべてに対して、FP64結果のビット[63]を0に設定する;FP64結果のビット[62:52]を、計算された指数に設定する;バイアスされた指数>0である場合、HPA部分をCLZ−11桁だけ左に論理的にシフトする。他の場合には、FP64結果をゼロに設定する。
(iv)最も高いHPA部分に対してのみ、その部分が負である場合、FP64結果のビット[63]を1に設定し、正の2の補数を得るためにその部分を符号反転する;FP64結果のビット[62:52]を、計算された指数に設定する;バイアスされた指数>0である場合、HPA部分をCLZ−11桁だけ左に論理的にシフトする。他の場合には、FP64結果をゼロに設定する。
この変換アルゴリズムは、一般にHPAレーン当たり15個のSVE命令で実装することができる。
所望ならば、最上位でない部分が負になる可能性がある場合をカバーするように上述のステップ(iii)及び(iv)を以下のように結合させることができることに留意されたい。
(iii)その部分が負である場合、FP64結果のビット[63]を1に設定し、正の2の補数を得るためにその部分を符号反転する;FP64結果のビット[62:52]を計算された指数に設定する;バイアスされた指数>0である場合、HPA部分をCLZ−11桁だけ左に論理的にシフトする。他の場合には、FP64結果をゼロに設定する。
所望の場合、最終の累積値をできるだけ的確に表す単一のFP64結果を作り出すことができる。これは、例えば、Y.Hida、X.S. Li、及びD.H. Bailey、「Algorithms for Quad−Double Precision Floating Point Arithmetic」、Proc. 15th IEEE Symposium on Computer Arithmetic、Vail CO、2001年6月、155〜162頁によって提案されたアルゴリズムを適用することによって達成することができる。
レーンの下部ペアから上方に作業して、Fast2Sum演算が次の上位レーンに連続的に適用され、上位和がFast2Sumから得られる。次いで、プロセスが繰り返され、ちょうど今得られた一番上のペアの値から下方に作業して、次の下位値に連続的に適用され、下位和がFast2Sumから得られる。次いで、結果として生じたFP64数のベクトルの一番上の要素がHPA数の0.5ulp内にあることが保証され得る。
l個の部分を含むHPAアキュムレータは、l・pビットのワード長を有し、l個のSVEベクトル・レジスタを占める。k×128ビットSVEベクトル・ユニットで実行されたFCVTH{A}命令は、2k個のFP64数又は4k個のFP32数を2k個のHPAアキュムレータの1つの部分に変換し累積することができる。FCVTH{A}命令は、n個のFP64加数からのブロックが、n・(l/2k)+1サイクルで、2k個のp・lビットHPAアキュムレータに累積されるように完全にパイプライン化される。l及びkの典型的な値は2〜4であり(kは16もの高さにすることができるが)、その結果、l=kの場合、n個のFP64数(又は2n個のFP32数)は、n/2サイクルでk並列アキュムレータに累積され得る。対照的に、ARMのCortex−A72では、和は順番に生じなければならず、依存融合型乗加算(FMA)は加算の間に3サイクルを必要とするので、同じ再現可能な累積は3nサイクルを必要とすることになる。したがって、HPAは、一般に、FP32累積では従来のFP処理と比較して12倍の加速を提供する。
上記のように、HPA冗長度は、定期的に除去又は解消される必要があることになる。上述の方法は、3・(l−1)個の命令を必要とし、264−pの累積ごとに1回実行される必要があることになる。p=50の典型的な値では、これは、<0.1%の小さい処理オーバーヘッドを表す。同様に、HPAアキュムレータのベクトルをスカラー形態に変え、スカラーHPAの冗長度を解消し、スカラーHPAをFP64形式に変換し直すのは、lの代表値に対して、一般に、n≒103以上の場合のn個の数のHPA累積での≒n/4サイクルと比較して、l+3・(l−1)+15・l≒19・l−3=35〜73個の命令を必要とすることになる。
上述の議論から明らかなように、主要な頻繁に使用される演算は、変換及び累積演算である。図9は、1つの実例の形成でのそのような演算の実行を示す流れ図である。ステップ300において、1つ又は複数の連続したロード演算が、いくつかのベクトル・ソース・レジスタに浮動小数点オペランドを入力するために実行される。これが図10Aの上部に概略的に示されており、連続したベクトル・ロード演算を実行することによって、浮動小数点ソース・オペランドが3つのベクトル・レジスタに入力される。この実例では、各ベクトル・レジスタが4つのレーンを備えると仮定されている。
ステップ305において、HPA表現のアンカー及びサイズが決定される。前に述べたように、HPA表現のアンカー及びサイズはプログラマブルとすることができ、その意図は、多数のオペランドを累積するときに最上位ビットを捕捉できるように適切な範囲を確立することである。その結果、1つの実例の形成では、累積されるべきグループ内の浮動小数点数のすべてを考慮して、どの浮動小数点オペランドが最大かを決定するために、走査動作を実行することができる。次いで、HPA表現のための所望の数の部分を決定することができ(この数は、累積されるべき浮動小数点数のすべてを走査することなく選ぶことができる)、最上位部分は、最大の浮動小数点オペランドの最上位ビットを捕捉できるようにするのに十分な有効桁を有するように選ばれる(累積されるべき浮動小数点数のすべてを走査することから決定されるように)。したがって、これは、ステップ305におけるアンカーの選択を規定する。
ステップ310において、次いで、メタデータが、HPA部分ごとに設定され、ソース・レジスタZmのレーンの各々にわたって複製される。
前に論じたように、各レーンのメタデータは、実際には、いくつかのメタデータ部分を含むことになり、各メタデータ部分は、そのレーン内のHPA部分のうちの関連するものに対応する。次いで、特定のメタデータ部分は、適切なインデクス値を使用してソース・レジスタZmにアクセスされ得る。これが、図10Aの下部に概略的に示されている。特に、ソース・レジスタ識別子及びインデクス値に基づいて、各レーン内の特定のメタデータ部分がアクセスされ得る。前に述べたように、特定の実例として、1つの形成では、レーンは64ビット幅とすることができ、各レーンのメタデータは4つの16ビット・メタデータ部分を含むことができ、それは、例えば、0と3との間の値をとるインデクス値iによって識別することができる。
ステップ315において、2つのパラメータA及びBがゼロに等しく設定され、次いで、ステップ320において、ソース・レジスタA及びHPA部分Bが選択される。その後、ステップ325において、レーンの各々にわたり並列に、ソース・レジスタAのそのレーンの関連する浮動小数点オペランドが、次いで、部分Bのメタデータを使用して、検討中の現在のHPA部分に変換され、次いで、部分Bの宛先レジスタの現在の結果部分と累積されて、更新された結果部分を生成する。
その後、ステップ330において、重複削減状態が検出されたかどうかが決定され、検出されている場合、ステップ335において、重複調節プロセスが、例えば前に論じた技法を使用して実行される。
重複削減状態が存在しない場合、又はそれがある場合には重複調節プロセスの実行に続いて、プロセスはステップ340に進み、さらに多くのソース・レジスタがあるかどうかが決定される。図10Aに示した実例では、3つのソース・レジスタがあり、その結果、この時点で、プロセスは「はい」経路を辿ることになり、パラメータAがステップ345においてインクリメントされ、プロセスはステップ320に戻ることが分かる。
図10Bから図10Dは、第1のHPA部分(部分0と呼ばれる)に対するステップ320からステップ345のプロセスの3つの繰返しを概略的に示す。この実例では、部分0の結果部分は、宛先レジスタZd内に累積される。図10Bから図10Dに示された各結果部分は、形態A[q][r]で示され、ここで、「q」は部分を示し、「r」はHPA数を示す。したがって、A[0][1]は、HPA結果1の部分0を示す。
図10Bから分かるように、第1の命令は累積命令ではなく、その結果、各レーン内で、関連する浮動小数点値が、変換演算を受けて、第1のHPA部分を生成し、それは、次いで、宛先レジスタZdに格納される。
図10Cに示すように、次の繰返しにおいて、ソース・レジスタはZn+1に移り、同じメタデータ部分が参照され、累積演算が、各レーンにおいて実行されて、変換された部分を前に格納された結果部分と宛先レジスタにおいて累積する(宛先レジスタは、ここでは、累積レジスタであることを識別するためにZdaと呼ばれる)。
次いで、図10Dは、第3の繰返しの同じプロセスを示し、ここで、ソース・レジスタはZn+2である。
その後、ステップ340において、ソース・レジスタがもうないことが決定され、プロセスはステップ350に進むことになり、処理すべき部分がさらにあるかどうかが決定される。この実例では、それがあると決定され、プロセスはステップ355に進むことになり、パラメータAはゼロに再設定され、次いで、パラメータBはステップ360においてインクリメントされ、その後、プロセスはステップ320に戻る
図10Aから図10Gを参照して示した実例では、次いで、ステップ320からステップ345の3つのさらなる繰返しが、図10E及び図10Fによって概略的に示されるように、HPA数の次の部分に対して実行されることになる。図示のように、このプロセスの間に累積された結果部分は、別個の宛先レジスタZd(a)+1に格納される。
ステップ350において、処理すべき部分がもうないと決定された後、プロセスはステップ365において終了する。これが、各HPA値がちょうど2つの部分からなる実例に対して図10Gに概略的に示されている。図10Gから分かるように、上述のプロセスの後、次いで2つの宛先レジスタにわたって格納された4つのHPAアキュムレータ値がある。
ステップ330において重複削減状態が検出されたと決定されたときはいつでも、図11に概略的に示すように、重複調節プロセスをステップ335において実行することができる。
図11に示すように、第1のプロセスの間に、Zdaの上位(すなわち、重複)ビットが、Zda+1の下位ビットに加算され、次いで、図示のシフト、加算、及びAND命令を使用してゼロに再設定される。したがって、これらの命令は、前に論じたシフト、加算、及びAND演算を実行する。その後、このプロセスをさらなる部分に対して繰り返すことができる。したがって、HPA数の各々が図11に示すように3つの部分を有する場合、次いで、後続の一連のシフト、加算、及びAND演算を実行して、Zda+1の上位ビットをZda+2の下部ビットに加算することができる。
所望の変換及び累積演算が実行された後、一連のHPA結果値が作り出されていることになり、各々は、図12に概略的に示すように、一連のレジスタ内の異なるレーンを占める。1つの実例の形成では、これらの様々な結果は、一連の加算演算により、図12に示すような単一のスカラーHPA結果に累積され得る。この実例では、重複が最初に解消され、その結果、重複ビットの値を指定する必要性がないと仮定されている。同じレジスタ内のすべてのHPA部分が同じアンカー情報を有するということも仮定されている。図示のように、一連の既存のSVE削減命令を実行して、関連する最終結果部分370、372、及び374を作り出すことができ、これらの3つの部分は1つの最終HPA数を表す。
図13は、そのような最終HPA結果の1つ又は複数の浮動小数点値への変換を概略的に示す。図示の実例では、HPA数内で利用可能な精度を保持するために、所望ならば、浮動小数点値がHPA部分の各々に対して生成されてもよい。値をFP形式に変換し直すことによって、メタデータ情報を維持する必要がなく、その結果、浮動小数点値は、例えば、それをメモリに書き戻すことによって、将来の参照のために取っておくことができる。所望ならば、作り出された浮動小数点値は、図13の下部部分に示すように、単一のレジスタ内に格納されるように並べ替えることができる。図13に示すように、例えば前に論じたプロセスを使用して、一連の命令を実行し、一度に1つのHPA部分を演算してその部分を浮動小数点値に変換することができる。
図14は、使用することができるシミュレータ実施態様を示す。前に説明した実例は、関係する技法をサポートする特定の処理ハードウェアを操作するための装置及び方法に関して本発明を実施しているが、コンピュータ・プログラムの使用によって実施される、本明細書で説明した実例に従った命令実行環境を提供することも可能である。そのようなコンピュータ・プログラムは、ハードウェア・アーキテクチャのソフトウェアベース実装を提供する限りにおいて、しばしば、シミュレータと呼ばれる。多種多様なシミュレータ・コンピュータ・プログラムには、エミュレータ、仮想マシン、モデル、及び動的バイナリ・トランスレータを含むバイナリ・トランスレータが含まれる。一般に、シミュレータ実施はホスト・プロセッサ430で実行することができ、オプションとして、シミュレータ・プログラム410をサポートするホスト・オペレーティング・システム420を稼働させることができる。いくつかの形成では、ハードウェア及び提供される命令実行環境及び/又は同じホスト・プロセッサに備えられた多数の別個の命令実行環境の間にシミュレーションの多数のレイヤがあることがある。歴史的に、妥当な速度で実行するシミュレータ実施を実現するために強力なプロセッサが要求されているが、そのような手法は、特定の状況、例えば、互換性又は再使用の理由で別のプロセッサに固有のコードを実行したい場合などでは正当化されてもよい。例えば、シミュレータ実施は、ホスト・プロセッサ・ハードウェアによってサポートされない追加の機能を命令実行環境に提供することができ、又は一般に異なるハードウェア・アーキテクチャに関連する命令実行環境を提供することができる。シミュレーションの概要は、「Some Efficient Architecture Simulation Techniques」、Robert Bedichek、Winter 1990 USENIX Conference、53〜63頁に与えられている。
特定のハードウェア構成又は機能を参照して実例が前に説明された限りでは、シミュレートされた実例において、同等の機能が、適切なソフトウェア構成又は機能によって提供され得る。例えば、特定の回路が、シミュレートされた実例では、コンピュータ・プログラム論理として実施されてもよい。同様に、レジスタ又はキャッシュなどのメモリ・ハードウェアが、シミュレートされた実例では、ソフトウェア・データ構造として実装されてもよい。前に説明した実例で参照したハードウェア要素のうちの1つ又は複数が、ホスト・ハードウェア(例えば、ホスト・プロセッサ430)に存在する形成では、いくつかのシミュレートされた実例は、適切な場合には、ホスト・ハードウェアを利用することができる。
シミュレータ・プログラム410は、コンピュータ可読記憶媒体(非一時的媒体とすることができる)に格納することができ、シミュレータ・プログラム410によってモデル化されるハードウェア・アーキテクチャのアプリケーション・プログラム・インタフェースと同じであるプログラム・インタフェース(命令実行環境)を目的コード400(アプリケーション、オペレーティング・システム、及びハイパーバイザを含むことができる)に提供する。したがって、それぞれのレーン内のHPA値の上述の変換及び累積を実行するための命令を含む目的コード400のプログラム命令は、シミュレータ・プログラム410を使用して命令実行環境内から実行することができ、その結果、上述の装置のハードウェア機能を実際には有していないホスト・コンピュータ430がこれらの機能をエミュレートすることができる。
大部分のFP累積は、FP数の範囲のごく一部しか使用せず、そこで、HPA数を使用してより速く正しく計算することができる。HPA累積は、再現可能で並列化可能であり、適切なデータ範囲では、非常に的確であり、又は正確でさえある。HPAの使用は、プログラマにとってFPよりも明らかに難しくなく、FPの結合性の欠如が問題を引き起こす場合に、HPAは、プログラマには非常に簡単である。FP計算が不十分な結果を与える状況を分析するために訓練された人はほとんどいない。1つの常習的な対応は、より広いFP形式を使用して再コード化することであるが、より広い形式は、FP64よりも大きいものでは性能が不十分であり、不必要な電力及びシリコン面積を消費する。HPAの使用は、より良好な性能を与え、最も有害な丸め問題を取り除く。
第1の実例の形成では、装置は、処理回路、例えば、1つ又は複数のCPU、GPU、又は他の適切な処理回路を含むことができる。処理回路は、少なくとも1つの長整数オペランドで1つ又は複数の算術演算を実行するように構成することができる。一実例では、少なくとも1つの長整数オペランドは、2の補数整数iとすることができる。長整数オペランドは、128ビット以上を含むことができる。
装置は、追加として、複数のベクトル・データ記憶レジスタを含むことができ、例えば、ベクトル記憶レジスタは、データ(ベクトル)の1つ又は複数の1次元アレイを格納するように構成された、処理回路にアクセス可能な静的又は動的メモリの区域とすることができる。一実例では、1つ又は複数のベクトルの各々は、ベクトル処理、例えば、SIMD処理のために使用することができる。一実例では、複数のレジスタの各々は、多数の領域0、…、Nに分割することができる。各レジスタの同じ領域は並列に演算することができ、例えば、ベクトル算術命令は、単に、第1のベクトル・レジスタの領域Nに格納されている要素が、複数の他のベクトル・レジスタからの領域Nに格納されている要素とともに演算に参加することを可能にすることができる。本明細書に記載した実例では、並列に演算することができるレジスタの各々の領域は、レーンとして記載されている、例えば、各レジスタの領域0は単一のレーンを形成する、領域1はさらなるレーンを形成する、などである。一実例では、少なくとも1つの長整数オペランドが、複数のベクトル・データ記憶レジスタにわたる単一のレーンに格納され、このレーンは、本明細書では、共通レーンとして記載されている。共通レーンは、複数のレーンを含むことができる。さらなる実例では、1つ又は複数の長整数オペランドの各々は、複数のベクトル記憶データレジスタにわたる複数のレーン、例えば、レーン0、…、Nのうちの1つ又は複数に格納される。一実例では、1つ又は複数の算術演算の各々は、複数の長整数オペランドの各々で同時に実行される。複数のベクトル記憶レジスタにわたる共通レーンのサイズは可変である。
一実例では、1つ又は複数の算術演算は、長整数オペランドのうちの1つ又は複数に基づいて結果値を生成することができ、少なくとも1つの算術演算では、処理回路は、結果値の目標有効桁を表すプログラマブルな有効桁データに応答する。上述のように、一実例では、高精度アンカー固定数は、一対の数(i,a)、すなわち、長整数オペランドとプログラマブルな有効桁データとで構成され、例えば、長整数オペランドは高精度固定小数点オペランドとすることができる。プログラマブルな有効桁データは、長い2の補数整数iのビットの重みの値を表すより小さいアンカー整数とすることができる。一実例では、長整数オペランドのうちの1つ又は複数の各々は、同じプログラマブルな有効桁データを有する。
1つの実例では、処理回路は、低位ビットから上位ビットまでの少なくとも1つの長整数オペランドに1つ又は複数の算術演算を実行するように構成することができる。代替の実例では、処理回路は、高位ビットから低位ビットまでの少なくとも1つの長整数オペランドに1つ又は複数の算術演算を実行するように構成される。
複数のデータ記憶レジスタは、制御フィールドで指定された順序で配置されてもよい。一実例では、制御フィールドは、命令、例えばアーキテクチャ命令内に含まれてもよい。別の実例では、制御フィールドは、レジスタ内に含まれてもよい。
一実例では、方法は、前記の処理回路で実行することができ、この方法は、少なくとも1つの長整数オペランドに1つ又は複数の算術演算を実行することを含み、少なくとも1つの長整数オペランドは、複数のベクトル・データ記憶レジスタにわたって共通レーンに格納される。この方法は、複数の長整数オペランドに1つ又は複数の算術演算を実行することをさらに含むことができ、複数の長整数オペランドの各々は、複数のベクトル記憶データレジスタにわたって複数の共通レーンに格納される。この方法はまた、複数の長整数オペランドに基づいて結果値を生成することをさらに含むことができ、少なくとも1つの算術演算に対して、処理回路は、結果値の目標有効桁を表すプログラマブルな有効桁データに応答し、複数の長整数オペランドの各々は、同じプログラマブルな有効桁データを有する。
一実例では、この方法は、高精度固定小数点オペランドである長整数オペランドに実行することができる。
本出願において、「ように構成される(configured to…)」という語は、装置の要素が定義済み動作を実行できる構成を有することを意味するように使用される。この状況において、「構成」は、ハードウェア又はソフトウェアの相互接続の設置又は方法を意味する。例えば、装置は、定義済み動作を行う専用ハードウェアを有してもよく、又はプロセッサ若しくは他の処理デバイスが機能を実行するようにプログラムされてもよい。「ように構成される」は、定義済み動作を行うために何らかの方法で装置要素が変更される必要があることを意味しない。
本発明の例示の実施例を、本明細書において添付の図面を参照して詳細に説明したが、本発明はそれらの厳密な実施例に限定されないこと、及び様々な変更、追加、及び変形が、本発明に関して、添付の特許請求範囲によって定義されるような本発明の範囲及び趣旨から逸脱することなく、当業者によって達成され得ることを理解されたい。例えば、従属請求項の特徴の様々な組合せが、本発明の範囲から逸脱することなく、独立請求項の特徴とともに行われてもよい。