本発明は、それの好ましい実施例に関して、添付図面の中で説明されるように、一例としてのみ更に記述されることになる。
図1は、従来のスカラデータ処理機能及びSIMDデータ処理機能の両方を組み込んでいるデータ処理システム(集積回路)2を概略的に説明する。スカラデータ処理部分は、明確化のために説明されなかった多くの他の回路のみならず、スカラレジスタデータ記憶装置4、乗算器6、シフタ8、加算器10、命令パイプライン12、及びスカラデコーダ14も組み込んでいる標準のARM社製プロセッサのコア(ARM processor core)であることが好ましい。操作において、そのようなスカラプロセッサのコア(scalar processor core)は、スカラレジスタデータ記憶装置4の内部に固定長の32ビットのデータの数値を記憶すると共に、命令パイプライン12に沿って伝送され、かつスカラデコーダ14に供給されるデータ処理命令の制御下にある乗算器6、シフタ8、及び加算器10を使用してこれらを処理する。スカラデコーダ14は、従来の方法においてスカラ処理素子の動作を制御する制御信号を生成する。
図1において説明されるように、集積回路2は、SIMDレジスタデータ記憶装置20、専用SIMD処理ロジック18、及び再整理ロジック24を含むさまざまな専用のSIMD処理素子を備えている。ロード記憶ユニット22は、スカラ部分と共同で使用されると共に、スカラプロセッサの内部に慣習的に備えられたロード記憶ユニットの同一バージョンまたは修正バージョンとすることもあり得る。
命令パイプライン12は、専用のSIMDデコーダ16によってSIMD処理操作を制御する役目を果たす付加的なパイプラインステージを使って拡張される(当然のことながら、他の実施例において、SIMDパイプラインはスカラパイプラインを使って並列に提供されても良い。)。SIMDデコーダ16は、要求されたデータ処理操作を実行するように、例えばSIMDレジスタの読み取り、SIMDレジスタの書き込み、及びSIMD処理ロジックの配置のようなSIMD処理素子の動作を制御するSIMD制御信号を生成する。SIMDパイプラインステージは、スカラ部分に異なる実行ポイントを効果的に見せるプロセッサのSIMD部分に帰着するスカラステージの後に接続されている。これは、以下に論じられるように、重なり合ういくつかの必要性に帰着し得る。
再整理ロジック24は、要求されたSIMD処理操作に、より適合した命令において、集積回路2に接続されたメモリ(図示せず)から読み出されたデータ要素を再整理する役目を果たす。この再整理ロジック24については、動作及び利点が、以下に更に論じられる。ロード記憶ユニット22と再整理ロジック24との間に、ロードFIFO23及び記憶FIFO23’もまた設けられる。
スカラレジスタデータ記憶装置4は、この例において、例えば従来型の16個の32ビットARM社製レジスタのような固定数の固定長のレジスタに分割されるものとして取り扱うことができる。その一方、SIMDレジスタデータ記憶装置20は、関係のあるSIMDデータ処理命令に付随するパラメータに応じた柔軟な方法でアドレス指定される/アクセスされる可能性がある一組の記憶装置を構成する。より詳細には、SIMDデータ処理命令は、ソースレジスタ及びデスティネーションレジスタの数と、データ処理命令に付随するデータ要素サイズ及びレジスタサイズとを指定する。これらのパラメータは、アクセスされているレジスタに対する、異なる部分及び適宜にSIMDレジスタデータ記憶装置20内部に記憶されているデータ要素のマッピングを制御するために、SIMDデコーダ16及びレジスタデータ記憶装置20のリード/ライトポートにより一緒に結合される。このように、異なるサイズ、異なるデータ要素サイズのSIMDレジスタ及びそれに類似するものは、効果的に一緒にして別名(省略形)が付けられる(すなわち、これらのレジスタは重なり合うと共に、要求される可能性のある異なるレジスタ指示子、レジスタサイズ、及びデータ要素サイズの組み合わせによってアクセス可能であるものとして取り扱うことができる。SIMDデコーダ16及びリード(読み取り)/ライト(書き込み)ポートは、本実施例において、レジスタアクセスロジックを構成するものとして取り扱うことができる。)。
図2は、SIMDレジスタデータ記憶装置20に対して設けられるリード(読み取り)とライト(書き込み)のポートの配置を概略的に説明する。この例において、32個のSIMDレジスタは、SIMDデータ処理命令内部のレジスタ指定領域(5ビット)により指定されることが可能である。N個のリードポートはSIMDレジスタデータ記憶装置20と関係づけられる。サポートされる最小の精度は64ビットのレジスタ値である。この例において、直接的にサポートされるレジスタサイズは、64ビット及び128ビットである。この分野では、256ビット及び更に高いレジスタサイズをサポートするために、直接的、またはレジスタの更に小さいサイズでサポートされた命令を使用して合成することにより間接的に、この配置が調整されることもあり得ることは容易に明白であろう。図2は、SIMD処理レジスタデータ記憶装置20のライトポートとしての役目を果たすM個のデマルチプレクサ(de-multiplexers)を概略的に説明する。当然のことながら、実際には、そのようなデマルチプレクサは、その行き先へ目的とする入力の経路をさだめるマルチプレクサ(multiplexers)の動作と一致するように、SIMDレジスタデータ記憶装置内部の記憶要素の行(row)に対して適切に割り当てられたイネーブル信号の形式で提供される。
図3は、それぞれ複数のデータ要素を含んでいる2個の64ビットのSIMDレジスタ値(“D”の2倍の語として示される)が、128ビットのレジスタ(“Q”の4倍の語として示される)に一緒に記憶された複数の出力データ要素を生成するために、お互いに掛け合わされる特定の例を説明する。個々のリードポートは、SIMDレジスタデータ記憶装置20からソースSIMDレジスタ値“D1”,“D2”を読み取るために配置される。2個のライトポートは、128ビットの結果の第1の“Q [63:0]”部分及び第2の“Q[127:64]”部分が、それぞれ元のSIMDレジスタ記憶装置20へ書き込まれることを可能にするように一緒に動く。当然のことながら、“D”レジスタ及び“Q”レジスタ内部のデータ要素サイズは修正することができる。一例として、4個の16ビットのデータ要素は、乗算の結果である、対応する4個の32ビットのデータ要素の1組を含んでいるデスティネーション“Q”レジスタと一体の、各ソース“D”レジスタ内部に含まれても良い。この例において、実行されている乗算操作により必要とされる時、データ要素サイズが16ビットから32ビットに増やされる一方で、どのように並列処理レーンの数(4)が一定の状態を維持するのかが理解されることになる。
図4は、サポートされ得るソースレジスタサイズとデスティネーションレジスタサイズとの間の関係のさまざまな異なるタイプを説明する。与えられた最重要の例において、並列処理レーンの数は一定の状態を維持すると共に、データ要素サイズは一定の状態を維持する。2番目及び4番目の例において、並列処理レーンの数は一定の状態を維持するが、ソース(レジスタ)とデスティネーション(レジスタ)との間でデータ要素サイズは変化する。3番目の例において、2個のソースの要素は異なるデータ要素サイズを有している。以下に更に記述されるように、本システムのSIMD処理構造体及び技術は、これらのデータ処理命令の異なるタイプをサポートする。最後の3個の例は、単一の入力変数による単項演算である。5番目の例は、同一のデータ要素サイズを維持する。6番目の例は、データ要素サイズを2倍にすると共に、7番目の例は、データ要素サイズを2分の1(半分)にする。
図5は、SIMDデータ処理命令の構文を概略的に説明する。構文の最初の部分は、当該SIMD演算子、この場合は乗算操作を指定する。これには、出力のデータ要素サイズ及び出力のデータ要素の他の特性を表す領域が続けられている。この例において、出力のデータ要素は、16ビットの長さでかつ符号付き整数である。次の領域は、入力のデータ要素サイズ及び特性、この場合は符号付き8ビットの整数を表している。次の領域は、デスティネーションレジスタサイズ及びレジスタ指示子を表している。この例において、レジスタ指示子12を有する128ビットで4倍語のSIMDレジスタは、デスティネーションSIMDレジスタとして使用されるべきである。2個のソースSIMDレジスタは、個々に“1”から“4”とするレジスタ指示子を有する、それぞれ2倍語の64ビットのレジスタである。構文の更なる情報は、以下に記述される。
異なるデータフォーマットを表すための1組のデータタイプが定義される。これらはテーブル0(表1)に記述される。殆どの命令は、正確な操作の決定ために、少なくとも1個のデータタイプ修飾子を使う。しかしながら、操作は必ずしもすべてのデータタイプをサポートするとは限らない。データタイプは、データ要素サイズ、及び特性を表す領域に接尾語として適用される。
図6は、32個に分割された64ビットのレジスタ、または16個に分割されている128ビットのレジスタであるSIMDレジスタデータ記憶装置20を概略的に説明する。これらのレジスタは、同一の物理的なSIMDレジスタデータ記憶装置20に位置すると共に、適宜に一緒にして別名(省略形)を付ける。一例として、レジスタ“D0”内部のデータ要素がレジスタ“Q0”内部のデータ要素としてアクセスされても良い。
図7は、64ビットのレジスタと128ビットのレジスタとの間の重複部分(overlap)を更に概略的に説明する。説明されるように、128ビットのレジスタ“Q(n)”は、2個の64ビットのレジスタ“D(2n+1)”及び“D(2n)”に一致する。
図8は、異なるサイズのSIMDレジスタの内部に記憶されたデータ要素の例を概略的に説明する。図8の上部では、128ビットのSIMDレジスタは、4個の32ビットのデータ要素、または8個の16ビットのデータ要素のいずれかとして説明される。データ要素は、実行されるべき並列処理に要求され、かつ適した符号付き整数または符号なし整数、浮動小数点数、あるいは他のフォーマットの数とすることができる。
図8の下部では、64ビットのSIMDレジスタが2個の符号付き32ビット整数、または4個の符号なし16ビット整数のいずれかを含んでも良いことを説明する。他の多くの可能性が利用可能で、かつ技術的な分野において明白にされることになる。
図9は、どのようにSIMDレジスタ内部の個々のスカラ値が参照され得るかを概略的に説明する。説明されているSIMDレジスタ26は4個の符号付き整数値を含んでいる。もしこのSIMDレジスタがレジスタ“Dn”であると考えられるならば、その場合には異なる個々の符号付き整数値は“Dn[3]”から“Dn[0]”として表され得る。例えば、SIMDレジスタ内部のデータ要素の1つを選択し、それをスカラレジスタデータ記憶装置4内部のレジスタの1つへ、またはレジスタの1つから移動するレジスタ転送命令が実行されるとき、このようなSIMDレジスタ内部の個々のデータ要素の参照が使用される。
図10は、2個のソースレジスタとデスティネーションレジスタとの間で一定の状態を維持する処理レーンの数と、一定の状態を維持するデータ要素サイズとにより、どのようにSIMDレジスタ処理命令が実行され得るかを説明する。この例において、ソースSIMDレジスタは、4個の並列処理レーンを備える“D”レジスタ(64ビットで、かつ4個の計算結果の16ビットのデータ要素を含む)である。デスティネーションSIMDレジスタもまた、4個の16ビットのデータ要素を含む64ビットの“D”レジスタである。
図10とは対照的に、図11Aは、デスティネーションSIMDレジスタがソースSIMDレジスタの幅の2倍になる例を説明する。処理のレーン数は一定の状態を維持するが、データ要素サイズは2倍になる。このタイプの動作は、乗算、加算、減算、及びシフト(特に左シフト)のようなSIMD操作と共に使用することに適している。図11Bは、デスティネーションSIMDレジスタがソースSIMDレジスタの幅の半分になる例を説明する。このタイプの命令は、加算、及びシフト(特に右シフト)に有益である。
ソースレジスタとデスティネーションレジスタとの間でデータ要素サイズを変更する能力は、処理レーンの数を維持する間、データ要素の再整理に対する必要条件、または実行されたデータ処理操作により生成されたデータ要素サイズの変化の結果としての命令の倍加を必要とせずに、SIMDデータ処理命令の手順が構築されることを可能にする。これは、処理速度、コード密度、電力消費、及びその他同種のものの点から見て著しい利点である。
図12は、レジスタ転送ロジック28により連結されたスカラレジスタデータ記憶装置4とSIMDレジスタデータ記憶装置20とを概略的に説明する図である。スカラデコーダ14またはSIMDデコーダ16のいずれか、あるいは両方から受信した制御信号は、スカラレジスタデータ記憶装置4内部の指定されたレジスタと、SIMDレジスタデータ記憶装置20の指定されたレジスタ内部の指定された位置との間でデータを移動するために、命令パイプライン12の内部でレジスタ転送命令に応答するレジスタ転送ロジック28を制御する。スカラレジスタからSIMDレジスタへ移動したデータ数値もまた、図13に説明されるように、SIMDレジスタ内部の全ての位置に複写され得る。複写を伴うこのタイプのレジスタ転送命令は、SIMDレジスタ内部の全ての処理レーンを、基準化数値(scaling values)のような、SIMD処理ロジック18によりSIMDレジスタ内部の異なる他のオペランド(操作対象)に提供される必要がある数値で急速に占めることにとても適している。
図14は、異なるタイプのレジスタ転送命令を説明する。この例において、32ビットスカラ値Aが、SIMDレジスタ内部の指定された位置(レーン)へ移動される。他のレーンはその初期値を維持する。スカラ値は、完全にスカラレジスタの全域には複写されない。デスティネーションスカラレジスタ内部の位置は、レジスタ転送命令の内部の適切な領域値により変更され得る。このタイプの操作は、SIMDレジスタ内部の個々のデータ要素が、スカラレジスタデータ記憶装置から取得されたデータ数値で占有されることを容認する。
図15は、レジスタ転送命令の更に進んだタイプを説明する。この例において、SIMDレジスタ内部からの16ビットのデータ要素が、そのSIMDレジスタ内部の指定された可変位置から取得されると共に、スカラレジスタの1つに複写される。スカラレジスタは32ビットのレジスタなので、データ要素は、その場合にはこの例において符号拡張される。データ要素は、その代わりに、個々のアルゴリズムまたはシステムの必要条件に応じてゼロ拡張されることもあり得る。
図16は、図14及び図15に説明されたタイプのレジスタ転送命令が恐らく有効に利用される処理のタイプの例を概略的に説明するフローチャートである。ステップ30において、いくつかのSIMD処理は、それぞれがそれ自身のデータ要素を含む複数のレーンに対して並列に実行される。ある時点で、この処理は、SIMD処理ロジック18によってサポートされないか、または非能率的にそのようにサポートされ得るだけの、実行されるべきデータ操作を必要とする。この状況において、実行されるべきこの複合のデータ操作を可能にするために、スカラ処理システムの全域で、個々のデータ要素を独立に移動することが要求される。ステップ32は、そのように移動されるべき最初のデータ要素を選択する。ステップ34は、その場合には図15において説明されるように、レジスタ転送命令を実行する。ステップ36は、システムのスカラ部分に今ある個々のデータ要素に対して、要求された複合の処理を実行する。この複合の処理が終了したとき、図14において説明されるように、今変更されたデータ要素をその最初の位置に戻すために、ステップ38は、レジスタ転送命令を実行する。ステップ40は、最後のデータ要素が到達されたか否かを判断すると共に、もしそうでない場合には、ステップ42は、ステップ34の処理に戻る前に、次のデータ要素を選択する。もし、それらに対して実行されるべき複合操作に必要とされる全てのデータ要素が、要求された処理に従いスカラシステムの全域に移動されると共に、元のSIMDシステムへ移動されたならば、その場合にはステップ40から並列SIMD処理が再開されるステップ44へ更に処理は続行される。
レジスタデータ記憶装置にアクセスするためにSIMDレジスタを指定するデータ処理命令は、アクセスするべきレジスタのレジスタ番号を符号化した1つまたはそれ以上のレジスタ領域を含んでいる。使用される5ビットのレジスタ指定子は、ARM社製ベクトル浮動小数点(VFP)ユニット(Vector Floating Point (VFP) unit)により使用されるものと同一になるように設計される。すなわち、レジスタを指定する命令ビットは次のとおりである。
*デスティネーションレジスタに関して
D=bit[22]
Rd=bits[15:12]
*第1のソースレジスタ指定子に関して
N=bit[7]
Rn=bits[19:16]
*第2のソースレジスタ指定子に関して
m=bit[5]
Rm=bits[3:0]
更に、“VFP”がそれぞれ倍精度レジスタ及び単精度レジスタを指定する方法、及び同じ法則をたどる“Qi”レジスタ及びハーフワードのスカラ量に対する符号化方法で、“Di”レジスタ及びワードのスカラ量が一貫して符号化されるように、これらのビットの使用は選択される。下記は、どのように(D,Rd)が使用されるか、同じように(N,Rn)及び(M,Rm)が使用されるかを記述する。
Qd:“Qi”レジスタ番号は、“(D,Rd[3],Rd[2],Rd[1])”である。
対応する“Di"レジスタ番号は、“(D,Rd[3],Rd[3],Rd[1],0)”及び“(D,Rd[3],Rd[2],Rd[1],1)”である。
“Rd[0]”はゼロであるべきである。
Dd:“Di”レジスタ番号は、(D,Rd[3],Rd[2],Rd[1],Rd[0])である。
ワードスカラ(Word scalar):
“Di”レジスタ番号は、“(0,Rd[3],Rd[2],Rd[1],Rd[0])”である。
“word[D] ”は、レジスタからリトルエンディアンで選択される。
ハーフワードスカラ(Halfword scalar):
“Di”レジスタ番号は、“(0,0,Rd[2],Rd[1],Rd[0])”である。
ハーフワード“[(D,Rd[3])]”は、レジスタからリトルエンディアンで選択される。
バイトスカラ(Byte scalar):
“Di"レジスタ番号は、“(0,0,0,Rd[1],Rd[0])”である。
バイト“[(D,Rd[3],Rd[2])]”は、レジスタからリトルエンディアンで選択される。
このように、ビットD,Rd[3],Rd[2],Rd[1],及びRd[0]は、レジスタ番号に関して、レジスタサイズに依存している多数のビット位置によって交代可能である5ビットの隣接する領域に写像可能であるように構成しても良い。実際のところは、レジスタの符号化ビットは、独立した操作として写像または循環されないが、しかし、行及び部分列のアドレスとしての役目を果たすビットの正確な位置を選択するように、レジスタサイズに応じて適用されている移動可能なマスク(mask)によってレジスタデータ記憶装置へのアクセスに対する行(row)アドレス及び列(column)アドレスを形成するために、レジスタアクセスロジックに供給される。
本実施例に従って、ロード命令及び記憶命令は、SIMDレジスタファイル20(図1参照)とメモリとの間の移動データに対して提供される。ロード命令は、データ要素をメモリから指定されたレジスタへロードするために使用され得ると共に、一方、記憶命令は、データ要素を指定されたレジスタからメモリへ記憶するために使用される。これらのロード命令及び記憶命令は、SIMD処理ロジック18を使用するアルゴリズムにより必要とされるデータの移動をサポートするように設計される。本実施例のロード命令及び記憶命令は、それらがロードすると共に記憶するデータ要素サイズを指定し、かつこの情報は、メモリシステムのエンディアンに関係なく、レジスタ内部の一貫した順番を提供するために使用される。
本実施例のロード命令及び記憶命令は、メモリの連続ブロックからの複数のデータ要素が、SIMDレジスタファイル20へロードされること、あるいはSIMDレジスタファイル20から記憶されることを可能にする。一実施例に従って、どんなバイト幅の配置構造(byte alignment)でも、アクセスは実行され得ると共に、最大で32バイトまでロードまたは記憶することができる。
本実施例のロード命令及び記憶命令は、各構造体が多数の要素を備えると共に、構造体にデータ要素が配置されるメモリからのデータにアクセスするように構成される。一実施例に従って、メモリ内の構造体は、SIMD処理ロジック18に認識される任意のデータタイプサイズを有する1個から4個の要素を含むことができ、好ましい実施例において、これらのデータタイプは、8、16、32、及び64ビットである。本実施例で使用される構造体のフォーマットに対するいくつかの共通の例が以下のテーブル1(表2)に示されている。
どんな特定のロード命令及び記憶命令に対しても、メモリ内の各構造体、すなわちアクセスの対象は、同一の構造体フォーマットを有すると共に、従って同じ数の要素を含むことになる。ロード命令及び記憶命令は、構造体フォーマット内の要素の数を識別するために用意され、かつこの情報は、ロード操作を実行する際にデータ要素のデインタリーブを規定するため、及び記憶操作を実行する際にデータ要素のインタリーブを規定するために、再整理ロジック24により使用され、構造体の異なるデータ要素が異なるレジスタに現れるように、データがレジスタ内で配置されることを可能にする。この構想は、多数のデータ要素をメモリの連続ブロックから3個の指定されたレジスタへロードするためにロード命令が使用される状況に関して、図17に概略的に説明される。この例において、指定されたレジスタは3個の64ビットのレジスタ“D0”220,“D1”225,“D2”230である。この例において、構造体フォーマットは、3Dベクトルフォーマット(3D vector format)であり、従って、メモリ200内の各構造体210は、3個の要素を備えている。
図1に示されるように、適切なメモリアクセス制御信号がロード記憶ユニット(load store unit:LSU)22へ送信されている結果として、ロード命令は命令パイプライン12からスカラデコーダ14に伝送される。LSUは、次にメモリの連続ブロックから必要とされた4個の構造体A[0」,A[1],A[2],及びA[3]にアクセスする。従って、LSU22はその正常な方法において動作し得る。その後、データは、X要素に付随するデータ要素がレジスタ“D0”220へ伝送され、Y要素のデータ要素がレジスタ“D1”225へ伝送され、Z要素のデータ要素がレジスタ“D2”230へ伝送されるように、各構造体において3個の要素をデインタリーブするために配置される再整理ロジック24によって伝送される。
構造体の配列からロードすると共に、ロード操作の一部として情報を別個のレジスタへ分類する能力は、データが効率的なSIMD処理を直ちに準備することを可能にするために使用され得る。
再整理ロジック24は、指定されたレジスタからの記憶データをメモリの連続ブロックへ戻す際に、アナログの処理を実行するためにもまた配置され、この場合には、再整理ロジック24は、データがメモリに記憶される前に、構造体フォーマットを再生するために、インタリーブ操作を実行する。
図1から分かるように、ロード命令は、それらの命令が命令パイプライン12のSIMDステージに届く前に、命令パイプラインからスカラデコーダ14へ伝送される。これは、データをSIMDレジスタファイル20へロードする処理が、別の状況では可能である場合より早く発生することを可能にすると共に、次に起こるSIMD処理命令が、一般的にそれが実行を開始できるようになる前にロードすべきデータを待たなくても良いことになり、それによってロード操作の待ち時間を著しく減少させるという利益を得る。しかしながら、SIMDレジスタファイル20からのデータの入手、及びLSU22によってデータが元のメモリに記憶される前の再整理ロジック24内部の適切な再整理を制御するために、記憶命令は、それらが適切な制御信号が使用され得るSIMDデコーダ16へ伝送されるまで、命令パイプラインに挿入されることを必要とすることになる。しかしながら、命令がデータの中断を生じさせないことを保証するために、命令パイプライン12のARM社製部分において、例えば、アドレス、メモリアクセス許可等をチェックしている間、記憶命令のある部分は実行される。
本実施例のロード命令及び記憶命令は、以下のような1つの構文に従う。その構文は、以下のように表され得る。
V(LD|ST)<st>.<dt>{@<a>}<reglist>,{<n>,}<addr>
ここで、“<st>”は、構造体フォーマットを示し、メモリ内のデータ要素は“<st>”要素を備えた構造体の配列として取り扱う。この情報は、効率の良いSIMD処理を可能にするために、それらがメモリとSIMDレジスタ記憶装置との間で移動するように、データ要素をインタリーブ及びデインタリーブすることに使用される。
“<dt>”は、データタイプを示す。これは、ロードされているデータ要素サイズを決定する。
“<a>”は、オプションで、配置構造指示子を示す。
“<reglist>”は、SIMDレジスタリストを示し、これは、書き込まれる、または読み出されることになるSIMDレジスタの状態を決定する。ロードに関して、これはまさに、命令によって影響を受けることになるSIMDレジスタファイルの一部である。レジスタリストは、同じ長さの“<st>”ベクトルに分割された、“<dt>”サイズのデータ要素の集まりとして取り扱う。レジスタリスト内部のバイト数は、アクセスされたメモリのバイト数と必ずしも同じでない点に注意せよ。“<n>”オプションと図20Aから図20Cを参照せよ。
“<n>”は、オプションで、構造体の数を示す。これは、ロード、または記憶する構造体の数を定義する。これは、レジスタリストが、部分的にメモリデータをロードされ、残る部分をゼロにされることだけを可能にする。それが与えられない場合、それはレジスタリスト及びメモリアクセスサイズが同一であることを意味するデフォルト値を受けとる。
default<n>:=elements<dt>(<reglist>)/<st>
“<addr>”は、アクセスのために使用されるアドレス指定モードを示す。
本実施例に従って、アドレス指定モードは、さまざまな形式、及び特に以下に説明される3個の形式をとることができる。
;// <addr>
[Rn] ;//addres:=Rn
[Rn]! ;//addres:=Rn,Rn:=Rn+transfer_size
(ここで、“transfer_size”は、アクセスされたメモリの総量を示す。)
[Rn],Rm ;//address:=Rn,Rn:=Rn+Rm
上記で論じられた記号の意味は、単一の構造体または複数の構造体が、メモリからのデータで満たされないレジスタの残る部分に書かれるべき論理的ゼロをロードまたは記憶されること、及びスカラ修飾子(例えば、“D0[1]”)を含んでいるレジスタリストを使用することによるレジスタへの挿入を可能にする。当然のことながら、本実施例において、与えられた実際のロード命令及び記憶命令は、一般的に上記構文の全ての可能な組み合わせのサブセット(subset)である。
構造体フォーマットに関して、図18は、構造体フォーマットの3個の可能な例、及びそれらの対応する“st”値を説明する。図18から分かるように、第1の構造体250は、1個の要素のみを備えており、従って“st”値は“1”である。第2の例において、構造体255は、例えば複素数の実数部分と虚数部分とを表している2個の要素を備えており、従って“st”値は“2”である。最後に、第3の例において、構造体260は、R,G,及びBのデータ要素を表している3個の要素を備えており、従って“st”値は“3”である。
本実施例のロード命令及び記憶命令を使用するときのいくつかの利用可能な機能性の説明を補助するために、図19から図22は、ロード命令及び記憶命令の詳細な例を説明する。最初の図19Aから図19Cを考察すると、図19Aは、記憶命令“VST2.16 {D0,D1,D2,D3}[r1]”によって指定された“reglist”の状態を説明する。
この命令は、指定されたレジスタファイルからメモリの連続ブロックへ複数の構造体を記憶するために使用される。図に示すように、図19Aは、“reglist”が4個の指定されたレジスタ“D0”270,“D1”280,“D2”290,“D3”300を含むことを確認する。図19Bに示されるように、これらのレジスタは、“dt”サイズ(すなわち16ビット)のデータ要素の“st”ベクトル(すなわち2)に分割されるものとして取り扱うことができる。レジスタ“D0”においては、これらのデータ要素は符号275により参照され、“D1”においては符号285により参照され、“D2”においては符号295により参照され、そして“D3”においては符号305により参照される。図19Cから分かるように、再整理ロジック24は、構造体312に対して必要とされる構造体フォーマットで各データ要素314がメモリ310に記憶されるように、これらの2個のベクトルからのデータ要素をインタリーブするために配置される。
図20Aから図20Cは、命令“VLD2.16 {D0,D1},#1,[r1]”によって実行された操作を説明する類似した図のセットである。
図20Aは、レジスタ“D0”270及びレジスタ“D1”280を識別する“reglist”の状態の集まりを説明する。図20Bは、同時に、どのようにこれらのレジスタが、“dt”サイズ(すなわち16ビット)のデータ要素の“st”ベクトル(すなわち2)に分割されるかを説明する。
図19Aから図19Cの例とは対照的に、この命令は、アクセスされるべき構造体の数を識別する“n”パラメータを指定し、この例において“n”は“1”である。従って、このロード命令“n x st”(すなわち、1×2)に関して、データ要素は、有効アドレスの最初から始まるメモリから読み取られると共に、次に、最初のベクトルの一番低いインデックスが付けられた要素から始まるベクトルに、総当たりの割り付けにおいて割り当てられることを必要とする。この処理は、図20に説明されており、結果的に、第1の要素314のデータ要素“x0”は、レジスタ“D0”の一番下の16ビットに書き込まれていると共に、一方、第2の要素のデータ要素“y0”は、レジスタ“D1”の一番下の16ビットに書き込まれている。本実施例に従って、ロードされたことのあるデータ要素の全てに一度も書かれなかったレジスタの状態のどの部分もゼロに設定される。同等の記憶命令“n x st”に対して、データ要素はロード命令と逆の方法で記憶されるということに注目するべきである。
図21Aから図21Cは、命令に対する構文が、指定されるべき2個のデータタイプ、すなわちアクセスされているデータ要素のためのデータタイプ、及びレジスタへロードされるか、またはメモリに記憶される結果のデータ要素のためのデータタイプを認めるように拡張される、他の特定の例を説明する。従って、図21Aから図21Cは、命令“VLD2.32.S16{D0,D1,D2,D3},[r1]”により実行された処理を説明する。
図21Aに示されるように、レジスタ“D0”270、レジスタ“D1”280、レジスタ“D2”290、及びレジスタ“D3”300を識別する“reglist”の状態が集められる。同時に、図21Bに示されるように、データ要素が、32ビットの長さとなるレジスタ内部に記憶されるときまでに、この命令がそれを指定するので、このレジスタの状態は、“dt”サイズ(すなわち32ビット)のデータ要素の“st”ベクトル(すなわち2)に分割される。
更に命令によって指定されるように、メモリ内のデータ要素は、16ビットの長さであり、従って、一度メモリ310から入手されたならば、それらは、その場合に各16ビットのデータ要素を新しい32ビットのデータ要素342を形成するように拡張するために使用される、いくつかの変換ロジック340(それは任意に再整理ロジック24の一部として組み込まれ得る)に挿入されることになる。第1の要素のデータ要素はレジスタ“D0”及びレジスタ“D1”内部に記憶され、一方第2の要素のデータ要素はレジスタ“D2”及びレジスタ“D3”内部に記憶されるように、これらのデータ要素はデーインタリーブされる。
図22Aから図22Cは更なる例を説明すると共に、特に命令“VLD2.16{D0[2],D1[2]},[r1]”の操作を説明する。
この命令は前の命令と同じ構文を共有することができる一方、この命令は、データ要素が構造体の配列として記憶されるメモリの連続ブロックからデータ要素をロードすることよりはむしろ、このロード命令が単一の構造体のみをロードするような、概念上は異なるタイプの命令である。更に、ロードされた単一の構造体のデータ要素は、指定されたレジスタ内部の選択された処理レーンのいずれかに配置され得る。それゆえに、64ビット幅のレジスタ及び16ビットのデータ要素を考慮するとき、データ要素が配置され得る4個の可能な処理レーンがある。好ましい実施例において、特定の命令に対して選択されたレーンは、特定のレーンを識別するように“reglist”データに表される。
図22Aを考察すると、“reglist”状態が集められたとき、これは、レジスタ“D0”の「レーン2」320及びレジスタ“D1”の「レーン2」325を確認することがわかる。図22Bに示されるように、これらは、その場合には“dt”サイズ(すなわち16ビット)のデータ要素の“st”ベクトル(すなわち2)に分割される。その後、図22Cに示されるように、一度構造体312がメモリ310から入手されたならば、再整理ロジック24は、データ要素“x0”を“D0”レジスタ330のレーン2へ割り当て、一方データ要素“y0”を“D1”レジスタ335のレーン2へ割り当てるために配置される。この例において、当然のことながら、0から3までの範囲のレーンが確認され得る。
興味を持っている読み手のために、以下のテーブル2からテーブル5(表3から表6)は、1つの特定の実施例において提供される可能性があるさまざまなタイプのロード命令及び記憶命令を特定する。
一実施例において、図1の再整理ロジック24は、図23において説明する形式をとる。図23のロジックは、その入力に、ロード命令の場合には、図1において説明されるLSU22に付随するロードFIFO23からデータを受信するために配置される、または記憶命令の場合には、SIMDレジスタ記憶装置20からデータを受信するために配置される、2個のマルチプレクサ(multiplexers)350,355を含んでいる。更に、いくつかの状況において、ロード命令は、図23のロジックにもまた、SIMDレジスタ記憶装置20からのデータを受信させ得る。マルチプレクサ350,355は、異なる入力信号のどちらかを選択すると共に、選択された入力信号を接続された入力レジスタ360,365に伝送するように制御される。一実施例において、各入力レジスタは64ビットのデータを記憶することができる。入力レジスタに記憶されたデータは、その場合にはクロスバーマルチプレクサ(crossbar multiplexer)375を通してレジスタキャッシュ380へ読み取られると共に、クロスバー制御レジスタ370は、入力レジスタから受信した個々のバイトデータをレジスタキャッシュ内部の要求されたバイト位置へ割り当てるように、クロスバーマルチプレクサに駆動信号を供給する。制御レジスタ370内の数値は、命令デコーダによって抽出される。
図23に示されるように、レジスタキャッシュ380は、4個のレジスタから構成されるものとして取り扱うことができると共に、一実施例において、各レジスタの長さは64ビットである。
データがレジスタキャッシュ380に記憶されたあと、次に、それは、出力のマルチプレクサ385によって、LSU22に付随する記憶データFIFO23’(記憶命令の場合には)、またはSIMDレジスタファイル20(ロード命令の場合には)のどちらかに読み取られ得る。
バイト(8ビット)幅クロスバーマルチプレクサ375は、バイト精度で入力レジスタを読み取ることができると共に、バイト精度でレジスタキャッシュへ書き込むことができ、ライトマルチプレクサ(write multiplexers)385は、レジスタキャッシュから64ビット精度で読み取る。
再整理ロジック24は、SIMD処理ロジック18の残りの部分から大部分は独立しているが、しかし、集積回路内部の他の機能ユニットと同一の形式のプログラム順番で命令が与えられる。一実施例において、それは、それがそれ自身を制御する、レジスタファイルの2個のリードポート及び2個のライトポートを備えている。障害が検出されかつ回避されるように、再整理ロジック24は、得点掲示板を使用するインタロック(interlock)ロジック(図示せず)と通信するように配置されても良い。
SIMDレジスタファイル20からの記憶命令は、他のSIMD命令に対して順序がばらばらに実行されるが、しかし、SIMDレジスタファイルからの他の記憶命令に対しては順番通りに維持される。宙に浮いている記憶命令はキュー(待ち行列:queue)に保持されると共に、記憶されたデータが準備されると、それは再整理ロジック24によって読み取られ、かつLSU22に付随する記憶FIFO23’へ渡される。
一実施例において、メモリとSIMDレジスタファイル20との間を通過する全てのデータは、再整理ロジック24によって伝送される。しかしながら、代わりの実施例において、再整理が要求されないことが決定された状況に対して、再整理ロジック24の周りのバイパス経路(bypass path)が与えられる。
レジスタキャッシュ380は、それが、ある条件の下で、SIMDレジスタファイル20に書き込まれる前にレジスタ値を隠す(隠し場所に蓄える)ので、“キャッシュ”と呼ばれる。レジスタキャッシュは、再整理ロジック24から出力されるべきデータ形式のデータを保持する。
図24Aから図24Cは、命令タイプ“VLD 3.16{D0,D1,D2},[r1]”を実行するときに要求される必要な再整理を実行する再整理ロジック24の動作を説明する。
一度データがLSU22にロードされたならば、その場合には最初の1サイクルで(図24Aに示されるように)、64ビットの読み出されたデータがマルチプレクサ350によって入力レジスタ360へロードされ、一方次の64ビットがマルチプレクサ355によって入力レジスタ365へロードされる。図24Aから図24Cに説明された例において、構造体フォーマットは、要素x,y,zを備える3Dベクトルを表すものと仮定される。次のサイクルでは、図24Bに示されるように、入力レジスタ内部の16ビットのデータ要素は、x要素と関係づけられる任意のデータ要素がレジスタキャッシュの第1のレジスタに配置され、y要素と関係づけられる任意のデータ要素がレジスタキャッシュの第2のレジスタに配置され、z要素と関係づけられる任意のデータ要素がレジスタキャッシュの第3のレジスタに配置されるようにデータを整理し直すバイト幅クロスバーマルチプレクサ375によってレジスタキャッシュ380へ読み取られる。同様にこのサイクルの間に、ロードFIFO23からの次の64ビットのデータが、マルチプレクサ350によって入力レジスタ360へロードされる。
次のサイクルでは、図24Cに示されるように、入力レジスタ360からのデータ要素は、上述のように、デインタリーブされているx要素、y要素、及びz要素として、バイト幅マルチプレクサを介してレジスタキャッシュへ伝送される。図24Cに示されるように、レジスタキャッシュ内のこの結果は、第1のレジスタに4個のx要素、第2のレジスタに4個のy要素、第3のレジスタに4個のz要素を含んでいる。レジスタキャッシュの内容は、次に、ライトマルチプレクサ385によって、レジスタ2個が同時にロード命令により指定されたレジスタへ出力され得る。
図25Aから図25Dは、命令“VLD 3.16 {D0[1],D1[1],D2[1]},[r1]”を実行するときに、要求される必要な再整理を実行するために再整理ロジックを通過するデータの流れの第2の例を説明する。この命令に従って、データは、レジスタ“D0”、レジスタ“D1”、及びレジスタ“D2”の特定のレーン、すなわちそれらのレジスタ内部の4個の16ビット幅のレーンの第2の(2番目の)16ビット幅のレーンへロードされる。レジスタが続いて書き込まれるときにレジスタの内容が全体として書き込まれるように、レジスタの特定のレーンにデータ要素が記憶され得る前にレジスタの現在の内容は読み出される必要がある。この特徴は、SIMDレジスタファイル20におけるレジスタの一部のみに対する任意の書き込みを行う必要性を回避する。従って、最初のサイクルの間、図25Aで示されるように、レジスタ“D0”及びレジスタ“D1”の現在の内容は、マルチプレクサ350,355によって、SIMDレジスタファイルから入力レジスタ360,365へ読み取られる。次のサイクルでは、図25Bに示されるように、これらの内容は、レジスタキャッシュの第1のレジスタに配置されている“D0”の内容、及び第2のレジスタに配置されている“D1”の内容として、クロスバーマルチプレクサ375を通過してレジスタキャッシュ380へ読み出される。同じサイクルにおいて、レジスタ“D2”の内容は、マルチプレクサ350によってSIMDレジスタファイルから読み出されると共に、入力レジスタ360に記憶される。
次のサイクルでは、図25Cに示されるように、レジスタ“D2”の内容は、それらがレジスタキャッシュの第3のレジスタに記憶されるように、クロスバーマルチプレクサ375によって、レジスタキャッシュ380へ読み取られる。同じサイクルにおいて、一般的に既にLSUにより読み出されたであろうデータ構造体、すなわちロードの対象は、ロードFIFO23から、マルチプレクサ350によって入力レジスタ360へ読み取られる。図25Cに説明された例において、メモリ内の構造体は、要素x、要素y、及び要素zによる3Dベクトルデータを再度表すものとして取り扱われる。次のサイクルにおいて、図25Dに示されるように、x要素、y要素、及びz要素は、レジスタキャッシュ内部においてデータ要素“x0”がレジスタ“D0”の第2のレーンの現在の内容を上書きし、レジスタキャッシュ内部において要素“y0”があらかじめレジスタ“D1”の第2のレーンに存在するデータ要素を上書きし、及びレジスタキャッシュ内部において要素“z0”があらかじめレジスタ“D2”の第2のレーンに存在するデータ要素を上書きするように、クロスバーマルチプレクサ375によってデータ要素の第2のレーンへ読み取られる。
当然のことながら、この時点で、SIMDレジスタファイルのレジスタ“D0”、レジスタ“D1”、及びレジスタ“D2”の実際の内容はまだ変化していない。しかしながら、レジスタキャッシュに記憶されたデータは、以前の内容を上書きするために、ライトマルチプレクサ385によって元のレジスタ“D0”,“D1”,“D2”へすぐに出力され得る。その結果、メモリから特定の構造体の要素をロードすると共に、次にその構造体の個々の要素を選択されたレーン位置において異なるレジスタに挿入するために、単一のロード命令は使用され得ることがわかる。
図25Eから図25Hは、図25Aから図25Dを参照して上述したロード命令を補足する記憶命令を実行するときに、要求される必要な再整理を実行するために再整理ロジックを通過するデータの流れの第3の例を説明する。従って、図25Eから図25Hは、命令“VST 3.16 {D0[1],D1[1],D2[1]},[r1]”を実行するときに必要な再整理を実行するために要求される処置を説明する。それゆえに、この命令に従って、データは、レジスタ“D0”、レジスタ“D1”、及びレジスタ“D2”の第2の16ビット幅のレーンから元のメモリに記憶される。図25Eに示されるように、最初のサイクルの間、レジスタ“D0”及びレジスタ“D1”の現在の内容は、マルチプレクサ350,355によって、SIMDレジスタファイルから入力レジスタ360,365へ読み取られる。次のサイクルでは、図25Fに示されるように、第2のレーンのデータ要素、すなわち数値“x0”及び数値“y0”は、クロスバーマルチプレクサ375を通過してレジスタキャッシュ380の第1のレジスタへ読み出される。同じサイクルにおいて、レジスタ“D2”の内容は、マルチプレクサ350によってSIMDレジスタファイルから読み出されると共に、入力レジスタ360に記憶される。
次のサイクルでは、図25Gに示されるように、レジスタ“D2”の第2のレーン内のデータ要素は、クロスバーマルチプレクサ375によって、レジスタキャッシュ380の第1のレジスタへ読み取られる。その場合には、次のサイクルにおいて、図25Hに示されるように、x要素、y要素、及びz要素は、元のメモリに記憶するために、ライトマルチプレクサ385によりLSUへすぐに出力され得る。当然のことながら、この段階で、データ要素はメモリ内の保管に必要とされる構造体フォーマットにすぐに再整理される。
図26Aから図26Eは、以下の4個の命令による手順を実行する間に再整理ロジック内部で行われる再整理を説明する。
“VLD 3.16 {D0,D1,D2},#1,[r1]”
“VLD 3.16 {D0[1],D1[1],D2[1]},[r2]”
“VLD 3.16 {D0[2],D1[2],D2[2]},[r3]”
“VLD 3.16 {D0[3],D1[3],D2[3]},[r4]”
一度、第1のロード命令により識別されたデータがLSUにより読み出されたならば、それは最初のサイクルの間、マルチプレクサ350によって入力レジスタ360へ読み取られる(図26A参照)。次のサイクルにおいて、それは、x要素、y要素、及びz要素がレジスタキャッシュの異なるレジスタに配置されるように、クロスバーマルチプレクサ375によってレジスタキャッシュ380へ読み取られる。第1の命令内部の“#1”は、各データ要素が各レジスタの最小桁のデータレーンに配置されるべきであると共に、残るレーンは論理的ゼロ値で満たされるべきであることを示し、これは図26Bに示されている。同様にこのサイクルの間も、第2のロード命令により識別されたデータ要素は、入力レジスタ360へ読み出される。次のサイクルの間(図26C参照)、入力レジスタ360に記憶されたデータ要素は、クロスバーマルチプレクサ375によって、それらが第2のレーンに記憶されるレジスタキャッシュ380へ移動される。同様にこのサイクルの間も、第3のロード命令のデータ要素は入力レジスタ360に配置される。
次のサイクルにおいて、入力レジスタ360の内容は、クロスバーマルチプレクサ375によってレジスタキャッシュの第3のレーンへ伝送され、一方第4のロード命令の対象のデータ要素は、入力レジスタ360へ読み出される。これは図26Dに示されている。
最後に、図26Eに示されるように、次のサイクルにおいて、これらのデータ要素は、クロスバーマルチプレクサ375によって、それらが第4のレーンに記憶されるレジスタキャッシュ380へ伝送される。その後、レジスタキャッシュの各レジスタ内の、64ビットの幅広のデータのかたまりは、SIMDレジスタファイルの指定されたレジスタに出力される。
図25Aから図25Dにおいて採用された取り組み方(アプローチ)と対比して、図26Aから図26Eを参照して説明された最初の“VLD”命令の使用は、それによってデータ要素が一度特定のレーンにおいて配置されると共に残るレーンは数値ゼロで満たされたならば、任意の更新がなされる前に、レジスタ“D0”からレジスタ“D2”の内のいずれかにおける現在の内容をSIMDレジスタファイルから読み出す必要性を回避することに注目するべきである。図26Aから図26Eを調べると、レジスタキャッシュ380は、それがロード命令の手順に対してデータ要素を隠すと共に、各命令が完了したときにデータをSIMDレジスタファイルの適切なレジスタに書き込むので、この場合に”ライトスルーキャッシュ(write through cache)”として振る舞うことがわかる。しかしながら、レジスタファイルは、一般的に手順の中で続いて起こる各命令が実行されている間に読み取られる必要がない。
データ処理において、要素の可換性及び結合の性質を持つ演算子‘op’を、全ての要素の間に適用することにより、いわゆる要素のベクトルを1つの要素に減少させることが多くの場合必要とされる。これは、畳み込み演算として説明されることになる。畳み込み演算の典型的な例は、ベクトルの要素を合計すること、またはベクトルの中の要素の最大値を発見することである。
並列処理構造において、そのような畳み込み演算を実行するために使用される1つの知られた取り組み方は、図27を参照して記述される。畳み込みされるべきデータ要素“[0]”からデータ要素“[3]”はレジスタ“r1”に含まれている。当然のことながら、並列処理構造の利点は、同一の操作が複数のデータ要素に対して同時に実行されることを可能にすることができるということである。これは、いわゆる並列処理レーンに関して、概念がより明確に理解され得るということである。この例において、各並列処理レーンは、データ要素[0]からデータ要素[3]の内の1つを含んでいる。
まず第1に、ステップAにおいて、レジスタ“r2”に循環されたデータ要素を形成するように、データ要素に位置を2個動かす循環を行わせる第1の命令が発せられる。これは、ステップBにおいて単一命令複数データ(Single Instruction Multiple Data:SIMD)操作を適用できるように、異なるデータ要素を各処理レーンに配置する。
その後、ステップBにおいて、各レーンにおけるデータ要素に対して実行されるべきSIMD操作を行わせる第2の命令が発せられる。この例では、これらの複数の並列操作の結果のデータ要素はレジスタ“r3”に記憶される。従って、今“r3”におけるエントリ(entries)が、レジスタ“r1”のデータ要素の半分の結合結果を含むことがわかる。(すなわち、“r3”は“[0] op [2]”,“[1] op [3]”,“[2] op [0]”,及び“[3] op [1]”を含む。)
次に、レジスタ“r3”に記憶された結果に、ステップCにおいて1並列処理レーン循環されると共にレジスタ“r4”に記憶されることを生じさせる第3の命令が発せられる。前と同じように、“r4”のデータ要素について“r3”に記憶されたデータ要素の循環は、異なるデータ要素が同一の並列処理レーンを占有することを可能にする。
最後に、ステップDにおいて、更に1つの命令に各レーンに記憶されたデータ要素に対して実行されるべき複数のデータの操作を行わせる、第4の命令が発せられると共に、結果はレジスタ“r5”に記憶される
従って、ちょうど4個の命令を使用することにより、レジスタ全域の全てのデータ要素が結合され得ると共に、結果がレジスタ“r5”の各エントリに記憶されることがわかる(すなわち、“r5”の各エントリは[0] op [1] op [2] op [3]を含んでいる。)。結果のデータ要素は、必要に応じてレジスタ“r5”内の4個のエントリのいずれかから読み取られる。
図28は、一実施例の畳み込み命令の原理を説明する。各並列処理レーンがレーンの全体にわたって1個のデータ要素の幅と同一である固定幅を有する、従来の並列処理レーン(図27を参照して記述される)の配置とは違って、本実施例において、並列処理レーンの配置は異なる。この新しい配置において、その入力における各並列処理レーンの幅は、少なくとも2個のソースのデータ要素の幅と同一であり、かつその出力においては、一般的に1個の結果のデータ要素の幅と同一である。このような方法で並列処理レーンを配置することは、単一レジスタ内部のデータ要素のグループ(例えばデータ要素のペア)が並列処理操作の対象になることができるので、先行技術の構成を超える著しい利点を与えるということが見出されている。以下の検討から明確になるように、これは、更に付け加えられたレジスタにおける正確なエントリ位置において複数の操作が平行に発生することを可能にするためにデータ要素を配置する必要性がないので、先行技術の構成においてデータ操作(すなわち、循環操作)を実行する必要性を除去する。
従って、ソースのデータ要素d[0]からデータ要素d[3]は、レジスタの中のそれぞれのエントリとして与えられる。隣り合ったソースのデータ要素d[0]及びデータ要素d[1]は、ソースのデータ要素のペアとして取り扱うことができる。ソースのデータ要素d[2]及びデータ要素d[3]もまた、ソースのデータ要素のペアとして取り扱うことができる。それゆえに、この例では、2個のソースのデータ要素のペアがある。
ステップ(A)において、結果のデータ要素を生成するために、ソースのデータ要素の隣り合った各ペアに対して同一の操作が発生するように、レジスタ内部のソースのデータ要素の各ペアに対して操作が実行される。
それゆえに、当然のことながら、ソースのデータ要素のペア、及び対応する結果のデータ要素の全てが並列処理の同一レーンを占有する。ステップ(A)のあと、結果のデータ要素の数は、ソースのデータ要素の数の半分になることがわかる。データ要素“d[2] op d[3]”及び“d[0] op d[1]”もまた、ソースのデータ要素のペアとして取り扱うことができる。
ステップ(B)において、結果のデータ要素“d[0] op d[1] op d[2] op d[3]”を生成するために、ソースのデータ要素のペアに対して更に同一の操作が実行される。ステップ(B)のあと、結果のデータ要素の数もまた、ソースのデータ要素の数の半分になることがわかる。先に言及されたように、操作は要素の可換性及び結合の性質を持つ操作であり、それゆえ正確なソースのデータ要素の結合指示にかかわりなく、同じ結果のデータ要素は生成される。
それゆえに、ソースのデータ要素の数は、各操作の結果として2等分され得ると共に、必要とされる結果を生成するために、それらのソースのデータ要素に対して同一の操作が実行され得ることがわかる。従って、図27の先行技術の構成が、少なくとも4回の操作を実行することを必要とするのに対して、必要とされる結果のデータ要素は、ちょうど2回の操作で生成されることがわかる。当然のことながら、この有効性における改良点は、ソースレジスタ内部のデータ要素のグループに対する並列処理操作の実行を通して達成される。分かりやすくするために、ちょうど2個のソースのデータ要素のペアが説明されたが、当然のことながら、どんな数のソースのデータ要素のペアでも操作の対象になった可能性がある。同様に、分かりやすくするために、ソースのデータ要素のペアに対する操作が説明された一方で、当然のことながら、どんな数のソースのデータ要素(例えば、3、4、あるいはそれ以上)でも操作の対象になった可能性がある。
実際には、効率の良さの理由で、レジスタデータファイル20でサポートされる最小のレジスタサイズにより決定された最小数のデータ要素に並列操作を実行するために、畳み込み命令が用意される。図29は、ソースのデータ要素の数と同じ数の結果のデータ要素を生成する実行を説明する。
ソースのデータ要素“d[0]”からソースのデータ要素“d[3]”は、レジスタ“Dn”に与えられる。同じ数の結果のデータ要素を生成するために、ソースのデータ要素“d[0]”からソースのデータ要素“d[3]”は、レジスタ“Dm”にもまた与えられる。当然のことながら、レジスタ“Dn”及びレジスタ“Dm”は、複製された結果のデータ要素を生成するために、各ソースのデータ要素をレジスタ“Dn”から2回読み取るSIMD処理ロジック18により、同じレジスタになると思われる。
ステップ(A)において、単一のSIMD命令が発せられ、ソースのデータ要素の各ペアは、それについて実行された操作を受けると共に、対応する結果のデータ要素が生成される。
ステップ(B)において、対応する結果のデータ要素を生成するために、ソースのデータ要素の各ペアに、それについて実行された操作を受けさせるように、別の単一のSIMD命令が発せられる。
従って、結果のデータ要素を生成するために、ソースのデータ要素の全てが結合されたことがわかる。
図30Aから図30Dは、他で記述された同じ構文に従うさまざまな畳み込み命令の操作を説明する。当然のことながら、2個のレジスタの存在が示される場合、これらは同じレジスタであるかもしれない。同様に、当然のことながら、利用されるレジスタスペースの量を減少させるために、各ソースレジスタは、デスティネーションレジスタとして指定されこともあり得る。
図30Aは、それによって、‘n’ビットで表される同じレジスタからのソースのデータ要素のペアは、‘2n’ビットで表される結果のデータ要素を生成するために、それについて実行された操作を受ける、SIMD畳み込み命令の操作を説明する。‘2n’ビットを持つように結果のデータ要素を増進することは、オーバフローが発生するであろう可能性を減少させる。結果のデータ要素を増進するとき、それらは一般的に符号拡張か、またはゼロ詰めである。畳み込み命令を概説する以下の例は、そのような操作をサポートする。
図30Aに示される特定の例(VSUM.S32.S16 Dd, Dm)において、4個の16ビットのデータ要素を含んでいる64ビットのレジスタ“Dm”は、2個の32ビットの結果のデータ要素を含んでいる64ビットのレジスタ“Dd”に、畳み込まれると共に記憶される。
図30Bは、それによって、‘n’ビットで表された異なるレジスタからのソースのデータ要素のペアは、同様に‘n’ビットで表された結果のデータ要素を生成するために、それについて実行された操作を受ける、SIMD畳み込み命令の操作を説明する。最大及び最小命令を概説する以下の例は、そのような操作をサポートする。
図30Bに示される特定の例(VSUM.I16 Dd, Dn, Dm)において、それぞれ4個の16ビットのデータ要素を含んでいる2個の64ビットのレジスタ“Dm”,“Dn”は、4個の16ビットの結果のデータ要素を含んでいる64ビットのレジスタ“Dd”に、畳み込まれると共に記憶される。
図30Cは、それによって、‘n’ビットで表された同じレジスタからのソースのデータ要素のペアは、同様に‘n’ビットで表された結果のデータ要素を生成するために、それについて実行された操作を受ける、SIMD畳み込み命令の操作を説明する。図30Cに示される特定の例において、8個の16ビットのデータ要素を含んでいる128ビットのレジスタ“Qm”は、4個の16ビットの結果のデータ要素を含んでいる64ビットのレジスタ“Dd”に、畳み込まれると共に記憶される。
図30Dは、図30Bと類似しているが、しかしここでは“Dm”=“Dn”で、結果のデータの数値がデスティネーションレジスタに複写されるようにするSIMD畳み込み命令の操作を説明する。‘n’ビットで表された同じレジスタからのソースのデータ要素のペアは、、同様に‘n’ビットで表された結果のデータ要素を生成するために、それについて実行された操作を受け、そのどれもがレジスタの別のエントリに複写されている。図30Dに示される特定の例において、4個の16ビットのデータ要素を含んでいる64ビットのレジスタ“Dm”は、2個の16ビットの結果のデータ要素を2セット含んでいる64ビットのレジスタ“Dd”に、畳み込まれると共に記憶される。
図31は、畳み込み命令をサポートできると共に、SIMD処理ロジック18の一部として提供されるSIMD畳み込みロジックを概略的に説明する。分かりやすくするために、示されたロジックは、各隣り合ったペアの最大値を選択する命令をサポートするために使用される。しかしながら、以下で更に詳細に記述されるように、当然のことながら、ロジックは、他の操作に対してサポートを行うために容易に適応させられ得る。
ロジックは、状況に応じてソースのデータ要素(Dn[0]からDn[3])をレジスタ“Dn”から受信すると共に、ソースのデータ要素(Dm[0]からDm[3])をレジスタ“Dm”から受信する。もう一つの方法として、ロジックは、ソースのデータ要素(Qm[0]からQm[7])をレジスタ“Qm”から受信する。隣り合ったソースのデータ要素の各ペアは、関連する畳み込み演算ロジックユニット400に提供される。各畳み込み演算ロジックユニット400は、一方のソースのデータ要素を他方から減算すると共に、経路(path)415を通じて、マルチプレクサ420にどちらが大きいか指示を与える算術演算装置410を備えている。経路415を通じて与えられた指示に基づいて、マルチプレクサは、操作ロジックユニット400からソースのデータ要素の大きい方の値を出力する。それゆえに、畳み込み演算ロジックユニット400は、隣り合ったソースのデータ要素の結合されたペアの最大値を、それぞれ経路425,435,445,455を通じて出力するために配置されることが分かる。
選択及び分配ロジック450は、前述の命令をサポートして、結果のデータ要素を受信すると共に、必要に応じて経路431から経路434を通じて、SIMDレジスタファイル20のレジスタ“Dd”のエントリにそれらを供給する。選択及び分配ロジック450の操作は、これから記述されることになる。
図30Aに説明された命令をサポートするために、ソースのデータ要素“Dm[0]”からソースのデータ要素“Dm[3] ”は、下位の2個の畳み込み演算ロジックユニット400に与えられる。畳み込み演算ロジックユニット400は、経路425及び経路435を通じてデータ要素を出力する。経路431及び経路432は、符号拡張フォーマットまたはゼロ拡張フォーマットで“Dm[0] op Dm[1]”を提供することになると共に、一方経路433及び経路434は、符号拡張フォーマットまたはゼロ拡張フォーマットで“Dm[2] op Dm[3]”を提供することになる。これは、マルチプレクサ470にそれらの“B”入力を選択させ、マルチプレクサ460に符号拡張かゼロ拡張のいずれかを選択させ、マルチプレクサ490にそれらの“E”入力を選択させ、マルチプレクサ480にその“D”入力を選択させる畳み込み命令に応答するSIMDデコーダ16によって生成されている信号により達成される。
図30Bに説明された命令をサポートするために、ソースのデータ要素“Dm[0]”からソースのデータ要素“Dm[3]”は、下位の2個の畳み込み演算ロジックユニット400に与えられると共に、一方ソースのデータ要素“Dn[0]”からソースのデータ要素“Dn[3]”は、上位の2個の畳み込み演算ロジックユニット400に与えられる。畳み込み演算ロジックユニット400は、経路425、経路435、経路445、及び経路455を通じてデータ要素を出力する。経路431は、“Dm[0] op Dm[1]”を提供することになり、経路432は、“Dm[2] op Dm[3]”を提供することになり、経路433は、“Dn[0] op Dn[1]”を提供することになり、及び経路434は、“Dn[2] op Dn[3]”を提供することになる。これは、マルチプレクサ470にそれらのA入力を選択させ、マルチプレクサ480にその“C”入力を選択させ、マルチプレクサ490にそれらのE入力を選択させる畳み込み命令に応答するSIMDデコーダ16によって生成されている信号により達成される。
図30Cに説明された命令をサポートするために、ソースのデータ要素“Qm[0]”からソースのデータ要素“Qm[7]”は、畳み込み演算ロジックユニット400に与えられる。畳み込み演算ロジックユニット400は、経路425、経路435、経路445、及び経路455を通じてデータ要素を出力する。経路431は、“Qm[0] op Qm[1]”を提供することになり、経路432は、“Qm[2] op Qm[3]”を提供することになり、経路433は、“Qm[4] op Qm[5]”を提供することになり、及び経路434は、“Qm[6] op Qm[7]”を提供することになる。これは、マルチプレクサ470にそれらのA入力を選択させ、マルチプレクサ480にその“C”入力を選択させ、マルチプレクサ490にそれらのE入力を選択させる畳み込み命令に応答するSIMDデコーダ16によって生成されている信号により達成される。
図30Dに説明された命令をサポートするために、ソースのデータ要素“Dm[0]”からソースのデータ要素“Dm[3]”は、下位の2個の畳み込み演算ロジックユニット400に与えられる。畳み込み演算ロジックユニット400は、経路425及び経路435を通じてデータ要素を出力する。経路431は、“Dm[0] op Dm[1]”を提供することになり、経路432は、“Dm[2] op Dm[3]”を提供することになり、経路433は、“Dm[0] op Dm[1]”を提供することになり、及び経路434は、“Dm[2] op Dm[3]”を提供することになる。これは、マルチプレクサ470にそれらの“A”入力を選択させ、マルチプレクサ480にその“D”入力を選択させ、マルチプレクサ490にそれらの“F”入力を選択させる畳み込み命令に応答するSIMDデコーダ16によって生成されている信号により達成される。もう一つの方法として、当然のことながら、その代わりに、上位の2個の畳み込み演算ロジックユニット400にもまた、ソースのデータ要素を与えることができる共に、図30Bを参照する実例のように、選択及び分配ロジック450の複雑さを軽減する同一の操作を実行することもできる。
従って、このロジックは、結果のデータ要素が、ソースのデータ要素からの単一の操作で、直接的に2個の隣り合ったソースのデータ要素から生成されることを可能にする。
上記で言及されたように、畳み込み演算ロジックユニット400は、ソースのデータ要素に対するあらゆる数の操作を実行するために配置されても良い。例えば、マルチプレクサ420が、経路425を通じて最小限のソースのデータ要素を供給することを選択的に可能にするために、更に付け加えられたロジックが容易に提供されることもあり得る。もう一つの方法として、算術演算装置410が、ソースのデータ要素に選択的な加算、減算、比較、乗算を行うために、及び結果のデータ要素を出力するために配置されることもあり得る。それゆえに、当然のことながら、本実施例の取り組み方は、この配置を使用して実行され得る畳み込み演算の範囲で、多くの柔軟性を有利に提供する。
同様に、当然のことながら、図31を参照して説明されたロジックは16ビット操作をサポートする一方、同様のロジックが、32ビット操作または8ビット操作、あるいはもちろん他のサイズの操作をサポートするために提供されることもあり得る。
図32は、“ベクトル×スカラ”SIMD命令(vector-by-scalar SIMD instruction)を説明する。SIMD命令は、他で示された同じ構文に従う。当然のことながら、前と同様に、2個のレジスタの存在が示されたら、それらは同一のレジスタで良い。同様に、利用されるレジスタスペースの量を減少させるために、及び効率的なデータ要素の再循環を可能にするために、各ソースレジスタはデスティネーションレジスタとして指定されることもあり得る。
レジスタ“Dm”は、データ要素“Dm[0]”からデータ要素“Dm[3]”の多数のデータ要素を記憶する。これらのデータ要素のそれぞれは、選択可能なスカラオペランド(scalar operand)を表す。スカラSIMD命令によるベクトルは、データ要素の1つをスカラオペランドとして指定すると共に、別のレジスタ“Dn”の全てのデータ要素に対して、並列に、そのスカラオペランドを使用する操作を実行し、その結果は、レジスタ“Dd”の対応するエントリに記憶される。当然のことながら、レジスタ“Dm”、レジスタ“Dn”、及びレジスタ“Dd”に記憶されたデータ要素は、全て異なるサイズのデータ要素であることもあり得る。特に、結果のデータ要素は、ソースのデータ要素に対して増進されても良い。増進することは、1つのデータタイプから別のものに変えるために、ゼロ詰めまたは符号拡張を必要とする。これは、オーバフローが発生し得ないことを保証するという追加の利点を有しているかもしれない。
データ要素のマトリクス(行列)を含む状況において、SIMD操作に対して1つのスカラオペランドを選択することができるということは、効率的な特色である。異なるスカラオペランドは、SIMDレジスタファイル20に書き込まれ得ると共に、更にデータ要素を再度書き込むこと、またはデータ要素を動き回らせることを必要とせず、異なる“ベクトル×スカラ”演算に容易に選択される。以下の乗算命令の例は、そのような操作をサポートする。
“Vd”,“Vn”,及び“Vm”は、選択されたレジスタフォーマット及び選択されたデータタイプから組み立てられたエレメントのベクトルを示す。このベクトル内の要素は配列表記法[x]を使用して選択されている。例えば、“Vd[0]”は、ベクトル“Vd”の最も低位の要素を選択する。
反復子“i”は、ベクトル定義を可能にするために使われ、ベクトル内部の要素の数未満である“i”の全ての値に対してプログラムの動作は有効である。この命令の定義は、‘データタイプ’及び‘オペランドフォーマット’の列を与え、有効な命令は、各列から1つを取ることで組み立てられる。
図33は、SIMDレジスタファイル20内のスカラオペランド“H0”からスカラオペランド“H31”の配置を説明する。他で言及されたように、SIMDレジスタファイル20内のデータ要素の位置を指定する命令の領域で使用される好ましいビットの数は、5ビットである。これにより、32の可能な位置を指定することができる。当然のことながら、スカラオペランドをSIMDレジスタファイル20に写像する1つの可能な方法は、レジスタ“D0”からレジスタ“D31”の各々の中で最初のエントリに各オペランドを配置したことである。しかしながら、SIMDレジスタファイル20は、その代わりに写像するように配置されるか、またはSIMDレジスタファイル20内の最初の32個の論理的エントリに、選択可能なスカラオペランドの別名(省略形)を付ける。このような方法でスカラオペランドを配置することは、著しい利点を与える。第1に、スカラオペランドを近接したエントリに配置することにより、スカラオペランドを記憶するために使用される“D”レジスタの数を最小化し、言い換えると、他のデータ要素を記憶するために利用可能な“D”レジスタの数を最大化する。近接したエントリに記憶されたスカラオペランドを備えることにより、特に行列操作またはフィルタ操作を実行しているときに有効である、ベクトル内部の全てのスカラオペランドがアクセスされることを可能にする。例えば、ベクトル乗算による行列は、ベクトルから選択された各スカラに対して実行されるべきスカラ操作によるベクトルを必要とする。更に、このような方法で少なくともいくつかのレジスタから選択可能なスカラオペランドを記憶することは、全てのスカラオペランドに、それらのレジスタから選択されることを可能にする。
図34は、一実施例の“ベクトル×スカラ”演算を実行するために構成されたロジックを概略的に説明する。
ソースのデータ要素(Dm[0] からDm[3])は、レジスタ“Dm”から与えられる。各ソースのデータ要素は、多数のマルチプレクサ500を備えるスカラ選択ロジック510へ与えられる。各ソースのデータ要素は、各マルチプレクサ500の1つの入力に与えられる(すなわち、各マルチプレクサは、ソースのデータ要素“Dm[0]”からソースのデータ要素“Dm[3]”を受信する。)。それゆえに、各マルチプレクサは、ソースのデータ要素“Dm[0]”からソースのデータ要素“Dm[3]”のどれでも出力することができる。この実施例では、各マルチプレクサは、同じソースのデータ要素を出力するように配置される。それゆえに、スカラ選択ロジック510は、1個のスカラオペランドを選択し、かつ出力するように配置され得る。これは、マルチプレクサに、ソースのデータ要素“Dm[0]”からソースのデータ要素“Dm[3]”の1つを、選択されたスカラオペランドとして出力させる“ベクトル×スカラ”命令に応答するSIMDデコーダ16によって生成されている信号により達成される。
“ベクトル×スカラ”演算ロジック520は、選択されたスカラオペランドを受信すると共に、レジスタ“Dn”から与えられたソースのデータ要素“Dn[0]”からソースのデータ要素“Dn[3]”もまた受信する。各ソースのデータ要素は、多数の演算装置530を備える“ベクトル×スカラ”演算ロジック520に与えられる。各ソースのデータ要素は、演算装置530の1つに与えられる(すなわち、各演算装置は、ソースのデータ要素“Dm[0]”からソースのデータ要素“Dm[3]”の1つと選択されたスカラオペランドとをを受信する。)。“ベクトル×スカラ”演算ロジック520は、2個のデータ要素に対して操作を実行すると共に、前述の命令をサポートして、SIMDレジスタファイル20内のレジスタの個々のエントリに記憶するための結果のデータ要素を出力する。これは、受信されたデータ要素に対して必要とされる操作を演算装置530に実行させる“ベクトル×スカラ”命令に応答するSIMDデコーダ16によって生成されている信号により達成される。
従って、このロジックは、ソースレジスタのデータ要素の1つが、スカラオペランドとして選択されると共に、別のレジスタからの全てのソースのデータ要素に対して、同一のスカラオペランドを使用して“ベクトル×スカラ”演算を実行することを可能にすることが分かる。
図35は、SIMD処理の間のシフト操作及び縮小操作を処理する知られた方法を示す。図に示すように、この操作を実行するために3個の個別の命令(SHR、SHR、及びPACK LO)が要求される。図35において、及び図36、図38においては、明確化のために中間数値が点線によって示される。
図36は、本技術による右シフト操作及び縮小操作を示す。本実施例の構造は、特に、シフト操作及び縮小操作を処理するために十分に適用されると共に、単一の命令に応答してそうすることができる。命令は、SIMDデコーダ16(図1参照)内部の命令デコーダにより復号(デコード)される。この例では、SIMDレジスタファイル20(図1参照)に配置されたレジスタ“Qn”内のデータは、右に5ビットシフトされる。更に、残っているデータが丸められる。次に、同様にSIMDレジスタファイル20に配置されたデスティネーションレジスタ“Dd”へ、右側の16ビットが端から端まで転送される。そのハードウェアは、命令に応じてデータの丸め、及び/またはデータの飽和を任意にサポートすることができる。整数を右シフトして処理するとき、一般的には更に小さい数を生み出すので、一般的に右にシフトする命令は、データの飽和を必要としない。しかしながら、右シフトを行いかつ縮小を行う時は、データの飽和は、適切であるかもしれない。
データの飽和は、最も近い許容値を選択することによりデータ要素をある範囲に制限するために利用され得る処理である。例えば、もし2個の符号なし8ビット整数が8ビットレジスタを使用して掛け合わされると、結果はオーバフローする可能性がある。この場合、与えられ得る最も正確な結果は、2進数の“11111111”であると共に、このように、その数はこの数値を与えるために飽和状態になることになる。それによって縮小された数値が狭い空間に適応できない、シフト及び縮小を行うとき、同様の問題は起こりえる。この例では、符号のない数値の場合、シフトステップにおいて不要とされるどのビットもゼロでないとき、その場合には、数値は、最大許容値の飽和状態にされている。符号付き数値の場合、問題は更に複雑である。この場合、最も重要なビットが不要とされるどのビットとも異なるとき、その数値は、正の最大許容値または負の最大許容値の飽和状態にされていなければならない。
データの飽和は、データ要素の入力のタイプがその出力のタイプと異なる場合、すなわち符号付き数値がシフト及び縮小され、飽和状態にされることで符号なし数値が出力される場合にもまた発生する。異なるデータタイプを出力する能力が非常に有益なこともある。例えば、画素の処理において、輝度は符号なし数値であるが、しかしながら、この数値を処理する間、それを符号付き数値として処理することは適切かもしれない。処理の後で、符号なし数値が出力されるべきであるが、しかしながら、符号付き数値から符号なし数値への単純な変更は、数値を飽和させる能力が与えられない限り、問題を引き起こすこともあり得る。例えば、処理の間に少しの間違いが原因で輝度値が負の値に減少したならば、この負の符号付き数値を符号なし数値として単純に出力することは無意味であろう。このように、符号なし数値を出力する前に、どんな負の数値もゼロに飽和させる能力は、非常に有益な手段である。
異なるシフト命令に対する可能なフォーマットの例が、以下のテーブル6(表14から表16)及びテーブル7(表17)に与えられている。図に示すように、命令は、それが“V”を最前列に有することによりベクトル命令であることを指定し、更に“SH”によって、この場合には即時にシフトするシフトが指定されると共に、右かまたは左かの方向は、この時“R”または“L”により表される。命令は、同時に、テーブル0(表1)と同様に、デスティネーションレジスタ内のデータ要素サイズである第1のタイプと、ソースレジスタのデータ要素サイズである第2のタイプの2個のタイプを有する。次の情報は、デスティネーションレジスタ及びソースレジスタの名前を有すると共に、その場合には、直接の値が与えられても良く、この値はデータがシフトされるべきビットの数を表すと共に“#”が前に置かれる。命令の一般的なフォーマットに対する修飾語句が使用される可能性があり、“Q”は、飽和状態の整数計算を利用する操作を表すために使用されると共に、“R”は、丸めを実行する操作を表すために使用される。命令のフォーマットのより多くの詳細は、例えばテーブル0(表1)のように、説明の最初の方で与えられている。
テーブル7(表17)は、符号付き変数によるシフトに関する命令を示す。この命令は、即値(immediates)による左シフトと同一であるが、しかし、即値に命令を与える代わりに、符号付き変数のベクトルが記憶されている場所を示すレジスタアドレスには命令が与えられる。この場合、負の数が右方向シフトを表している。シフトされるべきビットの数は、ベクトル内に記憶されているので、各データ要素に対して、それらが異なる量でそれぞれシフトされ得るように、異なる符号付き変数は記憶され得る。この処理は、図39に、より詳細が示されている。
テーブル6
「即値によるシフト」
即値シフトは、ソースベクトル全ての要素を同じ量によってシフトするために、命令内部に符号化された直接の数値を使用する。縮小バージョン(Narrowing versions)は、データの飽和を含むことができる数値の縮小化(casting down)を可能にし、一方、ロングバージョン(Long versions)は、任意の固定小数点での拡大化(casting up)を可能にする。累積バージョン(accumulate versions)によるシフトは、多くのDSPアルゴリズムに見られる効率的なスケーリング及び累積をサポートするために提供される。右シフト命令もまた、丸めを行うオプションとして与えられる。丸めは、実際には丸められるべき数の半分を追加することにより実行される。このように、“n”の右シフトを行う時、それをシフトする前に、“2n−1”が数値に加算される。このように、以下のテーブル(表)において、もし“n≧1”の場合、丸め(n)(round(n))=2n−1で、もし“n<0”の場合、丸め(n)(round(n))=0である。ビット単位の抽出命令は、データの効率的な梱包を可能にするために含まれる。
テーブル7
「符号付き変数によるシフト」
このセクションのシフトは、第2のベクトルにおいて指定された符号付きシフト量により制御された要素の1つのベクトルに対するシフト実行する。符号付きシフト量をサポートすることは、合理的には負の値になる可能性がある指数値によるシフトに関するサポートを可能にし、負の制御値は右シフトを実行することになる。ベクトルシフトは、各要素が異なる量によりシフトされることを可能にするが、しかし、ベクトルシフトは、シフトが実行される前に、ベクトルの全てのレーンに対するシフト制御オペランドを複製することにより、同一の量の分だけ全てのレーンをシフトするために使用され得る。符号付きシフト制御値は、シフトされるべきオペランドの最小のオペランド要素サイズと同一のサイズの要素である。しかしながら、シフター変数は、シフト量を決定するために、各レーンの最下部の8ビットだけを使用して解釈される。丸め、及び飽和オプションもまた、利用可能である。
こうして、図に示すように、ハードウェアは、ソースのデータ要素と結果のデータ要素の両方のサイズ、及び、時にはデータがシフトされるべき位置の数もまた指定することが可能である命令をサポートする。これは、それを非常に適応可能で強力な道具にする。
図36において示される右シフト操作及び縮小操作は、多数の可能な応用例を有している。例えば、固定小数点数値を含む、確かな精度が要求される計算において、計算が実行される間、オーバーフローまたはアンダーフローの危険性を回避するために、例えばおよそ16ビットの数値を32ビットのデータ値の中心に配置することは適しているかもしれない。計算の最後に、16ビットの数が要求される可能性があると共に、このように、図36において示されるようなシフト操作及び縮小操作が適切である。異なるサイズのソースレジスタ及び異なるサイズのデスティネーションレジスタを使用する本技術により予想される可能性は、ここでは特に効果的であると共に、異なるサイズのデータが、SIMD処理の間、特定のレーンに留まることを可能にする。
図36において説明された操作に類似したシフト操作及び縮小操作の更なる使用は、カラー画素データの処理内にあることもあり得る。ビデオデータは、全てがそれらに対して実行されるべき同一の操作を必要とする複数の画素を含んでいるので、SIMD処理は、特にビデオデータに適している。このように、異なる画素データは、レジスタにおける異なるレーン内に存在することができると共に、単一命令は、全てのデータに対して同一の操作を実行することができる。多くの場合、ビデオデータは、赤色、緑色、及び青色のデータとして生じる可能性がある。これは、それらに対して意味のある操作が実行される前に分離される必要がある。図37は、16ビットデータ要素に存在する赤色、緑色、及び青色データの一般的な例を示す。示されたこの例では、青色データが3ビットの左シフト操作及び縮小操作により抽出されることもあり得る。位置3個の左シフトは、概略的に点線のレジスタ(中間の値を表わしている)で示されるように、青色データをデータ要素の中心の左に送り、3個のゼロが、データの左シフトにより引き起こされたデータ数値の右における3個の空の位置を満たす。縮小操作は、結果として生じる8ビットのデータ要素に移されている、青色データ及び3個のゼロに帰着する。
シフトすること及び縮小することに加えて、同様に本技術は、拡大及びシフトするためにも使用され得ると共に、この処理は図38に示される。この場合、拡大することは、左シフトに続いて実行される。この操作は、例えば、32ビットの数値が64ビットの数値内部で適切な場所に配置されるように、32ビットの数値を64ビットの数値へ移すために使用し得る。示された例において、最下位ビットとして加えられているゼロがレーンの最上位ビットに配置されることにより、2個の32ビットの数値が64ビットの数値へ移される。
図39は、各データ要素がシフトされるべき位置の数を表すと共に、符号付き整数であって負の数が右シフトを表す数値のベクトルを使用することの可能性を示す。各データ要素に対する数値を保持するレジスタが使用されると共に、各データ要素は、そのレーンに設定された数値で指定された量によりシフトされる。そのような操作に対する命令は、予めテーブル7(表17)に設定される。
図40は、単純な多重化操作を概略的に示す。この多重化操作において、マルチプレクサ700は、制御ビット“c”の数値に従って“D”に出力されるべき数値“a”または数値“b”のいずれの数値も選択する。“c”は、“a”と“b”の間で出力を選択するために使用される。“c”は、多くの場合、“a > b”のような判定の結果に基づいている。構造の実施例は、SIMD処理中の多重化操作を実行する能力を与える。SIMD処理は、分岐操作の実行に適していないと共に、このように、他の命令、もっと正確に言えば、2個のソースレジスタ“a”及び“b”のどちらの部分が選択されるべきかを表すために使用されているマスクが生成される場合、多重化は標準的に実行され得ない。
このマスクは、2個のソースレジスタa及びbのどちらの部分が選択されるべきかを表すために使用される制御値から構成される。実施例によっては、一定の位置における“1”は、“b”の一定のセクションが選択されるべきであることを表しても良く、一方、その位置における“0”は、“a”の対応するセクションが選択されるべきであることを表すであろう。このマスクは汎用レジスタに記憶され、それによって特殊目的レジスタの必要性を減少させる。
マスクの型は実行されるべき多重化操作に依存していると共に、マスクの型はこの操作に応答して生成される。例えば、この場合、上で与えられた“a”と“b”との比較が実行される。これは、部分部分で実行されることができ、例えば、SIMD処理における対応するデータ要素が比較される。“a”と“b”の対応するデータ要素が比較されると共に、“b”が“a”より大きいか、または“b”が“a”と等しいあるいは“a”より小さいかに依存する制御値を記憶するために使用されている汎用レジスタの一部に数値が書き込まれる。これは、命令“VCGT”より優れた比較を使用して全てのデータ要素に対して並列に実行され得る。この命令は、システムの実施例の命令セットとして与えられる。以下のテーブル8(表18、表19)は、構造の実施例により与えられる多様な比較命令を示す。
テーブル8
「比較及び選択」
データの水準選択及びデータのマスキング(masking)を提供するために使用され得るマスクを生成するための変数の比較とテストが実行され得る。それは、ベクトル化されたコードの終わりで、ベクトル内部の最大値及び最小値を見つけるために使用され得る畳み込みのバージョンを含んでいる、最大値及び最小値を選択するための命令もまた提供する。
一度マスクが生成されたならば、このマスクを含む汎用レジスタである制御レジスタ“C”を使用して、単一命令が“a”または“b”を選択するために使用され得る。このように、データプロセッサは、“a”または“b”を選択する多重化操作を実行するために、“C”により制御される。
図41は、ソースの数値“a”またはソースの数値“b”の選択がビット幅で実行されるシステムの実施例を概略的に示す。この場合、レジスタ“a”710とレジスタ“b”720とでデータ要素を比較することにより、制御レジスタ730がデータで満たされた。このように、例えばおよそ8ビット幅のデータ要素“a0”は、同じサイズのデータ要素“b0”と比較される。このとき、“a”は“b”より小さい、または“b”と等しい場合、このように、8個のゼロ(“0”)が制御レジスタ730の対応する部分に挿入される。もし、“a”が“b”より大きい場合、8個の“1”が制御レジスタ730の対応する部分に挿入される。類似の比較が全てのデータ要素に対して並列に実行されると共に、対応する制御ビットが生成される。制御ベクトルを生成する比較操作は、命令“VCGT.S8 c,a,b”に対応する。その時、選択は、ソースレジスタに記憶されたビットと制御レジスタに記憶された対応するビットとの間において、単純な論理演算を実行することにより、少しずつとても単純に実行され得ると共に、それぞれの結果のビットが、この例ではレジスタ730であるデスティネーションレジスタに書き込まれており、すなわち結果は制御値を上書きする。このビット単位の選択の利点は、データタイプと幅の独立性であると共に、適切な場合、異なるサイズのデータ要素が比較され得ることである。
図42は、ビット幅で制御が行われないが、データ要素で制御が行われる代わりの実施例を示す。示された実施例において、もし、制御レジスタ“C”730内のデータ要素がゼロより大きい、またはゼロと等しい場合、ソースレジスタ“b”720内の対応するデータ要素、それはデスティネーションレジスタ(この場合レジスタ720)に書き込まれる。もし、この例のように、“C”が符号付き整数の場合、“a”または”b”のいずれを選択するかを決定するときに、“C”の最上位ビットだけが注目される必要がある。
他の実施例では、“C”の他の性質が、レジスタ“a”710からのデータ要素が選択されるべきかどうか、またはレジスタ“b”720からのデータ要素が選択されるべきかどうかを決定するために使用され得る。そのような性質の例は、この場合最下位ビットである制御値の1ビットだけが、再度注目される必要がある“C”が奇数か偶数か、または“C”がゼロと等しいか、ゼロと等しくないか、あるいはゼロより大きいかということを含んでいる。
一般的に、ARMの命令、及び実際多くの他のRISC命令だけが、どの命令に対しても3個のオペランドを供給する。多重化操作は、2個のソースレジスタ“a”及び“b”、制御レジスタ“C”、及びデスティネーションレジスタ“D”を指定するために、一般的に4個のオペランドを必要とする。本システムの実施例は、一般的に多重化操作に従う、少なくともソースのデータまたは制御データの2セットの内の1つは、もはや必要とされないという事実を巧みに利用する。このように、デスティネーションレジスタは、2個のソースレジスタの内の1個、または制御レジスタのどちらかになるように選択される。制御レジスタは汎用レジスタであって特殊レジスタではないので、これだけが機能する。システムの実施例において、1個のソースレジスタに書き戻すことを指定する命令、他のソースレジスタに書き戻すための別の命令、制御レジスタに書き戻すための第3の命令の3個の異なる命令が命令セット中に提供される。各命令は、2個のソースレジスタ及び制御レジスタを指定する適正な3個のオペランドを必要とする。これらの3個の命令は、下記のテーブル9(表20)に指定される。
図43は、システムにより提供される3個の多重化命令に対応するマルチプレクサの配置の3個の例を概略的に示す。図43Aは、ビット単位の選択“VBSL”命令を実行するために接続されたマルチプレクサ701を示す。この例では、図41及び図42において説明された例とは反対に、“C”が偽(false:0)であるとき、“A”が選択されると共に、“C”が真(true:1)であるとき、“B”が選択される。説明された実施例において、デスティネーションレジスタは、結果の数値が制御値を上書きするように、制御レジスタと同一である。もし、逆の選択が要求される、すなわち“C”が真であるとき、“A”が選択されると共に、“C”が偽であるとき、“B”が選択されるならば、オペランド“A”とオペランド“B”の単純な交換により、同一の回路が使用され得る。
図43Bは、もし真ならば、ビット単位で挿入する“BIT”命令に対応するマルチプレクサ702を示し、かつソースレジスタ及びデスティネーションレジスタの両方として振る舞うと共に結果のデータで上書きされるソースレジスタ“A”である。この例では、“B”は、“C”が真のとき、“A”に書き込まれ、一方、もし“C”が偽のとき、レジスタ“A”の現在の数値は変化しない状態を保持する。この実施例では、もし逆の選択が要求される、すなわち、もし“C”が真でなく偽で、“B”をデスティネーションレジスタに書き込むことを要求される場合、デバイスがマルチプレクサ701の対称性を備えていないので、レジスタの配置を単純に入れ替えることは不可能である。
図43Cは、図43Bの逆の選択、すなわち、もし偽ならば、ビット単位の挿入を行う“BIF”命令に対応するように配置されるマルチプレクサ703を示す。この実施例では、“C”が偽のとき、レジスタ“A”の数値がレジスタ“B”へ書き込まれ、一方、“C”が真のとき、レジスタ“B”の数値は変化しない状態を保持する。図43Bのように、このシステムには対称性がない。
図44は、メモリ内部に記憶された一連のバイトデータ“B0”から“B7”を概略的に説明する。これらのバイトデータは、同じバイトデータが、現在のエンディアンモード(endianess mode)に関係なく、所定のメモリアドレスの読み取りに応答して返されるであろうバイトの不変のアドレス指定(byte invariant addressing)に従って記憶される。メモリは、位置合わせされないアドレス指定(unaligned addressing)もまたサポートし、それによりハーフワードデータ(half words)、ワードデータ(words)、または更に大きなマルチバイトデータ(multi-byte data)要素が、任意のメモリバイトアドレスから始まるメモリから読み取られる。
8個のバイトデータ“B0”から“B7”がリトルエンディアンモード(little endian mode)のシステムを備えたメモリから読み取られるとき、その場合にバイトデータ“B0”から“B7”は、レジスタ800内部に、図44に示される順番で適切に配置される。レジスタ800は、それぞれが16ビットのハーフワードデータを備える4個のデータ要素を含んでいる。図44は、同様にシステムがビッグエンディアンモード(big endian mode)で動作しているときにレジスタ802に読み出されている同じ8個のバイトデータ“B0”から“B7”を示す。
この例では、一度メモリから個々のSIMDレジスタ800,802に読み出されるデータは、データ要素サイズが2倍となる2乗操作(squaring operation)の処理を受ける。従って、結果は2個のデスティネーションSIMDレジスタ804,806に書き込まれる。図44からわかるように、これらのレジスタペア804,806の最初または2番目に個々に書き込まれた結果の数値は、データがメモリから読み取られた際のエンディアンモードに応じて変化する。従って、2乗された結果の数値を更に手際よく処理するSIMDコンピュータプログラムは、エンディアンモードに応じてデータの異なる配置を考慮するように変更される必要があるかもしれない。これは、不都合にも、データがメモリ内部に記憶された方法における異なるエンディアンに対処するために、2個の異なる形式のコンピュータプログラムを作り出す必要性が生じる。
図45は、再整理ロジック808の装置によりこの問題を扱う。データ処理システムは、指定されたメモリアドレスから始まると共に、メモリのバイトの不変のアドレス指定の特質を利用するメモリから8個のバイトデータ“B0”から“B7”を読み取る役目を果たすメモリアクセスロジック(memory accessing logic)810を含む。メモリアクセスロジック810の出力は、従って、エンディアンモードに関係なく同一の出力レーンにおいて、所定のメモリアドレスからのバイトデータの読み取りを提供する。このように、説明されたデータ要素がハーフワードデータである例において、特定のメモリアドレスから再生されたバイトデータは、それが他のエンディアンモードにおけるハーフワードデータの最下位桁部分である一方、あるエンディアンモードのときはハーフワードデータの最上位桁部分であるかもしれない。
データ要素再整理ロジック808は、SIMDレジスタ812にロードされたデータ要素がリトルエンディアン形式で記憶されたデータと一致する形式となると共に、メモリシステム内部で使用されているエンディアンモードに関係なく再配置なしでロードされるように、メモリアクセスロジック810によりメモリから読み出されるデータ要素の再整理に関与する。メモリシステム内部で使用されているリトルエンディアンモードの場合、データ要素再整理ロジック808は、バイトデータを再整理しないと共に、これらを変更せずに通過させることになる。しかしながら、メモリ内部にビッグエンディアン形式で記憶されているデータの場合、データ要素再整理ロジック808は、ハーフワードのデータ要素がSIMDレジスタ812内部のリトルエンディアン形式で現れるように、それぞれのハーフワードでメモリから読み取られるバイトデータの順番を逆転する役目を果たす。このように、単一のSIMDコンピュータプログラムは、メモリ内部に記憶された際のエンディアンモードに関係なくSIMDレジスタに移されたデータ要素に対して、正しいデータ処理操作を実行できる。図45から、データ要素再整理ロジック808が、メモリにより使用されているエンディアンモードを表している信号、及び当該データ要素サイズを表している信号に応答することが理解されることになる。使用されているエンディアンモードは、何らかの再整理が要求されるかどうかを制御することになり、サイズは、もし要求されるならば、適用される再整理の性質を制御することになる。データがメモリ内部にリトルエンディアンモードで記憶されると共に、SIMDレジスタがリトルエンディアンであるとき、再整理は要求されないことが理解されることになる。反対に、もしSIMDレジスタがビッグエンディアン形式と仮定される場合、データがメモリ内部にビッグエンディアン形式で記憶されたときは再整理は要求されないであろうが、しかし、データがメモリ内部にリトルエンディアン形式で記憶されたときには、再整理が要求されるであろう。
図46は、この例ではデータ要素が32ビットデータワードであることを除いて、図45のそれと類似した例を説明する。図から分かるように、これらのデータワードがビッグエンディアン形式でメモリに記憶されるとき、データ要素再整理ロジック808により適用される再整理は、メモリアクセスロジック810により読み出される4個のバイトデータ要素のバイト順番(byte order)を、これらが、メモリ内にリトルエンディアン形式で記憶されたデータと一致する形式でSIMDレジスタ812に記憶されると共に、再配置の必要なくロードされるように逆転する。
当然のことながら、ここに全体として記述されたプロセッサシステムの状況において、メモリアクセスロジック810及びデータ要素再整理ロジック808は、先に記述されたロード記憶ユニットの一部を形成しても良い。スカラレジスタにデータを読み取るときに、スカラレジスタ内部のデータに対して特定のエンディアンが仮定される場合、データ要素再整理ロジック808もまた、メモリシステムのエンディアンを補償するために使用されても良い。
図47は、データ要素再整理ロジック808の更に詳細を説明する。これは、個々に制御された信号X、信号Y、及び信号Zにより制御されたマルチプレクサの3個の段階として形成されることが理解されることになる。これらの3個の階層は、それぞれ隣接したバイトデータ、隣接したハーフワードデータ、隣接したワードデータの場所を逆転させる原因となる。制御信号X、制御信号Y、及び制御信号Zは、有効な状態(真の状態)にされたときビッグエンディアンモードを表すエンディアン信号、及び、図47に説明されるように、それぞれ64、32、または16ビットのデータ要素サイズを表すサイズ信号から復号される。当然のことながら、データ要素再整理ロジックの複数の他の形式が、図45及び図46に説明されるような、同じ機能的な結果を達成するために使用されることもあり得る。
メモリのバイトの不変のアドレス指定を実行するために使用されるメモリアクセス命令は、プロセッサのスカラレジスタバンクのレジスタ内部に保持されるメモリアドレス識別子を都合良く使用する。プロセッサは、SIMDレジスタ内部の選択されたデータ要素の1つを操作するデータ処理命令と同じように、データ要素サイズを変更するデータ処理命令をサポートする。
図48は、それぞれテーブルレジスタとしての役目を果たすレジスタ“D0”,“D1”、インデックスレジスタ“D7”、及び結果レジスタ“D5”のリストを含んでいるレジスタデータ記憶装置900を説明する。テーブルレジスタ“D0”,“D1”は、レジスタデータ記憶装置900内部で隣接して番号が付けられているレジスタであることが理解されることになる。結果レジスタ“D7”及びインデックスレジスタ“D5”は、テーブルレジスタに関連すると共に、お互いに関連して、任意の位置に置かれる。このデータ操作に対応する命令の構文は図中に示されている。
図49は、テーブル検索拡張命令の動作を概略的に説明する。命令は、例えばリストの中の最初のレジスタ、及びリストの中のレジスタの番号(例えば、1から4)を指定することにより、テーブルレジスタのブロックとして使用されるべきレジスタのリストを指定する。命令は、インデックス(索引)レジスタ“D7”として使用されるべきレジスタ、及び結果レジスタ“D5”として使用されるべきレジスタもまた指定する。テーブル検索拡張命令は、テーブルレジスタ“D0”,“D1”内部に記憶されたデータ要素のデータ要素サイズ、及び、選択され、結果レジスタ“D5”に書き込まれるべきデータ要素のデータ要素サイズを更に指定する。説明された例において、テーブルレジスタ“D0”,“D1”は、それぞれ8個のデータ要素を含む。従って、インデックス値は、0から15の範囲内の期間を有する。この予め決められた範囲外のインデックス値は、テーブル検索には使用されず、その代わりとして、結果レジスタ“D5”内部の対応する場所は変化しないままの状態とされる。説明されるように、第4及び第6のインデックス値は、このように範囲外である。他のインデックス値は、それぞれテーブルレジスタ“D0”,“D1”内部のデータ要素を示すと共に、これらのデータ要素は、次に結果レジスタ“D5”の対応する場所に記憶される。インデックスレジスタ“D7”内部のインデックス値と、結果レジスタ“D5”内部のデータ要素の場所との間には、1対1の対応関係がある。結果レジスタ“D5”内の“U”マークのついた数値は、その場所に記憶された数値はテーブル検索拡張命令の動作の間保持されることを表す。このように、命令の実行の前にその場所に記憶されたどんなビットでも、命令の実行の後でその場所にまだ記憶されている。
図50は、図49からのインデックス値を説明するもので、SIMD減算操作に従うことにより16のオフセットがインデックス値のそれぞれに適用される。これは、範囲外のインデックス値を先の範囲内のインデックス値とする。先の範囲外の数値は、直ちに範囲内に動かされる。このように、今変更されたインデックス値を含んでいるインデックスレジスタ“D7”が別のテーブル検索拡張命令において再利用されるとき、第4及び第6のインデックス値は、今は範囲内であると共に、同様に第2のテーブル検索拡張命令の実行の前にリロード(reloaded)されたテーブルレジスタ“D0”,“D1”(または、第2のテーブル検索拡張命令において指定される可能性がある他の異なるレジスタ)において実行されるテーブル検索に使用される。このように、インデックスレジスタ“D7”内部のインデックス値の単一のセットは、オフセットに左右される可能性があり、その上、利用可能である更に大きなテーブルの効果を与えるために、リロードされたテーブルレジスタ“D0”,“D1”に対して再利用される。
図51は、テーブル検索拡張命令に併せて提供される可能性がある更なるテーブル検索命令を説明する。これらの命令の間の違いは、テーブル検索命令において、範囲外のインデックス値に遭遇するとき、そのインデックス値に対応する結果レジスタ“D5”内部の場所が、変化しない状態のままにされるより、むしろゼロの値によって書き込まれることである。このタイプの動作は、ある種のプログラミングの状況において有益である。図51の例は、2個のテーブルレジスタよりは、むしろ3個のテーブルレジスタを説明する。第1、第3、第4、第6、及び第7のインデックス値は、範囲外である。第2、第5、及び第8のインデックス値は、範囲内であると共に、テーブルレジスタ内部の対応するデータ要素のテーブル検索に使用される。
先に言及されたように、ロード命令及び記憶命令は、SIMDレジスタファイル20(図1参照)とメモリとの間のデータの移動のために提供される。それぞれ、そのようなロード命令及び記憶命令は、そこからアクセス操作(それがロード操作であろうと、記憶操作であろうと)が始まるべきメモリ内部の場所を識別する開始アドレスを指定することになる。本実施例のロード命令及び記憶命令に従って、ロード命令または記憶命令の対象とするデータの総数は、命令ごとに変更され得る。特定の実施例において、データの総数は、データタイプ“dt”(すなわち、各データ要素のサイズ)を識別すること、及びSIMDレジスタリストの識別によりアクセスされるべきデータ要素の数と任意にアクセスされるべき構造体の数とを識別することにより識別される。
SIMD処理を実行するとき、必要なデータ要素に関して実行されるアクセス操作は、多くの場合、位置合わせされないアクセス(同様にバイトで位置合わせされたアクセスとしてここに参照される)である場合が多い。言い換えると、開始アドレスは、多くの場合、位置合わせされないことになると共に、そのような状況において、LSU22は、アクセス操作が完了することを可能にするために要求される可能性があるアクセス操作に、アクセスの最大数を割り当てることを必要とする。
可能な実行において、LSU22は、全てのアクセスが位置合わせされないと仮定する準備をすることもあり得る一方、これは、開始アドレスが、ある程度の複数のバイトで実際に位置合わせされる状況において、LSU22はアクセス操作の効率を改善することができないことを意味する。
LSU22は、開始アドレスが所定の配置構造を備えているかどうかを、開始アドレスから決定することができるであろう一方、LSU22は、一般的に開始アドレスが実際に計算される前に、一度のアクセス操作のためのアクセス数を制限しなければならない。特定の実施例において、LSU22は、パイプライン構造を備えており、任意の特定のアクセス操作を実行するために使用されるべきアクセス数は、パイプラインの復号ステージにおいて、LSUにより決定される。しかしながら、多くの場合開始アドレスは、例えばオフセット値を基準アドレスに加算することにより、パイプラインの次の実行ステージにおいて計算されると共に、従って、LSU22は、いくつのアクセスをアクセス操作に割り当てるかを決定する前に、開始アドレスの決定を待ち受けることができない。
本実施例に従って、配置構造修飾子としてもここに言及される、アクセス命令内部の配置構造指示子の領域を提供することにより、この問題は軽減される。特定の一実施例において、配置構造修飾子は、バイトで位置合わせされたもの、すなわち位置合わせされないものとして開始アドレスが扱われることを表す第1の数値をとることができる。当然のことながら、この第1の数値は、配置構造指示子の領域の任意の所定の符号化により提供されることもあり得る。加えて、配置構造修飾子は、開始アドレスが従うように扱われる、異なる所定の配置構造を表す複数の第2の数値の中のどの1つでも取り得ると共に、特定の一実施例において、複数の使用可能な第2の数値は、以下のテーブル(表21)として表される。
一実施例においてこの配置構造指示子の情報が使用される方法は、これから図52を参照して記述されることになる。図52に示されるように、LSU22は、一般的に所定の幅のデータバスによってメモリシステムに接続されることになる。多くの場合、メモリシステムは、多数の異なるレベルのメモリから構成されると共に、LSUがデータバスによって通信するメモリのレベルであるメモリの第1のレベルは、多くの場合キャッシュである。従って、図52に示されるように、LSU22は、この特定の例において、64ビットの幅を有するものとして取り扱われるデータバス1020によって、メモリのレベル1キャッシュ1010と通信するために配置される。キャッシュヒット(cache hit)の場合には、アクセスが、レベル1キャッシュの内容に関して発生するのに対して、キャッシュミス(cache miss)の場合には、レベル1キャッシュ1010は、その場合に、1つ以上の更なるバス1030によって、メモリシステム1000の他の部分と通信する。
メモリシステムのさまざまな部分は、分配される可能性があると共に、図52に説明された例では、レベル1キャッシュ1010は、オンチップ(on-chip:チップ上で)で提供される、すなわち、図1の集積回路2内部に組み入れられ、一方、メモリシステム1000の残りはオフチップ(off-chip:チップ外で)で提供されると仮定される。図52において、オンチップとオフチップとの間の境界は、点線1035により表される。当業者にとっては当然のことながら、他の構成が使用される可能性があると共に、それゆえ、例えば全てのメモリシステムがオフチップで提供されるか、またはメモリシステムのオンチップ部分とメモリシステムのオフチップ部分との間のいくらかの他の境界が提供される可能性がある。
LSU22は、一般的に中継ルックアサイドバッファ(TLB:Translation Lookaside Buffer)1015を一部として含むメモリ管理ユニット(MMU:memory management unit)1005ともまた通信するように配置される。当業者にとっては明らかなように、例えば、仮想アドレスの物理アドレスへの変換、アクセス許可の決定(すなわち、アクセスが起こり得るかどうか)等正確なアクセス制御機能を実行するために、MMUは使用される。これを実行するために、MMUは、メモリ内のページテーブルから取得された記述子をTLB1015内部に記憶する。各記述子は、メモリの対応するページに対して、メモリのそのページに適切な不可避のアクセス制御情報を定義する。
LSU22は、制御経路1025によって、レベル1キャッシュ1010及びMMU1005の両方に対するアクセスの正確な細部を通信するために配置される。特に、LSU22は、レベル1キャッシュ及びMMUへ、開始アドレス及びアクセスされるべきデータのブロックのサイズの表示を出力するために配置される。更に、一実施例に従って、LSU22は、配置構造指示子から取り出された配置構造情報もまた出力する。配置構造指示子情報が、LSU22により、及び/またはレベル1キャッシュ1010とMMU1005とにより使用される方法は、更に図53Aから図54Bまでを参照してこれから記述される。
図53Aは、各水平の実線でメモリにおける64ビットの配置構造を表しているメモリアドレス空間を説明する。もしアクセス操作が、引数のための128ビットの長いデータブロック1040を指定するならば、我々は開始アドレス“0x4”を持つと仮定し、そして、LSU22は、アクセス操作を割り当てるために、64ビットデータバス1020を横切る独立したアクセスの数を決定することを必要とする。更に、先に論じたように、一般的に、どこが開始アドレスであるかを知る前に、この決定を行う必要がある。図52に関して説明された実施例において、LSU22は、割り当てるためのアクセス数を決定するとき、配置構造指示子情報を使用するように配置される。
図53Aの例において、開始アドレスは32ビットに位置合わせされると共に、配置構造指示子は、この配置構造を識別する可能性がある。その場合において、図53Aから分かるように、LSU22は最悪の場合のシナリオを仮定しなければならず、従って、データブロック1040に関して必要なアクセス操作を実行するために、3個の独立したアクセスが要求されることになると仮定する。これは、位置合わせされないアクセスに対して割り当てられなければならないアクセス数と同じである。
しかしながら、もし我々が今、図53Bに説明される類似の例を考察する場合、128ビットデータブロック1045は再度アクセスされるべきであるが、しかし、この場合、開始アドレスは64ビットに位置合わせされる。もし、配置構造指示子情報が、64ビット配置構造を識別するか、または確かに128ビットに位置合わせされたデータを識別するならば、この場合、LSU22は、アクセス操作に対して、2個の独立したアクセスを割り当てることだけを必要とし、それにより効率における著しい改善を提供する。しかしながら、もしデータバスが128ビット幅であった場合、更に、もし配置構造指示子が64ビット配置構造よりもむしろ128ビット配置構造を表していた場合、LSU22は単一のアクセスを割り当てることだけを必要とする。
今図53Cにおける例を考察すると、ここで96ビットサイズのデータブロック1050はアクセスされる必要があることがわかると共に、この場合、配置構造指示子は開始アドレスが32ビットに位置合わせされることを識別すると仮定される。更にまた、この例において、LSU22が、その時点で実際に開始アドレスを計算していなくても、アクセス数は制限される必要があり、LSU22は、まだ、2回のアクセスだけがアクセス操作に割り当てられる必要があると仮定し得る。図53Dは、80ビットのデータブロック1055がアクセスされるべきであると共に、開始アドレスが16ビットに位置合わせされることを配置構造指示子が識別する第4の例を説明する。更にまた、LSU22だけは、アクセス操作に2回のアクセスを割り当てる必要がある。もし、その代わりに、配置構造指示子が、アクセスは位置合わせされていないアクセスとして処理されるべきであると表したならば、その場合にはLSUが、同じように確かに図53Cの中で説明されたアクセスに対する事例になっていたアクセス操作に、3回のアクセスを割り当てなければならないことは明確である。従って、配置構造指示子情報は、配置構造指示子が開始アドレスのある種の所定配置構造を表す状況において、アクセスの性能を著しく改善するためにLSU22により使用されることがわかる。
配置構造指示子は、開始アドレス(有効アドレスとしてもまたここに参照される)がその配置構造を備えているという保証を得られないが、しかし、進むべき仮定をLSU22に供給することに注意するべきである。もし、開始アドレスが、その後、結果的に配置構造指示子により指定される配置構造に従わないならば、その場合には、一実施例において、関連したロードまたは記憶操作は、配置構造不良を生成するように構成される。配置構造不良は、その場合には複数の周知技術の内のどの1つを用いてでも扱われ得る。
先に言及されたように、配置構造情報はLSU22により使用されるだけでなく、経路1025によってレベル1キャッシュ1010及びMMU1005の両方にもまた伝送される。この情報がレベル1キャッシュまたはMMUにより使用される可能性がある方法は、図54Aから図54Bを参照してこれから記述されることになる。図54A及び図54Bにおいて説明されるように、256ビットのデータブロック1060,1065に対するアクセスが考察されると共に、これらの例において、図中の水平の実線は、メモリ内の128ビット配置構造を表している。図54Aにおいて、データブロックは64ビットに位置合わせされると仮定され、一方図54Bにおいて、データブロックは128ビットに位置合わせされると仮定される。両方の場合、データバス1020は64ビット幅のみであるので、LSU22は、アクセス操作に対して4回のアクセスを割り当てなければならないことが分かる。LSUの観点から、配置構造指示子が、開始アドレスは64ビットに位置合わせされると指定するか、または配置構造指示子が、開始アドレスは128ビットに位置合わせされると指定するかどうかは問題ではない。
しかしながら、レベル1キャッシュ1010内部のキャッシュラインは、それぞれ256ビットデータを超過して記憶する能力があると共に、更に128ビットに位置合わせされる可能性がある。図54Aの例において、データブロックは128ビットに位置合わせされていないので、キャッシュは2本のキャッシュラインがアクセスされる必要があると仮定することが必要になる。しかしながら、図54Bの例において、レベル1キャッシュ1010は、レベル1キャッシュ内部の単一のキャッシュラインだけがアクセスされる必要があると共に、これはレベル1キャッシュ1010内部のアクセス操作の効率を高めるために使用され得ると、配置構造指示子から判断することができる。
同様に、適切な記述子をTLB1015へ読み出すためにMMUからアクセスされる必要があるページテーブルは、多くの場合256ビットのデータよりも多く記憶すると共に、多くの場合128ビットに位置合わせされる可能性がある。従って、MMU1005は、アクセスされるべきページテーブルの数を決定するために、経路1025を通じて提供された配置構造情報を使用することができる。一方、図54Aの例においては、MMU1005は、1ページを超えるテーブルがアクセスされる必要があると仮定することが必要であり、図54Bの例においては、MMUは、単一のページテーブルだけがアクセスされる必要があると共に、この情報はMMU1005により実行されるアクセス制御機能の効率を改善するために使用され得ると、配置構造指示子から判断することができる。
従って、もしアクセスサイクルの番号及び/またはキャッシュアクセスが、開始アドレスが決定され得る前に制限されなければならないならば、上述のようなロードまたは記憶命令内部の配置構造指示子の使用は、ハードウェアにとりわけ有益であるアクセス操作のある種の形式を最適化させるために使用され得ることがわかる。この仕組みは、アクセスされるべきデータのさまざまな長さを指定すると共に、LSUとメモリシステムとの間で異なるデータバスサイズを有するプロセッサ上のロードまたは記憶命令にとって有益である。
複数のデータ要素がレジスタ内部に隣り合って配置され、その上、それらのデータ要素に対して操作が並列に実行される標準のSIMDフォーマットにおいて実行されることに、それら自身が役に立たない多数のデータ処理操作がある。いくらかのそのような操作の例は、 図55Aから図55Cにおいて説明される。図55Aは、第1のレジスタ1100内部の4個のデータ要素“A”,“B”,“C”,“D”を、第2のレジスタ1102内部の4個のデータ要素“E”,“F”,“G”,“H”でインタリーブすることが要求されるインタリーブ操作を説明する。図55Aにおいて、結果のインタリーブデータ要素は、デスティネーションレジスタ1104,1106内部に示されている。これらのデスティネーションレジスタは、ソースレジスタ1100,1102と異なるレジスタであっても良く、または、代わりにソースレジスタと同じ2個のレジスタの1組のセットであっても良い。図55Aから分かるように、このインタリーブ操作に従って、各ソースレジスタからの第1のデータ要素は、デスティネーションレジスタ内部に隣り合って配置され、その後に両方のソースレジスタからの第2のデータ要素が続き、その後に両方のソースレジスタからの第3のデータ要素が続き、その後に両方のソースレジスタからの第4のデータ要素が続く。
図55Bは、2個のソースレジスタ1108,1110に配置された8個のデータ要素をデインタリーブすることが要求される、逆のデインタリーブ操作を説明する。この操作に従って、第1、第3、第5、及び第7のデータ要素が1個のデスティネーションレジスタ1112に配置され、一方第2、第4、第6、及び第8のデータ要素が1個のデスティネーションレジスタ1114に配置される。図55Aの例と同様に、当然のことながら、デスティネーションレジスタはソースレジスタと異なっていても良く、または、代わりに同じレジスタであっても良い。もし、図55A及び図55Bの例において、レジスタは64ビットレジスタであると仮定されるならば、その場合は、この特定の例においてインタリーブまたはデインタリーブされるデータ要素は16ビット幅のデータ要素である。しかし、当然のことながら、インタリーブまたはデインタリーブされるデータ要素に対して、16ビット幅であるべきという必要条件はないと共に、ソースレジスタ及びデスティネーションレジスタに対して、64ビットレジスタであるべきという必要条件もない。
図55Cは、(行列の)転置操作により実行される機能を説明する。この例に従って、第1のソースレジスタ1116からの2個のデータ要素“A”,“B”、及び第2のソースレジスタ1118からの2個のデータ要素“C”,“D”は、転置されるべきであると共に、転置の結果は、第1のソースレジスタ1116からの第2のデータ要素が第2のソースレジスタ1118からの第1のデータ要素で交換され、第1のデスティネーションレジスタ1120内部にデータ要素“A”,“C”が与えられる。一方、第2のデスティネーションレジスタ1122内部にデータ要素“B”,“D”が与えられる。更にまた、デスティネーションレジスタは、ソースレジスタと異なっても良いが、多くの場合、デスティネーションレジスタは、実際はソースレジスタと同じレジスタである。1つの例において、各レジスタ1116,1118,1120,1122は、データ要素は32ビット幅のデータ要素であるという場合において、64ビットレジスタであるべきと見なされる。しかしながら、データ要素に対して、32ビット幅であるべきという必要条件はないと共に、レジスタに対して、64ビットレジスタであるべきという必要条件もない。
更に、上述の全ての例において、レジスタの全部の内容が示されると仮定された一方、これらの3個の論じられた操作は、適切なソースレジスタの異なる部分の内部において、データ要素に対して独立して実行されることもあり得ると共に、従って、その場合の図面は、ソース/デスティネーションレジスタの部分だけが説明される。
先に言及されたように、標準のSIMDアプローチは、複数のデータ要素をレジスタ内部に隣り合わせで配置すると共に、更に、それらのデータ要素に対して並列に操作を実行することを必要とする。言い換えると、データ要素の精度で操作の並列化が実行される。これは、要求されたデータ要素がそのような方法で配置され得る操作を非常に効率的に実行することができる一方、例えば、複数のレジスタの全域で要求されたソースのデータ要素を分散することにより、そのような方法で要求されたソースのデータ要素を配置することが実用的でないかなりの数の操作があると共に、従って、SIMDアプローチの潜在的な速度の利点は、以前には利用され得なかった。上記のインタリーブ、デインタリーブ、及び転置操作は、以前にはSIMDアプローチの速度の利点を活用することができなかった操作の例であるが、しかし、当然のことながら、例えばあるタイプの算術演算のように、多くの他の例もまたある。そのような算術演算の特定の例は、実数部と虚数部とから構成される複素数に適用されることを必要とする算術演算である。
一実施例に従って、この問題は、ある種のデータ処理命令に対して、データ要素サイズを識別するばかりでなく、更に別個の存在としてデータ要素サイズの集合であるレーンサイズも識別する能力を提供することにより軽減される。その場合には、データ処理操作の特定の例示に必要とされる2つ以上のデータ要素が同一のソースレジスタ内部に共存できるように、データ処理命令の並列化は、データ要素サイズよりもむしろレーンサイズの精度で発生する。それゆえに、データ処理操作を実行するために使用される処理ロジックは、レーンサイズに基づいて、並列処理の多数のレーンを定義できると共に、そのような並列処理レーンのそれぞれの内部において、選択されたデータ要素に適用されるデータ処理操作は、その場合にそれぞれのレーンにおいて並列に実行され得る。
そのような取り組み方により、図55Aを参照して上述したように、SIMD方法においてインタリーブ操作を実行することが可能になる。特に、図56Aは、一実施例に従って“ZIP”命令を実行するときに実行される処理を説明する。この特定の例において、“ZIP”命令は、“32|ZIP.8”命令である。この命令は、従ってデータ要素は8ビット幅で、かつレーンは32ビット幅であることを識別する。図56Aの例に対して、ソースレジスタは64ビットレジスタ“D0”1125、及び64ビットレジスタ“D1”1130であるべき“ZIP”命令が指定したと仮定される。これらのレジスタのそれぞれは、従って8ビットのデータ要素を含んでいる。各レーン内部において、図56Aの下半分に示されるように、独立かつ並列に、データ要素の再配置を行うインタリーブ操作が適用される。一実施例において、“ZIP”命令に対しては、デスティネーションレジスタがソースレジスタと同一であると共に、それに応じて、これらの再配置されたデータ要素がレジスタ“D0”1125、及びレジスタ“D1”1130内部にもう一度記憶されると仮定される。図56Aから分かるように、レーン1内部において、各ソースレジスタの第1の4個のデータ要素がインタリーブされ、レーン2内部において、各ソースレジスタの第2の4個のデータ要素がインタリーブされる。
レーンサイズか、またはデータ要素サイズのいずれかを変更することにより、インタリーブの異なる形式が実行されることもあることが容易に認識される。例えば、もしレーンサイズが64ビットとして識別された場合、すなわちそれらが単一のレーンだけになる場合、その場合にはデスティネーションレジスタ“D0”が各レジスタの第1の4個のデータ要素のインタリーブされた結果を含み、一方、デスティネーションレジスタ“D1”が各レジスタの第2の4個のデータ要素のインタリーブされた結果を含むことが分かる。当然のことながら、対応するデインタリーブ操作を実行するために、再度レーンサイズ及びデータ要素サイズの両方を指定することができる、対応する“UNZIP”命令が提供される。
一般的に、転置操作は、インタリーブ操作またはデインタリーブ操作と全く異なる操作として取り扱われると共に、従って、転置操作を実行するために別個の命令が提供されることを必要とすることが一般的に予想される。しかしながら、独立してレーンサイズ及びデータ要素サイズを定義する能力によりインタリーブまたはデインタリーブ命令を提供するとき、その場合には、2個のソースレジスタが指定され、更にレーンサイズがデータ要素サイズの2倍になるようにセットされれば、転置操作を実行するために実際には同一の命令が使用され得ると理解された。これは、8ビットのデータ要素サイズ、及び16ビットのレーンサイズ(ずなわち、データ要素サイズの2倍)を識別するインタリーブ命令“ZIP”が設定された図56Bに説明されている。図56Aの例のように、同一の64ビットソースレジスタ“D0”1125、及びソースレジスタ“D1”1130が選択されると仮定して、これは、図56Bにおいて示されるように、並列処理の4個のレーンを定義する。その場合に、図56Bの下半分から分かるように、インタリーブ処理は、実際には各レーン内部で、各レーン内部の第2のソースレジスタの第1のデータ要素が各レーン内部の第1のソースレジスタの第2のデータ要素と交換される転置結果を生成する。
それゆえに、上述の実施例に従って、どのようにレーンサイズ及びデータ要素サイズが定義されるかに依存する、インタリーブ操作か、または転置操作のいずれかを実行するために、同一の“ZIP”命令が使用され得る。“UNZIP”命令を使用する転置もまた実際に同じ方法で実行され得ると共に、それに応じて、“16|UNZIP.8”命令は、“16|ZIP.8”命令として同一の転置操作を実際に実行することになるということに更に注目するべきである。
図57Aから図57Cは、画像内部の4×4(four-by-four)の画素配列1135が、ライン1136について転置されるべきである(図57A参照)、そのような“ZIP”命令の実行の1つの特定の例を説明する。各画素は、一般的にRGBフォーマットで表された赤成分、緑成分、及び青成分から構成される。詳しくは、もし、各画素を定義することを要求されたデータが16ビットの長さであると仮定すると、その場合には、配列1135内の4画素の各水平ラインに対するデータは独立したソースレジスタ“A”,“B”,“C”,“D”に配置され得ることがわかる。
図57Bは、以下の2個の命令が実行された場合に発生するさまざまな転置を説明する。
“32|ZIP.16A,B”
“32|ZIP.16C,D”
各“ZIP”命令は、従ってレーン幅を32ビット、及びデータ要素幅を16ビットに定義すると共に、このように、各レーン内部で、図57Bにおいて説明された4個の斜めの矢印線により示されるように、第2のレジスタの第1のデータ要素が第1のレジスタの第2のデータ要素と交換される。それゆえに、2×2(two-by-two)ブロック1137、2×2ブロック1141、2×2ブロック1143、及び2×2ブロック1145内部で独立した転置が発生する。
そして図57Cは、以下の2個の命令の実行の結果として発生する転置を説明する。
“64|ZIP.32A,C”
“64|ZIP.32B,D”
これらの命令に従って、レーン幅が64ビット、すなわちソースレジスタの幅全体に設定されると共に、データ要素幅が32ビットに選択される。第1の“ZIP”命令の実行は、このように、レジスタ“C”1151内部の第1の32ビット幅のデータ要素と交換される、レジスタ“A”1147内の第2の32ビット幅のデータ要素となる。同様に、第2の“ZIP”命令の実行は、レジスタ“D”1153内部の第1の32ビット幅のデータ要素と交換された、レジスタ“B”1149内の第2の32ビット幅のデータ要素となる。図57Cにおいて斜めの矢印線により説明されるように、これは、従って右下の画素の2×2ブロックにより交換された左上の画素の2×2ブロックとなる。当業者にとっては明らかなように、この4個の“ZIP”命令の手順は、従って画素の4×4配列1135全体を、対角線1136について転置した。図58は、インタリーブ命令の使用の1つの特定の例を説明する。この例において、複素数は実数部と虚数部とから構成されるものとして取り扱われる。ある種の計算方法が、複素数の数列の実数部に対して実行されることを必要とし、一方別個の計算方法が、それらの複素数の数列の虚数部に対して実行されることを必要とすることは問題かもしれない。結果として、実数部は特定のレジスタ“D0”1155に配置されたかもしれないと共に、一方虚数部は独立したレジスタ“D1”1160に配置された可能性がある。ある時点で、それぞれの複素数の実数部と虚数部とを、それらがレジスタの中で相互に隣接するように再結合することが要求される。図58において説明されたように、これは、レーン幅がソースレジスタの最大限の幅になるように設定すると共に、データ要素幅が16ビット、すなわち実数部及び虚数部のそれぞれの幅になるように設定する“64|ZIP.16 ”命令の使用を通じて達成され得る。図58の下半分に示されるように、“ZIP”命令の実行の結果は、デスティネーションレジスタ“D0”1155が複素数“a”及び複素数“b”の実数部と虚数部を含み、デスティネーションレジスタ“D1”1160が複素数“c”及び複素数“d”の実数部と虚数部を含むレジスタ空間内部で、各複素数“a”,“b”,“c”,“d”の実数部及び虚数部のそれぞれが再結合される。
データ要素サイズとは無関係にレーンサイズを指定する能力を活用することができるのは、インタリーブ命令及びデインタリーブ命令のようなデータ要素再整理命令だけではない。例えば、図59A及び図59Bは、2個の複素数の乗算を実行するために使用され得る2個の命令の手順を説明する。特に、それは、結果の複素数“D”を生成するために、次の等式により説明されるように、複素数“A”と複素数“B”との乗算を行うことが要求される。
“Dre=Are*Bre-Aim*Bim”
“Dim=Are*Bim+Aim*Bre”
図59Aは、以下の形式による第1の乗算命令に応答して実行された操作を示す。
“32|MUL.16 Dd,Dn,Dm[0]”
ソースレジスタは64ビットレジスタであると共に、乗算命令は、レーン幅を32ビット、かつデータ要素サイズを16ビットに指定する。乗算命令は、ソースレジスタ“Dm”1165内部のレーン内の第1のデータ要素を、第2のソースレジスタ“Dn”1170内部のレーン内のデータ要素のそれぞれと乗算し(図59A参照)、結果の数値をデスティネーションレジスタ“Dd”1175内部の対応する位置に記憶するために、各レーン内部において用意される。各レーン内部において、デスティネーションレジスタ内の第1のデータ要素は、複素数の結果の一部分の実数部を表すものとして取り扱われると共に、第2のデータ要素は、複素数の結果の一部分の虚数部を表すものとして取り扱われる。
図59Aにおいて説明される命令に続いて、次に、以下の命令が実行される。
“32|MASX.16 Dd,Dn,Dm[1]”
図59Bにより説明されるように、この命令は、“交換操作を伴う乗算、加算、減算”命令である。この命令に従って、ソースレジスタ“Dm”の各レーン内部の第2のデータ要素は、第2のソースレジスタ“Dn”の対応するレーン内部の各データ要素と、図59Bに説明された方法によって乗算される。そして、その乗算の結果は、既にデスティネーションレジスタ“Dd”1175内部に記憶されたデータ要素に対応する数値に加算されるか、既にデスティネーションレジスタ“Dd”1175内部に記憶されたデータ要素に対応する数値から減算されるかのいずれかであり、その場合には、結果はデスティネーションレジスタ“Dd”1175内部に戻される。先に特定された、結果の複素数“D”の実数部及び虚数部を生成するための等式を用いて、これらの2個の命令を手順に従い利用することにより、それによってSIMDアプローチの速度の利点が実現されることを可能にする計算方法は、複素数の2セットに対して並列に実行され得るということが、図59A及び図59Bの操作の比較から分かる。
上記の例から、データ要素サイズに加えてレーンサイズを指定する能力を有する命令を提供することにより、SIMDの実行から潜在的に利益を得ることができる操作の数が増やされると共に、それゆえに、これがSIMD方法における操作の実行に関して非常に改善された柔軟性を提供するということが認識されることになる。
本技術は、ソースとデスティネーション(宛先)のデータ要素の幅が異なるベクトルに対するSIMD処理を実行する能力を提供する。この状況における1つの特に有益な操作は、加算または減算であり、SIMD操作の高位の半分をもたらす。図60は、本技術に従ってSIMD操作の高位の半分をもたらす加算の例を示す。SIMDデコーダ16(図1参照)内部の命令デコーダは、命令“VADH.I16.I32 Dd,Qn,Qm”を復号すると共に、図60において説明され、かつ以下に明確に記述する、高位の半分をもたらす加算を実行する。
図60において、SIMDレジスタファイル20(図1参照)内に配置される2個のレジスタ“Qn”及び“Qm”は32ビットのデータ要素“a”及び“b”のベクトルを含む。これらは、同様にレジスタファイル20内に配置され、データの高位の半分の集合“Qn=[a3 a2 a1 a0]”,“Qm=[b3 b2 b1 b0]”から形成される、16ビットのデータ要素のベクトル“Dd”を形成するように、お互いに加算される。
出力は、”Dd=[(a3+b3)>>16,(a2+b2)>>16,(a1+b1)>>16,(a0+b0)>>16]”である。
図61は、図60に示されたものと類似しているが、しかしこの場合、復号された命令は“VRADH.I16.I32 Dd,Qn,Qm”で、かつ実行される操作が丸めを伴って高位をもたらす加算である操作を概略的に示す。これは、図60に説明される操作と大変に類似した方法で実行されるが、しかし高位の半分が丸められる。この例においては、これは、加算後でかつ高位の半分をとる前に、データ数値の低位の半分の最上位ビットの位置に“1”を有し、それ以外の位置は“0”を有するデータ数値を加算することにより実行される。
図61において、この図では、明確になるように、中間値が点線で示されている。
更に、サポートされる可能性のある命令(図示せず)は、データの飽和を伴った加算、または減算である。 この場合、加算または減算は、高位の半分がとられる前に、適切なところで飽和状態にされることになる。
テーブル11(表22)は、本技術によりサポートされるいくつかの命令の例を示す。“Size<a>”は、ビットにおけるデータタイプのサイズをもたらすと共に、“round <td>”は、定数“1<<(size<dt>-1)”の丸めをもたらす。
データの高位の半分とることが実行するべき有利なことである本技術は、提供される異なるタイプのデータに対して実行され得る。それは、特に固定小数点数に対して行われる処理に適している。
上記の技術は、多くの応用例を有し、かつ例えばSIMDによるFFTの実行を加速することに使用され得る。SIMDは、複数のデータに同一の操作を実行することが必要とされるFFT(高速フーリエ変換)操作を実行することに対して、特に有益である。このように、SIMD処理を使用することは、複数のデータが並列に処理されることを可能にする。FFTについて実行される計算は、多くの場合複素数をお互いに乗算することを必要とする。これは、データ数値の乗算と、更に積の加算または減算を必要とする。SIMD処理において、これらの計算は、処理スピードを増加させるために、並列に実行される。
実行される必要がある計算問題の種類の1つの簡単な例は、以下で与えられる。
“(a+ic)*(b+id)=e+if”
このように、実数部“e”は、“a*b-c*d”に等しく、虚数部“f”は、“a*d+c*b”に等しい。
図62は、実数部“e”を決定するための計算を示す。図に示すように、16ビットのデータ要素を含んでいる“a”に割り当てられたベクトルは、同一のサイズのデータ要素を含んでいる“b”に割り当てられたベクトルと乗算され、かつ“c”に割り当てられたベクトルは、“d”に割り当てられたベクトルと乗算される。これらの積は、32ビットのデータ要素を持つ2個のベクトルを生成する。ベクトルの1つである“e”を生成することは、他のベクトルから減算されることを必要とするが、しかし最終結果は、最初の値と同一の精度が必要とされるだけである。このように、16ビットのデータ要素による結果のベクトルが要求される。この操作は、図において示されるように、単一の命令“VSBH.16.32 Dd,Qn,Qm”に応答して実行され得る。この命令、すなわち高位の半分をもたらす減算は、それゆえに、この状況において特に有益である。更に、それは、算術演算が更に広いデータ幅に対して実行されることを可能にすると共に、算術演算(減算)の後でのみ発生するビット幅の縮小化を行うという利点を持つ。これは、減算を実行する前にビット幅の縮小化を行う場合より、一般的に更に正確な結果を与える。
ARM社は、それらの命令セットに、即値がいくつかの命令で指定されることを可能にする、命令の符号化を提供した。命令によって符号化されるならば、明らかに即値のサイズは制限されなくてはならない。
命令の符号化に適しているサイズの即値の値は、データ要素が並列に処理されるSIMD処理において、限られた使用法を有している。この問題に取り組むために、それらに関連があるサイズの制限された即値を有するが、しかしこの即値を拡張する能力を有する、生成された定数による命令のセットが提供される。このように、例えばバイトサイズの即値は、64ビットの定数または即値を生成するために拡張され得る。この方法において、即値は、SIMD処理における複数のソースのデータ要素を含む、64ビットのソースレジスタによる論理演算に使用され得る。
図63は、命令の内部で制御値と共に符号化される即値“abcdefgh”を示しており、それはテーブルの左手(左側)の列において示されている。2進数の即値は、64ビットのレジスタを満たすように拡張され得ると共に、実際の拡張は、命令及びそれに付随する制御部分に応じて実行される。示された例において、8ビットの即値“abcdefgh”は、即値が制御値に応じて配置される、64ビットのデータ数値内部の異なる位置において繰り返される。更に、“0”及び/または“1”は、数値が配置されていない空の空間を満たすために使用され得る。“1”及び/または“0”の内のいずれかの選択もまた、制御値により決定される。このように、この例において、SIMD処理で使用される広範囲の可能な定数は、8ビットの即値とそれに付随する4ビットの制御値とを有する命令から生成され得る。
一実施例(テーブルの最後の行)において、一定の場所で即値を繰り返す代わりに、新しい64ビットの即値または定数を生成するために、即値の各ビットが拡張される。
いくつかの場合において図に示すように、各レーンにおいて定数は同一であり、一方他方においては、異なる定数がいくつかのレーンに出現する。実施例によっては(図示せず)、これらの定数を反転することの可能性もまた提供されると共に、これは生成され得る定数の数もまた増加させる。
図63において示されるような、一定の型に対して使用され得る命令のフォーマットの例は、以下に与えられる。この命令において、“<value>”は、データ部分または即値であり、“<mode>”は、どのように“<value>”部分が生成された定数内部で拡張されるべきか(図63のテーブルの異なるラインとして示される。)を示す指示を与える制御部分である。
“VMOV Dd,#<value>,<mode>”
ここで、
“<value>”は、バイトである。
“<mode> ”は、列挙された拡張機能のうちの1つである。
これらの適応した命令は、一般的に、即値及び制御部分“<mode>”を有するデータ部分“<value>”を持つ関連するデータ値を備える。図63において示されるように、制御部分は、どのように即値が拡張されるべきかを表している。これは、さまざまな方法で実行されても良いが、しかし実施例によっては、制御部分は、定数の拡張が定数生成ロジックを用いて実行されることを表している。
図64は、本技術の命令に関連するデータ部分1210及び制御部分1200から定数を生成するように操作可能な定数生成ロジックの例を概略的に示す。示された例において、制御部分1200は、生成されるべき定数1240内部の各ビットに対して、データ数値1210の一部、または1つの“1”あるいは1つの“0”のいずれかを出力するためのゲート1230を備える定数生成ロジック1220を制御する。
図65は、同等の参照数字が同等の特徴を表す、図1に示されたものと類似のデータプロセッサ(集積回路)を示す。図65は、それが明示的に定数生成ロジック1220を示す点で図1と異なる。定数生成ロジック1220は、デコード/制御部14,16に隣接する、あるいはデコード/制御部分14,16の一部を形成するものとして取り扱うことができる。図に示すように、命令は命令パイプライン12から、デコード/制御ロジック14,16へ送信される。これは、SIMD処理ロジック18、ロード記憶ユニット22、及びプロセッサのスカラ処理部分4,6,8,10の操作を制御する制御信号を生成する。もし定数の生成を伴う命令が、デコード/制御部14,16において受信される場合、定数生成ロジックは、SIMD処理における使用のための定数を生成するために使用される。これは、直接的にSIMDレジスタデータ記憶装置20に送信され得る(点線1222)か、または、もし定数の生成を伴う命令が、SIMDデータ処理部を備えている場合には、生成された定数は、新しいデータ値を生成するために更なる操作が生成された定数に関して実行されるSIMD処理ロジックに送信される(線1224)。
図66A及び図66Bは、図65に示される2個の異なる経路を概略的に説明する。図66Aは、命令が直接的にレジスタ記憶装置に送信される定数を生成する場合、すなわち点線1222を示す。図66Bは、生成された定数を伴う命令がデータ処理部を備える場合を示す。この場合、データ処理操作(OP:processing operations)は、生成された定数、更にソースオペランド1250に対して、命令に応答して最終データ値1260を生成するように実行され、これは図65の線1224に対応する。
図63及びそれらの反転において示される定数に加えて、例えばOR(論理和)、AND(論理積)、テスト、加算または減算のような追加のデータ処理操作が、更に広範囲のデータ値を生成するために、生成された定数に対して実行され得る。これは図13B、及び図65の経路1224に対応する。テーブル12(表23)は、いくつかの追加のデータ値を生成するために使用され得るビット幅のAND(論理積)及びビット幅のOR(論理和)の例を与える。
生成された定数に対して更なるデータ処理操作を実行する能力には、さまざまな用途があり得る。例えば、図67は、本技術の実施例が、ベクトル内の多数のデータ要素から、ある一つのビットまたは複数のビットを抽出するようにビットマスク(bit mask)を生成するためにどのように使用され得るかを示す。示された例において、ソースのベクトルからの各データ要素の第4のビットが抽出される。初めに、即値8は、それを繰り返すことにより拡張され、更にこれは、要求されたビットを各データ要素から抽出するために生成された定数とソースのベクトルとのAND(論理積)を求める論理的AND命令により追随される。これらの操作は、命令“VAND Dd,#0b00001000,0b1100”に応答して実行される。
ここで、“<mode>”値1100は、拡張されたデータ部分を備える、生成された定数を参照する(図63参照)。
ここでは特定の実施例が記述されたが、当然のことながら、発明がそれに限定されないと共に、クレームによって定義された発明の範囲及び精神から逸脱することなく、それに対する多くの変形及び追加が当業者によって実施されても良い。例えば、従属クレームのさまざまな特徴の組み合わせは、本発明の範囲から逸脱することなく、独立クレームの特徴によって生み出されるものである。