(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-08-20
(45)【発行日】2024-08-28
(54)【発明の名称】アンカーデータ値のオーバーフロー又はアンダーフロー処理
(51)【国際特許分類】
G06F 7/499 20060101AFI20240821BHJP
【FI】
G06F7/499 610
G06F7/499 101
(21)【出願番号】P 2021545709
(86)(22)【出願日】2019-11-28
(86)【国際出願番号】 GB2019053363
(87)【国際公開番号】W WO2020161457
(87)【国際公開日】2020-08-13
【審査請求日】2022-11-21
(32)【優先日】2019-02-06
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】ルッツ、デビット、レイモンド
(72)【発明者】
【氏名】バーゲス、ネイル
(72)【発明者】
【氏名】ヒンズ、クリストファー、ニール
【審査官】佐賀野 秀一
(56)【参考文献】
【文献】特表2018-500635(JP,A)
【文献】特表平11-500551(JP,A)
【文献】国際公開第2018/138469(WO,A1)
【文献】特表2019-500677(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 5/01
G06F 7/00- 7/36
G06F 7/38- 7/537
G06F 7/57- 7/575
G06F 7/74- 7/78
(57)【特許請求の範囲】
【請求項1】
装置であって、
データ処理を実行する処理回路と、
それぞれが2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素を含むアンカーデータ値の結果アンカーデータ要素を生成するためのアンカーデータ処理動作を実行するように前記処理回路を制御する命令デコーダであって、前記アンカーデータ値は、前記結果アンカーデータ要素又は前記アンカーデータ値によって表すことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に関連付けられている、命令デコーダと、
を備え、
アンカーデータ処理動作が前記アンカーデータ値によって表される前記2の補数のオーバーフロー又はアンダーフローを引き起こすことを前記アンカー情報が示すアンカーデータ処理動作に応答して、前記命令デコーダは、ソフトウェアアクセス可能な格納場所に、使用情報を格納するように前記処理回路を制御するように構成され、
前記アンカーデータ処理
動作は、浮動小数点値から、当該浮動小数点値に対応する前記2の補数のビットの一部を表すアンカーデータ要素への変換に依存し、
オーバーフローまたはアンダーフローの特定に応答して格納される使用情報は、
浮動小数点値の指数を示すこと、
前記アンカーデータ処理動作が、前記浮動小数点値を他のアンカーデータ要素に変換して得られるアンカーデータ要素の加算も含む場合、前記オーバーフローが、前記浮動小数点値が前記数値範囲外であったことに起因するものであるか、前記浮動小数点値が前記数値範囲内であったときの加算に起因するものであるかを示すこと、
前記浮動小数点値の前記指数が前記数値範囲からどの程度外れているかを示すこと、
前記浮動小数点値に相当する数値を収容するために、アンカーデータ値に必要な追加要素の数を示すことの1つまたは複数を含む、装置。
【請求項2】
前記処理回路は、前記オーバーフロー又は前記アンダーフローを引き起こす前記アンカーデータ処理動作で生成された前記結果アンカーデータ要素の一部内で前記使用情報を指定するように構成される、請求項1に記載の装置。
【請求項3】
入力アンカーデータ要素が前記使用情報を指定するアンカーデータ処理動作に応答して、前記処理回路は、同じく前記使用情報を指定する結果アンカーデータ要素を生成するように構成される、請求項1~2のいずれか1項に記載の装置。
【請求項4】
前記アンカー情報は、前記結果アンカーデータ要素が、前記アンカーデータ値の最上位アンカーデータ要素であるか、中間のアンカーデータ要素であるか、又は、最下位アンカーデータ要素であるか、を示す要素の型情報を含む、請求項1~3のいずれか1項に記載の装置。
【請求項5】
前記命令デコーダは、
前記結果アンカーデータ要素が前記アンカーデータ値の前記最上位アンカーデータ要素であることを前記アンカー情報が示し、前記結果アンカーデータ要素のオーバーフローを引き起こす、アンカーデータ処理動作、及び
前記結果アンカーデータ要素が前記アンカーデータ値の前記最下位アンカーデータ要素であることを前記アンカー情報が示し、前記結果アンカーデータ要素のアンダーフローを引き起こす、アンカーデータ処理動作、
のうちの少なくとも1つに応答して、前記使用情報を前記ソフトウェアアクセス可能な格納場所に格納するように前記処理回路を制御するように構成される、
請求項4に記載の装置。
【請求項6】
前記処理回路は、
前記アンカーデータ処理動作を含む処理動作のシーケンスの一部分において前記オーバーフローが検出された場合、前記アンカーデータ値の最上位端にある少なくとも1つの追加のアンカーデータ要素によって前記アンカーデータ値を拡張すること、
処理動作のシーケンスの前記一部分において前記アンダーフローが検出された場合、前記アンカーデータ値の最下位端にある少なくとも1つの追加のアンカーデータ要素によって前記アンカーデータ値を拡張すること、及び、
処理動作のシーケンスの前記一部分において前記オーバーフロー及び前記アンダーフローの両方が検出された場合、前記アンカーデータ値の最上位端にある少なくとも1つの追加のアンカーデータ要素と、前記アンカーデータ値の最下位端にある少なくとも1つの追加のアンカーデータ要素と、によって前記アンカーデータ値を拡張すること、
のうちの少なくとも1つを実行するように動作可能である、請求項1~5のいずれか1項に記載の装置。
【請求項7】
データ処理方法であって、
1つ以上の命令をデコードすることと、
前記デコードされた命令に応答して、それぞれが2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素を含むアンカーデータ値の結果アンカーデータ要素を生成するためのアンカーデータ処理動作を実行するように処理回路を制御することであって、前記アンカーデータ値は、前記結果アンカーデータ要素又は前記アンカーデータ値によって表すことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に関連付けられている、制御することと、
を含み、
アンカーデータ処理動作が前記アンカーデータ値によって表される前記2の補数のオーバーフロー又はアンダーフローを引き起こすことを前記アンカー情報が示す前記アンカーデータ処理動作に応答して、前記処理回路は、ソフトウェアアクセス可能な格納場所に、使用情報を格納し、
前記アンカーデータ処理
動作は、浮動小数点値から、当該浮動小数点値に対応する前記2の補数のビットの一部を表すアンカーデータ要素への変換に依存し、
オーバーフローまたはアンダーフローの特定に応答して格納される使用情報は、
浮動小数点値の指数を示すこと、
前記アンカーデータ処理動作が、前記浮動小数点値を他のアンカーデータ要素に変換して得られるアンカーデータ要素の加算も含む場合、前記オーバーフローが、前記浮動小数点値が前記数値範囲外であったことに起因するものであるか、前記浮動小数点値が前記数値範囲内であったときの加算に起因するものであるかを示すこと、
前記浮動小数点値の前記指数が前記数値範囲からどの程度外れているかを示すこと、
前記浮動小数点値に相当する数値を収容するために、アンカーデータ値に必要な追加要素の数を示すことの1つまたは複数を含む、データ処理方法。
【請求項8】
命令を実行するための命令実行環境を提供するようにホストデータ処理装置を制御するためのコンピュータプログラムを格納する非一時的記憶媒体であって、前記コンピュータプログラムは、
データ処理を実行するように前記ホストデータ処理装置を制御する、ターゲットコードのプログラム命令をデコードするための命令デコードプログラムロジックを含み、
前記命令デコードプログラムロジックは、それぞれが2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素を含むアンカーデータ値の結果アンカーデータ要素を生成するためのアンカーデータ処理動作を実行するように前記ホストデータ処理装置を制御するアンカーデータ処理プログラムロジックを含み、前記アンカーデータ値は、前記結果アンカーデータ要素又は前記アンカーデータ値によって表すことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に関連付けられており、
アンカーデータ処理動作が前記アンカーデータ値によって表される前記2の補数のオーバーフロー又はアンダーフローを引き起こすことを前記アンカー情報が示すアンカーデータ処理動作に応答して、前記命令デコードプログラムロジックは、ソフトウェアアクセス可能な格納場所に、
使用情報を格納するように前記ホストデータ処理装置を制御するように構成され、
前記アンカーデータ処理
動作は、浮動小数点値から、当該浮動小数点値に対応する前記2の補数のビットの一部を表すアンカーデータ要素への変換に依存し、
オーバーフローまたはアンダーフローの特定に応答して格納される使用情報は、
浮動小数点値の指数を示すこと、
前記アンカーデータ処理動作が、前記浮動小数点値を他のアンカーデータ要素に変換して得られるアンカーデータ要素の加算も含む場合、前記オーバーフローが、前記浮動小数点値が前記数値範囲外であったことに起因するものであるか、前記浮動小数点値が前記数値範囲内であったときの加算に起因するものであるかを示すこと、
前記浮動小数点値の前記指数が前記数値範囲からどの程度外れているかを示すこと、
前記浮動小数点値に相当する数値を収容するために、アンカーデータ値に必要な追加要素の数を示すことの1つまたは複数を含む、非一時的記憶媒体。
【請求項9】
データ処理方法であって、
アーキテクチャ状態のチェックポイントをキャプチャすることと、
前記チェックポイントでキャプチャされた前記アーキテクチャ状態に基づいて、データ処理動作のシーケンスの一部分を実行することであって、前記一部分は、それぞれが2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素を含むアンカーデータ値の結果アンカーデータ要素を生成するための少なくとも1つのアンカーデータ処理動作を含み、前記アンカーデータ値は、前記結果アンカーデータ要素又は前記アンカーデータ値によって表すことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に関連付けられている、実行することと、
オーバーフロー又はアンダーフローの検出を実行して、前記少なくとも1つのアンカーデータ処理動作が前記アンカーデータ値のオーバーフロー又はアンダーフローを引き起こすかどうかを検出することと、
前記オーバーフロー又は前記アンダーフローが検出された場合、
前記アーキテクチャ状態のチェックポイントを復元することと、
前記オーバーフローまたは前記アンダーフローの原因となる前記少なくとも1つのアンカーデータ処理動作に応答して、ソフトウェアアクセス可能な格納場所に記憶された使用情報に応じて、前記アンカーデータ値
のフォーマットを変更することであって、前記使用情報は、前記オーバーフローまたは前記アンダーフローの原因と、前記オーバーフローまたは前記アンダーフローを防止するために前記アンカーデータ値の前記フォーマットを変更する方法の指示との少なくとも1つを示す、前記フォーマットを変更することと、
前記変更されたフォーマット及び前記復元されたアーキテクチャ状態のチェックポイントに基づいて、前記データ処理動作のシーケンスの前記一部分を再試行することと、
を含む、データ処理方法。
【請求項10】
前記少なくとも1つのアンカーデータ処理動作がオーバーフロー又はアンダーフローを引き起こさない場合に、前記方法は、前記データ処理動作のシーケンスの次の部分を実行する前に、前記データ処理動作の前記一部分から生じるアーキテクチャ状態の更なるチェックポイントをキャプチャすることを含む、請求項9に記載のデータ処理方法。
【請求項11】
前記オーバーフローが検出された場合、前記フォーマットを変更することは、前記アンカーデータ値の最上位端にある少なくとも1つの追加のアンカーデータ要素によって前記アンカーデータ値を拡張することを含む、請求項9及び10のいずれか1項に記載の方法。
【請求項12】
前記アンダーフローが検出された場合、前記フォーマットを変更することは、前記アンカーデータ値の最下位端にある少なくとも1つの追加のアンカーデータ要素によって前記アンカーデータ値を拡張することを含む、請求項9~11のいずれか1項に記載の方法。
【請求項13】
前記データ処理動作のシーケンスの前記一部分においてオーバーフローとアンダーフローの両方が検出された場合、前記フォーマットを変更することは、前記アンカーデータ値の最上位端にある少なくとも1つの追加のアンカーデータ要素と、前記アンカーデータ値の最下位端にある少なくとも1つの追加のアンカーデータ要素と、によって前記アンカーデータ値を拡張することを含む、請求項9~12のいずれか1項に記載の方法。
【請求項14】
前記アンカーデータ要素は、V個の重複ビットとW個の非重複ビットとを含むNビット値であり、
浮動小数点値をアンカーデータ要素に変換するための浮動小数点からアンカーデータへの変換動作に応答して、前記浮動小数点値が表す数が許容される数値範囲内にある場合、前記アンカーデータ要素の前記W個の非重複ビットは、前記浮動小数点値に対応する前記2の補数のビットの一部分を表すように設定され、また、前記アンカーデータ要素の前記V個の重複ビットは、前記W個の非重複ビットの符号拡張に設定され、
前記オーバーフロー又は前記アンダーフローの検出は、第1のアンカーデータ要素の前記V個の重複ビットで表されるキャリーを第2のアンカーデータ要素の前記W個の非重複ビットに伝搬する重複伝搬動作の実行時に実行される、
請求項9~13のいずれか1項に記載の方法。
【請求項15】
アンカーデータ処理動作が前記アンカーデータ値によって表される前記2の補数のオーバーフロー又はアンダーフローを引き起こすことを前記アンカー情報が示す前記アンカーデータ処理動作に応答して、使用情報をソフトウェアアクセス可能な格納場所に格納することを含み、
前記使用情報は、
前記オーバーフロー又は前記アンダーフローの原因、及び
前記オーバーフロー又は前記アンダーフローを防ぐために前記アンカーデータ値の前記フォーマットをどのように変更するかの指示、
のうちの少なくとも1つを示し、
前記アンカーデータ値の前記フォーマットを変更することは、前記使用情報に依存する、
請求項9~14のいずれか1項に記載の方法。
【請求項16】
前記オーバーフロー又は前記アンダーフローが検出された場合、前記方法は、
前記使用情報が少なくとも1つの再試行条件を満たしているかどうかを判断することと、
前記使用情報が前記少なくとも1つの再試行条件を満たす場合、前記使用情報に基づいて前記アンカーデータ値の前記フォーマットを変更し、前記変更されたフォーマットに基づいて前記データ処理動作のシーケンスの前記一部分を再試行することと、
前記使用情報が前記少なくとも1つの再試行条件を満たさない場合、前記データ処理動作のシーケンスを終了すること、又は、前記少なくとも1つの部分を再試行せずに前記データ処理動作のシーケンスを継続することと、
を含む、請求項15に記載の方法。
【請求項17】
前記使用情報が前記少なくとも1つの再試行条件を満たさない場合、前記方法は、前記使用情報、あるいは前記オーバーフロー又は前記アンダーフローに関する他の情報を返すことを含む、請求項16に記載の方法。
【請求項18】
前記データ処理動作のシーケンスの完了時又は終了時に、ソフトウェアアクセス可能な格納場所に、
前記データ処理動作のシーケンスの一部分の再試行する必要がある条件、
前記データ処理動作のシーケンスが完了したときに前記アンカーデータ値に含まれるアンカーデータ要素の最終的な数、及び
前記データ処理動作のシーケンスの実行中に行われた任意の更新によって生じる最終的なアンカー情報、
のうちの少なくとも1つを示す情報を格納することを含む、
請求項9~17のいずれか1項に記載の方法。
【請求項19】
請求項9~18のいずれか1項に記載の方法を実行するようにデータ処理装置を制御するためのコンピュータプログラムを格納した非一時的記憶媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本技術は、データ処理分野に関するものである。
【0002】
データ処理システムでは、浮動小数点(FP)表現を使用するのが一般的である。浮動小数点数は、仮数と、その仮数のビットの有意性を示す指数とを含む。これにより、有限数のビットを用いて広い範囲の数値を表現することができる。しかし、浮動小数点演算の問題点は、一般的に計算が非結合的であるため、和が問題となる点である。特にプログラマは、少数の値を加算するときでさえ、異なる結果を得ることを気にしなければならない。
【0003】
この結合性の問題を解決するために、高精度アンカー(HPA)数と呼ばれる新しいデータ型が提案されている。高精度アンカー(HPA)数は、通常iの最小ビットの有意性を指定することにより、長い2の補数(例えば200ビット)の整数iと、iのビットの重みを表す小さいアンカー整数aと、を含むペア(i,a)で構成され得る。浮動小数点値をHPA形式に変換し、その後、結合的に加算を実行することができる。
【0004】
少なくともいくつかの例は、装置であって、データ処理を実行する処理回路と、それぞれが2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素を含むアンカーデータ値の結果アンカーデータ要素を生成するためのアンカーデータ処理動作を実行するように処理回路を制御する命令デコーダであって、当該アンカーデータ値は、結果アンカーデータ要素又はアンカーデータ値によって表すことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に関連付けられている、命令デコーダと、を備え、アンカーデータ処理動作がアンカーデータ値によって表される2の補数のオーバーフロー又はアンダーフローを引き起こすことをアンカー情報が示すアンカーデータ処理動作に応答して、命令デコーダは、ソフトウェアアクセス可能な格納場所に、オーバーフロー又はアンダーフローの原因、及び、オーバーフロー又はアンダーフローを防ぐためにアンカーデータ値のフォーマットをどのように変更するかの指示、のうちの少なくとも1つを示す使用情報を格納する処理回路を制御するように構成される、装置、を提供する。
【0005】
少なくともいくつかの例は、データ処理方法であって、1つ以上の命令をデコードすることと、デコードされた命令に応答して、それぞれが2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素を含むアンカーデータ値の結果アンカーデータ要素を生成するためのアンカーデータ処理動作を実行するように処理回路を制御することであって、当該アンカーデータ値は、結果アンカーデータ要素又はアンカーデータ値によって表すことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に関連付けられている、制御することと、を含み、アンカーデータ処理動作がアンカーデータ値によって表される2の補数のオーバーフロー又はアンダーフローを引き起こすことをアンカー情報が示すアンカーデータ処理動作に応答して、処理回路は、ソフトウェアアクセス可能な格納場所に、オーバーフロー又はアンダーフローの原因、及び、オーバーフロー又はアンダーフローを防ぐためにアンカーデータ値のフォーマットをどのように変更するかの指示、のうちの少なくとも1つを示す使用情報を格納する、データ処理方法を提供する。
【0006】
少なくともいくつかの例は、命令を実行するための命令実行環境を提供するようにホストデータ処理装置を制御するためのコンピュータプログラムを格納する非一時的記憶媒体であって、コンピュータプログラムは、データ処理を実行するようにホストデータ処理装置を制御する、ターゲットコードのプログラム命令をデコードするための命令デコードプログラムロジックを含み、当該命令デコードプログラムロジックは、それぞれが2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素を含むアンカーデータ値の結果アンカーデータ要素を生成するためのアンカーデータ処理動作を実行するようにホストデータ処理装置を制御するアンカーデータ処理プログラムロジックを含み、当該アンカーデータ値は、結果アンカーデータ要素又はアンカーデータ値によって表すことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に関連付けられており、アンカーデータ処理動作がアンカーデータ値によって表される2の補数のオーバーフロー又はアンダーフローを引き起こすことをアンカー情報が示すアンカーデータ処理動作に応答して、命令デコードプログラムロジックは、ソフトウェアアクセス可能な格納場所に、オーバーフロー又はアンダーフローの原因、及び、オーバーフロー又はアンダーフローを防ぐためにアンカーデータ値のフォーマットをどのように変更するかの指示、のうちの少なくとも1つを示す使用情報を格納するように処理回路を制御するように構成される、非一時的記憶媒体、を提供する。
【0007】
少なくともいくつかの例は、データ処理方法であって、アーキテクチャ状態のチェックポイントをキャプチャすることと、チェックポイントでキャプチャされたアーキテクチャ状態に基づいて、データ処理動作のシーケンスの一部分を実行することであって、一部分は、2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素を含むアンカーデータ値の結果アンカーデータ要素を生成するための少なくとも1つのアンカーデータ処理動作を含み、当該アンカーデータ値は、結果アンカーデータ要素又はアンカーデータ値によって表すことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に関連付けられている、実行することと、オーバーフロー又はアンダーフローの検出を実行して、少なくとも1つのアンカーデータ処理動作がアンカーデータ値のオーバーフロー又はアンダーフローを引き起こしたかどうかを検出することと、オーバーフロー又はアンダーフローが検出された場合、アーキテクチャ状態のチェックポイントを復元することと、アンカーデータ値のフォーマットを変更することと、変更されたフォーマット及び復元されたアーキテクチャ状態のチェックポイントに基づいて、データ処理動作のシーケンスの当該一部分を再試行することと、を含む、データ処理方法を提供する。
【0008】
少なくともいくつかの例は、アーキテクチャ状態のチェックポイントをキャプチャすることを含む方法を実行するようにデータ処理装置を制御するためのコンピュータプログラムを格納した非一時的記憶媒体、を提供する。
【図面の簡単な説明】
【0009】
本技術の更なる態様、特徴、及び利点は、添付の図面と併せて読まれるべき以下の実施例の説明から明らかとなるであろう。
【
図1】
図1は、データ処理装置を模式的に示す図である。
【
図2】
図2は、数値の異なる表現を模式的に示す図である。
【
図3】
図3は、倍精度浮動小数点値と高精度アンカー(HPA)値との関係の一例を模式的に示す図である。
【
図4】
図4は、有意性が重複する複数のNビット部分を含む冗長な表現を用いて数値を表す冗長HPA値の一例を示す図である。
【
図5】
図5は、一例において、HPA整数がどのように複数のベクトルレジスタをまたがる選択されたレーン内に格納され得るかを模式的に示す図である。
【
図6】
図6は、1つの例示的な構成による、どのように浮動小数点数をHPA形式に変換して処理し得るかを模式的に示したブロック図である。
【
図7】
図7は、一例において使用され得るメタデータの形態を模式的に示す図である。
【
図8】
図8は、一例における、各レーンに関連して提供され得る変換及び処理回路をより詳細に示す図である。
【
図9】
図9は、アンカーデータ要素が2の補数のビットの一部分を表すのか、又は、特殊値を表すのか、を示す型情報を含むアンカーデータ要素の符号化を示す図である。
【
図11】
図11は、第1オペランド及び第2オペランドの型情報に基づいて、結果アンカーデータ要素の型情報を設定する際の異なる結果を示す図である。
【
図12】
図12は、オーバーフロー又はアンダーフローに応答して使用情報を格納することを含む、アンカーデータ処理方法を示す図である。
【
図13】
図13は、少なくとも1つのアンカーデータ処理動作を含むデータ処理動作のシーケンス中に、アンカーデータ値に含まれるアンカー情報及び/又は要素数を動的に調整する方法を示す図である。
【
図15】
図15は、検出されたオーバーフローに応答して、アンカーデータ値の最上位端に少なくとも1つの追加要素を提供する例を示す図である。
【
図16】
図16は、検出されたアンダーフローに応答して、アンカーデータ値の最下位端に少なくとも1つの追加要素を提供する例を示す図である。
【
図17】
図17は、使用される可能性のあるシミュレータの例を示す図である。
【発明を実施するための形態】
【0010】
前述したように、浮動小数点演算の問題点は、一般的に計算が結合的であることであり、これが和算の問題点となっている。例えば、複数の浮動小数点値を加算する場合、前の加算の結果に別の値を加算するたびに、結果は丸められ、正規化され、これは値を加算する順序によって全体の結果が異なることを意味する。このため、全く同じ順序で加算しないと和の再現性がないため、浮動小数点演算の並列化が困難である。再現性のある結果を得るためには、通常、一連の加算又は減算を連続して実行しなければならず、これにより浮動小数点演算は、相対的に遅くなる。
【0011】
そのため、プログラマは、このような異なる結果を回避するために、必要以上に高い精度を使用する。そのため、同じ順序で計算しないと和は再現性がないため、プログラマは簡単にコードを並列化することができない。
【0012】
この問題は、プログラムが数百万の値を加算する必要があり得るハイパフォーマンスコンピューティング(HPC)では特に顕著である。プログラマは、これらの問題を並列化したいが、そうすると再現性がないためにデバッグが難しくなる。マシンの構成が違う場合ですら、たとえそのマシン用の再プログラミングが完璧に行われたとしても、異なる答えが出てしまう。
【0013】
前述のとおり、結合性の問題を解決するために、HPA(高精度アンカー)数と呼ばれる新しいデータ型が提案されている。HPA数は、長い2の補数(例えば200ビット)の整数iと、iのビットの重みを表す小さいアンカー整数aと、を含むペア(i,a)で構成され得、通常はiの最小ビットの有意性を指定する)。このペアは、FP数の仮数と指数値にやや類似しているが、長整数iが正規化されておらず、通常はFPの仮数よりもはるかに大きい点と、及び、アンカー値aがHPA動作のすべてのオペランドに対して固定されている点と、が異なる。FP数を追加すると指数が変化させることはあるが、HPA数を追加してもアンカーは変化しない。
【0014】
自明な例として、10ビットのiとアンカー値a=-4で構成されるHPA表現を考えてみる。このフォーマットのいくつかの値を表1に示す。
【0015】
【0016】
0.5と1.5とのように2つの数を足しても、アンカー(-4)は変わらないので、iの値だけを足すことで簡便に和が得られる。HPAの和は、ちょうど2の補数の足し算なので、範囲が十分であれば、HPAの和は結合的、正確、及び、反復可能である。
【0017】
FP数は範囲が広い。倍精度数(FP64)は、2~1000より小さく、21000より大きくなり得るが、ほとんどの集積はこの全範囲には及ばない。実際のところ、この範囲のすべての値を有意性のある形で加算するような問題を想像するのは難しく、HPCでさえほとんどの集積は限られた範囲で行われる。倍精度演算よりも広い範囲の演算を必要とするほとんどのアプリケーションには、200ビット程度で十分足りると考えられる。プログラマが、ある和のデータはすべて2100より小さい大きさであり、2~50以下の大きさのビットは、和に有意性のある影響を与えないと判断するとする。HPAフォーマット(i,-50)で200ビットのiを使ってデータを加算すると、集積は結合的に行われ、少なくとも249個の数をどのような順序でもオーバーフローの心配なく加算することができる。
【0018】
近年のほとんどのアーキテクチャにはSIMD(Single Instruction Multiple Data:単一命令複数データ)ユニットが搭載されており、これを使って長整数を表すことができる。64ビットレーン間のキャリーを容易にするためのロジックを少し追加すれば、256ビットSIMDユニットを使って256ビットの整数を加算することができる。あるいは、詳細は後述するが、冗長な表現を用いることで、ほとんどの加算においてレーン間のキャリーを回避することができる。SIMDレジスタでHPA(アンカーデータ)値(又は長整数)を表すための1つのアプローチは、HPA値のいくつかのHPA(アンカーデータ)要素を、単一のSIMDレジスタ内のそれぞれのベクトルレーンに割り当てることである。あるいは、後述するように、HPA値のそれぞれのアンカーデータ要素は、複数の異なるSIMDレジスタ内の対応するベクトルレーンに割り当てられ、全アンカーデータ値のそれぞれ部分は、異なるベクトルレジスタの対応する位置にあり、単一のベクトルレジスタには、複数のアンカーデータ要素が含まれており、それぞれが異なるアンカーデータ値(HPA値)の一部を構成することも可能である。
【0019】
以下の技術では、装置は、データ処理を実行する処理回路と、処理回路により実行されるデータ処理を制御するための命令をデコードする命令デコーダとを備えている。命令デコーダは、それぞれが2の補数のビットのそれぞれの一部分を表す1つ以上のアンカーデータ要素からなるアンカーデータ値の結果アンカーデータ要素を生成するアンカーデータ処理動作を実行するように処理回路を制御するための命令をサポートしてもよい。アンカーデータ処理動作は、結果アンカーデータ要素又はアンカーデータ値であらわすことができる数値範囲を示す少なくとも1つの特性を示すアンカー情報に依存する。アンカー情報を使用することで、プログラマ又はコンパイラが想定する所与アプリケーションの値の範囲に依存して、アーキテクチャは、計算に使用するビット数を制限しつつ、アンカーデータフォーマットの幅広い数値をサポートすることができる。しかし、プログラマ又はコンパイラがアンカー情報を適切に設定していない可能性があり、アンカー情報で定義された許容される数値範囲内で、アンカーデータフォーマットで表現できない一連の動作に対して、入力が行われる可能性が時々ある。そのため、アンカーデータ処理動作を行うと、アンカーデータ値で表される2の補数のアンダーフロー又はオーバーフローを引き起こし、処理結果の正しい値が、アンカーデータ値で表すことのできる数値範囲よりも大きくなったり小さくなったりすることがあり得る。このようなオーバーフロー又はアンダーフローを処理するための1つのアプローチは、単に、何らかの応答アクションを取るようにソフトウェアをトリガし得る例外を通知することであり得る。しかし、これではソフトウェアにとってどのように対応すべきか判断するのが難しい可能性がある。
【0020】
後述の技術では、処理回路及び命令デコーダは、オーバーフロー又はアンダーフローの原因、及び、オーバーフロー又はアンダーフローを防ぐためにアンカーデータ値のフォーマットをどのように変更するかの指示、のうちの少なくとも1つを示す使用情報をソフトウェアに利用可能にすることをサポートしてもよい。フォーマットの変更の表示は、例えば、アンカーデータフォーマットで提供する追加のアンカーデータ要素の数の表示、追加のアンカーデータ要素の総数の表示、及び/又は、更新されたアンカー情報の表示などであり得る。
【0021】
したがって、オーバーフロー又はアンダーフローの場合、ハードウェアは、オーバーフロー又はアンダーフローが発生した理由、又は、オーバーフロー又はアンダーフローを防ぐためにアンカーデータ値のフォーマットをどのように変更するかの指示、又は、その両方に関する情報を返し、ソフトウェアがどのように処理を進めるべきかを判断するのをサポートする。これは、後述するように、アンカーデータ値のフォーマットを動的に調整し得る(例えば、アンカー情報及び/又は要素数を変更する)ソフトウェアアルゴリズムをサポートすることができる。これにより、ソフトウェア開発者にとって、アンカーデータ処理を使用するソフトウェアを設計することが非常に容易になる。ソフトウェアアクセス可能な格納場所への使用情報の格納は、使用情報の格納を制御するための専用の状態格納命令を必要とせず、オーバーフロー又はアンダーフローをトリガしたアンカーデータ処理動作に対応してハードウェアで自動的に実行してもよい。
【0022】
アンカー情報は、所与のアンカーデータ処理動作で生成されるアンカーデータ要素、又は、アンカーデータ値全体の1つ又は複数の異なる特性を示すことができる。例えば、少なくとも1つの特性は、以下の少なくとも1つを構成することができる。
・ 結果アンカーデータ要素により表されるビットの部分の有意性、
・ 結果アンカーデータ要素により表される2の補数の部分のビットの幅、
・ アンカーデータ値の1つ以上の他のアンカーデータ要素に対する、結果アンカーデータ要素の相対的な位置、及び、
・ アンカーデータ値に含まれるアンカーデータ要素の総数。
【0023】
アンカー情報は、上記の特性をすべて示すことは必須ではない。ここでいう「有意性」とは、所与のビット位置で表される特定の2の累乗を意味する。例えば、2の補数のビットのうち、24を表すビット値は、23を表す2の補数のビットよりも大きい有意性を有すると考えられる。つまり、2の補数の最上位ビットが最も高い有意性を有し、最下位ビットが最も低い有意性を有する。
【0024】
前述のように、アンカーデータ処理をベクトル動作で行う場合、同じアンカーデータ値の異なるデータ要素を、単一のベクトルレジスタ内の複数のレーンにまたがって分散させること、又は、同じアンカーデータ値のそれぞれのデータ要素を、複数のベクトルレジスタの対応するレーンにまたがってストライピングすることのいずれかが可能である。最初のケースでは、アンカーメタデータは、アンカーデータ値のアンカーデータ要素の合計数を指定することができ、又は、別の変数がアンカーデータ要素の数を定義することもできる。2つめのケースでは、所与のアンカーデータ処理命令は、一度に1つのアンカーデータ値の要素しか見ることができず、そのため、アンカーデータ処理動作のソースオペランドとして提供されるアンカーメタデータは、アンカーデータ要素の総数を定義する必要はないため、アンカーメタデータ自身は、アンカーデータ要素の総数を示す必要はない。この場合、アンカーデータの総数は、アンカーデータ処理を制御するプログラムが保持する変数を使って別途指定することができる。この変数は、それぞれが異なるレジスタの要素に作用する所与のアンカーデータ値のそれぞれのアンカーデータ要素を処理するために、いくつのアンカーデータ処理命令が実行されるかを制御するために使用することができる。
【0025】
使用情報は、アンカーデータ値のオーバーフロー又はアンダーフローを引き起こす可能性のあるアンカーデータ処理動作に対して返される可能性がある。しかし、アンカーデータ処理動作が、浮動小数点値に対応する2の補数のビットの一部分を表す、結果アンカーデータ要素への浮動小数点値の変換に依存する変換動作を含む場合には、特に有用であり得る。アンカーデータ値のオーバーフロー又はアンダーフローの原因としては、アンカーデータ処理を用いて実行する動作のシーケンスへの入力として提供された浮動小数点値が、アンカー情報で定義された数値範囲外である可能性がよくある。したがって、このような浮動小数点からアンカーデータへの変換動作において、アンカーデータフォーマットで浮動小数点値の数値を正確に表現することが、少なくとも1つの、許容される数値範囲で表すことができるよりも有意性の高いビット、又は、有意性が低いビットを要求する場合、オーバーフロー又はアンダーフローが通知される。浮動変換動作(float-to-conversion operation)は、浮動小数点値をアンカーデータ要素に変換するが、アンカーデータ要素の更なる処理を行う単独の変換動作、又は、浮動小数点値を変換するとともに、変換後のアンカーデータ要素を第2のアンカーデータ要素に追加する変換・加算動作、であってもよい。
【0026】
このような浮動小数点からアンカーデータへの変換動作の場合、いくつかの例では、使用情報は、オーバーフロー又はアンダーフローを引き起こす浮動小数点値の指数から導出される情報を含み得る。これは、動作の同じシーケンスが後で再試行された場合に、同じ浮動小数点値に対応できるようにするために、アンカーデータの値、及び/又は、アンカー情報の要素の総数に対してどのような変更が必要であるかを、ソフトウェアが使用情報から判断するのに役立つ。指数から導出される情報は、異なる方法で表現することができる。場合によっては、使用情報は、単に指数自体を含んでもよい。また、使用情報は、指数が許容される数値範囲内にあるかどうかを示すフラグを含んでもよい。時には、許容される数値範囲内の浮動小数点値を処理しても、許容範囲の最大値に近い浮動小数点値にそれぞれが対応する複数のアンカーデータ値を加算した結果が許容範囲を超えてしまうと、オーバーフロー又はアンダーフローの原因となることがある。したがって、変換された浮動小数点値の指数が範囲内にあるか否かの表示は、オーバーフローに対処するためにアンカーデータ値に対して単一の追加アンカーデータ要素で十分であり得るか、又は、より多くの要素が必要であり得るか、をソフトウェアが判断するのに役立つ。(変換される浮動小数点値の指数に応じた使用情報の)他の例としては、指数がどの程度想定範囲外であるかの表示、又は、アンカー情報で定義された許容数値範囲を有するアンカーデータ値の中に浮動小数点値に相当する数値を格納するために、アンカーデータ値に必要な追加要素数の表示、であってもよい。これらのすべての例により、オーバーフロー又はアンダーフローを引き起こした浮動小数点値に対応するために、ソフトウェアがアンカーデータ値のフォーマットをどのように更新するかを決定することができる。
【0027】
別の実装形態は、使用情報が格納されるソフトウェアアクセス可能な格納場所として、別の場所を選択してもよい。ソフトウェアアクセス可能な格納場所を、メモリ上の場所とすることも可能である。
【0028】
しかしながら、他の例としては、ソフトウェアアクセス可能な格納場所は、
結果アンカーデータ要素を格納するために使用されるデスティネーションレジスタ、及び、
結果アンカーデータ要素が格納されるレジスタとは別に、汎用レジスタと専用レジスタとのうちの少なくとも1つ
の少なくとも1つを含む。
【0029】
ソフトウェアアクセス可能な格納場所は、オーバーフロー又はアンダーフローを引き起こしたアンカーデータ処理動作で生成された、結果アンカーデータ要素を格納するのにも使用される同じデスティネーションレジスタを含むことが有用であり得る。これは、メモリへの追加の格納動作が必要ないことを意味し、また、アンカーデータ処理命令に必要なレジスタの書き込みが1回で済むこともあり、マイクロアーキテクチャの複雑さを軽減するのに役立つ。命令設定アーキテクチャでは、2つ以上のデスティネーションレジスタを更新する必要のある命令は比較的少ないため、多くのマイクロアーキテクチャの実装形態では、1つのレジスタ書き込みポートしか提供されないことがある。そのため、使用情報の返送用に第2のレジスタ書き込みポートを設ける必要を回避することは、回路面積や消費電力の削減に貢献することができる。あるいは、装置が2つ以上のレジスタライトポートを有している場合でも、アンカーデータ処理動作を処理する際に、第2のライトポートは、第1のレジスタ書き込みポートと同じ命令に使用されるのではなく、異なる命令に応じて異なるレジスタライトを実行するために使用される可能性がある。そのため、使用情報を結果と同じレジスタに格納することで、マイクロアーキテクチャの実装形態の効率を向上させることができる。
【0030】
使用情報は、オーバーフロー又はアンダーフローが発生していない場合、通常は結果の2の補数値の一部を格納するデスティネーションレジスタの一部のビットに書き込まれることができる。結果自体を完全に表現できないため、好ましくないと思われるかもしれないが、実際にはオーバーフロー又はアンダーフローが発生した場合、アンカー情報の異なる値で後から動作を繰り返すことが多いため、この時点ではオーバーフロー又はアンダーフローが発生したアンカーデータ要素で表される実際の数値はもはや重要ではない。そのため、通常はデータ値自体の一部となるビットを再利用して使用情報を通知することで、追加のストレージが必要となるのを回避することができる。したがって、使用情報は、結果アンカーデータ要素自体の一部内で指定されてもよい。
【0031】
後続のアンカーデータ処理動作において、所与の動作に対する入力アンカーデータ要素が、アンカーデータ要素の一部に使用情報を指定している場合、処理回路は、使用情報を指定する結果アンカーデータ要素も生成することができる。したがって、使用情報は、一度設定されると、一連の処理結果を通じて持続するという意味でスティッキーであると言え、そのため、一連の処理動作の終了時に、ソフトウェアは最終結果を調べて、一連の処理の中でオーバーフロー又はアンダーフローを引き起こした動作があるかどうかを判断し、オーバーフロー又はアンダーフローを防ぐためにアンカーデータ値のフォーマットをどのように変更するかの可能性のある原因及び/又は指示を使用情報から学ぶことができる。使用情報が、浮動小数点値が許容範囲をどの程度超えるかを示す、浮動小数点値の指数から導出される何らかの情報(例えば、指数自体、又は、指数と許容される数値範囲の境界に相当する有効指数との差)を含む実装形態では、入力アンカーデータ要素が使用情報を指定した後に、入力アンカーデータ要素内の使用情報が既に示した数値範囲よりも更に外側にある浮動小数点値に遭遇した場合、結果アンカーデータ要素は、最新のアンカーデータ処理動作の浮動小数点値の指数に基づいて更新される、更新された使用情報で生成されてもよい。したがって、一連のアンカーデータ処理動作により、使用情報は、アンカー情報で定義された許容範囲から最も離れた浮動小数点値、及び/又は、アンカーデータ値の要素数、を追跡するように徐々に更新されてもよい。
【0032】
他の例では、ソフトウェアアクセス可能な格納場所は、汎用レジスタと、結果アンカーデータ要素が格納されるレジスタとは別の専用レジスタの少なくとも1つを含んでもよい。これには第2のレジスタが必要になるかもしれないが、これにより結果アンカーデータ要素の数値を使用情報と一緒に格納できるという利点がある。繰り返すが、ある動作の入力が予想される範囲をどれだけ逸脱しているかを使用状況情報が示している場合、別のレジスタに格納された使用情報は、一連の動作の中で見られた範囲外の最大のマージンを追跡するために、連続した動作の中で再び更新され得る。
【0033】
いくつかの例では、所与のアンカーデータ要素に関連するアンカー情報は、その要素がアンカーデータ値の最上位アンカーデータ要素であるか、中間のアンカーデータ要素であるか、又は、最下位アンカーデータ要素であるか、を示す要素の型情報を含んでいてもよい。これは、複数のレジスタにまたがるアンカーデータ値のストライピングをサポートする、及び/又は、個々のベクトルレジスタの長さと異なる長さのアンカーデータ値をサポートするのに役立つ。命令デコーダは、アンカー情報内の要素の型情報を用いて、所与のアンカーデータ処理動作においてオーバーフロー又はアンダーフローが検出された場合に、使用情報を生成してソフトウェアアクセス可能な格納場所に格納する必要があるかどうかを判断するように処理回路を制御してもよい。例えば、現在の動作が、所与のアンカーデータ値の中間又は最下位アンカーデータ要素を生成している場合、オーバーフローがあると、これはアンカー情報の発言が不適切であるという信号になるだけではなく、後述するように重複の伝搬が十分に実行されなかったために、アンカーデータ値の中にレーンオーバーフローがあったことを示してもよい。いくつかの場合では、レーンオーバーフローを処理するために、単に使用情報を通知するだけでなく、例外をトリガするなど、より深刻な応答アクションが必要になることがある。したがって、いくつかの場合では、オーバーフロー時に生成される使用情報は、アンカーデータ処理動作がアンカーデータ値の最上位アンカーデータ要素を生成する動作である場合に限定されることがある。
【0034】
一方、所与のアンカーデータ値の最上位アンカーデータ要素を生成する動作に対しては、アンダーフローが発生しても、またもや結果の有意性の低いビットを収容できる別の命令によって計算される下位要素があるため、使用情報を報告する必要がない場合がある。したがって、使用情報を介したアンダーフローの報告は、アンカー情報が、結果のアンカーデータ要素がアンカーデータ値の最下位アンカーデータ要素であることを示しているアンカーデータ処理動作に限定される場合がある。
【0035】
オーバーフローとアンダーフローとの両方を使用情報を用いて報告することは必須ではない。いくつかのシステムでは、アンダーフローは単に精度の低下につながるため、追跡が重要視されない場合があるが、オーバーフローは、オーバーフローにより誤った大きさの値になる可能性があるため、より重要視される場合がある。そのため、いくつかの実装形態は、オーバーフローにのみ応答し、アンダーフローには応答せずに使用情報を設定することも可能である。
【0036】
後述するように、いくつかの例では、ハードウェアアーキテクチャは、ソフトウェアアクセス可能な場所に使用量情報を自動的に返すことができるが、その後、ハードウェア上で実行されるソフトウェアは、使用量情報を使用して、例えば、追加要素を提供すること、及び/又は、アンカー情報を変更することによってアンカーデータ値のフォーマットを変更することで、オーバーフロー又はアンダーフローにどのように対応するかを判断することができる。
【0037】
しかしながら、他の実装形態では、使用情報を自動的に使用してアンカーデータ値のフォーマットを適応させるためのハードウェアを提供することができ、そのため、プログラマ/コンパイラは使用情報をチェックするための命令を含める必要がない。したがって、いくつかの例では、処理回路は、
アンカーデータ処理動作を含む処理動作のシーケンスの一部分においてオーバーフローが検出された場合、アンカーデータ値の最上位端にある少なくとも1つの追加のアンカーデータ要素によってアンカーデータ値を拡張すること、
処理動作のシーケンスの当該一部分においてアンダーフローが検出された場合、アンカーデータ値の最下位端にある少なくとも1つの追加のアンカーデータ要素によってアンカーデータ値を拡張すること、及び
処理動作のシーケンスの当該一部分においてオーバーフロー及びアンダーフローの両方が検出された場合、アンカーデータ値の最上位端にある少なくとも1つの追加のアンカーデータ要素と、アンカーデータ値の最下位端にある少なくとも1つの追加のアンカーデータ要素と、によってアンカーデータ値を拡張すること
のうちの少なくとも1つを実行するように動作可能であってもよい。
【0038】
別の例では、データ処理方法は、少なくとも1つのアンカーデータ処理動作を含むデータ処理動作のシーケンスを含むことができる。この方法では、データ処理動作のシーケンスの一部分を実行する前に、アーキテクチャ状態のチェックポイントをキャプチャすることができる。このチェックポイントは、現在のアーキテクチャ状態の完全な記録である必要はないが、データ処理動作のシーケンスの一部分を実行する際に上書きされる可能性のあるアーキテクチャ状態を少なくとも含むことができる。そして、その部分は、上述のようにアンカー情報に基づいて結果アンカーデータ要素を生成する少なくとも1つのアンカーデータ処理動作を含めて実行される。オーバーフロー又はアンダーフローの検出を実行して、少なくとも1つのアンカーデータ処理動作がアンカーデータ値のオーバーフロー又はアンダーフローを引き起こすかどうかを検出する。オーバーフロー又はアンダーフローが検出された場合、以前にキャプチャしたアーキテクチャ状態のチェックポイントを復元し、アンカーデータ値のフォーマットを変更し、変更されたフォーマットと復元されたアーキテクチャ状態のチェックポイントとに基づいて、データ処理動作のシーケンスの同じ部分を再試行することができる。
【0039】
この方法は、オーバーフロー又はアンダーフローが発生したか否かを自動的に検出し、発生した場合にはアンカーデータフォーマットを調整(例えば、要素数及び/又はアンカー情報の変更)して動作を再試行することで、プログラマ又はコンパイラによるアンカー情報の設定が不適切であった場合にプログラム自体が対応し、実行した動作から学習するソフトウェアルーティンを可能にする。これにより、アンカーデータ処理を行うソフトウェアをプログラミングする際のプログラマの負担を大幅に軽減することができる。例えば、ライブラリにこのような方法を実行するルーティンを用意しておき、所与のプログラムにより呼び出すことで、多数の変換や加算を含むアンカーデータフォーマットの特定の数の浮動小数点値を処理することができる。実行される処理動作のシーケンスを通じて間隔をおいてアーキテクチャ状態のチェックポイントをキャプチャし、追加レーンを追加し、又は、オーバーフロー又はアンダーフローが検出された場合にアンカー情報を自動的に更新し、必要に応じて前の部分を再試行できるようにし、これにより、アンカーを動的に調整することができ、与えられた浮動小数点入力の大きさの範囲をプログラマが予測することなく進めることができる。
【0040】
一方、オーバーフロー又はアンダーフローの検出を実行する際に、少なくとも1つのアンカーデータ処理動作がオーバーフロー又はアンダーフローを引き起こさなかったことが検出された場合、本方法は、データ処理動作のシーケンスの次の部分を実行する前に、データ処理動作の一部分から生じるアーキテクチャ状態の更なるチェックポイントをキャプチャすることを含んでもよい。次の部分は、アンカー情報又は要素数を更新することなく、前の部分と同じアンカーデータフォーマットで処理される。また、直前に終了した部分が最後の部分であった場合、必要に応じて、シーケンスを停止し、アンカーデータフォーマットの結果を、浮動小数点フォーマット又はその他の数値フォーマットに変換することもできる。
【0041】
オーバーフロー又はアンダーフローが検出されたときに行われるフォーマットの変更は、少なくとも1つの追加のアンカーデータ要素を提供するために、アンカーデータ数フォーマットの要素数を拡張することを含むことが特に有用であり得る。これにより、コードシーケンスの一部分を、より大きな有意性の範囲を表現できるフォーマットで再試行することができ、これまで表現できなかった範囲の値にも対応できるようになる。
【0042】
オーバーフローが検出された場合、フォーマットを変更することは、アンカーデータ値の最上位端にある少なくとも1つの追加のアンカーデータ要素によってアンカーデータ値を拡張することを含んでもよい。アンカーデータ値の最上位端に少なくとも1つの追加要素が提供されている場合、更新された要素数でシーケンスの一部分が再試行されると、新たに追加された要素は、(キャプチャされたアーキテクチャ状態のチェックポイントで表される)アンカーデータ値の既存要素の符号拡張で最初にポピュレートされてもよい。
【0043】
アンダーフローが検出された場合、フォーマットを変更することは、アンカーデータ値の最下位端にある少なくとも1つの追加のアンカーデータ要素によって、アンカーデータ値を拡張することを含んでもよい。少なくとも1つの追加要素がアンカーデータ値の最下位端に提供されている場合、シーケンスの一部分が再試行される際、新たに追加された要素は、最初はゼロでポピュレートされてもよい。
【0044】
また、コードシーケンスの直近の処理部分において、オーバーフローとアンダーフローとの両方が発生している可能性がある(例えば、アンカーデータ値で表される範囲よりも低い1つの浮動小数点入力と、アンカーデータ値で表される範囲よりも大きな有意性を有する別の浮動小数点入力と、に基づいて処理が行われる場合がある)。データ処理動作のシーケンスの当該一部分においてオーバーフローとアンダーフローとの両方が検出された場合、フォーマットを変更することは、アンカーデータ値の最上位端にある少なくとも1つの追加のアンカーデータ要素と、アンカーデータ値の最下位端にある少なくとも1つの追加のアンカーデータ要素と、によって、アンカーデータ値を拡張することを含んでもよい。
【0045】
オーバーフロー又はアンダーフローの検出は、動作のシーケンス中の任意の時点で実行することができる。いくつかの例では、オーバーフロー又はアンダーフローの検出は、それぞれのアンカーデータ処理動作に応答して実行されてもよい。
【0046】
しかしながら、オーバーフロー又はアンダーフローのチェックは、それぞれアンカーデータ処理に応答して行うよりも、シーケンスを通じて間隔をおいて行うほうがより効率的である場合もある。そのため、オーバーフロー又はアンダーフローの検出は、所与のアンカーデータ処理回数に応じた間隔で実行することができる。
【0047】
いくつかの例では、アンカーデータ要素は、データ要素の有意性の低い部分で実行された追加によって生じるキャリーに対応するために、要素内にいくつかの重複ビットが割り当てられる冗長な表現を使用して表されてもよい。これにより、一連のアンカーデータ処理動作によってアンカーデータ要素からオーバーフローが発生する可能性を減らすことができる。当該表現は、重複ビットと非重複ビットの異なる組み合わせであるすべてが2の補数の同じ数値を表すことができる複数のアンカーデータ要素で形成されたアンカーデータ値のビットの異なるパターンが多数存在する可能性があるという意味で、冗長であってもよい。詳細を以下に提供する。
【0048】
したがって、一般的に、アンカーデータ要素は、V個の重複ビットとW個の非重複ビットとを含むNビット値を含んでもよい。特定の数の重複ビットと非重複ビットは、固定されていてもよく、あるいは、例えば上述のアンカーメタデータ内の情報を指定するなどして可変であることもある。
【0049】
浮動小数点値をアンカーデータ要素に変換する浮動小数点からアンカーデータへの変換動作において、浮動小数点値が特殊な数(NaN又は無限大)以外の数を表し、その数がアンカーデータ要素が構成するアンカーデータ値に対して許容数値範囲内にある場合、処理回路は、アンカーデータ要素のW個の非重複ビットを、浮動小数点値に対応する2の補数のビットの一部分を表すように設定してもよい。一方、アンカーデータ要素のV個の重複ビットには、W個の非重複ビットの符号拡張に設定されてもよい。したがって、最初は、重複ビットは、符号拡張に、例えば、すべてゼロ又はすべて1に設定されていてもよい。しかし、浮動小数点からアンカーデータへの変換動作によって生成されたアンカーデータ要素が一連の加算処理をされると、重複ビットにいくつかのキャリーが発生する可能性がある。アンカーデータ値全体で表される2の補数を非冗長表現で計算するために、1つのアンカーデータ要素の重複ビットで表されるキャリーを、アンカーデータ値の次に高いアンカーデータ要素の非重複ビットに伝搬する重複伝搬動作を行うことができる。
【0050】
したがって、いくつかの例では、オーバーフロー又はアンダーフローの検出(及び、オーバーフロー又はアンダーフローが検出された場合のチェックポイントの復元及びアンカーデータ値のフォーマットの変更)は、第1のアンカーデータ要素のV個の重複ビットで表されるキャリーを第2のアンカーデータ要素のW個の非重複ビットに伝搬するための重複伝搬動作の実行時に実行することができる。オーバーフロー又はアンダーフローが発生したかどうかのチェックを重複伝搬時に実行することは、オーバーフロー又はアンダーフローの検出をあまり頻繁に行わないことを意味するが、また、オーバーフロー又はアンダーフローが発生して、シーケンス動作の前の部分を繰り返す必要がある場合には、重複伝搬動作自体のオーバーヘッドを回避することができることを意味するので、便利であり得る。したがって、実際には、オーバーフロー又はアンダーフローの検出は、オーバーフロー又はアンダーフローが発生した場合に重複伝搬動作を抑制できるように、重複伝搬動作の前に実行してもよい。
【0051】
いくつかの例では、アンカーデータ値のフォーマットの変更は、オーバーフロー又はアンダーフローを引き起こす動作に応答してソフトウェアアクセス可能な格納場所に格納される、上述のような使用情報に依存してもよい。したがって、使用情報をアーキテクチャレベルで(使用情報を指定する専用の命令を必要とせずに)返すことで、上述のような動的なアンカー情報の更新方法をサポートすることができる。
【0052】
しかしながら、アンカーデータ値のフォーマットの動的な更新は、使用情報を使用せずに実行することもできる。例えば、オーバーフローが検出された場合、フォーマットの変更は、アンカーデータ値の幅を1つのデータ要素分拡張し、アンダーフローの場合は、アンカーデータ値の各アンカーデータ要素の最下位ビットの有意性を(要素数の増加に加えて)下げるなど、いくつかのデフォルトのアクションに単純に従うことができるというアプローチも考えられる。使用情報は、所与のオペランドのセットに対する正しいアンカーデータフォーマットにより速く到達することを可能にするが、それにもかかわらず、使用情報を返さないアーキテクチャでは、オーバーフロー又はアンダーフローが発生するたびに、オーバーフロー又はアンダーフローが発生しなくなるまで、ソフトウェアルーティンが要素の総数及び/又はアンカー情報を増分的に調整することが可能になる。
【0053】
アンカーデータフォーマットの動的な更新を提供し、以前にオーバーフロー又はアンダーフローを引き起こしたコードシーケンスの一部分を再試行することは有用であるが、場合によってはそのような再試行が望ましくないこともある。したがって、オーバーフロー又はアンダーフローが検出されるたびに再試行を実行することは必須ではない。
【0054】
いくつかの例では、オーバーフロー又はアンダーフローが検出された場合、本方法は、使用情報が少なくとも1つの再試行条件を満たすかどうかを判断することと、使用情報が少なくとも1つの再試行条件を満たす場合、使用情報に基づいてアンカーデータ値のフォーマットを変更し、変更されたフォーマットに基づいてデータ処理動作のシーケンスの一部分を再試行することと(上述の例と同様)、使用情報が少なくとも1つの再試行条件を満たさない場合、データ処理動作のシーケンスを終了すること、又は、当該少なくとも1つの部分を再試行せずに一連のデータ処理動作を継続することと(上述の例と同様)、を含んでもよい。
【0055】
使用量情報が当該少なくとも1つの再試行条件を満たさず、そのため処理を終了する、又は再試行せずに継続する場合、本方法は、将来的なオーバーフロー/アンダーフローをどのように回避するかを評価するのに役立つように、使用量情報、あるいはオーバーフロー又はアンダーフローに関する他の情報を返すことを含んでもよい。
【0056】
例えば、少なくとも1つの再試行条件は、
オーバーフロー又はアンダーフローのマージンが所定の量よりも小さいこと、
オーバーフロー又はアンダーフローを防ぐために必要な追加のアンカーデータ要素の数が所定の数以下であること、及び、
データ処理動作のシーケンスの当該一部分を再試行する以前の試行回数が所定のしきい値よりも少ないこと
の少なくとも1つを含む。
【0057】
例えば、オーバーフロー/アンダーフローのマージンが、オーバーフロー/アンダーフローを防ぐために多数の追加のアンカーデータ要素を必要とするような場合、単純に要素数をその多数分だけ拡張することは非効率的であるかもしれず、例えば、これは、アンカーの有意性が不適切に設定されていることを示している可能性があり、単純に要素数を拡張すると、処理される実際の入力オペランドの大きさが元のアンカー情報で定義された範囲から大きく外れているために、アンカーデータ値のいくつかの要素がゼロ又は符号ビットで完全に埋められてしまうという、多くの無駄な処理動作が発生する危険性がある。このような場合、シーケンスを終了し、発生したオーバーフローに関する情報を返すことで、返された情報をより詳細に検討し、今後のアンカー情報及び/又はレーン数をどのように設定すべきかを判断するほうが効率的な場合がある。あるいは、終了するのではなく、シーケンスの残りの部分で発生する可能性のある任意の更なるオーバーフロー/アンダーフローに関するより多くの情報を収集するために、処理動作のシーケンスを終了させずに(かつ、以前に実行された部分を再試行せずに)処理動作のシーケンスを継続できることが好ましい場合もある。
【0058】
したがって、オーバーフロー/アンダーフローを検出するそれぞれの事例が、レーン数及び/又はアンカー情報の動的な更新によって処理されることは必須ではなく、本方法は、動的な更新のための特定の条件(単数又は複数)が満たされているかどうかの判断を含み、その後、動的な更新を実行し、少なくとも1つの再試行条件を満たしたときに再試行することができる。
【0059】
データ処理動作の全体的なシーケンスの完了又は終了時に、本方法は、ソフトウェアアクセス可能な格納場所に、
データ処理動作のシーケンスの一部分を再試行する必要があった条件、
データ処理動作のシーケンスが完了したときにアンカーデータ値に含まれるアンカーデータ要素の最終的な数、及び、
データ処理動作のシーケンスの実行中に行われた任意の更新によって生じる最終的なアンカー情報、
のうちの少なくとも1つを示す情報を格納することを含んでもよい。
【0060】
これは、なぜシーケンスの一部分が再試行を必要としたかに関する何らかの情報を提供するのに役立ち、ソフトウェア開発者又はコンパイラが、将来的に、所与のプログラムに対してアンカー情報をどのように設定するのが良いかを判断するのに役立ち、その結果、動作のシーケンスの特定の部分を実行するために多くの再試行が必要になる可能性が低くなるため、パフォーマンスを向上させることができる。
【0061】
ここで、特定の例を、図面を参照して説明する。
【0062】
以下では、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号で見つけることができ、これらの内容は参照により完全に本明細書に組み込まれている。
【0063】
浮動小数点数
浮動小数点(FP)は、少数のビットを使って実数を近似する有用な方法である。IEEE 754-2008 FP規格では、FP数の複数の異なるフォーマットが提案されており、そのうちのいくつかは、2進数64(倍精度(DP)とも呼ばれる)、2進数32(単精度(SP)とも呼ばれる)、及び2進数16(半精度(HP)とも呼ばれる)である。64、32、16という数は、それぞれのフォーマットに必要なビット数を表している。
【0064】
表現
FP数は、科学の授業で習う「指数表記」とよく似ている。マイナス200万の代わりに、-2.0×106と書く。この数を構成するパーツは、符号(この場合は負)、仮数(2.0)、指数の底(10)、指数(6)である。これらの部分はすべて、構成要素が2進数で格納されていること、及び、指数の基数が常に2であること、という最も重大な違いはあるものの、FP数に似ている。
【0065】
より正確には、FP数は、符号ビット、いくつかのバイアス指数ビット、及び、いくつかのフラクションビットを含む。具体的には、DPフォーマット、SPフォーマット、HPフォーマットは、以下のビットを含む。
【0066】
【0067】
符号は、負の数について1、正の数について0である。ゼロを含むすべての数には符号がある。
【0068】
指数にはバイアスがかかっている。つまり、真の指数は、数に格納されているものとは異なる。例えば、バイアスのかかったSP指数は8ビット長で、0から255までの範囲になる。指数0と255は特別なケースであるが、その他の指数はすべてバイアス127を有し、真の指数はバイアス指数よりも127小さいことを意味する。最小バイアス指数は1で、これは真の指数-126に相当する。最大バイアス指数は254で、これは真の指数127に相当する。HP指数とDP指数も同じように動作し、上の表に示されたバイアスがかかる。
【0069】
SP指数255(又はDP指数2047、HP指数31)は、無限大とNaN(not a number:数ではない)と呼ばれる特殊記号のために予約されている。無限大(正の場合も負の場合もある)は、ゼロのフラクションを持つ。指数255の数で、フラクションが0でないものはNaNである。無限大は飽和値を提供しているので、実際には「この計算の結果、このフォーマットで表現できる数よりも大きい数が得られた」というような意味になる。NaNは、例えばゼロによる除算また負の数の平方根を取るなど、実数に対して数学的に定義されていない動作に対して返される。
【0070】
指数ゼロは、いずれのフォーマットにおいても、非正規数及びゼロのために予約されている。正規数は以下の値を表す。
-1符号×1.フラクション×2e
ここでeは、バイアス指数から計算された真の指数である。1.フラクションという言葉は仮数と呼ばれ、1はFP数の一部としては格納されず、代わりに指数から推測される。ゼロと最大指数を除くすべての指数は、1.フラクションの形の仮数を示す。指数ゼロは、0.フラクションの形の仮数と、所与のフォーマットの1バイアスに等しい真の指数と、を示す。このような数は非正規(subnormal)と呼ばれる(歴史的にはこのような数は非正規(denormal)と呼ばれていたが、現代では非正規(subnormal)という言葉が好まれる)。
【0071】
指数とフラクションの両方が0に等しい数はゼロである。
【0072】
次の表は、HPフォーマットの数の例である。エントリは2進法で、読みやすくするために「_」を加えてある。(表の4行目、指数が0の)非正規エントリは、その前の行の正規エントリとは異なる仮数を生成することに注意すること。
【0073】
【0074】
FP実装の複雑さの大部分は非正規に起因するため、多くの場合、マイクロコード又はソフトウェアで処理される。一部のプロセッサでは、非正規をハードウェアで処理することで、ソフトウェア又はマイクロコードの実装形態と比べて、これらの動作を10倍から100倍に高速化している。
【0075】
整数、固定小数点、浮動小数点
FPの符号の処理法は「符号絶対値」と呼ばれ、通常のコンピュータでの整数の格納方法(2の補数)とは異なる。符号絶対値表現では、同じ数の正と負のバージョンは、符号ビットだけが異なる。符号ビットと3つの仮数ビットとを含む4ビットの符号絶対値整数は、プラス1とマイナス1を次のように表す。
+1=0001
-1=1001
【0076】
2の補数表現では、(n+1)ビットの2進整数は、数値i-S*2nを表す。ここで、iはnビットの整数で、n+1ビット値の下位nビットで表され、Sは(n+1)ビット値の最上位ビットのビット値(0又は1)である。したがって、符号ビットが値の他のすべてのビットの符号を修正する符号絶対値数の場合とは異なり、2の補数値の場合、最上位ビットはマイナスに、他のすべてのビットはプラスに加重される。したがって、4ビットの2の補数の整数は、プラス1とマイナス1を次のように表す。
+1=0001
-1=1111
【0077】
2の補数フォーマットは、コンピュータ演算を簡単にするため、符号付き整数では実質的に普遍的なフォーマットである。
【0078】
一方、固定小数点は、見た目は整数と同じだが、実際には特定のビット数を持つ値を表す。センサデータは固定小数点フォーマットであることが多く、FPが普及する前に書かれた固定小数点ソフトウェアも数多く存在する。プログラマは、「2進法」、つまり数の整数部と小数部の区切りを常に把握しておく必要があり、また、ビットを正しい位置に保つために常に数をシフトさせる必要があるため、固定小数点は、作業が非常に面倒である。FP数にはこのような困難はないので、固定小数点数とFP数の変換ができることが望ましい。変換ができるということは、固定小数点のソフトウェアやデータを使い続けることができるということでもあり、新しいソフトウェアを書くときに固定小数点に縛られないということでもある。
【0079】
FP数を丸める
IEEE-754規格では、ほとんどのFP動作は、動作が範囲と精度が制限されていないかのように計算され、FP数に収まるように丸められることが要求されている。計算結果がFP数と完全に一致する場合は、常にその値が返されるが、通常、計算結果は連続する2つの浮動小数点数の間の値になる。丸めるとは、連続する2つの連続する数のうち、どちらを返すべきかを選択する処理のことである。
【0080】
複数の丸めの方法があり、丸めモードと呼ばれている。そのうちの6つは以下のとおりである。
【0081】
【0082】
この定義では、実際にどのように丸めるのかは不明である。一般的な1つの実装形態は、動作を行い、残りのすべてのビットと同様に切り捨てられた値(つまり、FPフォーマットに収まる値)を見て、特定の条件が成立すれば切り捨てられた値を調整するというものである。これらの計算はすべて以下に基づく。
L-(最小)切り捨てられた値の最下位ビット
G-(ガード)次の最上位ビット(つまり、切り捨てに含まれない最初のビット)
S-(スティッキー)切り捨ての一部ではない残りのすべてのビットの論理和
これらの3つの値と切り捨てられた値とを仮定すると、次の表のように、常に正しく丸められた値を計算することができる。
【0083】
【0084】
例えば、2つの4ビットの仮数を乗算して、4ビットの仮数に丸めることを考える。
sig1=1011 (10進数11)
sig2=0111 (10進数7)
乗算すると、
sig1×sig2=1001_101 (10進数77)
L Gss
となる。
【0085】
切り捨てられた4ビットの結果の最下位ビットは、Lとラベルされ、次のビットはGとラベルされ、Sはsとラベルされた残りのビットの論理和(つまり、S=0|1=1)となる。丸めるために、丸めモード及び上の表の計算に従って、4ビットの結果(1001)を調整する。例えば、RNA丸めでは、Gが設定されているので、1001+1=1010を返すことになる。RX丸めではG|Sが真なのでLを1にセットして(既に1なのでこの場合は何も変わらない)1001を返す。
【0086】
整数及び固定小数点数の丸め
FP数を整数又は固定小数点に変換する場合も、丸めを行う。考え方は基本的にFP丸めと同じである。FP数がたまたま整数であった場合、常にその整数に丸められる。それ以外のFP数は、連続する2つの整数の間にあり、丸めによってどの整数を返されるかが決まる。残念なことに、整数の丸めロジックは、2の補数と符号絶対値形式の違いのために、やや難しくなっている。符号絶対値数が増分すると、常に絶対値が大きくなるので、増分された数はゼロから遠くなる。正の2の補数でも同じことが言えるが、負の2の補数は増分するとゼロに近づく。つまり、これは、整数が正か負かによって、丸めのロジックを変えなければならないことを意味する。また、基底値(増分するか否かの値)の選択にも注意が必要だということも意味する。正の整数の場合、その値はFPの仮数を切り捨てたものなので、1.37は基本値が1で、結果は1又は2のどちらかになる。負の整数の場合、再び仮数を切り捨てて、その結果の1の補数を取る(1の補数とは、すべてのビットを反転させた元の数のことである)。-1.37は1に切り捨てられた後に反転され、基本値-2になる。結果を-2又は(増分したときに)-1のいずれかにしたいのですべてがうまくいく。
【0087】
更に複雑なことに、この変換方法では、負の整数に対するL、G及びSを求めるためにいくつかの計算が必要になる。正しい丸めは、2の補数処理(反転して1を加える)を完了してからL、G、Sを計算することを必要とするが、1を加えるのは反転するだけの場合に比べて遅い。理想的には、シフトされた元の入力から(つまり、符号に手を加える前の入力から)実際のL、G、Sを計算することを望んでいる(浮動小数点の1.37又は-1.37は、どちらも右シフトされて整数の1になる)。
【0088】
L0、G0及びS0を反転前の最下位ビット(lsb)、ガード及びスティッキーとし、Li、Gi及びSiを反転後のlsb、ガード及びスティッキーとし、最後にL、G及びSを反転して1を加えた後のlsb、ガード及びスティッキーとする。
【0089】
S0がゼロであれば、Siに寄与するビットはすべて1であり、したがって(それらのSiビットに1を加えて得られる)Sもゼロである。S0が0でない場合、Siはすべて1ではなく、したがってSも0ではない。したがって、すべての場合においてS0=Sとなる。
【0090】
G0がゼロの場合、Giは1であり、S0がゼロである場合にのみ発生するSビットからのキャリーインがある場合を除いて、Gも1である。G0が1の場合、Giはゼロであり、同じく、S0がゼロである場合にのみ発生するSビットからのキャリーインがある場合を除いて、Gも1である。つまり、G=G0^S0である。
【0091】
同様の論理で、L=L0^(G0|S0)となる。
【0092】
これで、負の整数と正の整数のL、G及びSがわかったので、丸めのルールを考えることができる。
【0093】
【0094】
固定小数点数は、整数とまったく同じ方法で丸められる。符号なしの変換(整数又は固定小数点への変換)の規則は、正の変換の規則と同じである。
【0095】
注入丸め
丸めをより速く行うには、ほとんどすべてのFP動作の一部である仮数加算の一部に丸め定数を注入することである。これがどのように機能するかを見るために、ドルとセントで数を加算し、ドルに丸めることを考える。例えば、次のように加算する。
【数1】
【0096】
合計の$3.62は$3よりも$4に近いので、最近似丸めモードのいずれかが$4を返すことがわかる。数を2進法で表現すれば、前節のL、G、S法でも同じ結果が得られる。しかし、50セントを足して、その結果を切り捨てるとしたらどうだろうか。
【数2】
【0097】
合計($4.12)からドル金額($4)を返すだけの場合、RNA丸めモードを使って正しく丸めることになる。$0.50ではなく$0.99を加える場合、RP丸めを使って正しく丸めることになる。RNEは少し複雑である。$0.50を加えて切り捨て、残りのセントを見る。残りのセントが0でない場合、切り捨てられた結果は正しい。残りのセントが0であれば、注入の前に2つのドルのちょうど中間にいたので、偶数のドルを選ぶ。2進法のFPでは、ドルの金額の最下位ビットをゼロにすることになる。
【0098】
3つの数を足すのは、2つの数を足すよりもわずかに遅いだけなので、注入丸めを使えば、2つの仮数を足してL、G及びSを調べ、丸めモードに応じて結果を増分するよりも、はるかに早く丸められた結果を得ることができる。
【0099】
注入丸めの実装
FPでは、注入丸めは3つの異なる値のうちの1つで、その値は丸めモードと(時には)結果の符号に依存する。
【0100】
RNAとRNEとの両方において、Gの位置に1を注入する必要がある(ドルとセントの例では0.50ドルを加えるようなものである)。
【0101】
RP及びRM丸めは、モードだけでなく符号にも依存する。RPは正の結果を切り上げる(正の無限大に向かって仮数の大きさを大きくする)が、負の結果は切り捨てる(正の無限大に近い仮数を選ぶ)。同様に、RMは負の結果を切り上げる(負の無限大に向かって仮数の大きさを大きくする)が、正の結果は切り捨てる(負の無限大に近いほうの仮数を選ぶ)。そこで、RMとRPを、符号が丸めの方向と一致する場合の丸め(RU)と、符号が注入丸めと異なる場合の切り捨て(RZ)の2つの場合に分ける。RUの場合は、Gビットの位置と、論理的にSに寄与するすべての位置とに1を注入する(ドルとセントの例では0.99ドルを加えるようなものである)。
【0102】
RZモード及びRXモード、そしてRZモードに還元されるRPモード及びRMモードには0を注入する。
【0103】
ほとんどの丸めモードでは、注入丸めを加えてから切り捨てると、正しい丸め結果が得られる。2つの例外は、RNE及びRXであり、加算後にGとSを調べる必要がある。RNEでは、G及びSがともにゼロの場合、Lを0に設定する。RXでは、G又はSが0でない場合、Lを1に設定する。
【0104】
FP数は実数ではない
FP数は、実数と同じように考えがちであるが、最も基本的な特性ですら、両者は根本的に異なる。
【0105】
両者には関連しない。例えば、SPでは3つの数を足して100万又は0を返すことができるが、これはおそらく一般的に丸め誤差として考えるものではない。
(245+-245)+220=220
245+(-245+220)=0
両者は、分配法則に従わない。再度SPで:
3,000,001*(4.00001+5.00001)=0x4bcdfe83
(3,000,001*4.00001)+(3,000,001*5.00001)=0x4bcdfe82
となり、オーバーフローが発生すると更に状況が悪化する。
250*(278-277)=2127
(250*278)-(250*277)=無限大
【0106】
いくつかの実装形態の場合、一般的にnanA+nanB !=nanB+nanAであるため、デフォルトのNaNモード(すべてのNaNを単一のNaNに変換するモード)でない限り、両者は可換ですらない。数値加算及び数値乗算は、可換である。
【0107】
IEEEのNaNルールのため、乗算又は加算の恒等式はない。1と0は、数値の恒等式として機能する。
【0108】
FP数を考えるための1つの有用な方法は、FP数は、非常に長い固定小数点数で、多くても数ビット(DPでは53ビット)が連続して非ゼロになるだけだと考えることである。例えば、非無限DP数は、仮数の最初のビットが2046箇所のいずれかにあり、その最初のビットの後に他の52個の仮数ビットが続き、更に符号ビットがあるので、任意の有限DP数は2046+52+1=2099ビットの固定小数点数として表すことができる。このように考えると、2つのFP数を加算しても、一般的には別のFP数にはならず、加算の結果は、FP数になるように丸める必要があることがよくわかる。
【0109】
浮動小数点(FP)演算の問題点として知られているのが、和が問題になるという、非結合性であるということである。
・プログラマは、3つの数を加算するときですら、結果が大きく異なることを気にする必要がある。
・プログラマは、結果が大きく異なることを回避するために、必要以上に広いフォーマットを使用する。
・全く同じ順序で計算しないと和が再現できないため、プログラマはコードを簡単に並列化できない。
【0110】
例えば、単精度の場合、
220+(-244+244)=220
であるが、
(220+-244)+244=0
【0111】
動作が実行される順序によって、結果が100万又は0になる。これは指数が24違うという極端な例であるが、指数が1違う場合、又は、指数がすべて同じで4つ以上のものを加えている場合でも、異なる答えを得る可能性がある。プログラミング言語Cでは、和を左から右へ順序に評価することで再現性の問題に対処しているが、これでは正しさの面では何の役にも立たないし、並列化も不可能である。
【0112】
この問題は、何百万もの動作を実行するハイパフォーマンスコンピューティング(HPC)では特に顕著である。プログラマはこれらの問題を並列化したいと考えるが、再現性がないためにデバッグが通常よりも困難になる。また、機械の構成が違えば、たとえその機械のための再プログラミングが完璧に行われたとしても、異なる答えが出てくる。
【0113】
HPA表現(アンカーデータ値)
プログラマが選択可能な範囲にある浮動小数点(FP)数を高速かつ正確に集積できる新しいデータ型が提案されている。ほとんどの問題に対応できる適度な範囲では、その集積はFP加算よりも速く、また結合的である。結合的加算では、再現性のある正しい結果を得ながら問題を並列化することができ、既存のハードウェアと比較して、例えば100倍以上のスピードアップが可能になる。このようなメリットは、ハイパフォーマンスコンピューティング(HPC)の分野ではもちろんのこと、ハイパフォーマンスコンピューティング以外の多くのアプリケーションにとっても魅力的なものになると考えられる。
【0114】
図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に書き戻されてもよい。
【0115】
レジスタバンク12は、様々な異なる形態を有することができる。操作されるオペランドは、例えば、浮動小数点オペランド、固定小数点オペランド、整数オペランド、及びHPA又はRHPA数オペランド(後述する)を含んでもよい。レジスタバンク12は、レジスタバンク12の構成に応じて、これらの型のオペランドの混合物を格納する役割を果たしてもよい。オペランドは、そのフォーマットによって事前に定義されるように、又は、HPA数のオペランドに関連して後述するように、レジスタに関連付けられたメタデータを使用してプログラム可能に指定されるように、異なるレベルの精度を有することができる。
【0116】
図1に示すように、レジスタバンク12は、レジスタバンク12の対応するデータレジスタに格納されたHPA値又はRHPA値に関連するメタデータを指定するためのメタデータレジスタ22を含んでもよい(メタデータの内容の例を以下に示す)。いくつかの場合においては、各データレジスタが対応するメタデータレジスタ22を有していてもよく、他の場合には、2つ以上のデータレジスタが、単一のメタデータレジスタ22によって指定されたメタデータを共有してもよい。
【0117】
図2は、浮動小数点オペランドを模式的に示している。浮動小数点オペランドは、符号、指数、及び、仮数で形成される。浮動小数点オペランドは、指数値で示される様々な大きさの値を表すことができる。数を表現できる精度は、仮数の大きさによって制限される。浮動小数点動作は、一般的に整数演算よりも複雑で、遅い。
【0118】
図2には、64ビットの整数オペランドも示されている。このような整数オペランドは、符号なし整数の場合は0~(2
64-1)、符号付き整数の場合は-2
63~2
63-1の範囲の数を表すことができる。整数演算は、処理速度が速く、(浮動小数点演算に比べて)実行するための消費エネルギーも比較的少ないのが特徴であるが、浮動小数点値で表現できる数の範囲に比べて、比較的限られた範囲の数を指定することになるというデメリットがある。
【0119】
また、
図2は、64ビット整数をそれぞれが含む複数の成分(この例では3成分)のベクトルからなるHPA(高精度アンカー)数を示す。このHPA数には、関連付けられたメタデータを有する。このメタデータには、HPA数の一部を構成する各成分のビットの有意性を示すアンカー値が含まれている。アンカー値(単数又は複数)は、ビット有意性の下限とビット有意性の上限とを、直接的又は間接的に指定するものである。以下、メタデータという用語は、HPA数のビット有意性を指定するアンカー値(単数又は複数)を含むデータに対応するとみなすことができる。異なる成分を組み合わせることで、ビット有意性の範囲を連続してカバーするビット値が指定される。ビット有意性の下限とビット有意性の上限との位置に応じて、ビット有意性の範囲は、2進小数点の位置を含むことができる。また、2進小数点の位置が、特定のHPA値に対して指定されたビット有意性の範囲の外側にある可能性もある。
【0120】
アンカー値(単数又は複数)は、浮動小数点値で表現可能な最小有意性(例えば、倍精度FP値)から、その浮動小数点値で表現可能な最大ビット有意性までのビット有意性の範囲を表現できるように提供されてもよい。
【0121】
HPA数を形成する成分の数は、異なる実装形態間で変わる可能性がある。成分のサイズは、一部の実装では固定されているが、他の実装では変化してもよい。いくつかの実施形態では、範囲のビット有意性の全体的な幅は、固定成分サイズの単位で変化するように制約されてもよい(例えば、64ビット成分では、ビット有意性の範囲は、例えば、64、128、192、256、・・・の幅を有してもよい)。また、ビット有意性の範囲の幅は、1ビット幅のステップで連続的に変化させることも可能である。
【0122】
(メタデータ内の)アンカー値(単数又は複数)は、プログラマが対応するHPA値の有意性を設定できるように、プログラム可能であってもよい。アンカー値は、様々な異なる方法でビット有意性を指定することができる。一例は、各ベクトル成分の下限のビット有意性を指定することである。したがって、各ベクトルの成分は、ビット有意性の全体的な範囲内で値の有効ビットの部分を表す整数値と、その成分内の最下位ビット有意性を表す(アンカーする)メタデータを含んでもよい。また、アンカー値(単数又は複数)は、HPA数全体のビット有意性の下限を、ビット有意性の範囲の全幅とともに指定するという方法もある。更に、アンカー値(単数又は複数)が、ビット有意性を表す範囲の下限と上限を指定するデータを含む場合もある。更に、固定幅の成分であることがわかっている場合には、アンカー値(単数又は複数)として、ビット有意性の範囲の下限と成分の数を含むなどのバリエーションも可能である。
【0123】
図3は、倍精度浮動小数点で表すことができる値の範囲と、HPA数の有意性の範囲との関係を模式的に示している。倍精度浮動小数点数の場合、指定可能なビット値の範囲は、約2
-1074~2
+1023(非正規は数えない)までとなる。
【0124】
図示されているように、HPA数は、浮動小数点値を使用して表現可能なビット有意性の範囲内のビット有意性のウィンドウと考えられるプログラム可能なビット有意性の範囲を有している。このプログラム可能なビット有意性は、下限と上限との境界によって指定され、下限と上限との値に応じて、浮動小数点値によって提供されるビット有意性の範囲に沿ってスライドすると考えることができる。始点と終点と同様、ウィンドウの幅は、ビット有意性を指定するプログラム可能なメタデータ(アンカー値を含む)の適切な値によって指定することができる。このように、HPA数は、実行する計算に合わせてプログラマが選択できる形式を有する。
【0125】
HPAフォーマットでは、2つ以上の値の加算を、高速かつ正確に、そして結合的に実行することができるが、その一方で、幅広い有意性を持つ値を表現することができる。また、HPA値は単なる2の補数であるため、整数加算器を使用して加算することができ、浮動小数点演算のような丸め又は正規化の必要がなく、これにより、値を加算する順序に関係なく結果が同じになるため、一連の加算を並列化することができる。しかし、HPA値のプログラム可能な有意性を指定するメタデータを定義することで、同等の浮動小数点値の有意性の全範囲を表現することができるが、非常に広い加算器を用意する必要はなく(例えば、倍精度浮動小数点値で表現可能な全範囲にわたって2つの2の補数を加算するには、2098ビットの加算器が必要になる)、代わりに、プログラム可能な有意性により、より小さな加算器で、広い範囲の中のプログラム可能なビット有意性の特定のウィンドウに焦点を当てることができる。実際には、ほとんどの計算は、倍精度浮動小数点で利用可能な有意性の全範囲を必要としない。例えば、原子レベルの問題では非常に小さな値が、天文学的な問題では非常に大きな値が加算される可能性があるが、陽子の幅を加算して銀河間の距離にすることは一般的には有用ではない。ハイパフォーマンスコンピューティングの場合でも、ほとんどの集積は限られた範囲で起こる。
【0126】
通常、プログラムを書いているプログラマは、有用な結果が落ちてくると予想される値の範囲を(アプリケーションに応じて)知っている。プログラマは、特定の和に対するすべてのデータが260未満の大きさを有し、2-50未満の大きさを持つ値は合計に有意性のある影響を与えないと判断してもよく、この場合、データ幅128ビット、及び、最下位ビットの有意性を指定するアンカー値-50のHPAフォーマットを用いてデータを加算することで、このアプリケーションでは、任意の順序で結合的に数を加算することができる。
【0127】
したがって、アンカー値を用いて結果を計算する際の有効範囲を制限することで、比較的小さなハードウェアを用いて、プログラム可能に定義されたウィンドウ内で結果を計算することができる。加算の結果、定義された範囲の有意性の上限を超えてオーバーフローした場合、又は有意性の下限を下回ってアンダーフローした場合は、例外が発生することがあり、これは、プログラマが誤った有意性の境界を定義したことを示しており、結果の有意性の異なるウィンドウを定義するために、異なるメタデータ(例えば、異なるアンカー値又はHPA値の全体サイズ)を使用して処理を繰り返す必要があることを示している。
【0128】
2つのHPA値を加算又は減算する場合、アンカー値は両方のHPA値で同じであり、結果も同じアンカー値になる。これは、2つの値を加算又は減算すると、結果が正規化されるためにいずれかの入力と異なる指数を持つ結果になる浮動小数点演算とは異なる。入力が異なるアンカーメタデータで提供されている場合は、結果に必要なターゲット有意性範囲に合わせてシフトされる。入力がHPA以外の表現(例えば、整数又は浮動小数点)で提供されている場合は、同じアンカー値を持つHPA値に変換され、同じアンカー値を持つ結果となるように加算される。したがって、HPAレジスタ用のメタデータは、そのレジスタで生成される結果値の有意性のターゲット範囲を定義しているとみなすことができ、有意性ターゲット範囲外のビットは、入力値の実際の有意性にかかわらず、ハードウェアによって計算されない。
【0129】
RHPA表現
HPAフォーマットでは、浮動小数点に比べてはるかに高速な加算が可能であるが、HPA値のサイズが比較的大きくなると、2つのHPA値を整数演算で加算しても比較的遅い場合がある。例えば、HPAフォーマットでは、複数のレーンにまたがるオペランドの加算が必要になることがあるが、これは大規模なベクトル実装では望ましくない。例えば、2つの256ビット値又は512ビット値の加算では、1つのレーンから次のレーンに入力されるキャリーに対応するために64ビットの各レーンの加算が順次実行されるので、時間がかかる場合がある。
【0130】
そこで、
図4に示す冗長高精度アンカー(RHPA)フォーマットを使うことで、より高速に加算を実行することができる。HPAフォーマットと同様に、RHPA数は、処理回路14が各成分のビットの有意性を識別することを可能にするアンカー値を定義するメタデータを有する可変数の成分を含む。ここでも、アンカー値は、プログラム可能であってもよい。RHPAの場合、メタデータは、HPAについて上述した方法のいずれかで、各成分の有意性を識別してもよい。しかしながら、RHPAフォーマットでは、ベクトルの隣り合うレーンが重複した有意性を有するビットが含む冗長な表現を用いて数値が表現されるため、計算されるレーンの数にかかわらず、一定時間の加算が可能となる。この冗長性により、加算器の長さを短くし、加算器間でキャリー情報を伝搬することなく、加算、集積、及び、乗算などの動作を行うことができる。これにより、データ値の処理が大幅に高速化される。
【0131】
図4の(1)に示すように、RHPA表現を用いたMビットのデータ値は、N<MであるNビットからなるそれぞれのベクトルレーン(成分、要素、又は、一部分ともいう)に分割される。この例ではNは64ビットであるが、これは一例であり、他のレーンサイズ(32ビット又は128ビットなど)も可能である。各Nビット部分は、特定の数V個の重複ビットとN-V個の非重複ビットに分けられる。この例では、重複ビットの数Vは各Nビット部分で同じであるが、重複ビットの数が異なるNビット部分を持つことも可能である。
【0132】
整数又は浮動小数点数がRHPAフォーマットに変換されると、非重複ビットの一部には元の整数又は浮動小数点数からマッピングされた非符号情報が入り、重複ビットは符号ビットでポピュレートされる。レーンベースの加算及び減算では、各レーンはNビットの符号付き2の補数のように動作するが(必要に応じて、非重複部分から重複部分にキャリーが伝搬する)、マルチレーンの観点から見ると、レーンはより大きなPビット数の冗長な混合符号表現を形成する。
図4の例では、4つのレーンがあるので、M=256となるが、レーンの数は、ハードウェアの実装形態及び/又は所与のRHPA数に定義されたメタデータに依存して変化する。
【0133】
図4の(2)部は、(1)部で示したRHPA数の各ビットの相対的な有意性を示している。最下位レーンの重複ビットV[0]は、次のレーンの非重複ビットNV[1]のV個の最下位ビットと同じ有意性を有する。同様に、重複ビットV[1]とV[2]とは、非重複ビットNV[2]とNV[3]とのV個の最下位ビットと同じ有意性を有する。レーン間の有意性の重複は、RHPA数全体が、格納されている全ビット数Mよりも小さいPビット値を表すことを意味する。Vが各Nビット部分(チップ部分を除く)で同じである場合、
【数3】
となる。より一般的には、異なるレーンが異なる数の重複ビットを持つことができる場合、P=M-ΣVとなり、ここでΣVはトップレーン以外の各レーンの重複ビット数の合計である。
【0134】
Pビット値の各重複部分では、そのPビット値の実際のビット値は、下位レーンの重複ビットVと上位レーンの非重複ビットNVの合計で表される(非重複ビットNVと下位レーンの重複ビットを加算することで発生し得るキャリーを考慮している)。したがって、RHPA値を等価な整数値に変換する1つの方法として、
図4の(3)部分に示すように、各レーンの重複ビットを符号拡張し、上位レーンの非重複ビットに加算する(下位から上位へ、各レーンの加算後に重複ビットを調整する)方法がある。
【0135】
RHPA数は、MビットのRHPA値を用いて、所与のPビット数を表現する方法が2つ以上あるという意味で、冗長性がある。例えば、最下位2レーンの重複を考えると、重複ビット数V=4の例では、Pビット値の対応するビットが1111であれば、下位レーンに重複ビットV[0]=0b0000、次の上位レーンに非重複ビットNV[1]=0b1111を配置するのが一つの表現方法となる。しかしながら、同じ値を表現する別の方法として、V[0]=0b0101及びNV[1]=0b1010、又は、V[0]=0b1111、NV[1]=0b0000などが考えられる。
【0136】
なお、最上位レーンの重複ビットV[3]は、重複する上位レーンが存在しないため、実際には重複ビットではない。そのため、上位レーンはすべて非重複ビットを有すると考えるのが有益である場合がある。したがって、いくつかのケースでは、トップレーンはすべて非重複ビットで形成されていると考えることができる(Pビット値の全体としての最上位ビットがトップレーンのMビット値の最上位ビットに対応するように)。
【0137】
しかし、他の実施形態では、トップレーンにも重複ビットがあるものとして扱い、RHPAで表されるPビット数値の最上位ビットが、トップレーンの非重複部分(重複部分を除く)の最上位ビットに対応するようにすることが好ましい場合がある。この方法により、各レーンをより対称的に処理することができれば(トップレーンの処理方法を他のレーンに比べて変更する回数を少なくすることができれば)、回路の実装が容易になる可能性がある。
【0138】
図4のように、Pビット数値を冗長化して表現することで、所与のレーンにおいて非重複部分の加算によるキャリーを、キャリーを次のレーンに伝播させる必要がなく同じレーンの重複部分に格納できるため、レーン間でキャリーなく、複数のRHPA数を加算することができる。各レーンで行われる加算は、単純に2つ以上のNビット符号付き整数を見て、従来のNビット2の補数加算を実行することで加算され、他のレーンの対応するNビット加算とは全く独立している。これは、Nビット加算をそれぞれ並行して実行することができるため、レーンの数にかかわらず、Nビット加算を実行する時間でMビット値全体を加算することができることを意味している。
【0139】
実際には、少なくとも(2V-1-1)個のこのようなRHPA数は、レーン間のキャリーなしで加算することができ、非重複部分の加算によるキャリーは重複部分に集められる(異なる数の重複ビットを有するレーンがある場合、この表現におけるVは、重複ビットを有する任意のレーンにおける重複ビットの最小数となる)。(2V-1)番目の加算は、レーン間にキャリーを生成する可能性がある最初のものとなる(トップ重複ビットが符号ビットであるため、レーンのオーバーフローは、最上位から2番目の重複ビットから正又は負のオーバーフローがあったときに発生するが、これは、すべてのビットが0であるRHPA数から開始した場合、最小で2V-1個の更なる加算が実行された後に発生する可能性がある)。例えば、V=14の場合、単一のレーンからオーバーフローの危険性が生じる前に、少なくとも8191個のRHPA数を集積器に追加することができる(すなわち、合計で8192個の値を追加することができる)。これは、多数の入力値を加算することが一般的なハイパフォーマンスコンピューティングの分野で特に有効である。実際には、すべての加算がオーバーフロー部分へのキャリーを引き起こすわけではないので、Nビット部分のトップビットからオーバーフローすることなく、2V-1超の集積が可能な場合もある。
【0140】
時には、Nビットレーンのトップビットからオーバーフローの危険性(又は実際のオーバーフロー)を引き起こすほどの十分な加算が実行された場合、重複削減動作を実行して、所与のRHPA値を、重複ビットが所与のRHPA値の重複ビットよりも小さい大きさを表す第2のRHPA値に変換し、より多くのキャリーを収容するために重複部分のビットスペースを効果的に空けることができる。また、RHPA数を整数又は浮動小数点などの他のフォーマットに戻す際にも、このような重複削減を実行することがある。しかし、実際には、このような重複削減動作はあまり必要ではなく、複数の入力であるMビットの加算をNビットの加算の時間で実行することができるため、RHPAは処理時間を大幅に短縮することができる。なお、「重複低減」といっても、すべてのレーンの重複ビットを低減しなければならないわけではない。少なくとも1つのレーンの重複ビットを低減すれば十分であり、重複削減の形態によっては、所与のレーンの重複ビットが大きくなる可能性もある。
【0141】
HPA数の効率的な格納と動作
以下の説明では、使用されるHPA形式は、各部分が多数の重複ビットを含む上述のRHPA形式であると仮定するが、本明細書で説明する技術は、他のHPA形式、例えば、異なる部分が重複ビットを含まないHPA形式にも同様に適用可能である。以下、HPAという用語は、操作されるHPA値が冗長な形態であるか否かにかかわらず、操作されるHPA値を参照するために使用される。
【0142】
先に述べた
図4から明らかなように、HPA数(アンカーデータ値)の異なるHPA部分(アンカーデータ要素)は、単一のベクトルレジスタの異なるレーン内に配置されてもよい。しかし、これにはいくつかの問題がある。例えば、浮動小数点オペランドからHPA形式を作成する場合、浮動小数点オペランドのフラクションは、希望するアンカー値とともに、関連するベクトルレジスタ内のすべてのレーンに伝搬される必要がある。そして、各レーンには、アンカー値に基づいて異なるレーンアンカーが設定される。更に、ベクトルレジスタがHPA数の長整数値よりも大幅に大きい場合、例えば1024ビットのレジスタがHPA数200ビットの長整数を保持しているような状況では、ベクトルレジスタのリソースを無駄に使用することになり得る。また、ベクトルレジスタのビット数がHPA数の長整数のすべての部分を表現するのに不十分な場合、例えば、ベクトルレジスタの幅が128ビットであり、HPA数の200ビットの長整数を表す必要がある場合、処理に問題が生じることがある。
【0143】
これから説明する例では、HPA数の様々な部分のために、別の格納構成が用意されている。具体的には、
図5に模式的に示すように、HPA数の長整数は、複数のベクトルレジスタにまたがる共通のレーン内に格納されるように配置される。特に、各ベクトルレジスタがデータ値を格納するための複数のセクションを含むと考えられ得る一組のベクトルレジスタ100が配置されている。更に、複数のレーンがベクトルレジスタを通って(
図5に示す向きで垂直方向に)延びていると考えることができ、最初の4つのレーンは、
図5において参照数字102、104、106、108で示されている。そして、HPA整数値の異なる部分を異なるベクトルレジスタに格納することにより、HPA数の長整数を共通のレーン内に格納することができる。これは、4つの部分を含み、1つの部分がベクトルレジスタZ0、Z1、Z2及びZ3のそれぞれに格納されていると考えられる例のHPA整数110について模式的に示されている。更に、すべての部分が共通レーン102内に格納されている。HPA数の整数をこのように格納することで、これは多くの重要な利点を生じさせる。例えば、整数のサイズは、個々のベクトルレジスタの幅によって制約されない。更に、複数のHPA整数を様々なベクトルレジスタの異なるレーンに格納し、それらの整数値をSIMD方式で並列に処理できるため、ベクトルレジスタの非効率な使用を回避することができる。例えば、
図5を参照すると、
図5に示された各ベクトルレジスタが16レーンを提供する場合、16個のHPA数が4つのベクトルレジスタZ0からZ3内に格納され、各HPA数が異なるレーンを占めることになる。このように、この手法はスケーラビリティを大幅に向上させ、ベクトルの長さに依存しない手法を提供していることがわかる。これにより、この技術は、異なるサイズのベクトルレジスタを使用する様々なシステムで採用することができる。このようなHPA値の格納方法を採用することで、性能面で大きなメリットが得られるアプリケーションは数多くあるが、その一例として、アーム社が提唱するスケーラブルなベクトル拡張(Scalable Vector Extension:SVE)を採用したシステムがある。
【0144】
アーム社は、科学的なHPCアプリケーションを対象とした64ビットISAのスケーラブルなベクトル拡張(SVE)を発表した。現在、SVEはHPAサポートを含んでいないが、SVEは進化し続けており、その命令セットにささやかな追加をいくつか実行することで、非常に高いHPA性能を実現することができる。SVEの「スケーラブル」とは、すべての実装形態で同じベクトル長を必要としないことを意味する。SVEベクトルは、64ビットレーンのペアを128ビットから2048ビットまでの任意の倍数でハードウェアに実装することができる。小型のチップでは128ビットのベクトルしか実装できないかもしれないが、スーパーコンピュータでは1024ビット又は2048ビットのベクトルが実装形態できるかもしれない。200ビットの整数を単一のSVEレジスタに保持することは、128ビットの実装では不可能であり、2048ビットの実装形態では無駄になるが、200ビットの整数を4つのレジスタに分散して保持することで、SVEのスケーラビリティを最大限に活用し、小型から大型まであらゆるハードウェアの実装でうまく機能する。また、プログラマは、必要に応じて短整数又は長整数を使用することができる。100ビットの整数は2本のベクトルレジスタのレーンに、500ビットの整数は10本のベクトルレジスタのレーンに収まる。
【0145】
性能と面積の観点から、SVEは64ビットレーンで演算を実行する。我々は、iという大きなHPA数を、より小さな冗長な部分に分割してHPAの加算を行うことを提案する。64ビットの各レーンには、iの指定された部分(例えばp=50ビットとするが、これはプログラム可能である)が格納され、残りの64-pビットはレーン内のキャリーを保持するために使用される。この残りのビットは、次の最上位レーンのlsbと同じ数値の重みを持つことから、「重複」ビットと呼ばれている。レーン内の加算は、通常の64ビット整数の加算である。264-pサイクルごと(つまりp=50の場合は約16,000サイクルごと)に、レーンのオーバーフローを防ぐための冗長性排除ステップが必要になることがあり、また、すべての計算の最後に、冗長性のない答えを得るためにレーンごとの処理が必要になる。
【0146】
FP入力fをHPA数フォーマット(i,a)に変換するために、各64ビットレーンはfの指数を調べ、アンカー<aと比較し、fの仮数の一部を検討中のiの部分に追加すべきかどうかを判断する。この比較は、該当するすべてのレーンで並行して行うことができる。fの仮数は2つの部分(FP64積の場合はpの値に応じて3つの部分)にまたがるかもしれないが、各部分は独立して作成し、動作することができる。
【0147】
FP32数を、aを0に、pを50に選択して、2つの部分のHPAに変換する例を以下に示する。この例では、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]=f[23:0]を(指数-23)だけ左シフトしたもの-部分アンカー=37-50=-13位
(-ve左シフトは、+ve右シフト->i[1]={{14 0’s},{39 0’s},f[23:13]=1 0110 1011 10})
(23による指数の調整は、浮動小数点値の指数が23ビットのフラクションの最上位ビットの左側にある暗黙の小数点の有意性を表すのに対し、アンカーはフラクションの最下位ビットの有意性を表すという事実を考慮している)。
HPA数の部分0は、部分アンカー=0に調整され、以下のように計算される。
i[0]=f[23:0]を(指数-23)だけ左シフトしたもの-部分アンカー=37-0=37位。
->i[1]={{14 0’s},f[12:0]=10 0010 1111 011,{37 0’s}}
この結果、HPAフォームは以下のようになる。
【0148】
【0149】
一般的に、HPA結果を単一のFP結果に正しく丸めるには、キャリーと丸めの情報をレーンごとに伝搬させる必要があり、連続的な処理が必要である。これには数サイクルが必要であるが、集積ごとに一度だけ実行すればよい。また、p≦53の場合は、複数の64ビットレーンを占める非冗長なHPA数をFP64数のベクトルに並行して変換することもできる。その後、得られたベクトルを「再正規化」して、最上位要素が0.5ulpの精度で完全なHPA数を表すようにする。
【0150】
以上、高次でのHPA処理の基本について説明したが、次に、SVEでHPA集積器をどのように実装するかについて、より詳しく説明する。
【0151】
SVEは、現在の最大2048ビットまでのk×128ビットのベクトルレジスタ長をサポートし(即ち、1≦k≦16)、また、「ベクトル長非依存」(VLA)処理に基づいており、これにより、異なるSVEベクトルレジスタ長を有する異なるCPUはすべて、同じSVEプログラムを実行することができる。SVEプログラムは、システムレジスタから使用可能なベクトル長を読み取り、使用可能なベクトルレジスタ長を利用するように「自己調整」する。その結果、SVEプログラムは、CPU処理とともに、使用可能なベクトルハードウェアの長さがサポートできる平行グラニュールの分だけ、128ビットのグラニュール内で実行される。
【0152】
図5を参照して前述したように、ベクトル長に依存しないことを実現するために、HPA数を複数のSVEレジスタに分散して配置することができる。各レジスタは、異なるHPA数の同じ有意性のビットを保持してもよい。つまり、各レジスタは、HPA数における各部分の位置に対して調整された数のアンカーの値を与える有意性と関連している。
【0153】
先ほどの200ビットのHPA数の例に戻ると、各部分にp=50ビットが保持されている場合、HPA数のアンカーが-80であれば、4つの部分の有意性情報は、64ビットの部分ごとに14重複ビットとともに(+70,+20,-30,-80)となる。なお、
図5の例のように、HPA数の個々の部分を連続したレジスタに格納する必要はない。
【0154】
HPA数をこのように配置する主な利点は、長いHPA数よりも短いSIMD実装(128ビットのベクトルなど)にまたがる場合でも、HPA数(又は長整数)をSIMD方式で処理できることである。副次的な利点は、より長いSIMD実装(例えば1024ビットのベクトル)が、各ベクトル内にずっと短いHPA数を格納することで無駄にならないことである。十分な数の整数又はHPA数があれば、SVEの実装形態の長さにかかわらず、ベクトルは十分に活用される。
【0155】
また、HPA数を複数のレジスタに配置することで、FP数のベクトルをそれぞれの64ビットレーンに加算し、HPA演算を高度に並列化することができる。更に、大量のFP数をメモリからロードする際には、シンプルで効率的な連続したベクトルのロードになる。更に、このHPA数の配置では、複数のHPA整数を低次ビットから高次ビットまですべて並列に処理できるため、既存のSVE命令を使用して重要なHPA計算(冗長性の排除又はHPA数の加算など)を実行することができる。また、この方式では、複数のHPA数を高次レーンから低次レーンへ、又は、低次レーンから高次レーンへとすべて同時に処理できるため、HPA数のFPへの変換又は再正規化も高速化される。
【0156】
図6は、
図5で説明した方法で配置されたHPA数をSIMD方式でどのように処理することができるかを示している。この例では、一連の浮動小数点数がソースベクトルレジスタ165にロードされていると仮定している。この例では、各浮動小数点数は倍精度浮動小数点数であり、したがって、各浮動小数点数はソースレジスタ165内の64ビットセクションを占めると想定される。
【0157】
複数の64ビットレーン152、154、156は、ベクトルレジスタのセットを通って延びると考えられ、別個の変換及び処理回路170、172、174は、各レーンに関連付けられる。回路170、172、174は、デスティネーションレジスタ180に格納されるべき対応する結果部分を生成するために、一度にHPA数の単一部分を動作するように配置される。先に説明した
図5から、HPA結果数の各結果部分が異なるデスティネーションレジスタを占有し、それに応じて、回路がHPA数の異なる部分を処理すると、対応する結果部分が異なるデスティネーションレジスタに書き込まれることが理解されるであろう。
【0158】
後に詳述するように、メタデータは、変換及び処理回路170、172、174がその変換及び処理ステップを実行する際に、参照のために提供される。特に、この例では、メタデータは、各レーンについて、更なるソースレジスタ160内に格納される。レーンのメタデータ内では、そのレーン内で処理されたHPA数の各部分に対して、メタデータ部分が提供される。メタデータは、対応する部分に関連する有意性(調整済みアンカー)を識別し、重複ビットの数などの他の情報を識別してもよい。回路170、172、174がHPA数の特定の部分を処理しているとき、それらの回路は、ソースレジスタ160内に保持されているレーンメタデータから、関連するメタデータ部分を取り出す。
【0159】
図6に示す例では、各変換処理回路は、入力浮動小数点オペランドと、処理されるべきHPA数の部分についての関連するメタデータ部分と、を受け取り、その後、例えば、表7に示す例を参照して先に説明した技術を用いて、入力浮動小数点オペランドから関連するHPA部分を生成する。生成されたHPA部分は、その後、結果レジスタ180に直接格納することができ、あるいは、関連する結果部分を生成するために、何らかの処理機能を受けてもよい。例えば、一実施形態では、集積動作を実行することができ、ここでは、現在のHPA結果部分がデスティネーションレジスタから取得され、その後、デスティネーションレジスタ180の関連セクションに書き戻される更新された結果部分を生成するために、入力浮動小数点オペランドから生成されたHPA部分と集積される。
【0160】
このようなアプローチにより、複数の反復の実行を介して、集積された結果を表す結果部分を生成するために、各レーン内で複数の集積動作を並行して実行することができることがわかる。また、このプロセスは、各レーン内に一連の結果部分を生成するために、HPA数の各部分について繰り返すことができ、これらの結果部分は集合的に結果HPA値を表す。
【0161】
1つの例示的な構成では、HPA処理は、幅広い範囲の、アンカー、レーンの重複、及び、レーン型又は上位、下位、若しくは中間位置に関する情報(「メタデータ」)が必要である。HPA数の幅は通常200ビット以下で、アンカーの範囲はIEEE FP32と似ているため、HPA集積器は通常4つ以下の部分で構成されることが予想される。そして、4つの64ビット部分を横断する200ビット集積器のHPAメタデータは、
図7に示すように、4つの16ビットフィールドとして編成することができる。
【0162】
特に、ソースレジスタ160を指定することができ、ここでは、各レーン(例えば64ビット)内に、参照数字162、164、166、168で示されるように、4つのメタデータ部分が提供される。各メタデータ部分は、集積器の結果の関連部分のメタデータを提供することができる。
図7の拡大図に示すように、有意性(調整済みアンカー)情報は、例えば9ビットを使用して第1のサブパート192に含めることができ、一方、重複情報は、例えば5ビットを含む第2のサブパート194にキャプチャすることができる。また、必要に応じて、レーン型情報を第3のサブパート196にキャプチャし、関連する部分がトップ部分(最上位ビットを表す)、ボトム部分(最下位ビットを表す)、又は中間部分のいずれであるかを識別することもできる。
【0163】
任意の特定のレーン内では、集積されるHPA値はすべて同じアンカーを持つように配置され、それに応じて、あるレーンのメタデータは、そのレーン内で処理されるすべてのHPA値に等しく適用される。
【0164】
基本的には、レーンごとに異なるメタデータを指定することで、あるレーンで処理された値と別のレーンで処理された値とが同じアンカーを有する必要はない。しかし、すべてのレーン内で処理される値のすべてが同じアンカー値を持つように配置されることがしばしばあり、この場合、64ビットのメタデータは、ベクトルレジスタ160全体に格納され、複製することができる。これにより、各レーンで生成された様々なHPAの結果は、当然ながら、単一のスカラHPAの結果を生成するために、互いに容易に集積することができる。
【0165】
このような構成では、メタデータを参照する必要のあるHPA用のSVE命令は、処理されるHPA部分の特定の16ビットのメタデータへの2ビットポインタとともにメタデータレジスタを指定することができる。
【0166】
なお、
図7は、メタデータを提供するための1つのメカニズムを示しているが、メタデータをより圧縮して格納するための別の仕組みを考案することも可能であり、例えば、8レーン分のメタデータを64ビットで格納することもできる。特に、「レーン型」フィールドを必要としなくてもよいし、限られた数の利用可能な構成を反映させるために、ovlpと有意性フィールドのサイズを低減してもよい。
【0167】
HPAの重要な動作は、FP数をHPAフォーマットに変換して加算することである。この動作は、加算されるすべてのFP数に対して行われる可能性があるが、他のHPA動作(FPへの変換、HPAの冗長性の排除など)は、数千分の1の頻度で実行される。そのため、FP数の変換と加算を効率的に行うためのハードウェアサポートが望まれる。
【0168】
図8は、ベクトルユニットにわたって繰り返されるこの動作のための可能な64ビットのデータパスを示しており、
図8はそれゆえ、
図6に示された変換及び処理回路170、172、174のそれぞれのための例示的な構成をより詳細に表している。
【0169】
入力浮動小数点データ210は、符号部分212、指数部分214、及びフラクション部分216で構成される。そして、レーンについて保持されているメタデータから関連するメタデータ部分をメタデータ部分200として抽出し、これには、レーン型フィールド202、重複フィールド204、及び、有意性フィールド206が含まれる。OR機能220は、指数のビットに対してOR動作を実行して、仮数の最上位ビットを生成し、これをフラクションビット216にプリペンドして、仮数を形成するようにする。特に、指数がゼロでない場合、これは浮動小数点数が通常の浮動小数点数であることを示しており、それに応じて、仮数の最上位ビットは論理1の値となる。しかし、指数のすべてのビットがゼロである場合、これは非正規値を示し、それに応じて、仮数の最上位ビットはゼロに設定されるべきである。
【0170】
減算ブロック222は、例えば、表7を参照して前述した技術を使用して、指数214から有意性206を減算し(指数のバイアスとフラクションのワード長のために必要に応じて調整される)、浮動小数点の仮数を適切な量だけシフトするようにシフト回路224を制御するために使用されるシフト量を(適切に右シフト又は左シフトのいずれかを実行しながら)生成するように配置される。
【0171】
次に、AND回路226は、重複情報204を受け取り、シフト回路からの出力を指定された重複ビット数(64-pに等しい)でマスクする。その後、XOR回路228は、符号値212によって示されるように、浮動小数点数が負であった場合には、AND回路226からの出力に対して2の補数関数を実行する。この時点で、所与の有意性及び重複量を有する特定のHPA部分に関連する入力浮動小数点数のビットは、2の補数として利用可能であり、加算器回路230への1つの入力として提供されることができる(加算器はまた、浮動小数点オペランドが負である場合、1のキャリーイン値を取る)。その結果、関連するHPA部分は、入力された浮動小数点値から「オンザフライ」で生成することができ、その後、対応する結果部分を生成するために、適切な処理動作を受けることができることがわかる。
【0172】
図示の例では、処理動作が選択的加算動作であることを想定している。特に、AND回路240は、レジスタ235に保持された現在の値を、加算器230への第2の入力として伝搬して戻すために選択的に使用することができ、レジスタ235に記憶された更新された結果部分を生成するために、前の結果部分を変換回路から出力された入力オペランド部分と加算することができる。64ビットの加算器及びレジスタを図示の方法で組み込むことにより、バックツーバックのHPA変換・集積命令のパイプライン実行をサポートする。
【0173】
図8に示された回路を上述の動作を実行するようにトリガすることができる方法はいくつかあるが、一実施形態では、
図8の上述の機能を開始するために単一の命令が使用される。このような命令は、FP-to-HPA変換・加算命令と呼ばれる場合がある。
【0174】
FP-HPA変換・加算命令のオペコード(ニーモニック「FCVTH{A}」、{A}はオプションの集積を示す)は、一例において、FPソースレジスタ、メタデータレジスタ、デスティネーション集積器レジスタ、及び、メタデータレジスタのサブフィールドを選択するためのインデックスを含む。これは、オペコードが参照するベクトルレジスタの数を3つまでとするSVE ISAの設計原則に合致している。
【0175】
既存のSVE命令の短いシーケンスを作成して、他の重要なHPA動作を実装することもできる。
【0176】
部分オーバーフローを回避するためには、定期的にHPA数の冗長性を排除することが重要である。これは、単純に下位のHPA部分の重複領域に集積されたキャリービットを、次に上位のHPA部分のLSBに加算するだけで実現できる。SVEでは、これは3つの命令手順で実現され得る。
(i)下位部分をp個分算術右シフトする。
(ii)シフトされた重複ビットの次の上位のHPA部分に加算する。
(iii)かつ、下位のHPA部分のpから導出されるマスクを用いて重複ビットをAND immediateして強制的にゼロにする。
【0177】
この手順は、最下位のレーンから順に、隣接するHPA部分のすべてのペアに適用することができる。
【0178】
また、以下の
図13及び
図14を参照して説明するように、重複伝搬及び重複削除のための専用の命令を提供してもよい。
【0179】
FP数の大きなブロックが集積された後、その結果は複数のSVEレーンに配置された複数の集積器に格納される。その後、これらの集積器を加算し、同じインデックスを持つHPAレーンの各ベクトルに対してスカラ結果を返してもよい。SVEでは、複数のHPAレーンに保持されている集積器に対してベクトル低減を実行して、スカラHPAの結果を形成することで、これを容易に実現できる。結果として得られたスカラHPA数には、各部分の重複領域にキャリービットが含まれている可能性があるため、FP形式に変換する前に、スカラHPA数に対して冗長性排除ルーティンを実行してもよい。
【0180】
最後に、再現可能なHPAの加算結果を浮動小数点フォーマットに変換する。HPA部分を正規化されたFP64数に正確に変換するためのアルゴリズム(つまり、p≧53と仮定した場合)は以下のとおりである。
(i)CLZ(count leading zeroes:カウントリーディングゼロ)を実行し、先頭の「1」の位置を特定する。
(ii)指数を有意性+(63-CLZ)+FP64指数バイアスとして計算する。
(iii)最高位のHPA部分を除くすべての部分について、FP64の結果のビット[63]を0に設定する。FP64の結果のビット[62:52]を計算された指数に設定する。バイアス指数>0の場合、HPA部分をCLZ-11個分論理的に左シフトし、そうでなければFP64の結果を0に設定する。
(iv)最高位のHPA部分のみの場合:その部分が負であれば、FP64の結果のビット[63]を1に設定し、その部分を否定して正の2の補数を得る。FP64の結果のビット[62:52]を計算された指数に設定する。バイアス指数>0の場合、HPA部分をCLZ-11個分論理的に左シフトし、そうでなければFP64の結果を0に設定する。
【0181】
この変換アルゴリズムは、HPAレーンごとに通常15個のSVE命令で実装することができる。
【0182】
なお、必要に応じて、上記の手順(iii)と(iv)を以下のように組み合わせて、最上位以外の部分が負になる場合をカバーすることもできる。
(iii)部分が負である場合、FP64の結果のビット[63]を1に設定し、部分を否定して正の2の補数を得る。FP64の結果のビット[62:52]を、計算された指数に設定する。バイアス指数>0の場合、HPA部分をCLZ-11個分論理的に左シフトし、そうでなければFP64の結果を0に設定する。
【0183】
必要に応じて、最終的な集積値を可能な限り正確に表す単一のFP64結果を作成することができる。これは、例えば、Y.ヒダ、X.S.リー及びD.H.ベイリーが提案したアルゴリズムである「Algorithms for Quad-Double Precision Floating Point Arithmetic」Proc.15th IEEE Symposium on Computer Arithmetic,Vail CO,2001年6月、155~162頁、を適用することで実現できる。
【0184】
レーン一番下のペアから順に、Fast2Sum動作を次の上位レーンに連続して適用し、Fast2Sumで得られた上位の合計を算出する。次に、今得られたばかりの最上位の値のペアを下に向かって作業し、次の下位の値とFast2Sumから得られた下位の合計に連続して適用するプロセスを繰り返する。このようにして得られたFP64数のベクトルの最上位要素は、HPA数から0.5ulp以内であることが保証される。
【0185】
l個の部分からなるHPA集積器は、l×pビットのワード長を持ち、l個のSVEベクトルレジスタを占有する。k×128ビットのSVEベクトルユニットで実行されるFCVTH{A}命令は、2k個のFP64又は4k個のFP32数を変換して、2k個のHPA集積器の一部分に集積することができる。FCVTH{A}命令は完全にパイプライン化されているので、n個のFP64加算のブロックを2kp×lビットのHPA集積器にn×(l/2k)+1サイクルで加算することができる。lとkとの典型的な値は2~4(ただしkは16まで可能)なので、l=kとすると、n個のFP64数(又は2n個のFP32数)をk個の並列集積器にn/2サイクルで加算することができる。一方、アーム社のCortex-A72では、和が順序に行われなければならず、依存性のあるFMA(Fused Multiply-Add:融合乗算・加算)では、追加の間に3サイクルが必要であるため、同じ再現性のある集積を行う場合、3nサイクルが必要になる。このようにHPAは、FP32の集積処理において、従来のFP処理に比べて約12倍の高速化を実現している。
【0186】
上述したように、HPAの冗長性は定期的に排除又は解決する必要がある。上述の方法は、3×(l-1)命令を必要とし、264-p回の集積ごとに1回実行する必要があるが、典型的な値であるp=50の場合、これは0.1%未満のわずかな処理オーバーヘッドになる。同様に、HPA集積器のベクトルをスカラフォーマットに低減し、スカラHPAの冗長性を解消し、スカラHPAを変換してFP64フォーマットに戻す場合、n≒103以上のn個のHPA集積のための≒n/4サイクルと比較して、代表的な値であるlに対して、l+3×(l-1)+15×l≒19×l-3=35-73の命令が必要となる。
【0187】
図9は、アンカーデータ要素が2の補数の一部を表すか、又は、特殊値を表すか、を指定する型情報を含むアンカーデータ要素の符号化の別の例を示している。なお、
図7に示すように、アンカーデータ要素の型情報は、メタデータのレーン型情報196とは異なる。この符号化では、最上位ビット(この例ではビット63)を用いて、要素が2の補数の一部を表す標準的なHPAデジットを表しているのか、それとも特殊値を表しているのかを示している。最上位ビットが0の場合、HPA要素は2の補数を表す標準的なHPAデジットを表し、重複部分のビットは、上述した例と同様に、HPA値の次の上位桁の最下位ビットと同じ有意性を持つ。
【0188】
しかし、要素の最上位ビットが1の場合、その要素は、正の無限大、負の無限大、数ではない(NaN)、及び、飽和値の中から選択されたHPA特殊値を表す。最上位ビットが1の場合、次の2つの最上位ビット(例えば、
図9に示すように、ビット61及び62)は、表された特殊値の特定の型を表す。
図10は、標準的なHPAデジットと、それぞれの型の特殊値のためのビット63から61の符号化を示している。
【0189】
したがって、最上位ビットが0の場合、次の2つのビットはHPAデジットの重複ビットの一部を表している。また、重複ビットを持たない非冗長なHPAバリアントを使用する場合は、次の2ビットがHPAデジットの非重複ビットを表すこともある。これにより、従来は、どの特定の型の特殊値を符号化するかを示すために使用していたビットを、2の補数のビットを表現するために再利用することができ、効率的な符号化が可能になる。
【0190】
最上位ビットが1、最上位3ビットが0の場合、HPA要素は無限大を表す。2番目の最上位ビットは、無限大の符号を表す。したがって、要素のビット63~61の符号化を110とすると、負の無限大を表し、符号化を100とすると、正の無限大を表し得る。また、正の無限大と負の無限大の符号化を入れ替えることも可能である。HPA要素が正又は負の無限大を表すと示されている場合は、浮動小数点値のHPAフォーマットへの変換を含む動作が少なくとも1回行われる動作のシーケンスで生成され、その浮動小数点値が正又は負の無限大であったことを意味する。
【0191】
要素の最上位3ビットが101を示している場合、その要素は数ではない(NaN)を表す。これは2つの方法で生じ得る。NaNであった浮動小数点値の変換を含む一連の動作で要素が生成され得る、あるいは要素が2つのHPA値の加算に依存し得る、のいずれかであり、後者の場合、HPA値の一方が正の無限大、他方が負の無限大であった。
【0192】
一方、HPA要素の最上位3ビットが111と符号化されている場合は、その値が飽和HPA値であることを表している。飽和HPA値は、浮動小数点領域では類例がない。正又は負の無限大は、HPA値が正又は負の無限大の浮動小数点値を変換した結果であり、その浮動小数点値は、浮動小数点フォーマットで表されるよりも大きなサイズの数をもたらす計算から導出されたものであることを示す一方で、飽和HPA型は、一連のHPA動作に入力された浮動小数点数が、NaN又は無限大ではない特殊でない数であったにもかかわらず、HPA演算動作によって飽和が生じたことを示していてもよく、例えば、HPA値で表される有意性の範囲を設定したアンカーメタデータがそのようであり、入力された浮動小数点値及び/又はその処理結果が、メタデータで定義された範囲外の数を生成してしまった場合である。
【0193】
例えば、(
図7に示すレーン情報196で示される)HPA値の最上位のHPA要素に作用するHPA動作の結果、最上位の重複ビットからオーバーフローした場合に、飽和型が発生する可能性がある。あるいは、最上位のHPA要素とHPA値の重複ビットとが、HPA値で表される2の補数の一部とみなされない場合、HPA値の最上位の要素が最上位の非重複ビットから最下位の重複ビットまでオーバーフローした場合に、飽和型が発生する可能性がある。定義によれば、トップ重複ビットからオーバーフローした場合、トップの2つの重複ビットは、既に両方とも1と等しく、オーバーフローによって要素の最上位ビットが0から1に切り替わるため、オーバーフロー自体によって、対応する要素がトップの3つのビットの型情報が111と等しくなるように設定される可能性があるので、HPA値のトップ要素の重複ビットが、HPA値で表される全体の2の補数の一部とみなされる場合、ビット63~61で飽和型を111と符号化することは、定義上、特に有用である。これにより、オーバーフローを検出し、それに応じて型情報を設定するための特定の回路を必要としない場合があるので、型情報を設定するためのロジックを簡素化することができる。一方、重複ビットがHPA値で表される2の補数の一部とみなされない場合は、いくつかの追加ロジックが、非重複上位ビットから重複領域へのオーバーフローを検出し、それに応じて型情報のトップの3ビットを設定することができる。
【0194】
また、HPA動作でアンダーフローが発生した場合には、飽和型を使用することもできる。例えば、HPAフォーマットに変換される浮動小数点値が、HPAフォーマットで正確に表すためには、アンカーメタデータで定義されたHPAフォーマットを用いて表すことができる最下位ビットよりも下位のビットが必要である場合、これは、アンダーフローとして検出され、飽和データ型が示されてもよい。また、オーバーフローとアンダーフローとを区別する型符号化を使用することもできる。しかし、実際には、アンダーフローは単に精度の低下につながるが、オーバーフローは誤った処理結果が返される可能性があるため、アンダーフローよりもオーバーフローがシグナルとして重要である場合がある。したがって、場合によっては、型情報で示されるデータ型を使用してアンダーフローを通知しないという選択をすることもできる。
【0195】
一般に、HPA値の飽和型の表示をサポートする型情報を提供することで、HPA動作のシーケンスの後、プログラムコードは、その動作の結果として生じる任意の特殊値が、入力された浮動小数点数が特殊な数であることに起因するものなのか、HPA処理に起因するオーバーフローに起因するものなのかを判断することができる。これは、2つ目のシナリオでは、プログラムコードがアンカーメタデータを調整し、有効な結果を維持するために動作のシーケンスを繰り返すことができるため、有用であるが、一方、元の浮動小数点値に含まれる特殊な数が原因で特殊値が発生した場合は、異なるアンカーメタデータを使用してHPA処理を繰り返しても、特殊でない結果は得られない。
【0196】
図10は、効率的な符号化方式を提供するのに有効な、型情報の1つの特定の符号化を示しているが、他の符号化方式を使用することも可能である。
【0197】
図9は、単一のHPA要素に対する符号化を示している。HPA値が2つ以上のHPA要素で構成されている場合、それらのHPA要素のうち1つでもトップビットが1に設定されていれば、そのHPA値は特殊値であると考えられる。実際には、
図5に示すように、HPA値が複数の異なるベクトルレジスタにまたがってストライピングされているため、各HPA処理命令は一度に1つの要素しか見ることができず、HPA要素の1つを処理する際に、同じベクトル値の他のHPA要素の1つが特殊値又はオーバーフローを検出することが明らかにならない場合がある。また、入力された浮動小数点値が無限大又は数ではない場合、その浮動小数点値が変換されたHPA値のすべての要素が特殊値を示すように設定される可能性があるが、HPA処理によって飽和が生じた場合は、例えば、HPA値の最上位のHPA要素でのみ飽和型が示される可能性がある。
【0198】
また、2つのHPA要素を加算する場合には、加算される2つの要素の型情報に応じて、結果要素の型情報を設定することができる。
図11は、第1オペランド及び第2オペランドのデータ型に応じて発生し得るデータ型の違いを示す表である。表の左側の列は、第1オペランドのデータ型の選択肢の違いを示し、表の上側の行は、第2オペランドのデータ型の選択肢の違いを示している。Numは標準の2の補数、つまり要素の最上位ビットが0のときのデータ型を表す。
【0199】
図11に示すように、入力されたオペランドの両方が標準の2の補数の場合、結果は別の標準の2の補数、又は、HPA値の最上位要素からオーバーフローした場合の飽和値のいずれかになり得る。加算される2つのオペランドのうち、少なくとも1つが特殊値である場合は、結果も特殊なものになる。したがって、HPA要素の最上位ビットが1に設定されると、その要素に依存する後続のHPA要素はすべて最上位ビットが1になるように生成されるという意味でスティッキーであり、動作のシーケンスの最後に特殊値の発生を検出することができる。
【0200】
図11に示すように、加算されるオペランドのいずれかがNaNである場合、その結果もNaNになる。また、加算されるオペランドの一方が正の無限大であり、他方が負の無限大である場合もNaNとなり得る。加算されるオペランドの一方が正の無限大であり、他方が負の無限大又はNaN以外である場合は、結果は正の無限大となる。同様に、オペランドの一方が負の無限大であり、他方が正の無限大又はNaN以外である場合は、結果は負の無限大となる。最後に、オペランドの少なくとも1つが飽和値である場合、他のオペランドが標準の2の補数又は飽和値のいずれかであれば、結果も飽和される。
【0201】
場合によっては、特定の結果を引き起こすHPAの加算に応じて例外をトリガすることがある。加算される2つのオペランドが標準の2の補数であったにもかかわらず、オーバーフローが発生して結果が飽和した場合、オーバーフロー例外が通知されることがある。HPA値の最上位要素以外のHPA要素では、特定の数のHPA加算が実行された後に、その数は、その数のHPAの追加によってトップ重複ビットを超えるオーバーフローが発生しないように選択されプログラムコードが重複伝搬動作をトリガする必要があるため、この例外は発生しないはずである。ただし、最上位要素については、アンカーメタデータが正しく設定されていないと、オーバーフローが発生する可能性がある。
【0202】
符号付き浮動小数点の無限大とは異なる加算を行い、その結果がNaNになった場合は、無効なオペランド例外が発生する可能性がある。
【0203】
また、浮動小数点からHPAへの変換時又はHPAから浮動小数点への変換時には、表される特殊値の種類に応じて、他の種類の例外が発生する可能性がある。
【0204】
実際には、典型的なハイパフォーマンスコンピューティングのワークロードを分析した結果、ほとんどの場合、2つ又は3つのHPA要素で対応可能であることがわかっている。いくつかのHPA実装は、アンカー及び要素の数を把握できるプログラマに依拠してもよい。これは、プログラマが問題空間の値の範囲と数を把握していなければならないことを意味する。プログラマがこの点を間違えた場合、特に高次のHPA要素がオーバーフローした場合は、要素数を増やす、及び/又は、アンカーを変えてプログラムを再実行する以外に方法はない。
【0205】
以下の例では、プログラマがはるかに簡単に実施できるHPA実装を示す。これらの例では、HPAをサポートするハードウェアを使用することで、原則として任意の範囲の集積が可能である。
【0206】
そのため、一連のHPA動作を処理する際には、次のような手順を踏むことができる。
(1)ベクトル要素の初期値を保持する(つまり、加算する最初のベクトルレジスタを格納する。これらにはゼロが含まれている可能性が高い)。
(2)FP値をいくつかベクトル要素に集積し、オーバーフローが発生した場合には、高次の要素にスティッキーオーバーフロービットを設定する(前述の飽和データ型を参照)。
(3)オーバーフロービットが設定されているかどうかを定期的にチェックする(冗長性排除のステップで行うのがよい。また、集積が完了したときにも行う)。オーバーフローしていなければ、SVE要素の新しい値を保持し、チェックポイント情報を集積フローにキャプチャし、(2)のステップに進む。オーバーフローした場合は、要素数を増やし、最後に格納した値とSVE要素のチェックポイント情報から再実行する。
【0207】
このアイデアを更なる強化は、以下を含み得る。
(a)オーバーフローを示す高次の要素を使用して、オーバーフローの原因に関する情報(最も有用なのはオーバーフローを引き起こした値の指数)を保持すること。その指数が期待される範囲内であれば、上記のステップ(2)のように、1つの要素を追加して部分的な集積を再実行することで、問題が解消される可能性が高い。指数が範囲外の場合は、部分的な集積に追加要素が必要になることがある。例えば、予想される範囲が20~2100であるとすると、2つの要素を使って加算することができる。その代わり、2180という値のビットが得られた場合、更に2つの要素が必要になる(64ビットの要素を使用する例)。
(b)和の低次の要素に同様のスキームを使用してアンダーフローを検出して対処すること。この場合も、問題となる指数を要素にキャプチャし、低アンカーの追加要素(単数又は複数)を使って部分的な集積を再実行することができる。
(c)(a)と(b)とを組み合わせて、任意の範囲での自動集積を可能にすること。
(d)再実行が必要な条件、集積器内の最終的な要素数、最終的なアンカー値など、1つ又は複数の表示をプログラマが利用できるようにすること。これらのデータは、汎用レジスタ又はプライベートレジスタにキャプチャされ、低減動作の後に集積器要素で利用できる。
【0208】
これらの拡張機能を使用すると、プログラマが特別な入力をしなくても、汎用ライブラリルーティンで任意の浮動小数点集積を実行できるようになる。ほとんどの場合、集積に必要なのは2つ又は3つの要素だけであるが、見込みのない入力又は範囲も、同じ連想的で再現可能なフレームワークで対応することができる。
【0209】
それゆえ、これらの例は以下を提供することができる。
(1)HPA集積におけるオーバーフローの動的処理
(2)HPA集積におけるアンダーフローの動的処理
(3)HPA集積器の使用状況の作成
【0210】
これらの技術のより具体的な例を以下に示する。
【0211】
図12は、オーバーフロー又はアンダーフローを含むアンカーデータ処理動作の使用情報を生成する方法を示すフロー図である。
図12では、オーバーフローとアンダーフローとの両方に対してこの情報を生成することを示しているが、他の例では、オーバーフロー時に生成することも可能である。
【0212】
ステップ300において、処理回路14は、命令デコーダ20によってデコードされた命令に応答して、アンカーデータ処理動作を実行する。この動作は、例えば、浮動小数点変換動作であってもよいし、浮動小数点変換と、それに続く、変換された浮動小数点値のアンカーデータフォーマットの集積器への加算の両方を含むこともできる。また、アンカーデータ処理動作は、HPA値の処理を含むHPA加算又はその他の動作である可能性もある。ステップ302において、処理回路14は、所与のHPA値のトップ(最上位)要素を生成した動作についてオーバーフローがあったかどうか、又はHPA値のボトム(最下位)要素について(アンダーフローの検出をサポートする実装形態において)アンダーフローがあったかどうかを検出する。動作によってトップ要素が生成されるか、ボトム要素が生成されるかは、アンカーメタデータのレーン型情報196によって示されることがある。トップ要素のオーバーフロー又はボトム要素のアンダーフローがなかった場合、ステップ304で処理が継続される。場合によっては、HPA値の中間要素又はボトム要素からのレーンのオーバーフローがあった場合、例外がシグナリングされることがある。
【0213】
一方、トップ要素のオーバーフロー又はボトム要素のアンダーフローが検出された場合、ハードウェアは、ソフトウェアアクセス可能な格納場所への使用量情報の格納をトリガする。ソフトウェアアクセス可能な格納場所は、メモリ4内の場所、又は、アンカーデータ処理動作の結果を記憶するレジスタとは別の、レジスタバンク12内の第2のレジスタであり得る。しかし、ソフトウェアアクセス可能な格納場所が、アンカーデータ処理動作のデスティネーションレジスタ自体である場合、マイクロアーキテクチャにおいて実装することが最も便利かつ簡単であり得る。例えば、オーバーフロー又はアンダーフローが検出された場合、結果データ要素は、
図9及び
図10に示すような特殊値の符号化で生成され、トップビットが1に設定される。使用情報は、
図9に示すように、空のビット0~60の一部に格納することができる。これらのビットは、値が特殊なものであるため、表現すべき2の補数値がないことから、もはや必要ない。これにより、1つの命令に応答して2つのレジスタに書き込む必要が回避される。ソフトウェアアクセス可能な格納場所への使用情報の書き込みには、使用情報又はそれをどのように格納するかを指定する専用の命令は必要なく、代わりに、使用情報の格納が、アンカーデータ処理動作によってオーバーフロー又はアンダーフローが発生した場合に自動的にトリガされるように、マイクロアーキテクチャにしっかり接続されていてもよい。
【0214】
使用情報は、オーバーフロー又はアンダーフローの原因(アンカーデータ処理動作の一部分として変換された浮動小数点値の指数、又はHPA値の許容範囲内で完全に表現できる最大又は最小の指数から外れた指数のマージンなど、指数から導出されれる他の情報など)、あるいは、アンカーデータフォーマットを変更してオーバーフロー又はアンダーフローを防ぐためにHPA値のHPA要素の数及び/又はアンカーメタデータをどのように更新するか、のいずれかを示す。例えば、オーバーフロー/アンダーフローを回避するために、必要な数値を完全に表現するためには、何個のHPA要素を追加する必要があるか、又は、レーンの有意性をどのような値に設定する必要があるかを使用情報で示すことができる。いくつかの例は、複数の種類の使用情報を提供する場合がある。使用情報を格納した後、ステップ304で処理を継続することができる。
【0215】
使用量情報を生成したアンカーデータ処理動作の後に実行される更なる動作では、更なる結果データ要素も使用量情報を指定してもよく、これにより、後の動作への入力自体がオーバーフローの原因であるかどうかにかかわらず、一連の動作を通じて使用量情報が格納されることになる。しかし、許容範囲外の浮動小数点値の指数に基づいてある動作の使用量情報を格納した後、後続の動作で更に大きな指数値に遭遇した場合、後続の結果の使用量情報を更新することができる。
【0216】
この使用情報の格納は、HPA値のレーン数(HPA要素)の動的な調整や、コードの一部として自動的にアンカー情報の動的な調整をサポートするソフトウェアルーティンを支援するために非常に有用であり、どのアンカー情報を設定すべきかを知る際のプログラマの負担を軽減することができる。
図13は、そのようなソフトウェアがどのように機能するかを示すフロー図である。あるいは、いくつかの実装形態では、処理回路自体が、
図13に示す機能を実行して、検出されたオーバーフロー又はアンダーフローに自動的に反応して、HPA値のフォーマットを変更するようにしてもよい。
【0217】
ステップ400では、実行すべきデータ処理動作のシーケンスの最初の部分を実行する前に、アーキテクチャ状態のチェックポイントをキャプチャする。例えば、これは、特定のレジスタの値をメモリ4の位置に格納する一連の格納命令によってトリガされることがある。
【0218】
ステップ402で、ソフトウェアは次に、少なくとも1つのアンカーデータ処理動作を含むデータ処理動作のシーケンスの次の部分の実行に進む。例えば、いくつかの浮動小数点入力を取り、それらをアンカーデータ値に変換し、それらのアンカーデータ値に加算を実行するための一連の命令を含むことができる。変換及び加算は、別々の命令で実行することもでき、あるいは、組み合せ変換・加算命令に組み合わせることもできる。シーケンスの一部分は、所与の長さである可能性があり、例えば、上述したように重複削減を行わずに安全に実行できる加算回数に対応する可能性がある。
【0219】
ステップ404で、プログラムコードは、データ処理動作のシーケンスの以前に実行された部分の間にオーバーフロー又はアンダーフローが発生したかどうかをチェックするための命令を含む。例えば、この命令は、結果が特殊値を表しているかどうかをチェックし、そうであれば、
図12に示すように、特殊値の符号化及び/又はハードウェアによって生成された使用情報をチェックして、オーバーフロー/アンダーフローが発生したかどうかを判断することができる。オーバーフロー又はアンダーフローが検出されなければ、その部分の処理は正しく実行されたことになり、レーン数又はアンカー情報を更新する必要はないのでステップ406で、アンカーデータ処理を用いて実行するデータ処理動作のシーケンスが終了したかどうかを判断する。そうでなければ、方法はステップ400に戻り、シーケンスの以前に実行された部分から得られた値に基づいて、アーキテクチャ状態の別のチェックポイントを取り、その後、方法は再びステップ400~404をループする。
【0220】
ステップ404でオーバーフロー又はアンダーフローが検出された場合、本方法はステップ407に進み、オーバーフロー/アンダーフローが発生したときにハードウェアによって生成された使用情報によって、少なくとも1つの再試行条件が満たされるかどうかが判断される。例えば、少なくとも1つの再試行条件は、以下のいずれか1つ以上を含むことができる。
・ オーバーフロー又はアンダーフローのマージンが所定の量よりも小さい場合に満たされる条件。オーバーフローのマージンは、処理されるべき入力値又はHPA処理で生成された値の最上位ビットと、現在のアンカー情報及びHPA値の現在の要素数を考慮してHPAフォーマットを用いて表すことができる最上位ビットとの間の有意性であってもよい。アンダーフローのマージンは、処理される入力値又はHPA処理で生成された値の最下位ビットと、現在のアンカー情報とHPA値の現在の要素数を考慮してHPAフォーマットを使用して表すことができる最下位ビットとの間の有意性の差であってもよい。
・ オーバーフロー又はアンダーフローを防ぐために必要な追加のアンカーデータ要素の数が所定の数以下であること、及び
・ データ処理動作のシーケンスの当該一部分を再試行する以前の試行回数が所定のしきい値以下であること。
【0221】
これらの条件が1つ以上満たされているかどうかをチェックして、更新された要素数及び/又は更新されたアンカー情報に基づいて、コードシーケンスの前の部分を再試行する価値があるかどうかを判断することで、要素数又はアンカー情報の比較的小さな調整でオーバーフロー/アンダーフローに対処できる場合に、動的な更新を制限するのに役立つ。オーバーフロー/アンダーフローのマージンが大きい場合には、非常に多くの要素数でHPA値を拡張することは効率的ではなく、オーバーフロー/アンダーフローが発生した事実を単に記録し、処理を終了する、又は再試行せずに継続することが効率的である場合もある。また、既に所与の回数の再試行が行われており、オーバーフロー/アンダーフローへの対処に失敗した場合には、再度の再試行の実行を回避することが好ましい場合もある。
【0222】
したがって、使用情報によって少なくとも1つの再試行条件が満たされると、ステップ408において、シーケンスの前の部分で処理された少なくとも1つのアンカーデータ値について、レーン数(HPA要素)及び/又はアンカー情報を更新する。いくつかの実装形態では、この更新は、オーバーフロー又はアンダーフローを引き起こした動作に応答してハードウェアによって設定された、前述の
図12で説明した使用情報に基づいて行われることがある。しかし、他の例では、アンカーデータ値の有意性を特定量だけ変更する、又は、HPA値で提供される要素数を所与の増分(例えば、1つの追加要素)だけ拡張するなど、レーン数又はアンカー情報を何らかの既定の方法で単純に更新することができる。ステップ410では、例えば、ソフトウェアが、チェックポイントが以前に格納されたメモリ位置から関連するレジスタに値をロードするためのロード命令を含むことにより、アーキテクチャ状態の直近にキャプチャされたチェックポイントがレジスタ12に復元される。ステップ412で、このソフトウェアは、更新されたレーン数及び/又はアンカー情報と、復元されたアーキテクチャ状態のチェックポイントとに基づいて、データ処理動作のシーケンスの以前に実行された部分の再試行をトリガする。例えば、コードは、シーケンスの以前に実行された部分の開始に戻るように分岐するブランチを含むことができる。その部分が再び完了すると、本方法は次にステップ404に戻り、上述したようにオーバーフロー又はアンダーフローがあったかどうかを再び検出する。したがって、アンカー情報への最初の更新が成功した場合には、1回の再試行のみが必要となる場合もあるが、最初の更新が十分でなかった場合には、オーバーフロー又はアンダーフローが複数回発生する場合もあり、この場合には、ステップ404~412を介して複数回のループが発生することになる。最終的に、シーケンスの現在の部分は、オーバーフロー又はアンダーフローなしに完了し、その後、本方法は、上述したようにステップ406に進み、シーケンスの次の部分に進むことができる。
【0223】
一方、ステップ407において、少なくとも1つの再試行条件が使用情報によって満たされなかった場合、ステップ414において、シーケンスを終了する、又は代替的に、シーケンスの以前に実行された部分を再試行せずにシーケンスを継続する。終了の場合には、例えば、例外が示され得る。シーケンスを継続する場合、以前のオーバーフロー/アンダーフローは、シーケンスの残りの部分の結果が正しくない可能性があることを意味するが、更なるオーバーフロー/アンダーフローが、オーバーフロー/アンダーフローのマージンが更に大きい可能性があるシーケンスの後の部分で発生する可能性があるため、再試行が実行されない場合には、オーバーフロー/アンダーフローを回避するために必要なHPAフォーマットへの修正の全体像を収集できるように、シーケンスを完了させることが好ましいと考えられる可能性がある。
【0224】
ステップ414で再試行せずにシーケンスの処理を終了又は継続した場合、ステップ416で、発生したオーバーフロー又はアンダーフローに関する情報を返すことができる。例えば、この情報は、オーバーフロー/アンダーフロー引き起こした浮動小数点値の指数を指定することができ、及び/又は、いくつのオーバーフロー/アンダーフローが発生したかを特定することができ、及び/又は、オーバーフロー/アンダーフローが発生したシーケンス内のポイントを指定することができ、又は、オーバーフロー/アンダーフローが発生した理由を分析するのに有用な他の情報を提供することができる。
【0225】
いくつかの例では、ステップ407が含まれていなくてもよく、この場合、使用情報が再試行条件を満たすかどうかにかかわらず、アンカー情報及び/又はレーン数への動的な更新及び自動再試行が、ステップ408~412に従って実行されてもよい。
【0226】
ある時点で、オーバーフロー/アンダーフローが動的再試行によって対処できた場合には、ステップ406において、最初に成功したために、あるいは、1回以上の再試行後にオーバーフロー又はアンダーフローが発生しなくなったために、オーバーフロー又はアンダーフローの発生が検出されずに各部分を完了して、シーケンスデータ処理動作の終了に到達する。シーケンスの終わりに到達すると、ステップ418で、ソフトウェアコードは、シーケンスの結果として得られた最終的なアンカーメタデータに関する情報、シーケンスで処理された所与のHPA値に関連する要素の最終的な数、又はシーケンスの所与の部分を再試行する必要があった可能性のある条件に関する情報の格納をトリガする命令を含むことができる。一般的には、ソフトウェアがオーバーフロー又はアンダーフローがなぜ発生したかを確認するため、又はアンカーメタデータの最適な設定を特定できるようにすることを可能にする情報がここに格納されていてもよく、これは、アンカーメタデータ及びレーン数を最初から希望の値に設定するので、同じプログラムを次回以降に実行する際のパフォーマンスを向上させることができ、この動作は、多くの再試行を必要としないことにより、次回のプログラム実行時のパフォーマンスを向上させることができる。
【0227】
なお、
図13では、ステップ418で再試行が必要な条件の情報を格納しているが、ステップ408でアンカー情報を更新する際にこの情報を格納し、オーバーフロー又はアンダーフローの原因に関する情報を長く保持する必要がないようにすることも可能である。
【0228】
図14は、
図13に示した方法による、プログラムコード(HPA処理動作を含む)のシーケンスの処理の例を模式的に示したものである。
図14に示すポイント450では、レジスタの状態の初期チェックポイントがキャプチャされる。このチェックポイントは、プログラムコードの次の部分を処理した結果、上書きされる可能性のあるあらゆる状態をカバーしている。チェックポイントは、キャプチャした状態をメモリに保存するか、アーキテクチャと物理レジスタとのマッピングを更新して、レジスタ状態の後続の更新が、レジスタ状態の前回のチェックポイントを格納しているレジスタとは異なる物理レジスタで行われるようにすることによってキャプチャされる。
【0229】
ポイント452で、プログラムコードシーケンスの部分1が実行される。部分1の完了時に、ポイント454でオーバーフロー/アンダーフロー検出が実行され、この例では、オーバーフロー又はアンダーフローが発生しなかったことが検出される。したがって、ポイント456でレジスタ状態の別のチェックポイントがキャプチャされ、その後、点458でプログラムコードシーケンスの部分2が実行される。
【0230】
部分2の処理中のポイント460で、オーバーフローが発生する。処理ハードウェアは、オーバーフローの原因に関する情報及び/又はオーバーフローに対処するためにHPA要素の数をどのように適応させるかを示す使用情報を、ソフトウェアアクセス可能な格納場所に自動的に格納する。シーケンスの部分2の実行を継続し、部分2の終わりに、ポイント462で再びオーバーフロー/アンダーフロー検出が実行され、今度はオーバーフロー/アンダーフロー検出が、使用情報に基づいて、オーバーフローが発生したことを判断する。
【0231】
この例では、任意の再試行条件が課されている場合、それらの再試行条件がオーバーフローによって満たされたことが想定される。任意の必要な再試行条件を満たさなかった場合は、コードシーケンスを終了してもよく、又は再試行せずに継続することが可能になり得る。しかし、この特定の例では、再試行条件が満たされているので、ポイント464において、プログラムコードは、オーバーフローを回避するために、HPAフォーマットのHPA要素の数を少なくとも1つ追加で拡張する。オーバーフローの場合、HPAフォーマットの既存のレーンのアンカー情報が示すレーンの有意性は変わらないため、最下位要素は依然として以前と同じ有意性を有している。しかし、より有意性の高いレーンが追加されたため、前の最上位レーンのレーン型の更新が行われ、そのレーンが中間レーンに変更される。ポイント466において、プログラムコードは、以前にステップ456でキャプチャされた状態のチェックポイントを復元し、コードシーケンスの部分2の開始に分岐して戻り、更新されたHPA要素の数に基づいて部分2の実行を再試行する。このとき、部分2の処理の2回目の試行中にオーバーフロー又はアンダーフローが発生しなかったため、ポイント468でオーバーフロー/アンダーフローが検出されず、レジスタ状態の別のチェックポイントがキャプチャされ、ポイント470でコードシーケンスの部分3の処理が継続される。
【0232】
その後、各部分は同様の方法で処理され、最終的にはポイント472でコードシーケンスの終わりに到達し、最終的なレーン数又はアンカーのメタデータ、及び/又は再試行が必要な条件に関する情報が返される。
【0233】
図15は、検出されたオーバーフローに応答して、少なくとも1つの追加のHPA要素を提供する例を示す。
図15の上部に示すように、オーバーフローの理由は、HPA処理シーケンスへの入力オペランドとして入力された浮動小数点値1.Fが、現在のHPA要素数(この例では2)とアンカーメタデータ(アンカー[0]、アンカー[1])とによって定義される現在のHPAフォーマットで表すことができる値よりも大きい値を有することであり得る。HPA値の最上位要素の重複ビットが、HPA値で表される有意性の範囲の一部とみなされる実施形態では、オーバーフローのマージンは、
図15に示す実線480のようになることがあり、一方、HPA値の最上位要素の重複ビットが、HPA値で表される有意性の範囲の一部とみなされない実施形態では、オーバーフローのマージンは、点線482のようになる。
【0234】
したがって、オーバーフローが発生した場合、ハードウェアは、オーバーフローのマージンを評価するための情報を使用状況情報として記録してもよい。例えば、使用情報は、浮動小数点値の指数E、オーバーフローのマージン、又は、オーバーフローを処理するために必要な追加要素の数の表示を示すことができる。オーバーフローのマージンがZである場合、オーバーフローを回避するために必要な追加要素の数Jは、(J-1)*(N-V)<Z≦J*(N-V)という条件を満たすJの値であってもよく、ここで、NはHPA要素あたりのビット数、Vは重複ビット数である。例えば、オーバーフローマージンZがN-V以下の場合は、最上位端のHPA要素を1つ追加すればよく、オーバーフローマージンZがN-Vより大きい場合は、2つ以上の追加要素が必要となる場合がある。
【0235】
図15の例では、
図15の下部に示すように、1つの追加HPA要素を設けることで、オーバーフローに対応することができる。更新されたレーン数と復元されたレジスタ状態のチェックポイントとに基づいてコードシーケンスの前の部分を再試行する際、上端の追加レーンには、最初に符号ビット(復元されたレジスタ状態の対応するHPA値の最上位ビットの符号と一致する)でポピュレートされる。オーバーフローのみが発生した
図15に示すケースでは、下位のレーンのアンカーメタデータが示すレーンの有意性192(
図7に示すもの)は、同じままでよいが、HPA要素HPA[1]のレーン型196が最重要レーン(M)を示すものから中間レーン(I)を示すものに更新されている。新たに追加された要素HPA[2]のアンカーメタデータは、最上位レーン(M)のレーン型を示すとともに、レーンの有意性192として、HPA[1]に関連付けられたアンカーメタデータアンカー[1]のレーンの有意性192にN-Vを加えた値を指定している。これで、以前に実行したコードシーケンスの一部分を再度実行することができ、今度は、オーバーフローを引き起こした浮動小数点オペランドに遭遇したときに、その数値をHPAフォーマットで表現可能な範囲に収めることができる。
【0236】
図16は、HPA値の下限に少なくとも1つの追加HPA要素を設けることでアンダーフローに対応した別の例である。オーバーフローの場合とは異なり、アンダーフローの場合は、HPA値の既存レーンのアンカーメタデータが示す有意性を調整する必要がある。この例では、アンダーフローUMのマージンがあるため、2つの追加レーンが必要である。追加要素HPA[0]’及びHPA[1]’は、対応するアンカーメタデータのレーン型フィールド196において、最下位(L)及び中間(I)のレーン型として定義され、追加される。追加要素HPA[0]’及びHPA[1]’は、アンダーフローを引き起こしたコードシーケンスの前の部分を再開する際に、最初はゼロでポピュレートされる。
図16の上部で以前にHPA[0]及びHPA[1]として示されていたHPA要素に対応するレジスタ状態の復元されたチェックポイントの値は、今度は、更新されたHPAフォーマットのHPA要素HPA[2]’及びHPA[3]’として扱われる。したがって、更新されたHPAフォーマットのHPA[2]’及びHPA[3]’のレーンの有意性192は、更新前のレーンHPA[0]及びHPA[1]のアンカーメタデータで指定されたレーンの有意性192と一致する。要素HPA[2]’及びHPA[3]’のレーン型196は、それぞれ中間の要素及び最上位要素である。新しく追加された要素HPA[1]’は、そのレーンの有意性がアンカー[0]-(N-V)に設定され(ここでアンカー[0]は動的な更新前のHPA[0]のレーンの有意性)、新しく追加された要素HPA[0]’は、そのレーンの有意性がアンカー[0]-2*(N-V)に設定される。その後、コードの前の部分は、更新された要素数とアンカー情報で再試行することができる。
【0237】
図15及び
図16は、オーバーフロー及びアンダーフローのいずれか一方のみが発生する例を示しているが、コードシーケンスの同じ部分でオーバーフロー及びアンダーフローの両方が発生することも可能であり、その場合、要素数の拡張は、HPA値の両端により多くの要素を追加することを含むことができる。
【0238】
図5に示すようにHPA値が複数のレジスタにまたがってストライピングされている実施形態において、
図15及び
図16に示すようにHPA要素の数が拡張された場合、全体のHPA値の各HPA要素が異なるデスティネーションレジスタに書き込むそれぞれの命令によって処理されるため、コードシーケンスの再試行部分では、その部分の実行を最初に試みたときと比較して、より多くの数の命令を実行する必要があることが理解されるであろう。これは、HPA値に含まれる要素の総数を定義する変数を定義し、HPA値に含まれる要素の総数に対応する命令実行の反復回数で、プログラムコードのループ(又は、条件分岐を使用するなどの代替的なプログラムフロー制御構造)を実行することで実現できる。
【0239】
図17は、使用可能なシミュレータの実装形態を示している。先に説明した実施形態は、当該技術をサポートする特定の処理ハードウェアを動作するための装置及び方法の観点から本発明を実装するものであるが、コンピュータプログラムを使用して実装される本明細書に記載の実施形態に従った命令実行環境を提供することも可能である。このようなコンピュータプログラムは、ハードウェアアーキテクチャのソフトウェアベースの実装形態を提供する限りにおいて、シミュレータと呼ばれることが多い。シミュレータコンピュータプログラムの種類には、エミュレータ、仮想マシン、モデル、及び動的バイナリトランスレータを含むバイナリトランスレータが含まれる。典型的には、シミュレータの実装形態は、シミュレータプログラム510をサポートする、任意にホストオペレーティングシステム520を実行するホストプロセッサ530上で実行されてもよい。いくつかの構成では、ハードウェアと提供される命令実行環境との間に複数のシミュレーション層が存在してもよく、及び/又は、同じホストプロセッサ上で提供される複数の異なる命令実行環境が存在してもよい。歴史的に、合理的な速度で実行するシミュレータの実装形態を提供するためには、強力なプロセッサが必要とされてきたが、互換性又は再利用の理由から別のプロセッサにネイティブなコードを実行したい場合など、特定の状況では、そのようなアプローチが正当化される場合がある。例えば、シミュレータの実装形態では、ホストプロセッサのハードウェアではサポートされていない追加機能を備えた命令実行環境を提供すること、又は異なるハードウェアアーキテクチャに典型的に関連する命令実行環境を提供することができる。シミュレーションの概要は、「Some Efficient Architecture Simulation Techniques」、Robert Bedichek、1990年冬 USENIX Conference、53~63頁に記載されている。
【0240】
これまで、特定のハードウェア構成又は機能を参照して実施形態を説明してきたが、シミュレーションされた実施形態では、同等の機能を適切なソフトウェア構成又は機能によって提供することができる。例えば、特定の回路は、シミュレーションされた実施形態において、コンピュータプログラムロジックとして実装されてもよい。同様に、レジスタ又はキャッシュなどのメモリハードウェアは、ソフトウェアのデータ構造としてシミュレーションされた実施形態で実装することができる。先に説明した実施形態で参照されるハードウェア要素の1つ又は複数がホストハードウェア(例えば、ホストプロセッサ530)上に存在する構成では、いくつかのシミュレートされた実施形態は、適切な場合にはホストハードウェアを利用してもよい。
【0241】
シミュレータプログラム510は、コンピュータ読み取り可能な記憶媒体(非一時的媒体であってもよい)に格納されてもよく、シミュレータプログラム510によってモデル化されているハードウェアアーキテクチャのアプリケーションプログラムインタフェースと同じであるプログラムインタフェース(命令実行環境)をターゲットコード500(アプリケーション、オペレーティングシステム、ハイパーバイザを含んでもよい)に提供する。したがって、上述したHPA値の処理をサポートする命令を含むターゲットコード500のプログラム命令は、シミュレータプログラム510を使用する命令実行環境内から実行されてもよく、上述した装置2のハードウェア機能を実際には有していないホストコンピュータ530がこれらの機能をエミュレートすることができる。シミュレータプログラム510は、ターゲットコード500の命令をデコードして、ホストハードウェア530がサポートするネイティブ命令にマッピングするための命令デコードプログラムロジック412を含んでもよい。命令デコードプログラムロジック512は、上述したようなFP変換、加算、又は重複伝搬動作などのHPA(アンカーデータ処理)動作を実行するためのネイティブ命令のセットにHPA処理命令をマッピングするアンカーデータ処理プログラムロジック514を含む。
【0242】
本出願において、「~ように構成される(configured to)」という用語は、装置の要素が、定義された動作を実行することができる構成を有することを意味するために使用される。このコンテキストにおいて、「構成」は、ハードウェア又はソフトウェアの相互接続の構成又は方法を意味する。例えば、装置は、定義された動作を提供する専用ハードウェアを有してもよく、又はプロセッサ若しくは他の処理デバイスは、機能を実行するようにプログラムされてもよい。「~ように構成される」は、定義された動作を提供するために、装置要素を任意の方法で変更する必要を意味しない。
【0243】
本発明の例示的な実施形態が添付の図面を参照して本明細書で詳細に説明されてきたが、本発明はそれらの正確な実施形態に限定されず、添付の特許請求の範囲によって定義される本発明の範囲及び精神から逸脱することなく、当業者によって様々な変更及び修正を行うことができることを理解されたい。