(57)【要約】      （修正有）【課題】述語生成命令の後に生じる最初の後方分岐命令を検出する方法を提供する。【解決手段】ベクトル分割ループで使用される後方分岐命令の予測を抑制する方法が、述語生成命令後に生じる最初の後方分岐命令を検出するステップを含む。述語生成命令は、依存ベクトルに依存する述語ベクトルを生成し、依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す。この方法は、後方分岐命令の予測の予測精度の指示を受け取るステップも含む。予測精度が閾値を満たさない場合、述語生成命令が依存する依存ベクトルが利用可能になるまで後方分岐命令の予測が抑制される。【選択図】図９
2013254484.tif 000002
【特許請求の範囲】
【請求項１】
述語生成命令に続く最初の条件付き分岐命令を検出するステップを含み、前記最初の条件付き分岐命令は、選択時に後方に分岐し、前記述語生成命令は、実行時に、依存ベクトルに依存する述語ベクトルを生成し、前記依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す指標を含み、
前記最初の条件付き分岐命令の予測精度の指示を受け取るステップと、
前記予測精度の指示に基づいて前記最初の条件付き分岐命令の予測精度が閾値を満たさないと判断したことに応答して、前記述語生成命令が依存する前記依存ベクトルが利用可能になるまで前記最初の条件付き分岐命令の予測を抑制するステップと、
をさらに含むことを特徴とする方法。
【請求項２】
前記依存ベクトルが利用可能であることを検出したことに応答して、前記依存ベクトル内に示されるデータ依存情報を使用して前記最初の条件付き分岐命令を予測するステップをさらに含む、
ことを特徴とする請求項１に記載の方法。
【請求項３】
前記述語生成命令が、マクロスカラのＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ命令である、
ことを特徴とする請求項１に記載の方法。
【請求項４】
前記最初の条件付き分岐命令の予測を抑制するステップが、前記最初の条件付き分岐命令を予測して該予測を廃棄するステップを含む、
ことを特徴とする請求項１に記載の方法。
【請求項５】
前記最初の条件付き分岐命令の予測を抑制するステップが、前記依存ベクトルが利用可能になるまで新たな命令が実行されるのを防ぐステップを含む、
ことを特徴とする請求項１に記載の方法。
【請求項６】
前記最初の条件付き分岐命令の予測を抑制するステップが、前記最初の条件付き分岐命令の実行によりプログラム命令の実行を制御するフローが変化しない旨の以前に生成された予測を廃棄するステップを含む、
ことを特徴とする請求項１に記載の方法。
【請求項７】
前記最初の条件付き分岐命令の各実行に応答してプログラム命令の実行を制御するフローが変化する回数を決定するために前記依存ベクトルが利用可能になった時に、該依存ベクトルを使用するステップをさらに含む、
ことを特徴とする請求項１に記載の方法。
【請求項８】
前記最初の条件付き分岐命令の予測を抑制するステップが、前記依存ベクトルが利用可能になるまで新たな命令が実行パイプライン内にフェッチされるのを防ぐステップを含む、
ことを特徴とする請求項１に記載の方法。
【請求項９】
前記最初の条件付き分岐命令の予測を抑制するステップが、前記依存ベクトルが利用可能になるまで新たな命令が実行されるのを防ぐステップを含む、
ことを特徴とする請求項１に記載の方法。
【請求項１０】
請求項１〜９のいずれかに記載のステップを実行するための１又はそれ以上の手段を備える、
ことを特徴とするプロセッサ。
【請求項１１】
実行命令を選択的にフェッチするように構成されたフェッチユニットと、
前記フェッチユニットに結合されて、述語生成命令に続く最初の条件付き分岐命令を検出するように構成された予測ユニットを備え、前記最初の条件付き分岐命令は、選択時に後方に分岐し、前記述語生成命令は、実行時に、依存ベクトルに依存する述語ベクトルを生成し、前記依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す指標を含み、
前記予測ユニットは、前記最初の条件付き分岐命令の予測精度の指示を生成するように構成されるとともに、
前記最初の条件付き分岐命令の予測精度が閾値を満たさないと判断したことに応答して、前記述語生成命令が依存する前記依存ベクトルが利用可能になるまで前記最初の条件付き分岐命令の予測を抑制するように構成される、
ことを特徴とするプロセッサ。
【請求項１２】
前記予測ユニットが、前記依存ベクトル内に示されるデータ依存情報を受け取ったことに応答して、前記最初の条件付き分岐命令を予測するように構成される、
ことを特徴とする請求項１１に記載のプロセッサ。
【請求項１３】
前記フェッチユニットが、前記依存ベクトルが利用可能になるのを待っている間にストールするように構成される、
ことを特徴とする請求項１１に記載のプロセッサ。
【請求項１４】
前記フェッチユニットに結合されて、前記依存ベクトルが利用可能になるのを待っている間に文脈を切り換えるように構成された実行ユニットをさらに備える、
ことを特徴とする請求項１１に記載のプロセッサ。
【請求項１５】
前記予測ユニットが、前記最初の条件付き分岐の予測を生成するように構成されるとともに、前記最初の条件付き分岐の予測を抑制するために、前記最初の条件付き分岐命令の予測精度が前記閾値を満たさないと判断したことに応答して、前記最初の条件付き分岐命令の予測を廃棄するように構成される、
ことを特徴とする請求項１１に記載のプロセッサ。
【請求項１６】
前記最初の条件付き分岐命令が、命令ループの境界を定め、前記依存ベクトルが、前記命令ループが実行される回数を示す、
ことを特徴とする請求項１１に記載のプロセッサ。
【請求項１７】
前記予測ユニットが、前記依存ベクトルが利用可能であることを検出したことに応答して、ループフェッチ指示を与えるように構成され、前記フェッチユニットが、前記ループフェッチ指示を受け取ったことに応答して、前記命令ループの各反復のための命令をフェッチするように構成される、
ことを特徴とする請求項１６に記載のプロセッサ。
【請求項１８】
前記最初の条件付き分岐命令の予測を抑制するために、前記予測ユニットが、前記依存ベクトルが利用可能になるまで新たな命令の実行を防ぐようにさらに構成される、
ことを特徴とする請求項１１に記載のプロセッサ。
【請求項１９】
前記述語生成命令が、マクロスカラのＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ命令である、
ことを特徴とする請求項１１に記載のプロセッサ。
【請求項２０】
プログラム命令を記憶するように構成されたメモリと、
前記メモリに結合された、請求項１１から１９のいずれかに記載のプロセッサの１又はそれ以上のインスタンスと、
を備えることを特徴とするシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、プロセッサに関し、より具体的には、ベクトル分割ループの実行中におけるいくつかの分岐命令の予測に関する。
【背景技術】
【０００２】
最新のプロセッサでは、分岐予測が一般的になってきた。多くの場合、後方分岐は十分に予測可能であるが、これらの中には、従来の分岐予測器によってうまく予測できないものもある。より詳細には、マクロスカラプロセッサ及びコンパイラは、例えばメモリハザードなどの生じ得るループ伝搬依存に正しく対処するためにベクトル分割ループに依拠する。ベクトル分割ループは、後方分岐を使用してループ上で反復する。ベクトルが頻繁に分割されている場合、従来の分岐予測器はうまく機能できず、プロセッサ性能に悪影響を与えることがある。
【発明の概要】
【課題を解決するための手段】
【０００３】
ベクトル分割ループで使用される後方分岐命令の予測を抑制する方法の様々な実施形態を開示する。大まかに言えば、述語生成命令の後に生じる最初の後方分岐命令を検出する方法を企図する。述語生成命令は、依存ベクトルに依存する述語ベクトルを生成し、依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す。受け取った後方分岐命令の予測の予測精度の指示が閾値を満たさない場合、述語生成命令が依存する依存ベクトルが利用可能になるまで、この後方分岐命令の予測を抑制することができる。
【０００４】
１つの実施形態では、この方法が、述語生成命令後の最初の条件付き分岐命令を検出するステップを含む。述語生成命令は、実行時に、依存ベクトルに依存する述語ベクトルを生成する。依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す指標を含む。また、この方法は、この最初の条件付き分岐命令の予測精度の指示を受け取るステップを含むこともできる。最初の条件付き分岐命令の予測精度が閾値を満たしていないと判定したことに応答して、述語生成命令が依存する依存ベクトルが利用可能になるまで、この最初の条件付き分岐命令の予測を抑制することができる。
【０００５】
１つの特定の実装では、この方法が、依存ベクトル内に示されるデータ依存情報を使用して依存ベクトルが利用可能であることを検出したことに応答して、最初の条件付き分岐命令を予測するステップを含むこともできる。
【図面の簡単な説明】
【０００６】
【図１】コンピュータシステムの１つの実施形態のブロック図である。
【図２】図１に示すプロセッサの実施形態のさらなる詳細を示すブロック図である。
【図３】プログラムコードループの並列化例を示す図である。
【図４Ａ】例１に示すループのスカラ実行中の可変状態のシーケンスを示す図である。
【図４Ｂ】例１のループのマクロスカラベクトル化プログラムコードの実行の進行を示す図である。
【図５Ａ】プログラムソースコードのベクトル化の１つの実施形態を示す図である。
【図５Ｂ】プログラムソースコードのベクトル化の１つの実施形態を示す図である。
【図６Ａ】非推測的ベクトル化プログラムコードの１つの実施形態を示す図である。
【図６Ｂ】推測的ベクトル化プログラムコードの別の実施形態を示す図である。
【図７】ベクトル化プログラムコードの１つの実施形態を示す図である。
【図８】ベクトル化プログラムコードの別の実施形態を示す図である。
【図９】ベクトル分割ループを形成するプログラム命令の実行中における図２のプロセッサの１つの実施形態の動作を示すフロー図である。
【発明を実施するための形態】
【０００７】
図面には、特定の実施形態を一例として示し、本明細書ではこれについて詳細に説明する。しかしながら、特定の特徴に関して単一の実施形態しか記載していない場合でも、図面及び詳細な説明は、開示する特定の実施形態に特許請求の範囲を限定するものではないと理解されたい。それどころか、本開示を利用できる当業者に明らかになる全ての修正物、同等物及び代替物を含むことが意図される。特に明記しない限り、本開示において提供する特徴の例は、限定的なものではなく例示的なものであることが意図される。
【０００８】
本出願を通じて使用する「ｍａｙ（〜できる）」という用語は、強制的な意味の（すなわち、〜しなければならない（ｍｕｓｔ）を意味する）ものではなく、許容的な意味（すなわち、可能性を有すること（ｈａｖｉｎｇ  ｔｈｅ  ｐｏｔｅｎｔｉａｌ  ｔｏ）を意味する）で使用される。同様に、「含む（ｉｎｃｌｕｄｅ、ｉｎｃｌｕｄｉｎｇ、及びｉｎｃｌｕｄｅｓ）」という用語は、限定するわけではないがｉｎｃｌｕｄｉｎｇを意味する。
【０００９】
様々なユニット、回路、又はその他の構成要素について、（１又は複数の）タスクを実行する「ように構成される（ｃｏｎｆｉｇｕｒｅｄ  ｔｏ）」と記載することがある。このような文脈では、「ように構成される」という表現は、動作中に１又は複数のタスクを実行する「回路を有する」ことを一般に意味する包括的な構造の記述である。従って、これらのユニット／回路／構成要素は、ユニット／回路／構成要素が現在オンでない場合でもタスクを実行するように構成することができる。通常、「ように構成される」に相当する構造を成す回路は、ハードウェア回路を含むことができる。同様に、説明の都合上、様々なユニット／回路／構成要素について、１又は複数のタスクを実行する、と記載することもある。このような記載は、「ように構成される」という表現を含むと解釈すべきである。１又はそれ以上のタスクを実行するように構成されたユニット／回路／構成要素について記述することは、このユニット／回路／構成要素に対して米国特許法第１１２条第６項の解釈を行使することを明確に意図するものではない。
【００１０】
本開示の範囲は、本明細書で取り扱う課題の一部又は全部を軽減するかどうかに関わらず、本明細書で（明示的に又は非明示的に）開示するあらゆる特徴又は特徴の組み合わせ、又はこれらのあらゆる一般化を含む。従って、本出願（又はその優先権を主張する出願）の審査中に、あらゆるこのような特徴の組み合わせに対して新たな請求項が立案されることがある。具体的には、添付の特許請求の範囲に関して、従属請求項からの特徴を独立請求項の特徴と組み合わせることができ、それぞれの独立請求項からの特徴を、添付の特許請求の範囲に列挙する特定の組み合わせのみならずあらゆる適切な方法で組み合わせることができる。
【００１１】
コンピュータシステムの概要
ここで図１を参照すると、コンピュータシステムの１つの実施形態のブロック図を示している。コンピュータシステム１００は、プロセッサ１０２、レベル２（Ｌ２）キャッシュ１０６、メモリ１０８、及び大容量記憶装置１１０を含む。図示のように、プロセッサ１０２は、レベル１（Ｌ１）キャッシュ１０４を含む。なお、コンピュータシステム１００内には特定の構成要素を図示し、これらについて説明するが、代替の実施形態では、コンピュータシステム１００内に異なる構成要素及び多くの構成要素が存在することができる。例えば、コンピュータシステム１００は、メモリ階層の一部（メモリ１０８及び／又は大容量記憶装置１１０など）を含まなくてもよい。或いは、Ｌ２キャッシュ１０６をプロセッサ１０２の外部に示しているが、他の実施形態では、Ｌ２キャッシュ１０６がプロセッサ１０２の内部に存在できることが企図される。さらに、このような実施形態では、レベル３（Ｌ３）キャッシュ（図示せず）を使用することもできる。また、コンピュータシステム１００は、グラフィックプロセッサ、ビデオカード、ビデオ取り込み装置、ユーザインターフェイス装置、ネットワークカード、光学ドライブ、及び／又は、バス、ネットワーク、又は別の好適な通信チャネルを使用してプロセッサ１０２に結合されたその他の周辺装置（全て単純化のために図示せず）を含むこともできる。
【００１２】
様々な実施形態では、プロセッサ１０２が、計算動作を実行する汎用プロセッサを表すことができる。例えば、プロセッサ１０２は、マイクロプロセッサ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）又はフィールドプログラマブルゲートアレイ（ＦＰＧＡ）などの中央処理装置（ＣＰＵ）とすることができる。しかしながら、以下でさらに説明するように、プロセッサ１０２は、１又はそれ以上のベクトル処理機構（例えば、ベクトル実行ユニット）を含むことができる。プロセッサ１０２の例示的なベクトル実行ユニットについては、以下で図２の説明に関連してさらに詳細に説明する。
【００１３】
大容量記憶装置１１０、メモリ１０８、Ｌ２キャッシュ１０及びＬ１キャッシュ１０４は、プロセッサ１０２のためのデータ及び命令を記憶するメモリ階層を集合的に形成する記憶装置である。より具体的には、大容量記憶装置１１０は、アクセス時間の長いディスクドライブ又は大型フラッシュメモリユニットなどの大容量不揮発性メモリとすることができ、Ｌ１キャッシュ１０４、Ｌ２キャッシュ１０６及びメモリ１０８は、アクセス時間の短い小型のものとすることができる。これらの高速半導体メモリは、頻繁に使用されるデータのコピーを記憶する。メモリ１０８は、動的ランダムアクセスメモリ（ＤＲＡＭ）系メモリ装置の中のメモリ装置を表すことができる。通常、メモリ１０８のサイズは、Ｌ１キャッシュ１０４及びＬ２キャッシュ１０６よりも大きいが、通常、Ｌ１キャッシュ１０４及びＬ２キャッシュ１０６は、静的ランダムアクセスメモリ（ＳＲＡＭ）系装置の中の小型装置を使用して実装される。いくつかの実施形態では、Ｌ２キャッシュ１０６、メモリ１０８及び大容量記憶装置１１０が、コンピュータシステム１００内の１又はそれ以上のプロセッサ間で共有される。
【００１４】
いくつかの実施形態では、メモリ階層内の装置（すなわち、Ｌ１キャッシュ１０４など）が、サイクル毎に複数のキャッシュラインにアクセスする（すなわち、読み取り及び／又は書き込みを行う）ことができる。これらの実施形態は、不連続なメモリアドレスへのポインタ又は配列インデックスのベクトルに基づいて行われるメモリアクセスの処理をより効率的にすることができる。
【００１５】
なお、以下で説明するデータ構造及びプログラム命令（すなわち、コード）は、コンピュータシステム（コンピュータシステム１００など）が使用するコード及び／又はデータを記憶できるあらゆる装置又は記憶媒体とすることができる非一時的コンピュータ可読記憶装置に記憶することができる。一般的に言えば、非一時的コンピュータ可読記憶装置は、以下に限定されるわけではないが、揮発性メモリ、不揮発性メモリ、ディスクドライブなどの磁気及び光学記憶装置、磁気テープ、コンパクトディスク（ＣＤ）、デジタル多機能ディスク又はデジタルビデオディスク（ＤＶＤ）、或いは現在知られている又は後に開発されるコンピュータ可読媒体を記憶できるその他の媒体を含む。従って、大容量記憶装置１１０、メモリ１０８、Ｌ２キャッシュ１０及びＬ１キャッシュ１０４は、全て非一時的コンピュータ可読記憶装置の例である。
【００１６】
プロセッサ
図２を参照すると、図１のプロセッサの実施形態のさらなる詳細を示すブロック図を示している。図２に示す実施形態では、プロセッサ１０２が、複数のパイプラインステージを含むことができるが、簡潔にするために、図２には全てを示しているわけではない。従って、図示のように、プロセッサ１０２は、Ｌ１キャッシュ１０４、命令フェッチユニット２０１、分岐予測ユニット２１０、誤予測ユニット２１２、整数実行ユニット２０２、浮動小数点実行ユニット２０６、及びベクトル実行ユニット２０４を含む。なお、整数実行ユニット２０２、浮動小数点実行ユニット２０６及びベクトル実行ユニット２０４は、グループとして「実行ユニット」と同義であると見なすことができる。
【００１７】
様々な実施形態では、この実行ユニットが、例えば関連タイプのオペランドに関する論理演算、数学演算、又はビット演算などの計算動作を行うことができる。より詳細には、整数実行ユニット２０２は、整数オペランドに関する計算動作を実行することができ、浮動小数点実行ユニット２０６は、浮動小数点オペランドを含む計算動作を実行することができ、ベクトル実行ユニット２０４は、ベクトルオペランドを含む計算動作を実行することができる。整数実行ユニット及び浮動小数点実行ユニットは当業で一般的に知られており、簡潔にするために詳細には説明しない。上述したように、図２に示すプロセッサ１０２の実施形態は、特定の構成要素の組を含むが、代替の実施形態では、プロセッサ１０２が、実行ユニットに結合できる命令復号ユニット、スケジューラ又はリザベーションステーション、並べ替えバッファ、メモリ管理ユニット、Ｉ／Ｏインターフェイスなどの、異なる数又はタイプの実行ユニット、機能ユニット及びパイプラインステージを含むことができる。
【００１８】
ベクトル実行ユニット２０４は、複数のデータ要素に対して同じ動作を並列に実行できるという点で、古典的な意味の単一命令複数データ（ＳＩＭＤ）実行ユニットを表すことができる。しかしながら、いくつかの実施形態では、ここで説明するベクトル命令が、他のＳＩＭＤ命令の実装と異なる場合もある。例えば、ある実施形態では、ベクトル命令によって動作を受けるベクトル要素が、ベクトル内の要素数によって変化しないサイズを有することができる。対照的に、ＳＩＭＤの実装には、動作を受けるデータ要素の数によってデータ要素のサイズが変化するものもある（例えば、ＳＩＭＤアーキテクチャは、８つの８ビット要素に対する動作をサポートすることができるが、４つのみの１６ビット要素、２つのみの３２ビット要素などに対する動作をサポートすることもある）。１つの実施形態では、ベクトル実行ユニット２０４が、オペランドのベクトルに含まれるデータ要素の一部又は全部に対して動作することができる。より具体的には、ベクトル実行ユニット２０４を、ベクトルプログラム命令のベクトルオペランドの異なる要素に対して同時に動作するように構成することができる。
【００１９】
１つの実施形態では、ベクトル実行ユニット２０４が、ベクトルレジスタファイル（図示せず）を含むことができ、このベクトルレジスタファイルは、ベクトル実行ユニット２０４に対してオペランドベクトル及び結果ベクトルを保持できるベクトルレジスタを含むことができる。いくつかの実施形態では、ベクトルレジスタファイル内に３２個のベクトルレジスタが存在することができ、各ベクトルレジスタは、１２８ビットを含むことができる。しかしながら、代替の実施形態では、異なる数のベクトルレジスタが存在することができ、及び／又はレジスタ当たりに異なる数のビットが存在することができる。
【００２０】
ベクトル実行ユニット２０４は、ベクトルレジスタからオペランドを検索し、ベクトル実行ユニット２０４がオペランドベクトル内のデータ要素の一部又は全部に対して並列に動作を実行するようにするベクトル命令を実行するように構成することができる。例えば、ベクトル実行ユニット２０４は、ベクトル内の要素に対して論理演算、数学演算又はビット演算を実行することができる。ベクトル実行ユニット２０４は、命令サイクル毎に１つのベクトル動作を行うことができる（ただし、上述したように、「サイクル」は、ベクトル実行ユニット２０４の計算動作をトリガし、同期させ、及び／又は制御するために使用できる複数のクロックサイクルを含むことができる）。
【００２１】
１つの実施形態では、ベクトル実行ユニット２０４が、あらゆる正の整数をＮとすることができるＮ個のデータ要素（例えば、バイト、ワード、ダブルワードなど）を保持するベクトルをサポートすることができる。これらの実施形態では、ベクトル実行ユニット２０４が、オペランドベクトル内のＮ個の又はそれ未満のデータ要素に対して並列に動作を行うことができる。例えば、ベクトルが２５６ビット長の実施形態では、動作されるデータ要素が４バイト要素であり、この動作はデータ要素に値を追加することであり、これらの実施形態では、ベクトル内のあらゆる数の要素に値を追加することができる。なお、プロセッサ１０２の異なる実装では、Ｎが異なる場合もある。
【００２２】
様々な実施形態では、ベクトル実行ユニット２０４が、ベクトル実行ユニット２０４が動作を行うオペランドベクトル内のデータ要素の動的制限を可能にする少なくとも１つの制御信号を含むことができる。詳細には、ベクトル実行ユニット２０４は、この制御信号の状態に応じて、ベクトル内のデータ要素の一部又は全部に対して選択的に動作することができる。例えば、ベクトルが５１２ビット長であり、動作されるデータ要素が４バイト要素である実施形態では、オペランドベクトル内の１６個のデータ要素の一部又は全部に対して動作が行われないように制御信号をアサートすることができる。なお、動作が行われるオペランドベクトル内のデータ要素を「動的に」制限することは、実行時に各サイクルに対して別個に制御信号をアサートすることを含むことができる。
【００２３】
いくつかの実施形態では、以下で詳細に説明するように、ベクトル実行ユニット２０４が、述語又は１又はそれ以上のスカラ述語のベクトルに含まれる値に基づいて、選択されたベクトルデータ要素に対してのみベクトル動作を適用する。いくつかの実施形態では、結果ベクトル内の残りのデータ要素が、影響を受けないままであり（「叙述」と呼ぶこともできる）、又はゼロに強制される（「ゼロ化」又は「ゼロ化叙述」と呼ぶこともできる）。いくつかの実施形態では、ベクトル実行ユニット２０４における叙述又はゼロ化に起因して使用されてない、データ要素処理サブシステムのためのクロック（「レーン」）を、パワーゲート制御及び／又はクロックゲート制御し、これによりベクトル実行ユニット２０４内の動的電力消費量を削減することができる。
【００２４】
様々な実施形態では、アーキテクチャを、実行時に並列性に適合できるようにベクトル長非依存型とすることができる。より具体的には、命令又は動作がベクトル長非依存型である場合、サポートハードウェアによって課せられる制限次第で、あらゆる長さのベクトルを使用して動作（すなわち命令など）を実行することができる。例えば、ベクトル実行ハードウェアが、８つの別個の４バイト要素を含むことができる（従って、８要素のベクトル長を有する）ベクトルをサポートする実施形態では、ベクトル長非依存型動作が、ベクトル内の８つの要素のうちのあらゆる数に対して動作することができる。（４つの要素などの）異なるベクトル長をサポートする異なるハードウェア実装では、ベクトル長非依存型動作が、基礎となるハードウェアによって利用可能にされた異なる数の要素に対して動作することができる。従って、コンパイラ又はプログラマは、基礎となるハードウェア（ベクトル実行ユニット２０４など）によってサポートされるベクトル長を明確に知っている必要はない。このような実施形態では、コンパイラが、特定のベクトル長に依拠する（又はこれを使用する）必要のないプログラムコードを生成し、又はプログラマがこのようなプログラムコードを書く。いくつかの実施形態では、プログラムコード内で特定のベクトルサイズを指定することを禁止することができる。従って、これらの実施形態におけるコンパイル済みコード（すなわち、バイナリコード）は、異なるベクトル長を有することができる他の実行ユニット上で実行されると同時に、より長いベクトルをサポートするプロセッサからの性能向上が潜在的に実現される。このような実施形態では、プロセッサなどの所与のハードウェアユニットに対し、実行時間中にシステムレジスタからベクトル長を読み取ることができる。この結果、処理技術によって長いベクトルが可能になるにつれ、ソフトウェア開発者による努力を全く必要とせずに、レガシーバイナリコードの実行が単純にスピードアップする。
【００２５】
一般に、ベクトル長は、２の累乗（２、４、８など）として実装することができる。しかしながら、いくつかの実施形態では、ベクトル長が２の累乗でなくてもよい。詳細には、２の累乗数のデータ要素を含むベクトルと同じように、３つ、７つ又は別の数のデータ要素のベクトルを使用することができる。
【００２６】
様々な実施形態では、ベクトル内の各データ要素が、一連のメモリアクセスを並列に実行するためにベクトル実行ユニット２０４により使用されるアドレスを含むことができる。このような実施形態では、ベクトルの１又はそれ以上の要素が無効なメモリアドレスを含む場合、無効なメモリ読み取り動作が行われることがある。この結果、プログラムの終了を引き起こしたはずの無効なメモリ読み取り動作により、代わりに有効なアドレスを含むいずれかの要素が読み取られ、無効な要素を含む要素にフラグが立てられて、推測的な及び結果的に違法な読み取り動作に直面しながらプログラムの実行継続が許可されてしまう可能性がある。
【００２７】
いくつかの実施形態では、プロセッサ１０２（従ってベクトル実行ユニット２０４）が、ポインタのベクトルに対して動作し、これを使用することができる。このような実施形態では、データタイプのサイズに関わらず、ベクトル当たりのデータ要素数がベクトル当たりのポインタ数と同じである。メモリに対して動作する命令は、メモリアクセスのサイズを示す変種を有することができるが、プロセッサレジスタ内の要素は、ポインタサイズと同じにすべきである。これらの実施形態では、３２ビットのアドレッシングモードと６４ビットのアドレッシングモードの両方をサポートするプロセッサが、３２ビットモードにおけるベクトル当たりの要素数を２倍にできるように選択し、これによりさらに大きなスループットを達成することができる。このことは、同じ幅のデータ経路を仮定した場合、３２ビットのアドレッシングに対する異なるスループット利得を意味する。この要件を緩和するために、実装固有の技術を使用することができる。例えば、レジスタペアリング又は他の何らかの特殊な機構を通じて、３２ビットモードにおいて倍精度浮動小数点数をサポートすることができる。
【００２８】
１つの実施形態では、分岐予測ユニット２１０を、条件付き分岐命令の場合にフェッチユニット２０１に対して分岐目標プログラムカウンタアドレス（ＰＣ）を生成するように構成することができる。より具体的には、条件付き分岐命令の場合には、分岐予測ユニット２１０が、分岐が取られるか否かを予測することができ、制御論理（図示せず）が、この予測に基づいてフェッチユニット２０１に対してＰＣを生成することができる。その後、予測された分岐の結果に応じて推測的に命令をフェッチし、発行して、実行することができる。様々な実施形態では、分岐予測ユニット２１０が、様々な予測機構のいずれかを使用して予測を生成することができる。例えば、分岐予測ユニット２１０は、個々の分岐の予測状態を維持するローカル予測器（例えば、状態機械、テーブル、カウンタ又はその他のデータ構造）、全体として検討される複数の分岐にわたって予測を実行するグローバル予測器、ローカル予測器の要素とグローバル予測器の要素を組み合わせたハイブリッド予測器、又はその他の好適な方法を使用することができる。いくつかの実施形態では、分岐予測ユニット２１０が、（例えば、ある技術に従って良好に予測された分岐が、いつ異なる技術に従って良好に予測されるようになるかを検出してこれに適合するように）実行中に変化する分岐挙動に動的に適合する予測器を利用することができる。
【００２９】
１つの実施形態では、誤予測ユニット２１２が、分岐予測が誤った（例えば、実行時における分岐の実際の挙動が、予測した分岐の挙動と異なり、分岐が誤予測されたことが示される）時点を検出するように構成される。また、誤予測ユニット２１２を、実行ユニット２０２、２０６及び２０４、並びに分岐予測ユニット２１０に誤予測の指示を与えるように構成することもできる。なお、誤予測ユニット２１２を別個のユニットとして示しているが、他の実施形態では、誤予測ユニット２１２が、分岐予測ユニット２１０の一部であってもよく、又はフェッチユニット２０１の一部であってもよく、又は様々な実行ユニット（２０２、２０４、及び２０６など）のいずれか又は全ての一部であってもよいことが企図される。
【００３０】
上述したように、従来のプロセッサが分岐命令を誤予測した場合、誤推測の観点から、これらの推測的に発行された命令によってプロセッサの状態を修正できるようにすべきではないので、パイプラインは、誤予測された経路内の命令をフラッシュされる。その後、フェッチユニット２０１は、正しい非推測的経路に対して命令をフェッチすることができる。しかしながら、フラッシュ・フィル動作にはペナルティがあり、有用な作業を再開できるようになる前に数百回もの実行サイクルが必要になる場合がある。
【００３１】
従って、図７の説明に関連して以下でさらに詳細に説明するように、１つの実施形態では、分岐予測ユニット２１０が、様々な予測の予測精度情報を維持することができる。実際の分岐命令が実行されると、この分岐命令の挙動を予測した方法と実際の分岐命令の挙動との比較に基づいて、所与の分岐命令に関する精度情報を適用することができる。ベクトル分割ループで使用される誤予測後方分岐に関連するペナルティの一部を避けるために、分岐予測ユニット２１０は、予測精度が不十分な場合、この予測を抑制して、ループの反復回数に対応する情報が利用可能になるのを待つように構成することができる。
【００３２】
マクロスカラアーキテクチャの概要
コンパイラは、命令セットアーキテクチャ（マクロスカラアーキテクチャと呼ばれる）及びサポートハードウェアにより、コンパイル時における並列性を完全に決定する必要なく、また有用な静的分析情報を廃棄することなく、ループのためのプログラムコードを生成することができる。以下、マクロスカラアーキテクチャの様々な実施形態について説明する。詳細には、以下でさらに説明するように、ループに対して並列性を命じるのではなく、代わりに動的条件が許す場合に実行時に並列性を利用できるようにする命令セットを提供する。従って、このアーキテクチャは、コンパイラによって生成されたコードが、使用する並列性の量を切り換えることにより、実行時の条件に依存してループ反復の非並列（スカラ）実行と並列（ベクトル）実行を動的に切り換えることを可能にする命令を含む。
【００３３】
従って、このアーキテクチャが与える命令は、ループ反復に関するベクトル並列性の量を未決定とすることができるが、実行時に並列性が使用されることを必要としない。より詳細には、このアーキテクチャは、実行時条件に応じて有効ベクトル長が変化できるベクトル長非依存型命令セットを含む。従って、実行時依存により、コードの非並列実行が求められる場合、１つの要素の有効ベクトル長を使用して実行が行われる。同様に、実行時条件が並列実行を許す場合、実行時依存（及び基礎を成すハードウェアのベクトル長）によってどのような程度まで可能になっても、同じコードがベクトル並列方式で実行を行う。例えば、ベクトルの８つの要素のうちの２つが安全に並列に実行できる場合、プロセッサ１０２などのプロセッサは、この２つの要素を並列に実行することができる。これらの実施形態では、ベクトル長非依存型フォーマットのプログラムコードを表現することにより、既存のシステムには存在しない広範囲のベクトル化の機会が可能になる。
【００３４】
様々な実施形態では、コンパイル中に、コンパイラが、まずプログラムコード内の所与のループのループ構造を分析して、静的依存分析を行う。次に、コンパイラは、静的分析情報を保持するプログラムコードを生成し、プロセッサ１０２などのプロセッサに、例えば実行時依存を解決して考えられる最大量の並列性でプログラムコードを処理する方法を命令する。より詳細には、コンパイラは、対応するループ反復の組を並列に実行するためのベクトル命令を与えるとともに、ループの反復間のデータ依存によってエラーが生じないようにベクトル命令の実行を動的に制限するためのベクトル制御命令を与えることができる。この方法は、実行時依存に関する情報が利用可能である場合に並列化の決定を実行時に委ね、これによりソフトウェア及びプロセッサが、動的に変化する条件に並列性を適合できるようにするものである。プログラムコードのループ並列化の例を図３に示す。
【００３５】
図３の左側を参照すると、並列化されていない４つのループ反復（例えば、反復１〜４）を含む実行パターンを示しており、各ループは命令Ａ〜Ｇを含む。垂直にスタックされた命令の連続動作を示している。図３の右側は、並列化されたバージョンのループである。この例では、反復内の各命令が、その前の少なくとも１つの命令に依存し、これにより所与の反復の命令間に静的依存チェーンが存在するようになる。従って、所与の反復内の命令を並列化することはできない（すなわち、所与の反復内の命令Ａ〜Ｇは、その反復内の他の命令に対して常に直列的に実行される）。しかしながら、代替の実施形態では、所与の反復内の命令を並列化することができる。
【００３６】
図３のループ反復間の矢印によって示すように、所与の反復内の命令Ｅと次の反復の命令Ｄの間に実行時データ依存の可能性がある。しかしながら、この情報は実行時にしか利用できないので、コンパイラは、コンパイル中にこれらの命令間にデータ依存の可能性があることしか判断できず、実際にどの反復内に依存が具体化されているかを告げることはできない。この例では、実行時に実際に具体化されるデータ依存を、１Ｅから２Ｄ及び３Ｅから４Ｄへの実線矢印によって示しており、実行時に具体化されないデータ依存を、２Ｅから３Ｄへの破線矢印を用いて示している。従って、図示のように、第１／第２の反復間及び第３／第４の反復間で実際に実行時データ依存が生じる。
【００３７】
第２の反復と第３の反復の間にはデータ依存が存在しないので、これらの反復は、安全に並列に処理することができる。さらに、所与の反復の命令Ａ〜Ｃ及びＦ〜Ｇは、反復内にしか依存を有しておらず、従って所与の反復の命令Ａは、他の全ての反復の命令Ａと並列に実行することができ、命令Ｂも、他の全ての反復の命令Ｂと並列に実行することができ、以下に関しても同様である。しかしながら、第２の反復内の命令Ｄは、第１の反復内の命令Ｅに依存するので、第１の反復内の命令Ｄ及びＥは、第２の反復の命令Ｄを実行できるようになる前に実行しなければならない。
【００３８】
従って、右側の並列化ループでは、このようなループの反復を実行して静的データ依存及び実行時データ依存のいずれにも対処し、最大並列化を達成する。より詳細には、全ての４つの反復の命令Ａ〜Ｃ及びＦ〜Ｇが並列に実行される。しかしながら、第２の反復内の命令Ｄは、第１の反復内の命令Ｅに依存するので、第１の反復内の命令Ｄ及びＥを実行した後で第２の反復の命令Ｄを実行できるようにしなければならない。しかしながら、第２の反復と第３の反復の間にはデータ依存が存在しないので、これらの反復の命令Ｄ及びＥは並列に実行することができる。
【００３９】
マクロスカラアーキテクチャの例
以下の例は、マクロスカラ演算を導入し、図３に示して上述した並列化ループの例のループのようなベクトル化ループにおけるその使用を示すものである。理解を容易にするために、これらの例は、Ｃ＋＋フォーマットの疑似コードを使用して示している。
【００４０】
なお、以下の実施形態例は説明のためのものである。実際の命令及び動作は、アーキテクチャの理解を容易にすることを意図したものにすぎない。しかしながら、代替の実施形態では、命令又は動作を、例えばマイクロコードシーケンスの原始的な動作を使用して、又は異なるシーケンスの下位動作を使用して異なる方法で実施することができる。なお、マクロ動作及び対応する使用モデルに関する情報が曖昧にならないように、命令をさらに分解することは避ける。
【００４１】
注記
以下の例を説明する際には、変数に関して以下のフォーマットを使用し、これらは別途指示しない限りベクトル量である。
【００４２】
ｐ５＝ａ＜ｂ
ベクトルｐ５の要素は、テスト結果ａ＜ｂに応じて０又は１に設定される。なお、以下でさらに詳細に説明するように、ベクトルｐ５は「述語ベクトル」とすることができる。述語ベクトルを生成するいくつかの命令は、結果としての述語を反映するようにプロセッサ状態フラグも設定する。例えば、プロセッサ状態フラグ又は条件コードは、ＦＩＲＳＴ、ＬＡＳＴ、ＮＯＮＥ及び／又はＡＬＬフラグを含むことができる。
【００４３】
〜ｐ５；ａ＝ｂ＋ｃ
述語ベクトルｐ５内のアクティブな（すなわちゼロでない）要素により指定されるベクトル「ａ」の要素のみがｂ＋ｃの結果を受け取る。ａの残りの要素はそのままである。この動作は「叙述」と呼ばれ、述語ベクトルの前に波形符号（“〜”）を用いて示す。
【００４４】
！ｐ５；ａ＝ｂ＋ｃ
述語ベクトルｐ５内のアクティブな（すなわちゼロでない）要素により指定されるベクトル「ａ」の要素のみがｂ＋ｃの結果を受け取る。ａの残りの要素はゼロに設定される。この動作は「ゼロ化」と呼ばれ、述語ベクトルの前に感嘆符（“！”）を用いて示す。
【００４５】
［プログラムコード］
【００４６】
これに応じて、以下の命令によりプロセッサ状態フラグ及び分岐をテストする。
【００４７】
ｘ＋＝ＶＥＣＬＥＮ
ＶＥＣＬＥＮは、ベクトル当たりの要素数を伝える機械値である。この値は、アセンブラにより決定されるのではなく、コードを実行するプロセッサにより実行時に決定される。
【００４８】
／／Ｃｏｍｍｅｎｔ
以下の例では、多くの共通プログラミング言語と同様に、コメントを示すために二重フォワードスラッシュを使用する。これらのコメントは、指示されるベクトルに含まれる値に関する情報、又は対応する例で行われる動作の説明を示すことができる。
【００４９】
これらの例では、他のＣ＋＋フォーマットの演算子の意味は従来のままであるが、要素毎にベクトル全体に適用される。機能呼出しを採用する場合、これらは、戻されたあらゆる値を宛先レジスタ内に配置する単一の命令を意味する。理解を容易にするために、全てのベクトルは整数のベクトルであるが、代替の実施形態は他のデータフォーマットをサポートする。
【００５０】
構造的ループ伝搬依存
以下のコード例１では、従来のベクトルアーキテクチャを使用する「非ベクトル化」のプログラムコードループを示す。（なお、このループは、非ベクトル化であることに加え、データ依存の微細粒性に起因して、従来のマルチスレッディングアーキテクチャ上におけるマルチスレッドが可能でない。）明確にするために、このループは、ループをベクトル化できないようにする基本的ループ伝搬依存に集約している。
【００５１】
この例では、変数ｒ及びｓは、従来のアーキテクチャを使用するベクトル化を防ぐループ伝搬依存を有する。しかしながら、条件（Ａ［Ｘ］＜ＦＡＣＴＯＲ）が常に真又は常に偽であることが分かっている限り、ループのベクトル化が可能である。実行中に条件が変化できる場合（通常）、これらの仮定は変化する。この例を単純にするために、Ａ［］とＢ［］の間にはエイリアシングが存在しないと仮定する。
【００５２】
例１：プログラムコードループ
［プログラムコード］
【００５３】
例１のループは、マクロスカラアーキテクチャを使用して、条件（Ａ［ｘ］＜ＦＡＣＴＯＲ）が変化しないセグメントにベクトルを分割することによりベクトル化することができる。以下では、このようなベクトルを分割する処理の例、及び分割を可能にする命令の例を示す。なお、この例では、説明する分割を条件節内の命令にのみ適用すればよい。最初のＡ［ｘ］の読み取り及び最後の動作Ｂ［ｘ］＝ｒ＋ｓは、潜在的に最後のループ反復に対して行う場合を除き、常に完全ベクトルにわたって並列に実行することができる。
【００５４】
図２のプロセッサ１０２などのベクトルプロセッサの動作をマクロスカラアーキテクチャに関連して説明するために、ベクトル化コードの命令及び例を図示し説明する。一般に、以下の説明は、いくつかの命令を記載した後に、この命令を使用する１又はそれ以上のベクトル化コードサンプルを示すように編成する。場合によっては、所与の例において特定のタイプのベクトル化問題について検討する。
【００５５】
ｄｅｓｔ＝ＶｅｃｔｏｒＲｅａｄＩｎｔ（Ｂａｓｅ，Ｏｆｆｓｅｔ）
ＶｅｃｔｏｒＲｅａｄＩｎｔは、メモリ読み取り動作を行うための命令である。データサイズによってスケーリングされるオフセットのベクトル、Ｏｆｆｓｅｔ（この場合は整数）をスカラベースアドレス、Ｂａｓｅに追加してメモリアドレスのベクトルを形成し、その後これを宛先ベクトル内に読み込む。命令が叙述又はゼロ化された場合、アクティブな要素に対応するアドレスのみが読み取られる。説明する実施形態では、無効なアドレスへの読み込みには失敗してもよいが、最初のアクティブなアドレスが無効である場合、このような失敗はプログラムの終了しか招かない。
【００５６】
ＶｅｃｔｏｒＷｒｉｔｅＩｎｔ（Ｂａｓｅ，Ｏｆｆｓｅｔ，Ｖａｌｕｅ）
ＶｅｃｔｏｒＷｒｉｔｅＩｎｔは、メモリ書き込み動作を実行するための命令である。データサイズによってスケーリングされるオフセットのベクトル、Ｏｆｆｓｅｔ（この場合は整数）をスカラベースアドレス、Ｂａｓｅに追加してメモリアドレスのベクトルを形成する。これらのメモリアドレスに、値のベクトル、Ｖａｌｕｅが書き込まれる。この命令が叙述又はゼロ化された場合、アクティブアドレスのみにデータが書き込まれる。説明する実施形態では、違法なアドレスへの書き込みは常に失敗する。
【００５７】
ｄｅｓｔ＝ＶｅｃｔｏｒＩｎｄｅｘ（Ｓｔａｒｔ，Ｉｎｃｒｅｍｅｎｔ）
ＶｅｃｔｏｒＩｎｄｅｘは、Ｓｔａｒｔによって指定されたスカラ開始値から増分によって単調に調整を行う値のベクトルを生成するための命令である。この命令は、指標調整が一定である場合にループ指標変数を初期化するために使用することができる。叙述又はゼロ化が適用された場合、最初のアクティブな要素が開始値を受け取り、次のアクティブな要素のみに増分が適用される。例えば、
［プログラムコード］
【００５８】
ｄｅｓｔ＝ＰｒｏｐａｇａｔｅＰｏｓｔＴ（ｄｅｓｔ，ｓｒｃ，ｐｒｅｄ）
ＰｒｏｐａｇａｔｅＰｏｓｔＴ命令は、ｐｒｅｄによって決定されるｓｒｃ内のアクティブな要素の値を、ｄｅｓｔの次の非アクティブな要素に伝播する。ｄｅｓｔでは、アクティブな要素、及び最初のアクティブな要素に先行するあらゆる非アクティブな要素はそのままである。この命令の目的は、条件的に計算された値を取ることであり、この条件的に計算された値を、同等のスカラーコード内に生じる次のループ反復に伝播する。例えば、
［プログラムコード］
【００５９】
ｄｅｓｔ＝ＰｒｏｐａｇａｔｅＰｒｉｏｒＦ（ｓｒｃ，ｐｒｅｄ）
ＰｒｏｐａｇａｔｅＰｒｉｏｒＦ命令は、ｐｒｅｄによって決定されるｓｒｃの非アクティブな要素の値を、ｄｅｓｔ内の次のアクティブな要素に伝播する。非アクティブな要素はｓｒｃからｄｅｓｔにコピーされる。述語の最初の要素がアクティブである場合、ｓｒｃの最後の要素がその位置に伝播される。例えば、
［プログラムコード］
【００６０】
ｄｅｓｔ＝ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ（ｐｒｅｄ，ｄｅｐｓ）
ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令は、述語のベクトル、ｐｒｅｄを評価し、ｄｅｐｓによって指定されるデータ依存を意味する隣接する述語要素間の遷移を識別する。スカラ値ｄｅｐｓは、４ビットのアレイと考えることができ、これらの各々は、左から右に処理した場合、ｐｒｅｄ内の真／偽の要素間の考えられる遷移を示す。これらのビットは、設定された場合には示される依存の存在を伝え、設定されていない場合には依存が存在しないことを保証する。これらには以下のものがある。
ｋＴＦ−述語が真である反復から、述語の値が偽である次の反復へのループ伝搬依存を意味する。
ｋＦＦ−述語が偽である反復から、述語の値が偽である次の反復へのループ伝搬依存を意味する。
ｋＦＴ−述語が偽である反復から、述語の値が真である次の反復へのループ伝搬依存を意味する。
ｋＴＴ−述語が真である反復から、述語の値が真である次の反復へのループ伝搬依存を意味する。
【００６１】
依存先のデータを生成する反復に対応する要素位置は、そのデータに依存する反復に対応する要素位置の宛先ベクトルに記憶される。データ依存が存在しない場合、その要素の宛先ベクトルに０の値が記憶される。結果としての依存指標ベクトル、すなわちＤＩＶは、依存を表す要素位置指標のベクトルを含む。後述する理由により、ベクトルの最初の要素は要素番号１である（０ではない）。
【００６２】
一例として、上記の例１のループにおける依存について検討する。このループでは、条件節の真の反復と偽の反復の間の遷移が、並列化の中断を必要とするループ伝搬依存を表す。これは、以下の命令を使用して処理することができる。
［プログラムコード］
【００６３】
第４の反復によって必要なデータが生成され、第５の反復がこれに依存するので、出力ベクトルｐ２（ＤＩＶである）の位置５に４が記憶される。第６の反復からのデータに依存する第７の反復に対しても同じことが当てはまる。ＤＩＶの他の要素は、依存が存在しないことを示すために０に設定される。（なお、この例では、ベクトルの最初の要素が要素番号１である。）
【００６４】
ｄｅｓｔ＝ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ（Ｐｒｅｄ，ＤＩＶ）
ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓは、依存指標ベクトル、ＤＩＶを取り、ｐｒｅｄによって示される処理された前のグループを所与として、安全に並列に処理できる次の要素グループに対応する述語を生成する。ｐｒｅｄの要素がどれも非アクティブな場合、安全に並列に処理できる最初の要素グループに対して述語が生成される。Ｐｒｅｄが、ベクトルの最後の要素が処理されたことを示す場合、この命令は、要素を処理すべきでないことを示す非アクティブな述語の結果ベクトルを生成し、ＺＦフラグが設定される。結果の最後の要素がアクティブであることを示すためには、ＣＦフラグを設定する。第１の例の値を使用すると、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ（述語生成）は以下のように動作する。
［プログラムコード］
【００６５】
ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓは、全てがゼロである初期化された述語ｐ２から、次のベクトル計算を３つのサブベクトル（すなわち、ｐ’、ｐ’’、Ｐ’’’）に分割するｐ２の新たなインスタンスを生成する。これにより、ハードウェアは、ループのデータ依存に違反することを避けるグループ内のベクトルを処理できるようになる。
【００６６】
図４Ａは、例１のループのスカラ実行中における可変状態のシーケンスを示す図である。より具体的には、条件式の方向のランダム化した５０／５０の分散を使用して、例１のループの可変状態の進行を示す。図４Ｂは、例１のループのマクロスカラベクトル化プログラムコードの実行の進行を示す図である。図４Ａ及び図４Ｂには、左側の傾いたハッシュマークを使用してＡ［］から読み取った値を示し、右側の傾いたハッシュマークを使用してＢ［］に書き込まれた値を示し、網掛けの背景を使用して（所与の反復内でいずれが変化したかに依存する）「ｒ」又は「ｓ」の値を示している。「ｓ」が変化している間に「ｒ」が変化することはなく、逆もまた同様であることが観察される。
【００６７】
Ａ［］及びＢ［］の値の組は、いずれもループ伝搬依存チェーンに加わっていないので、全ての値がＡ［］から並列に読み取られること、又はＢ［］に並列に書き込まれることが防がれることはない。しかしながら、ｒ及びｓの計算では、条件式の値が同じ状態を保っている（すなわち、真又は偽が継続する）間しか要素を並列に処理することができない。このループのプログラムコードの実行パターンを図４Ｂに示す。なお、この例では、８つの要素長のベクトルを使用している。最初のベクトル命令を処理する際には、最初の反復が単独で行われる（すなわち、ベクトル実行ユニット２０４が最初のベクトル要素のみを処理する）のに対し、反復１〜５はベクトル実行ユニット２０４によって並列に処理され、その後反復６〜７がベクトル実行ユニット２０４によって並列に処理される。
【００６８】
図５Ａ及び図５Ｂは、プログラムコードのベクトル化の１つの実施形態を示す図である。図５Ａには、元々のソースコードを示し、図５Ｂには、マクロスカラアーキテクチャを使用して実行できる動作を表すベクトル化コードを示す。図５Ｂのベクトル化コードでは、Ｌｏｏｐ１が、ソースコードからのループであり、Ｌｏｏｐ２が、サブベクトル区分を処理するベクトル分割ループである。
【００６９】
この例では、アレイＡ［］を読み取って完全な長さのベクトルにおいて比較する（すなわち、Ｎ個の要素のベクトルでは、アレイＡ［］のＮ個の位置を同時に読み取る）。ベクトルｉ２は、ベクトルの分割を制御するＤＩＶである。分割は、観察すべきループ伝搬依存を示す偽と真の間の遷移を表す述語ｐ１をモニタすることにより決定される。述語ベクトルｐ２は、いずれかの時点でどの要素を作動すべきかを決定する。この特定のループでは、ｐ１が、あらゆるサブベクトル区分の全ての要素において同じ値を有し、従ってどの変数を更新すべきかを判断するには、区分の最初の要素のみをチェックすればよい。
【００７０】
変数「ｓ」が更新された後、ＰｒｏｐａｇａｔｅＰｏｓｔＴ命令は、アクティブな区分内の最終値をベクトル内の次の要素に伝播する。ループの最上部では、ＰｒｏｐａｇａｔｅＰｒｉｏｒＦ命令が、最終ベクトル位置からの「ｓ」の最後の値を次のパスのためにベクトルの全ての要素にわたってコピーする。なお、いくつかの事例におけるＰｒｏｐａｇａｔｅＰｒｉｏｒＦ命令の使用効率を示す変数「ｒ」は、異なる方法を使用して伝播される。
【００７１】
ソフトウェア推測
前回の例では、制御フローの決定がループ伝搬依存と無関係であったため、ベクトル分割ループの開始前にベクトル区分を決定することができた。しかしながら、これがいつもそうであるとは限らない。例２Ａ及び例２Ｂに示す以下の２つのループについて検討する。
【００７２】
例２Ａ：プログラムコードループ１
［プログラムコード］
【００７３】
例２Ｂ：プログラムコードループ２
［プログラムコード］
【００７４】
例２Ａでは、制御フローの決定がループ伝搬依存チェーンと無関係であるが、例２Ｂでは、制御フローの決定がループ伝搬依存チェーンの一部である。いくつかの実施形態では、例２Ｂのループにより、「Ｊ」の値が変化しないと推測することができ、この予測が誤っていることが分かった場合には後で補償することができる。このような実施形態では、「ｊ」の値に関する推測により、ループのベクトル化が大きく変化することはない。
【００７５】
いくつかの実施形態では、コンパイラを、ループの反復間のデータ依存を常に予測しないように構成することができる。このような実施形態では、実行時データ依存が存在する場合、並列に処理されるアクティブな要素のグループを減少させて、その時点で安全に並列に処理できる要素グループを表すことができる。これらの実施形態では、実際に失われる並列化がないので、実際に存在するよりも多くの並列化を誤予測したことに対するペナルティがほとんどない（すなわち、必要であれば、反復により同時に１つの要素を非並列的に処理することができる）。これらの実施形態では、その後の段階で実際の並列性の量が単純に認識される。
【００７６】
ｄｅｓｔ＝ＶｅｃｔｏｒＲｅａｄＩｎｔＦＦ（Ｂａｓｅ，Ｏｆｆｓｅｔ，ｐｆ）
ＶｅｃｔｏｒＲｅａｄＩｎｔＦＦは、ＶｅｃｔｏｒＲｅａｄＩｎｔの最初の失敗用の変種である。少なくとも最初のアクティブな要素が有効なアドレスである場合、この命令は失敗を生成しない。無効なアドレスに対応する結果はゼロに強制され、このデータを使用する後の命令に、述語をマスク処理するために使用できるフラグｐｆが戻される。アドレスの最初のアクティブな要素がマッピングされていない場合、この命令は、コンピュータシステム１００（図示せず）内の仮想メモリシステムに対応するページを読み込ませることに失敗し、これによりプロセッサ１０２が順方向の進行を継続することが保証される。
【００７７】
ｄｅｓｔ＝Ｒｅｍａｉｎｉｎｇ（Ｐｒｅｄ）
Ｒｅｍａｉｎｉｎｇ命令は、述語のベクトル、Ｐｒｅｄ、を評価し、ベクトル内の残りの要素を計算する。これは、最後のアクティブな述語に続く非アクティブな述語の組に対応する。Ｐｒｅｄ内にアクティブな要素が存在しない場合、全てのアクティブな述語のベクトルが戻される。同様に、Ｐｒｅｄが全てのアクティブな述語のベクトルである場合、非アクティブな述語のベクトルが戻される。例えば、
［プログラムコード］
【００７８】
図６Ａ及び図６Ｂは、ベクトル化プログラムコード例の実施形態を示す図である。より具体的には、図６Ａに示すコードサンプルは、（上述した）例２Ａのコードのベクトル化バージョンである。図６Ｂに示すコードサンプルは、例２Ｂのコードのベクトル化バージョンである。図６Ｂを参照すると、ベクトル分割ループの内部でＡ［］の読み取り及びその後の比較が移動している。従って、これらの動作は、「ｊ」の値が変化しないと仮定（推測）する。「ｊ」を使用した後にのみ、「ｊ」がどこで値を変更できるかを判断することができる。「ｊ」が更新された後、残りのベクトル要素は、ベクトル全体を通じて反復するために必要に応じて再計算される。推測的コードサンプル内でＲｅｍａｉｎｉｎｇ命令を使用することにより、プログラムは、ベクトル分割ループ内のどの要素が未処理のままであるかを特定した後で、実際に安全に処理される（すなわち、未解決のデータ依存を有していない）これらの要素のサブグループを決定できるようになる。
【００７９】
様々な実施形態では、耐失敗性読み取りサポートが提供される。従って、このような実施形態では、プロセッサ１０２が、後で計算において使用すべき値をロードしようとする試みにおいて、ベクトル命令の無効な要素（例えば、ＶｅｃｔｏｒＲｅａｄＦＦ）からのアドレスを使用して、メモリから推測的にデータを読み取ることができる。しかしながら、これらの値は、無効な読み取りが生じたことを発見すると最終的に廃棄され、従って正しいプログラム挙動には関連しない。このような読み取りは、存在しない又は保護されたメモリを参照できるので、これらの実施形態を、無効ではあるが関係のないデータがメモリから誤って読み取られた場合に通常の実行を継続するように構成することができる。（仮想メモリをサポートする実施形態では、この構成により、ページングを行う必要性が確実になるまでページングを行わないという追加の利点が得られる。）
【００８０】
図６Ａ及び図６Ｂに示すプログラムループでは、条件が真の場合の反復とその次の反復の間に、後の反復の述語値に関わらずループ伝搬依存が存在する。このことは、ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令のパラメータに反映される。
【００８１】
図６Ａ及び図６Ｂのサンプルプログラムコードでは、非推測的ベクトル分割と推測的ベクトル分割の違いが強調されている。より具体的には、例２Ａでは、メモリが読み取られ、ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ前に述語が計算される。分割ループは、ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令後に開始される。しかしながら、例２Ｂでは、ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令が分割ループの内部で実行され、早期の動作を無効にする依存を認識するように機能する。これらの両事例では、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ命令が、分割ループの残りに対してどの要素を使用するかを制御する述語を計算する。
【００８２】
メモリベースのループ伝搬依存
前回の例では、コンパイラが、コンパイル時にアドレスエイリアシングが存在しないことを立証することができた。しかしながら、このような決定を行うことは、困難又は不可能であることが多い。以下の例３に示すコードセグメントは、マクロスカラアーキテクチャの様々な実施形態において、メモリを通じて生じる（エイリアシングを含む可能性がある）ループ伝搬依存にどのように対処するかを示すものである。
【００８３】
例３：プログラムコードループ３
［プログラムコード］
【００８４】
例３のコードセグメントでは、Ａ［ｘ］がＡ［ｒ］又はＡ［ｓ］でエイリアシングされるかどうかをコンパイラが判断することはできない。しかしながら、マクロスカラアーキテクチャでは、コンパイラが、実行時にハードウェアにメモリハザードをチェックさせる命令を単純に挿入し、これに応じて実行時にベクトルを分割して、正しいプログラム挙動を確実にする。メモリハザードをチェックするこのような１つの命令に、以下で説明するＣｈｅｃｋＨａｚａｒｄＰ命令がある。
【００８５】
ｄｅｓｔ＝ＣｈｅｃｋＨａｚａｒｄＰ（ｆｉｒｓｔ、ｓｅｃｏｎｄ、ｐｒｅｄ）
ＣｈｅｃｋＨａｚａｒｄＰ命令は、メモリを通じた潜在的なデータ依存を求めて、２つのメモリ動作に対応するメモリアドレスの２つのベクトル（又は指標）を調べる。ベクトル「ｆｉｒｓｔ」は、第１のメモリ動作のアドレスを保持し、ベクトル「ｓｅｃｏｎｄ」は、第２の動作のアドレスを保持する。述語「ｐｒｅｄ」は、「ｓｅｃｏｎｄ」のいずれの要素に対して動作すべきかを指示又は制御する。スカラループ反復が時間的に順方向に進行するにつれ、ベクトル内の左から右に、連続的反復を表すベクトル要素が現れる。ＣｈｅｃｋＨａｚａｒｄＰ命令は、この文脈において評価を行うことができる。この命令は、対応する第１及び第２のメモリ動作の対の間のメモリハザードを表すＤＩＶを計算することができる。この命令は、読み取り後の書き込み、書き込み後の読み取り、及び書き込み後の書き込みのメモリハザードを正しく評価することができる。
【００８６】
上述したＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令と同様に、依存先のデータを生成する反復に対応する要素位置を、このデータに依存する反復に対応する要素位置の宛先ベクトルに記憶することができる。データ依存が存在しない場合、依存のない反復に対応する要素位置の宛先ベクトルにゼロを記憶することができる。例えば、
［プログラムコード］
【００８７】
上記で示したように、第１のベクトル（「ｆｉｒｓｔ」）の要素５及び第２のベクトル（「ｓｅｃｏｎｄ」）の要素３が、いずれもアレイインデックス６にアクセスする。従って、ＤＩＶの位置５に３が記憶される。同様に、ｆｉｒｓｔの要素６及びｓｅｃｏｎｄの要素２は、いずれもアレイインデックス位置７にアクセスし、ＤＩＶの位置６に２が記憶されるようになり、以下同様である。データ依存が存在しない場合、ＤＩＶにはゼロが記憶される。
【００８８】
いくつかの実施形態では、ＣｈｅｃｋＨａｚａｒｄＰ命令が、様々なサイズのデータタイプを考慮することができる。しかしながら、明確にするために、アレイインデックスタイプのみを使用して命令の関数を記述する。
【００８９】
上記の例のメモリアクセスは、３つのメモリハザードを有する。しかしながら、説明する実施形態では、関連するメモリ動作を安全に処理するために２つの区分しか必要としなくてよい。より具体的には、要素位置３における最初のハザードを処理することにより、これよりも小さな又はこれに等しい番号の要素位置における後続の依存が実際的に無意味なものとなる。例えば、
［プログラムコード］
【００９０】
以下、説明する実施形態で使用する、ベクトルをどこで分割すべきかを判断するためにＤＩＶを分析するための処理を疑似コードで示す。いくつかの実施形態では、プロセッサ１０２のベクトル実行ユニット２０４が、この計算を並列に行うことができる。例えば、
［プログラムコード］
【００９１】
ＤＩＶ［ｘ］＞０の場合の位置をｘとする間隔［ＳＴＡＲＴＰＯＳ，ｘ］にわたってベクトルを安全に並列に処理することができる。すなわち、ＳＴＡＲＴＰＯＳから位置ｘまで（ただしｘは含まない）を意味し、この場合ＳＴＡＲＴＰＯＳは、以前に処理された要素の組の後の最初のベクトル要素を示す。以前に処理された要素の組が空である場合、ＳＴＡＲＴＰＯＳはこの最初の要素から開始する。
【００９２】
いくつかの実施形態では、ＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令及び／又はＣｈｅｃｋＨａｚａｒｄＰ命令を使用して、コード内に複数のＤＩＶを生成することができる。しかし、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ命令は、単一のＤＩＶを使用してベクトルを分割する。この状況に対処するための方法には、（１）分割ループをネスト化できるようにする方法、又は（２）ＤＩＶを組み合わせて単一の分割ループ内で使用できるようにする方法の２つがある。いずれの方法も正しい結果をもたらすが、最適な方法は、問題のループの特性に依存する。より詳細には、コンパイラが入力パラメータ上のエイリアシングを単純に判断できない場合のような、複数のＤＩＶが依存を有していないと予想される場合、これらの実施形態は、複数のＤＩＶを１つに組み合わせて分割オーバヘッドを低減することができる。一方、多くのメモリハザードが実現されると予想される場合、これらの実施形態は、分割ループをネスト化することにより、（追加の並列性が存在する見込みを仮定して）考えられる最大の並列性を抽出する。
【００９３】
いくつかの実施形態では、以下に示すようなＶｅｃｔｏｒＭａｘ（Ａ，Ｂ）命令を使用してＤＩＶを組み合わせることができる。
［プログラムコード］
【００９４】
ＤＩＶの要素は、その要素の位置よりも小さな番号しか含まず、早い時期に依存を表すはずなので、後からの依存は、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ命令の観点から、小さな値を冗長にする分割をさらに制限するようにしか機能しない。従って、全てのＤＩＶの最大値を取ることにより、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ命令が、安全に並列に処理できる要素の組の交点を効果的に戻すようになる。
【００９５】
図７は、ベクトル化プログラムコード例の１つの実施形態を示す図である。より具体的には、図７に示すコードサンプルは、（上記で示した）例３のコードのベクトル化バージョンである。図７を参照すると、Ｃ［］又はＤ［］とＡ［］の間にエイリアシングは存在しないが、Ａ［］に対する動作は互いにエイリアシングされている可能性がある。コンパイラがＣ［］又はＤ［］からエイリアシングを排除できない場合、コンパイラは、追加のハザードチェックを生成することができる。この場合、エイリアシングの危険性はないので、アレイＣ［］及びＤ［］に対する読み取り動作はベクトル分割ループの外部に位置付けられているのに対し、Ａ［］に対する動作は分割ループ内に留まる。実際にはＡ［］にエイリアシングが存在しない場合、この区分は完全なベクトルサイズを保持し、分割ループは反復することなく単に実現しない。しかしながら、エイリアシングが実際に生じている反復では、分割ループがベクトルを分割してデータ依存を尊重し、これにより正しい動作が保証される。
【００９６】
図７のコードセグメントに示す実施形態では、アドレスのベクトル全体にわたってハザードチェックが行われる。しかしながら、一般的には、条件的に実行されたメモリ動作間のハザードをチェックする必要がある場合が多い。ＣｈｅｃｋＨａｚａｒｄＰ命令は、第２のメモリ動作のどの要素がアクティブであるかを示す述語を取る。第１の動作の要素が全て非アクティブな場合、ＣｈｅｃｋＨａｚａｒｄＰ命令自体を、アクティブな第１のオペランドの要素に対応するゼロ化述語で叙述することができる。（なお、これにより、第１のメモリ動作が叙述された場合の正しい結果が得られる。）
【００９７】
以下の例４におけるコードセグメントに、アレイＥ［］上にメモリハザードを有するループを示す。このコードセグメントは、アレイ内の予測できない場所に対して条件的に読み取り及び書き込みを行う。図８は、ベクトル化プログラムコード例の１つの実施形態を示す図である。より具体的には、図８に示すコードサンプルは、（上記で示した）例４のコードのベクトル化マクロスカラバージョンである。
【００９８】
例４：プログラムコードループ４
［プログラムコード］
【００９９】
図８を参照すると、このベクトル化ループは、アレイＥ［］に対して読み取りを行うべきか、それとも書き込みを行うべきかをそれぞれ示す述語ｐ１及びｐ２を含む。ＣｈｅｃｋＨａｚａｒｄＰ命令は、メモリハザードを求めてアドレスのベクトル（ｈ及びｉ）をチェックする。ＣｈｅｃｋＨａｚａｒｄＰには、第２のメモリ動作（書き込み）を制御する述語としてパラメータｐ２が渡される。従って、ＣｈｅｃｋＨａｚａｒｄＰは、条件無し読み取りと、ｐ２に叙述される条件付き書き込みとの間の（単複の）メモリハザードを識別する。ＣｈｅｃｋＨａｚａｒｄＰの結果は、ｐ１にゼロ叙述される。これにより、Ｅ［］から読み取りを行うべきでない要素位置のＤＩＶ（ｉｘ）にゼロが配置される。ゼロがハザードの不在を示すことを思い出されたい。従って、ｉｘに記憶された結果は、ｐ１に叙述される条件付き読み取りとｐ２に叙述される条件付書き込みとの間のハザードを表すＤＩＶである。これが可能になるのは、ＤＩＶ内に非ハザード状態がゼロで表されるからである。
【０１００】
なお、上記の実施形態では、メモリベースのハザードをチェックするために、ＣｈｅｃｋＨａｚａｒｄＰ命令を使用した。上述したように、ＣｈｅｃｋＨａｚａｒｄＰ命令は、第２のベクトルのどの要素に対して動作を行うかを制御するパラメータとしての述語を取る。しかしながら、他の実施形態では、他のタイプのＣｈｅｃｋＨａｚａｒｄ命令を使用することができる。例えば、以下の様々な例で使用するように、特定の所望のコード実装に依存して、述語パラメータを省いたＣｈｅｃｋＨａｚａｒｄ命令を使用することができる。１つの実施形態では、このバージョンのＣｈｅｃｋＨａｚａｒｄＰ命令が、２つの入力ベクトルに対して無条件で単純に動作することができる。どのバージョンのＣｈｅｃｋＨａｚａｒｄ命令を使用するかに関わらず、結果の叙述及び／又はゼロ化をサポートするあらゆるマクロスカラ命令と同様に、ＣｈｅｃｋＨａｚａｒｄ命令を実行することにより結果ベクトルの所与の要素が修正されるか否かは、上述したような述語ベクトル又はゼロ化ベクトルの使用を通じて個別に制御することができる。すなわち、ＣｈｅｃｋＨａｚａｒｄＰ命令の述語パラメータは、上述した一般的な述語／ゼロ化ベクトルとは異なる命令実行の態様を制御する。
【０１０１】
述語生成命令後の最初の後方分岐の検出
上述したように、コードセグメントをベクトル化する際には、例えばメモリハザードなどの考えられるループ伝搬依存を正しく処理するために、ベクトル化を行うプログラムコード内にベクトル分割ループを使用することができる。このようなプログラムコードでは、例えば（上述した）ＣｈｅｃｋＨａｚａｒｄ命令などのマクロスカラ命令によって、ＤＩＶを生成することができ、これをベクトル分割ループの一部であるマクロスカラのＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅｓ（述語生成）命令によって後で使用することができる。また、ベクトル分割ループは、ループの一部として後方分岐を使用する。上述したように、この後方分岐が正確に予測される場合、処理性能を維持することができる。しかしながら、この分岐が正確に予測されない場合（多くの場合にそうである）、性能が低下することがある。従って、場合によっては、分岐の予測を抑制してＤＩＶが利用可能になるまで待つことが有益となり得る。すなわち、いくつかの例では、ＤＩＶが利用可能になるまで実行を効果的に停止するペナルティを、ベクトル分割ループの境界を形成する分岐を誤予測するペナルティよりも低くすることができる。
【０１０２】
本明細書で説明する技術から恩恵を受けることができるベクトル分割ループの特定の例として、Ｂ［］における項目を表すヒストグラムＡ［］を生成するコードセグメントの例を以下の例５に示す。
【０１０３】
例５
［プログラムコード］
【０１０４】
コンパイラは、例５のコードセグメントをベクトル化する際に、Ｂ［］のベクトル内のいずれかの要素が同じ値を含むかどうかを認識しなければならない。これが行われない場合、このコードは、Ａ［］のいずれの要素が修正されるかを認識せず、同じベクトル内のＡ［］を後で修正することに影響が及ぶ。例５のコードセグメント内のあらゆるループ伝搬依存を処理するベクトル分割ループを含むマクロスカラコードセグメントを例６に示す。
【０１０５】
例６
［プログラムコード］
【０１０６】
例６のコードセグメントでは、ＣｈｅｃｋＨａｚａｒｄ命令が、メモリハザードを検出するためにメモリアドレスを評価し（Ｖ２に記憶されたＤＩＶを生成し）、ＧｅｎｅｒａｔｅｓＰｒｅｄｉｃａｔｅｓ命令が、この情報を使用して、安全に並列に処理できる要素の数を制御する述語を計算する。ベクトル全体を安全に並列に処理できない場合、ベクトル全体が処理されるまでベクトル分割ループ（ＰａｒｔＬｏｏｐ）が反復する（これは、Ｃａｒｒｙ−ｆｌａｇが設定されることなどのプロセッサフラグの１つにより指定される）。
【０１０７】
たとえループ内に実際にメモリハザードが存在しない場合でも、コンパイラは、コンパイル時にこれを確実に判断できないことが多い。従って、たとえコンパイラがベクトル分割ループを発するように強制されていたとしても、多くの場合、実行時にベクトル全体が並列に処理される。この場合、従来の分岐予測器は効率的に動作してループが決して反復しないと予測することができ、十分な性能が維持される。
【０１０８】
しかしながら、ベクトルが頻繁に分割される場合、従来の分岐予測器では予測が不完全であることが多く、性能に悪影響を与える。これにより、ベクトル分割ループの性質に起因して害が及ぶことがある。通常、ベクトル分割ループは、互いに直列的に依存する命令チェーンを含む。従って、分岐予測が完璧であった場合でも、このコード部分の性能は、シリアルコードによって制限されることがある。上述したように、不完全な分岐予測には性能ペナルティがあり、ループの性質に起因して、正確な予測には上限がある。さらに、分割ループが実際に複数回反復する場合でも、限られた回数しか反復しない（通常はごくわずかな反復）。この結果、これらの場合に高い誤予測率が生じる可能性があり、電力及び性能の両方に悪影響を与える。従って、ベクトル分割ループの分岐予測精度は、非常に重要となり得る。従って、以下でさらに説明するように、述語生成命令後の最初の後方フロー制御命令を検出した時点で、受け取った予測精度の指示に依存して、ＤＩＶが利用可能になるまでこのフロー制御命令の予測を抑制することができる。
【０１０９】
図９は、ベクトル分割ループを形成するプログラム命令の実行中における図２のプロセッサの１つの実施形態の動作を示すフロー図である。図２〜図９をまとめて参照し、図９のブロック９０１から開始すると、分岐予測ユニット２１０が、述語生成命令後の最初の条件付き後方分岐命令を検出する。より具体的には、１つの実施形態では、この条件付き後方分岐命令を、分岐命令よりも上位にある宛先アドレスに（例えば、ベクトル分割ループの開始点に）分岐し、条件付き命令文が真と評価した時に分岐する条件付き分岐命令とすることができる。例６に示す実施形態では、条件付き命令文が、キャリークリア条件コードに依存する。また、述語生成命令は、上述したようにＤＩＶなどの依存ベクトルに依存する述語ベクトルを生成できるマクロスカラのＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅ命令とすることができる。１つの実施構成では、ＧｅｎｅｒａｔｅＰｒｅｄｉｃａｔｅ命令後に検出された後方分岐命令を、いずれも上記で詳細に説明したマクロスカラのＣｈｅｃｋＨａｚａｒｄ命令又はマクロスカラのＣｏｎｄｉｔｉｏｎａｌＳｔｏｐ命令により設定された条件コードに基づく分岐命令とすることができる。なお、例６ではマクロスカラのＣｈｅｃｋＨａｚａｒｄ命令を使用しているが、代わりに、例えば叙述されたＣｈｅｃｋＨａｚａｒｄＰ命令などの他のバージョンのマクロスカラのＣｈｅｃｋＨａｚａｒｄ命令を使用してもよい。
【０１１０】
上述したように、分岐予測ユニット２１０は、様々な分岐予測に関する予測精度情報を生成して維持することができる。従って、この分岐予測ユニット２１０を、後方分岐命令の予測精度の指示を生成し、及び／又は受け取るように構成することができる（ブロック９０３）。１つの実施構成では、この精度指示を、精度を示す精度値とすることができ、他の実施構成では、この精度指示を、予測精度が所定の精度閾値を満たすかどうかを示すバイナリ信号とすることができる。
【０１１１】
様々な実施形態では、予測の抑制を目的として所与の分岐が正確に予測されているかどうかを判断する閾値を、非明示的な又はハードコーディングされた値、ファームウェア又は処理のテストモード動作を通じて修正できる値、又はソフトウェアにより自由に修正できる値とすることができる。閾値は、様々に固定することもでき、或いは実行時挙動の結果として動的に変化することもできる。いくつかの実施形態では、例えば分岐予測ユニット２１０が維持する分岐履歴テーブル内の所与の分岐に関連する統計値の一部として、異なる分岐のインスタンスのために異なる閾値を別個に維持することができる。或いは、分岐予測ユニット２１０は、異なる分岐のための閾値を明示的に記憶する代わりに、上述したように所与の分岐が正確に予測されているかどうかについてのバイナリ表示を単純に記憶することもできる。
【０１１２】
１つの実施形態では、後方分岐命令の予測精度が所定の閾値を満たさないと判断したことに応答して、分岐予測ユニット２１０を、ＤＩＶが利用可能になるまで予測を抑制するように構成することができる（ブロック９０５）。より具体的には、ＤＩＶ情報は、ループの正確な反復回数を示すので、１つの実施形態では、分岐予測ユニット２１０を、ＤＩＶ情報を使用してあらゆる将来的な分岐を予測するように構成することができる。例えば、ＤＩＶは、あるベクトルがループを３回通過する必要があることを示すことができる。ＤＩＶからループ反復回数を確実に知ることができるので、分岐予測ユニット２１０は、この情報を使用して、後方分岐を誤予測するのを避けることができる。
【０１１３】
１つの実施構成では、分岐予測ユニット２１０が、ＤＩＶを待っている間にパイプラインをストールさせておき、これによりあらゆる追加命令がフェッチされるのを防ぐことができる。別の実施構成では、分岐予測ユニット２１０が、ＤＩＶが利用できるようになるのを待っている間にプロセッサ１０２が文脈を切り換えるようにすることができる。別の実施形態では、ＤＩＶ情報が利用可能になった時に、分岐予測ユニット２１０が、フェッチユニット２０１にループフェッチ通知を送信することができる。フェッチユニット２０１は、この指示に応答して、ＤＩＶ情報を使用してベクトル分割ループの各反復のための命令をロードすることができる。
【０１１４】
なお、ＤＩＶが利用可能になるのを待つことは、分岐を制御する条件コードが利用可能になるのを待つことと同じ命令によって生成されるので、これらはいずれも実質的に同等のものとすることができる。これにより、プロセッサ１０２のフェッチユニット２０１は、たとえＤＩＶを分析し、これに応じて分岐予測ユニット２１０を構成するために複数のサイクルを必要とし得る場合でも、条件コードに基づいて直ちにフェッチを再開できるようになる。これにより、ＤＩＶを待つためにパイプラインがストールされた場合に、パイプラインのストール状態を最低限に抑えることができる。また、１つの実施形態では、たとえ分岐が抑制されＤＩＶ情報が使用されたとしても、この分岐に関して分岐予測の精度を追跡し続けることができる。これにより、分岐予測ユニット２１０は、予測の精度がいつ閾値を満たしたかを検出し、その動作モードを、ＤＩＶが利用可能になるのを待つのではなく分岐を予測するように変更できるようになる。すなわち、精度を改善すべき場合、不十分な精度に基づいて所与の分岐の予測を抑制するという決定を後で元に戻すことができる。
【０１１５】
以上、実施形態についてかなり詳細に説明したが、上記の開示を完全に理解すれば、当業者には数多くの変形例及び修正例が明らかになるであろう。以下の特許請求の範囲は、全てのこのような変形例及び修正例を含むと解釈すべきである。さらに、以下の特許請求の範囲に一致するものは、あらゆる好適な組み合わせで実施することができ、本明細書では、特にこのような組み合わせを明示的に開示するように意図している。
【０１１６】
プロセッサ装置は、以下に列挙する方法クレームのステップのいずれかを含む、本明細書で説明した方法ステップ、動作又は機能のいずれかをあらゆる好適な組み合わせで実行するためのあらゆる好適な手段を利用することができる。従って、例えば、プロセッサの構造的要素が、本明細書で説明した例示的な構造的要素と異なる場合でも、本明細書で説明したステップ、動作又は機能を実行するプロセッサ装置は本開示の範囲に含まれると見なされる。
【図１】
2013254484.tif 000003
【図２】
2013254484.tif 000004
【図３】
2013254484.tif 000005
【図４Ａ】
2013254484.tif 000006
【図４Ｂ】
2013254484.tif 000007
【図５Ａ】
2013254484.tif 000008
【図５Ｂ】
2013254484.tif 000009
【図６Ａ】
2013254484.tif 000010
【図６Ｂ】
2013254484.tif 000011
【図７】
2013254484.tif 000012
【図８】
2013254484.tif 000013
【図９】
2013254484.tif 000014
【外国語明細書】
2013254484.tif 000015
2013254484.tif 000016
2013254484.tif 000017
2013254484.tif 000018
2013254484.tif 000019
2013254484.tif 000020
2013254484.tif 000021
2013254484.tif 000022
2013254484.tif 000023
2013254484.tif 000024
2013254484.tif 000025
2013254484.tif 000026
2013254484.tif 000027
2013254484.tif 000028
2013254484.tif 000029
2013254484.tif 000030
2013254484.tif 000031
2013254484.tif 000032
2013254484.tif 000033
2013254484.tif 000034
2013254484.tif 000035
2013254484.tif 000036
2013254484.tif 000037
2013254484.tif 000038
2013254484.tif 000039
2013254484.tif 000040
2013254484.tif 000041
2013254484.tif 000042
2013254484.tif 000043
2013254484.tif 000044
2013254484.tif 000045
2013254484.tif 000046
2013254484.tif 000047
2013254484.tif 000048
2013254484.tif 000049
2013254484.tif 000050
2013254484.tif 000051
2013254484.tif 000052
2013254484.tif 000053
2013254484.tif 000054
2013254484.tif 000055
2013254484.tif 000056
2013254484.tif 000057
2013254484.tif 000058
2013254484.tif 000059
2013254484.tif 000060
2013254484.tif 000061
2013254484.tif 000062
2013254484.tif 000063
2013254484.tif 000064
2013254484.tif 000065