(57)【要約】  複素数の実数部を表す少なくとも１つの実数データ要素と、複素数の虚数部を表す少なくとも１つの虚数要素とを含む複数のデータ要素を含む第１および第２のオペランドベクトル上で動作するための複素数乗算命令の第１および第２の形式を提供する。命令の第１および第２の形式のうちの１つは宛先ベクトルの少なくとも１つの実数要素をターゲットとし、他方は少なくとも１つの虚数要素をターゲットとする。各命令の１つを実行することにより、（ａ＋ｉｂ）＊（ｃ＋ｉｄ）の形式の複素数乗算は、比較的少数の命令および２つのベクトルレジスタ読み出しポートのみを使用して計算することができ、それによりＦＦＴなどのＤＳＰアルゴリズムを、比較的低電力のハードウェア実装を使用してより効率的に計算することができる。
2019511056.tif 000002
【特許請求の範囲】
【請求項１】
データ処理装置であって、
データ処理を実行する処理回路と、
前記データ処理を実行するように前記処理回路を制御する命令をデコードする命令デコーダと
を含み、
前記命令デコーダが、第１および第２オペランドベクトルに対する部分複素数乗算演算を実行して宛先ベクトルの少なくとも１つのターゲット要素を第１の積および第２の積の加算または減算結果に依存する値に設定するように前記処理回路を制御するために複素数乗算命令をデコードするように構成され、前記第１および第２のオペランドベクトルならびに前記宛先ベクトルの各々が、複素数の実数部を表す少なくとも１つの実数要素と、複素数の虚数部を表す少なくとも１つの虚数要素とを含む複数のデータ要素を含み、
複素数乗算命令の第１の形式に応答して、前記命令デコーダが、前記第１のオペランドベクトルの実数要素と前記第２のオペランドベクトルの対応する実数要素との積を含む前記第１の積、および前記第１のオペランドベクトルの虚数要素と前記第２のオペランドベクトルの対応する虚数要素との積を含む前記第２の積で前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成され、
前記複素数乗算命令の第２の形式に応答して、前記命令デコーダが、前記第１のオペランドベクトルの実数要素と前記第２のオペランドベクトルの虚数要素との積を含む前記第１の積、および前記第１のオペランドベクトルの虚数要素と前記第２のオペランドベクトルの実数要素との積を含む前記第２の積で前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成され、
前記複素数乗算命令の前記第１および第２の形式のうちの１つに応答して、前記命令デコーダが、前記宛先ベクトルの少なくとも１つの実数要素を含む前記少なくとも１つのターゲット要素で前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成され、
前記複素数乗算命令の前記第１および第２の形式のうちの他方に応答して、前記命令デコーダが、前記宛先ベクトルの少なくとも１つの虚数要素を含む前記少なくとも１つのターゲット要素で前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成され、そして、
前記複素数乗算命令の前記第１および第２の形式のうちの少なくとも１つに応答して、前記命令デコーダが、前記少なくとも１つのターゲット要素以外の前記宛先ベクトルの少なくとも１つの要素の更新を抑制するように前記処理回路を制御するように構成されている、データ処理装置。
【請求項２】
前記第１および第２のオペランドベクトルが３つ以上のデータ要素を含む複素数乗算命令に応答して、前記命令デコーダが、それぞれが複数の虚数要素とインタリーブされている複数の実数要素を含む前記第１および第２のオペランドベクトルを処理するように前記処理回路を制御するように構成されている、請求項１に記載のデータ処理装置。
【請求項３】
前記処理回路が、前記複素数乗算命令に関連するパラメータに応答して、前記第１および第２オペランドベクトル内の実数および虚数要素の数を決定するように構成され、前記パラメータが、
前記実数要素および前記虚数要素の前記数を示す即値、
前記実数要素および前記虚数要素の幅を示す即値、
前記実数要素および前記虚数要素の前記数を示す値を含むレジスタを示す値、および、
前記実数要素および前記虚数要素の前記幅を示す値を含むレジスタを示す値、
のうちの１つである、請求項２に記載のデータ処理装置。
【請求項４】
前記処理回路が、所与の部分をマスクされる部分として識別する予測指示に応答して、前記宛先ベクトルの前記所与の部分に関連する演算をマスクするように構成されている、請求項１から３のいずれか一項に記載のデータ処理装置。
【請求項５】
前記複素数乗算命令の前記第１および第２の形式の前記少なくとも１つに応答して、前記命令デコーダが、前記少なくとも１つの要素に対応する前記宛先ベクトルの一部がマスクされる部分であることを前記予測指示が識別しているかどうかにかかわらず、前記少なくとも１つのターゲット要素以外の前記宛先ベクトルの前記少なくとも１つの要素の更新を抑制するように前記処理回路を制御するように構成されている、請求項４に記載のデータ処理装置。
【請求項６】
前記複素数乗算命令の加算変形に応答して、前記命令デコーダは、前記少なくとも１つのターゲット要素を、前記第１の積および前記第２の積を加算した結果に依存する値に設定するように前記処理回路を制御するように構成されており、
前記複素数乗算命令の減算変形に応答して、前記命令デコーダが、前記少なくとも１つのターゲット要素を、前記第１の積および前記第２の積を減算した結果に依存する値に設定するように前記処理回路を制御するように構成されている、請求項１から５のいずれか一項に記載のデータ処理装置。
【請求項７】
前記複素数乗算命令の第１のバージョンに応答して、前記命令デコーダが、前記少なくとも１つのターゲット要素を使用して前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成されており、前記少なくとも１つのターゲット要素は、
前記複素数乗算命令が前記第１の形式である場合、前記宛先ベクトルの少なくとも１つの実数要素と、
前記複素数乗算命令が前記第２の形式である場合、前記宛先ベクトルの少なくとも１つの虚数要素と
を含む、請求項１から６のいずれか一項に記載のデータ処理装置。
【請求項８】
前記複素数乗算命令の第２のバージョンに応答して、前記命令デコーダが、前記少なくとも１つのターゲット要素を使用して前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成されており、前記少なくとも１つのターゲット要素は、
前記複素数乗算命令が前記第１の形式である場合、前記宛先ベクトルの少なくとも１つの虚数要素と、
前記複素数乗算命令が前記第２の形式である場合、前記宛先ベクトルの少なくとも１つの実数要素と
を含む、請求項１から７のいずれか一項に記載のデータ処理装置。
【請求項９】
前記複素数乗算命令の要素拡大型変形に応答して、前記命令デコーダが、Ｋビットのデータ要素を含む前記宛先ベクトルを生成するために、Ｊビットのデータ要素を含む前記第１および第２オペランドベクトルに対して前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成されており、ここでＫ＞Ｊである、請求項１から８のいずれか一項に記載のデータ処理装置。
【請求項１０】
Ｋ＝２Ｊであり、前記複素数乗算命令の前記要素拡大型変形に応答して、前記命令デコーダが、前記宛先ベクトルの前記少なくとも１つのターゲット要素のそれぞれを、
前記第１の積および前記第２の積を加算または減算した結果に対応するＫ＋１ビット値の最上位Ｋビット、および、
前記Ｋ＋１ビット値の最下位Ｋビットのいずれか１つに設定するように構成されている、請求項９に記載のデータ処理装置。
【請求項１１】
前記複素数乗算命令の要素サイズ保持型変形に応答して、前記命令デコーダが、Ｊビットのデータ要素を含む前記宛先ベクトルを生成するために、Ｊビットのデータ要素を含む前記第１および第２オペランドベクトルに対して前記部分乗算演算を実行するように前記処理回路を制御するように構成されている、請求項１から１０のいずれか一項に記載のデータ処理装置。
【請求項１２】
前記複素数乗算命令の前記要素サイズ保持型変形に応答して、前記命令デコーダが、前記宛先ベクトルの前記少なくとも１つのターゲット要素のそれぞれを、前記第１の積および前記第２の積を加算または減算した結果に対応する中間値の切り捨てを含むＪビット値に設定するように前記処理回路を制御するように構成される、請求項１１に記載のデータ処理装置。
【請求項１３】
前記複素数乗算命令の前記要素サイズ保持型変形に応答して、前記命令デコーダが、前記中間値のＪビットを選択するステップ、および前記選択されたＪビットより前記中間値の少なくとも１つ下位のビットに基づいて前記選択されたＪビットの丸めを行うステップを含む前記切り捨てを実行するように前記処理回路を制御するように構成される、請求項１２に記載のデータ処理装置。
【請求項１４】
前記中間値が２Ｊ＋１ビットを含み、前記切り捨てが前記（２Ｊ＋１）ビット値の最上位Ｊビットを選択するステップを含む、請求項１２および１３のいずれか一項に記載のデータ処理装置。
【請求項１５】
前記中間値が、２Ｊ＋１ビット［２Ｊ：０］を含み、前記切り捨てが前記（２Ｊ＋１）ビット値のビット［２Ｊ−１：Ｊ］を選択するステップを含む、請求項１２および１３のいずれか一項に記載のデータ処理装置。
【請求項１６】
前記複素数乗算命令の整数または固定小数点変形に応答して、前記命令デコーダが、整数または固定小数点演算を使用して前記少なくとも１つのターゲット要素を生成するために、前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成されている、請求項１から１５のいずれか一項に記載のデータ処理装置。
【請求項１７】
前記複素数乗算命令の浮動小数点変形に応答して、前記命令デコーダが、浮動小数点演算を使用して前記少なくとも１つのターゲット要素を生成するために、前記部分複素数乗算演算を実行するように前記処理回路を制御するように構成されている、請求項１から９および１１のいずれか一項に記載のデータ処理装置。
【請求項１８】
ベクトル命令に応答して、前記処理回路が複数の処理のビートを実行するように構成されており、各ビートがベクトル値の一部に対応する処理を含み、
前記処理回路が第１および第２のベクトル命令のオーバーラップ実行をサポートするように構成され、前記第２のベクトル命令のビートの第１のサブセットが、前記第１のベクトル命令のビートの第２のサブセットと並列に実行される、請求項１から１７のいずれか一項に記載のデータ処理装置。
【請求項１９】
データ処理装置であって、
データ処理を実行する手段と、
前記データ処理を実行するように前記データ処理実行手段を制御する命令をデコードする手段と
を含み、
前記デコードする手段が、第１および第２オペランドベクトルに対する部分複素数乗算演算を実行して宛先ベクトルの少なくとも１つのターゲット要素を第１の積および第２の積の加算または減算結果に依存する値に設定するように前記データ処理実行手段を制御するために複素数乗算命令をデコードするように構成され、前記第１および第２のオペランドベクトルならびに前記宛先ベクトルの各々は、複素数の実数部を表す少なくとも１つの実数要素と、複素数の虚数部を表す少なくとも１つの虚数要素とを含む複数のデータ要素を含み、
前記複素数乗算命令の第１の形式に応答して、前記デコードする手段が、前記第１のオペランドベクトルの実数要素と前記第２のオペランドベクトルの対応する実数要素との積を含む前記第１の積、および前記第１のオペランドベクトルの虚数要素と前記第２のオペランドベクトルの対応する虚数要素との積を含む前記第２の積で前記部分複素数乗算演算を実行するように前記データ処理実行手段を制御するように構成され、
前記複素数乗算命令の第２の形式に応答して、前記デコードする手段が、前記第１のオペランドベクトルの実数要素と前記第２のオペランドベクトルの虚数要素との積を含む前記第１の積、および前記第１のオペランドベクトルの虚数要素と前記第２のオペランドベクトルの実数要素との積を含む前記第２の積で前記部分複素数乗算演算を実行するように前記データ処理実行手段を制御するように構成され、
前記複素数乗算命令の前記第１および第２の形式のうちの１つに応答して、前記デコードする手段が、前記宛先ベクトルの少なくとも１つの実数要素を含む前記少なくとも１つのターゲット要素で前記部分複素数乗算演算を実行するように前記データ処理実行手段を制御するように構成され、
前記複素数乗算命令の前記第１および第２の形式のうちの他方に応答して、前記デコード手段が、前記宛先ベクトルの少なくとも１つの虚数要素を含む前記少なくとも１つのターゲット要素で前記部分複素数乗算演算を実行するように前記データ処理実行手段を制御するように構成され、そして、
前記複素数乗算命令の前記第１および第２の形式のうちの少なくとも１つに応答して、前記デコード手段が、前記少なくとも１つのターゲット要素以外の前記宛先ベクトルの少なくとも１つの要素の更新を抑制するように前記データ処理実行手段を制御するように構成されている、データ処理装置。
【請求項２０】
データ処理方法であって、
第１および第２オペランドベクトルに対する部分複素数乗算演算を実行して宛先ベクトルの少なくとも１つのターゲット要素を第１の積および第２の積の加算または減算結果に依存する値に設定するように処理回路を制御するために複素数乗算命令をデコードするステップを含み、前記第１および第２のオペランドベクトルならびに前記宛先ベクトルの各々が、複素数の実数部を表す少なくとも１つの実数要素と、複素数の虚数部を表す少なくとも１つの虚数要素とを含む複数のデータ要素を含み、
前記複素数乗算命令の第１の形式に応答して、前記部分複素数乗算演算が、前記第１のオペランドベクトルの実数要素と前記第２のオペランドベクトルの対応する実数要素との積を含む前記第１の積、および前記第１のオペランドベクトルの虚数要素と前記第２のオペランドベクトルの対応する虚数要素との積を含む前記第２の積で実行され、
前記複素数乗算命令の第２の形式に応答して、前記部分複素数乗算演算が、前記第１のオペランドベクトルの実数要素と前記第２のオペランドベクトルの虚数要素との積を含む前記第１の積、および前記第１のオペランドベクトルの虚数要素と前記第２のオペランドベクトルの実数要素との積を含む前記第２の積で実行され、
前記複素数乗算命令の前記第１および第２の形式のうちの１つに応答して、前記部分複素数乗算演算が、前記宛先ベクトルの少なくとも１つの実数要素を含む前記少なくとも１つのターゲット要素で実行され、
前記複素数乗算命令の前記第１および第２の形式のうちの他方に応答して、前記部分複素数乗算演算が、前記宛先ベクトルの少なくとも１つの虚数要素を含む前記少なくとも１つのターゲット要素で実行され、そして、
前記複素数乗算命令の前記第１および第２の形式のうちの少なくとも１つに応答して、前記少なくとも１つのターゲット要素以外の前記宛先ベクトルの少なくとも１つの要素を更新するステップが抑制される、データ処理方法。
【請求項２１】
請求項１から１８のいずれか一項に記載の装置に対応する命令実行環境を提供するようにホストデータ処理装置を制御するプログラム命令を含む、仮想マシンコンピュータプログラム。
【請求項２２】
請求項２１に記載の仮想マシンコンピュータプログラムを格納した、コンピュータ可読な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、データ処理の技術分野に関する。
【背景技術】
【０００２】
データ処理アプリケーションの中には、実部と虚部、すなわちａ＋ｉｂという形式の数を持つ複素数の処理があり、ここでｉは−１の平方根を表す（−１の平方根を‘ｊ’で表すこともできるが、ここでは‘ｉ’を使用する）。複素数演算は、高速フーリエ変換（ＦＦＴ）の計算など、デジタル信号処理（ＤＳＰ）アプリケーションに特に役立つ。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
一部のＤＳＰアルゴリズムは、ｒ＝（ａ＋ｉｂ）＊（ｃ＋ｉｄ）の形式の多数の乗算を必要とする可能性があるので、プロセッサが複素数乗算を処理する方法は、性能に影響を与える要因となり得る。
【課題を解決するための手段】
【０００４】
少なくとも一部の例は、データ処理装置を提供し、装置は、
データ処理を実行する処理回路と、
データ処理を実行するように処理回路を制御する命令をデコードする命令デコーダと
を含み、
ここで命令デコーダは、第１および第２オペランドベクトルに対する部分複素数乗算演算を実行して宛先ベクトルの少なくとも１つのターゲット要素を第１の積および第２の積の加算または減算結果に依存する値に設定するように処理回路を制御するために複素数乗算命令をデコードするように構成され、第１および第２のオペランドベクトルならびに宛先ベクトルの各々は、複素数の実数部を表す少なくとも１つの実数要素と、複素数の虚数部を表す少なくとも１つの虚数要素とを含む複数のデータ要素を含み、
複素数乗算命令の第１の形式に応答して、命令デコーダは、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの対応する実数要素との積を含む第１の積、および第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの対応する虚数要素との積を含む第２の積で部分複素数乗算演算を実行するように処理回路を制御するように構成され、
複素数乗算命令の第２の形式に応答して、命令デコーダは、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの虚数要素との積を含む第１の積、および第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの実数要素との積を含む第２の積で部分複素数乗算演算を実行するように処理回路を制御するように構成され、
複素数乗算命令の第１および第２の形式のうちの１つに応答して、命令デコーダは、宛先ベクトルの少なくとも１つの実数要素を含む前記少なくとも１つのターゲット要素で部分複素数乗算演算を実行するように処理回路を制御するように構成され、
複素数乗算命令の第１および第２の形式のうちの他方に応答して、命令デコーダは、宛先ベクトルの少なくとも１つの虚数要素を含む前記少なくとも１つのターゲット要素で部分複素数乗算演算を実行するように処理回路を制御するように構成され、そして、
複素数乗算命令の第１および第２の形式のうちの少なくとも１つに応答して、命令デコーダは、前記少なくとも１つのターゲット要素以外の宛先ベクトルの少なくとも１つの要素の更新を抑制するように処理回路を制御するように構成されている。
【０００５】
少なくとも一部の例は、データ処理装置を提供し、装置は、
データ処理実行手段と、
データ処理を実行するようにデータ処理手段を制御する命令をデコードする手段と
を含み、
ここでデコード手段は、第１および第２オペランドベクトルに対する部分複素数乗算演算を実行して宛先ベクトルの少なくとも１つのターゲット要素を第１の積および第２の積の加算または減算結果に依存する値に設定するようにデータ処理実行手段を制御するために複素数乗算命令をデコードするように構成され、第１および第２のオペランドベクトルならびに宛先ベクトルの各々は、複素数の実数部を表す少なくとも１つの実数要素と、複素数の虚数部を表す少なくとも１つの虚数要素とを含む複数のデータ要素を含み、
複素数乗算命令の第１の形式に応答して、デコード手段は、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの対応する実数要素との積を含む第１の積、および第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの対応する虚数要素との積を含む第２の積で部分複素数乗算演算を実行するようにデータ処理実行手段を制御するように構成され、
複素数乗算命令の第２の形式に応答して、デコード手段は、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの虚数要素との積を含む第１の積、および第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの実数要素との積を含む第２の積で部分複素数乗算演算を実行するようにデータ処理実行手段を制御するように構成され、
複素数乗算命令の第１および第２の形式のうちの１つに応答して、デコード手段は、宛先ベクトルの少なくとも１つの実数要素を含む前記少なくとも１つのターゲット要素で部分複素数乗算演算を実行するようにデータ処理実行手段を制御するように構成され、
複素数乗算命令の第１および第２の形式のうちの他方に応答して、デコード手段は、宛先ベクトルの少なくとも１つの虚数要素を含む前記少なくとも１つのターゲット要素で部分複素数乗算演算を実行するようにデータ処理実行手段を制御するように構成され、そして、
複素数乗算命令の第１および第２の形式のうちの少なくとも１つに応答して、デコード手段は、前記少なくとも１つのターゲット要素以外の宛先ベクトルの少なくとも１つの要素の更新を抑制するようにデータ処理実行手段を制御するように構成されている。
【０００６】
少なくとも一部の例は、データ処理方法を提供し、方法は、
第１および第２オペランドベクトルに対する部分複素数乗算演算を実行して宛先ベクトルの少なくとも１つのターゲット要素を第１の積および第２の積の加算または減算結果に依存する値に設定するように処理回路を制御するために複素数乗算命令をデコードするステップを含み、第１および第２のオペランドベクトルならびに宛先ベクトルの各々は、複素数の実数部を表す少なくとも１つの実数要素と、複素数の虚数部を表す少なくとも１つの虚数要素とを含む複数のデータ要素を含み、
ここで複素数乗算命令の第１の形式に応答して、部分複素数乗算演算は、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの対応する実数要素との積を含む第１の積、および第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの対応する虚数要素との積を含む第２の積で実行され、
複素数乗算命令の第２の形式に応答して、部分複素数乗算演算は、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの虚数要素との積を含む第１の積、および第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの実数要素との積を含む第２の積で実行され、
複素数乗算命令の第１および第２の形式のうちの１つに応答して、部分複素数乗算演算は、宛先ベクトルの少なくとも１つの実数要素を含む前記少なくとも１つのターゲット要素で実行され、
複素数乗算命令の第１および第２の形式のうちの他方に応答して、部分複素数乗算演算は、宛先ベクトルの少なくとも１つの虚数要素を含む前記少なくとも１つのターゲット要素で実行され、そして、
複素数乗算命令の第１および第２の形式のうちの少なくとも１つに応答して、前記少なくとも１つのターゲット要素以外の宛先ベクトルの少なくとも１つの要素を更新するステップは抑制される。
【０００７】
少なくとも一部の例は、上述した装置に対応する命令実行環境を提供するようにホストデータ処理装置を制御するプログラム命令を含む仮想マシンコンピュータプログラムを提供する。
【０００８】
仮想マシンコンピュータプログラムを格納したコンピュータ可読な記憶媒体を提供することもできる。記憶媒体は、非一時的な記憶媒体であってもよい。
【０００９】
本技術のさらなる態様、特徴および利点は、添付の図面と併せて読まれるべき以下の実施例の説明から明らかになるであろう。
【図面の簡単な説明】
【００１０】
【図１】ベクトル命令の実行をサポートするデータ処理装置の一例を概略的に示す。
【図２】ベクトル命令を使用して２つの複素数を乗算する別の手法を示す比較例である。
【図３】複素数乗算命令の第１の形式および第２の形式を使用して２つの複素数を乗算する例を示す。
【図４】複素数共役乗算を計算する命令の第１および第２の形式を使用する例を示す。
【図５】複素数乗算命令の第１および第２の形式の第２のバージョンを概略的に示す。
【図６】複素数の実数部または虚数部を表すベクトルの実数および虚数要素を割り当てる様々な例を示す。
【図７】宛先ベクトルのターゲット要素を生成するための切り捨てを実行する方法を示す。
【図８】宛先ベクトルのターゲット要素を生成するための切り捨てを実行する別の方法を示す。
【図９】複素数乗算命令の要素拡大型変形を示す。
【図１０】命令の要素拡大型変形に応答して切り捨てを実行する代替方法を示す。
【図１１】命令の要素拡大型変形に応答して切り捨てを実行する別の代替方法を示す。
【図１２】ベクトル予測命令をベクトル命令に先行させることによってベクトル命令の予測を制御する例を概略的に示す。
【図１３】ベクトル化されたループの処理中に予測を制御する例を概略的に示す。
【図１４】ベクトル命令の実行のそれぞれのビートをオーバーラップさせる例を示す。
【図１５】ベクトル命令の実行のそれぞれのビートをオーバーラップさせる例を示す。
【図１６】ベクトル命令の実行のそれぞれのビートをオーバーラップさせる例を示す。
【図１７】複素数乗算命令を処理する方法を示すフロー図である。
【図１８】使用可能な仮想マシン実装を示す。
【００１１】
一部の特定例を以下に説明する。本発明はこれらの特定例に限定されないことが理解されよう。
【００１２】
データ処理装置は、第１および第２オペランドベクトルに対する部分複素数乗算演算を実行して宛先ベクトルの少なくとも１つのターゲット要素を第１の積および第２の積の加算または減算結果に依存する値に設定するように処理回路を制御するための複素数乗算命令のデコードをサポートする命令デコーダを有する。第１および第２のオペランドベクトルならびに宛先ベクトルの各々は、複素数の実数部を表す少なくとも１つの実数要素と、複素数の虚数部を表す少なくとも１つの虚数要素とを含む複数のデータ要素を含む。
【００１３】
複素数乗算命令には２つの形式が用意されている。どちらの形式も、宛先ベクトルの少なくとも１つのターゲット要素を、第１の積および第２の積の加算または減算結果に依存する値に設定する。複素数乗算命令の第１の形式の場合、命令デコーダは、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの対応する実数要素との積を含む第１の積、および第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの対応する虚数要素との積を含む第２の積で部分複素数乗算演算を実行するように処理回路を制御する。複素数乗算命令の第２の形式の場合、第１の積は第１のオペランドベクトルの実数要素と第２のオペランドベクトルの虚数要素との積を含み、第２の積は第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの実数要素との積を含む。複素数乗算命令の第１および第２形式のうちの１つは、宛先ベクトルの少なくとも１つの実数要素を含むターゲット要素を有し、他方は宛先ベクトルの少なくとも１つの虚数要素をターゲットとする。複素数乗算命令の第１および第２の形式のうちの少なくとも１つは、少なくとも１つのターゲット要素以外の宛先ベクトルの少なくとも１つの要素の更新を抑制する。
【００１４】
この手法にはいくつかの利点がある。第１に、複素数の実数部および虚数部がベクトルの各要素によって表される専用の複素数乗算命令を提供することは、（ａ＋ｉｂ）（ｃ＋ｉｄ）の形式の乗算が、より少ない命令を使用して、かつ乗算の個々の項（例えばａｃ、ｉｂｃ、ｉａｄ、−ｂｄ）を、累算して最終結果にする前に一時的に記憶するために非常に多くのベクトルレジスタを割り当てる必要なく計算されるので、従来のベクトル乗算命令のみをサポートするシステムと比較して性能を高め、レジスタ圧力を低減することができる。メモリのスピルおよびフィルの必要性が減り、それによりパフォーマンスが大幅に向上するので、比較的低電力の実装ではこの減少したレジスタ圧力は重要な要素になる可能性がある。また、複素数乗算命令の第１および第２の形式（そのうちの１つが宛先の実数要素をターゲットとし、他方が虚数要素をターゲットとする）を提供することにより、２つの命令および２つのベクトルレジスタ読み出しポートを使用するだけで完全な複素数乗算結果を計算することができる。第３のレジスタ読み出しポートを実装する必要性を回避することにより、比較的低電力の実装でかなり大きな回路面積と省電力とを提供することができる。
【００１５】
簡略化のために、命令の第１／第２形式のそれぞれの第１および第２の積は、以下のように称する。
・Ｒ＊Ｒ−命令の第１の形式の第１の積であり、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの実数要素との積に対応する。
・Ｉ＊Ｉ−命令の第１の形式の第２の積であり、第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの虚数要素との積に対応する。
・Ｒ＊Ｉ−命令の第２の形式の第１の積であり、第１のオペランドベクトルの実数要素と第２のオペランドベクトルの虚数要素との積に対応する。
・Ｉ＊Ｒ−命令の第２の形式の第２の積であり、第１のオペランドベクトルの虚数要素と第２のオペランドベクトルの実数要素との積に対応する。
【００１６】
複素数乗算命令の第１および第２の形式は、例えば、異なるオペコードを使用することによって、または命令が第１の形式であるか第２の形式であるかを指定するための命令コード化に別のパラメータを提供することによって、どのような方法でも区別することができる。
【００１７】
ベクトルが実数要素と虚数要素とに分割される特定の方法は、所与のプロセッサ実装に対して任意に選択できる実装選択である。ベクトルの実数要素または虚数要素に格納された数値は、それらの要素が複素数の実数または虚数の要素であるかどうかを識別する必要はないことに留意されたい。ベクトル要素は、１の倍数（実数要素の場合）またはｉの倍数（虚数要素の場合）を表す数値を格納するだけであってもよい。しかし、処理回路のハードウェアは、ベクトル内の適切な位置から実数／虚数要素を読み取り、上述した様々な積によって実数／虚数要素を結合し、命令が第１の形式であるか第２の形式であるかによって宛先の実数要素または虚数要素に値を入れる回路配線を含むことができる。したがって、要素が実数／虚数要素であるかどうかは、ベクトル自体に格納された値ではなく、積を計算するための処理回路に設けられたハードウェア相互接続の観点で反映される。複素数乗算命令を使用してプログラムを書いたりコンパイルしたりする場合、複素数の実数要素および虚数要素を表す適切な値を入力オペランドの実数および虚数要素に代入し、宛先ベクトルの結果を適切に解釈するのはプログラマまたはコンパイラ次第であり得る。したがって、「実数」および「虚数」という用語は、要素の第１のサブセットおよび要素の第２のサブセットの単純にラベルと見なすことができる。
【００１８】
処理回路は、１つのベクトル内で異なるデータ要素サイズをサポートすることができる。例えば、１２８ビットのベクトルは、２個の６４ビットデータ要素、４個の３２ビットデータ要素、８個の１６ビットデータ要素、または１６個の８ビットデータ要素に分割することができる。処理回路は、複素数乗算命令に関連するパラメータに基づいてデータ要素の数を決定することができ、パラメータは、命令コードでは即値として、またはパラメータを含むレジスタを示す値として指定することができる。パラメータは、データ要素の数、またはデータ要素の幅（要素あたりのビット数）、またはデータ要素の数を決定できる他の任意の値のいずれかを示すことができる。
【００１９】
したがって、複素数乗算命令が２つの要素のみを含むベクトル上で動作する場合、ベクトルは１つの実数要素および１つの虚数要素のみを有することができる。他の実行例では、ベクトルは３つ以上のデータ要素を有することができ、この場合、ベクトルに実数／虚数要素を配置する様々な方法がある。実数／虚数要素がベクトル内でインタリーブされることは特に有用である。例えば、実数要素は偶数要素であり、虚数要素は奇数要素であり、逆もまた同様である。実数要素および虚数要素をインタリーブすることにより、複素数乗算命令の第１および第２形式によって加算または減算されるそれぞれの積を形成するための乗算が、２つ以上のベクトルレーンにまたがるより長いクロスレーン信号パスを必要とするのではなく、同じベクトルレーン内にあるかすぐ隣のベクトルレーンにのみ交差することのどちらかに制限され得るので、ハードウェア設計がより効率的になる。
【００２０】
入力ベクトルに２つ以上の実数要素および２つ以上の虚数要素がある場合、複素数乗算命令は、処理回路をトリガして、宛先ベクトルの２つ以上のターゲット要素を設定することができ、各ターゲット要素は第１のオペランドベクトルの実数／虚数要素のそれぞれのペアと、第２のオペランドベクトルの実数／虚数要素のそれぞれのペアを使用して計算される第１／第２の積の和／差に対応する。例えば、実数／虚数要素がインタリーブされている場合、隣接する２つの要素（１つの実数要素および１つの虚数要素）の各レーンは、第１／第２オペランドベクトル内の対応するレーンの実数要素および虚数要素の処理結果に基づいて設定されたターゲット要素（実数要素または虚数要素のいずれか）を有することができる。
【００２１】
上述したように、複素数乗算命令の第１および第２の形式のうちの１つは、宛先ベクトルの実数要素をターゲットとし、他方は虚数要素をターゲットとし、第１の形式はＲ＊ＲおよびＩ＊Ｉの和または差を計算し、第２の形式はＲ＊ＩおよびＩ＊Ｒの和または差を計算する。完全な複素数乗算は、通常、Ｒ＊Ｒ、Ｉ＊Ｉ、Ｒ＊ＩおよびＩ＊Ｒのそれぞれの１つを計算することを必要とするため、同じソースレジスタを指定し、同じ宛先レジスタをターゲットとする、各形式の１つの命令を含む命令のペアを実行することによって、完全な複素数乗算演算を実行して、実数部および虚数部の両方を含む複素数結果を生成することができる。複素数乗算命令の２つの形式が実行される順序は、どちらの方法でも複素数の両方の部分が計算されるため、特に重要ではない。しかし、２番目に実行される複素数乗算命令の第１および第２形式のうちの１つは、先行する複素数乗算命令の結果を上書きすることを避けるために、設定されているターゲット要素以外の目的ベクトルの少なくとも１つの要素の更新を抑制することができる。したがって、複素数乗算命令の第１および第２の形式のうちの少なくとも１つは、処理回路をトリガして、ターゲット要素以外の宛先ベクトルの少なくとも１つの非ターゲット要素の更新を抑制することができる。命令の第１および第２の形式のうちの一方のみがこの更新の抑制を引き起こす場合、プログラマまたはコンパイラは、同じ複素数積の異なる部分を計算するための第１／第２形式の複素数乗算命令のペア内で非ターゲット要素の更新を抑止する形式が２番目に実行されることを保証しなければならない。しかし、複素数乗算命令の第１および第２の形式の両方が処理回路をトリガして非ターゲット要素の更新を抑止する場合、より大幅な柔軟性が提供され、プログラマ／コンパイラは、どの順序ででも命令の第１／第２の形式を自由にコーディングすることができる。
【００２２】
一部の例は、処理回路が、宛先ベクトルの特定の部分に関連する演算のマスキングを制御するための予測情報に応答するベクトル演算の予測をサポートすることができる。これは例えばｉｆ−ｔｈｅｎ型の条件付き演算を実装するのに有用であり得る。予測を提供するにはいくつかの方法がある。例えば、一部のシステムは、ベクトル命令の前に実行して比較条件の結果を評価し、かつ比較結果に基づいてベクトルのどの部分をマスクすべきかを指定する予測情報を設定する予測命令をサポートすることができる。また、一部のシステムは、他の命令の一部のベクトルレーンをマスキングするための予測情報を設定するために書き込むことができるいくつかの一般的な予測レジスタを提供してもよく、この場合、予測されるベクトル命令は、予測レジスタのうちのどれが命令を予測するかを示すパラメータを有していてもよい。もう１つの手法は、ループによって処理されるデータ要素の総数がベクトル長の正確な倍数ではない場合、ベクトル化されたループの実行時に、ループの最終反復に到達したときにベクトルのいくつかのレーンを部分的に予測することをサポートするシステムを指す。
【００２３】
予測が実行される方法に関係なく、宛先ベクトルの非ターゲット要素の更新を抑制する複素数乗算命令の形式の場合、この抑制は、その非ターゲット要素に対応する宛先ベクトルの一部がマスクされる部分であることを予測指示が識別しているかどうかにかかわらず起こり得る。この予測は、複素数乗算命令に応答してターゲット要素が実際に更新されるかどうかに影響を及ぼす可能性があるが、たとえ宛先ベクトルの対応する部分がマスクされるべきではないことを予測指示が識別していても、更新を抑制される非ターゲット要素は、複素数乗算命令に応答して更新されない。
【００２４】
複素数乗算命令のいくつかの変形が提供され得る。これらの変形の各々は上述の第１の形式および第２の形式の両方を有し、第１の形態および第２の形態は、実数要素および虚数要素の一方または他方をそれぞれターゲットとする。
【００２５】
例えば、命令デコーダは、第１および第２の積が加算されてターゲット要素に設定される値を生成する加算変形と、第１および第２の積が減算される減算変形をサポートすることができる。これは、形式（ａ＋ｉｂ）（ｃ＋ｉｄ）の標準複素数乗算、および形式（ａ−ｉｂ）（ｃ＋ｉｄ）の複素数共役乗算の両方を実行するのに非常に有用である。例えば、標準複素数乗算は、第１の形式の減算変形複素数乗算命令と第２の形式の加算変形複素数乗算命令とを使用して実施することができる。複素数共役乗算演算は、第１の形式の加算変形複素数乗算命令と第２の形式の減算変形複素数乗算命令とを使用して実施することができる。複素数乗算命令の加算および減算変形は、異なるオペコードを有するか、またはそれらの命令コード化の別のパラメータによって区別することができる。
【００２６】
命令デコーダはまた、複素数乗算命令の第１（非転置）のバージョンおよび第２（転置）のバージョンをサポートすることができ、これらは、第１および第２の形式のどちらが宛先ベクトルの実数要素をターゲットとし、どちらが虚数要素をターゲットとするかという点で異なる。
【００２７】
非転置バージョンの場合、第１の形式は、宛先ベクトルの少なくとも１つの実数要素をターゲットとし、第２の形式は、少なくとも１つの虚数要素をターゲットとする。したがって、第１の形式は、１つ以上の実数要素をＲ＊ＲとＩ＊Ｉの和または差に対応する値に設定し、第２の形式は、１つ以上の虚数要素をＲ＊ＩとＩ＊Ｒの和または差に対応する値に設定する。これにより、（ａ±ｉｂ）＊（ｃ＋ｉｄ）の形式の従来の複素数乗算が計算される。
【００２８】
一方、転置バージョンでは、第１の形式は、少なくとも１つの虚数要素をターゲットとし、第２の形式は、宛先ベクトルの少なくとも１つの実数要素をターゲットとする。したがって、第１の形式は、１つ以上の虚数要素をＲ＊ＲとＩ＊Ｉの和または差に対応する値に設定し、第２の形式は、１つ以上の実数要素をＲ＊ＩとＩ＊Ｒの和または差に対応する値に設定する。これにより、２つの複素数に追加係数±ｉが乗算される、±ｉ＊（ａ±ｉｂ）＊（ｃ＋ｉｄ）の形式の乗算が計算される。これは、ベクトルの実数／虚数要素を転置して複素数乗算結果に±ｉを乗算する命令を追加する必要がないため、一部のＤＳＰアルゴリズムでは有用であり得る。
【００２９】
一部の実装では、命令デコーダは、第１の（非転置）バージョンまたは第２の（転置）バージョンのみを実装することができるが、他の実装では第１および第２のバージョンの両方に対する命令デコーダサポートがあってもよい。
【００３０】
複素数乗算命令の他の変形例は、整数／固定小数点演算を使用して積および和／差が計算される整数または固定小数点変形、および浮動小数点演算によって積および和／差が計算される浮動小数点変形を含むことができる。浮動小数点の変形例では、第１／第２のオペランドベクトルおよび宛先ベクトルの各要素は、所与の浮動小数点形式、例えば、ＩＥＥＥによって定義されるような倍精度、単精度または半精度の浮動小数点形式で表される。場合によっては、異なる浮動小数点形式に対応する命令の様々な変形を提供することができる。
【００３１】
宛先ベクトルと比較して、第１および第２のオペランドベクトルのデータ要素の相対的なサイズの点で異なる、様々な形式の命令が存在してもよい。要素拡大型変形は、より広いＫビットデータ要素（例えば、Ｋは２＊Ｊであってもよい）を有する宛先ベクトルを生成するために、Ｊビットデータ要素を有する第１および第２のオペランドベクトルに作用し得る。第１／第２の積を生成するための乗算はより広いデータ値をもたらすので、この手法は、最終結果において保持される積の精度をあげることを可能にする。実際には、Ｊビット値の２つの積を生成し、その積を加算または減算すると、通常、（２Ｊ＋１）ビット値が得られるので、これをＫビット（２Ｊビット）値に減らす場合、ビットを破棄することによる切り捨てを必要とすることがある。１つの手法は、中間値の最上位Ｋビットを選択し、最下位ビットを破棄することであってもよい。しかし、２Ｊ＋１ビット（Ｋ＋１ビット）の中間値の最上位ビットは、ほとんどの場合、冗長ビットになるが、これは、乗算される元の値のすべてが最大可能な大きさを持つ場合に限り、第１および第２の積の和または差が、上位ビットにオーバーフローするだけであるからである。したがって、別の手法では中間値の最上位ビットを破棄し、最下位Ｋビットを切り捨て結果として選択することができ、これにより最下位ビットを保持することができ、精度を維持するために有用な情報を提供する可能性が高くなる。
【００３２】
宛先ベクトルが第１および第２のオペランドベクトルのＪビットデータ要素と同じサイズのＪビットデータ要素を有する、複素数乗算命令の要素サイズ保持型変形を提供することもできる。ここでも、第１および第２の積を加算または減算した結果に対応する中間値の切り捨てが必要となることがある。ここでもやはり、切り捨ては中間値の最上位Ｊビットを使用するか、最上位ビットが冗長ビットである可能性が高いので、最上位ビットを無視して次の最上位Ｊビットを選択することができる。
【００３３】
切り捨てを実行するとき、選択されたＪビットよりも低いビットを単に破棄すると、結果の大きさを系統的に減少させる傾向があるため、複素数乗算のシーケンスの結果にバイアスが生じる可能性がある。バイアスを低減するために、中間値を切り捨てる場合、選択されたＪビットは、選択されたＪビットよりも中間値の少なくとも１つ下位のビットに基づいて丸められてもよい（例えば、Ｊビットを選択する前に、切り捨てられた値を、Ｊビットを使用して表現可能な２Ｊ＋１中間結果の最も近い値に効果的に丸めるために、選択されたＪビットの最下位ビットに対応する中間値のビット位置に最上位の破棄されたビットのビット値を加えることによる）。
【００３４】
一部のシステムは、ベクトル命令全体の並列処理をサポートすることができ、結果ベクトルの各要素は並列に生成される。しかし、一部の低電力実装では、宛先ベクトルのすべての要素を並列に計算するのに十分なハードウェアがないこともある。一部の実施態様では、所与のベクトル命令に応答して、処理回路は複数の処理のビートを実行してもよく、各ビートはベクトル値の一部に対応し、処理回路は、第１および第２のベクトル命令のオーバーラップ実行をサポートすることができ、ここで第２のベクトル命令のビートの第１のサブセットは、第１のベクトル命令のビートの第２のサブセットと並列に実行される。ビートは、ベクトルのある一定のサイズの部分に対応してもよく、これはデータ要素の大きさとは無関係であってもよい。複数のベクトル命令の実行をオーバーラップさせると、ハードウェアリソースの利用率を高めることができる。実行のオーバーラップ性質は、システム上で実行されている例外ハンドラなどのソフトウェアやデバッガから見ることができる。このようなオーバーラップ実行は、上述した形式の複素数乗算命令にも使用することができる。
【００３５】
図１は、ベクトル命令の処理をサポートするデータ処理装置２の一例を概略的に示す。これは、説明を容易にするための簡略化された図であり、実際には、装置は、簡潔さのために図１に示されていない多くの要素を有することが理解されよう。装置２は、命令デコーダ６によってデコードされた命令に応答してデータ処理を実行するための処理回路４を含む。プログラム命令はメモリシステム８からフェッチされ、命令デコーダによってデコードされ、命令セットアーキテクチャによって定義された方法で命令を処理するように処理回路４を制御する制御信号を生成する。例えば、デコーダ６は、デコードされた命令のオペコードおよび命令の任意の追加の制御フィールドを解釈して、処理回路４に適切なハードウェアユニットを起動させて、算術演算、ロード／格納演算、または論理演算などの演算を実行させる制御信号を生成することができる。この装置は、処理回路４によって処理されるデータ値および処理回路の動作を構成するための制御情報を格納するためのレジスタのセット１０を有する。算術または論理命令に応答して、処理回路４は、レジスタ１０からオペランドを読み出し、命令の結果をレジスタ１０に書き戻す。ロード／格納命令に応答して、データ値は、処理ロジックを介してレジスタ１０とメモリシステム８との間で移動される。メモリシステム８は、メインメモリだけでなく、１つ以上のレベルのキャッシュを含むことができる。
【００３６】
レジスタ１０は、単一のデータ要素を含むスカラー値を格納するためのいくつかのスカラーレジスタを含むスカラーレジスタファイル１２を含む。命令デコーダ６および処理回路４によってサポートされる一部の命令は、スカラーレジスタ１２から読み出されたスカラーオペランドを処理して、スカラーレジスタに書き戻されるスカラー結果を生成するスカラー命令である。
【００３７】
レジスタ１０はまた、複数のデータ要素を含むベクトル値をそれぞれ格納するいくつかのベクトルレジスタを含むベクトルレジスタファイル１４を含む。ベクトル命令に応答して、命令デコーダ６は、処理回路４を制御して、ベクトルレジスタ１４の１つから読み出されたベクトルオペランドの各要素に対してベクトル処理のいくつかのレーンを実行し、スカラーレジスタ１２に書き込まれるスカラー結果またはベクトルレジスタ１４に書き込まれるさらなるベクトル結果のいずれかを生成する。一部のベクトル命令は、１つ以上のスカラーオペランドからベクトル結果を生成することができ、またはベクトルレジスタファイル１４から読み出されたベクトルオペランドに対するベクトル処理のレーンだけでなく、スカラーレジスタファイルのスカラーオペランドに対する追加のスカラー演算を実行することができる。したがって、一部の命令は、１つ以上のソースレジスタおよび命令の宛先レジスタの少なくとも１つがベクトルレジスタ１４であり、１つ以上のソースレジスタおよび宛先レジスタのもう１つがスカラーレジスタ１２である混合スカラーベクトル命令であってもよい。ベクトル命令はまた、データ値をベクトルレジスタ１４とメモリシステム８内の位置との間で移動させるベクトルロード／格納命令を含むことができる。ロード／格納命令は、メモリ内の位置がアドレスの連続範囲に対応する連続ベクトルロード／格納命令、またはいくつかの離散アドレスを指定するスキャッタ／ギャザー型ベクトルロード／格納命令を含ことができ、これは、これらのアドレスの各々からのデータをベクトルレジスタの各要素にロードするか、またはベクトルレジスタの各要素からのデータを離散アドレスに格納するように処理回路４を制御する。
【００３８】
処理回路４は、様々なデータ要素サイズの範囲を有するベクトルの処理をサポートすることができる。例えば、１２８ビットのベクトルレジスタ１４は、例えば１６個の８ビットデータ要素、８個の１６ビットデータ要素、４個の３２ビットデータ要素、または２個の６４ビットデータ要素に分割することができる。レジスタバンク１０内の制御レジスタは、使用されている現在のデータ要素サイズを指定してもよく、あるいはこれは、実行される所与のベクトル命令のパラメータであってもよい。
【００３９】
レジスタバンク１０はまた、処理回路４の動作を制御するための制御情報を格納するレジスタを含む。制御レジスタは、現在の実行点に対応する命令のアドレスを示すプログラムカウンタレジスタ、例外の処理時にレジスタ状態を保存／復元するためのスタックデータ構造のメモリシステム８内の場所のアドレスを示すスタックポインタレジスタ、関数の実行後に処理を分岐させる関数戻りアドレスを格納するリンクレジスタなどのレジスタを含んでいてもよい。これらは簡潔さのために図１には示されていない。
【００４０】
図１に示すように、レジスタは、また、ベクトル化されたループの進行を追跡するためのループカウンタ１６、現在処理中のベクトル内の各データ要素のビット数を示すパラメータを格納する要素サイズレジスタ１８、１つのベクトルレジスタ内の総ビット数を示すパラメータを格納するベクトル幅レジスタ２０、ベクトル演算の予測を制御するベクトル予測レジスタ２２を含む。これらについては、以下でより詳細に説明する。一部の例では、ベクトル幅レジスタ２０は、所与のデバイスのベクトルレジスタ１４に実装された特定のベクトル幅に依存して、装置の製造中は固定であってもよい。あるいは、ベクトルレジスタファイル１４が様々なベクトル幅を有する様々な構成をサポートする場合、ベクトル幅レジスタ２０は、使用されている現在の幅を示すようにプログラム可能である。同様に、要素サイズレジスタ１８は、特定の要素サイズが常に所与の装置に使用されている場合は固定であるか、装置が異なるデータ要素サイズのベクトルでの処理をサポートする場合は変数であり得る。一部の例では、例えば各ベクトル命令がその命令に使用される要素サイズを指定する場合、要素サイズレジスタ１８は省略されてもよい。ループカウンタ１６は専用の制御レジスタとして示されているが、他の例では、ベクトル化されたループの進行を追跡するために汎用スカラーレジスタ１２の１つを使用することができる。
【００４１】
複素数の実数部および虚数部がベクトルレジスタにインタリーブされた複素数演算を実行するための命令は、性能を向上させ、レジスタ圧力を下げることができる。比較的少数のベクトルレジスタしか持たない実装（例えば、一部のハードウェアシステムは８個のベクトルレジスタを提供するだけのこともある）では、処理されるすべての値を収容するのに十分なレジスタがない場合、レジスタ内容をメモリに流出させ、後でレジスタファイルに値を読み戻すための追加のロード／格納演算が必要になる可能性があるので、レジスタ圧力はプロセッサ全体の性能において重要な要素となり得る。例えば、８個のベクトルレジスタを有するシステムでは、命令デコーダ内の複素数演算サポートがないと、標準ベクトル乗算命令は、レジスタ流出なしで基数２のＦＦＴを実現するだけであるが、複素数演算サポートがあると、レジスタ流出なしで基数４のＦＦＴを実現できる。結果として、複素数算術命令を追加することによって得られる全体的なスピードアップは、Ｑ３１のＦＦＴで最大５６％になる。
【００４２】
しかし、複素数乗算命令が実施される特定の方法は、性能、回路面積および電力消費に影響を及ぼす可能性がある。図２は、代替手法による複素数乗算命令を使用した比較例を示す。図２の上部に示すように、２つの複素数ａ＋ｉｂとｃ＋ｉｄとを乗算するには、積項ａｃ、ｉｂｃ、ｉａｄ、−ｂｄを生成するために４回の乗算が必要であるため、多くの場合、１つのベクトル命令で複素数乗算を実装するのは現実的ではない。図２に示す手法では、最初にＶＭＯＶ命令が実行され、累算器ベクトルレジスタＱ０がゼロにクリアされる。次に、２つの複素数乗算ベクトル命令が実行され、それぞれが累算器レジスタＱ０および２つの入力オペランドベクトルＱ１、Ｑ２を入力としてとる。ベクトルレジスタＱ０、Ｑ１、Ｑ２のそれぞれは、複素数の実数部を表現する実数要素（Ｒ）として割り当てられた偶数要素０、２を有し、奇数要素１、３は複素数の虚数部を表すための虚数要素（Ｉ）として割り当てられている。隣接する実数／虚数要素０、１および２、３のペアはそれぞれ異なる複素数を表し、例えばベクトルＱ１の要素０、１は複素数ａ０＋ｉｂ０を表し、ベクトルＱ１の要素２、３は別の複素数ａ１＋ｉｂ１を表す。同様に、Ｑ２レジスタは、レジスタＱ１の対応する内容で乗算される対応する複素数ｃ０＋ｉｄ０およびｃ１＋ｉｄ１を表す。複素数乗算命令の第１の命令ＶＣＭＬＡは、図２の上部に示される和の最初の２つの項ａｃ、ｉｂｃを計算し、その結果を累算器レジスタＱ０に累算する。同様に、第２の複素数乗算命令は、図２に示す和の第３項および第４項ｉａｄ、−ｂｄを計算し、これらを累算器レジスタＱ０に累算する。最終累算器値において、隣接する実数／虚数要素の各ペアは、Ｑ１、Ｑ２の対応する部分によって表される複素数の積に対応する複素数値を表す。
【００４３】
より大規模な実装では、例えば、この手法はアウトオブオーダ・プロセッサにとってより効率的になり得るので、この手法はいくつかの利点を持ち得る。しかし、低消費電力の実装では、いくつかの欠点がある。第１に、累算器レジスタＱ０をゼロにするために追加の命令が必要とされ、メモリ内のコード密度を低下させ、性能を低下させる。また、各ベクトル乗算命令は、それらの結果を累算器レジスタＱ０に累算するので、３つの入力ベクトル（累算器レジスタＱ０の古い値および２つの入力ベクトルＱ１、Ｑ２）を必要とする。したがって、第３のベクトルレジスタ読み出しポートが必要である。比較的小規模な実装では、２つ以上のベクトル読み出しポートを必要とする命令は他にないので、１つのタイプの命令のためだけに第３のレジスタ読み出しポートを追加する領域および電力コストを正当化するのは非常に困難である。
【００４４】
これは、図３に示す形式の命令を使用することで回避できる。図３の上部の和に示すように、複素数乗算は、結果の実数部が１つの命令によって計算され、虚数部が別の命令によって計算されるようにリファクタリングされる。命令の第１および第２の形式が提供され、そのうちの１つは宛先ベクトルの実数要素をターゲットとし、他方は虚数要素をターゲットとする。隣接するベクトルレーンの各ペアにおいて、命令の第１の形式（以下の例では「Ｘ」なしの命令ニーモニックによって示される）は、第１の積ａｃ（Ｒ＊Ｒ）および第２の積ｂｄ（Ｉ＊Ｉ）を生成し、第１および第２の積を加算または減算し、その結果を対応するターゲット要素（この例では実数要素）に書き込む。一方、隣接するベクトルレーンの各ペアについて、命令の第２の形式（「Ｘ」を有する命令ニーモニックによって示される）は、第１の積ａｄ（Ｒ＊Ｉ）および第２の積ｂｃ（Ｉ＊Ｒ）を生成し、第１および第２の積を加算または減算し、その結果を対応するターゲット要素（この例では虚数要素）に書き込む。各命令は要素の半分に書き込むため、命令の２つの形式が実行された後、レジスタ全体が書き込まれており、最初にレジスタをゼロにする必要はない。さらに、命令の各形式のターゲット要素には、必要なすべての積が含まれているため、以前の結果に累算する必要がなく、第３のレジスタ読み出しポートと累算器をクリアするための追加の命令との必要性は回避できる。
【００４５】
命令の加算および減算変形を提供する。加算変形（ニーモニックＶＭＭＬＡＤまたはＶＭＭＬＡＤＸで示される）では、第１／第２の積が追加されて、対応するターゲット要素が形成される。減算変形（ニーモニックＶＭＭＬＳＤまたはＶＭＭＬＳＤＸによって示される）では、第１／第２の積が減算されて、対応するターゲット要素が形成される。したがって、図３では、第１の形式の減算変形命令（ＶＭＭＬＳＤ）が実行され、レジスタＱ０の要素０（実数要素）を、レジスタＱ１、Ｑ２の対応する部分の値ａ０＋ｉｂ０およびｃ０＋ｉｄ０の複素数積の実数部を表す値ａ０ｃ０−ｂ０ｄ０に設定し、同様にレジスタＱ０の要素２（実数要素）を値ａ１ｃ１−ｂ１ｄ１に設定する。第２の形式の加算変形命令ＶＭＭＬＡＤＸも実行され、レジスタＱ０の要素１（虚数要素）を、レジスタＱ１、Ｑ２の値ａ０＋ｉｂ０およびｃ０＋ｉｄ０の複素数積の虚数部を表す値ａ０ｄ０＋ｂ０ｃ０に設定し、同様にレジスタＱ０の要素３（虚数要素）を値ａ１ｄ１＋ｂ１ｃ１に設定する。
【００４６】
あるいは、図４に示すように、第１の形式の加算変形命令（ＶＭＭＬＡＤ）および第２の形式の減算変形命令（ＶＭＭＬＳＤＸ）を実行することによって、形式ｒ＝（ａ−ｉｂ）（ｃ＋ｉｄ）の複素数共役乗算を計算することができる。したがって、第１の形式は、Ｒ＊ＲおよびＩ＊Ｉ積の和に基づいて、宛先ベクトルＱ０の実数要素をターゲットとし、第２の形式は、Ｒ＊ＩおよびＩ＊Ｒ積の差に基づいて、虚数要素をターゲットとする。
【００４７】
図３および図４の両方の例では、命令は、第１のバージョン（「Ｔ」なしの命令ニーモニックで示される非転置バージョン）であり、命令の第１の形式は宛先レジスタＱ０の実数要素をターゲットとし、第２の形式は虚数要素をターゲットとする。
【００４８】
しかし、図５に示すように、命令の第１の形式が虚数要素をターゲットとし、第２の形式が実数要素をターゲットとする、これらの命令の第２のバージョンも提供され得る。第２のバージョンは、「Ｔ」を含む命令ニーモニックによって示される転置バージョンである。したがって、今回は、宛先レジスタＱ０の実数要素はＲ＊ＩおよびＩ＊Ｒの積に基づいて設定され、虚数要素はＲ＊ＲおよびＩ＊Ｉの積に基づいて設定される。図５に示すように、これは±ｉ＊（ａ＋ｉｂ）＊（ｃ＋ｉｄ）という形式の計算を評価するのに役立ち得る。それ以外は、図５の動作は図３および図４の動作と同様である。
【００４９】
第１／第２の形式の複素数乗算命令の一方または両方に応答して、命令デコーダ６は、非ターゲット要素の更新を抑制するように処理回路４を制御し、先行する命令の結果を上書きしないようにする。第１／第２の形式のうちの１つのみが非ターゲット要素の更新の抑制をトリガする場合、その命令は命令のペアのうち２番目に実行されるべきである。しかし、両方の形式が非ターゲット要素の更新を抑制する場合、命令のペアはどの順序で実行されてもよい。
【００５０】
図３から図５は、実数要素が偶数番目の位置０、２である要素であり、虚数要素が奇数番目の要素１、３である例を示す。しかし、図６に示すように、実数要素および虚数要素は逆であることもあり、虚数要素は偶数番目の要素に対応し、実数要素は奇数番目に対応する。図６の上部２つの例に示すように、図３から図５に示すすべての乗算が、２つ以上のレーンにわたる乗算を必要とするのではなく、隣接するベクトルレーンのペア内にとどまるように、実数要素および虚数要素をインタリーブすることは有用であり得る。それにもかかわらず、図６の下部の例に示すように、実数要素および虚数要素を違うように配置することも可能である。
【００５１】
上記のタイプの命令は、複素数乗算演算の結果を計算するのに適しているが、他の目的にも使用できる。実数要素は複素数の実数要素を表すのに適しており、虚数要素は虚数要素を表すのに適しているが、プログラマは同じ命令に対して別の用途を見つけることができる。例えば、図４に示す複素数乗算命令の加算変形を実行することは、隣接レーンの積の和を宛先レジスタの単一要素に累算する比較的簡単な方法であり得るので、一部のプログラマは、実数の何らかの処理のためにもこのタイプの命令を使用することを選択できる。したがって、命令は、複素数演算に使用することのみに限定されない。
【００５２】
図３から図５の例では、命令はデータ要素のサイズを保持するので、宛先レジスタＱ０は入力オペランドＱ１、Ｑ２と同じサイズのデータ要素を有する。しかし、整数／固定小数点演算が使用され、データ要素がそれぞれＪビットを含む場合、Ｊビット要素の２つの積の和は２Ｊ＋１ビットを有するので、指定されたターゲット要素に書き込まれるＪビット値を生成するために切り捨てが実行される。図７は、切り捨てを実行するための第１の手法を示す。この場合、２Ｊ＋１ビットの中間結果［２Ｊ：０］の上位Ｊビット［２Ｊ：Ｊ＋１］がターゲット要素に書き込まれるように選択され、切り捨てが実行され、かつＪビットの結果がターゲット要素に書き込まれる前に、次の最上位ビット位置［Ｊ］のビット値１を中間結果に加算することにより、バイアスを減らすために結果が丸められる。他の形態の丸めも実行できることを理解されたい。
【００５３】
図８は、切り捨てに対する別の手法を示しており、これは、中間結果の最上位ビットを無視し、代わりに、切り捨てを実行するときに中間結果の次のＪ個の最上位ビット［２Ｊ−１：Ｊ］を選択し、次の最上位ビット［Ｊ−１］に基づいて、選択されたビットを丸める。２Ｊ＋１ビットの中間結果の最上位ビット［２Ｊ］がしばしば冗長ビットであるので、多くの場合これによって精度がより高くなり得るが、それは元の入力要素すべてが可能な限り大きな正または負の大きさを持つ場合にのみこのビットが使用されるためである。したがって、ビット［Ｊ］はビット［２Ｊ］よりも「興味深い」結果を含む可能性がより高いので、このビットを最終結果に保持することが好ましい場合がある。この手法では、最上位ビット［２Ｊ］は決して使用されないので、これはハードウェアによって明示的に計算される必要はない（例えば、ハードウェアは、２Ｊ＋１ビット中間結果の下位２Ｊビットを決定するための回路のみを有していてもよい）。（２Ｊ＋１）ビットの中間結果の最上位ビットが（最上位ビットを無視することによって情報が失われないように）常に冗長ビットであることを保証するために、命令セットアーキテクチャは、プログラマまたはコンパイラに、複素数乗算を実行する前にすべての入力値を２で割る（それによって、最上位ビットを必要とする極度の大きさを避ける）ように要求することがあり、複素数乗算の結果が生成されると、その結果に４をかけて、中間結果の最上位ビットが計算されたのと同じ数値結果を与える。
【００５４】
図７および図８は、切り捨ての限界の１桁下にある１つの下位ビットのみを使用して丸めを実行する例を示しているが、多くの下位ビットを考慮した丸め技法を使用することもできる。特に、命令の浮動小数点変形の場合、既知の浮動小数点丸め技術によって追加のビットを考慮することができる。
【００５５】
図９に示すように、要素が入力オペランドＱ１、Ｑ２の要素の２倍の幅を有する宛先ベクトルＱ０を生成する、命令の要素拡大型変形を提供することも可能である。この場合、入力要素の半分だけが結果に影響する可能性がある。複素数乗算命令は、オペランドベクトルＱ１、Ｑ２の要素の上半分または下半分のどちらを使用して宛先を計算すべきかを指定することができる（例えば、図９では、命令はオペランドベクトルの下半分に作用する）。要素拡大型変形では、２Ｊビット幅広データ要素を形成するための２Ｊ＋１ビット中間値の切り捨ては、図１０に示すように（図７と同様に）最上位２Ｊビット［２Ｊ：１］を選択することによって、または図１１に示すように（図８と同様に）最上位ビットを無視して最下位２Ｊビット［２Ｊ−１：０］を選択することによって行うことができる。
【００５６】
上述の例は、入力ベクトルがそれぞれ（２つの実数要素および２つの虚数要素がインタリーブされた）４つのデータ要素を含むことを示しているが、異なる数の要素で命令を実行することもできることを理解されたい。
【００５７】
図１２に示すように、複素数乗算命令は、２つの入力ベクトルＱＡ、ＱＢのそれぞれの要素を比較してそれらが何らかのテスト条件を満たすかどうかを判定し、かつ各比較の結果に応じて、ベクトル予測レジスタ（ＶＰＲ：Ｖｅｃｔｏｒ  Ｐｒｅｄｉｃａｔｉｏｎ  Ｒｅｇｉｓｔｅｒ）２２を設定するベクトル予測命令（ＶＰＴ命令：Ｖｅｃｔｏｒ  Ｐｒｅｄｉｃａｔｉｏｎ  Ｉｎｓｔｒｕｃｔｉｏｎ）を複素数乗算命令より先行させることによって、予測の対象となる。ＶＰＲ２２は、処理回路４がサポートする最小要素サイズの粒度で、ベクトルレジスタの一部にそれぞれ対応するいくつかの予測フラグを含む。例えば、最小要素サイズが８ビットである１２８ビットベクトルレジスタの場合、ベクトルレジスタの８ビットチャンクにそれぞれ対応する１６個の予測フラグを提供することができる。
【００５８】
この例では、テスト条件は、Ｑａの所与の要素がＱｂの対応する要素よりも大きいか等しいかどうかであるが、テスト条件の他の例は、より大きいか等しいか、より小さいか、より小さいか等しいか、等しいか、等しくないか、を含む。この例では、テスト条件はレーン０、１および３では合格したが、レーン２では失敗した。したがって、ＶＰＴ命令に応答して、処理回路４は、レーン２に対応するＶＰＲ２２の一部分の予測フラグを０に設定し、レーン０、１、３に対応するＶＰＲの他の部分の予測フラグを１に設定する。この例のように、ＶＰＴ命令の要素サイズは３２ビット（最小要素サイズの８ビットよりも大きい）であり、４つの隣接する予測フラグのブロックは、それぞれのレーンに対応して０または１に設定される。この例では、０の予測フラグは、ベクトル演算の対応する部分がマスクされるべきであることを示す一方、１は対応する部分がマスクされるべきでないことを示し、他の例は逆のマッピングを使用する。
【００５９】
ＶＰＴ命令に続いて複素数乗算命令が実行される際、処理回路４は、ＶＰＲが０に設定されている対応する予測フラグを有する場合、宛先ベクトルの所与の部分に関連する演算をマスクする。この例では、宛先ベクトルの要素４／５に対応するＶＰＲの部分内の予測フラグが０であるので、これらの要素は複素数乗算命令に応答して更新されない。したがって、複素数乗算命令ＶＭＭＬＳＤの第１の形式は、通常はこの命令がターゲットとする実数要素であるが、ＶＰＲの対応する部分が０であったため、宛先ベクトルＱ０の要素４を更新しない。他の実数要素０、２および６は、ＶＰＲ２２内の１に等しい予測ビットに対応するため、更新される。同様に、命令の第２の形式は、これもＶＰＲによってマスクされるので要素５を更新しないが、依然として虚数要素１、３、７に書き込む。両方の形式の複素数乗算命令では、ＶＰＲ内の対応する値が１であるか０であるかにかかわらず、非ターゲット要素は更新を抑制される。
【００６０】
ＶＰＲの予測ビットが０であるときに、レジスタの所与の部分に関連する演算をマスクすることができるいくつかの方法がある。例えば、マスキングは、宛先レジスタのその部分に格納されている以前の値を保持しながら、宛先レジスタの対応する部分を０にクリアすること、またはその部分に関連する動作が全く実行されない（例えば、メモリからのロード、そのレーンの乗算、加算または減算を実行しない）ように抑制することによって実施することができる。一部の実装では、予測情報に応答して宛先レジスタの一部の部分に対する更新をマスキングするために提供されるハードウェアを再利用して、複素数乗算命令に応答して非ターゲット要素の更新も抑制することができる。しかし、予測とは異なり、非ターゲット要素のこのマスキングは、ＶＰＲ２２の対応する部分の内容にかかわらず、複素数乗算命令に応答して行われる。
【００６１】
図１３は、予測の別の例を示す。ベクトル命令の一般的な用途は、メモリに格納された配列の各要素に特定の一連の動作を適用する必要がある、ベクトル化ループである。高レベルのコード中の要素ごとに１回反復するループは、反復回数の少ないループを含むベクトル化コードにコンパイルすることができ、反復の各々は要素のブロックをベクトルレジスタにロードし、一連のベクトル命令を使用して要素を処理し、各レーンの処理の結果をメモリに戻して格納する。したがって、ループの各反復は、１つのベクトルレジスタ内のデータ要素の数に対応する要素のブロックを処理することができる。処理される配列内の要素の総数がＮＥであり、１つのベクトル内のデータ要素の数がＮＶ（ベクトル幅ＶＷをデータ要素サイズＥＳで割ったものに等しい）の場合、配列全体はＮＥ／ＮＶ反復の最小値において処理される。しかし、多くの場合、要素の総数ＮＥは、１つのベクトル内の要素の数ＮＶの正確な倍数ではない可能性があるので、ループの最後の反復では、ベクトルのすべての要素が、処理されるべき値で埋められるわけではない。未充填レーンでの処理がマスクされずに進行することが許可されると、エラーを引き起こす可能性がある。例えば、配列の終わりを越えるメモリアドレス空間はページテーブルにマップされていない可能性があるので、アレイの末尾を処理する最後の反復で「未使用」レーンの１つに対してロード／格納演算が実行されると、メモリアクセスフォルトまたはアレイに隣接するデータの破損が生じる可能性がある。
【００６２】
したがって、ループの最後の反復において未使用のレーンの演算をマスクすることが望ましい場合がある。図１に示すように、処理回路４には、所与のベクトル化ループのどのレーンがイネーブルまたはマスクされるかを制御するループ予測回路９０が設けられてもよい。ベクトル化ループを開始する際、ループカウンタ１６を、ループ内で処理されるべき要素の総数ＮＥを指定する値に設定することができる。例えば、ループ開始命令は、要素の数を指定することができる。ループの各反復の終わりに、ループカウンタ１６から１つのベクトル内の要素の数ＮＶが減算され、処理されるべき残りの要素の数ＮＥｒｅｍａｉｎｉｎｇが計算される。所定のループ反復を開始する際、ＮＥｒｅｍａｉｎｉｎｇ＜ＮＶである場合、ループ予測回路９０は処理回路４を制御して、例えば、ベクトル処理のレーン自体を抑制する（例えばロード／格納要求が発行されないようにする）、および／またはマスクされたレーンにおける処理結果の書き込みを無効にすることによって、ベクトル処理の上位ＮＶ−ＮＥｒｅｍａｉｎｉｎｇレーンに関連する演算をマスクする。
【００６３】
したがって、ループ予測回路９０が一部のレーンをマスクすべきであると判定したときに複素数乗算命令が反復して実行される場合、これらのマスクされたレーンではターゲット要素（命令の形式およびバージョンに応じて実数または虚数）は更新されない。例えば、図１３において、ループ予測回路９０は、ベクトルのレーン２および３がマスクされるべきであると決定し、そのため、ＶＭＭＬＳＤ命令は、マスクされていないレーンの要素０（実数要素）のみを更新し、マスクされたレーン内の要素２（実数要素）は更新しない。マスクされていないレーン１内の非ターゲット要素（この例では虚数）は、ループ予測回路９０によってレーンが予測されているかどうかにかかわらず、依然として複素数乗算命令によって更新されない。
【００６４】
上記の例は、ベクトルの各レーンでの演算が並列に行われることを示すが、これは必須ではない。
【００６５】
処理回路４は、異なるクラスの命令を処理するためのいくつかの異なるハードウェアブロックを含むことができる。例えば、メモリシステム８と相互作用するロード／格納命令は専用のロード／格納ユニットによって処理され、算術または論理命令は算術論理ユニット（ＡＬＵ）２０４によって処理される。ＡＬＵ自体は、乗算を含む演算を実行するための乗算累算ユニット（ＭＡＣ）と、他の種類のＡＬＵ演算を処理するための別のユニットとにさらに分割されてもよい。浮動小数点命令を処理するために浮動小数点ユニットを提供することもできる。いかなるベクトル処理も含まない純粋なスカラー命令も、ベクトル命令と比較して別個のハードウェアブロックによって、または同じハードウェアブロックを再使用することによって処理できる。
【００６６】
デジタル信号処理（ＤＳＰ）などの一部のアプリケーションでは、ＡＬＵとロード／格納命令との数がほぼ同じであるため、ＭＡＣなどの一部の大きなブロックがかなりの時間アイドル状態になる可能性がある。実行リソースがより高い性能を得るためにベクトルレーンの数でスケーリングされるため、この非効率性は、ベクトル・アーキテクチャ上で悪化する可能性がある。より小さなプロセッサ（例えば、シングルイシュー、インオーダーコア）では、完全にスケーリングされたベクトルパイプラインの領域オーバーヘッドは禁止されることがある。利用可能な実行リソースをより良く使用しながら領域の影響を最小限に抑える手法の１つは、図１４に示すように、命令の実行をオーバーラップさせることである。この例では、３つのベクトル命令は、ロード命令ＶＬＤＲ、乗算命令ＶＭＵＬおよびシフト命令ＶＳＨＲを含み、これらの命令はすべて、それらの間にデータ依存関係があっても同時に実行することができる。これは、ＶＭＵＬの要素１がＱ１の要素１のみに依存し、Ｑ１レジスタ全体ではないため、ＶＬＤＲの実行が終了する前にＶＭＵＬの実行が開始できるためである。命令をオーバーラップさせることにより、乗算器のような高価なブロックをより長く有効に保つことができる。
【００６７】
したがって、マイクロアーキテクチャの実装がベクトル命令の実行をオーバーラップできるようにすることが望ましい場合がある。しかし、アーキテクチャが一定量の命令オーバーラップがあると仮定すると、アーキテクチャによって仮定される命令オーバーラップの量とマイクロアーキテクチャ実装が実際に一致する場合、これは高い効率を提供し得るが、異なるオーバーラップを使用するか全くオーバーラップしない異なるマイクロアーキテクチャにスケーリングされる場合に問題を引き起こす可能性がある。
【００６８】
代わりに、アーキテクチャは、図１５の例に示すように、異なるオーバーラップの範囲をサポートすることができる。ベクトル命令の実行は、「ビート」と呼ばれる部分に分割され、各ビートは、所定のサイズのベクトルの部分の処理に対応する。ビートは、完全に実行されるか、全く実行されないベクトル命令の不可分部分であり、部分的に実行することはできない。１つのビートで処理されるベクトルの部分のサイズはアーキテクチャによって定義され、ベクトルの任意の部分であり得る。図１５の例では、ベクトル幅の４分の１に対応する処理としてビートが定義されているので、ベクトル命令当たり４つのビートがある。明らかに、これは一例に過ぎず、他のアーキテクチャでは、例えば２または８のような異なる数のビートを使用することができる。１つのビートに対応するベクトルの部分は同じサイズとすることができ、処理されるベクトルのデータ要素サイズよりも大きいかまたは小さい。したがって、要素サイズが実装ごとに異なる場合であっても、または異なる命令間の実行時に変化しても、ビートはベクトル処理の一定の固定幅である。１つのビートで処理されるベクトルの部分が複数のデータ要素を含む場合、各要素が独立して処理されることを確実にするために、各要素間の境界でキャリー信号を無効にすることができる。１つのビートで処理されるベクトルの部分が要素の一部のみに対応し、ハードウェアが複数のビートを並列に計算するには不十分である場合、１つのビートの処理中に生成されるキャリー出力は、２つのビートの結果が共にデータ要素を形成するように、処理の次のビートにキャリー入力として入力される。
【００６９】
図１５に示すように、処理回路４の異なるマイクロアーキテクチャの実装は、抽象的なアーキテクチャクロックの１つの「ティック」において異なる数のビートを実行することができる。ここで、「ティック」は、アーキテクチャ状態の進展の単位に対応する（例えば、単純なアーキテクチャでは、各ティックは、次の命令を指すようにプログラムカウンタを更新することを含む、命令を実行することに関連するすべてのアーキテクチャ状態を更新するインスタンスに対応することができる）。パイプライン化のような既知のマイクロアーキテクチャ技術は、単一のティックがハードウェアレベルで実行するために複数のクロックサイクルを必要とする可能性があることを意味し、実際はハードウェアレベルで単一のクロックサイクルが複数の命令の複数の部分を処理する可能性があることを、当業者は理解するだろう。しかし、このようなマイクロアーキテクチャ技術は、ティックがアーキテクチャレベルでは不可分なので、ソフトウェアからは見えない。簡潔さのために、このようなマイクロアーキテクチャは、本開示のさらなる説明では省略する。
【００７０】
図１５の下の例に示すように、一部の実装では、１つのティック内ですべてのビートを並列処理するのに十分なハードウェアリソースを提供することによって、同じティック内でベクトル命令の４つのビートすべてをスケジュールすることができる。これは、より高性能な実装に適している可能性がある。この場合、１つのティック内で命令全体が完了できるので、アーキテクチャレベルで命令間のオーバーラップは必要ない。
【００７１】
一方、より面積効率のよい実装は、１ティックにつき２つのビートのみを処理することができるより狭い処理ユニットを提供することができ、図１５の中間の例に示すように、命令実行は、第２のベクトル命令の第１および第２のビートが第１の命令の第３または第４のビートと並列に実行されてオーバーラップさせることができ、これらの命令は、処理回路内の異なる実行ユニット上で実行される（例えば、図１５で、第１の命令はロード／格納ユニットを使用して実行される格納命令であり、第２の命令はＭＡＣを使用して実行される乗算累算命令である）。
【００７２】
さらにエネルギー／面積効率のよい実装は、一度に１つのビートのみを処理することができる、より狭いハードウェアユニットを提供することができ、この場合、１ティックにつき１ビートが処理され、図１５の上の例に示すように、命令の実行は１ビートだけオーバーラップしてずれる（これは上の図１４の例と同じである）。
【００７３】
図１５に示すオーバーラップはほんの一例であり、他の実装も可能であることが理解されよう。例えば、処理回路４の一部の実装は、同じティック内で複数の命令の並列の二重発行をサポートすることができるので、命令のスループットがより高くなる。この場合、１つのサイクルで一緒に開始する２つ以上のベクトル命令は、次のサイクルで開始する２つ以上のベクトル命令といくつかのビートをオーバーラップさせることができる。
【００７４】
実装ごとにオーバーラップ量を様々な実行点にスケーリングするだけでなく、ベクトル命令間のオーバーラップ量も、プログラム内のベクトル命令の異なる実行インスタンス間で実行時に変更することができる。したがって、処理回路４には、前の命令に対して所与の命令が実行されるタイミングを制御するための回路が設けられてもよい。これにより、マイクロアーキテクチャは、実装が難しい特定のコーナーケースで命令をオーバーラップさせないか、命令で使用可能なリソースに依存するかを自由に選択できる。例えば、同じリソースを必要とする所与のタイプの連続命令（例えば、乗累算）があり、使用可能なすべてのＭＡＣまたはＡＬＵリソースが既に別の命令によって使用されている場合、次の命令を開始するための十分な空きリソースがないかもしれないので、オーバーラップさせるのではなく、第１の命令が完了するまで第２の命令の発行を待つことができる。
【００７５】
図１６に示すように、２つのベクトル命令間のオーバーラップは、介在するスカラー命令がある場合でも防ぐことができる。これは、スカラー命令がベクトル命令の最後のビートの結果に依存する可能性があり、第２のベクトル命令がそのすべてのビートにおけるスカラー結果に依存する可能性があるためで、したがって、ベクトル命令をスカラー命令とオーバーラップさせない方が安全かもしれない。
【００７６】
このようなオーバーラップ実行は、上述したタイプの複素数乗算命令にも使用することができる。したがって、複素数乗算命令のための処理のビートのそれぞれは、他の命令とのオーバーラップを伴って、すべて並列に、またはいくつかのアーキテクチャティックにわたって順次行われてもよい。
【００７７】
しかし、オーバーラップした実行が許可されている場合、命令セットアーキテクチャでは、プログラマが複素数乗算命令の宛先レジスタおよびオペランドレジスタのうちの１つの両方と同じベクタレジスタを指定しないように指定すると有用であり得る（例：ＶＭＭＬＳＤ  Ｑ０、Ｑ１、Ｑ２の代わりにＶＭＭＬＳＤ  Ｑ０、Ｑ０、Ｑ１）。データ要素サイズがビートサイズと等しいかより大きい１ビート／ティックの実装では、ソースと宛先の両方と同じレジスタＱ０を指定すると、次のビートで必要とされるソース値がソース／宛先レジスタから読み出される前に、共通のソース／宛先レジスタＱ０の所与の要素が１つのビート内で上書きされる可能性があるので、結果が不確実になるリスクがある。これは、２または４ビート／ティックの実装またはデータ要素サイズが１ビート／ティック実装のビートサイズよりも小さい場合では問題にはならないが、それは、この場合、ベクトルの隣接要素の実数部／虚数部が並列に読み取られるからである。しかし、実行するコードを記述しているプログラマは、どの特定のマイクロアーキテクチャの実装が所与のシステムで使用されているかが分からないので、１ビート／ティックの実装で実行するとリスクがある。
【００７８】
１ビート／ティック実装に対する１つの解決方法は、宛先レジスタがソースレジスタの１つと同じである場合を検出するための追加の回路を追加することであり、そうする場合、例えば、入力の１つを異なるレジスタに一時的にコピーすることによって、エラーをトリガするか、命令によって参照されるレジスタを再マッピングするためである。しかし、実際には、このような追加回路のオーバーヘッドは正当化されそうにない。実際には、上述のように、複素数乗算命令は同じ入力および宛先レジスタを使用して第１／第２の形式の命令のペアで使用されることが多く、ペアの第１の命令が第２の命令に必要な入力オペランドを上書きするため、プログラマが宛先レジスタにソースレジスタの１つと同じものを指定することを選択する可能性は非常に低い。したがって、実際には、プログラマは、これらのタイプの命令のソース／宛先の両方と同じレジスタを指定する可能性は低いので、これを防ぐ特別な回路を追加するオーバーヘッドが正当化されない可能性がある。代わりに、命令セットアーキテクチャは、プログラマがこれらの複素数乗算命令のソースおよび宛先の両方と同じレジスタを使用すると、結果が正しいことが保証されないことを指定すればよい。これは非常に稀なケースに対処するための費用負担を避けることにより、面積および電力効率のよりよいハードウェア実装を提供することができる。
【００７９】
図１７は、複素数乗算命令を実行する方法を示すフロー図である。ステップ５０において、実行すべき次の命令がデコードのためにフェッチされ、命令デコーダが命令タイプを決定する。命令が複素数乗算命令でない場合、命令デコーダは、そのタイプの命令に適した動作を実行するように処理回路を制御する。複素数乗算命令に遭遇すると、ステップ５２で、命令デコーダは、命令が第１の形式であるか第２の形式であるかを判定する。また、ステップ５４で、命令デコーダは、命令が第１のバージョンであるか第２のバージョンであるかを判定する。命令が第１の形式および第１のバージョンである場合、ステップ５６で、ターゲット要素は宛先の少なくとも１つの実数要素であり、命令が第１の形式および第２のバージョンである場合、ステップ５８で、ターゲット要素は少なくとも１つの虚数要素である。また、命令の第１の形式について、ステップ６０で、命令デコーダは、ベクトルＱ１の実数要素とベクトルＱ２の実数要素との積に対応する第１の積と、Ｑ１の虚数要素とＱ２の対応する虚数要素との積に対応する第２の積とを生成するように処理回路４を制御するための制御情報を生成する。
【００８０】
一方、命令が第２の形式であった場合、ステップ６２で、命令デコーダは、命令が第１のバージョンであるか第２のバージョンであるかを判定する。命令が第１のバージョンである場合、ステップ６４で、ターゲット要素は少なくとも１つの虚数要素であると判定され、命令が第２のバージョンである場合、ステップ６６で、ターゲットは少なくとも１つの実数要素であると判定される。ステップ６８で、命令デコーダ６は、Ｑ１の実数要素とＱ２の虚数要素との積に対応する第１の積と、Ｑ１の虚数要素とＱ２の実数要素との積としての第２の積とを生成するように処理回路４を制御するための制御信号を生成する。
【００８１】
命令が実行のために発行され、ステップ６０、６８で定義された積が入力ベクトルＱ１、Ｑ２の実数／虚数要素の各ペアに対して生成され、ステップ７０で、対応する第１および第２の積が加算または減算される（命令が加算変形か減算変形かによる）。ステップ７２で、加算または減算の結果に依存する値が、予測によってマスクされていない各ターゲット要素に書き込まれる。必要に応じて、加算／減算の結果の丸めおよび切り捨てが実行され、ビット数を宛先ベクトルのデータ要素サイズに縮小する。ステップ７４で、処理回路は、その要素に対して何らかの予測が指定されているかどうかにかかわらず、その命令によってターゲットとされなかった少なくとも１つの非ターゲット要素の更新を抑制する。
【００８２】
ソースベクトルレジスタに対するＱ１およびＱ２の選択は任意であり、どのレジスタが使用されるかは、アーキテクチャによって固定でもよいことが理解されよう。あるいは、他の実施形態では、複素数乗算命令は、どのレジスタがソースベクトル値を含むかを示すパラメータを含むことができる。同様に、宛先レジスタＱ０は固定でもよく、複素数乗算命令のパラメータによって選択されてもよい。
【００８３】
図１８は、使用可能な仮想マシン実装を示す。前述の実施形態は、関連技術をサポートする特定の処理ハードウェアを動作させるための装置および方法に関して本発明を実施するが、ハードウェア装置のいわゆる仮想マシン実装を提供することも可能である。これらの仮想マシン実装は、仮想マシンプログラム１３０をサポートするホストオペレーティングシステム１４０を実行するホストプロセッサ１５０上で実行される。一般的に、大規模なプロセッサは、妥当な速度で実行する仮想マシンの実装を提供する必要があるが、そのような手法は、互換性や再利用のために別のプロセッサに固有のコードを実行することが望まれる場合など、特定の状況において正当化される可能性がある。仮想マシンプログラム１３０はゲストプログラム１２０に仮想ハードウェアインターフェースを提供するが、ゲストプログラム１２０は、仮想マシンプログラム１３０によってモデル化されるデバイスである実際のハードウェアによって提供されるハードウェアインターフェースと同じである。したがって、上述のメモリアクセスの制御を含むプログラム命令は、仮想マシンハードウェアとの相互作用をモデル化するために、仮想マシンプログラム１３０を使用してゲストプログラム１２０内から実行されてもよい。ゲストプログラム１２０は、ベアメタルプログラムであってもよく、またはホストＯＳ１４０が仮想マシンアプリケーション１３０を実行するのと同様の方法でアプリケーションを実行するゲストオペレーティングシステムであってもよい。様々なタイプの仮想マシンが存在し、一部のタイプでは、仮想マシンは、ホストＯＳ１４０を必要とせずにホストハードウェア１５０上で直接実行されることも理解されよう。
【００８４】
本出願において、「〜に構成された」という用語は、装置の要素が定義された動作を実行することができる構成を有することを意味するために使用される。この文脈において、「構成」は、ハードウェアまたはソフトウェアの配置または相互接続の方法を意味する。例えば、装置は、定義された動作を提供する専用のハードウェアを有することができ、またはプロセッサまたは他の処理装置が機能を実行するようにプログラムされてもよい。「構成されている」は、定義された動作を提供するために装置要素を何らかの方法で変更する必要があることを意味しない。
【００８５】
本発明の例示的な実施形態を添付図面を参照して本明細書に詳細に説明したが、本発明はこれらの厳密な実施形態に限定されないこと、および添付の特許請求の範囲によって規定される本発明の範囲および趣旨から逸脱することなく、様々な変更および修正が当業者によって実施され得ることが理解されるであろう。
【図１】
2019511056.tif 000003
【図２】
2019511056.tif 000004
【図３】
2019511056.tif 000005
【図４】
2019511056.tif 000006
【図５】
2019511056.tif 000007
【図６】
2019511056.tif 000008
【図７】
2019511056.tif 000009
【図８】
2019511056.tif 000010
【図９】
2019511056.tif 000011
【図１０】
2019511056.tif 000012
【図１１】
2019511056.tif 000013
【図１２】
2019511056.tif 000014
【図１３】
2019511056.tif 000015
【図１４】
2019511056.tif 000016
【図１５】
2019511056.tif 000017
【図１６】
2019511056.tif 000018
【図１７】
2019511056.tif 000019
【図１８】
2019511056.tif 000020
【国際調査報告】
2019511056.tif 000021
2019511056.tif 000022