(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-08-02
(45)【発行日】2023-08-10
(54)【発明の名称】ベクトル・キャリー付き加算命令
(51)【国際特許分類】
G06F 9/302 20180101AFI20230803BHJP
G06F 17/16 20060101ALI20230803BHJP
【FI】
G06F9/302 A
G06F17/16 D
(21)【出願番号】P 2020531157
(86)(22)【出願日】2018-11-15
(86)【国際出願番号】 EP2018081444
(87)【国際公開番号】W WO2019115142
(87)【国際公開日】2019-06-20
【審査請求日】2021-11-08
(32)【優先日】2017-12-13
(33)【優先権主張国・地域又は機関】EP
(73)【特許権者】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】エヨール、ムボウ
(72)【発明者】
【氏名】スティーブンス、ナイジェル ジョン
(72)【発明者】
【氏名】バージェス、ニール
(72)【発明者】
【氏名】マグクリス、グリゴリオス
【審査官】三坂 敏夫
(56)【参考文献】
【文献】特開平08-241302(JP,A)
【文献】特開2003-167728(JP,A)
【文献】特開平06-250823(JP,A)
【文献】特開平07-244589(JP,A)
【文献】特表2015-532755(JP,A)
【文献】米国特許出願公開第2016/0124710(US,A1)
【文献】米国特許出願公開第2006/0259737(US,A1)
【文献】米国特許第06295597(US,B1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/30-9/355
G06F 17/16
G06F 15/80
(57)【特許請求の範囲】
【請求項1】
装置であって、
データ処理を実施するための処理回路と、
前記データ処理を実施するための前記処理回路を制御するために、命令をデコードするための命令デコード回路と、
複数のデータ要素を含むベクトル・オペランドを格納するための複数のベクトル・レジスタと
を備え、
前記命令デコード回路は、デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、及びキャリー・ソース・ベクトル・レジスタを指定するベクトル・キャリー付き加算命令に応答して、少なくとも前記デスティネーション・ベクトル・レジスタ及び前記キャリー・ソース・ベクトル・レジスタは、少なくとも1対のデータ要素を含むオペランドをそれぞれ指定し、それぞれの対は第1のデータ要素及び第2のデータ要素を含み、前記デスティネーション・ベクトル・レジスタのデータ要素のそれぞれの対について、前記処理回路を制御して
前記ベクトル・キャリー付き加算命令に関連する情報に応じて、前記第1のデータ・ソース・ベクトル・レジスタのうちのデータ要素と第2のデータ・ソース・ベクトル・レジスタのうちのデータ要素を選択することと、
前記デスティネーション・ベクトル・レジスタの前記データ要素の対の前記第1のデータ要素を、前記第1のデータ・ソース・ベクトル・レジスタのデータ要素のうちの
前記選択されたデータ要素から取得された第1のソース・データ値と、前記第2のデータ・ソース・ベクトル・レジスタのデータ要素のうちの
前記選択されたデータ要素から取得された第2のソース・データ値と、前記キャリー・ソース・ベクトル・レジスタの対応するデータ要素の対の前記第2のデータ要素から取得されたキャリー値との加算の結果に対応する値で更新することと、
前記デスティネーション・ベクトル・レジスタの前記データ要素の対の前記第2のデータ要素を、前記加算のキャリー出力に対応する値で更新することと
を行う、装置。
【請求項2】
前記第1のデータ・ソース・ベクトル・レジスタは、前記デスティネーション・ベクトル・レジスタと同一のレジスタであり、前記第1のソース・データ値は前記デスティネーション・ベクトル・レジスタの前記データ要素の対の前記第1のデータ要素の以前の値を含む、請求項1に記載の装置。
【請求項3】
それぞれのデータ要素の対は、隣接するデータ要素の対を含む、請求項1又は2に記載の装置。
【請求項4】
前記デスティネーション・ベクトル・レジスタ及び前記キャリー・ソース・ベクトル・レジスタ内のデータ要素の対の数が少なくとも2であり、前記対の前記第1のデータ要素は、前記対の前記第2のデータ要素でインターリーブされる、請求項1から3までのいずれか一項に記載の装置。
【請求項5】
前記ベクトル・キャリー付き加算命令に応答して、前記命令デコード回路は、前記処理回路を制御して
前記キャリー・ソース・ベクトル・レジスタの前記対応するデータ要素の対の第2のデータ要素の最下位ビットから前記キャリー値を取得することと、
前記デスティネーション・ベクトル・レジスタの前記データ要素の対の前記第2のデータ要素の最下位ビットを、前記加算の前記キャリー出力に対応する前記値で更新することと
行うように構成される、請求項1から4までのいずれか一項に記載の装置。
【請求項6】
前記ベクトル・キャリー付き加算命令に応答して、前記キャリー・ソース・ベクトル・レジスタ及び前記デスティネーション・ベクトル・レジスタの両方について、前記最下位ビット以外の前記第2のデータ要素の残りのビットは使用されない、請求項5に記載の装置。
【請求項7】
それぞれのデータ要素は2
Nビットを含み、前記第2のソース・データ値は2
Nビットを含み、ここでNは整数である、請求項1から6までのいずれか一項に記載の装置。
【請求項8】
前記第2のデータ・ソース・ベクトル・レジスタは、少なくとも1対のデータ要素を含むオペランドをさらに指定し、それぞれの対は第1のデータ要素及び第2のデータ要素を含み、
前記ベクトル・キャリー付き加算命令の第1の変形例に応答して、前記第2のソース・データ値は前記第2のデータ・ソース・ベクトル・レジスタの対応するデータ要素の対の前記第1のデータ要素から取得された値を含み、
前記ベクトル・キャリー付き加算命令の第2の変形例に応答して、前記第2のソース・データ値は、前記第2のデータ・ソース・ベクトル・レジスタの前記対応するデータ要素の対の前記第2のデータ要素から取得された値を含む、請求項1から7までのいずれか一項に記載の装置。
【請求項9】
少なくとも1つのプレディケート指標を指定するプレディケート値に関連付けられる前記ベクトル・キャリー付き加算命令のプレディケートされた変形例に応答して、それぞれのプレディケート指標は前記デスティネーション・ベクトル・レジスタの前記少なくとも1対のデータ要素のうちの1つに対応しており、前記命令デコード回路は、前記処理回路を制御して、
前記対応するプレディケート指標が第1の値を有するデータ要素の対について、前記対の前記第1のデータ要素の、前記加算の前記結果に対応する前記値での前記更新、及び前記対の前記第2のデータ要素の、前記加算の前記キャリー出力での前記更新を実施し、
前記対応するプレディケート指標が第2の値を有するデータ要素の対について、前記対の前記第1のデータ要素の、前記加算の前記結果に対応する前記値での前記更新、及び前記対の前記第2のデータ要素の、前記加算の前記キャリー出力での前記更新を抑制する
ように構成される、請求項1から8までのいずれか一項に記載の装置。
【請求項10】
前記ベクトル・キャリー付き加算命令の加算の変形例に応答して、前記加算は、前記第1のソース・データ値と、前記第2のソース・データ値と、前記キャリー値とを加算することを含み、
前記ベクトル・キャリー付き加算命令の減算の変形例に応答して、前記加算は、前記減算についてのボロー値を示す前記キャリー値で前記第1のソース・データ値から前記第2のソース・データ値の減算を含み、前記キャリー出力は前記減算のボロー出力を含む、請求項1から9までのいずれか一項に記載の装置。
【請求項11】
ターゲット・プログラム・コードの命令を実行するための命令実行環境を提供するためにホスト処理装置を制御するためのコンピュータ・プログラムであって、前記コンピュータ・プログラムは、
データ処理を実施するための処理プログラム・ロジックを制御するために、前記ターゲット・プログラム・コードの命令をデコードするための命令デコード・プログラム・ロジックと、
複数のデータ要素を含むベクトル・オペランドを格納するための複数のベクトル・レジスタを表現するデータを記憶するためのベクトル・レジスタ・データ構造と
を含み、
前記命令デコード・プログラム・ロジックは、デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、及びキャリー・ソース・ベクトル・レジスタを指定するベクトル・キャリー付き加算命令に応答して、少なくとも前記デスティネーション・ベクトル・レジスタ及び前記キャリー・ソース・ベクトル・レジスタは、少なくとも1対のデータ要素を含むオペランドをそれぞれ指定し、それぞれの対は第1のデータ要素及び第2のデータ要素を含み、前記デスティネーション・ベクトル・レジスタのデータ要素のそれぞれの対について、前記ベクトル・レジスタ・データ構造を更新するために前記処理プログラム・ロジックを制御して、
前記ベクトル・キャリー付き加算命令に関連する情報に応じて、前記第1のデータ・ソース・ベクトル・レジスタのうちのデータ要素と第2のデータ・ソース・ベクトル・レジスタのうちのデータ要素を選択することと、
前記デスティネーション・ベクトル・レジスタの前記データ要素の対の前記第1のデータ要素を、前記第1のデータ・ソース・ベクトル・レジスタのデータ要素のうちの
前記選択されたデータ要素から取得された第1のソース・データ値と、前記第2のデータ・ソース・ベクトル・レジスタのデータ要素のうちの
前記選択されたデータ要素から取得された第2のソース・データ値と、前記キャリー・ソース・ベクトル・レジスタの対応するデータ要素の対の前記第2のデータ要素から取得されたキャリー値との加算の結果に対応する値で更新することと、
前記デスティネーション・ベクトル・レジスタの前記データ要素の対の前記第2のデータ要素を、前記加算のキャリー出力に対応する値で更新することと
を行う、コンピュータ・プログラム。
【請求項12】
データ処理方法であって、
デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、及びキャリー・ソース・ベクトル・レジスタを指定するベクトル・キャリー付き加算命令をデコードすることであって、少なくとも前記デスティネーション・ベクトル・レジスタ及び前記キャリー・ソース・ベクトル・レジスタは、少なくとも1対のデータ要素を含むオペランドをそれぞれ指定し、それぞれの対は第1のデータ要素及び第2のデータ要素を含む、デコードすることと、
前記ベクトル・キャリー付き加算命令をデコードすることに応じて、前記デスティネーション・ベクトル・レジスタのデータ要素のそれぞれの対について、処理回路を制御することであって、
前記ベクトル・キャリー付き加算命令に関連する情報に応じて、前記第1のデータ・ソース・ベクトル・レジスタのうちのデータ要素と第2のデータ・ソース・ベクトル・レジスタのうちのデータ要素を選択することと、
前記デスティネーション・ベクトル・レジスタの前記データ要素の対の前記第1のデータ要素を、第1のデータ・ソース・ベクトル・レジスタのデータ要素のうちの
前記選択されたデータ要素から取得された第1のソース・データ値と、前記第2のデータ・ソース・ベクトル・レジスタのデータ要素のうちの
前記選択されたデータ要素から取得された第2のソース・データ値と、前記キャリー・ソース・ベクトル・レジスタの対応するデータ要素の対の前記第2のデータ要素から取得されたキャリー値との加算の結果に対応する新しい値で更新することと、
前記デスティネーション・ベクトル・レジスタの前記データ要素の対の前記第2のデータ要素を、前記加算のキャリー出力に対応する値で更新することとを行う、
制御することと
を含む、データ処理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本技法はデータ処理の分野に関する。
【背景技術】
【0002】
いくつかのデータ処理システムは、複数のデータ要素を含むベクトル・オペランドに作用する、又はそのようなベクトル・オペランドを生成するベクトル命令の処理をサポートしている。単一の命令に応答して、複数の別個のデータ要素を処理することをサポートすることにより、コード密度を改善することができ、スカラ命令を使用して同一の操作を実施することに比べて、命令をフェッチ及びデコードするオーバヘッドが削減される。
【先行技術文献】
【非特許文献】
【0003】
【文献】「Some Efficient Architecture Simulation Techniques」、Robert Bedichek、Winter 1990 USENIX Conference、53~63頁
【発明の概要】
【課題を解決するための手段】
【0004】
少なくともいくつかの実例は、装置であって、
データ処理を実施するための処理回路と、
データ処理を実施するための処理回路を制御するために、命令をデコードするための命令デコード回路と、
複数のデータ要素を含むベクトル・オペランドを格納するための複数のベクトル・レジスタとを備え、
命令デコード回路は、デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、及びキャリー・ソース・ベクトル・レジスタを指定するベクトル・キャリー付き加算命令(vector add-with-carry instruction)に応答して、少なくともデスティネーション・ベクトル・レジスタ及びキャリー・ソース・ベクトル・レジスタは、少なくとも1対のデータ要素を含むオペランドをそれぞれ指定し、それぞれの対は第1のデータ要素及び第2のデータ要素を含み、デスティネーション・ベクトル・レジスタのデータ要素のそれぞれの対について、処理回路を制御して、
デスティネーション・ベクトル・レジスタのデータ要素の対の第1のデータ要素を、第1のデータ・ソース・ベクトル・レジスタの選択されたデータ要素から取得された第1のソース・データ値と、第2のデータ・ソース・ベクトル・レジスタの選択されたデータ要素から取得された第2のソース・データ値と、キャリー・ソース・ベクトル・レジスタの対応するデータ要素の対の第2のデータ要素から取得されたキャリー値との加算の結果に対応する値で更新することと、
デスティネーション・ベクトル・レジスタのデータ要素の対の第2のデータ要素を、前記加算のキャリー出力に対応する値で更新することとを行う、装置を提供する。
【0005】
少なくともいくつかの実例は、ターゲット・プログラム・コードの命令を実行するための命令実行環境を提供するためにホスト処理装置を制御するためのコンピュータであって、コンピュータ・プログラムは、
データ処理を実施するための処理プログラム・ロジックを制御するために、ターゲット・プログラム・コードの命令をデコードするための命令デコード・プログラム・ロジックと、
複数のデータ要素を含むベクトル・オペランドを格納するための複数のベクトル・レジスタを表現するデータを記憶するためのベクトル・レジスタ・データ構造とを含み、
命令デコード・プログラム・ロジックは、デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、及びキャリー・ソース・ベクトル・レジスタを指定するベクトル・キャリー付き加算命令に応答して、少なくともデスティネーション・ベクトル・レジスタ及びキャリー・ソース・ベクトル・レジスタは、少なくとも1対のデータ要素を含むオペランドをそれぞれ指定し、それぞれの対は第1のデータ要素及び第2のデータ要素を含み、デスティネーション・ベクトル・レジスタのデータ要素のそれぞれの対について、ベクトル・レジスタ・データ構造を更新するために処理プログラム・ロジックを制御して、
デスティネーション・ベクトル・レジスタのデータ要素の対の第1のデータ要素を、第1のデータ・ソース・ベクトル・レジスタの選択されたデータ要素から取得された第1のソース・データ値と、第2のデータ・ソース・ベクトル・レジスタの選択されたデータ要素から取得された第2のソース・データ値と、キャリー・ソース・ベクトル・レジスタの対応するデータ要素の対の第2のデータ要素から取得されたキャリー値との加算の結果に対応する値で更新することと、
デスティネーション・ベクトル・レジスタのデータ要素の対の第2のデータ要素を、前記加算のキャリー出力に対応する値で更新することとを行う、コンピュータを提供する。
【0006】
少なくともいくつかの実例は、データ処理方法であって、
デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、及びキャリー・ソース・ベクトル・レジスタを指定するベクトル・キャリー付き加算命令をデコードすることであって、少なくともデスティネーション・ベクトル・レジスタ及びキャリー・ソース・ベクトル・レジスタは、少なくとも1対のデータ要素を含むオペランドをそれぞれ指定し、それぞれの対は第1のデータ要素及び第2のデータ要素を含む、デコードすることと、
ベクトル・キャリー付き加算命令をデコードすることに応じて、デスティネーション・ベクトル・レジスタのデータ要素のそれぞれの対について、処理回路を制御することであって、
デスティネーション・ベクトル・レジスタのデータ要素の対の第1のデータ要素を、第1のデータ・ソース・ベクトルの選択されたデータ要素から取得された第1のソース・データ値と、第2のデータ・ソース・ベクトル・レジスタの選択されたデータ要素から取得された第2のソース・データ値と、キャリー・ソース・ベクトル・レジスタの対応するデータ要素の対の第2のデータ要素から取得されたキャリー値との加算の結果に対応する新しい値で更新することと、
デスティネーション・ベクトル・レジスタのデータ要素の対の第2のデータ要素を、前記加算のキャリー出力に対応する値で更新することとを行う、制御すること、を含む、データ処理方法を提供する。
【0007】
少なくともいくつかの実例は、装置であって、
データ処理を実施するための処理回路と、
データ処理を実施するための処理回路を制御するために、命令をデコードするための命令デコード回路と、
複数のデータ要素を含むベクトル・オペランドを格納するための複数のベクトル・レジスタと、
処理回路によって実施される演算のマスキングを制御するためのプレディケート値を格納するための複数のプレディケート・フィールドを含む複数のプレディケート・レジスタとを備え、
命令デコード回路は、デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、入力プレディケート・レジスタ、及び出力プレディケート・レジスタを指定するベクトル・キャリー付き加算命令に応答して、デスティネーション・ベクトル・レジスタの所与のデータ要素について、処理回路を制御して、
デスティネーション・ベクトル・レジスタの所与のデータ要素を、第1のデータ・ソース・ベクトル・レジスタの対応するデータ要素から取得された第1のソース・データ値と、第2のデータ・ソース・ベクトル・レジスタの対応するデータ要素から取得された第2のソース・データ値と、入力プレディケート・レジスタの対応するプレディケート・フィールドから取得されたキャリー値との加算の結果に対応する値で更新することと、
出力プレディケート・レジスタの対応するプレディケート・フィールドを、前記加算のキャリー出力に対応する値で更新することとを行う、装置を提供する。
【0008】
少なくともいくつかの実例は、ターゲット・プログラム・コードの命令を実行するための命令実行環境を提供するためにホスト処理装置を制御するためのコンピュータ・プログラムであって、コンピュータ・プログラムは、
データ処理を実施するための処理プログラム・ロジックを制御するために、ターゲット・プログラム・コードの命令をデコードするための命令デコード・プログラム・ロジックと、
複数のデータ要素を含むベクトル・オペランドを格納するための複数のベクトル・レジスタを表現するデータを記憶するためのレジスタ・データ構造と、処理プログラム・ロジックによって実施されるベクトル演算のマスキングを制御するためのプレディケート値を格納するための複数のプレディケート・レジスタとを含み、
命令デコード・プログラム・ロジックは、デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、入力プレディケート・レジスタ、及び出力プレディケート・レジスタを指定するベクトル・キャリー付き加算命令に応答して、デスティネーション・ベクトル・レジスタの所与のデータ要素について、レジスタ・データ構造を更新するために、処理回路を制御して、
デスティネーション・ベクトル・レジスタの所与のデータ要素を、第1のデータ・ソース・ベクトル・レジスタの対応するデータ要素から取得された第1のソース・データ値と、第2のデータ・ソース・ベクトル・レジスタの対応するデータ要素から取得された第2のソース・データ値と、入力プレディケート・レジスタの対応するプレディケート・フィールドから取得されたキャリー値との結果に対応する値で更新することと、
出力プレディケート・レジスタの対応するプレディケート・フィールドを、前記加算のキャリー出力に対応する値で更新することとを行う、コンピュータ・プログラムを提供する。
【0009】
少なくともいくつかの実例は、データ処理方法であって、
デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、入力プレディケート・レジスタ、及び出力プレディケート・レジスタを指定するベクトル・キャリー付き加算命令をデコードすることであって、入力プレディケート・レジスタ及び出力プレディケート・レジスタは、ベクトル演算のマスキングを制御するためのプレディケート値を格納するための複数のプレディケート・レジスタの中から選択される、デコードすることと、
ベクトル・キャリー付き加算命令をデコードすることに応じて、デスティネーション・ベクトル・レジスタの所与のデータ要素について、処理回路を制御することであって、
デスティネーション・ベクトル・レジスタの所与のデータ要素を、第1のデータ・ソース・ベクトル・レジスタの対応するデータ要素から取得された第1のソース・データ値と、第2のデータ・ソース・ベクトル・レジスタの対応するデータ要素から取得された第2のソース・データ値と、入力プレディケート・レジスタの対応するプレディケート・フィールドから取得されたキャリー値との加算の結果に対応する値で更新することと、
出力プレディケート・レジスタの対応するプレディケート・フィールドを、前記加算のキャリー出力に対応する値で更新することとを行う、制御すること、を含む、データ処理方法を提供する。
【0010】
本技法のさらなる態様、特徴及び利点は、添付の図面と併せて読まれる実例の以下の説明から明らかとなる。
【図面の簡単な説明】
【0011】
【
図1】ベクトル命令の実行をサポートするデータ処理装置の実例の概略図である。
【
図2】プレディケーションを伴うベクトル演算の実例の図である。
【
図3】第1の実例による、ベクトル・キャリー付き加算命令の加算の変形例の図である。
【
図4】第1の実例による、ベクトル・キャリー付き加算命令の減算の変形例の図である。
【
図4A】ベクトル・キャリー付き加算命令のプレディケートされた変形例の図である。
【
図5】ベクトル・キャリー付き加算命令を処理する方法を示す流れ図である。
【
図6】Karatsubaアルゴリズムによる、長整数値の乗算のベクトル化の実例の図である。
【
図7】64ビットのベクトル要素サイズを使用して2つの256ビット値の乗算を実施する場合に、加算される部分積の実例の図である。
【
図8】
図3で示されたベクトル・キャリー付き加算命令を含む、実例の命令のシーケンスの図である。
【
図9】ベクトル・キャリー付き加算命令を使用する、命令シーケンスの第2の実例の図である。
【
図10A】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図10B】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図10C】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図10D】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図10E】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図10F】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図10G】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図10H】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図10I】
図9の命令シーケンスの処理を図示する、一連の図である。
【
図11】加算又は減算用にキャリー値を移送するためにプレディケート・レジスタを使用する、ベクトル・キャリー付き加算命令の第2の実例の図である。
【
図12】
図11の実例による、ベクトル・キャリー付き加算命令の処理を図示する流れ図である。
【
図13】使用され得るシミュレータ実例の図である。
【発明を実施するための形態】
【0012】
いくつかの処理ワークロードは、1024ビット、2048ビット、又は4096ビット値などの非常に大きな整数値に数学的演算を適用する必要がある場合がある。例えば、暗号化ワークロードは、大きな数を因数分解する困難さに依拠することがあり、そのためメッセージを暗号化又は復号化するためにそのような大きな数の乗算を必要とすることがある。例えば、RSA2048では、4096ビットの積を作り出すために2048ビットの数の連続的な乗算が多数ある。一部の金融処理アプリケーションでは、長整数値を処理することがさらに要求される。あるオペランドのそれぞれの桁を他方のそれぞれの桁で乗ずる標準の教科書的な手法を使用して乗算する場合、乗算を実施することの複雑性は、典型的には桁数の2乗に比例する。しかしながら、計算のオーバヘッドが桁数に緩やかに比例するよう、複雑性を低減するためのいくつかのアルゴリズムが知られている。例えば、Karatsubaアルゴリズムは、乗算する長桁数を個々に乗算される小さな部分に分け、要求される乗算の回数と、いくつかの追加的な加算、減算、又はシフト演算とのトレードオフを可能にしている。したがって、長整数の乗算は、いくつかの小さな乗算と、いくつかの加算、減算、及びシフトとに分解することができる。ベクトル命令を使用して、単一の命令がいくつかの独立的なサブ乗算の部分の計算を制御できるように異なるサブ乗算を異なるベクトル・レーンにマッピングすることにより、そのような計算をスピード・アップすることができる。この場合、ワークロードのほとんどは、乗算の様々な部分積の、一連の加算、又は減算を実施する際に、効果的に発生することがある。しかしながら、この時、部分積の加算同士でキャリー情報の移送を管理することにおいて、ある加算から得られるキャリー情報は、等価な有意性(equivalent significance)の値に対して実施される次の加算に入力される必要がある場合があるため、ある命令からのキャリー情報を別の命令のための入力として使用するために保持する必要性があり得ることから、設計上の課題が生じる。
【0013】
ある手法は、それぞれのベクトル・レーンで処理される実データの要素サイズを効果的に低減することができ、そのレーンの加算から得られたキャリー情報を格納するために、それぞれのレーンの上部で1つ又は複数のビットを予約し、それによって後続の命令によって読み出すことができる。しかしながら、発明者らは、この手法では、データの入力ベクトルをアンパックするため(ベクトル・レーンを完全に占有する要素を有する)、及びそれぞれのレーン内にさらなるキャリー情報を含める必要があるため、これらの構成要素をリサイズして有効なデータ要素のサイズを小さくし、ベクトル・レーンをまたいで分割するため、多くのさらなる命令が必要とされる可能性があることを認識した。また、入力データが所与の要素サイズの複数の要素を含む場合、キャリー用に予約される空間を設けてレーンをまたいで分割されると、同一の量の入力データが、より多くのベクトル・レーン数を要求することになる。例えば、実データ用に56ビット、キャリー用に予約される8ビットを有するベクトル・レーンをまたいで広がりがある場合、56ビットの4レーンは、それぞれ224ビットしか与えないため、最後の32ビットのために第5のレーンが必要となり、4つの64ビット要素の入力ベクトルは、この場合同じビット数(256ビット)の入力データを収容するために5レーンが割り当てられることを必要とする。計算される部分積の数は、ベクトルの構成要素数の2乗に比例するため、これは必要とされる乗算及び部分積加算の回数を著しく増やすことになり、パフォーマンスをさらに低下させる可能性がある。
【0014】
以下で議論する技法は、入力データをアンパックする必要がないように、ベクトル・キャリー付き加算命令を実装するための技法を提供するが、そのような命令はベクトル・レーン全体を占有するソース・データ要素を直接演算することができるからである。
【0015】
ある手法では、ベクトル・キャリー付き加算命令はデスティネーション・ベクトル・レジスタ、第1及び第2のデータ・ソース・ベクトル・レジスタ、並びにキャリー・ソース・ベクトル・レジスタを指定する。少なくともデスティネーション・ベクトル・レジスタ及びキャリー・ソース・ベクトル・レジスタは、少なくとも1対のデータ要素を含むオペランドをそれぞれ指定し、それぞれの対は第1のデータ要素及び第2のデータ要素を含む。命令に応答して、命令デコーダは、デスティネーション・ベクトル・レジスタのデータ要素のそれぞれの対について、処理回路を制御して、デスティネーション・ベクトル・レジスタのデータ要素の対の第1のデータ要素を、第1のデータ・ソース・ベクトル・レジスタの選択されたデータ要素から取得された第1のソース・データ値と、第2のデータ・ソース・ベクトル・レジスタの選択されたデータ要素から取得された第2のソース・データ値と、キャリー・ソース・ベクトル・レジスタの対応するデータ要素の対の第2のデータ要素から取得されたキャリー値との加算の結果に対応する値で更新する。また、デスティネーション・ベクトル・レジスタのデータ要素の対の第2のデータ要素は、加算のキャリー出力に対応する値で更新される。
【0016】
したがって、デスティネーション・ベクトル・レジスタ内のそれぞれの要素の対の第2のデータ要素は、加算のキャリー出力を与えるために予約され、同様にキャリー・ソース・ベクトル・レジスタ内のそれぞれの対の第2のデータ要素は、加算にキャリー入力を与えるために使用される。したがって、デスティネーション、及びキャリー・ソース・ベクトル・レジスタは、対応するレイアウトを有しており、実際にはしばしば、これらの命令が実際に使用される場合、ベクトル・キャリー付き加算命令の1つのインスタンスから得られるデスティネーション・ベクトル・レジスタは、ベクトル・キャリー付き加算命令の後続のインスタンスのためのキャリー・ソース・ベクトル・レジスタとして使用される場合がある。
【0017】
この手法は、ソース・データ及び加算の結果値をキャリーするために利用可能なデータ要素の数を事実上半分にするため、直観に反しており、ベクトル・レジスタ・ファイルの利用を可能な限り増やすことにより計算の効率を改善することを目的とするベクトル・プロセッサにおける通常の設計原理に反している。すなわち、キャリー値を与えるためにベクトル・レーンの半分を使用することは、ベクトル・プロセッサ及びベクトル・レジスタ・ファイルの能力の半分を無駄にし、所与の数のデータ要素を処理するために必要な命令の数を倍にすることになるように思われる。
【0018】
しかしながら、驚くべきことだが、発明者らは、さらなるキャリー付き加算命令が所与のワークロードを実行するために必要とされる場合があるが、それぞれの要素の対の第2のデータ要素内でキャリーを配置する恩恵は、第1のデータ要素は全レーン・サイズを占有することができ、それは入力ベクトルからの要素のアンパック又はリサイズが要求されないことを意味しており、そのためベクトル・キャリー付き加算命令がパックされたソース・データに直接作用できることであると認識した。実際には、長整数の乗算を伴うワークロードについて、ベクトル・キャリー付き加算命令によって処理される要素の事実上低減された数を補償するためにさらなる命令が必要とされるとしても、(a)アンパック/リサイズのオーバヘッドを回避すること、(b)上で議論したイン・レーンのキャリー手法で有効なレーン・サイズの低減によって起こる部分積の数の増加を回避すること、により、全体的なパフォーマンスはなお高いことが分かっている。したがって、全体としてのパフォーマンスは改善され得る。あらゆる場合において、一部のマイクロ・アーキテクチャでは、単一のベクトル・キャリー付き加算命令がアーキテクチャ・レベルで要素の半分に対する演算を行うとしても、組み合わせてすべての要素に対して演算を行う命令の2つのインスタンスは、共に「融合(fused)」して処理パイプラインによって単一のマイクロ演算として処理することができるか、又は並列に処理することができ、マクロ命令当たりに処理される要素数を半分にすることによる、明らかなパフォーマンス損失を回避する。これは、例えば、マイクロ・アーキテクチャが、結果バスに複数の同時的な書き込みをサポートしている場合に可能である。独立的なキャリー・チェーンの形態では、並列化が、やはり利用可能である。
【0019】
いくつかの実装形態では、デスティネーション・ベクトル・レジスタは、第1及び第2のソース・ベクトル・レジスタ、並びにキャリー・ソース・ベクトル・レジスタとは別個に、命令によって指定することができ、結果がソース・レジスタのすべてとは異なるレジスタに書き込まれるため、命令が実行された後レジスタ・ファイル内にすべてのソース・ベクトルを保持する非破壊的な命令フォーマットを与える。
【0020】
しかしながら、他の実装形態では、第1のデータ・ソース・ベクトル・レジスタは、デスティネーション・ベクトル・レジスタと同一のレジスタであってもよく、それぞれの対について、第1のソース・データ値はデスティネーション・ベクトル・レジスタのデータ要素の対の第1のデータ要素の以前の値を含むことができる。実際には、古い累算器の値が第2のソース・データ値及びキャリー値に加算されて同一のレジスタに書き戻される累算演算は、長整数の乗算(乗算の個々の部分積を加算することについて)を伴う多くのワークロードについて有用であり、そのため第1のデータ・ソース・ベクトル・レジスタがデスティネーション・ベクトル・レジスタと独立して指定されることは必須ではない。単一のレジスタを、デスティネーション及び第1のデータ・ソース・ベクトル・レジスタの両方として指定することによって、命令セット・アーキテクチャ内の命令エンコード空間を他の目的のために保存しておくことができる。破壊的な命令フォーマット(同一のレジスタを、デスティネーション及びソース・レジスタのうちの1つ、の両方として使用する)の別の利点は、命令が要求するソース・レジスタ・ポートの数を限定することが時に必要とされることがあるため、また一部のマイクロ・アーキテクチャではデスティネーション・レジスタはプレディケーションをマージすることを伴う演算(デスティネーション・レジスタのプレディケートされたレーンはその以前の値を保持する)の場合では既に読み出される必要がある可能性があるため、2つのさらなるレジスタ・アクセス(第2のソース・ベクトル・レジスタ及びキャリー・ベクトル・レジスタについて)のみを有することが有益な場合があることである。
【0021】
ベクトル要素サイズ、及び/又はベクトル・オペランドの合計長は、変わってもよい。いくつかの実装形態は、要素サイズ及び/又はベクトル長を、特定の一定値に固定することができる。しかしながら、他のシステムは、可変のベクトル要素サイズ及びベクトル長をサポートする可能性がある。いくつかのベクトル要素サイズ、又はベクトル長について、ベクトルは、2つの要素のみを含む場合があり、この場合、デスティネーション・ベクトル・レジスタ及びキャリー・ソース・ベクトル・レジスタは、単一のデータ要素の対、すなわち1つの第1のデータ要素、及び1つの第2のデータ要素を含むことができる。
【0022】
しかしながら、命令デコード回路及び処理回路が、デスティネーション及びキャリー・ソース・ベクトル・レジスタが複数のデータ要素の対を含む、すなわち少なくとも4つの要素を含む(第1及び第2のデータ要素のそれぞれの2つ以上)、ベクトル・キャリー付き加算命令の少なくとも1つのインスタンスの実行をサポートすることが有用である場合がある。これは、システムが単一の命令に応答して複数の加算の計算をサポートすることを可能性にしており、長整数のオペランドの乗算を伴う計算を加速するために有用であり得る。例えば、それぞれの要素の対は、Karatsubaアルゴリズムの様々なサブ乗算についての部分積の加算を表すことができる。
【0023】
データ要素の対の、ベクトル・オペランドの要素へのマッピングは、様々な方法で行うことができる。例えば、一実例では、それぞれの対の第1の要素をレジスタの一方の半分に、それぞれの対の第2の要素はもう一方の半分に配置することができる。例えば、第1及び第2の要素の4対の実例では、これらは順に2d、2c、2b、2a、1d、1c、1b、1aと並べることができる(ここで、1aは第2の要素2aに対応する第1の要素であり、対b、c、及びdについても同様である)。
【0024】
しかしながら、一実装形態において、それぞれのデータ要素の対は、隣接するデータ要素の対を含むことができる。したがって、デスティネーション・ベクトル・レジスタ及びキャリー・ソース・ベクトル・レジスタ内のデータ要素の対の数は、少なくとも2であり、対の第1のデータ要素は、対の第2のデータ要素でインターリーブされる。例えば、第1及び第2の要素の4対では、これらは順に2d、1d、2c、1c、2b、1b、2a、1a(代替的に、それぞれの対で第1及び第2の要素の順を転置することができる)と並べることができる。この手法は、ベクトル命令の所与のサブ計算内で組み合わされるソース・オペランド及び結果値を、2つ以上のベクトル・レーンにまたがる長いクロス・レーン信号経路を要求するのではなく、同一のベクトル・レーン内にあるように、又はすぐ隣のベクトル・レーンにクロスするだけであるように、のいずれかに制限することができることから、ハードウェア設計をより効率的にすることができるため、ハードウェアで実装するためにより効率的であり得る。したがって、必要とされるワイヤリングの複雑性と長さは、それぞれの対の第1及び第2のデータ要素をインターリーブすることによって低減することができる。
【0025】
キャリー値は、キャリー・ソース・ベクトル・レジスタの対応するデータ要素の対の、第2のデータ要素の最下位ビットから取得することができる。ベクトル・キャリー付き加算命令に応答して、処理回路は、デスティネーション・ベクトル・レジスタのデータ要素の対の第2のデータ要素の最下位ビットを、加算のキャリー出力に対応する値で更新することができる。キャリーを与えるための第2のデータ要素の最下位ビットを使用することは、対応する対の第1のデータ要素の最上位ビットに隣接することができるため、キャリー及びデータの値をデスティネーション・ベクトル・レジスタの隣接部分に書き込むことを可能にしており、より効率的であり得る。最下位ビット以外の第2のデータ要素の残りのビットは、キャリー・ソース・ベクトル・レジスタ、及び累算器ベクトル・レジスタ内で、使用されなくてもよい。多くのビットを未使用のままにしておくことは、ベクトル・レジスタ・ファイルの空間を無駄にし、またベクトル処理ユニット内で処理リソースを無駄にしているように思われる可能性があるが、上で議論したように、長整数の乗算を実施する際の全体的なパフォーマンスはこの手法により改善することができる。
【0026】
キャリー付き加算命令によって処理されるベクトルは、それぞれ2Nビットを有するデータ要素を有することができ、第2のソース・データ値はやはり2Nビットを含むことができ、ここでNは整数である。したがって、第2のソース・データ値は、ベクトル・レーン自身と同一のサイズを有しているため、ビット数の2の累乗に正確に対応し、第2のソース・データ値はベクトル・レーン全体を占有しており、そのためベクトル・キャリー付き加算命令を入力に対して演算できるようにするために、入力ベクトル又は先のベクトル命令の結果からのデータ要素のリサイズ又はアンパックが必要とされない。代わりに、ベクトル・キャリー付き加算命令は、入力ベクトルから選択された要素に対して直接演算を行うことができる。これは、キャリーがデータ結果とは別個のベクトル要素に保持されているために可能である。
【0027】
第2のソース・データ値は、第2のデータ・ソース・ベクトル・レジスタのあらゆる要素から取得することができる。命令の様々な変形例が、第2のデータ・ソース・ベクトル・レジスタの様々な要素からソース・データ値を選択するために与えられ得る。
【0028】
一実例において、第2のデータ・ソース・ベクトル・レジスタは、デスティネーション及びキャリー・ソース・ベクトル・レジスタでの要素の対に対応するやり方で並べることができる、少なくとも1対のデータ要素を含むオペランドを与える。例えば、それぞれの対の第1及び第2のデータ要素は、インターリーブすることができる。ベクトル・キャリー付き加算命令の第1及び第2の変形例が、提供され得る。第1の変形例について、第2のソース・データ値は、第2のデータ・ソース・ベクトル・レジスタの対応するデータ要素の対の第1のデータ要素を含むことができる(また、命令の結果は、それぞれの対の第2の要素とは独立的であってもよい)。第2の変形例について、第2のソース・データ値は、対応する対の第2のデータ要素を含むことができる(また、命令の結果は、それぞれの対の第1の要素とは独立的であってもよい)。第2のソース・データ値として異なる要素を選択するために命令の2つの変形例を提供することにより、組み合わせた命令の2つの変形例は、第2のソース・ベクトルのそれぞれの要素を処理することができるため、これは2つのベクトル・キャリー付き加算命令(第1/第2の変形例のそれぞれのうちの1つ)の実行に先立って、第2のソース・ベクトルの要素のあらゆる追加的な並べ直し又はアンパックを実施する必要なく、入力ベクトルのすべての要素を処理できるようにしている。
【0029】
第1のデータ・ソース・ベクトル・レジスタが、デスティネーション・ベクトル・レジスタとは別個に命令によって指定される実施例において、第1のソース・データ値は、それぞれの対の第1の要素(命令の第1の変形例について)、又はそれぞれの対の第2の要素(命令の第2の変形例について)いずれかから同様に抽出することができる。
【0030】
一方で、第1のデータ・ソース・ベクトル・レジスタが、デスティネーション・ベクトル・レジスタと同一のレジスタである場合、デスティネーション・ベクトル・レジスタの第2のデータ要素がキャリー情報を表すために使用されるため、それぞれの加算について、第1のデータ・ソース値は、デスティネーション・ベクトル・レジスタの対応する要素の対の第1のデータ要素から抽出することができる(実行される命令の変形例が、第1の変形例か第2の変形例かに関わらず)。
【0031】
また、少なくとも1つのプレディケート指標を指定するプレディケート値に関連付けられる、キャリー付き加算命令のプレディケートされた変形例が提供され得、それぞれのプレディケート指標は、デスティネーション・ベクトル・レジスタの前記少なくとも1対のデータ要素のうちの1つに対応している。プレディケートされた変形例に応答して、命令デコード回路は、処理回路を制御して、対応するプレディケート指標が第1の値を有するデスティネーション・ベクトル・レジスタのデータ要素の対について、上で議論したように第1/第2のデータ要素の更新を実施し、対応するプレディケート指標が第2の値を有するデータ要素の対についての更新を抑制することができる。プレディケート値は、プレディケート値を格納しているプレディケート・レジスタを識別するプレディケート・レジスタ指定子を含む命令エンコーディングによって、命令に関連付けられる場合があり、又はデフォルトのプレディケート・レジスタは、命令のエンコードに関わらずキャリー付き加算命令のプレディケート変形例のすべてのインスタンスについてのプレディケート値を与えるために使用することができる。対応するプレディケート指標が第2の値を有するデスティネーション・ベクトル・レジスタの要素の対について、要素の対は、デスティネーション・ベクトル・レジスタのその部分に格納される以前の値を保持することができるか、又はゼロ若しくは別の所定の値へとクリアすることができる。したがって、キャリー付き加算命令がプレディケートされる場合、ベクトルの個々のデータ要素の粒度で機能するのではなく、プレディケーションはデータ要素の対の粒度で機能することができる。
【0032】
ベクトル・キャリー付き加算命令の加算及び減算の変形例が、提供され得る。加算の変形例について、加算は第1及び第2のソース・データ値、並びにキャリー・ソース・ベクトル・レジスタの第2のデータ要素から取得されたキャリー値を加算することを含む。減算の変形例について、演算は第1のソース・データ値から第2のソース・データ値を減算することを含み、キャリー値は減算についてのボロー値を示す。減算の変形例について、キャリー出力は減算のボロー出力を表している。2つのオペランドの減算は、オペランドのうちの1つが加算を実施する前に2の補数となされたものである2つのオペランドの加算と同一であることから、減算はやはり加算として見なされ得ることに留意されたい。同様に、ボロー値は加算についての+1のキャリーの代わりに、-1のキャリーに単純に相当するため、減算についてのボロー値は加算用のキャリー値と見なすことができる。
【0033】
ベクトル・キャリー付き加算命令の複数の変形例が与えられる場合、変形例(第1/第2、又は加算/減算)は様々な方法で区別することができる。例えば、キャリー付き加算命令の様々な変形例は、様々な命令オペコードを有することができる。代替的に、変形例は共通のオペコードを共有することができるが、変形例を区別する命令のエンコードにおいて別のフィールドを有することができる。別の実例では、異なる命令の変形例は同一の命令エンコードを有することができるが、後続のベクトル・キャリー付き加算命令に遭遇する際、命令のどの変形例を使用するべきかを選択するために、先行する命令によって設定され得る装置の制御レジスタに格納されるモード・パラメータによって区別することができる。第1/第2の変形例について、第1/第2の要素の選択は、命令によって読み出されるプレディケート又はマスク・レジスタで、やはり表現することができる。
【0034】
加算/減算用のキャリー情報を移送するためにキャリー・ソース・ベクトル・レジスタ及びデスティネーション・ベクトル・レジスタのいくつかの要素を使用する、上で議論したベクトル・キャリー付き加算命令の形態の利点は、これは命令に応答して書き込まれる必要があるレジスタ(デスティネーション・ベクトル・レジスタ)が1つだけであるためマイクロ・アーキテクチャで実装することが比較的効率的である可能性があることである。やはり、累算器レジスタが、デスティネーション及び第1のソース・ベクトル・レジスタの両方として指定される実例では、1つだけのデスティネーション・レジスタ指定子、及び2つのベクトル・ソース・レジスタが、命令によって指定される必要がある。
【0035】
しかしながら、大きい整数値の計算を実装するための課題に対する代替的な解決策としては、キャリー情報を伝達するためにプレディケート・レジスタを使用するベクトル・キャリー付き加算命令を提供することを挙げることができる。データ処理装置は、処理回路によって実施される演算のマスクを制御するためのプレディケート値を格納するためのプレディケート・フィールドを含む複数のプレディケート・レジスタを有することができる。他のタイプのベクトル命令について、プレディケート・フィールドは、ベクトル処理のレーンのマスクを制御することができる一方、ベクトル・キャリー付き加算命令については、加算からのキャリー出力を表すためにプレディケート・レジスタを再使用することができ、加算へのキャリー入力を、やはりプレディケート・レジスタのプレディケート・フィールドから取得することができる。
【0036】
したがって、命令デコード回路は、デスティネーション・ベクトル・レジスタ、第1のデータ・ソース・ベクトル・レジスタ、第2のデータ・ソース・ベクトル・レジスタ、入力プレディケート・レジスタ、及び出力プレディケート・レジスタ、を指定するベクトル・キャリー付き加算命令に応答することができ、デスティネーション・ベクトル・レジスタの所与のデータ要素について、処理回路を制御して、デスティネーション・ベクトル・レジスタの所与のデータ要素を、第1のデータ・ソース・ベクトル・レジスタの対応するデータ要素から取得された第1のソース・データ値と、第2のデータ・ソース・ベクトル・レジスタの対応するデータ要素から取得された第2のソース・データ値と、入力プレディケート・レジスタの対応するプレディケート・フィールドから取得されたキャリー値との加算の結果に対応する値で更新する。また、出力プレディケート・レジスタの対応するプレディケート・フィールドは、前記加算のキャリー出力に対応する値で更新することができる。
【0037】
この手法はさらに複雑なマイクロ・アーキテクチャ(例えば、プレディケート・レジスタ・ファイルへの速い読み出し/書き込み経路、並びに同一の命令に応答してベクトル・レジスタ・ファイル及びプレディケート・レジスタ・ファイルの両方へ書き込む機能)を要求することがある一方で、この手法の利点は、キャリーがデスティネーション・ベクトル・レジスタの要素に格納されないため、デスティネーション・ベクトル・レジスタのすべての要素を加算結果値を格納するために使用することができ(また、第1/第2のデータ・ソース・ベクトル・レジスタのすべての要素をソース入力として使用することができる)、単一の命令に応答して実施することができる演算の数を効果的に倍増させており、ひいてはパフォーマンスを改善することである。
【0038】
要約すると、上で議論した実例の両方は、演算のアンパック又はリサイズをせずに入力ベクトルからの完全なデータ要素に直接演算を行うことができるという利点を有しており、その理由は、キャリー情報がデータ結果と同一のレーンには格納されておらず、ベクトル・レジスタの別のレーン、又はプレディケート・レジスタの対応するプレディケート・フィールド内のいずれかに格納されるからである。これは、長整数の乗算を加速させるために非常に有用である。
【0039】
上で議論した命令の形態の両方は、ベクトル・キャリー付き加算命令に応答して要求される演算を実施するよう処理回路を制御する命令デコーダを使用してハードウェアに実装することができる。例えば、命令デコーダは、ベクトル・キャリー付き加算命令のエンコードを解釈し、上で議論したような入力に基づいて結果レジスタを更新するよう処理回路を制御するために適当な制御信号経路を選択的にアクティベートするための論理ゲートを備えることができる。
【0040】
しかしながら、技法は物理的なハードウェアではなく、プロセッサ・アーキテクチャのシミュレーションとして、さらに実装することができる。ひいては、シミュレータ・コンピュータ・プログラムが、ホスト処理装置(それ自身は上で議論した命令をサポートしていなくてもよい)を制御するために設けられる場合があり、ターゲット・プログラム・コードの命令をサポートするターゲット処理装置でこれらの実行をシミュレートするように、ターゲット・プログラム・コードの命令を実行するための命令実行環境を提供する。命令デコーダ及び処理回路の機能は、代わりにシミュレータ・プログラムにおいて命令デコード・プログラム・ロジック及び処理プログラム・ロジックによって実施することができ、また、レジスタはシミュレートされるターゲット処理装置のレジスタを表現するデータを記憶するメモリ内でシミュレートされるレジスタ・データ構造として実装することができる。コンピュータ・プログラムは記憶媒体に記憶することができる。記憶媒体は非一時的な記憶媒体であってもよい。
【0041】
図1は、命令デコーダ6によってデコードされる命令に応じてデータ処理演算を実施するための処理回路4を有するデータ処理装置2の実例を概略的に図示している。プログラム命令は、1つ又は複数のキャッシュ及びメモリを含むことができるメモリ・システム8からフェッチされる。命令は命令デコーダ6によってデコードされ、命令セット・アーキテクチャによって定義される対応する演算を実施するために命令を処理するよう処理回路4を制御する制御信号を生成する。例えば、デコーダ6は、オペコードを解釈するための論理ゲート、及びあらゆる追加的な命令の制御フィールドを含むことができ、算術演算、論理演算又はロード/ストア演算などの演算を実施させるために、処理回路4に適切なハードウェア・ユニットをアクティベートさせるための制御信号を生成する。レジスタ10は、命令に応答して処理回路4によって処理されるデータ値、及び処理回路の動作を構成するための制御情報を格納する。算術又は論理命令に応じて、処理回路4はレジスタ10からオペランドを読み出し、命令の結果をレジスタ10に書き戻す。ロード/ストア命令に応じて、データ値は処理ロジック4を介してレジスタ10とメモリ・システム8との間を転送される。
【0042】
レジスタ10は単一のデータ要素を含むスカラ値を格納するための複数のスカラ・レジスタを備えるスカラ・レジスタ・ファイル12を含む。スカラ・レジスタは、整数オペランドを格納するための整数レジスタ、及び浮動小数点値を格納するための浮動小数点レジスタを含むことができる。代替的に、整数及び浮動小数点値は、同一のレジスタのセットに格納することができる。命令セット・アーキテクチャ内の命令デコーダ6によってサポートされるいくつかの命令は、処理回路4がスカラ・レジスタ12から読み出されたスカラ・オペランドを処理し、スカラ・レジスタ12に書き戻されるスカラ結果を生成するように制御する、スカラ命令である。
【0043】
レジスタは、ベクトル・レジスタ・ファイル14、及びプレディケート・レジスタ・ファイル16をさらに含む。ベクトル・レジスタ・ファイル14は、複数のデータ要素を含むベクトル・オペランドの記憶をサポートするいくつかのベクトル・レジスタを含む。命令デコーダ6はベクトル命令をサポートしており、ベクトル命令は処理回路4を制御してベクトル・レジスタから読み出されたベクトル・オペランドの各要素に対してベクトル処理のいくつかのレーンを実施し、スカラ・レジスタ12に書き込まれるスカラ結果又はベクトル・レジスタ14に書き込まれるさらなるベクトル結果のいずれかを生成する。いくつかのベクトル命令は、1つ又は複数のスカラ・オペランドからベクトル結果をさらに生成することができ、或いはスカラ・レジスタ・ファイル内のスカラ・オペランドに対してさらなるスカラ演算を、同様にベクトル・レジスタ・ファイルから読み出されたオペランドに対してベクトル処理を、実施することができる。ひいては、いくつかの命令はスカラ-ベクトル混合命令であることが可能である。処理回路内で算術又は論理演算をトリガする、ベクトル算術又は論理命令と同様に、デコーダ6は、ベクトル・レジスタ14とメモリ・システム8との間でデータを転送することができるベクトルのロード/ストア命令をさらにサポートすることができる。
【0044】
図2は、プレディケート・レジスタ16のうちの1つにおいて、プレディケート情報によって制御されるベクトル演算の実例を示している。この実例において、ベクトル命令はベクトルの加算命令であり、処理回路4を制御していくつかの独立した加算命令を実施しており、2つの入力ベクトルZm、Znの対応するデータ要素の対をそれぞれ加算し、加算の結果をデスティネーション・ベクトルZdの対応する要素に書き込んでいる。もちろん、加算だけではなく、それぞれのベクトル・レーンで実施される中心となる演算として他の算術又は論理演算を適用することもできる。プレディケート・レジスタPのそれぞれのプレディケート・フィールドは、デスティネーション・レジスタの対応する要素が加算の結果で更新されるかどうかを制御する。例えば、この実例において、ベクトル・レーン1、2及び5はマスクされており(これらのレーンの対応するプレディケート・フィールドが0であるため)、そのためデスティネーション・レジスタZdの対応する要素は加算の結果にセットされていない。マスクされたレーンは、例えばその以前の値を保持することができる。代替的に、プレディケーションをクリアする/ゼロ化する形態は、デスティネーション・レジスタのマスクされた要素を、ゼロ又は別の所定の値にクリアすることができる一方で、マスクされていないレーンはそのレーンでの加算の結果で書き込みが行われる。したがって、一般には、プレディケート・レジスタ16は特定のレーンでベクトル演算のマスキングを制御するために使用することができる。例えば、条件付きベクトル命令は、所与のベクトルのそれぞれのレーンにおいて入力要素がいくつかの条件を満たすかどうかを試験する比較を実施して、対応するレーンでの比較結果に基づいてプレディケート・レジスタにプレディケート値をセットすることができ、次いでそれぞれのベクトル・レーンでのその命令の効果が、先の条件付きベクトル命令によって実施される比較に応じて条件的になるよう、後続のベクトル命令をプレディケートに応じてマスクすることができる。
【0045】
図2は所与のベクトルについて並列に実施される加算のすべてを示しているが、これは必須ではない。処理回路4は、ある範囲の異なるデータ要素サイズ及び異なるベクトル長を伴うベクトルの処理をサポートすることができる。例えば、256ビットのベクトル・レジスタ14は、8ビットのデータ要素32個、16ビットのデータ要素16個、32ビットのデータ要素8個、64ビットのデータ要素4個、又は128ビットのデータ要素2個に分割することができ、或いは例えば単一の256ビット要素として解釈することもできる。やはり、様々なサイズのベクトル・レジスタ、例えば128、256、又は512ビット、がサポートされ得る。例えば、ベクトル・レジスタ・バンク14は、様々な方法で分割可能であり得、様々なベクトル・レジスタのサイズを与える(例えば、固定サイズのいくつかの物理レジスタを組み合わせて、単一のベクトル命令によって動作させ、大きなレジスタ・サイズを表現することができる)。したがって、
図1に示すように、レジスタ10は、ベクトル演算に使用されるデータ要素のサイズを指定する要素サイズ・パラメータ18(ベクトルの1つのデータ要素内のビット数)、及びベクトル・レジスタの長さを指定するベクトル長パラメータ20(すべての要素を含む、ベクトル内での合計ビット数)などの、ベクトル処理を制御するための制御情報をさらに含むことができる。いくつかの実装形態において、これらの値は、すべての命令について常に同一であるように固定であることができる。異なる要素サイズ又はベクトル長を有するある範囲のプラットフォームでの実行のために書かれたコードが、現在そのコードを実行しているシステムに実装された特定の要素サイズ又はベクトル長を読み出すことができるように、要素サイズ18及びベクトル長20を指定するレジスタを設けることは、なお有用である場合がある。しかしながら、他の実例では、要素サイズ及び又はベクトル長は、所与の演算について命令がどのような要素サイズ又はベクトル長を使用するか指定できるように、プログラム可能な場合がある。代替的に、要素サイズ及び/又はベクトル長は、制御レジスタ内のパラメータではなく、ベクトル命令のエンコードによって指定することができる。
【0046】
したがって、要素サイズ又はベクトル長は、変わってもよい。選択される特定のサイズによっては、ベクトル処理回路は、ベクトル全体を並列に処理するために十分な処理ハードウェアを常に有していない可能性がある。処理ロジックが所与の演算に使用されるベクトル長よりも狭い場合、ベクトルは狭い処理ロジックを通じる別個の通過により複数サイクルで処理することができる。したがって、ベクトル命令は、処理回路4をトリガして、単一の命令に応答して複数レーンの処理において演算を実施することができる一方で、これは必ずしもこれらのレーンのすべてが並列に処理されなければならないことを含意していない。極端に言えば、いくつかのベクトル実装形態は、単一のレーンに対応する処理ロジックを提供するだけで、ベクトル・レーンのすべてを順次に処理することができる。他の極端な場合、高いパフォーマンスの実装形態は、複数の並列実行ユニットを使用して、すべてのベクトル・レーンを並列に処理することができる。他の実装形態は、いくつかのレーンを並列に処理することができるが、ベクトルを全体として複数の順次的なチャンクとして処理する。
【0047】
要素サイズ又はベクトル長指標18、20は、レジスタ10に格納することができる制御情報の一部の実例に過ぎないことを了解されたい。他の実例としては、現在の実行のポイントを表現する命令のアドレスを示すプログラム・カウンタ・レジスタ、例外をハンドリングする際に状態を保存又は復元するためにスタック・データ構造のメモリ8における場所のアドレスを示すスタック・ポインタ・レジスタ、及び関数の実行の後に処理が分岐する関数リターン・アドレスを格納するためのリンク・レジスタを挙げることができる。
【0048】
図3及び
図4は、一実例による、ベクトル・キャリー付き加算命令の加算及び減算の変形例(variants)を示している。加算及び減算の変形例の両方について、命令のさらなる第1及び第2の変形例が示される:
ADCLB Zda,Zn,Zm //キャリー付き加算long(下部)(Add with carry long(bottom))-第1の変形例、加算変形例
ADCLT Zda,Zn,Zm //キャリー付き加算long(上部)(Add with carry long(top))-第2の変形例、加算変形例
SBCLB Zda,Zn,Zm //キャリー付き減算long(下部)(Subtract with carry long(bottom))-第1の変形例、減算変形例
SBCLT Zda,Zn,Zm //キャリー付き減算long(上部)(Subtract with carry long(top))-第2の変形例、減算変形例
それぞれの変形例について、Zdaはデスティネーション・ベクトル・レジスタ(第1のデータ・ソース・ベクトル・レジスタとしても機能し、また累算器ベクトル・レジスタとも称される)を表し、Znは第2のデータ・ソース・ベクトル・レジスタを表し、Zmはキャリー・ソース・ベクトル・データ・レジスタを表している。これらの命令は、加算又は減算を実施することにより大きな整数の処理を加速するために使用することができ、それによって、累算器ベクトル・レジスタ及びキャリー・ソース・ベクトル・レジスタ内で、キャリー又はボローの入力情報が実際のデータ値でインターリーブされる。
【0049】
したがって、キャリー情報は、ソース及びデスティネーション・ベクトル・レジスタの統合した部分である。ソース及びデスティネーション・ベクトル内で「キャリー」(又は「ボロー」)情報の位置を、「キャリー」を入力として利用する、又は「キャリー」が生成される、算術演算を実施しているレーンに隣接するレーンに制約することは有用である。
図3及び
図4を見ると、レジスタZda、Zn、Zmは、要素の対に分割されている。それぞれの対は、偶数要素に対応する「下部」要素(第1の要素)、及び奇数要素に対応する「上部」要素(第2の要素)を含む。レジスタZda、Zmについて、キャリー情報がそれぞれの対の上部要素に配置される一方で、下部要素は対応するデータを与える。他の実例が、それぞれの対のデータ/キャリー要素を異なるように配置することができる一方で(例えば、すべてのデータ要素をレジスタの半分に、対応するキャリー要素をもう一方の半分に配置する)、データ及びキャリー要素をインターリーブすることはより効率的である可能性があり、理由としては、Zda内で隣接する要素の対を生成するための入力は、Zn、Zmの対応する要素の対から選択され、2つ以上のベクトルの要素にまたがる長いクロス要素経路のあらゆる必要性を回避しており、これによって処理回路のマイクロ・アーキテクチャの実装形態をより効率的にすることができるからである。したがって、これらの演算は、それぞれのベクトルを、サイズがベクトル要素のサイズの2倍である「粒(granule)」又はセグメントに効果的に分割する。
【0050】
図3は、ADCLB及びADCLT命令の演算を示している。明瞭さのために、1つの「粒」(隣接する上部及び下部要素の対)だけについて詳細な演算を図示している。対応する演算が、それぞれ他の粒(要素の対)に対して実施されることを了解されたい。ADCLB命令は、あるソースZnの偶数要素B(又はADCLT変形例の場合では、奇数要素T)を、第2のソースZmのそれぞれの粒の上半分(奇数要素)の最下位ビットをキャリー入力として使用して、デスティネーション・ベクトル・レジスタの偶数要素に加算する。得られる合計は、デスティネーション・ベクトルのそれぞれの粒の下半分に書き込まれ、一方で生成されたキャリー情報はデスティネーションのそれぞれの粒の上半分の最下位ビットに書き込まれる。Zdaにおいて、それぞれの粒の上半分の残りのビットは、使用されないままである。結果は、キャリー・ソース・レジスタZmのそれぞれの粒の下部(偶数)要素のビットとは無関係である。また、ADCLBについて、結果は、データ・ソース・レジスタZnの選択されない(上部/奇数)要素とは無関係であり、ADCLTについて、結果は、Znの選択されない(下部/偶数)要素とは無関係である。
【0051】
このやり方で、キャリー情報、及び入力又は結果データをインターリーブすることにより、キャリー・チェーンが規則的なデータフローの一部であることを確実にすることができる。これにより、ある程度の並列化を可能にしている。第1に、従属関係がベクトル・レジスタの粒度で解決されるため、同時に保留中の複数のキャリー・チェーンがある。第2に、命令のB/T変形例を、独立的に(B/T変形例を単一のマイクロ演算に融合できる場合、又は2つの変形例をパイプラインによって並列に処理することができる場合は、いくつかのマイクロ・アーキテクチャでは同時的に)計算することができる。ADCL命令は典型的に先行する乗算ステップによって生成された部分積を消費するため、これらの命令によって、乗算及び加算のステップを「合理化」し、これらが本質的に累算器に結合されているためキャリーをハンドリングするための余分な演算がないプログラム・シーケンスを設計することを可能にしている。これは、キャリー情報をマーシャリングするオーバヘッドを低減している。
【0052】
図3及び
図4では、結果がそれぞれの対の下部要素に書き込まれるように、要素のそれぞれの対の「第1の要素」を第2の要素よりも下位の要素の位置にあるが、他の実装形態では、結果がそれぞれの対の上部要素を更新し、キャリーが下部要素に書き込まれるように、第1と第2の要素はレジスタ内で転置することができる。しかしながら、マイクロ・アーキテクチャでは、キャリーが加算のデータ結果の最上位ビットより上位の1つのビット位置を表すため、ビットが加算器回路によって出力され得る順序付けに対応する可能性があるため、それぞれの対より上位の要素にキャリーを与えることがさらに効率的な場合がある。
【0053】
図4は、ベクトル・キャリー付き加算命令の減算の変形例の第1/第2の変形例の処理の対応する処理を示している。SBCLB及びSBCLT命令の演算又はデータフローは、中心となる演算が「減算」であること以外、それぞれADCLB及びADCLTに類似しており(つまり、Znから選択される要素が加算に先立って2の補数になされる以外、同じ加算)、「ボロー」情報は、入力として使用され、「キャリー」情報の代わりに出力で生成される(ボローは-1のキャリーを表す)。Znからのデータ入力を2の補数にすること、及びボローの反転の両方は、加算器へのZnのデータ・ソース入力及びボロー_イン値を両方単純に反転させることによって、実装することができる。Znのデータ・ソース入力へ別個に1を加算する必要はないが、ボロー_イン値の反転が事実上これを実現するためである。ボロー値が0の場合、反転させたボロー_イン値1が、2の補数について1の加算を与え、ボローは必要ない。ボロー値が1の場合、反転させたボロー_イン値0は、ボローについての1の減算が2の補数についての1の加算を打ち消すことを反映する。したがって、データ入力及びボロー_イン値が反転されていると、加算は加算の変形例と同じ方法で実施することができる。
【0054】
図4Aは、ベクトル・キャリー付き加算命令のプレディケートされた変形例の実例を示している。この実例において、
図3に示したADCLBの変形例にプレディケーションが適用されているが、類似のADCLT、SBCLB、及びSBCLTの変形例のプレディケートされたバージョンもやはり与えられ得る。デスティネーション・レジスタZdaの隣接する上部/下部要素のそれぞれの対に対して実施される中心となるキャリー付き加算演算は、
図3で示されるものと同一である。しかしながら、命令は、例えばプレディケート・レジスタ16のうちの1つに格納されるプレディケート値Pにさらに関連付けられる。プレディケート値は
図2のものに類似するいくつかのプレディケート・フィールドを含むが、
図3及び
図4に示されるタイプのベクトル・キャリー付き加算命令については、プレディケーションは要素ごとではなく隣接する要素の対の粒度で適用されるため、プレディケート・フィールドの半分だけが有効である。この実例において、有効なプレディケート・フィールドは、それぞれの対の下部(偶数)要素に対応するプレディケート・フィールドである(そのため、結果はそれぞれの対の上部要素に対応するプレディケート・フィールドとは無関係であり、これらのフィールドの値が結果に影響しないことを示すためにXで印をつけてある)。しかしながら、他の実装形態では、有効なプレディケート・フィールドとしてそれぞれの要素の対について上部(奇数)のプレディケート・フィールドを使用するよう選択することができる。
【0055】
対応するプレディケート指標が1であるデスティネーション・ベクトルの要素の対について、キャリー付き加算演算は、
図3に示されるのと同一の方法で実施され、対の第1の要素を加算から得られるデータDで更新し、対の第2の要素を加算のキャリー出力Cで更新することができる。しかしながら、対応するプレディケート指標が0である要素の対について(この実例では要素4及び5について示されるように、デスティネーション・ベクトルZda’のこれらの要素の更新は、抑制される。代わりに、デスティネーション・ベクトルZda’のこれらの要素は、それらの以前の値を保持することができる(プレディケーションのマージ)か、又はゼロ若しくは別の所定の値にクリアすることができる(プレディケーションのゼロ化)。したがって、プレディケートはそれぞれ個々の要素ではなく、それぞれの粒(要素の対)に適用される。
図4Aは、プレディケート・レジスタ16の一実例のフォーマットを示しているが、デスティネーション・レジスタZda’のそれぞれの要素の対がマスクされるべきかどうかを示すプレディケート指標を与えるあらゆる他の技法もまた使用することができることを了解されたい。
【0056】
図5は、デスティネーション(累算器)ベクトル・レジスタZda、第2のデータ・ソース・ベクトル・レジスタZn、及びキャリー・ソース・ベクトル・レジスタZm(この実例では、デスティネーション・ベクトル・レジスタZdaは、第1のデータ・ソース・ベクトル・レジスタとしてさらに機能する)を指定する、ベクトル加算キャリー命令の処理を示す流れ図である。ステップ50において、命令デコーダはそのようなベクトル・キャリー付き加算命令が検出されているかどうかを判断し、検出されていない場合、現在の命令はその命令によって表される演算にしたがって処理される。ベクトル・キャリー付き加算命令に遭遇している場合、ステップ52において、命令デコーダは命令が「上部」(第2)又は「下部」(第1)の変形例かどうかを判断する。命令が上部の変形例である場合、ステップ54において、第2のデータ・ソース・ベクトル・レジスタZnでそれぞれの要素の対から選択された要素は、対の上部の要素、すなわち奇数要素(第2の要素)とされ、一方で命令が下部(第1)の変形例である場合、ステップ56においてそれぞれの対の下部(第1又は偶数)要素は、第2のデータ・ソース・ベクトル・レジスタZnから選択される。
【0057】
ステップ58において、命令デコーダは命令が加算の変形例か、又は減算の変形例かどうかを判断する。命令が加算の変形例である場合、ステップ60においてデスティネーション・ベクトル・レジスタZdaにおけるそれぞれの要素の対について、対の下部(第1)要素の新しい値Zda(B)’が、以下の加算の結果にセットされる:(i)デスティネーション・ベクトル・レジスタにおいて、その要素の対の下部要素Zda(B)の以前の値、(ii)ステップ54又は56で選択されたとおりの、第2のデータ・ソース・レジスタZnにおいて対応する要素の対の選択される要素(上部又は下部)、及び(iii)キャリー・ソース・ベクトル・レジスタZmにおいて対応する要素の対の上部要素Zm(T)から抽出されたキャリー入力。やはり、デスティネーション・ベクトル・レジスタZdaの対応する要素の対の上部要素Zda(T)’の最下位ビットが、加算のキャリー出力にセットされる。
【0058】
命令が減算の変形例である場合、ステップ62において、デスティネーション・ベクトル・レジスタZda(B)’におけるそれぞれの要素の対の下部要素は、その下部要素Zda(B)の以前の値、引く、ステップ54又は56で選択されたデータ・ソース・ベクトルZnにおいて対応する要素の対のうちの1つ、引く、キャリー・ソース・ベクトル・レジスタ・ソースZmにおいて対応する要素の対の上部要素Zm(T)から抽出されたキャリー値によって表現されるボロー値、の結果にセットされる。やはり、対応する対、又はデスティネーション・ベクトル・レジスタの要素の上部要素Zda(T)’の最下位ビットは、減算からのボロー出力にセットされる(すなわち、Zda(T)の最下位ビットが、減算を実施している加算器回路のキャリー出力に出力された値にセットされる)。
【0059】
図3~
図5の実例は、同一のレジスタZdaがデスティネーション・レジスタ及び第1のデータ・ソース・レジスタ両方として機能する破壊的な命令フォーマットを示している一方で、デスティネーション・レジスタとは別個にさらなるベクトル・レジスタを第1のデータ・ソース・レジスタとして指定する非破壊的な命令フォーマットを、結果をデスティネーション・レジスタに書き込む際第1のソース・ベクトルを上書きすることを回避するために、さらに設けることができる。
【0060】
これらの命令について、実例の使用事例を以下で議論する。
【0061】
いくつかの重要な暗号化ワークロードの最も時間のかかる部分には、大きな整数値に対する数学的演算を実施するルーチンが伴う。暗号化のシナリオに加えて、大きな数字を伴う数学的演算は、金融ソフトウェア及び一部の科学アプリケーションで使用されるGNU Multiprecision Arithmetic(GMP)ライブラリなどのライブラリを支えている。そのような数字は、典型的には(その範囲に関わらず)事再現性又は数学的な厳密さの懸念から浮動小数点算術が適切ではない例で使用される。RSAアルゴリズムは、最も一般的に使用される公開鍵暗号法アルゴリズムである。その安全性は、大きな数を因数分解する知覚される困難さに依拠している。メッセージを暗号化又は復号化するため、プロセッサは冪剰余として知られる技法で大きな数をできるだけ速く乗算することが要求される。例えば、RSA2048では、4096ビットの積を与え、次いで簡約される2048ビット数の多くの連続的な乗算がある。
【0062】
整数を乗ずる最も簡単な方法(一般的に「教科書的な」方法と称される)は、1つのソースのすべての桁を他のソースのすべての桁に乗ずる必要があるため、n桁のソースに対してO(n
2)ステップを必要とする。また、以下の実例から分かるように、「加算」及び「データの再アライメント(シフト)」演算が必要とされる:
111*543=333+(444<<1 digit)+(555<<2 digits)=60273
しかしながら、Karatsubaアルゴリズムは、分割統治法に基づく手法を使用して、2つのn桁の数の乗算を、せいぜい
の単一桁の乗算まで減らすことができる。この方法は、「乗算」と、「加算」、「減算」などとの間のトレードオフを採用して、「n」が大きい場合にかなりのパフォーマンス上の利点を与える。サイズが「n」の入力オペランドを伴うそれぞれの乗算は、サイズが「n/2」の入力オペランドを伴ういくつかの小さな乗算、及びいくつかの補助的な演算-「加算」、「減算」などに分解される。正式には、2つのnビットの整数、AとBとを乗算して2nビットの結果Cを生成する式は、
図6の上部の等式で示すように書くことができる。この実例では、部分積が扱いづらいサイズを有さないことを確実にするために、Karatsubaアルゴリズムの減算の変形例を使用していることに留意されたい。したがって、2つの2048ビットの整数の乗算は、
図6に示すように、1024ビット整数の3つのサブ乗算に分解することができる。それぞれ1024ビットの乗算は、同じ方法でそれ自体を3つの512ビット整数の乗算に分解することができる。そして、それぞれ512ビットの乗算を、さらに3つの256ビット整数の乗算に分解することができる。最終的に、乗算をさらに分解することが、全体的な結果を再構成するために必要とされる追加的な加算、減算、又はシフトのために、合計で大きなオーバヘッドをもたらす点に到達する。
【0063】
サブ乗算は独立的であるため、適当なデータ・レイアウト及び編成により、
図6に示すように、Karatsubaアルゴリズムをベクトル化することが可能である。例えば、Karatsubaツリーの葉ノードが256ビットのサブ乗算を与える場合、Karatsubaツリーの所与のブランチの3つの256ビットのサブ乗算のそれぞれは、
図6の上の実例に示すように、ベクトルの別個のレーンA、B、Cに割り当てることができる。また、より大きなベクトルでは、Karatsubaツリーの高次レベルでの異なる512×512ビットの乗算について、
図6の下の実例に示すように、6つの256ビットのサブ乗算を8要素ベクトルの6レーンに割り当てることができる(3つのレーンA、B、Cのそれぞれのセットが、対応する512ビットのノードの256×256ビットの3つの乗算を表している)。
【0064】
例えば、64ビットの要素サイズを選択する場合、次のように2つの256ビットの整数AとBとを乗算することができる:A×B={a
3,a
2,a
1,a
0}×{b
3,b
2,b
1,b
0}。この乗算に関連する部分積を、
図7に図示する。積は、それぞれの部分積は「再アライン」される必要があるため、右から左にずれており、適当に列に重ねてあることに留意されたい。
【0065】
図8は、部分積a
1×{b
3,b
2,b
1,b
0}を計算するための
図7の第2の「リム(limb)」の計算を実施するために、必要な命令のシーケンスの1つの可能なインスタンスを表すコード・シーケンスを示している。様々な部分積の下部及び上部の64ビット部分を生成するために、いくつかの乗算で開始する。256ビット×256ビットの乗算のそれぞれのインスタンスは、ベクトル処理の単一のレーンを占有し、それぞれ256ビットのオペランドの64ビット構成要素は、(別個の命令で動作する別個のレジスタにおいて)それぞれのベクトルをまたぐのではなく垂直に配置されることに留意されたい。これは、計算:a
1×{b
3,b
2,b
1,b
0}についての部分積を生成するために、レジスタz1(異なるソース・オペランドからのa
1を含んでいる)が、z4(b
0がいくつかの異なるソース・オペランドからであるとして)、z5(b
1)、z6(b
2)、及びz7(b
3)のそれぞれで乗算される必要があることを含意している(
図8の1行目から8行目)。
【0066】
図8において、adclb及びadclt命令が、部分積をそれぞれのレーンzacc1LB、zacc1LT、zacc0HBなどについて累算器に加算するために使用される。adclb及びadclt命令の対応する対が、乗算からの部分積の偶数及び奇数の要素にそれぞれ作用するために実行される。命令は、4-way並列化となるやり方で使用され、B&T変形例は独立的であり、結果として有利にスケジューリングすることができる。加えて、同時的に処理することが可能な2つのキャリー・チェーンがある。1つのキャリー・チェーンは、10行目で始まり、もう1つは12行目で始まる。「B」変形例についての第1のキャリー・チェーンを、14、18及び26行目の命令を通じて追跡することができる。第2のキャリー・チェーンは16、20、及び29行目の命令を通じて追跡することができる。「T」変形例について同様のチェーンが存在する。32、33行目の命令は、以前に独立的であったキャリー・チェーンをマージしつつ、同時に最後の部分積(a
1×b
3(H))を累算器に加算するために使用される。
【0067】
図9、及び
図10A~
図10Iは、ベクトル・キャリー付き加算命令の使用の別の実例を示している。
図9は、大きな整数の乗算のための、乗算のKaratsubaツリーの一部であり得る大きな乗算の単一リムを表現している乗算{a
3,a
2,a
1,a
0}×b
iの部分積の加算を実施するための、ADCLB命令の、実例の命令シーケンスを示している。
図9において、部分積は既に生成されベクトル・レジスタP
0ilo、P
1ilo、・・・P
3ihiに格納されていると仮定している(ここで、P
jilo及びP
jihiは、a
j及びb
iの積の下半分及び上半分を表す)。AccB[i]からAccB[i+4]は、それぞれ列0~4で示される積{a
3,a
2,a
1,a
0}×b
iの5つの部分を格納するための5つの累算器レジスタを表している。ベクトル・レーンのそれぞれの対は、他のベクトル・レーンと比較して様々な入力値に適用される全く独立的な計算を表している-したがって、
図7に示されるタイプの所与の計算に必要とされる部分積の加算のそれぞれは、
図9の命令のシーケンスによって単一のレーンの対の中で実施される(例えば、レーンのそれぞれの対での計算はKaratsubaツリーの異なるノードに対応する)。簡潔にするために、
図10A~
図10Iは、ベクトルの偶数レーンに作用するADCLB命令のみを示しており、示されていない対応するADCLT命令は奇数レーンに作用するよう実行することができる。明瞭さのために、2つの独立的なキャリー・チェーンを、アスタリスク無しの第1のチェーンのキャリー(例えば、C
AccBi)、及びアスタリスク付きの第2のチェーンのキャリー(例えば、C
AccBi
*)を示すことによって区別する。
・
図10A:AccB[i]は、列0の累算を表している。AccB[i]のそれぞれの要素ごとに、対の下部(偶数)要素が、AccB[i]の下部要素の以前の値、P
0iloの対応する要素の対の下部要素、及びキャリー入力としての0(これは結果の最下位部分であるため、下部の加算からのキャリーは必要ない)、の合計にセットされる。結果のこの部分については、結果の最下位部分にはさらなるキャリーをインジェクトすることができないため、加算結果は既に最後の結果値Res[i]を表している。加算からのキャリー出力C
accBiは、AccB[i]の対の上部要素の最下位ビットに書き込まれ、列1の最下位ビットに等価な有意性を有するキャリー・ビットを表している。
・
図10B:AccB[i+1]は、列1の累算を表している。AccB[i+1]のそれぞれの要素ごとに、対の下部(偶数)要素が、AccB[i+1]の下部要素の以前の値、P
1iloの対応する要素の対の下部要素、及びキャリー入力としてC
accBi、の合計にセットされる。つまり、以前のADCLB命令のデスティネーション・レジスタAccB[i]が、次のADCLB命令のキャリー・ソース・ベクトル・レジスタとして指定され、それによって、列0における以前の加算で生成されたキャリーC
accBiが、列1における加算についてのキャリー入力として入力される。列1の累算からのキャリー出力C
accBi+1は、AccB[i+1]におけるそれぞれの対の上部要素の最下位ビットに格納され、列2における累算の最下位ビットに適用されるキャリーを表している。
・
図10C:AccB[i+2]は、列2の累算を表している。やはり、以前の命令についての結果ベクトルAccB[i+1]が、次の命令についてのキャリー・ソース・ベクトル・レジスタとなり、それによって、要素の対ごとに、列1において以前の加算によって生成されたキャリーC
accBi+1がAccB[i+1]における対応する対の上部要素から抽出され、AccB[i+2]とAccB[i+2]の対の要素の下部に書き込まれるP
2iloとの累算に加算され、得られるキャリー出力C
accBi+2がAccB[i+2]の要素のそれぞれの対の上部要素に格納される。
・
図10D:この命令は、
図10A~
図10Cを通じて取られたキャリーのチェーンとは無関係に、第2のキャリー・チェーンの開始に印をつけている。この命令は、部分積P
0ihiを
図10Bから得られるAccB[i+1]への列1における加算を表している。AccB[i+1]の奇数要素のキャリー値は
図10Cにおいて既に消費されているため、AccB[i+1]の偶数要素とP
0ihiの偶数要素とのそれぞれの加算から得られる新しいキャリー値C
accBi+1
*によって、奇数要素において上書きすることができる。
・
図10E:この命令は、第1のキャリー・チェーンの一部であり、
図10Cからのキャリー出力C
accBi+2(AccB[i+2]における要素のそれぞれの対の上部要素に格納された)を、AccB[i+3]における要素のそれぞれの対の下部要素とP
3ilo(列3における加算を表している)との加算へのキャリー入力として使用する。得られるキャリー出力C
accBi+2は、AccB[i+3]における要素のそれぞれの対の上部要素に格納される。
・
図10F:第2のキャリー・チェーンにおいて、この命令は
図10Dからのキャリー出力C
accBi+1
*(列2の最下位ビットに等価なビット有意性を有する)を、列2におけるAccB[i+2]とP
1ihiとの加算へのキャリー入力として使用する。
・
図10G:第1のキャリー・チェーンにおいて、この命令は偶数レーンにおけるAccB[i+4]とP
3ihiとのベクトル加算を実施し、それぞれの加算についてのキャリー入力は、AccB[i+3]の奇数レーン由来である(
図10Eから得られる)。命令は、個々の加算のキャリー出力をAccB[i+4]の奇数要素の最下位ビットにさらに書き込むことができるが、この累算は結果の最上位部分を表しているため、実際にはこれらのキャリーはどの後続命令にも必要とされない。
・
図10H:第2のキャリー・チェーンにおいて、この命令は偶数レーンにおけるAccB[i+3]とP
2ihiとのベクトル加算を実施し、それぞれの加算についてのキャリー入力C
accBi+2
*は、AccB[i+2]の奇数レーン由来である(
図10Fから得られる)。
・
図10I:最後に、第2のキャリー・チェーンにおいて、この命令はAccB[i+4]の偶数レーンとゼロ化されたデータ・ソース・レジスタとのベクトル加算を実施する(最上位列に加算される部分積は1つしかないため、第2のデータ入力はゼロであり、これは既に
図10Gの命令によって加算されている)。それぞれの加算についてのキャリー入力C
accBi+2
*は、AccB[i+3]の奇数レーン由来である(
図10Gから得られる)。それぞれの加算の結果は、累算器レジスタAccB[i+4]の偶数レーンに書き込まれる。やはり、命令の通常の挙動の一部として、奇数レーンにはそれぞれの加算のキャリー出力が書き込まれ、これらのキャリーはいかなるさらなる命令でも必要とされない。
したがって、この実例は、ADCLB命令が、乗算の部分積の加算についてのキャリー情報をデータ結果それ自体と共に、どのように効率的に移送させ、2の乗数ビットの要素を有する入力ベクトル(例えば、P
0iloからP
3ihi)に適用されるそのような乗算の効率的な計算を可能にすることができるか、それによって、加算を実施する前に、ベクトル乗算命令の結果のアンパックが必要とならないこと、を示している。これは、例えば、Karatsubaアルゴリズムを使用して長整数の乗算を伴う計算のパフォーマンスを向上させる。
【0068】
図11は、キャリー付き加算命令を実装する代替的な方法を示している。ベクトル・レジスタの交互の要素からキャリー入力を取る代わりに、キャリー入力は、プレディケート・レジスタ・ファイル16からの入力プレディケート・レジスタPmの対応するプレディケート・フィールドから取得される。同様に、キャリー出力がデスティネーション・プレディケート・レジスタPd2の対応するプレディケート・フィールドに書き込まれる。この手法では、1要素おきにキャリーを表現する必要がないため、ベクトルを実データ値で完全に占有することができる。したがって、8要素のベクトルでは、同一の命令に応答して8つの別個の累算が実施されることになる。結果ベクトルZda1は、それぞれの要素を、その要素の以前の値とデータ・ソース・ベクトルZnの対応する要素との合計又は差分にセットされている。加算用のキャリー入力は、入力プレディケート・レジスタPmの対応するプレディケート・フィールドから抽出され、加算からのキャリー出力は、出力プレディケート・レジスタPd2の対応するプレディケート・フィールドに書き込まれる。やはり、キャリー入力/出力がキャリー又はボローの情報を表現することができるように、
図3及び
図4で示されるような加算及び減算の変形例を提供することができる(ボローは、次の最上位桁からの差し引きを表しているが、キャリーは次の最上位桁への加算を表すことができる-つまり、ボローは-1のキャリーである)。
【0069】
図11で示される手法がより密にパックされるベクトル・レジスタ・ファイルをもたらすことができ、ひいては半分の数の命令で累算を実施することを可能とする一方で(例えば、ソース・データ・ベクトルのすべての要素を1命令で処理することができるため、別個のADCLB及びADCLT命令の必要がない)、ベクトル・レジスタ・ファイルへの書き込みに加え、命令によりプレディケート・レジスタ・ファイルへのさらなる書き込みが必要とされるため、マイクロ・アーキテクチャのより複雑な修正を必要とすることがあり、これは多くのベクトルのマイクロ・アーキテクチャには珍しいことであろう。したがって、
図3及び
図4、又は
図11の手法が取られるかどうかは、ソフトウェアの効率と、ハードウェアのマイクロ・アーキテクチャの効率とのトレードオフ次第となり得る。
【0070】
図12は、キャリー付き加算命令のプレディケートの形態の処理を図示する流れ図を示している。ステップ100において、そのようなベクトル・キャリー付き加算命令に遭遇したかどうか検出され、検出されていない場合、命令デコーダ6は、検出されたタイプの命令によって表現される他の演算を実施するよう処理回路4を制御する。命令が、ベクトル・キャリー付き加算命令である場合、ステップ102において、命令が加算か、又は減算の変形例かどうか検出される。キャリー情報を別個のプレディケート・レジスタに移動することにより、この命令については第1及び第2の(上部又は下部)変形例がなく、キャリー用に要素の半分を予約することは必須ではなく、そのため単一の命令でデータ・ソース・レジスタの要素のすべてに対して作用することが可能であることに留意されたい。
【0071】
ベクトル・キャリー付き加算命令が、加算の変形例である場合、ステップ104において、デスティネーション・レジスタZda1(i)’のそれぞれの要素iの新しい値が、そのデータ要素Zda1(i)の以前の値と、データ・ソース・ベクトル・レジスタZn(i)の対応するデータ要素と、入力プレディケート・レジスタPm(i)の対応するプレディケート・フィールドiから取られたキャリー入力との合計に等しくセットされる。やはり、出力プレディケート・レジスタPd2(i)の対応するプレディケート・フィールドが、加算からのキャリー出力に等しくセットされる。
【0072】
命令が減算の変形例である場合、ステップ106において、デスティネーション・レジスタのそれぞれの要素Zda1(i)’は、その要素Zda1(i)の以前の値、引く、データ・ソース・レジスタの対応する要素Zn(i)、引く、入力プレディケート・レジスタPm(i)の対応するプレディケート・フィールドによって示されるボロー値、に対応する新しい値にセットされる。やはり、出力プレディケート・レジスタの対応するプレディケート・フィールドPd2(i)が、減算のボロー出力に等しくセットされる。ステップ104、及びステップ106は、個々の要素位置ごとに別個に実施されることを了解されたい(つまり、i=0…N-1、ここでNはベクトル内の要素の総数である)。
【0073】
図11及び
図12が、同一のレジスタZda1がデスティネーション・ベクトル・レジスタ及び第1のソース・ベクトル・レジスタの両方として機能する実例を示している一方で、やはり、第1のソース・ベクトル・レジスタとして別個のレジスタが指定される非破壊的な変形例を与えることも可能である。
【0074】
図11に示されるキャリー付き加算命令のプレディケートされた変形例を、さらに提供することができ、
図2で示されたのと類似の方法で要素ごとにプレディケーションが適用される。
【0075】
図13は使用され得るシミュレータの実装形態を図示している。先に説明された実施例は考慮される技法をサポートする特定の処理ハードウェアを動作させるための装置及び方法の点で本発明を実装している一方、本明細書で説明される実施例にしたがっており、コンピュータ・プログラムの使用を通じて実装される命令実行環境を提供することも可能である。そのようなコンピュータ・プログラムは、それらがハードウェア・アーキテクチャのソフトウェア・ベースの実装形態を提供する限りにおいて、しばしばシミュレータと称される。シミュレータ・コンピュータ・プログラムの種類としては、エミュレータ、仮想マシン、モデル、及びダイナミック・バイナリ変換器を含むバイナリ変換器が挙げられる。典型的には、シミュレータ実装形態は、任意選択でホスト・オペレーティング・システム220を実行させ、シミュレータ・プログラム210をサポートする、ホスト・プロセッサ230上で実行することができる。いくつかの配置構成において、ハードウェアと提供される命令実行環境との間に複数のシミュレーションのレイヤ、及び/又は同一のホスト・プロセッサ上に設けられる複数の別個の命令実行環境があってもよい。歴史的には、適度な速度で実行するシミュレータ実装形態を提供するためにはパワーのあるプロセッサが要求されてきたが、そのような手法は一定の状況下で正当化されてもよく、例えば互換性又は再利用目的のために別のプロセッサにとってネイティブなコードを実行する所望がある場合などである。例えば、シミュレータ実装形態は、ホスト・プロセッサ・ハードウェアによってサポートされていない追加的な機能性を伴う命令実行環境を提供すること、又は典型的には異なるハードウェア・アーキテクチャに関連付けられる命令実行環境を提供することができる。シミュレーションの概略は「Some Efficient Architecture Simulation Techniques」、Robert Bedichek、Winter 1990 USENIX Conference、53~63頁に示されている。
【0076】
実施例が特定のハードウェア構築物又は特徴を参照して以前に説明されてきた範囲で、シミュレートされる実施例において等価な機能性が適切なソフトウェア構築物又は特徴によって提供され得る。例えば、特定の回路がコンピュータ・プログラム・ロジックとしてシミュレートされる実施例に実装されてもよい。同様に、レジスタ又はキャッシュなどのメモリ・ハードウェアが、ソフトウェア・データ構造体としてシミュレートされた実施例に実装されてもよい。以前に説明された実施例において参照されるハードウェア要素の1つ又は複数がホスト・ハードウェアに存在する配置構成(例えば、ホスト・プロセッサ230)において、いくつかのシミュレートされる実施例は適切であればホスト・ハードウェアを利用することができる。
【0077】
シミュレータ・プログラム210はコンピュータ可読記憶媒体(非一時的媒体であってもよい)に記憶することができ、ターゲット・コード200(アプリケーション、オペレーティング・システム、及びハイパーバイザを含み得る)にプログラム・インターフェース(命令実行環境)を提供するが、ターゲット・コード200はシミュレータ・プログラム210によってモデリングされるハードウェア・アーキテクチャのアプリケーション・プログラム・インターフェースと同一のものである。したがって、ターゲット・コード200のプログラム命令は、命令実行環境内からシミュレータ・プログラム210を使用して実行することができ、それによって、上で議論した装置2のハードウェア特徴を実際には有していないホスト・コンピュータ230がこれらの特徴をエミュレートすることができる。例えば、シミュレータ・プログラム210は、機能性においてそれぞれ命令デコーダ6、処理回路4、及びレジスタ10に相当する、命令デコード・プログラム・ロジック212、処理プログラム・ロジック214、及びレジスタ・データ構造216を含むことができる。例えば、デコード・プログラム・ロジック212は、ターゲット・コード200の命令の命令エンコードをチェックするためのシミュレータ・プログラム210の一連の「if」ステートメントを含み、演算を実施するかどうか判断することができ、また処理プログラム・ロジック214は、特定の命令についてアクティベートされる「then」ルーチンに対応し、それらをホスト・オペレーティング・システム220によって実行される対応する命令にマッピングすることができる。レジスタ・データ構造216は、シミュレータ・プログラム210によってシミュレートされている被シミュレート装置2のレジスタをエミュレートするために割り当てられるメモリの領域を含むことができる。
【0078】
本出願において、語句「するように構成される」は、装置の要素が定義される動作を実行することができる構成を有することを意味するために使用される。この文脈において、「構成」はハードウェア又はソフトウェアの内部接続の、配置又はやり方を意味する。例えば、装置は定義される動作を提供する専用のハードウェアを有してもよく、又はプロセッサ若しくは他の処理デバイスは機能を実施するためにプログラムされてもよい。「するように構成される」は、定義される動作を提供するために装置要素がいかなるやり方でも変更される必要があることを含意するものではない。
【0079】
本発明の図示的な実施例を本明細書において添付の図面を参照して詳細に説明してきたが、本発明はこれらの正確な実施例に限定されず、当業者により添付の特許請求の範囲によって定義されるような本発明の範囲及び精神を逸脱することなく、その様々な変形及び修正がそこになされ得ることを理解されたい。