(57)【要約】      （修正有）【課題】効率的なベクトルロール演算を提供する。【解決手段】入力ベクトルの上位半分及び下位半分が定義する２つのレーンのうちの第１のレーン沿いの入力ベクトルのエレメントをバレルローリングすることによって、第１の中間ベクトルを形成し、２つのレーンのうちの第２のレーン沿いの入力ベクトルのエレメントをバレルローリングすることによって、第２の中間ベクトルを形成し、結果物の上位半分及び下位半分の上位部分として、中間ベクトルの１つの上位半分及び下位半分の上位部分を組み込むことで、且つ、結果物の上位半分及び下位半分の下位部分として、他の中間ベクトルの上位半分及び下位半分の下位部分を組み込むことで、入力ベクトルの、結果物であるロールされたバージョンを形成する段階とによって、入力ベクトルの、結果物であるロールされたバージョンを作成する。【選択図】図５
2014130573.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサにより実行されるとコンピュータに、
入力ベクトルの、結果物であるロールされたバージョンを作成する手順を実行させ、
前記ロールされたバージョンを作成する手順は、
前記入力ベクトルの上位半分及び下位半分が定義する２つのレーンのうちの第１のレーン沿いの前記入力ベクトルのエレメントをバレルローリングすることによって、第１の中間ベクトルを形成する手順と、
前記２つのレーンのうちの第２のレーン沿いの前記入力ベクトルのエレメントをバレルローリングすることによって、第２の中間ベクトルを形成する手順と、
前記結果物の上位半分及び下位半分の上位部分として、前記第１の中間ベクトルおよび前記第２の中間ベクトルの１つの上位半分及び下位半分の上位部分を組み込み、且つ、前記結果物の上位半分及び下位半分の下位部分として、他の中間ベクトルの上位半分及び下位半分の下位部分を組み込むことで、前記入力ベクトルの前記結果物であるロールされたバージョンを形成する手順と
を有する、プログラム。
【請求項２】
前記形成する手順は、結果物をベクトルブレンド命令によって形成する手順を含む、請求項１に記載のプログラム。
【請求項３】
前記第１の中間ベクトルはベクトルシャッフル命令によって形成され、前記第２の中間ベクトルはベクトル挿入命令によって形成される、請求項１または２に記載のプログラム。
【請求項４】
前記第１の中間ベクトルの制御ベクトルは、ベクトルブロードキャスト命令によって形成される、請求項３に記載のプログラム。
【請求項５】
前記第１の中間ベクトルの制御ベクトルは、ルックアップテーブルから前記制御ベクトルのエレメントを探すことによって形成される、請求項３に記載のプログラム。
【請求項６】
前記第１の中間ベクトルはベクトルシャッフル命令によって形成され、前記第２の中間ベクトルはベクトル抽出命令によって形成される、請求項１または２に記載のプログラム。
【請求項７】
前記第１の中間ベクトルの制御ベクトルは、ベクトルブロードキャスト命令によって形成される、請求項６に記載のプログラム。
【請求項８】
前記第１の中間ベクトルの制御ベクトルは、ルックアップテーブルから前記制御ベクトルのエレメントを探すことによって形成される、請求項６に記載のプログラム。
【請求項９】
プロセッサにより実行されるとコンピュータに、
プログラムコードをコンパイルする手順を実行させ、
前記プログラムコードをコンパイルする手順は、
ａ）ロールされるベクトルを認識する手順と、
ｂ）前記認識する手順に呼応して、プログラムを作成することによって前記ベクトルの、結果物であるロールされたバージョンを作成する手順と
を含み、
前記プログラムは、
前記ベクトルの上位半分及び下位半分が定義する２つのレーンのうちの第１のレーン沿いの前記ベクトルのエレメントをバレルローリングすることによって、第１の中間ベクトルを形成する手順と、
前記２つのレーンのうちの第２のレーン沿いの前記ベクトルのエレメントをバレルローリングすることによって、第２の中間ベクトルを形成する手順と、
前記結果物の上位半分及び下位半分の上位部分として、前記第１の中間ベクトルおよび前記第２の中間ベクトルの１つの上位半分及び下位半分の上位部分を組み込み、且つ、前記結果物の上位半分及び下位半分の下位部分として、他の中間ベクトルの上位半分及び下位半分の下位部分を組み込むことで、前記ベクトルの前記結果物であるロールされたバージョンを形成する手順と
を実行する、プログラム。
【請求項１０】
前記形成する手順は、結果物をベクトルブレンド命令によって形成する手順を含む、請求項９に記載のプログラム。
【請求項１１】
前記第１の中間ベクトルはベクトルシャッフル命令によって形成され、前記第２の中間ベクトルはベクトル挿入命令によって形成される、請求項９または１０に記載のプログラム。
【請求項１２】
前記第１の中間ベクトルの制御ベクトルは、ベクトルブロードキャスト命令によって形成される、請求項１１に記載のプログラム。
【請求項１３】
前記第１の中間ベクトルの制御ベクトルは、ルックアップテーブルから前記制御ベクトルのエレメントを探すことによって形成される、請求項１１に記載のプログラム。
【請求項１４】
前記第１の中間ベクトルはベクトルシャッフル命令によって形成され、前記第２の中間ベクトルはベクトル抽出命令によって形成される、請求項９または１０に記載のプログラム。
【請求項１５】
前記第１の中間ベクトルの制御ベクトルは、ベクトルブロードキャスト命令によって形成される、請求項１４に記載のプログラム。
【請求項１６】
前記第１の中間ベクトルの制御ベクトルは、ルックアップテーブルから前記制御ベクトルのエレメントを探すことによって形成される、請求項１４に記載のプログラム。
【請求項１７】
コンピューティングシステムであって、
プロセッサと、
前記プロセッサに連結され、前記プロセッサにより処理されると、方法を実行させるプログラムコードを含む不揮発性メモリ素子と
を備え、
前記方法は、
入力ベクトルの、結果物であるロールされたバージョンを作成する段階を備え、
前記ロールされたバージョンを作成する段階は、
前記入力ベクトルの上位半分及び下位半分が定義する２つのレーンのうちの第１のレーン沿いの前記入力ベクトルのエレメントをバレルローリングすることによって、第１の中間ベクトルを形成する段階と、
前記２つのレーンのうちの第２のレーン沿いの前記入力ベクトルのエレメントをバレルローリングすることによって、第２の中間ベクトルを形成する段階と、
前記結果物の上位半分及び下位半分の上位部分として、前記第１の中間ベクトルおよび前記第２の中間ベクトルの１つの上位半分及び下位半分の上位部分を組み込み、且つ、前記結果物の上位半分及び下位半分の下位部分として、他の中間ベクトルの上位半分及び下位半分の下位部分を組み込むことで、前記入力ベクトルの前記結果物であるロールされたバージョンを形成する段階と
を有する、コンピューティングシステム。
【請求項１８】
前記形成する段階は、結果物をベクトルブレンド命令によって形成する段階を含む、請求項１７に記載のコンピューティングシステム。
【請求項１９】
前記第１の中間ベクトルはベクトルシャッフル命令によって形成され、前記第２の中間ベクトルはベクトル挿入命令によって形成される、請求項１７または１８に記載のコンピューティングシステム。
【請求項２０】
前記第１の中間ベクトルはベクトルシャッフル命令によって形成され、前記第２の中間ベクトルはベクトル抽出命令によって形成される、請求項１７または１８に記載のコンピューティングシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の分野は概してコンピュータサイエンスに関しており、より詳しくは、効率的なベクトルロール演算に関する。
【背景技術】
【０００２】
図１は、半導体チップ上に論理回路により実装される処理コア１００の高レベルダイアグラムを示す。処理コアはパイプライン１０１を含む。パイプラインは、完全にプログラムコード命令を実行するために必要な多段階プロセスの特定の段階を実行するようにそれぞれが設計されている複数のステージからなる。これらは通常、少なくとも、１）命令フェッチ及びデコード、２）データフェッチ、３）実行、４）書き戻しを含む。実行ステージは、１または複数の前のステージ（たとえば、上述したステップ１）でフェッチされ、デコードされた命令が特定した特定の演算を、同じ命令が特定し、別の前のステージ（たとえば上述したステップ２）でフェッチされたデータに実行する。演算対象のデータは、通常、（汎用）レジスタ格納スペース１０２からフェッチされる。演算の完了時に作成される新たなデータも通常は、レジスタ格納スペースに「書き戻される」（上述したステージ４）。
【０００３】
実行ステージに関する論理回路は、通常、それぞれが自身の固有の演算サブセットを実行する、複数の「実行ユニット」または「機能ユニット」１０３＿１から１０３＿Ｎからなる（たとえば、第１の機能ユニットが、整数数学演算を実行し、第２の機能ユニットが浮動小数点命令を実行し、第３の機能ユニットが、キャッシュ／メモリに演算をロードしたり、キャッシュ／メモリに格納したりする）。すべての機能ユニットが実行するすべての演算の集合は、処理コア１００がサポートする「命令セット」に対応している。
【０００４】
「スカラー」と「ベクトル」という２つのタイプのプロセッサアーキテクチャが、コンピュータサイエンスでは幅広く認められている。スカラープロセッサは、１つのデータセットに対して演算を実行する命令を実行するよう設計されており、ベクトルプロセッサは、複数のデータセットに演算を実行する命令を実行するよう設計されている。図２Ａ及び図２Ｂは、スカラープロセッサ及びベクトルプロセッサの間の基本的な差を示す比較例を示す。
【０００５】
図２Ａでは、１つのオペランドセットＡ及びＢがＡＮＤ演算され、単一値の（singular）（または「スカラー」）結果Ｃ（つまりＡＢ＝Ｃ）が生成される。これと比較すると、図２Ｂでは、２つのオペランドセットＡ／Ｂ及びＤ／Ｅのそれぞれが並列にＡＮＤ演算されて、同時にベクトル結果Ｃ、Ｆ（つまりA.AND.B=C and D.AND.E=F）が生成される。用語として、「ベクトル」は、複数の「エレメント」をもつデータエレメントである。たとえばベクトルＶ＝Ｑ、Ｒ、Ｓ、Ｔ、Ｕは、Ｑ、Ｒ、Ｓ、Ｔ及びＵという５つの異なるエレメントを有している。例であるベクトルＶの「サイズ」は５である（なぜなら５つのエレメントを有しているので）。
【０００６】
図１は、汎用レジスタスペースと異なるベクトルレジスタスペース１０４の存在を示す。具体的には、汎用レジスタスペース１０２が、名目上、スカラー値を格納するために利用される。したがって、実行ユニットのいずれかがスカラー演算を実行する場合には、この実行ユニットは、汎用レジスタ格納スペース１０２から呼び出したオペランドを名目上利用する（そして結果を汎用レジスタ格納スペース１０２に書き戻す）。これと比較すると、実行ユニットのいずれかがベクトル演算を実行する場合には、この実行ユニットは、ベクトルレジスタスペース１０７から呼び出したオペランドを名目上利用する（そして結果をベクトルレジスタスペース１０７に書き戻す）。同様にして、メモリのそれぞれ別の領域をスカラー値とベクトル値との格納用に割り当てることができる。
【０００７】
さらに、機能ユニット１０３＿１から１０３＿Ｎに対するそれぞれの入力、及び、これら機能ユニットからのそれぞれの出力において、マスク論理１０４＿１から１０４＿Ｎ及び１０５＿１から１０５＿Ｎが存在していることに留意されたい。様々な実装例では、厳しい要件ではないが、実際にはこれら層の１つのみが実装される。マスキングを利用する命令について、入力マスク論理１０４＿１から１０４＿Ｎ及び出力マスク論理１０５＿１から１０５＿Ｎが利用されることで、ベクトル命令についてどのエレメントに対して演算すると効果が高いか、に関して制御することができる。ここで、マスクベクトルがマスクレジスタスペース１０６から読み出され（たとえばベクトルレジスタ格納スペース１０７から読み出される入力データベクトルとともに）、マスク論理１０４、１０５層の少なくとも１つに提示される。
【０００８】
ベクトルプログラムコードを実行する過程において、各ベクトル命令は、１つのデータワード全体を必要としない場合がある。たとえば、一部の命令の入力ベクトルが８つのエレメントのみであったり、他の命令の入力ベクトルが１６エレメントであったり、他の命令の入力ベクトルが、３２エレメントであったりする。したがって、命令における異なるベクトルサイズを実現するために特定の命令に適用される１つの完全なベクトルデータワードのエレメントセットを特定するためにマスク層１０４／１０５が利用される。通常は、各ベクトル命令について、マスクレジスタスペース１０６に維持される特定のマスクパターンが命令から呼び出され、マスクレジスタスペースからフェッチされ、マスク層１０４／１０５の片方または両方に提供され、特定のベクトル演算の正しいエレメントセットが「イネーブル」される。
【０００９】
複数のベクトル命令が実装され、既に公知である。これらには、ＶＰＢＲＯＡＤＣＡＳＴ、ＶＰＳＵＢＢ，ＶＰＡＤＤ，ＶＰＳＨＵＦＢ，ＶＰＸＯＲ，ＶＩＮＳＥＲＴ，ＶＥＸＴＲＡＣＴ及びＶＰＢＬＥＮＤ命令が含まれる。図３Ａから図３Ｇは、これら命令の基本演算をそれぞれ示している。
【００１０】
図３Ａからわかるように、ＶＰＢＲＯＡＤＣＡＳＴ命令は、１つのスカラー値Ａを入力オペランドとして受け、ベクトルの各エレメントにＡをもつベクトルエレメントＲを生成する。ＶＢＲＯＡＤＣＡＳＴ命令はさらに、ルックアップテーブルのアドレス及び値が探されるインデックスが入力オペランドとして提供される場合、ルックアップテーブルからルックアップされる値に対応する結果物を提供するために利用することができる。
【００１１】
図３Ｂからわかるように、ＶＰＳＵＢＢ及びＶＰＡＤＤ命令は、これらを構成するエレメントが一対の入力ベクトルＡ、Ｂの同じ位置のエレメントの減算／加算にそれぞれ対応しているベクトル結果Ｒを生成する。
【００１２】
図３Ｃからわかるように、ＶＰＳＨＵＦＢ命令は、入力ベクトルＢが定義するシャッフルスキームに従って入力ベクトルＡのエレメントを「シャッフル」することで、ベクトル結果物Ｒを生成する。ここで、Ｂの各エレメントは、Ｒの同じ位置のエレメントに対応している。Ｂの各エレメントは、Ｒの各エレメントに配置されるのはＡのどのエレメントかを効果的に特定する。
【００１３】
したがって、図３Ｃの例では、入力ベクトルＢ（及び入力ベクトルＡ）は、それぞれのエレメントのサイズがそれぞれ８ビット（１バイト）であるベクトルである。たとえば、「０ｘ４２」という表記は、当技術分野では、上位４ビットが４の値に対応し（つまり「０１００」）、下位４ビットが２の値に対応する（つまり「００１０」）１バイトを表すために利用されるものとして理解されている。つまり、表記０ｘ４２は、ビットシーケンス０１００００１０をもつ１バイトを表している。
【００１４】
ＶＰＳＨＵＦＢ命令の実装は、入力ベクトルＢの各エレメントの一部のみを利用して、結果物Ｒに含める入力ベクトルＡの１つのエレメントを特定する。たとえば、一実装例では、入力ベクトルＢの１つのエレメントの下位半分のみを利用して、ベクトルＡの特定のエレメントを特定する。たとえば図３Ｃからわかるように、入力ベクトルＢのエレメント３０１は、「０ｘ０２」である。したがって、エレメント３０１は、ベクトルＡの第３の（たとえばシーケンス０、１、２に従って）のエレメント３０２が、制御ベクトルＢのエレメント３０１と同じエレメントの位置に対応する結果物Ｒのエレメントに含めるために選択することを特定している。同様に、入力ベクトルＢの１つのエレメントが０ｘ０９である場合には、入力ベクトルＡの１０個目のエレメントが、結果物Ｒの同じエレメントの位置について選択される。
【００１５】
各ベクトルが１２８ビットであり、サイズがそれぞれ１バイトである１６エレメントを有している一実施形態では、入力ベクトルＢの１つのエレメントの下位半分が４ビットであり、入力ベクトルＡの１６のエレメントのいずれか１つを特定することができる（たとえば、１６進法の形態を利用する場合には、入力ベクトルＢの任意のエレメントの下位半分が、０からｆの任意の値であってよい）。入力ベクトルＢの各エレメントの上位半分の値は、エレメントの上位半分の最上位ビットが１に等しい８からｆのいずれかを除いて、重要ではない。この場合には、エレメントの下位半分が無視され（つまり、ベクトルＡの１つのエレメントを特定していない）、０の値（００００００００）を、位置が１に等しい最上位ビットをもつ入力ベクトルＢのエレメントに対応している結果物Ｒのエレメントに挿入する。
【００１６】
ＶＰＸＯＲ命令は、図３Ｄに示すように、結果物Ｒの各エレメントに、入力ベクトルＡ及びＢの同じ位置のエレメントの排他的ＯＲを提供する。
【００１７】
ＶＩＮＳＥＲＴ命令は、図３Ｅに示すように、入力ベクトルＡをＲに組み込んで、Ｒのエレメントの上位半分またはエレメントの下位半分を、入力ベクトルＢのエレメントの下位半分と置き換えることで、結果物Ｒを準備する。一実装例では、入力ベクトルＢのエレメントの下位半分がＲの上位半分または下位半分に挿入されるかを、即値オペランドの設定により判断する（たとえば、即値オペランドが１の場合には、ＢのエレメントがＲの上位半分に挿入され、即値オペランドが０の場合には、ＢのエレメントがＲの下位半分に挿入される）。
【００１８】
ＶＥＸＴＲＡＣＴ命令は、図３Ｆに示すように、入力パラメータの設定（一実装例では即値オペランドである）に応じて、入力ベクトルＡのエレメントの上位半分またはエレメントの下位半分を抽出して、抽出したエレメントを結果物Ｒとに与える。たとえば、入力ベクトルＡが２５６ビットのベクトルである場合には、結果物Ｒは、即値オペランドが１または０であるかに応じて、上位１２８ビットまたは下位１２８ビットとなる。
【００１９】
ＶＰＢＬＥＮＤ命令は、ＶＩＮＳＥＲＴ命令に類似しているが、より細分化した制御が可能である（with more granularized control）。ＶＰＢＬＥＮＤ命令は、図３Ｇに示すように、入力ベクトルＡをＲに組み込んで、マスク入力ベクトルＭの設定に応じて、エレメントごとに、Ｒの特定のエレメントを、入力ベクトルＢの対応する（同じ位置の）エレメントで置き換えることで、結果物Ｒを準備する。たとえばＡ／Ｒが２５６ビットベクトルである場合、３２バイトサイズのエレメントが存在する。Ｍは、３２ビットの入力ベクトルであり、各ビットが、Ａ／Ｒ及びＢの個々のエレメントに対応している。Ｍが特定の位置に１の値を含む場合、Ｂの対応するバイトが、Ｒの対応するバイトに組み込まれる。
【００２０】
前のプロセッサ実装例における１つの問題に、ベクトルエレメントを左右に「ロール」しようとする必要が出てくると、各入力エレメントをその正確な宛先エレメント位置に移動させるために少なくとも１つの命令を必要とする長い命令ストリームを生成してしまう、ということがあった。たとえば図４は、ベクトルＡとこれを構成するエレメントとを示している。もしも何等かの理由でコンパイラが、ベクトルのエレメントを左右に「ロール」する必要性を認識し、ベクトルの各エレメントに対して、少なくとも１つの命令をオブジェクトコード内に構築する必要がある。図４は、ベクトルＡを、３つのエレメント左に移動させる必要がある一例を示している（命令実行用語においては、手書きのページで示されるのとは異なり、左右の方向を逆にしてもよい）。したがって、必要なベクトルＮを作成するためには、演算４０１＿１から４０１＿Ｎ‐２のそれぞれについて少なくとも１つの命令が必要である。
【図面の簡単な説明】
【００２１】
本発明の実施形態及びその利点についてより詳しく説明するべく、添付図面と共に以下の説明を参照されたい。添付図面では、同様の参照番号は同様の特徴を示す。図面は以下の通りである。
【００２２】
【図１】命令実行パイプラインの一例を示す。
【００２３】
【図２Ａ】ベクトル処理を示す。
【図２Ｂ】ベクトル処理を示す。
【００２４】
【図３Ａ】様々なベクトル命令が実行する演算を示す。
【図３Ｂ】様々なベクトル命令が実行する演算を示す。
【図３Ｃ】様々なベクトル命令が実行する演算を示す。
【図３Ｄ】様々なベクトル命令が実行する演算を示す。
【図３Ｅ】様々なベクトル命令が実行する演算を示す。
【図３Ｆ】様々なベクトル命令が実行する演算を示す。
【図３Ｇ】様々なベクトル命令が実行する演算を示す。
【００２５】
【図４】従来技術のベクトルロールプロセスを示す。
【００２６】
【図５】向上したベクトルロールプロセスを示す。
【００２７】
【図６Ａ】第１のベクトル左シフトプロセスを示す。
【図６Ｂ】第１のベクトル左シフトプロセスを示す。
【００２８】
【図７Ａ】第２のベクトル左シフトプロセスを示す。
【図７Ｂ】第２のベクトル左シフトプロセスを示す。
【００２９】
【図８Ａ】第１のベクトル右シフトプロセスを示す。
【図８Ｂ】第１のベクトル右シフトプロセスを示す。
【００３０】
【図９Ａ】第２のベクトル右シフトプロセスを示す。
【図９Ｂ】第２のベクトル右シフトプロセスを示す。
【００３１】
【図１０】コンパイラが実行することができるプロセスを示す。
【００３２】
【図１１】コンパイラのコード及び／または上述したシフト演算のいずれかを実行することができるプロセッサの一例を示す。
【発明を実施するための形態】
【００３３】
図５は、上述した図４の方法を採用する場合生成されるものより小さいオブジェクトコードフットプリントを生成するコンパイラの向上したコード構造プロセスを示す。図５の方法に従って、入力ベクトル５００のエレメントをロールして（左右に）、ロールされた結果物であるベクトル５０５を形成する。結果物であるベクトルを決定する際に、結果物であるベクトルの下位半分５０５＿１及び上位半分５０５＿２の適切にロールされた上位の部分５０２＿１、５０２＿２をもつ第１の中間値５０１を生成する。結果物であるベクトルの下位半分５０５＿１及び上位半分５０５＿２の適切にロールされた下位部分５０４＿１、５０４＿２をもつ第２の中間値５０３も生成される。結果物は次に、部分５０２、５０４を、結果物であるベクトルの上位半分５０５＿１および下位半分５０５＿２のそれぞれ対応するセクションに正しくマージすることで形成される。
【００３４】
図５からわかるように、一実施形態では、中間値５０１、５０３は、１つの完全なサイズの入力ベクトル５００に対して演算を実行することで生成されるが、入力ベクトルの下位半分及び／または上位半分に対してロール演算を実行する。言い換えると、中間ベクトルを形成する際には、バレルロール演算を、入力ベクトルの上位半分及び入力ベクトルの下位半分が定義する２つのレーンの片方または両方に実行する。数学的効果によって、中間ベクトルの２つの半分がスタックされている（片方の半分が他方の半分の上に）として見られるときに、図５の部分５０２及び５０４を簡単に描くことができるようになる。以下の図面及びその説明によって、さらなる詳細な実施形態を提供する。ベクトル命令パイプラインに関するベクトルレジスタに、「ｙｍｍ」というプレフィックスを付ける。
【００３５】
図６Ａ、図６Ａは、ベクトルを左にロールする命令シーケンス６００を示している。プロセス６５０は、３２バイトのサイズのエレメントをもつ２５６ビットのベクトルのための命令シーケンス６００が生成する中間値の一例を示す。以下の記載は、命令シーケンス６００および一例である中間値シーケンス６５０の両方に関するものである。表記０ｘＭＮは、Ｍ及びＮのそれぞれが０からｆの１６進法の値のいずれかであってよい制御ベクトルの特定のバイトの値を表すために利用される。
【００３６】
図６Ａ、図６Ｂのプロセスでは、レジスタｙｍｍ０に含まれるベクトル６５１は、エレメントをロールさせる必要のあるベクトルである（「入力ベクトル」）。一例であるシーケンス６５０では、入力ベクトル６５１が、３バイトサイズのエレメント位置分、左にロールされる。ここでは、スカラーパラメータｒａｘ６５２が、ロールさせるべきエレメント位置の量を定義する（一例のプロセス６５０についてはｒａｘ＝３とする）。
【００３７】
シフトマスクベクトル６５３及びブレンドマスクベクトル６５４は、一実施形態においては、内容がランタイム前に（pre runtime）コンパイラによって作成される、予め構築されたベクトルである。図６Ａ、図６Ｂからわかるように、２つのベクトル６５３、６５４がメモリから呼び出されて、それぞれロールシーケンス実行の前に、レジスタｙｍｍ１及びｙｍｍ２に格納される。次にＶＢＲＯＡＤＣＡＳＴ命令が、ｒａｘパラメータを入力オペランドとして実行される６０１。結果物がレジスタｙｍｍ３に配置される。一例であるシーケンス６５０は、ｙｍｍ３のＶＢＲＯＡＤＣＡＳＴ命令６０１の一例である結果物６５５を示す。
【００３８】
次に、以下のＶＳＨＵＲＢ命令６０３に利用する制御入力ベクトル６５６を、効果的にｒａｘ値６５２（ベクトル６５５を利用して）をシフトマスクベクトル６５３の各エレメントから減算するＶＰＳＵＢＢ命令６０２の実行により生成して、結果物６５６をｙｍｍ４に配置する。
【００３９】
ここで、シフトマスクベクトル６５３の初期値について一定の価値が保証されている。図６Ａ、図６Ｂから分かるように、ベクトルに沿ってエレメントずつ移動するごとに、シフトマスクベクトル６５３のエレメントの値が１インクリメントされる。シフトマスクベクトル６５３は、後続するＶＰＳＨＵＦＢ命令６０３の入力を策定（formulate）するために利用されるので、ベクトル６５３の隣接するエレメントがインクリメントされるという特徴は、入力ベクトル６５１の隣接するエレメントを、ロールされた最後の結果物であるベクトル内の互いの隣に配置する。さらに、シーケンス６５０の例の実施形態では、入力ベクトル６５１に３２個のエレメントがある。したがって、３２の最大シフトを利用することができると想定される。ここで、シフトマスクベクトル６５３の最初のエレメント６５７（０ｘ１０）の初期値（これもベクトル６５３の最低値のエレメントである）が、３２という値に対応している。したがって、３２個のエレメント位置の最大シフトを適用した（つまりｒａｘ＝３２）場合、最初のエレメント値６５７が、０という値にまで低減する（０ｘ００）。したがって、シフトマスクベクトル６５３の最初のエレメント６５７の値は、作成されたコードシーケンスがサポートするシフトの最大サイズに対応している。
【００４０】
ＶＰＳＵＢＢ命令６０２は、ｙｍｍ４に、以下のＶＰＳＨＵＦＢ命令６０３用の制御ベクトル６５６を作成する。一実施形態では、２５６ビットのＶＰＳＨＵＦＢ命令６０３が、背景技術セクションで説明した１２８ビットのＶＰＳＨＵＦＢ命令６０４のデュアルレーンバージョンとして実装される。つまり、ＶＰＳＨＵＦＢ命令６０４に実行される２５６ビットの入力ベクトル６５１は、２つの連結された１２８ビットのベクトル（それぞれが、同じ制御ベクトルに従って処理される）としてＶＰＳＨＵＦＢ命令６０３から見られる。
【００４１】
例であるコードシーケンス６５０のＶＰＳＨＵＦＢ命令６０３の結果物６５８は、制御ベクトル６５６のエレメントの最初の半分に従ってシフトされた２つのレーンを示す。つまり、制御ベクトル６５６の最初の半分はフォーム０ｘ０ｄ、０ｘ０ｅ、０ｘ０ｆ、０ｘ１０、…０ｘ１ｃの形態であり、これは、１６エレメントベクトルの３つのエレメント位置のバレルロールに対応する。入力制御ベクトル６５６のこの情報を利用して、ＶＰＳＨＵＦＢ命令６０３が、３２エレメントの入力ベクトル６５１の低位の半分及び高位の半分両方についてこのバレルロールアクションを実行する。したがって、ｎ０、ｏ０、ｐ０、ａ０、…ｍ０として組織化されている結果物の最初のレーンが、ＶＰＳＨＵＦＢ命令６０３の結果物６５８のｎ１、ｏ１、ｐ１、…ｍ１として組織化されている結果物の２番目のレーンの隣に観察される。ＶＰＳＨＵＦＢ命令６０３の結果物６５８は、コードシーケンスの最後の計算中に利用される中間値に効果的に対応している。後で詳述するように、ＶＰＳＨＵＦＢ命令の結果物６５８は、図５の上位部分５０２をもつ第１の中間値５０１の生成に対応している。ここで結果物６５８の部分６６３は、図５の上位部分５０２に対応している。
【００４２】
コードシーケンスの第２の即値をセットアップするために、別のＶＰＳＵＢＢ命令６０４を実行して、ブレンドマスクベクトル６５４からｒａｘシフト値６５２を減算して、レジスタｙｍｍ５に結果物を配置する。このＶＰＳＵＢＢ命令６０４の結果物６５９の一例が、一例のコードシーケンス６５０について観察される。後で詳述するように、第２のＶＰＳＵＢＢ命令６０４の結果物６５９が、最後のロール結果を生成する最後の命令６０７のための最後の制御ベクトルとして利用される。
【００４３】
そして、ｙｍｍ３のエレメントが、自身に対してＸＯＲ６０５され、ｙｍｍ３のすべてのゼロのベクトル６６０が生成される。ここでＶＢＲＯＡＤＣＡＳＴ命令６０１の結果物は最初のＶＰＳＵＢＢ命令６０２の後には不要になるので、命令６０５は、本質的にｙｍｍ３を利用して新たな中間値を作成する。
【００４４】
全てがゼロ６６０であるｙｍｍ３の値と、ｙｍｍ４のＶＰＳＨＵＦＢ命令６０３の結果物とは、ＶＩＮＳＥＲＴ命令６０６のための入力オペランドとして利用される。ここで、ｙｍｍ３内の全てが０のベクトル６６０がｙｍｍ４に格納されているＶＰＳＨＵＦＢ命令の結果物６５７の指定されたエレメントが挿入されたＶＩＮＳＥＲＴ命令６０６の結果物としてみられる。ここで、背景技術セクションの図３ＥのＶＩＮＳＥＲＴ命令の説明を思い出すと、ｙｍｍ４の内容の低位半分がｙｍｍ３の高位半分に挿入されて、低位半分が全てゼロであり、高位半分がＶＰＳＨＵＦＢの結果物６５７の低位半分に対応しているような、結果物６６１がｙｍｍ３に作成される。ＶＩＮＳＥＲＴ命令６０６の結果物６６１が、低位の部分５０４をもつ図５の第２の中間値５０３に対応している。ここで、結果物６６１の部分６６４が、図５の低位の部分５０４に対応している。
【００４５】
最後の命令は、ＶＩＮＳＥＲＴの結果物６６１の領域６６４をＶＰＳＨＵＦＢ命令６０４の結果物６５８にブレンドすることで最後のロール結果物６６２を構成するＶＰＢＬＥＮＤ命令６０７である。ここで、第２のＶＳＵＢＢ命令６０４の結果物６５９が最後の命令６０７の制御ベクトルとして利用されること、および、ベクトル６５９が、最後の結果物の２つのそれぞれ別の上部及び下部の部分６６３、６６４を効果的に区別することができる点を注意されたい。より具体的には、領域６６４に対応する第２のＶＳＵＢＢの結果物６５９のバイトの値が、それぞれ、「１」から始まっており、これは、第２のＶＳＵＢＢの結果物６５９のバイトの値が、それぞれ「０」から始まっているのと対照的である。最後のＶＰＢＬＥＮＤ命令６０７を実行するハードウェアに提供された制御ベクトル６５９の「１」の存在は、命令６０７の他の結果物からこれらエレメントを区別して、ハードウェアがベクトル６６１の領域６６４の値を、ベクトル６５７の同じ領域に挿入して、最後にロールされた結果物６６３を生成する。
【００４６】
図６Ａ、図６Ｂは、一対のＶＳＵＢＢ命令６０２、６０４を利用してＶＰＳＨＵＦＢ及びＶＰＢＬＥＮＤ命令の制御ベクトルをそれぞれ判断する一実施形態を示している。ＶＳＵＢＢ命令６０２、６０４も両方とも、ｒａｘ値をブロードキャストしたＶＢＲＯＡＤＣＡＳＴ命令６０１が作成したｙｍｍ３のベクトルを利用する。
【００４７】
図７Ａ、図７Ｂは、ＶＰＳＨＵＦＢ及びＶＰＢＬＥＮＤ命令のそれぞれの制御ベクトルを生成するルックアップテーブルを利用する別の方法を示す。この結果、図６Ａ、図６Ｂの方法で利用されたＶＳＵＢＢ命令６０２、６０４が存在していない。実際には、図６Ａ、図６Ｂの方法のＶＢＲＯＡＤＣＡＳＴ６０１およびＶＳＵＢＢ命令６０２、６０４は、最終結果の別々の部分の「ロール」を定義するために利用されたものである。図７Ａ、図７Ｂの方法では、この代わりに、ＶＰＳＨＵＦＢ命令およびＶＰＢＬＥＮＤ命令の両方についてロールを定義するために必要な番号のシーケンスが、ルックアップテーブルの情報として、予め格納される。したがって、命令シーケンス７００は、単にＶＢＲＯＡＤＣＡＳＴ命令７０２、７０３による番号のシーケンスを探して、これらをＶＰＳＨＵＦＢ及びＶＰＢＬＥＮＤ命令７０４、７０６に提供する。
【００４８】
図７Ａ、図７Ｂの以降の説明は、命令シーケンス７００が利用する中間値を示す命令シーケンス７００及び一例の命令シーケンスのプロセスフロー７５０の両方に関するものである。図７Ａ、図７Ｂの命令シーケンス７００に従って、第１の命令７０１が、ｒａｘ値をｒａｔ値の負の値（‐ｒａｘ）７５３にフォーマットし直す。ｒａｘ値の負の値は次に第１のルックアップテーブル７５１のアドレス（ｒｓｉ）と、ルックアップすべき値の数と組み合わせて、第１のＶＢＲＯＡＤＣＡＳＴ命令７０２についての入力オペランドを形成する。
【００４９】
例のプロセスフロー７５０の場合、バイト長の粒度で処理される２５６ビットの幅のベクトルサイズを有する基本的な実施形態に準拠してルックアップされるべき３２の値が存在している（つまり２５６ビットに３２バイトがある）。言い換えると、３２ベクトルエレメント位置のロールをサポートするために、第１のＶＢＲＯＡＤＣＡＳＴ命令７０２において３２の値をｒｓｉテーブル７５１から探す。ここでｒｓｉ＋３２の位置が、ｒｓｉテーブル７５１の位置７６０に対応している。したがって、ｒａｘ＝１３の例では、第１のＶＢＲＯＡＤＣＡＳＴ命令７０２の入力オペランド（ｒｓｉ＋３２‐ｒａｘ）が、ｒｓｉテーブル７５１の位置７６１に対応している。したがって図７Ａ、図７Ｂのプロセスフロー７５０の例では、第１のＶＢＲＯＡＤＣＡＳＴ命令７０２が、ｒｓｉテーブル７５１から位置７６１から始めて３２個の値をフェッチする。これらの値は、一例であるプロセスフロー７５０のｙｍｍ１にベクトル７５４として示されており、ＶＰＳＨＵＦＢ命令７０４の正しい制御ベクトルに対応している。
【００５０】
同様に、後続するＶＰＢＬＥＮＤ命令７０６の適切な値を、ｒｄｉテーブル７５２から、第２のＶＢＲＯＡＤＣＡＳＴ命令７０３によって探して、ｙｍｍ３の両方のレーンに配置する。ここでプロセスフロー７５０の例では、１６個の値がｒｄｉテーブル７５１から探し出されて、複製されて、ルックアップされた値７５５の２つの同一のレーンを形成し、これが次にｙｍｍ３に置かれる。次に処理は、図６Ａ、図６Ｂに示し上述したように続行される。ここで、ベクトル７５６のその部分７５９が、図５の第１の中間オペランド５０１の上位部分５０２に対応しており、ベクトル７５８の部分７６０が、図５の中間オペランド５０３の下位部分５０４に対応している。
【００５１】
図８Ａ、図８Ｂ及び図９Ａ、図９Ｂは、対応する右シフト演算に関する。図８Ａ、図８Ｂは、ベースプロセス（左シフトに関する図６Ａ、図６Ｂ同様）を示し、図９Ａ、図９Ｂは、ｒｓｉ及びｒｄｉルックアップテーブル９０１、９０２を利用する対応する高速化を示す（図７Ａ、図７Ｂ同様）。なお、図８Ａ、図８Ｂ及び図９Ａ、図９Ｂの右シフト法では、一部の点において、図６Ａ、図６Ｂ及び図７Ａ、図７Ｂの左シフト法とは論理的に反対の処理が行われる。特に、図６Ａ、図６Ｂの左シフト法は、減算命令を利用しているが、図８Ａ、図８Ｂの右シフト法では加算命令ＶＰＡＤＤを利用する。さらに、図６Ａ、図６ＢのＶＳＨＵＦＢ命令は、結果物の上位部分６６３をもつ中間ベクトル６５８を生成したが、これと比べて、図８Ａ、図８ＢのＶＳＨＵＦＢ命令は、結果物の上位部分８０１をもつ中間ベクトルを生成する。同様に、図６Ａ、図６ＢのＶＩＮＳＥＲＴ命令は、結果物の下位部分６６４をもつ中間ベクトルを生成したが、これと比べて、図８Ａ、図８ＢのＶＩＮＳＥＲＴ命令は、結果物の下位部分８０２をもつ中間ベクトルを生成する。
【００５２】
図１０は、命令実行パイプラインをもつプロセッサが実行するためのコードを構築するコンパイラによって実行することができる方法を示す。図１０の方法に従って、コンパイラは、ベクトルの内容がロールされるべきことを、コンパイルされるコードの数値シーケンスで理解する（１００１）。これに応答して、コンパイラは、入力ベクトル１００２＿１の上位半分及び下位半分により定義される２つのレーンの１つ沿いの入力ベクトルのエレメントをバレルローリングすることによって、第１の中間ベクトルを構築するコードシーケンス１００２を構築する。コードシーケンスはさらに、２つのレーン１００２＿２の他方に少なくとも沿った入力ベクトルのエレメントをバレルローリングすることによって、第２の中間ベクトルを構築する。次に、結果物の上位半分及び下位半分の上位部分及び下位部分が、第２の中間ベクトル１００２＿３の上位半分及び下位半分の下位部分に、第１の中間ベクトルの上位半分及び下位半分の上位部分にマージすることで、定義される。コードシーケンスは最終的には、オブジェクトコード１００３内にコンパイルされて、プロセッサによる実行を待つ。
【００５３】
図１１は、コンピューティングシステムをもつ標準的なマルチコアプロセッサ設計１１００のアーキテクチャを示す。図１１からわかるように、プロセッサは、１）複数の処理コア１１０１＿１から１１０１＿Ｎ、２）インターコネクションネットワーク１１０２、３）最終レベルのキャッシングシステム１１０３、４）メモリコントローラ１１０４及びＩ／Ｏハブ１１０５を含む。処理コアはそれぞれ、上述した命令のいずれか等のベクトル命令等のプログラムコード命令を実行するための１以上の命令実行パイプラインを含んでいる。インターコネクトネットワーク１０２は、コア１１０１＿１から１１０１＿Ｎを、互いに、及び、他のコンポーネント１１０３、１１０４、１１０５にインターコネクトさせる。最終レベルキャッシングシステム１１０３は、命令及び／またはデータがシステムメモリ１１０８へと強制退去させられる（evicted）まで、プロセッサ１１００のキャッシュの最終層として機能する。メモリコントローラ１１０４は、システムメモリ１１０８からデータ及び命令を読み出したり、システムメモリ１１０８にデータ及び命令を書き込んだりする。Ｉ／Ｏハブ１１０５は、プロセッサと「Ｉ／Ｏ」デバイス（たとえば不揮発性記憶素子（たとえばハードディスクドライブ及び／または不揮発性メモリ素子）及び／またはネットワークインタフェース）との間の通信を管理する。ポート１１０６は、インターコネクトネットワーク１１０２からのものであり（stem from）、複数のプロセッサをリンクして、Ｎを超える数のコアをもつシステムが実現されるようにする。グラフィックプロセッサ１１０７はグラフィック計算を実行する。他の重要な機能ブロック（位相ロックループ（ＰＬＬ）回路、電源管理回路等）は、便宜上図１１から省かれている。図１１のプロセッサは、上述したシフトプロセス及び/または上述したコンパイルプロセスのいずれかを実行してよい。
【００５４】
上述した記載が教示するプロセスは、ソフトウェアで実行することができ、これらプロセスは、これら命令を実行するマシン（たとえばプロセッサ）に一定の機能を実行させるマシン実行可能な命令等のプログラムコードにより実装されてよい。上述した記載が教示するプロセスは、さらに、プロセスを実行するよう設定されている電子回路により実行されてもよい（プログラムコードの実行に代えて、または、プログラムコードの実行と組み合わせて）。
【００５５】
上述した記載が教示するプロセスは、様々なオブジェクト指向または非オブジェクト指向コンピュータプログラミング言語のソースレベルのプログラムコードで記述されてよい。プログラムコードを格納するための製品が利用されてよい。プログラムコードを格納する製品は、これらに限定はされないが、１以上のメモリ（たとえば１以上のフラッシュメモリ、ランダムアクセスメモリ（スタティック、ダイナミックその他））、光ディスク、ＣＤ−ＲＯＭ，ＤＶＤ  ＲＯＭ，ＥＰＲＯＭ、ＥＥＰＲＯＭ、磁気カードまたは光カード、その他の種類の電子命令の格納に適したマシン可読媒体として具現化されてよい。プログラムコードはさらに、遠隔コンピュータ（たとえばサーバ）から要求を発するコンピュータ（たとえばクライアント）から、電波媒体に具現化されたデータ信号によって（たとえば通信リンク（たとえばネットワーク接続）を介して）ダウンロードされてよい。
【００５６】
前述した明細書では、本発明は、その具体的実施形態との関連で記載された。しかし、これには、添付請求項に述べた本発明の広義の精神及び範囲から逸脱しない様々な変形例及び変更例が可能である。したがって明細書及び図面は、限定的ではなく例示として捉えられるべきである。
【図１】
2014130573.tif 000003
【図２Ａ】
2014130573.tif 000004
【図２Ｂ】
2014130573.tif 000005
【図３Ａ】
2014130573.tif 000006
【図３Ｂ】
2014130573.tif 000007
【図３Ｃ】
2014130573.tif 000008
【図３Ｄ】
2014130573.tif 000009
【図３Ｅ】
2014130573.tif 000010
【図３Ｆ】
2014130573.tif 000011
【図３Ｇ】
2014130573.tif 000012
【図４】
2014130573.tif 000013
【図５】
2014130573.tif 000014
【図６Ａ】
2014130573.tif 000015
【図６Ｂ】
2014130573.tif 000016
【図７Ａ】
2014130573.tif 000017
【図７Ｂ】
2014130573.tif 000018
【図８Ａ】
2014130573.tif 000019
【図８Ｂ】
2014130573.tif 000020
【図９Ａ】
2014130573.tif 000021
【図９Ｂ】
2014130573.tif 000022
【図１０】
2014130573.tif 000023
【図１１】
2014130573.tif 000024
【外国語明細書】
2014130573000001.pdf