(57)【特許請求の範囲】
【請求項１】
プログラム命令実行のコントロールのフローが条件付きフローコントロール命令の実行に応答して変更されないと予測する予測を発生する段階であって、前記条件付きフローコントロール命令は、述語ベクトルの１つ以上の要素の各々がナルであるとの決定に応答してコントロールのフローを変更するためのものである段階と、
前記予測を発生する段階より予測された経路内にあるプログラム命令を実行する段階であって、前記予測された経路は、前記条件付きフローコントロール命令と前記条件付きフローコントロール命令の命令ターゲットの間を示すものであり、前記予測された経路内にある全てのプログラム命令は、前記述語ベクトルを述語とするものである、前記プログラム命令を実行する段階と、
前記予測が誤りであることを検出する段階と、
前記予測が誤りであるとの前記検出に応答して予測ミス振舞いを禁止する段階と、
を備えた方法。
【請求項２】
予測ミス振舞いを禁止する前記段階は、プログラム順における、前記条件付きフローコントロール命令と命令ターゲットの間にあるプログラム命令を、プロセッサの実行パイプラインからフラッシュするのを禁止することを含む、請求項１に記載の方法。
【請求項３】
前記述語ベクトルの１つ以上の前記要素の各々は、当該要素に対応するベクトル要素が、特定のベクトル命令の結果を受け取るか、又は、当該要素に対応するベクトル要素を、特定のベクトル命令の実行中に不変のままにするか、コントロールするためのものであるか、あるいは、
前記述語ベクトルの１つ以上の前記要素の各々は、当該要素に対応するベクトル要素が、特定のベクトル命令の結果を受け取るか、又は、当該要素に対応するベクトル要素を、特定のベクトル命令の実行中にゼロの値とするか、コントロールするためのものである、請求項１に記載の方法。
【請求項４】
予測ミス振舞いを禁止する前記段階は、更に、前記条件付きフローコントロール命令により指定された条件コードフラグの状態が述語発生命令の結果であるとの決定を受け取ることに依存する、請求項３に記載の方法。
【請求項５】
前記条件付きフローコントロール命令と前記条件付きフローコントロール命令の命令ターゲットとの間のプログラム命令であって、前記予測を発生する段階により予測された経路内にあるプログラム命令による結果のベクトルの各要素の値が、前記述語ベクトルの対応する要素の値に基づいて制御されるものであり、
前記述語ベクトルの１つ以上の前記要素の各々は、当該要素に対応する結果のベクトルの要素が、ベクトル命令であるプログラム命令の結果を受け取るか、又は、当該要素に対応する結果のベクトルの要素を、ベクトル命令であるプログラム命令の実行中に不変のままにするか、コントロールするためのものである場合に、
予測ミス振舞いを禁止する前記段階は実行されるものである、請求項３に記載の方法。
【請求項６】
前記条件付きフローコントロール命令と前記条件付きフローコントロール命令の命令ターゲットとの間のプログラム命令であって、前記予測を発生する段階により予測された経路内にあるプログラム命令による結果のベクトルの各要素の値が、前記述語ベクトルの対応する要素の値に基づいて制御されるものであり、
前記述語ベクトルの１つ以上の前記要素の各々は、当該要素に対応する結果のベクトルの要素が、ベクトル命令であるプログラム命令の結果を受け取るか、又は、当該要素に対応する結果のベクトルの要素を、ベクトル命令であるプログラム命令の実行中にゼロの値とするか、コントロールするためのものである場合に、
予測ミス振舞いを禁止する前記段階は実行されるものである、請求項３に記載の方法。
【請求項７】
実行ユニットと、予測ユニットと、予測ミス検出ユニットとを備えたプロセッサであって、
前記実行ユニットは、ベクトルプログラム命令のベクトルオペランドの異なる要素において同時に動作するように構成された複数の実行パイプラインを含むものであり、
前記予測ユニットは、前記実行ユニットに結合され、そしてフローコントロール命令がプログラム命令実行のコントロールのフローを変更しないとの予測を発生するように構成されるものであり、
前記フローコントロール命令は、述語ベクトルの１つ以上の要素の各々がナルであるとの決定に応答してコントロールのフローを変更するためのものであり、
前記実行ユニットは、前記予測ユニットにより前記フローコントロール命令に関連して予測された経路内にあるプログラム命令を実行するものであり、
前記予測された経路は、前記フローコントロール命令と前記フローコントロール命令の命令ターゲットの間を示すものであり、
前記予測された経路内にある全てのプログラム命令は、前記述語ベクトルを述語とするものであり、
前記予測ミス検出ユニットは、前記予測が誤りであることを検出するよう構成され、前記予測が誤りであるとの前記検出に応答して前記実行パイプラインの予測ミス振舞いを禁止するように構成されるものである、プロセッサ。
【請求項８】
前記述語ベクトルの１つ以上の前記要素の各々は、当該要素に対応するベクトル要素が、特定のベクトル命令の結果を受け取るか、又は、当該要素に対応するベクトル要素を、特定のベクトル命令の実行中に不変のままにするか、コントロールするためのものであるか、あるいは、
前記述語ベクトルの１つ以上の前記要素の各々は、当該要素に対応するベクトル要素が、特定のベクトル命令の結果を受け取るか、又は、当該要素に対応するベクトル要素を、特定のベクトル命令の実行中にゼロの値とするか、コントロールするためのものである、請求項７に記載のプロセッサ。
【請求項９】
前記予測ミス検出ユニットは、更に、前記フローコントロール命令により指定された条件コードフラグの状態が述語発生命令の結果であるとの決定を受け取るのに応答して予測ミス振舞いを禁止するように構成される、請求項８に記載のプロセッサ。
【請求項１０】
前記フローコントロール命令と前記フローコントロール命令の命令ターゲットとの間のプログラム命令であって、前記予測ユニットにより予測された経路内にあるプログラム命令による結果のベクトルの各要素の値が、前記述語ベクトルの対応する要素の値に基づいて制御されるものであり、かつ、
前記述語ベクトルの１つ以上の前記要素の各々は、当該要素に対応する結果のベクトルの要素が、ベクトル命令であるプログラム命令の結果を受け取るか、又は、当該要素に対応する結果のベクトルの要素を、ベクトル命令であるプログラム命令の実行中に不変のままにするか、コントロールするためのものであるか、あるいは、
前記述語ベクトルの１つ以上の前記要素の各々は、当該要素に対応する結果のベクトルの要素が、ベクトル命令であるプログラム命令の結果を受け取るか、又は、当該要素に対応する結果のベクトルの要素を、ベクトル命令の実行中にゼロの値とするか、コントロールするためのものである場合に、
前記予測ミス検出ユニットは、予測ミス振舞いを禁止するように構成される、請求項９に記載のプロセッサ。
【請求項１１】
メモリとプロセッサを備えたシステムであって、
前記メモリは、プログラム命令を記憶するように構成されるものであり、
前記プロセッサは、請求項７〜１０のいずれか１項に記載のプロセッサであり、前記メモリに結合される、システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサに関するもので、より特定すれば、述語付き分岐命令の分岐予測ミス中のベクトル命令の実行に関する。
【背景技術】
【０００２】
分岐予測は、最も近代的なプロセッサでは珍しくなくなった。後方分岐は、高度に予測可能であるが、前方分岐は、処理されているデータの性質に基づいて、充分予測できたりできなかったりする。
【０００３】
ベクトル命令を処理する幾つかのプロセッサは、ベクトルの要素が変更されるか又はそれらの非変更値を維持するかコントロールするために計算を遂行するときマスキング述語化を使用する。より詳細には、述語ベクトルは、ベクトルの個々の要素が変更されるかどうかコントロールする。あるケースでは、述語ベクトルが全てゼロを含むときに述語付き命令の周りで分岐するために分岐命令が使用される。これは、一般的に、分岐が正確に予測されるときの状況では電力及び性能に対する改善となる。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
分岐が予測ミスとなるときの従来のベクトルプロセッサでは、プロセッサパイプラインが典型的にフラッシュされ、分岐ターゲットアドレスのような異なるアドレスから新たな命令がフェッチされる。しかしながら、この形式の従来の分岐ミス振舞いは、不必要であり、無駄である。
【課題を解決するための手段】
【０００５】
分岐予測ミス振舞いを抑制するための方法の種々の実施形態が開示される。一般的に述べると、述語ベクトルがナルであるとの決定に応答してコントロールのフローを命令の周りで分岐させる条件付き分岐命令が非実行であると予測する方法が意図される。しかしながら、予測が誤りであるという検出に応答して、予測ミス振舞いが禁止される。
【０００６】
１つの実施形態において、この方法は、プログラム命令実行のコントロールのフローが条件付きフローコントロール命令の実行に応答して変更されないと予測する予測を発生することを含む。条件付きフローコントロール命令は、述語ベクトルの１つ以上の要素の各々がナルであるとの決定に応答してコントロールのフローを変更する。更に、この方法は、予測が誤りであることを検出し、そして予測が誤りであるとの検出に応答して予測ミス振舞いを禁止することを含む。
【０００７】
１つの特定の実施形態では、予測ミス振舞いを禁止することは、条件付きフローコントロール命令の予測ミス経路内に入るプログラム命令を実行することを含む。
【０００８】
別の特定の実施形態では、予測ミス振舞いを禁止することは、フローコントロール命令と命令ターゲットとの間でプログラム順にプログラム命令をプロセッサの実行パイプラインからフラッシュするのを禁止することを含む。
【図面の簡単な説明】
【０００９】
【図１】コンピュータシステムの一実施形態のブロック図である。
【図２】図１に示すプロセッサの一実施形態を更に詳細に示すブロック図である。
【図３】プログラムコードループの規範的パラレル化を示す図である。
【図４Ａ】例１に示すループのスカラー実行中の変数状態のシーケンスを示す図である。
【図４Ｂ】例１のループのマクロスカラーベクトル化プログラムコードのための実行の進行を示す図である。
【図５Ａ】プログラムソースコードのベクトル化の一実施形態を示す図である。
【図５Ｂ】プログラムソースコードのベクトル化の一実施形態を示す図である。
【図６Ａ】非推論的ベクトル化プログラムコードの一実施形態を示す図である。
【図６Ｂ】推論的ベクトル化プログラムコードの別の実施形態を示す図である。
【図７】述語付き分岐命令の分岐予測ミス中の図２のプロセッサの一実施形態の動作を示すフローチャートである。
【発明を実施するための形態】
【００１０】
添付図面には特定の実施形態が例示され、これについて以下に詳細に述べる。しかしながら、添付図面及び以下の詳細な説明は、特定の特徴について１つの実施形態しか説明されなくても、請求項を、ここに開示する特定の実施形態に限定するものでないことを理解されたい。逆に、本開示の利益を得る当業者に明らかな全ての変更、等効物及び代替え物を網羅することを意図している。本開示に与えられる特徴の例は、単なる例示に過ぎず、特に指示のない限り、それに限定されるものではない。
【００１１】
本出願全体にわたって使用される「〜してもよい(may)」という語は、許すという意味（即ち、〜の潜在性があるという意味）で使用されるもので、強制の意味（即ち、〜しなければならないという意味）ではない。同様に、「含む(include)」、「含んでいる(including)」及び「含む(includes)」という語は、含むことを意味するが、それに限定されない。
【００１２】
種々のユニット、回路又は他のコンポーネントは、１つ又は複数のタスクを遂行するように「構成される」ものとして述べる。この点について、「構成される」とは、動作中に１つ又は複数のタスクを遂行する「回路を有する」ことを一般的に意味する構造を広く表現するものである。従って、ユニット／回路／コンポーネントは、そのユニット／回路／コンポーネントが現在オンでなくても、タスクを遂行するように構成することができる。一般的に、「構成される」に対応する構造を形成する回路は、ハードウェア回路を含む。同様に、種々のユニット／回路／コンポーネントは、説明の便宜上、１つ又は複数のタスクを遂行するものとして説明されてもよい。そのような説明は、「構成される」という句を含むものと解釈されねばならない。１つ以上のタスクを遂行するように構成されたユニット／回路／コンポーネントを表現する場合に、そのユニット／回路／コンポーネントに関して３５Ｕ.Ｓ.Ｃ.§１１２、第６節の解釈を引用しないことが明確に意図される。
【００１３】
本開示の範囲は、ここに取り上げる問題のいずれか又は全部を軽減するかどうかに関わらず、ここに（明示的又は暗示的に）開示する特徴、又は特徴の組み合わせ、或いはそれを一般化したものを包含する。従って、新規な請求項は、本出願（又はその優先権を主張する出願）の起訴中に、そのような特徴の組み合わせへと組織化されてもよい。特に、請求の範囲を参照すれば、従属請求項からの特徴を独立請求項の特徴と組み合わせてもよいし、又、各独立請求項からの特徴を、単に請求の範囲に列挙された特定の組み合わせではなく適当な仕方で組み合わせてもよい。
【００１４】
コンピュータシステムの概略
図１を参照すれば、コンピュータシステムの一実施形態のブロック図が示されている。コンピュータシステム１００は、プロセッサ１０２と、レベル２（Ｌ２）キャッシュ１０６と、メモリ１０８と、大量記憶装置１１０とを備えている。図示されたように、プロセッサ１０２は、レベル１（Ｌ１）キャッシュ１０４を備えている。コンピュータシステム１００では、特定のコンポーネントを示して説明するが、別の実施形態では、異なるコンポーネント及び異なる数のコンポーネントがコンピュータシステム１００に存在してもよいことに注意されたい。例えば、コンピュータシステム１００は、メモリハイアラーキー（例えば、メモリ１０８及び／又は大量記憶装置１１０）を含まなくてもよい。それとは別に、Ｌ２キャッシュ１０６は、プロセッサ１０２の外部に示されているが、他の実施形態では、Ｌ２キャッシュ１０６がプロセッサ１０２の内部にあってもよいことが意図される。更に、そのような実施形態では、レベル３（Ｌ３）キャッシュ（図示せず）が使用されてもよいことに注意されたい。加えて、コンピュータシステム１００は、グラフィックプロセッサ、ビデオカード、ビデオ捕獲装置、ユーザインターフェイス装置、ネットワークカード、光学ドライブ、及び／又は他の周辺装置を備え、これらは、バス、ネットワーク、又は別の適当な通信チャンネル（明瞭化のために全て図示せず）を使用してプロセッサ１０２に結合される。
【００１５】
種々の実施形態において、プロセッサ１０２は、計算動作を遂行する汎用プロセッサを表わす。例えば、プロセッサ１０２は、マイクロプロセッサ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、又はフィールドプログラマブルゲートアレイ（ＦＰＧＡ）のような中央処理ユニット（ＣＰＵ）である。しかしながら、以下に詳細に述べるように、プロセッサ１０２は、ベクトル処理のための１つ以上のメカニズム（例えば、ベクトル実行ユニット）を含む。図２の説明に関連してプロセッサ１０２の規範的なベクトル実行ユニットを以下に詳細に述べる。
【００１６】
大量記憶装置１１０、メモリ１０８、Ｌ２キャッシュ１０６及びＬ１キャッシュ１０４は、プロセッサ１０２のデータ及び命令を記憶するメモリハイアラーキーを総体的に形成する記憶装置である。より詳細には、大量記憶装置１１０は、ディスクドライブ又は大型フラッシュメモリユニットのような大容量の不揮発性メモリで、アクセス時間が長いが、Ｌ１キャッシュ１０４、Ｌ２キャッシュ１０６、及びメモリ１０８は、小型で、アクセス時間が短い。これら高速半導体メモリは、頻繁に使用されるデータのコピーを記憶する。メモリ１０８は、メモリ装置のダイナミックランダムアクセスメモリ（ＤＲＡＭ）ファミリーのメモリ装置を表わす。メモリ１０８のサイズは、典型的に、Ｌ１キャッシュ１０４及びＬ２キャッシュ１０６より大きいが、Ｌ１キャッシュ１０４及びＬ２キャッシュ１０６は、典型的に、装置のスタティックランダムアクセスメモリ（ＳＲＡＭ）ファミリーの小型装置を使用して具現化される。ある実施形態では、Ｌ２キャッシュ１０６、メモリ１０８、及び大量記憶装置１１０は、コンピュータシステム１００の１つ以上のプロセッサ間で共有される。
【００１７】
ある実施形態では、メモリハイアラーキーの装置（即ち、Ｌ１キャッシュ１０４、等）は、サイクルごとに複数のキャッシュラインにアクセス（即ち、読み取り及び／又は書き込み）することができる。これらの実施形態は、非隣接メモリアドレスへのポインタ又はアレイインデックスのベクトルに基づいて生じるメモリアクセスをより有効に処理できるようにする。
【００１８】
以下に述べるデータ構造及びプログラム命令（即ち、コード）は、コンピュータシステム（例えば、コンピュータシステム１００）により使用するためのコード及び／又はデータを記憶できる任意の装置又は記憶媒体である非一時的コンピュータ読み取り可能な記憶装置に記憶されることに注意されたい。一般的に述べると、非一時的コンピュータ読み取り可能な記憶装置は、揮発性メモリ、不揮発性メモリ、磁気及び光学記憶装置、例えば、ディスクドライブ、磁気テープ、コンパクトディスク（ＣＤ）、デジタル多様性ディスク又はデジタルビデオディスク（ＤＶＤ）、或いは現在知られている又は今後開発されるコンピュータ読み取り可能な媒体を記憶できる他の媒体を含むが、これらに限定されない。従って、大量記憶装置１１０、メモリ１０８、Ｌ２キャッシュ１０６、及びＬ１キャッシュ１０４は、全て、非一時的コンピュータ読み取り可能な記憶装置の例である。
【００１９】
プロセッサ
図２は、図１のプロセッサの一実施形態の付加的な細部を示すブロック図である。図２に示す実施形態において、プロセッサ１０２は、多数のパイプライン段を含むが、簡潔化のために、図２には全部が示されていない。従って、図示されたように、プロセッサ１０２は、Ｌ１キャッシュ１０４、命令フェッチユニット２０１、分岐予測ユニット２１０、予測ミスユニット２１２、整数実行ユニット２０２、フローティングポイント実行ユニット２０６、及びベクトル実行ユニット２０４を備えている。整数実行ユニット２０２、フローティングポイント実行ユニット２０６及びベクトル実行ユニット２０４は、グループとして交換可能に「実行ユニット」も称されることに注意されたい。
【００２０】
種々の実施形態において、実行ユニットは、論理演算、数学演算又はビット演算のような計算動作を、例えば、関連形式のオペランドに対して遂行する。より詳細には、整数実行ユニット２０２は、整数オペランドを伴う計算動作を遂行し、フローティングポイント実行ユニット２０６は、フローティングポイントオペランドを伴う計算動作を遂行し、そしてベクトル実行ユニット２０４は、ベクトルオペランドを伴う計算動作を遂行する。整数実行ユニット及びフローティングポイント実行ユニットは、一般的に、この分野で知られており、簡潔化のためにこれ以上説明しない。上述したように、図２に示すプロセッサ１０２の実施形態は、特定セットのコンポーネントを含むが、別の実施形態では、プロセッサ１０２は、異なる個数又は形式の実行ユニット、機能的ユニット、及びパイプライン段、例えば、実行ユニットに結合される命令デコードユニット、スケジューラ又は予約ステーション、再順序付けバッファ、メモリマネージメントユニット、Ｉ／Ｏインターフェイス、等を含むことが意図される。
【００２１】
ベクトル実行ユニット２０４は、複数のデータ要素に対して同じ演算をパラレルに遂行するという点で、古典的な意味の単一命令多データ（ＳＩＭＤ）実行ユニットを表わす。しかしながら、ある実施形態では、ここに述べるベクトル命令は、ＳＩＭＤ命令の他の具現化とは異なる。例えば、一実施形態において、ベクトル命令により演算されるベクトルの要素は、そのサイズがベクトル内の要素の数と共に変化しない。対照的に、あるＳＩＭＤ具現化では、データ要素のサイズが、演算されるデータ要素の数と共に変化する（例えば、ＳＩＭＤアーキテクチャーは、８つの８ビット要素に対する演算をサポートするが、４つの１６ビット要素、２つの３２ビット要素、等だけである）。１つの実施形態において、ベクトル実行ユニット２０４は、オペランドのベクトルに含まれるデータ要素の幾つか又は全部に対して演算する。より詳細には、ベクトル実行ユニット２０４は、ベクトルプログラム命令のベクトルオペランドの異なる要素に対して同時に演算するように構成される。
【００２２】
１つの実施形態において、ベクトル実行ユニット２０４は、ベクトル実行ユニット２０４に対してオペランドベクトル及び結果ベクトルを保持できるベクトルレジスタを含むベクトルレジスタファイル（図示せず）を含む。ある実施形態では、ベクトルレジスタファイルに３２個のベクトルレジスタがあり、各ベクトルレジスタは、１２８ビットを含む。しかしながら、別の実施形態では、異なる数のベクトルレジスタ、及び／又はレジスタ当たり異なる数のビットがあってもよい。
【００２３】
ベクトル実行ユニット２０４は、ベクトルレジスタからオペランドを検索しそしてベクトル命令を実行して、ベクトル実行ユニット２０４がオペランドベクトルのデータ要素の幾つか又は全部に対して演算をパラレルに遂行するように構成される。例えば、ベクトル実行ユニット２０４は、ベクトルの要素に対して論理演算、数学演算又はビット演算を遂行することができる。ベクトル実行ユニット２０４は、命令サイクル当たり１つのベクトル演算を遂行する（が、上述したように、「サイクル」は、ベクトル実行ユニット２０４の計算動作をトリガー、同期及び／又はコントロールするのに使用される２つ以上のクロックサイクルを含んでもよい）。
【００２４】
１つの実施形態において、ベクトル実行ユニット２０４は、正の整数をＮとすれば、Ｎ個のデータ要素（例えば、バイト、ワード、ダブルワード、等）を保持するベクトルをサポートする。これらの実施形態では、ベクトル実行ユニット２０４は、オペランドベクトルのＮ個以下のデータ要素に対して演算をパラレルに遂行する。例えば、ベクトルが２５６ビットの長さである実施形態では、演算されるデータ要素が４バイト要素であり、演算は、データ要素に値を加算することであり、これら実施形態では、ベクトルの多数の要素に値が加算される。Ｎは、プロセッサ１０２の異なる具現化に対して異なるものであることに注意されたい。
【００２５】
種々の実施形態において、ベクトル実行ユニット２０４は、それが演算するオペランドベクトルのデータ要素を動的に制限できるようにする少なくとも１つのコントロール信号を含む。より詳細には、コントロール信号の状態に基づいて、ベクトル実行ユニット２０４は、ベクトルのデータ要素のいずれか又は全部について選択的に演算する。例えば、ベクトルが５１２ビットの長さでありそしてデータ要素が４バイト要素に対して演算される実施形態では、コントロール信号は、オペランドベクトルの１６個のデータ要素の幾つか又は全部に対して演算が遂行されるのを防止するためにアサートされる。演算が遂行されるオペランドベクトルのデータ要素を「動的に」制限することは、ランタイムの各サイクルに対してコントロール信号を個別にアサートすることを含むことに注意されたい。
【００２６】
ある実施形態では、以下に詳細に述べるように、述語のベクトル又は１つ以上のスカラー述語に含まれた値に基づいて、ベクトル実行ユニット２０４は、選択されたベクトルデータ要素のみにベクトル演算を適用する。ある実施形態では、結果ベクトルの残りのデータ要素が不変のままであり（「述語化(predication)」とも称される）又はゼロに強制される（「ゼロ化(zeroing)」又は「ゼロ化述語化(zeroing predication)」とも称される）。ある実施形態では、ベクトル実行ユニット２０４において述語化又はゼロ化のために未使用であるデータ要素処理サブシステム（「レーン(lane)」）が電力及び／又はクロックゲートされ、それにより、ベクトル実行ユニット２０４における動的な電力消費を減少することができる。
【００２７】
種々の実施形態において、アーキテクチャーは、ベクトル長さ不可知論であり、ランタイムにパラレル性を適応させることができる。より詳細には、命令又は演算がベクトル長さ不可知論であるとき、演算（即ち、命令、等）は、サポートハードウェアにより課せられる限度まで、任意の長さのベクトルを使用して実行される。例えば、ベクトル実行ハードウェアが、８つの個別の４バイト要素を含む（従って、８要素のベクトル長さを有する）ベクトルをサポートする実施形態では、ベクトル長さ不可知論演算が、ベクトルの任意の数の８要素に対して演算する。異なるベクトル長さ（例えば、４要素）をサポートする異なるハードウェア具現化では、ベクトル長さ不可知論演算が、基礎的なハードウェアにより利用できるようにされた異なる数の要素に対して演算する。従って、コンパイラー又はプログラマーは、基礎的なハードウェア（例えば、ベクトル実行ユニット２０４）によりサポートされるベクトル長さの明確な知識を有する必要がない。そのような実施形態では、特定のベクトル長さに依存する（又はそれを使用する）必要のないプログラムコードを、コンパイラーが作成するか、又はプログラマーが書く。ある実施形態では、プログラムコードにおいて特定のベクトルサイズを指定することが禁止されてもよい。従って、これら実施形態におけるコンパイルされたコード（即ち、バイナリコード）は、より長いベクトルをサポートするプロセッサから性能利得を潜在的に実現しながら、異なるベクトル長さを有する他の実行ユニットにおいて実行される。そのような実施形態では、プロセッサのような所与のハードウェアユニットに対するベクトル長さが、ランタイム中にシステムレジスタから読み取られる。その結果、処理技術が長いベクトルを許すようになるにつれて、レガシーバイナリコードの実行は、ソフトウェア開発者による努力なしに単純にスピードアップする。
【００２８】
一般的に、ベクトル長さは、２の累乗（例えば、２、４、８、等）として具現化されてもよい。しかしながら、ある実施形態では、ベクトル長さは、２の累乗である必要がない。より特定すれば、３、７、又は別の数のデータ要素のベクトルを、２の累乗数のデータ要素をもつベクトルと同様に使用することができる。
【００２９】
種々の実施形態において、ベクトルの各データ要素は、１組のメモリアクセスをパラレルに遂行するためにベクトル実行ユニット２０４により使用されるアドレスを含む。そのような実施形態では、ベクトルの１つ以上の要素が無効のメモリアドレスを含む場合に、無効のメモリ読み取り動作が生じる。従って、プログラムの終了を招く無効のメモリ読み取り動作は、むしろ、有効アドレスをもつ要素が読み取られ、そして無効アドレスをもつ要素にフラグが立てられるようにして、推論的で且つあと知恵の不法読み取り動作にも関わらず、プログラムの実行を続けられるようにする。
【００３０】
ある実施形態では、プロセッサ１０２（ひいては、ベクトル実行ユニット２０４）は、ポインタのベクトルについて動作しそしてそれを使用することができる。そのような実施形態において、ベクトル当たりのデータ要素の数は、データタイプのサイズに関わらず、ベクトル当たりのポインタの数と同じである。メモリに対して動作する命令は、メモリアクセスのサイズを指示するバリアントを有するが、プロセッサレジスタの要素は、ポインタサイズと同じでなければならない。これらの実施形態では、３２ビット及び６４ビットの両アドレスモードをサポートするプロセッサは、３２ビットモードにおいてベクトル当たり２倍の要素を許すように選択でき、より高いスループットを得ることができる。これは、同じ巾のデータ経路を仮定すれば、３２ビットアドレッシングに対して明確なスループット効果を暗示する。具現化特有の技術を使用して要件を緩和することができる。例えば、３２ビットモードにおいてレジスタのペアリング又は他の特殊なメカニズムを通して倍精度のフローティングポイント数値をサポートすることができる。
【００３１】
１つの実施形態において、分岐予測ユニット２１０は、条件付き分岐命令に対してフェッチユニット２０１のための分岐ターゲットプログラムカウンタアドレス（ＰＣ）を発生するように構成される。より詳細には、条件付き分岐命令に対して、分岐予測ユニット２１０は、分岐が行われるか否か予測し、そしてコントロールロジック（図示せず）は、その予測に基づいてフェッチユニット２０１のＰＣを発生する。次いで、分岐の予測結果に基づいて推論的に、命令がフェッチされ、発行されそして実行される。種々の実施形態において、分岐予測ユニット２１０は、種々の予測メカニズムのいずれかを使用して、予測を発生する。例えば、分岐予測ユニット２１０は、個々の分岐に対して予測状態（例えば、状態マシン、テーブル、カウンタ又は他のデータ構造体）を維持するローカルプレディクタ、集合体において考えられる複数の分岐にわたって予測を行うグローバルプレディクタ、ローカル及びグローバルプレディクタの要素を合成するハイブリッドプレディクタ、或いは他の適当な解決策を使用する。ある実施形態では、分岐予測ユニット２１０は、実行中に変化する分岐振舞いに動的に適応するプレディクタを使用する（例えば、１つの技術により良好に予測された分岐が異なる技術により良好に予測されるようになったときを検出して適応するために）。
【００３２】
１つの実施形態において、予測ミスユニット２１２は、分岐予測を誤った（例えば、実行時に分岐の実際の振舞いが分岐の予測された振舞いとは相違し、分岐が予測ミスであったことを指示する）ときを検出するように構成される。更に、予測ミスユニット２１２は、予測ミスの指示を、実行ユニット２０２、２０６及び２０４、並びに分岐予測ユニット２１０に与えるように構成される。予測ミスユニット２１２は、個別のユニットとして示されているが、他の実施形態では、予測ミスユニット２１２は、分岐予測ユニット２１０の一部分でもよいし、又はフェッチユニット２０１の一部分でもよいし、或いは種々の実行ユニット（例えば、２０２、２０４及び２０６）のいずれか又は全部の一部分でもよいことに注意されたい。
【００３３】
上述したように、従来のプロセッサが分岐命令を予測ミスしたとき、パイプラインは、予測ミスした経路において命令がフラッシュされる。というのは、それらの推論的に発行される命令は、誤った推論の観点から、プロセッサの状態を変更することが許されてはならないからである。次いで、フェッチユニットは、正しい非推論的経路に対して命令をフェッチすることができる。しかしながら、このフラッシュ・充填動作にはペナルティがあり、有用な作業を再開できるまでに数百の実行サイクルが要求される。しかしながら、図７の説明に関連して以下に詳細に述べるように、例えば、予測ミスした経路の命令が実行時にも何の作用も及ぼさないように述語化がさせるので、予測ミスしたときに、正しいプロセッサ動作を保証するために予測ミスした経路の命令をフラッシュすることを要求しない幾つかの分岐命令がある。そのような分岐命令は、予測ミスした経路の命令を実行するために被るペナルティが、予測ミスした経路の命令をフラッシュして異なる分岐ターゲットからフェッチするという従来の予測ミス振舞いを許すために被るペナルティより少ない。より詳細には、以下に述べるマクロスカラーアーキテクチャーには、予想ミスした経路の命令の実行を許すように従来の予測ミス振舞いの抑制を可能にする幾つかの命令がある。
【００３４】
マクロスカラーアーキテクチャーの概略
命令セットアーキテクチャー（マクロスカラーアーキテクチャーと称される）及びそのサポートハードウェアは、コンパイル時にパラレル性を完全に決定する必要なく且つ有用なスタティック分析情報を破棄することなく、コンパイラーがループのためのプログラムコードを発生するのを許す。マクロスカラーアーキテクチャーの種々の実施形態を以下に説明する。特に、以下に詳細に述べるように、ループに対してパラレル性を強制せず、むしろ、動的な条件が許す場合にはランタイムにパラレル性を利用できるようにする命令のセットが与えられる。従って、このアーキテクチャーは、コンパイラーにより発生されるコードが、使用するパラレル性の量を切り換えることで、ランタイムの条件に基づいて、ループの繰り返しに対して非パラレル（スカラー）実行とパラレル（ベクトル）実行との間を動的に切り換えできるようにする命令を含む。
【００３５】
従って、このアーキテクチャーは、ループの繰り返しに対して非決定量のベクトルパラレル性を可能にするが、ランタイムにパラレル性を使用することは要求しない命令を与える。より詳細には、このアーキテクチャーは、有効ベクトル長さがランタイム条件に基づいて変化するベクトル長さ不可知論命令のセットを含む。従って、ランタイム依存性がコードの非パラレル実行を要求する場合には、１つの要素の有効ベクトル長さで実行が行われる。同様に、ランタイム条件がパラレル実行を許す場合には、ランタイム依存性（及び基礎的なハードウェアのベクトル長さ）により許される程度までベクトルパラレル的に同じコードが実行される。例えば、ベクトルの８個の要素のうちの２つがパラレルに実行される場合には、プロセッサ１０２のようなプロセッサが２つの要素をパラレルに実行する。これらの実施形態では、プログラムコードをベクトル長さ不可知論フォーマットで表現することは、既存のシステムには存在しない広範囲のベクトル化機会を可能にする。
【００３６】
種々の実施形態において、コンパイル中に、コンパイラーは、先ず、プログラムコードの所与のループのループ構造を分析し、そしてスタティックな依存性分析を遂行する。次いで、コンパイラーは、スタティックな分析情報を保持しそしてプロセッサ１０２のようなプロセッサに、例えば、どのようにランタイム依存性を解明しそして最大可能パラレル量でプログラムコードを処理するかを命令するプログラムコードを発生する。より詳細には、コンパイラーは、ループ繰り返しの対応セットをパラレルに遂行するためのベクトル命令を与え、そしてループの繰り返しと繰り返しとの間のデータ依存性がエラーを招くのを防止するためにベクトル命令の実行を動的に制限するベクトルコントロール命令を与える。この解決策は、ランタイム依存性の情報が利用できる場合には、パラレル性の決定をランタイムまで延期し、それにより、ソフトウェア及びプロセッサがパラレル性を動的に変化する条件に適応させられるようにする。プログラムコードループパラレル化の一例が図３に示されている。
【００３７】
図３の左側を参照すれば、パラレル化されていないループの４つの繰り返し（例えば、繰り返し１−４）で実行パターンが示されており、各ループは、命令Ａ−Ｇを含む。命令を垂直に積み重ねた状態でシリアルな動作が示されている。図３の右側は、ループがパラレル化された形態である。この例では、１つの繰り返し内の各命令は、それ以前の少なくとも１つの命令に依存し、所与の繰り返しの命令と命令との間にスタティックな依存性チェーンがある。従って、所与の繰り返し内の命令は、パラレル化することができない（即ち、所与の繰り返し内の命令Ａ−Ｇは、その繰り返し内の他の命令に対して常にシリアルに実行される）。しかしながら、別の実施形態では、所与の繰り返し内の命令は、パラレル化可能である。
【００３８】
図３のループの繰り返しと繰り返しとの間の矢印で示されたように、所与の繰り返しにおける命令Ｅと、その後の繰り返しの命令Ｄとの間にランタイムデータ依存性の可能性がある。しかしながら、コンパイルの間に、コンパイラーは、それらの命令と命令との間にデータ依存性の可能性があることだけは決定できるが、どの繰り返しにおいて依存性が実際に現れるか見分けることはできない。というのは、この情報は、ランタイムでなければ得られないからである。この例では、実際にランタイムに現れるデータ依存性が１Ｅから２Ｄ及び３Ｅから４Ｄへの実線矢印で示されており、一方、ランタイムに現れないデータ依存性が２Ｅから３Ｄへの破線矢印を使用して示されている。従って、図示したように、ランタイムデータ依存性は、実際に、第１／第２繰り返し間、及び第３／第４繰り返し間に生じる。
【００３９】
第２と第３の繰り返し間にはデータ依存性が存在しないから、第２及び第３の繰り返しは、安全にパラレル処理される。更に、所与の繰り返しの命令Ａ−Ｃ及びＦ−Ｇは、繰り返し内にのみ依存性を有し、それ故、所与の繰り返しの命令Ａは、他の全ての繰り返しの命令Ａとパラレルに実行することができ、又、命令Ｂは、他の全ての繰り返しの命令Ｂとパラレルに実行することができ、等々である。しかしながら、第２の繰り返しの命令Ｄは、第１の繰り返しの命令Ｅに依存するので、第１の繰り返しにおける命令Ｄ及びＥは、第２の繰り返しの命令Ｄを実行できる前に実行されねばならない。
【００４０】
従って、右側のパラレル化されたループでは、そのようなループの繰り返しは、最大のパラレル性を達成すながら、スタティック及びランタイムの両データ依存性を受け容れるように実行される。より詳細には、４つ全部の繰り返しの命令Ａ−Ｃ及びＦ−Ｇは、パラレルに実行される。しかし、第２の繰り返しにおける命令Ｄは、第１の繰り返しにおける命令Ｅに依存するので、第１の繰り返しにおける命令Ｄ及びＥは、第２の繰り返しの命令Ｄを実行できる前に、実行されねばならない。しかしながら、第２と第３の繰り返し間にはデータ依存性がないから、それらの繰り返しの命令Ｄ及びＥは、パラレルに実行することができる。
【００４１】
マクロスカラーアーキテクチャーの例
以下の例は、マクロスカラー動作を紹介し、そしてパラレル化ループ例において図３に示して上述したループのようなベクトル化ループへのその使用を示すものである。理解を容易にするために、これらの例は、Ｃ＋＋フォーマットの擬似コードを使用して表わされる。
【００４２】
以下の規範的実施形態は、説明上のものであることに注意されたい。実際の命令及び動作は、アーキテクチャーの理解を助けることを単に意図している。しかしながら、別の実施形態では、命令又は動作は、例えば、よりプリミティブな動作のマイクロコードシーケンスを使用して、又はサブ動作の異なるシーケンスを使用して、異なる仕方で具現化することができる。マクロ動作及びそれに対応する使用モデルに関する情報が不明瞭にならないように、命令の更なる分解は回避されることに注意されたい。
【００４３】
表記
以下の例の説明において、特に指示のない限りベクトル量である変数に対して次のフォーマットが使用される。
【００４４】
ｐ５＝ａ＜ｂ；
ベクトルｐ５の要素は、ａ＜ｂのテスト結果に基づいて０又は１にセットされる。ベクトルｐ５は、以下に詳細に述べるように「述語ベクトル(predicate vector)」であることに注意されたい。述語ベクトルを発生する幾つかの命令は、プロセッサ状態フラグを、結果の述語を反映するようにセットもする。例えば、プロセッサ状態フラグ又は条件コードは、ＦＩＲＳＴ（最初）、ＬＡＳＴ（最後）、ＮＯＮＥ（なし）、及び／又はＡＬＬ（全部）フラグを含むことができる。
【００４５】
【数１】
0005612148.tif 000002
述語ベクトルｐ５のアクティブな（即ち、非ゼロの）要素によって指定されるベクトル‘ａ’の要素のみがｂ＋ｃの結果を受け取る。ａの残りの要素は、不変である。この動作は、「述語化(predication)」と称され、述語ベクトルの前にティルデ
【数２】
0005612148.tif 000003
符号を使用して表示される。
【００４６】
！ｐ５；ａ＝ｂ＋ｃ；
述語ベクトルｐ５のアクティブな（即ち、非ゼロの）要素により指定されるベクトル‘ａ’の要素のみがｂ＋ｃの結果を受け取る。ａの残りの要素は、ゼロにセットされる。この動作は、「ゼロ化(zeroing)」と称され、述語ベクトルの前に感嘆符（“！”）を使用して表示される。
【数３】
0005612148.tif 000004
【００４７】
以下の命令は、プロセッサ状態フラグをテストし、そしてそれに応じて分岐する。
ｘ＋＝ＶＥＣＬＥＮ；
ＶＥＣＬＥＮは、ベクトル当たりの要素の数を通信するマシン値である。この値は、アッセンブラーにより決定されるのではなく、コードを実行するプロセッサによりランタイムに決定される。
【００４８】
／／Ｃｏｍｍｅｎｔ
多数の共通のプログラミング言語と同様に、以下の例は、二重のスラッシュ記号を使用して、コメントを指示する。これらのコメントは、指示されたベクトルに含まれた値に関する情報、又はそれに対応する例において遂行される動作の説明を与えることができる。
【００４９】
これらの例では、他のＣ＋＋フォーマットの演算子は、それらの従来の意味を保持するが、要素ごとにベクトルにわたって適用される。ファンクションコールが使用される場合には、それらが、行先レジスタに戻される値を与える単一の命令を意味する。理解を簡単にするために、全てのベクトルは、整数のベクトルであるが、別の実施形態では、他のデータフォーマットがサポートされる。
【００５０】
構造的ループ伝搬依存性
以下のコード例１において、従来のベクトルアーキテクチャーを使用する「ベクトル化不能」なプログラムコードループが示されている。（ベクトル化不能であるのに加えて、このループは、データ依存性の微粒子特性のために従来のマルチスレッドアーキテクチャーにおいてマルチスレッド可能でないことにも注意されたい。）明瞭化のために、このループは、ループをベクトル化不能にする基本的なループ伝搬依存性へ蒸留される。
【００５１】
この例では、変数ｒ及びｓは、従来のアーキテクチャーを使用するベクトル化を防止するループ伝搬依存性を有する。しかしながら、ループは、条件（Ａ［ｘ］＜ＦＡＣＴＯＲ）が常に真であるか又は常に偽であることが分かる限りベクトル化可能であることに注意されたい。これらの仮定は、条件が実行中に変化することが許されたとき（通常のケース）には変化する。この例では簡単化のために、Ａ［］とＢ［］との間にエイリアシングが存在しないと仮定する。
【００５２】
例１：プログラムコードループ
【数４】
0005612148.tif 000005
【００５３】
マクロスカラーアーキテクチャーを使用すると、例１のループは、ベクトルを、条件（Ａ［ｘ］＜ＦＡＣＴＯＲ）が変化しないセグメントへと区分化することによりベクトル化することができる。そのようなベクトルを区画化するためのプロセスの例、及び区画化を可能にする命令の例について、以下に述べる。この例について、ここに述べる区画は、条件条項内の命令に適用するだけでよい。Ａ［ｘ］の最初の読み取り、及び最終的な動作Ｂ［ｘ］＝ｒ＋ｓは、潜在的に最後のループ繰り返しを除いて、全ベクトルにわたり常にパラレルに実行することができる。
【００５４】
マクロスカラーアーキテクチャーに関連して、図２のプロセッサ１０２のようなベクトルプロセッサの動作を説明するために、ベクトル化コードの命令及び例を図示して説明する。以下の説明は、一般的に、多数の命令を説明し、次いで、それら命令を使用する１つ以上のベクトル化コードサンプルを提示するように、編成される。あるケースでは、特定形式のベクトル化問題が所与の例において調査される。
【００５５】
ｄｅｓｔ＝ＶｅｃｔｏｒＲｅａｄＩｎｔ（Ｂａｓｅ、Ｏｆｆｓｅｔ）
ＶｅｃｔｏｒＲｅａｄＩｎｔは、メモリ読み取り動作を遂行するための命令である。データサイズ（このケースでは整数）によりスケーリングされるオフセットＯｆｆｓｅｔのベクトルがスカラーベースアドレスＢａｓｅに追加されて、メモリアドレスのベクトルを形成し、これが、次いで、行先ベクトルに読み込まれる。命令が述語又はゼロ化された場合には、アクティブな要素に対応するアドレスのみが読み取られる。ここに述べる実施形態では、無効アドレスへの読み取りは、フォールトとなることが許されるが、そのようなフォールトは、第１のアクティブなアドレスが無効である場合にプログラムの終了を生じるだけである。
【００５６】
ＶｅｃｔｏｒＷｒｉｔｅＩｎｔ（Ｂａｓｅ、Ｏｆｆｓｅｔ、Ｖａｌｕｅ）
ＶｅｃｔｏｒＷｒｉｔｅＩｎｔは、メモリ書き込み動作を遂行するための命令である。データサイズ（このケースでは整数）によりスケーリングされるオフセットＯｆｆｓｅｔのベクトルがスカラーベースアドレスＢａｓｅに追加されて、メモリアドレスのベクトルを形成する。値Ｖａｌｕｅのベクトルがこれらメモリアドレスに書き込まれる。この命令が述語又はゼロ化される場合には、データがアクティブなアドレスのみに書き込まれる。ここに述べる実施形態では、不法アドレスへの書き込みは、常に、フォールトを生じる。
【００５７】
ｄｅｓｔ＝ＶｅｃｔｏｒＩｎｄｅｘ（Ｓｔａｒｔ、Ｉｎｃｒｅｍｅｎｔ）
ＶｅｃｔｏｒＩｎｄｅｘは、Ｓｔａｒｔによって指定されたスカラースタート値からの増分により単調に調整する値のベクトルを発生するための命令である。この命令は、インデックス調整が一定であるときにループインデックス変数を初期化するのに使用される。述語化又はゼロ化が適用されるときには、第１のアクティブな要素は、スタート値を受け取り、そしてその後のアクティブな要素にのみ増分が適用される。例えば、
【数５】
0005612148.tif 000006
【００５８】
ｄｅｓｔ＝ＰｒｏｐａｇａｔｅＰｏｓｔＴ（ｄｅｓｔ、ｓｒｃ、ｐｒｅｄ）
ＰｒｏｐａｇａｔｅＰｏｓｔＴ命令は、ｐｒｅｄにより決定されたｓｒｃにおけるアクティブな要素の値をｄｅｓｔの後続インアクティブ要素へ伝播する。アクティブな要素、及び第１のアクティブな要素に先行するインアクティブな要素は、ｄｅｓｔにおいて不変のままである。この命令の目的は、条件付きで計算された値を得て、その条件付きで計算された値を、等価スカラーコードにおいて生じる後続ループ繰り返しへ伝播することである。例えば、
【数６】
0005612148.tif 000007
【００５９】
ｄｅｓｔ＝ＰｒｏｐａｇａｔｅＰｒｉｏｒＦ（ｓｒｃ、ｐｒｅｄ）
ＰｒｏｐａｇａｔｅＰｒｉｏｒＦ命令は、ｐｒｅｄにより決定されたｓｒｃのインアクティブな要素の値をｄｅｓｔの後続アクティブ要素へ伝播する。インアクティブな要素は、ｓｒｃからｄｅｓｔへコピーされる。述語の第１の要素がアクティブである場合には、ｓｒｃの最後の要素がその位置へ伝播される。例えば、
【数７】
0005612148.tif 000008
【００６０】
ｄｅｓｔ＝ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ（ｐｒｅｄ、ｄｅｐｓ）
ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令は、述語のベクトルｐｒｅｄを評価し、そしてｄｅｐｓにより指定されたデータ依存性を意味する隣接述語要素間の遷移を識別する。スカラー値ｄｅｐｓは、４ビットのアレイと考えられ、各ビットは、左から右へ処理されるときにｐｒｅｄにおける真／偽要素間の考えられる遷移を指定する。これらのビットは、セットされた場合には、指示された依存性の存在を搬送し、そしてセットされない場合には、依存性の不存在を保証する。それらは、
ｋＴＦ：述語が真であるところの繰り返しから、述語の値が偽であるところの後続繰り返しへのループ伝搬依存性を意味する。
ｋＦＦ：述語が偽であるところの繰り返しから、述語の値が偽であるところの後続繰り返しへのループ伝搬依存性を意味する。
ｋＦＴ：述語が偽であるところの繰り返しから、述語の値が真であるところの後続繰り返しへのループ伝搬依存性を意味する。
ｋＴＴ：述語が真であるところの繰り返しから、述語の値が真であるところの後続繰り返しへのループ伝搬依存性を意味する。
【００６１】
依存するデータを発生する繰り返しに対応する要素位置は、データに依存する繰り返しに対応する要素位置において行先ベクトルに記憶される。データ依存性が存在しない場合には、その要素において行先ベクトルに０の値が記憶される。それにより得られる依存性インデックスベクトル又はＤＩＶは、依存性を表わす要素−位置インデックスのベクトルを含む。以下に述べる理由で、ベクトルの第１の要素は、要素NO.１である（０ではなく）。
【００６２】
一例として、前記例１のループにおいて依存性について考える。このループでは、条件付き条項の真の繰り返しと偽の繰り返しとの間の遷移が、パラレル性に中断を要求するループ伝搬依存性を表わす。これは、次の命令を使用して取り扱うことができる。
【数８】
0005612148.tif 000009
【００６３】
第４の繰り返しで、要求されたデータが発生され、そして第５の繰り返しは、それに依存するので、（ＤＩＶである）出力ベクトルｐ２の位置５に４が記憶される。第６の繰り返しからのデータに依存する第７の繰り返しについても同じことが言える。ＤＩＶの他の要素は、依存性の不存在を指示するために０にセットされる。（この例では、ベクトルの第１の要素は、要素NO.１であることに注意されたい。）
【００６４】
ｄｅｓｔ＝ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ（Ｐｒｅｄ、ＤＩＶ）
ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓは、依存性インデックスベクトルＤＩＶを取り上げ、そしてｐｒｅｄで指示された処理済の以前のグループが与えられると、安全にパラレルに処理できる要素の次のグループに対応する述語を発生する。ｐｒｅｄの要素がアクティブでない場合には、安全にパラレルに処理できる要素の第１グループに対して述語が発生される。ベクトルの最終要素が処理されたことをＰｒｅｄが指示する場合には、処理すべき要素がないことを指示するインアクティブな述語の結果ベクトルを命令が発生し、そしてＺＦフラグがセットされる。結果の最後の要素がアクティブであることを指示するためにＣＦフラグがセットされる。第１の例の値を使用して、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓは、次のように動作する。
【数９】
0005612148.tif 000010
【００６５】
全てゼロの初期化された述語ｐ２から、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓは、後続ベクトル計算を３つのサブベクトル（即ち、ｐ’、ｐ”及びｐ”’）へと区分化するｐ２の新たなインスタンスを発生する。これは、ハードウェアがベクトルをグループで処理できるようにして、ループのデータ依存性に違反するのを回避する。
【００６６】
図４Ａは、例１においてループのスカラー実行中の変数状態のシーケンスを示す図である。より詳細には、条件付き表現の方向のランダム化された５０／５０分布を使用して、例１のループの変数状態の進行が示されている。図４Ｂは、例１のループのマクロスカラーベクトル化プログラムコードに対する実行の進行を示す図である。図４Ａ及び図４Ｂにおいて、Ａ［］から読み取られた値は、左へ傾斜したハッシュマークを使用して示され、一方、Ｂ［］へ書き込まれる値は、右へ傾斜したハッシュマークを使用して示され、そして（所与の繰り返しにおいてどちらが変化するかに基づいて）“ｒ”又は“ｓ”の値が陰影付けされた背景を使用して示されている。“ｓ”が変化する間に“ｒ”は決して変化せず、そしてその逆もあることが認められる。
【００６７】
全ての値がＡ［］からパラレルに読み取られるか又はＢ［］へパラレルに書き込まれることを防止するものはない。というのは、ループ伝搬依存性チェーンに関与する値のセットがないからである。しかしながら、ｒ及びｓの計算については、条件付き表現の値が同じままである（即ち、真又は偽のラン）間にのみ要素がパラレルに処理される。このループのプログラムコードの実行に対するこのパターンが図４Ｂに示されている。この例は、８要素の長さを有するベクトルを使用することに注意されたい。第１のベクトル命令を処理するときには、第１の繰り返しが単独で遂行され（即ち、ベクトル実行ユニット２０４は、第１のベクトル要素のみを処理し）、一方、繰り返し１−５は、ベクトル実行ユニット２０４によりパラレルに処理され、次いで、繰り返し６−７がベクトル実行ユニット２０４によりパラレルに処理される。
【００６８】
図５Ａ及び５Ｂは、プログラムコードのベクトル化の一実施形態を示す図である。図５Ａは、オリジナルソースコードを示し、図５Ｂは、マクロスカラーアーキテクチャーを使用して遂行される演算を表わすベクトル化コードを示す。図５Ｂのベクトル化されたコードにおいて、ループ１は、ソースコードからのループであり、一方、ループ２は、サブベクトル区画を処理するベクトル区画化ループである。
【００６９】
この例において、アレイＡ［］は、全長ベクトルにおいて読み取られて比較される（即ち、Ｎ要素のベクトルの場合に、一度にアレイＡ［］のＮ個の位置が読み取られる）。ベクトルｉ２は、ベクトルの区画化をコントロールするＤＩＶである。区画化は、偽と真との間の遷移に対して述語ｐ１を監視することにより決定され、これは、遵守すべきループ伝搬依存性を指示する。述語ベクトルｐ２は、任意の時間にどの要素を操作すべきか決定する。この特定のループにおいて、ｐ１は、サブベクトル区画の全ての要素に同じ値を有し、それ故、どの変数を更新すべきか決定するために区画の第１の要素をチェックするだけでよい。
【００７０】
変数“ｓ”が更新された後に、ＰｒｏｐａｇａｔｅＰｏｓｔＴ命令は、アクティブなパターンの最終値をベクトルの後続要素へ伝播する。ループの頂部において、ＰｒｏｐａｇａｔｅＰｒｉｏｒＦ命令は、最終的なベクトル位置からの“ｓ”の最後の値を、次のパスの準備においてベクトルの全ての要素を横切ってコピーする。変数“ｒ”は、あるケースにおいてＰｒｏｐａｇａｔｅＰｒｉｏｒＦ命令を使用する効率を示す異なる方法を使用して伝播されることに注意されたい。
【００７１】
ソフトウェア推論
先の例では、コントロールフロー判断がループ伝搬依存性とは独立しているので、ベクトル区画化ループを開始する前にベクトル区画を決定することができる。しかしながら、これは、常にそうではない。例２Ａ及び例２Ｂに示された次の２つのループについて考える。
【数１０】
0005612148.tif 000011
0005612148.tif 000012
【００７２】
例２Ａにおいて、コントロールフロー判断は、ループ伝搬依存性チェーンとは独立しており、一方、例２Ｂにおいて、コントロールフロー判断は、ループ伝搬依存性チェーンの一部分である。ある実施形態では、例２Ｂのループは、“ｊ”の値が不変のままであるという推論を生じさせ、そしてその後に、この予測が誤りであると分かった場合に補償を行う。そのような実施形態では、“ｊ”の値についての推論は、ループのベクトル化を著しく変化させない。
【００７３】
ある実施形態では、コンパイラーは、ループの繰り返しと繰り返しとの間にデータ依存性がないことを常に予測するように構成される。そのような実施形態では、ランタイムデータ依存性が存在するケースにおいて、パラレルに処理されるアクティブな要素のグループは、そのとき安全にパラレルに処理される要素のグループを表わすように減少される。これらの実施形態では、パラレル性が実際には失われていないので、実際に存在する以上のパラレル性を予測ミスするペナルティは、僅かである（即ち、必要に応じて、非パラレルな仕方で、一度に１つの要素で、繰り返しを処理することができる）。これらの実施形態では、パラレル性の実際の量は、その後の段階で単に確認される。
【００７４】
ｄｅｓｔ＝ＶｅｃｔｏｒＲｅａｄＩｎｔＦＦ（Ｂａｓｅ、Ｏｆｆｓｅｔ、ｐｆ）
ＶｅｃｔｏｒＲｅａｄＩｎｔＦＦは、ＶｅｃｔｏｒＲｅａｄＩｎｔの第１のフォールト変形例である。この命令は、少なくとも第１のアクティブな要素が有効なアドレスである場合には、フォールトを発生しない。無効アドレスに対応する結果は、強制的にゼロにされ、そしてこのデータを使用するその後の命令への述語をマスクするのに使用できるフラグｐｆが返送される。アドレスの第１のアクティブな要素がアンマップされる場合には、この命令は、フォールトとなり、コンピュータシステム１００のバーチャルメモリシステム（図示せず）がそれに対応するページをポピュレートできるようにし、それにより、プロセッサ１０２が前方に進行し続けることができるよう保証する。
【００７５】
ｄｅｓｔ＝Ｒｅｍａｉｎｉｎｇ（Ｐｒｅｄ）
Ｒｅｍａｉｎｉｎｇ命令は、述語のベクトルＰｒｅｄを評価し、そしてベクトルにおける残りの要素を計算する。これは、最後のアクティブな述語に続くインアクティブな述語のセットに対応する。Ｐｒｅｄにアクティブな要素がない場合には、全てのアクティブな述語のベクトルが返送される。同様に、Ｐｒｅｄが全てのアクティブな述語のベクトルである場合には、インアクティブな述語のベクトルが返送される。例えば、
【数１１】
0005612148.tif 000013
【００７６】
図６Ａ及び図６Ｂは、規範的なベクトル化されたプログラムコードの実施形態を示す図である。より詳細には、図６Ａに示すコードサンプルは、例２Ａ（上述した）のコードのベクトル化された形態である。図６Ｂに示すコードサンプルは、例２Ｂのコードのベクトル化された形態である。図６Ｂを参照すれば、Ａ［］の読み取り及びその後の比較は、ベクトル区画化ループ内で移動されている。従って、これらの動作は、“ｊ”の値が変化しないことを仮定（推論）する。“ｊ”を使用した後にのみ、どこで“ｊ”が値を変化するか決定することができる。“ｊ”が更新された後に、残りのベクトル要素は、全ベクトルを通して繰り返すために必要に応じて再計算される。推論コードサンプルにＲｅｍａｉｎｉｎｇ命令を使用することで、ベクトル区画化ループでどの要素を処理状態に保つかプログラムで決定できるようにした後に、実際に安全に処理される（即ち、解明されないデータ依存性をもたない）要素のサブグループをプログラムで決定することができる。
【００７７】
種々の実施形態において、フォールト許容読み取りサポートが提供される。従って、そのような実施形態では、プロセッサ１０２は、後で計算に使用される値をロードする試みにおいてベクトル命令（例えば、ＶｅｃｔｏｒＲｅａｄＦＦ）の無効要素からのアドレスを使用してメモリからデータを推論的に読み取ることができる。しかしながら、無効読み取りが生じたことを発見すると、これらの値は、最終的に破棄され、それ故、正しいプログラムの振舞いにとって適切でない。そのような読み取りは、不存在の又は保護されたメモリを参照するので、これらの実施形態は、メモリから誤って読み取られた無効であるが無関係のデータが存在するなかで通常の実行を継続するように構成される。（バーチャルメモリをサポートする実施形態では、これは、それを行う必要を確信するまでページングされないという付加的な利益を有することに注意されたい。）
【００７８】
図６Ａ及び図６Ｂに示すプログラムループにおいて、条件が真である繰り返しと、その後の繰り返しとの間には、後者の繰り返しに対する述語値に関わらず、ループ伝搬依存性が存在する。これは、ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令のパラメータに反映される。
【００７９】
図６Ａ及び図６Ｂのサンプルプログラムコードは、非推論的ベクトル区画化と推論的ベクトル区画化との間の差にハイライトを当てる。より詳細には、例２Ａでは、メモリが読み取られ、そして述語がＣｏｎｄｉｔｉｏｎａｌＳｔｏｐの前に計算される。区画化ループは、ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令の後に始まる。しかしながら、例２Ｂでは、ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令が区画化ループ内で実行され、そして初期の動作を無効にさせる依存性を確認するように働く。両方のケースにおいて、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ命令は、区画化ループの残り部分に対してどの要素が使用されるかコントロールする述語を計算する。
【００８０】
ナル述語における分岐の予想ミス
上述したように、述語ベクトル、ひいては、述語化は、ベクトルのどの要素が所与のベクトル動作により変更されるか又は不変のままであるか決定するのに使用される。述語化は、ベクトル動作の要素ごとに個々にコントロールされるので、ある場合には、ベクトル動作の各要素が述語化され、ベクトル動作が実行されるとき結果ベクトルの要素が実際に変更されないことが考えられる。ベクトル要素が変更されない述語ベクトルは、ナル述語又は空述語とも称される。従って、述語ベクトルがナル又は空である場合には、その述語ベクトルにより述語化される命令の結果が記憶されない。ナル述語で実行される場合に、そのような命令は、何の効果ももたないが、依然、実行リソース（例えば、実行パイプラインのスロット）を消費する。それ故、それらは、実行から完全に安全に省略することができ、有用な仕事を行うための実行リソースを解放することができる。
【００８１】
ある実施形態において、分岐命令の変形例（「空／ナル述語での分岐」命令と称される）は、ナル述語ベクトルにより述語化された命令の周りで分岐するように使用される。そのような分岐命令又は他のフローコントロール命令は、例えば、述語ベクトルの全ての要素がインアクティブ又は「ナル」である場合にプログラムコードのコントロールフローを変更し、その結果、分岐命令の選ばれなかった経路又は「影」にあるプログラム命令は実行されない。従って、ナル述語命令における分岐は、それらの命令をスキップするのに使用され、それらは、ナル述語において実行される必要がない。例えば、次のコードセグメントは、イフ・エルス(if-else)ステートメントを含む。イフ条件が真である結果として遂行される動作は、イフ条件が偽である結果として遂行される動作と相互に排他的である。
【数１２】
0005612148.tif 000014
【００８２】
例３のコードセグメントのベクトル化を示す規範的コードセグメントが以下の例４に示されている。以下の規範的コードセグメントには、上述した分岐命令が示されている。
【数１３】
0005612148.tif 000015
【００８３】
例４のコードセグメントにおいて、ｐ１＝（条件）は、述語発生命令であり、そして分岐とそれらの各ターゲットとの間の命令は、各分岐の影の中の命令である。空で分岐ｐ１命令は、ｐ１ベクトルがナルであるときに命令の周りで分岐するように使用される。例３のコードセグメントにおいてイフ・エルスステートメントを通して具現化された相互排他性を具現化するため、ｐ１ベクトルは、例４のコードセグメントにおいて補足される。従って、第２の分岐命令においてｐ１ベクトルの逆の論理的な意味で分岐することにより相互排他性が与えられる。
【００８４】
そのようなフローコントロール命令が行われないことが予測されそしてその予測が誤りであるときに、このシナリオに伴う１つの問題が発生する。上述したように、従来の予測ミス振舞いは、パイプラインをフラッシュしそして新たな命令をパイプラインにフェッチすることを要求する。このシナリオでは、予想ミスした経路における命令の結果が記憶されないので、実際上、これら命令を実行するのに不都合なことはない。命令を実行するペナルティは、典型的に、パイプラインをフラッシュして再充填するペナルティより僅かである。従って、以下に詳細に述べるように、そのようなフローコントロール命令の予測ミスを検出すると、予測ミス振舞いを抑制することができる。
【００８５】
図７は、述語付き分岐命令の分岐予測ミスの間の図２のプロセッサの一実施形態の動作を示すフローチャートである。図２ないし図７を総体的に参照し、図７のブロック７０１で開始すると、分岐予測ユニット２１０は、述語ベクトルの要素がナルであるという決定に応答してコントロールのフローを変更する条件付きフローコントロール命令の実行に応答してプログラム命令実行のコントロールのフローが変更されないという予測を発生する。より詳細には、１つの実施形態において、フローコントロール命令は、ナル述語命令において分岐し、そして予測は、分岐非実行(branch not taken)予測となる。
【００８６】
予測ミスユニット２１２は、分岐予測ミスを検出するように構成される。従って、分岐ミスユニット２１２は、予測が誤りであることを検出する（ブロック７０３）。例えば、一実施形態において、予測ミスユニット２１２は、分岐命令が実行と予測されるか、又は非実行と予測されるか追跡する。分岐命令が実行されると、ベクトル実行ユニットは、分岐条件の評価に基づいて分岐が実際に実行されたか否かの指示を予測ミスユニット２１２へ与える。予測ミスを検出するのに応答して、予測ミスユニット２１２は、プロセッサの予測ミス振舞いを禁止する（ブロック７０５）。一実施形態において、予測ミスユニット２１２は、予測ミス指示を発生して、その指示をフェッチユニット２０１、実行ユニット（２０２、２０４及び２０６）及び分岐予測ユニット２１０へ与えるように構成される。そのような実施形態では、予測ミス分岐からの命令を有する実行ユニットのパイプラインは、フラッシュされることが防止され、従って、分岐命令の予測ミス経路内に入る命令を、マシン状態を変更せずに実行できるようにする。
【００８７】
１つの実施形態において、予測ミスユニット２１２は、次の条件を満足するとき、即ちナル又は空き述語における分岐が誤って非実行と予測され、空き述語における分岐の条件コードフラグ（ＣＣＦ）が述語発生命令の結果であり、そして分岐命令と分岐ターゲットとの間の全ての命令が、述語発生命令から生じる述語、又は述語発生命令から生じる述語によりゼロ化述語から導出される述語のいずれかに基づいて述語化されるとき、指示を与えるように構成される。前記条件が満足された場合には、誤って実行された命令がマシンの状態に影響を及ぼすことはない。というのは、それらは、空き述語で実行されており、それ故、良性だからである。
【００８８】
幾つかの実施形態を以上に詳細に説明したが、当業者であれば、前記開示が完全に理解されれば、多数の変更や修正が明らかとなろう。そのような変更や修正は、全て、特許請求の範囲内に網羅されるものとする。
【符号の説明】
【００８９】
１００：コンピュータシステム
１０２：プロセッサ
１０４：Ｌ１キャッシュ
１０６：Ｌ２キャッシュ
１０８：メモリ
１１０：大量記憶装置
２０１：命令フェッチユニット
２０２：整数実行ユニット
２０４：ベクトル実行ユニット
２０６：フローティングポイント実行ユニット
２１０：分岐予測ユニット
２１２：予測ミスユニット
【図１】
0005612148.tif 000016
【図２】
0005612148.tif 000017
【図３】
0005612148.tif 000018
【図４Ａ】
0005612148.tif 000019
【図４Ｂ】
0005612148.tif 000020
【図５Ａ】
0005612148.tif 000021
【図５Ｂ】
0005612148.tif 000022
【図６Ａ】
0005612148.tif 000023
【図６Ｂ】
0005612148.tif 000024
【図７】
0005612148.tif 000025