JP2013254484A - ベクトル分割ループの性能の向上 - Google Patents

ベクトル分割ループの性能の向上 Download PDF

Info

Publication number
JP2013254484A
JP2013254484A JP2013087861A JP2013087861A JP2013254484A JP 2013254484 A JP2013254484 A JP 2013254484A JP 2013087861 A JP2013087861 A JP 2013087861A JP 2013087861 A JP2013087861 A JP 2013087861A JP 2013254484 A JP2013254484 A JP 2013254484A
Authority
JP
Japan
Prior art keywords
instruction
vector
prediction
conditional branch
branch instruction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2013087861A
Other languages
English (en)
Other versions
JP2013254484A5 (ja
Inventor
E Gonion Jeffry
イー ゴニオン ジェフリー
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Apple Inc
Original Assignee
Apple Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Apple Inc filed Critical Apple Inc
Publication of JP2013254484A publication Critical patent/JP2013254484A/ja
Publication of JP2013254484A5 publication Critical patent/JP2013254484A5/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30072Arrangements for executing specific machine instructions to perform conditional operations, e.g. using predicates or guards
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30058Conditional branch instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3838Dependency mechanisms, e.g. register scoreboarding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3848Speculative instruction execution using hybrid branch prediction, e.g. selection between prediction techniques

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Executing Machine-Instructions (AREA)
  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)
  • Complex Calculations (AREA)

Abstract

【課題】述語生成命令の後に生じる最初の後方分岐命令を検出する方法を提供する。
【解決手段】ベクトル分割ループで使用される後方分岐命令の予測を抑制する方法が、述語生成命令後に生じる最初の後方分岐命令を検出するステップを含む。述語生成命令は、依存ベクトルに依存する述語ベクトルを生成し、依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す。この方法は、後方分岐命令の予測の予測精度の指示を受け取るステップも含む。予測精度が閾値を満たさない場合、述語生成命令が依存する依存ベクトルが利用可能になるまで後方分岐命令の予測が抑制される。
【選択図】図9

Description

本開示は、プロセッサに関し、より具体的には、ベクトル分割ループの実行中におけるいくつかの分岐命令の予測に関する。
最新のプロセッサでは、分岐予測が一般的になってきた。多くの場合、後方分岐は十分に予測可能であるが、これらの中には、従来の分岐予測器によってうまく予測できないものもある。より詳細には、マクロスカラプロセッサ及びコンパイラは、例えばメモリハザードなどの生じ得るループ伝搬依存に正しく対処するためにベクトル分割ループに依拠する。ベクトル分割ループは、後方分岐を使用してループ上で反復する。ベクトルが頻繁に分割されている場合、従来の分岐予測器はうまく機能できず、プロセッサ性能に悪影響を与えることがある。
ベクトル分割ループで使用される後方分岐命令の予測を抑制する方法の様々な実施形態を開示する。大まかに言えば、述語生成命令の後に生じる最初の後方分岐命令を検出する方法を企図する。述語生成命令は、依存ベクトルに依存する述語ベクトルを生成し、依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す。受け取った後方分岐命令の予測の予測精度の指示が閾値を満たさない場合、述語生成命令が依存する依存ベクトルが利用可能になるまで、この後方分岐命令の予測を抑制することができる。
1つの実施形態では、この方法が、述語生成命令後の最初の条件付き分岐命令を検出するステップを含む。述語生成命令は、実行時に、依存ベクトルに依存する述語ベクトルを生成する。依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す指標を含む。また、この方法は、この最初の条件付き分岐命令の予測精度の指示を受け取るステップを含むこともできる。最初の条件付き分岐命令の予測精度が閾値を満たしていないと判定したことに応答して、述語生成命令が依存する依存ベクトルが利用可能になるまで、この最初の条件付き分岐命令の予測を抑制することができる。
1つの特定の実装では、この方法が、依存ベクトル内に示されるデータ依存情報を使用して依存ベクトルが利用可能であることを検出したことに応答して、最初の条件付き分岐命令を予測するステップを含むこともできる。
コンピュータシステムの1つの実施形態のブロック図である。 図1に示すプロセッサの実施形態のさらなる詳細を示すブロック図である。 プログラムコードループの並列化例を示す図である。 例1に示すループのスカラ実行中の可変状態のシーケンスを示す図である。 例1のループのマクロスカラベクトル化プログラムコードの実行の進行を示す図である。 プログラムソースコードのベクトル化の1つの実施形態を示す図である。 プログラムソースコードのベクトル化の1つの実施形態を示す図である。 非推測的ベクトル化プログラムコードの1つの実施形態を示す図である。 推測的ベクトル化プログラムコードの別の実施形態を示す図である。 ベクトル化プログラムコードの1つの実施形態を示す図である。 ベクトル化プログラムコードの別の実施形態を示す図である。 ベクトル分割ループを形成するプログラム命令の実行中における図2のプロセッサの1つの実施形態の動作を示すフロー図である。
図面には、特定の実施形態を一例として示し、本明細書ではこれについて詳細に説明する。しかしながら、特定の特徴に関して単一の実施形態しか記載していない場合でも、図面及び詳細な説明は、開示する特定の実施形態に特許請求の範囲を限定するものではないと理解されたい。それどころか、本開示を利用できる当業者に明らかになる全ての修正物、同等物及び代替物を含むことが意図される。特に明記しない限り、本開示において提供する特徴の例は、限定的なものではなく例示的なものであることが意図される。
本出願を通じて使用する「may(〜できる)」という用語は、強制的な意味の(すなわち、〜しなければならない(must)を意味する)ものではなく、許容的な意味(すなわち、可能性を有すること(having the potential to)を意味する)で使用される。同様に、「含む(include、including、及びincludes)」という用語は、限定するわけではないがincludingを意味する。
様々なユニット、回路、又はその他の構成要素について、(1又は複数の)タスクを実行する「ように構成される(configured to)」と記載することがある。このような文脈では、「ように構成される」という表現は、動作中に1又は複数のタスクを実行する「回路を有する」ことを一般に意味する包括的な構造の記述である。従って、これらのユニット/回路/構成要素は、ユニット/回路/構成要素が現在オンでない場合でもタスクを実行するように構成することができる。通常、「ように構成される」に相当する構造を成す回路は、ハードウェア回路を含むことができる。同様に、説明の都合上、様々なユニット/回路/構成要素について、1又は複数のタスクを実行する、と記載することもある。このような記載は、「ように構成される」という表現を含むと解釈すべきである。1又はそれ以上のタスクを実行するように構成されたユニット/回路/構成要素について記述することは、このユニット/回路/構成要素に対して米国特許法第112条第6項の解釈を行使することを明確に意図するものではない。
本開示の範囲は、本明細書で取り扱う課題の一部又は全部を軽減するかどうかに関わらず、本明細書で(明示的に又は非明示的に)開示するあらゆる特徴又は特徴の組み合わせ、又はこれらのあらゆる一般化を含む。従って、本出願(又はその優先権を主張する出願)の審査中に、あらゆるこのような特徴の組み合わせに対して新たな請求項が立案されることがある。具体的には、添付の特許請求の範囲に関して、従属請求項からの特徴を独立請求項の特徴と組み合わせることができ、それぞれの独立請求項からの特徴を、添付の特許請求の範囲に列挙する特定の組み合わせのみならずあらゆる適切な方法で組み合わせることができる。
コンピュータシステムの概要
ここで図1を参照すると、コンピュータシステムの1つの実施形態のブロック図を示している。コンピュータシステム100は、プロセッサ102、レベル2(L2)キャッシュ106、メモリ108、及び大容量記憶装置110を含む。図示のように、プロセッサ102は、レベル1(L1)キャッシュ104を含む。なお、コンピュータシステム100内には特定の構成要素を図示し、これらについて説明するが、代替の実施形態では、コンピュータシステム100内に異なる構成要素及び多くの構成要素が存在することができる。例えば、コンピュータシステム100は、メモリ階層の一部(メモリ108及び/又は大容量記憶装置110など)を含まなくてもよい。或いは、L2キャッシュ106をプロセッサ102の外部に示しているが、他の実施形態では、L2キャッシュ106がプロセッサ102の内部に存在できることが企図される。さらに、このような実施形態では、レベル3(L3)キャッシュ(図示せず)を使用することもできる。また、コンピュータシステム100は、グラフィックプロセッサ、ビデオカード、ビデオ取り込み装置、ユーザインターフェイス装置、ネットワークカード、光学ドライブ、及び/又は、バス、ネットワーク、又は別の好適な通信チャネルを使用してプロセッサ102に結合されたその他の周辺装置(全て単純化のために図示せず)を含むこともできる。
様々な実施形態では、プロセッサ102が、計算動作を実行する汎用プロセッサを表すことができる。例えば、プロセッサ102は、マイクロプロセッサ、マイクロコントローラ、特定用途向け集積回路(ASIC)又はフィールドプログラマブルゲートアレイ(FPGA)などの中央処理装置(CPU)とすることができる。しかしながら、以下でさらに説明するように、プロセッサ102は、1又はそれ以上のベクトル処理機構(例えば、ベクトル実行ユニット)を含むことができる。プロセッサ102の例示的なベクトル実行ユニットについては、以下で図2の説明に関連してさらに詳細に説明する。
大容量記憶装置110、メモリ108、L2キャッシュ10及びL1キャッシュ104は、プロセッサ102のためのデータ及び命令を記憶するメモリ階層を集合的に形成する記憶装置である。より具体的には、大容量記憶装置110は、アクセス時間の長いディスクドライブ又は大型フラッシュメモリユニットなどの大容量不揮発性メモリとすることができ、L1キャッシュ104、L2キャッシュ106及びメモリ108は、アクセス時間の短い小型のものとすることができる。これらの高速半導体メモリは、頻繁に使用されるデータのコピーを記憶する。メモリ108は、動的ランダムアクセスメモリ(DRAM)系メモリ装置の中のメモリ装置を表すことができる。通常、メモリ108のサイズは、L1キャッシュ104及びL2キャッシュ106よりも大きいが、通常、L1キャッシュ104及びL2キャッシュ106は、静的ランダムアクセスメモリ(SRAM)系装置の中の小型装置を使用して実装される。いくつかの実施形態では、L2キャッシュ106、メモリ108及び大容量記憶装置110が、コンピュータシステム100内の1又はそれ以上のプロセッサ間で共有される。
いくつかの実施形態では、メモリ階層内の装置(すなわち、L1キャッシュ104など)が、サイクル毎に複数のキャッシュラインにアクセスする(すなわち、読み取り及び/又は書き込みを行う)ことができる。これらの実施形態は、不連続なメモリアドレスへのポインタ又は配列インデックスのベクトルに基づいて行われるメモリアクセスの処理をより効率的にすることができる。
なお、以下で説明するデータ構造及びプログラム命令(すなわち、コード)は、コンピュータシステム(コンピュータシステム100など)が使用するコード及び/又はデータを記憶できるあらゆる装置又は記憶媒体とすることができる非一時的コンピュータ可読記憶装置に記憶することができる。一般的に言えば、非一時的コンピュータ可読記憶装置は、以下に限定されるわけではないが、揮発性メモリ、不揮発性メモリ、ディスクドライブなどの磁気及び光学記憶装置、磁気テープ、コンパクトディスク(CD)、デジタル多機能ディスク又はデジタルビデオディスク(DVD)、或いは現在知られている又は後に開発されるコンピュータ可読媒体を記憶できるその他の媒体を含む。従って、大容量記憶装置110、メモリ108、L2キャッシュ10及びL1キャッシュ104は、全て非一時的コンピュータ可読記憶装置の例である。
プロセッサ
図2を参照すると、図1のプロセッサの実施形態のさらなる詳細を示すブロック図を示している。図2に示す実施形態では、プロセッサ102が、複数のパイプラインステージを含むことができるが、簡潔にするために、図2には全てを示しているわけではない。従って、図示のように、プロセッサ102は、L1キャッシュ104、命令フェッチユニット201、分岐予測ユニット210、誤予測ユニット212、整数実行ユニット202、浮動小数点実行ユニット206、及びベクトル実行ユニット204を含む。なお、整数実行ユニット202、浮動小数点実行ユニット206及びベクトル実行ユニット204は、グループとして「実行ユニット」と同義であると見なすことができる。
様々な実施形態では、この実行ユニットが、例えば関連タイプのオペランドに関する論理演算、数学演算、又はビット演算などの計算動作を行うことができる。より詳細には、整数実行ユニット202は、整数オペランドに関する計算動作を実行することができ、浮動小数点実行ユニット206は、浮動小数点オペランドを含む計算動作を実行することができ、ベクトル実行ユニット204は、ベクトルオペランドを含む計算動作を実行することができる。整数実行ユニット及び浮動小数点実行ユニットは当業で一般的に知られており、簡潔にするために詳細には説明しない。上述したように、図2に示すプロセッサ102の実施形態は、特定の構成要素の組を含むが、代替の実施形態では、プロセッサ102が、実行ユニットに結合できる命令復号ユニット、スケジューラ又はリザベーションステーション、並べ替えバッファ、メモリ管理ユニット、I/Oインターフェイスなどの、異なる数又はタイプの実行ユニット、機能ユニット及びパイプラインステージを含むことができる。
ベクトル実行ユニット204は、複数のデータ要素に対して同じ動作を並列に実行できるという点で、古典的な意味の単一命令複数データ(SIMD)実行ユニットを表すことができる。しかしながら、いくつかの実施形態では、ここで説明するベクトル命令が、他のSIMD命令の実装と異なる場合もある。例えば、ある実施形態では、ベクトル命令によって動作を受けるベクトル要素が、ベクトル内の要素数によって変化しないサイズを有することができる。対照的に、SIMDの実装には、動作を受けるデータ要素の数によってデータ要素のサイズが変化するものもある(例えば、SIMDアーキテクチャは、8つの8ビット要素に対する動作をサポートすることができるが、4つのみの16ビット要素、2つのみの32ビット要素などに対する動作をサポートすることもある)。1つの実施形態では、ベクトル実行ユニット204が、オペランドのベクトルに含まれるデータ要素の一部又は全部に対して動作することができる。より具体的には、ベクトル実行ユニット204を、ベクトルプログラム命令のベクトルオペランドの異なる要素に対して同時に動作するように構成することができる。
1つの実施形態では、ベクトル実行ユニット204が、ベクトルレジスタファイル(図示せず)を含むことができ、このベクトルレジスタファイルは、ベクトル実行ユニット204に対してオペランドベクトル及び結果ベクトルを保持できるベクトルレジスタを含むことができる。いくつかの実施形態では、ベクトルレジスタファイル内に32個のベクトルレジスタが存在することができ、各ベクトルレジスタは、128ビットを含むことができる。しかしながら、代替の実施形態では、異なる数のベクトルレジスタが存在することができ、及び/又はレジスタ当たりに異なる数のビットが存在することができる。
ベクトル実行ユニット204は、ベクトルレジスタからオペランドを検索し、ベクトル実行ユニット204がオペランドベクトル内のデータ要素の一部又は全部に対して並列に動作を実行するようにするベクトル命令を実行するように構成することができる。例えば、ベクトル実行ユニット204は、ベクトル内の要素に対して論理演算、数学演算又はビット演算を実行することができる。ベクトル実行ユニット204は、命令サイクル毎に1つのベクトル動作を行うことができる(ただし、上述したように、「サイクル」は、ベクトル実行ユニット204の計算動作をトリガし、同期させ、及び/又は制御するために使用できる複数のクロックサイクルを含むことができる)。
1つの実施形態では、ベクトル実行ユニット204が、あらゆる正の整数をNとすることができるN個のデータ要素(例えば、バイト、ワード、ダブルワードなど)を保持するベクトルをサポートすることができる。これらの実施形態では、ベクトル実行ユニット204が、オペランドベクトル内のN個の又はそれ未満のデータ要素に対して並列に動作を行うことができる。例えば、ベクトルが256ビット長の実施形態では、動作されるデータ要素が4バイト要素であり、この動作はデータ要素に値を追加することであり、これらの実施形態では、ベクトル内のあらゆる数の要素に値を追加することができる。なお、プロセッサ102の異なる実装では、Nが異なる場合もある。
様々な実施形態では、ベクトル実行ユニット204が、ベクトル実行ユニット204が動作を行うオペランドベクトル内のデータ要素の動的制限を可能にする少なくとも1つの制御信号を含むことができる。詳細には、ベクトル実行ユニット204は、この制御信号の状態に応じて、ベクトル内のデータ要素の一部又は全部に対して選択的に動作することができる。例えば、ベクトルが512ビット長であり、動作されるデータ要素が4バイト要素である実施形態では、オペランドベクトル内の16個のデータ要素の一部又は全部に対して動作が行われないように制御信号をアサートすることができる。なお、動作が行われるオペランドベクトル内のデータ要素を「動的に」制限することは、実行時に各サイクルに対して別個に制御信号をアサートすることを含むことができる。
いくつかの実施形態では、以下で詳細に説明するように、ベクトル実行ユニット204が、述語又は1又はそれ以上のスカラ述語のベクトルに含まれる値に基づいて、選択されたベクトルデータ要素に対してのみベクトル動作を適用する。いくつかの実施形態では、結果ベクトル内の残りのデータ要素が、影響を受けないままであり(「叙述」と呼ぶこともできる)、又はゼロに強制される(「ゼロ化」又は「ゼロ化叙述」と呼ぶこともできる)。いくつかの実施形態では、ベクトル実行ユニット204における叙述又はゼロ化に起因して使用されてない、データ要素処理サブシステムのためのクロック(「レーン」)を、パワーゲート制御及び/又はクロックゲート制御し、これによりベクトル実行ユニット204内の動的電力消費量を削減することができる。
様々な実施形態では、アーキテクチャを、実行時に並列性に適合できるようにベクトル長非依存型とすることができる。より具体的には、命令又は動作がベクトル長非依存型である場合、サポートハードウェアによって課せられる制限次第で、あらゆる長さのベクトルを使用して動作(すなわち命令など)を実行することができる。例えば、ベクトル実行ハードウェアが、8つの別個の4バイト要素を含むことができる(従って、8要素のベクトル長を有する)ベクトルをサポートする実施形態では、ベクトル長非依存型動作が、ベクトル内の8つの要素のうちのあらゆる数に対して動作することができる。(4つの要素などの)異なるベクトル長をサポートする異なるハードウェア実装では、ベクトル長非依存型動作が、基礎となるハードウェアによって利用可能にされた異なる数の要素に対して動作することができる。従って、コンパイラ又はプログラマは、基礎となるハードウェア(ベクトル実行ユニット204など)によってサポートされるベクトル長を明確に知っている必要はない。このような実施形態では、コンパイラが、特定のベクトル長に依拠する(又はこれを使用する)必要のないプログラムコードを生成し、又はプログラマがこのようなプログラムコードを書く。いくつかの実施形態では、プログラムコード内で特定のベクトルサイズを指定することを禁止することができる。従って、これらの実施形態におけるコンパイル済みコード(すなわち、バイナリコード)は、異なるベクトル長を有することができる他の実行ユニット上で実行されると同時に、より長いベクトルをサポートするプロセッサからの性能向上が潜在的に実現される。このような実施形態では、プロセッサなどの所与のハードウェアユニットに対し、実行時間中にシステムレジスタからベクトル長を読み取ることができる。この結果、処理技術によって長いベクトルが可能になるにつれ、ソフトウェア開発者による努力を全く必要とせずに、レガシーバイナリコードの実行が単純にスピードアップする。
一般に、ベクトル長は、2の累乗(2、4、8など)として実装することができる。しかしながら、いくつかの実施形態では、ベクトル長が2の累乗でなくてもよい。詳細には、2の累乗数のデータ要素を含むベクトルと同じように、3つ、7つ又は別の数のデータ要素のベクトルを使用することができる。
様々な実施形態では、ベクトル内の各データ要素が、一連のメモリアクセスを並列に実行するためにベクトル実行ユニット204により使用されるアドレスを含むことができる。このような実施形態では、ベクトルの1又はそれ以上の要素が無効なメモリアドレスを含む場合、無効なメモリ読み取り動作が行われることがある。この結果、プログラムの終了を引き起こしたはずの無効なメモリ読み取り動作により、代わりに有効なアドレスを含むいずれかの要素が読み取られ、無効な要素を含む要素にフラグが立てられて、推測的な及び結果的に違法な読み取り動作に直面しながらプログラムの実行継続が許可されてしまう可能性がある。
いくつかの実施形態では、プロセッサ102(従ってベクトル実行ユニット204)が、ポインタのベクトルに対して動作し、これを使用することができる。このような実施形態では、データタイプのサイズに関わらず、ベクトル当たりのデータ要素数がベクトル当たりのポインタ数と同じである。メモリに対して動作する命令は、メモリアクセスのサイズを示す変種を有することができるが、プロセッサレジスタ内の要素は、ポインタサイズと同じにすべきである。これらの実施形態では、32ビットのアドレッシングモードと64ビットのアドレッシングモードの両方をサポートするプロセッサが、32ビットモードにおけるベクトル当たりの要素数を2倍にできるように選択し、これによりさらに大きなスループットを達成することができる。このことは、同じ幅のデータ経路を仮定した場合、32ビットのアドレッシングに対する異なるスループット利得を意味する。この要件を緩和するために、実装固有の技術を使用することができる。例えば、レジスタペアリング又は他の何らかの特殊な機構を通じて、32ビットモードにおいて倍精度浮動小数点数をサポートすることができる。
1つの実施形態では、分岐予測ユニット210を、条件付き分岐命令の場合にフェッチユニット201に対して分岐目標プログラムカウンタアドレス(PC)を生成するように構成することができる。より具体的には、条件付き分岐命令の場合には、分岐予測ユニット210が、分岐が取られるか否かを予測することができ、制御論理(図示せず)が、この予測に基づいてフェッチユニット201に対してPCを生成することができる。その後、予測された分岐の結果に応じて推測的に命令をフェッチし、発行して、実行することができる。様々な実施形態では、分岐予測ユニット210が、様々な予測機構のいずれかを使用して予測を生成することができる。例えば、分岐予測ユニット210は、個々の分岐の予測状態を維持するローカル予測器(例えば、状態機械、テーブル、カウンタ又はその他のデータ構造)、全体として検討される複数の分岐にわたって予測を実行するグローバル予測器、ローカル予測器の要素とグローバル予測器の要素を組み合わせたハイブリッド予測器、又はその他の好適な方法を使用することができる。いくつかの実施形態では、分岐予測ユニット210が、(例えば、ある技術に従って良好に予測された分岐が、いつ異なる技術に従って良好に予測されるようになるかを検出してこれに適合するように)実行中に変化する分岐挙動に動的に適合する予測器を利用することができる。
1つの実施形態では、誤予測ユニット212が、分岐予測が誤った(例えば、実行時における分岐の実際の挙動が、予測した分岐の挙動と異なり、分岐が誤予測されたことが示される)時点を検出するように構成される。また、誤予測ユニット212を、実行ユニット202、206及び204、並びに分岐予測ユニット210に誤予測の指示を与えるように構成することもできる。なお、誤予測ユニット212を別個のユニットとして示しているが、他の実施形態では、誤予測ユニット212が、分岐予測ユニット210の一部であってもよく、又はフェッチユニット201の一部であってもよく、又は様々な実行ユニット(202、204、及び206など)のいずれか又は全ての一部であってもよいことが企図される。
上述したように、従来のプロセッサが分岐命令を誤予測した場合、誤推測の観点から、これらの推測的に発行された命令によってプロセッサの状態を修正できるようにすべきではないので、パイプラインは、誤予測された経路内の命令をフラッシュされる。その後、フェッチユニット201は、正しい非推測的経路に対して命令をフェッチすることができる。しかしながら、フラッシュ・フィル動作にはペナルティがあり、有用な作業を再開できるようになる前に数百回もの実行サイクルが必要になる場合がある。
従って、図7の説明に関連して以下でさらに詳細に説明するように、1つの実施形態では、分岐予測ユニット210が、様々な予測の予測精度情報を維持することができる。実際の分岐命令が実行されると、この分岐命令の挙動を予測した方法と実際の分岐命令の挙動との比較に基づいて、所与の分岐命令に関する精度情報を適用することができる。ベクトル分割ループで使用される誤予測後方分岐に関連するペナルティの一部を避けるために、分岐予測ユニット210は、予測精度が不十分な場合、この予測を抑制して、ループの反復回数に対応する情報が利用可能になるのを待つように構成することができる。
マクロスカラアーキテクチャの概要
コンパイラは、命令セットアーキテクチャ(マクロスカラアーキテクチャと呼ばれる)及びサポートハードウェアにより、コンパイル時における並列性を完全に決定する必要なく、また有用な静的分析情報を廃棄することなく、ループのためのプログラムコードを生成することができる。以下、マクロスカラアーキテクチャの様々な実施形態について説明する。詳細には、以下でさらに説明するように、ループに対して並列性を命じるのではなく、代わりに動的条件が許す場合に実行時に並列性を利用できるようにする命令セットを提供する。従って、このアーキテクチャは、コンパイラによって生成されたコードが、使用する並列性の量を切り換えることにより、実行時の条件に依存してループ反復の非並列(スカラ)実行と並列(ベクトル)実行を動的に切り換えることを可能にする命令を含む。
従って、このアーキテクチャが与える命令は、ループ反復に関するベクトル並列性の量を未決定とすることができるが、実行時に並列性が使用されることを必要としない。より詳細には、このアーキテクチャは、実行時条件に応じて有効ベクトル長が変化できるベクトル長非依存型命令セットを含む。従って、実行時依存により、コードの非並列実行が求められる場合、1つの要素の有効ベクトル長を使用して実行が行われる。同様に、実行時条件が並列実行を許す場合、実行時依存(及び基礎を成すハードウェアのベクトル長)によってどのような程度まで可能になっても、同じコードがベクトル並列方式で実行を行う。例えば、ベクトルの8つの要素のうちの2つが安全に並列に実行できる場合、プロセッサ102などのプロセッサは、この2つの要素を並列に実行することができる。これらの実施形態では、ベクトル長非依存型フォーマットのプログラムコードを表現することにより、既存のシステムには存在しない広範囲のベクトル化の機会が可能になる。
様々な実施形態では、コンパイル中に、コンパイラが、まずプログラムコード内の所与のループのループ構造を分析して、静的依存分析を行う。次に、コンパイラは、静的分析情報を保持するプログラムコードを生成し、プロセッサ102などのプロセッサに、例えば実行時依存を解決して考えられる最大量の並列性でプログラムコードを処理する方法を命令する。より詳細には、コンパイラは、対応するループ反復の組を並列に実行するためのベクトル命令を与えるとともに、ループの反復間のデータ依存によってエラーが生じないようにベクトル命令の実行を動的に制限するためのベクトル制御命令を与えることができる。この方法は、実行時依存に関する情報が利用可能である場合に並列化の決定を実行時に委ね、これによりソフトウェア及びプロセッサが、動的に変化する条件に並列性を適合できるようにするものである。プログラムコードのループ並列化の例を図3に示す。
図3の左側を参照すると、並列化されていない4つのループ反復(例えば、反復1〜4)を含む実行パターンを示しており、各ループは命令A〜Gを含む。垂直にスタックされた命令の連続動作を示している。図3の右側は、並列化されたバージョンのループである。この例では、反復内の各命令が、その前の少なくとも1つの命令に依存し、これにより所与の反復の命令間に静的依存チェーンが存在するようになる。従って、所与の反復内の命令を並列化することはできない(すなわち、所与の反復内の命令A〜Gは、その反復内の他の命令に対して常に直列的に実行される)。しかしながら、代替の実施形態では、所与の反復内の命令を並列化することができる。
図3のループ反復間の矢印によって示すように、所与の反復内の命令Eと次の反復の命令Dの間に実行時データ依存の可能性がある。しかしながら、この情報は実行時にしか利用できないので、コンパイラは、コンパイル中にこれらの命令間にデータ依存の可能性があることしか判断できず、実際にどの反復内に依存が具体化されているかを告げることはできない。この例では、実行時に実際に具体化されるデータ依存を、1Eから2D及び3Eから4Dへの実線矢印によって示しており、実行時に具体化されないデータ依存を、2Eから3Dへの破線矢印を用いて示している。従って、図示のように、第1/第2の反復間及び第3/第4の反復間で実際に実行時データ依存が生じる。
第2の反復と第3の反復の間にはデータ依存が存在しないので、これらの反復は、安全に並列に処理することができる。さらに、所与の反復の命令A〜C及びF〜Gは、反復内にしか依存を有しておらず、従って所与の反復の命令Aは、他の全ての反復の命令Aと並列に実行することができ、命令Bも、他の全ての反復の命令Bと並列に実行することができ、以下に関しても同様である。しかしながら、第2の反復内の命令Dは、第1の反復内の命令Eに依存するので、第1の反復内の命令D及びEは、第2の反復の命令Dを実行できるようになる前に実行しなければならない。
従って、右側の並列化ループでは、このようなループの反復を実行して静的データ依存及び実行時データ依存のいずれにも対処し、最大並列化を達成する。より詳細には、全ての4つの反復の命令A〜C及びF〜Gが並列に実行される。しかしながら、第2の反復内の命令Dは、第1の反復内の命令Eに依存するので、第1の反復内の命令D及びEを実行した後で第2の反復の命令Dを実行できるようにしなければならない。しかしながら、第2の反復と第3の反復の間にはデータ依存が存在しないので、これらの反復の命令D及びEは並列に実行することができる。
マクロスカラアーキテクチャの例
以下の例は、マクロスカラ演算を導入し、図3に示して上述した並列化ループの例のループのようなベクトル化ループにおけるその使用を示すものである。理解を容易にするために、これらの例は、C++フォーマットの疑似コードを使用して示している。
なお、以下の実施形態例は説明のためのものである。実際の命令及び動作は、アーキテクチャの理解を容易にすることを意図したものにすぎない。しかしながら、代替の実施形態では、命令又は動作を、例えばマイクロコードシーケンスの原始的な動作を使用して、又は異なるシーケンスの下位動作を使用して異なる方法で実施することができる。なお、マクロ動作及び対応する使用モデルに関する情報が曖昧にならないように、命令をさらに分解することは避ける。
注記
以下の例を説明する際には、変数に関して以下のフォーマットを使用し、これらは別途指示しない限りベクトル量である。
p5=a<b
ベクトルp5の要素は、テスト結果a<bに応じて0又は1に設定される。なお、以下でさらに詳細に説明するように、ベクトルp5は「述語ベクトル」とすることができる。述語ベクトルを生成するいくつかの命令は、結果としての述語を反映するようにプロセッサ状態フラグも設定する。例えば、プロセッサ状態フラグ又は条件コードは、FIRST、LAST、NONE及び/又はALLフラグを含むことができる。
〜p5;a=b+c
述語ベクトルp5内のアクティブな(すなわちゼロでない)要素により指定されるベクトル「a」の要素のみがb+cの結果を受け取る。aの残りの要素はそのままである。この動作は「叙述」と呼ばれ、述語ベクトルの前に波形符号(“〜”)を用いて示す。
!p5;a=b+c
述語ベクトルp5内のアクティブな(すなわちゼロでない)要素により指定されるベクトル「a」の要素のみがb+cの結果を受け取る。aの残りの要素はゼロに設定される。この動作は「ゼロ化」と呼ばれ、述語ベクトルの前に感嘆符(“!”)を用いて示す。
[プログラムコード]
これに応じて、以下の命令によりプロセッサ状態フラグ及び分岐をテストする。
x+=VECLEN
VECLENは、ベクトル当たりの要素数を伝える機械値である。この値は、アセンブラにより決定されるのではなく、コードを実行するプロセッサにより実行時に決定される。
//Comment
以下の例では、多くの共通プログラミング言語と同様に、コメントを示すために二重フォワードスラッシュを使用する。これらのコメントは、指示されるベクトルに含まれる値に関する情報、又は対応する例で行われる動作の説明を示すことができる。
これらの例では、他のC++フォーマットの演算子の意味は従来のままであるが、要素毎にベクトル全体に適用される。機能呼出しを採用する場合、これらは、戻されたあらゆる値を宛先レジスタ内に配置する単一の命令を意味する。理解を容易にするために、全てのベクトルは整数のベクトルであるが、代替の実施形態は他のデータフォーマットをサポートする。
構造的ループ伝搬依存
以下のコード例1では、従来のベクトルアーキテクチャを使用する「非ベクトル化」のプログラムコードループを示す。(なお、このループは、非ベクトル化であることに加え、データ依存の微細粒性に起因して、従来のマルチスレッディングアーキテクチャ上におけるマルチスレッドが可能でない。)明確にするために、このループは、ループをベクトル化できないようにする基本的ループ伝搬依存に集約している。
この例では、変数r及びsは、従来のアーキテクチャを使用するベクトル化を防ぐループ伝搬依存を有する。しかしながら、条件(A[X]<FACTOR)が常に真又は常に偽であることが分かっている限り、ループのベクトル化が可能である。実行中に条件が変化できる場合(通常)、これらの仮定は変化する。この例を単純にするために、A[]とB[]の間にはエイリアシングが存在しないと仮定する。
例1:プログラムコードループ
[プログラムコード]
例1のループは、マクロスカラアーキテクチャを使用して、条件(A[x]<FACTOR)が変化しないセグメントにベクトルを分割することによりベクトル化することができる。以下では、このようなベクトルを分割する処理の例、及び分割を可能にする命令の例を示す。なお、この例では、説明する分割を条件節内の命令にのみ適用すればよい。最初のA[x]の読み取り及び最後の動作B[x]=r+sは、潜在的に最後のループ反復に対して行う場合を除き、常に完全ベクトルにわたって並列に実行することができる。
図2のプロセッサ102などのベクトルプロセッサの動作をマクロスカラアーキテクチャに関連して説明するために、ベクトル化コードの命令及び例を図示し説明する。一般に、以下の説明は、いくつかの命令を記載した後に、この命令を使用する1又はそれ以上のベクトル化コードサンプルを示すように編成する。場合によっては、所与の例において特定のタイプのベクトル化問題について検討する。
dest=VectorReadInt(Base,Offset)
VectorReadIntは、メモリ読み取り動作を行うための命令である。データサイズによってスケーリングされるオフセットのベクトル、Offset(この場合は整数)をスカラベースアドレス、Baseに追加してメモリアドレスのベクトルを形成し、その後これを宛先ベクトル内に読み込む。命令が叙述又はゼロ化された場合、アクティブな要素に対応するアドレスのみが読み取られる。説明する実施形態では、無効なアドレスへの読み込みには失敗してもよいが、最初のアクティブなアドレスが無効である場合、このような失敗はプログラムの終了しか招かない。
VectorWriteInt(Base,Offset,Value)
VectorWriteIntは、メモリ書き込み動作を実行するための命令である。データサイズによってスケーリングされるオフセットのベクトル、Offset(この場合は整数)をスカラベースアドレス、Baseに追加してメモリアドレスのベクトルを形成する。これらのメモリアドレスに、値のベクトル、Valueが書き込まれる。この命令が叙述又はゼロ化された場合、アクティブアドレスのみにデータが書き込まれる。説明する実施形態では、違法なアドレスへの書き込みは常に失敗する。
dest=VectorIndex(Start,Increment)
VectorIndexは、Startによって指定されたスカラ開始値から増分によって単調に調整を行う値のベクトルを生成するための命令である。この命令は、指標調整が一定である場合にループ指標変数を初期化するために使用することができる。叙述又はゼロ化が適用された場合、最初のアクティブな要素が開始値を受け取り、次のアクティブな要素のみに増分が適用される。例えば、
[プログラムコード]
dest=PropagatePostT(dest,src,pred)
PropagatePostT命令は、predによって決定されるsrc内のアクティブな要素の値を、destの次の非アクティブな要素に伝播する。destでは、アクティブな要素、及び最初のアクティブな要素に先行するあらゆる非アクティブな要素はそのままである。この命令の目的は、条件的に計算された値を取ることであり、この条件的に計算された値を、同等のスカラーコード内に生じる次のループ反復に伝播する。例えば、
[プログラムコード]
dest=PropagatePriorF(src,pred)
PropagatePriorF命令は、predによって決定されるsrcの非アクティブな要素の値を、dest内の次のアクティブな要素に伝播する。非アクティブな要素はsrcからdestにコピーされる。述語の最初の要素がアクティブである場合、srcの最後の要素がその位置に伝播される。例えば、
[プログラムコード]
dest=ConditionalStop(pred,deps)
ConditionalStop命令は、述語のベクトル、predを評価し、depsによって指定されるデータ依存を意味する隣接する述語要素間の遷移を識別する。スカラ値depsは、4ビットのアレイと考えることができ、これらの各々は、左から右に処理した場合、pred内の真/偽の要素間の考えられる遷移を示す。これらのビットは、設定された場合には示される依存の存在を伝え、設定されていない場合には依存が存在しないことを保証する。これらには以下のものがある。
kTF−述語が真である反復から、述語の値が偽である次の反復へのループ伝搬依存を意味する。
kFF−述語が偽である反復から、述語の値が偽である次の反復へのループ伝搬依存を意味する。
kFT−述語が偽である反復から、述語の値が真である次の反復へのループ伝搬依存を意味する。
kTT−述語が真である反復から、述語の値が真である次の反復へのループ伝搬依存を意味する。
依存先のデータを生成する反復に対応する要素位置は、そのデータに依存する反復に対応する要素位置の宛先ベクトルに記憶される。データ依存が存在しない場合、その要素の宛先ベクトルに0の値が記憶される。結果としての依存指標ベクトル、すなわちDIVは、依存を表す要素位置指標のベクトルを含む。後述する理由により、ベクトルの最初の要素は要素番号1である(0ではない)。
一例として、上記の例1のループにおける依存について検討する。このループでは、条件節の真の反復と偽の反復の間の遷移が、並列化の中断を必要とするループ伝搬依存を表す。これは、以下の命令を使用して処理することができる。
[プログラムコード]
第4の反復によって必要なデータが生成され、第5の反復がこれに依存するので、出力ベクトルp2(DIVである)の位置5に4が記憶される。第6の反復からのデータに依存する第7の反復に対しても同じことが当てはまる。DIVの他の要素は、依存が存在しないことを示すために0に設定される。(なお、この例では、ベクトルの最初の要素が要素番号1である。)
dest=GeneratePredicates(Pred,DIV)
GeneratePredicatesは、依存指標ベクトル、DIVを取り、predによって示される処理された前のグループを所与として、安全に並列に処理できる次の要素グループに対応する述語を生成する。predの要素がどれも非アクティブな場合、安全に並列に処理できる最初の要素グループに対して述語が生成される。Predが、ベクトルの最後の要素が処理されたことを示す場合、この命令は、要素を処理すべきでないことを示す非アクティブな述語の結果ベクトルを生成し、ZFフラグが設定される。結果の最後の要素がアクティブであることを示すためには、CFフラグを設定する。第1の例の値を使用すると、GeneratePredicates(述語生成)は以下のように動作する。
[プログラムコード]
GeneratePredicatesは、全てがゼロである初期化された述語p2から、次のベクトル計算を3つのサブベクトル(すなわち、p’、p’’、P’’’)に分割するp2の新たなインスタンスを生成する。これにより、ハードウェアは、ループのデータ依存に違反することを避けるグループ内のベクトルを処理できるようになる。
図4Aは、例1のループのスカラ実行中における可変状態のシーケンスを示す図である。より具体的には、条件式の方向のランダム化した50/50の分散を使用して、例1のループの可変状態の進行を示す。図4Bは、例1のループのマクロスカラベクトル化プログラムコードの実行の進行を示す図である。図4A及び図4Bには、左側の傾いたハッシュマークを使用してA[]から読み取った値を示し、右側の傾いたハッシュマークを使用してB[]に書き込まれた値を示し、網掛けの背景を使用して(所与の反復内でいずれが変化したかに依存する)「r」又は「s」の値を示している。「s」が変化している間に「r」が変化することはなく、逆もまた同様であることが観察される。
A[]及びB[]の値の組は、いずれもループ伝搬依存チェーンに加わっていないので、全ての値がA[]から並列に読み取られること、又はB[]に並列に書き込まれることが防がれることはない。しかしながら、r及びsの計算では、条件式の値が同じ状態を保っている(すなわち、真又は偽が継続する)間しか要素を並列に処理することができない。このループのプログラムコードの実行パターンを図4Bに示す。なお、この例では、8つの要素長のベクトルを使用している。最初のベクトル命令を処理する際には、最初の反復が単独で行われる(すなわち、ベクトル実行ユニット204が最初のベクトル要素のみを処理する)のに対し、反復1〜5はベクトル実行ユニット204によって並列に処理され、その後反復6〜7がベクトル実行ユニット204によって並列に処理される。
図5A及び図5Bは、プログラムコードのベクトル化の1つの実施形態を示す図である。図5Aには、元々のソースコードを示し、図5Bには、マクロスカラアーキテクチャを使用して実行できる動作を表すベクトル化コードを示す。図5Bのベクトル化コードでは、Loop1が、ソースコードからのループであり、Loop2が、サブベクトル区分を処理するベクトル分割ループである。
この例では、アレイA[]を読み取って完全な長さのベクトルにおいて比較する(すなわち、N個の要素のベクトルでは、アレイA[]のN個の位置を同時に読み取る)。ベクトルi2は、ベクトルの分割を制御するDIVである。分割は、観察すべきループ伝搬依存を示す偽と真の間の遷移を表す述語p1をモニタすることにより決定される。述語ベクトルp2は、いずれかの時点でどの要素を作動すべきかを決定する。この特定のループでは、p1が、あらゆるサブベクトル区分の全ての要素において同じ値を有し、従ってどの変数を更新すべきかを判断するには、区分の最初の要素のみをチェックすればよい。
変数「s」が更新された後、PropagatePostT命令は、アクティブな区分内の最終値をベクトル内の次の要素に伝播する。ループの最上部では、PropagatePriorF命令が、最終ベクトル位置からの「s」の最後の値を次のパスのためにベクトルの全ての要素にわたってコピーする。なお、いくつかの事例におけるPropagatePriorF命令の使用効率を示す変数「r」は、異なる方法を使用して伝播される。
ソフトウェア推測
前回の例では、制御フローの決定がループ伝搬依存と無関係であったため、ベクトル分割ループの開始前にベクトル区分を決定することができた。しかしながら、これがいつもそうであるとは限らない。例2A及び例2Bに示す以下の2つのループについて検討する。
例2A:プログラムコードループ1
[プログラムコード]
例2B:プログラムコードループ2
[プログラムコード]
例2Aでは、制御フローの決定がループ伝搬依存チェーンと無関係であるが、例2Bでは、制御フローの決定がループ伝搬依存チェーンの一部である。いくつかの実施形態では、例2Bのループにより、「J」の値が変化しないと推測することができ、この予測が誤っていることが分かった場合には後で補償することができる。このような実施形態では、「j」の値に関する推測により、ループのベクトル化が大きく変化することはない。
いくつかの実施形態では、コンパイラを、ループの反復間のデータ依存を常に予測しないように構成することができる。このような実施形態では、実行時データ依存が存在する場合、並列に処理されるアクティブな要素のグループを減少させて、その時点で安全に並列に処理できる要素グループを表すことができる。これらの実施形態では、実際に失われる並列化がないので、実際に存在するよりも多くの並列化を誤予測したことに対するペナルティがほとんどない(すなわち、必要であれば、反復により同時に1つの要素を非並列的に処理することができる)。これらの実施形態では、その後の段階で実際の並列性の量が単純に認識される。
dest=VectorReadIntFF(Base,Offset,pf)
VectorReadIntFFは、VectorReadIntの最初の失敗用の変種である。少なくとも最初のアクティブな要素が有効なアドレスである場合、この命令は失敗を生成しない。無効なアドレスに対応する結果はゼロに強制され、このデータを使用する後の命令に、述語をマスク処理するために使用できるフラグpfが戻される。アドレスの最初のアクティブな要素がマッピングされていない場合、この命令は、コンピュータシステム100(図示せず)内の仮想メモリシステムに対応するページを読み込ませることに失敗し、これによりプロセッサ102が順方向の進行を継続することが保証される。
dest=Remaining(Pred)
Remaining命令は、述語のベクトル、Pred、を評価し、ベクトル内の残りの要素を計算する。これは、最後のアクティブな述語に続く非アクティブな述語の組に対応する。Pred内にアクティブな要素が存在しない場合、全てのアクティブな述語のベクトルが戻される。同様に、Predが全てのアクティブな述語のベクトルである場合、非アクティブな述語のベクトルが戻される。例えば、
[プログラムコード]
図6A及び図6Bは、ベクトル化プログラムコード例の実施形態を示す図である。より具体的には、図6Aに示すコードサンプルは、(上述した)例2Aのコードのベクトル化バージョンである。図6Bに示すコードサンプルは、例2Bのコードのベクトル化バージョンである。図6Bを参照すると、ベクトル分割ループの内部でA[]の読み取り及びその後の比較が移動している。従って、これらの動作は、「j」の値が変化しないと仮定(推測)する。「j」を使用した後にのみ、「j」がどこで値を変更できるかを判断することができる。「j」が更新された後、残りのベクトル要素は、ベクトル全体を通じて反復するために必要に応じて再計算される。推測的コードサンプル内でRemaining命令を使用することにより、プログラムは、ベクトル分割ループ内のどの要素が未処理のままであるかを特定した後で、実際に安全に処理される(すなわち、未解決のデータ依存を有していない)これらの要素のサブグループを決定できるようになる。
様々な実施形態では、耐失敗性読み取りサポートが提供される。従って、このような実施形態では、プロセッサ102が、後で計算において使用すべき値をロードしようとする試みにおいて、ベクトル命令の無効な要素(例えば、VectorReadFF)からのアドレスを使用して、メモリから推測的にデータを読み取ることができる。しかしながら、これらの値は、無効な読み取りが生じたことを発見すると最終的に廃棄され、従って正しいプログラム挙動には関連しない。このような読み取りは、存在しない又は保護されたメモリを参照できるので、これらの実施形態を、無効ではあるが関係のないデータがメモリから誤って読み取られた場合に通常の実行を継続するように構成することができる。(仮想メモリをサポートする実施形態では、この構成により、ページングを行う必要性が確実になるまでページングを行わないという追加の利点が得られる。)
図6A及び図6Bに示すプログラムループでは、条件が真の場合の反復とその次の反復の間に、後の反復の述語値に関わらずループ伝搬依存が存在する。このことは、ConditionalStop命令のパラメータに反映される。
図6A及び図6Bのサンプルプログラムコードでは、非推測的ベクトル分割と推測的ベクトル分割の違いが強調されている。より具体的には、例2Aでは、メモリが読み取られ、ConditionalStop前に述語が計算される。分割ループは、ConditionalStop命令後に開始される。しかしながら、例2Bでは、ConditionalStop命令が分割ループの内部で実行され、早期の動作を無効にする依存を認識するように機能する。これらの両事例では、GeneratePredicates命令が、分割ループの残りに対してどの要素を使用するかを制御する述語を計算する。
メモリベースのループ伝搬依存
前回の例では、コンパイラが、コンパイル時にアドレスエイリアシングが存在しないことを立証することができた。しかしながら、このような決定を行うことは、困難又は不可能であることが多い。以下の例3に示すコードセグメントは、マクロスカラアーキテクチャの様々な実施形態において、メモリを通じて生じる(エイリアシングを含む可能性がある)ループ伝搬依存にどのように対処するかを示すものである。
例3:プログラムコードループ3
[プログラムコード]
例3のコードセグメントでは、A[x]がA[r]又はA[s]でエイリアシングされるかどうかをコンパイラが判断することはできない。しかしながら、マクロスカラアーキテクチャでは、コンパイラが、実行時にハードウェアにメモリハザードをチェックさせる命令を単純に挿入し、これに応じて実行時にベクトルを分割して、正しいプログラム挙動を確実にする。メモリハザードをチェックするこのような1つの命令に、以下で説明するCheckHazardP命令がある。
dest=CheckHazardP(first、second、pred)
CheckHazardP命令は、メモリを通じた潜在的なデータ依存を求めて、2つのメモリ動作に対応するメモリアドレスの2つのベクトル(又は指標)を調べる。ベクトル「first」は、第1のメモリ動作のアドレスを保持し、ベクトル「second」は、第2の動作のアドレスを保持する。述語「pred」は、「second」のいずれの要素に対して動作すべきかを指示又は制御する。スカラループ反復が時間的に順方向に進行するにつれ、ベクトル内の左から右に、連続的反復を表すベクトル要素が現れる。CheckHazardP命令は、この文脈において評価を行うことができる。この命令は、対応する第1及び第2のメモリ動作の対の間のメモリハザードを表すDIVを計算することができる。この命令は、読み取り後の書き込み、書き込み後の読み取り、及び書き込み後の書き込みのメモリハザードを正しく評価することができる。
上述したConditionalStop命令と同様に、依存先のデータを生成する反復に対応する要素位置を、このデータに依存する反復に対応する要素位置の宛先ベクトルに記憶することができる。データ依存が存在しない場合、依存のない反復に対応する要素位置の宛先ベクトルにゼロを記憶することができる。例えば、
[プログラムコード]
上記で示したように、第1のベクトル(「first」)の要素5及び第2のベクトル(「second」)の要素3が、いずれもアレイインデックス6にアクセスする。従って、DIVの位置5に3が記憶される。同様に、firstの要素6及びsecondの要素2は、いずれもアレイインデックス位置7にアクセスし、DIVの位置6に2が記憶されるようになり、以下同様である。データ依存が存在しない場合、DIVにはゼロが記憶される。
いくつかの実施形態では、CheckHazardP命令が、様々なサイズのデータタイプを考慮することができる。しかしながら、明確にするために、アレイインデックスタイプのみを使用して命令の関数を記述する。
上記の例のメモリアクセスは、3つのメモリハザードを有する。しかしながら、説明する実施形態では、関連するメモリ動作を安全に処理するために2つの区分しか必要としなくてよい。より具体的には、要素位置3における最初のハザードを処理することにより、これよりも小さな又はこれに等しい番号の要素位置における後続の依存が実際的に無意味なものとなる。例えば、
[プログラムコード]
以下、説明する実施形態で使用する、ベクトルをどこで分割すべきかを判断するためにDIVを分析するための処理を疑似コードで示す。いくつかの実施形態では、プロセッサ102のベクトル実行ユニット204が、この計算を並列に行うことができる。例えば、
[プログラムコード]
DIV[x]>0の場合の位置をxとする間隔[STARTPOS,x]にわたってベクトルを安全に並列に処理することができる。すなわち、STARTPOSから位置xまで(ただしxは含まない)を意味し、この場合STARTPOSは、以前に処理された要素の組の後の最初のベクトル要素を示す。以前に処理された要素の組が空である場合、STARTPOSはこの最初の要素から開始する。
いくつかの実施形態では、ConditionalStop命令及び/又はCheckHazardP命令を使用して、コード内に複数のDIVを生成することができる。しかし、GeneratePredicates命令は、単一のDIVを使用してベクトルを分割する。この状況に対処するための方法には、(1)分割ループをネスト化できるようにする方法、又は(2)DIVを組み合わせて単一の分割ループ内で使用できるようにする方法の2つがある。いずれの方法も正しい結果をもたらすが、最適な方法は、問題のループの特性に依存する。より詳細には、コンパイラが入力パラメータ上のエイリアシングを単純に判断できない場合のような、複数のDIVが依存を有していないと予想される場合、これらの実施形態は、複数のDIVを1つに組み合わせて分割オーバヘッドを低減することができる。一方、多くのメモリハザードが実現されると予想される場合、これらの実施形態は、分割ループをネスト化することにより、(追加の並列性が存在する見込みを仮定して)考えられる最大の並列性を抽出する。
いくつかの実施形態では、以下に示すようなVectorMax(A,B)命令を使用してDIVを組み合わせることができる。
[プログラムコード]
DIVの要素は、その要素の位置よりも小さな番号しか含まず、早い時期に依存を表すはずなので、後からの依存は、GeneratePredicates命令の観点から、小さな値を冗長にする分割をさらに制限するようにしか機能しない。従って、全てのDIVの最大値を取ることにより、GeneratePredicates命令が、安全に並列に処理できる要素の組の交点を効果的に戻すようになる。
図7は、ベクトル化プログラムコード例の1つの実施形態を示す図である。より具体的には、図7に示すコードサンプルは、(上記で示した)例3のコードのベクトル化バージョンである。図7を参照すると、C[]又はD[]とA[]の間にエイリアシングは存在しないが、A[]に対する動作は互いにエイリアシングされている可能性がある。コンパイラがC[]又はD[]からエイリアシングを排除できない場合、コンパイラは、追加のハザードチェックを生成することができる。この場合、エイリアシングの危険性はないので、アレイC[]及びD[]に対する読み取り動作はベクトル分割ループの外部に位置付けられているのに対し、A[]に対する動作は分割ループ内に留まる。実際にはA[]にエイリアシングが存在しない場合、この区分は完全なベクトルサイズを保持し、分割ループは反復することなく単に実現しない。しかしながら、エイリアシングが実際に生じている反復では、分割ループがベクトルを分割してデータ依存を尊重し、これにより正しい動作が保証される。
図7のコードセグメントに示す実施形態では、アドレスのベクトル全体にわたってハザードチェックが行われる。しかしながら、一般的には、条件的に実行されたメモリ動作間のハザードをチェックする必要がある場合が多い。CheckHazardP命令は、第2のメモリ動作のどの要素がアクティブであるかを示す述語を取る。第1の動作の要素が全て非アクティブな場合、CheckHazardP命令自体を、アクティブな第1のオペランドの要素に対応するゼロ化述語で叙述することができる。(なお、これにより、第1のメモリ動作が叙述された場合の正しい結果が得られる。)
以下の例4におけるコードセグメントに、アレイE[]上にメモリハザードを有するループを示す。このコードセグメントは、アレイ内の予測できない場所に対して条件的に読み取り及び書き込みを行う。図8は、ベクトル化プログラムコード例の1つの実施形態を示す図である。より具体的には、図8に示すコードサンプルは、(上記で示した)例4のコードのベクトル化マクロスカラバージョンである。
例4:プログラムコードループ4
[プログラムコード]
図8を参照すると、このベクトル化ループは、アレイE[]に対して読み取りを行うべきか、それとも書き込みを行うべきかをそれぞれ示す述語p1及びp2を含む。CheckHazardP命令は、メモリハザードを求めてアドレスのベクトル(h及びi)をチェックする。CheckHazardPには、第2のメモリ動作(書き込み)を制御する述語としてパラメータp2が渡される。従って、CheckHazardPは、条件無し読み取りと、p2に叙述される条件付き書き込みとの間の(単複の)メモリハザードを識別する。CheckHazardPの結果は、p1にゼロ叙述される。これにより、E[]から読み取りを行うべきでない要素位置のDIV(ix)にゼロが配置される。ゼロがハザードの不在を示すことを思い出されたい。従って、ixに記憶された結果は、p1に叙述される条件付き読み取りとp2に叙述される条件付書き込みとの間のハザードを表すDIVである。これが可能になるのは、DIV内に非ハザード状態がゼロで表されるからである。
なお、上記の実施形態では、メモリベースのハザードをチェックするために、CheckHazardP命令を使用した。上述したように、CheckHazardP命令は、第2のベクトルのどの要素に対して動作を行うかを制御するパラメータとしての述語を取る。しかしながら、他の実施形態では、他のタイプのCheckHazard命令を使用することができる。例えば、以下の様々な例で使用するように、特定の所望のコード実装に依存して、述語パラメータを省いたCheckHazard命令を使用することができる。1つの実施形態では、このバージョンのCheckHazardP命令が、2つの入力ベクトルに対して無条件で単純に動作することができる。どのバージョンのCheckHazard命令を使用するかに関わらず、結果の叙述及び/又はゼロ化をサポートするあらゆるマクロスカラ命令と同様に、CheckHazard命令を実行することにより結果ベクトルの所与の要素が修正されるか否かは、上述したような述語ベクトル又はゼロ化ベクトルの使用を通じて個別に制御することができる。すなわち、CheckHazardP命令の述語パラメータは、上述した一般的な述語/ゼロ化ベクトルとは異なる命令実行の態様を制御する。
述語生成命令後の最初の後方分岐の検出
上述したように、コードセグメントをベクトル化する際には、例えばメモリハザードなどの考えられるループ伝搬依存を正しく処理するために、ベクトル化を行うプログラムコード内にベクトル分割ループを使用することができる。このようなプログラムコードでは、例えば(上述した)CheckHazard命令などのマクロスカラ命令によって、DIVを生成することができ、これをベクトル分割ループの一部であるマクロスカラのGeneratePredicates(述語生成)命令によって後で使用することができる。また、ベクトル分割ループは、ループの一部として後方分岐を使用する。上述したように、この後方分岐が正確に予測される場合、処理性能を維持することができる。しかしながら、この分岐が正確に予測されない場合(多くの場合にそうである)、性能が低下することがある。従って、場合によっては、分岐の予測を抑制してDIVが利用可能になるまで待つことが有益となり得る。すなわち、いくつかの例では、DIVが利用可能になるまで実行を効果的に停止するペナルティを、ベクトル分割ループの境界を形成する分岐を誤予測するペナルティよりも低くすることができる。
本明細書で説明する技術から恩恵を受けることができるベクトル分割ループの特定の例として、B[]における項目を表すヒストグラムA[]を生成するコードセグメントの例を以下の例5に示す。
例5
[プログラムコード]
コンパイラは、例5のコードセグメントをベクトル化する際に、B[]のベクトル内のいずれかの要素が同じ値を含むかどうかを認識しなければならない。これが行われない場合、このコードは、A[]のいずれの要素が修正されるかを認識せず、同じベクトル内のA[]を後で修正することに影響が及ぶ。例5のコードセグメント内のあらゆるループ伝搬依存を処理するベクトル分割ループを含むマクロスカラコードセグメントを例6に示す。
例6
[プログラムコード]
例6のコードセグメントでは、CheckHazard命令が、メモリハザードを検出するためにメモリアドレスを評価し(V2に記憶されたDIVを生成し)、GeneratesPredicates命令が、この情報を使用して、安全に並列に処理できる要素の数を制御する述語を計算する。ベクトル全体を安全に並列に処理できない場合、ベクトル全体が処理されるまでベクトル分割ループ(PartLoop)が反復する(これは、Carry−flagが設定されることなどのプロセッサフラグの1つにより指定される)。
たとえループ内に実際にメモリハザードが存在しない場合でも、コンパイラは、コンパイル時にこれを確実に判断できないことが多い。従って、たとえコンパイラがベクトル分割ループを発するように強制されていたとしても、多くの場合、実行時にベクトル全体が並列に処理される。この場合、従来の分岐予測器は効率的に動作してループが決して反復しないと予測することができ、十分な性能が維持される。
しかしながら、ベクトルが頻繁に分割される場合、従来の分岐予測器では予測が不完全であることが多く、性能に悪影響を与える。これにより、ベクトル分割ループの性質に起因して害が及ぶことがある。通常、ベクトル分割ループは、互いに直列的に依存する命令チェーンを含む。従って、分岐予測が完璧であった場合でも、このコード部分の性能は、シリアルコードによって制限されることがある。上述したように、不完全な分岐予測には性能ペナルティがあり、ループの性質に起因して、正確な予測には上限がある。さらに、分割ループが実際に複数回反復する場合でも、限られた回数しか反復しない(通常はごくわずかな反復)。この結果、これらの場合に高い誤予測率が生じる可能性があり、電力及び性能の両方に悪影響を与える。従って、ベクトル分割ループの分岐予測精度は、非常に重要となり得る。従って、以下でさらに説明するように、述語生成命令後の最初の後方フロー制御命令を検出した時点で、受け取った予測精度の指示に依存して、DIVが利用可能になるまでこのフロー制御命令の予測を抑制することができる。
図9は、ベクトル分割ループを形成するプログラム命令の実行中における図2のプロセッサの1つの実施形態の動作を示すフロー図である。図2〜図9をまとめて参照し、図9のブロック901から開始すると、分岐予測ユニット210が、述語生成命令後の最初の条件付き後方分岐命令を検出する。より具体的には、1つの実施形態では、この条件付き後方分岐命令を、分岐命令よりも上位にある宛先アドレスに(例えば、ベクトル分割ループの開始点に)分岐し、条件付き命令文が真と評価した時に分岐する条件付き分岐命令とすることができる。例6に示す実施形態では、条件付き命令文が、キャリークリア条件コードに依存する。また、述語生成命令は、上述したようにDIVなどの依存ベクトルに依存する述語ベクトルを生成できるマクロスカラのGeneratePredicate命令とすることができる。1つの実施構成では、GeneratePredicate命令後に検出された後方分岐命令を、いずれも上記で詳細に説明したマクロスカラのCheckHazard命令又はマクロスカラのConditionalStop命令により設定された条件コードに基づく分岐命令とすることができる。なお、例6ではマクロスカラのCheckHazard命令を使用しているが、代わりに、例えば叙述されたCheckHazardP命令などの他のバージョンのマクロスカラのCheckHazard命令を使用してもよい。
上述したように、分岐予測ユニット210は、様々な分岐予測に関する予測精度情報を生成して維持することができる。従って、この分岐予測ユニット210を、後方分岐命令の予測精度の指示を生成し、及び/又は受け取るように構成することができる(ブロック903)。1つの実施構成では、この精度指示を、精度を示す精度値とすることができ、他の実施構成では、この精度指示を、予測精度が所定の精度閾値を満たすかどうかを示すバイナリ信号とすることができる。
様々な実施形態では、予測の抑制を目的として所与の分岐が正確に予測されているかどうかを判断する閾値を、非明示的な又はハードコーディングされた値、ファームウェア又は処理のテストモード動作を通じて修正できる値、又はソフトウェアにより自由に修正できる値とすることができる。閾値は、様々に固定することもでき、或いは実行時挙動の結果として動的に変化することもできる。いくつかの実施形態では、例えば分岐予測ユニット210が維持する分岐履歴テーブル内の所与の分岐に関連する統計値の一部として、異なる分岐のインスタンスのために異なる閾値を別個に維持することができる。或いは、分岐予測ユニット210は、異なる分岐のための閾値を明示的に記憶する代わりに、上述したように所与の分岐が正確に予測されているかどうかについてのバイナリ表示を単純に記憶することもできる。
1つの実施形態では、後方分岐命令の予測精度が所定の閾値を満たさないと判断したことに応答して、分岐予測ユニット210を、DIVが利用可能になるまで予測を抑制するように構成することができる(ブロック905)。より具体的には、DIV情報は、ループの正確な反復回数を示すので、1つの実施形態では、分岐予測ユニット210を、DIV情報を使用してあらゆる将来的な分岐を予測するように構成することができる。例えば、DIVは、あるベクトルがループを3回通過する必要があることを示すことができる。DIVからループ反復回数を確実に知ることができるので、分岐予測ユニット210は、この情報を使用して、後方分岐を誤予測するのを避けることができる。
1つの実施構成では、分岐予測ユニット210が、DIVを待っている間にパイプラインをストールさせておき、これによりあらゆる追加命令がフェッチされるのを防ぐことができる。別の実施構成では、分岐予測ユニット210が、DIVが利用できるようになるのを待っている間にプロセッサ102が文脈を切り換えるようにすることができる。別の実施形態では、DIV情報が利用可能になった時に、分岐予測ユニット210が、フェッチユニット201にループフェッチ通知を送信することができる。フェッチユニット201は、この指示に応答して、DIV情報を使用してベクトル分割ループの各反復のための命令をロードすることができる。
なお、DIVが利用可能になるのを待つことは、分岐を制御する条件コードが利用可能になるのを待つことと同じ命令によって生成されるので、これらはいずれも実質的に同等のものとすることができる。これにより、プロセッサ102のフェッチユニット201は、たとえDIVを分析し、これに応じて分岐予測ユニット210を構成するために複数のサイクルを必要とし得る場合でも、条件コードに基づいて直ちにフェッチを再開できるようになる。これにより、DIVを待つためにパイプラインがストールされた場合に、パイプラインのストール状態を最低限に抑えることができる。また、1つの実施形態では、たとえ分岐が抑制されDIV情報が使用されたとしても、この分岐に関して分岐予測の精度を追跡し続けることができる。これにより、分岐予測ユニット210は、予測の精度がいつ閾値を満たしたかを検出し、その動作モードを、DIVが利用可能になるのを待つのではなく分岐を予測するように変更できるようになる。すなわち、精度を改善すべき場合、不十分な精度に基づいて所与の分岐の予測を抑制するという決定を後で元に戻すことができる。
以上、実施形態についてかなり詳細に説明したが、上記の開示を完全に理解すれば、当業者には数多くの変形例及び修正例が明らかになるであろう。以下の特許請求の範囲は、全てのこのような変形例及び修正例を含むと解釈すべきである。さらに、以下の特許請求の範囲に一致するものは、あらゆる好適な組み合わせで実施することができ、本明細書では、特にこのような組み合わせを明示的に開示するように意図している。
プロセッサ装置は、以下に列挙する方法クレームのステップのいずれかを含む、本明細書で説明した方法ステップ、動作又は機能のいずれかをあらゆる好適な組み合わせで実行するためのあらゆる好適な手段を利用することができる。従って、例えば、プロセッサの構造的要素が、本明細書で説明した例示的な構造的要素と異なる場合でも、本明細書で説明したステップ、動作又は機能を実行するプロセッサ装置は本開示の範囲に含まれると見なされる。

Claims (20)

  1. 述語生成命令に続く最初の条件付き分岐命令を検出するステップを含み、前記最初の条件付き分岐命令は、選択時に後方に分岐し、前記述語生成命令は、実行時に、依存ベクトルに依存する述語ベクトルを生成し、前記依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す指標を含み、
    前記最初の条件付き分岐命令の予測精度の指示を受け取るステップと、
    前記予測精度の指示に基づいて前記最初の条件付き分岐命令の予測精度が閾値を満たさないと判断したことに応答して、前記述語生成命令が依存する前記依存ベクトルが利用可能になるまで前記最初の条件付き分岐命令の予測を抑制するステップと、
    をさらに含むことを特徴とする方法。
  2. 前記依存ベクトルが利用可能であることを検出したことに応答して、前記依存ベクトル内に示されるデータ依存情報を使用して前記最初の条件付き分岐命令を予測するステップをさらに含む、
    ことを特徴とする請求項1に記載の方法。
  3. 前記述語生成命令が、マクロスカラのGeneratePredicates命令である、
    ことを特徴とする請求項1に記載の方法。
  4. 前記最初の条件付き分岐命令の予測を抑制するステップが、前記最初の条件付き分岐命令を予測して該予測を廃棄するステップを含む、
    ことを特徴とする請求項1に記載の方法。
  5. 前記最初の条件付き分岐命令の予測を抑制するステップが、前記依存ベクトルが利用可能になるまで新たな命令が実行されるのを防ぐステップを含む、
    ことを特徴とする請求項1に記載の方法。
  6. 前記最初の条件付き分岐命令の予測を抑制するステップが、前記最初の条件付き分岐命令の実行によりプログラム命令の実行を制御するフローが変化しない旨の以前に生成された予測を廃棄するステップを含む、
    ことを特徴とする請求項1に記載の方法。
  7. 前記最初の条件付き分岐命令の各実行に応答してプログラム命令の実行を制御するフローが変化する回数を決定するために前記依存ベクトルが利用可能になった時に、該依存ベクトルを使用するステップをさらに含む、
    ことを特徴とする請求項1に記載の方法。
  8. 前記最初の条件付き分岐命令の予測を抑制するステップが、前記依存ベクトルが利用可能になるまで新たな命令が実行パイプライン内にフェッチされるのを防ぐステップを含む、
    ことを特徴とする請求項1に記載の方法。
  9. 前記最初の条件付き分岐命令の予測を抑制するステップが、前記依存ベクトルが利用可能になるまで新たな命令が実行されるのを防ぐステップを含む、
    ことを特徴とする請求項1に記載の方法。
  10. 請求項1〜9のいずれかに記載のステップを実行するための1又はそれ以上の手段を備える、
    ことを特徴とするプロセッサ。
  11. 実行命令を選択的にフェッチするように構成されたフェッチユニットと、
    前記フェッチユニットに結合されて、述語生成命令に続く最初の条件付き分岐命令を検出するように構成された予測ユニットを備え、前記最初の条件付き分岐命令は、選択時に後方に分岐し、前記述語生成命令は、実行時に、依存ベクトルに依存する述語ベクトルを生成し、前記依存ベクトルの各要素は、ベクトル命令の要素間にデータ依存が存在するかどうかを示す指標を含み、
    前記予測ユニットは、前記最初の条件付き分岐命令の予測精度の指示を生成するように構成されるとともに、
    前記最初の条件付き分岐命令の予測精度が閾値を満たさないと判断したことに応答して、前記述語生成命令が依存する前記依存ベクトルが利用可能になるまで前記最初の条件付き分岐命令の予測を抑制するように構成される、
    ことを特徴とするプロセッサ。
  12. 前記予測ユニットが、前記依存ベクトル内に示されるデータ依存情報を受け取ったことに応答して、前記最初の条件付き分岐命令を予測するように構成される、
    ことを特徴とする請求項11に記載のプロセッサ。
  13. 前記フェッチユニットが、前記依存ベクトルが利用可能になるのを待っている間にストールするように構成される、
    ことを特徴とする請求項11に記載のプロセッサ。
  14. 前記フェッチユニットに結合されて、前記依存ベクトルが利用可能になるのを待っている間に文脈を切り換えるように構成された実行ユニットをさらに備える、
    ことを特徴とする請求項11に記載のプロセッサ。
  15. 前記予測ユニットが、前記最初の条件付き分岐の予測を生成するように構成されるとともに、前記最初の条件付き分岐の予測を抑制するために、前記最初の条件付き分岐命令の予測精度が前記閾値を満たさないと判断したことに応答して、前記最初の条件付き分岐命令の予測を廃棄するように構成される、
    ことを特徴とする請求項11に記載のプロセッサ。
  16. 前記最初の条件付き分岐命令が、命令ループの境界を定め、前記依存ベクトルが、前記命令ループが実行される回数を示す、
    ことを特徴とする請求項11に記載のプロセッサ。
  17. 前記予測ユニットが、前記依存ベクトルが利用可能であることを検出したことに応答して、ループフェッチ指示を与えるように構成され、前記フェッチユニットが、前記ループフェッチ指示を受け取ったことに応答して、前記命令ループの各反復のための命令をフェッチするように構成される、
    ことを特徴とする請求項16に記載のプロセッサ。
  18. 前記最初の条件付き分岐命令の予測を抑制するために、前記予測ユニットが、前記依存ベクトルが利用可能になるまで新たな命令の実行を防ぐようにさらに構成される、
    ことを特徴とする請求項11に記載のプロセッサ。
  19. 前記述語生成命令が、マクロスカラのGeneratePredicates命令である、
    ことを特徴とする請求項11に記載のプロセッサ。
  20. プログラム命令を記憶するように構成されたメモリと、
    前記メモリに結合された、請求項11から19のいずれかに記載のプロセッサの1又はそれ以上のインスタンスと、
    を備えることを特徴とするシステム。
JP2013087861A 2012-04-02 2013-04-02 ベクトル分割ループの性能の向上 Pending JP2013254484A (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US13/437,482 US9116686B2 (en) 2012-04-02 2012-04-02 Selective suppression of branch prediction in vector partitioning loops until dependency vector is available for predicate generating instruction
US13/437,482 2012-04-02

Publications (2)

Publication Number Publication Date
JP2013254484A true JP2013254484A (ja) 2013-12-19
JP2013254484A5 JP2013254484A5 (ja) 2015-01-22

Family

ID=48044642

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013087861A Pending JP2013254484A (ja) 2012-04-02 2013-04-02 ベクトル分割ループの性能の向上

Country Status (8)

Country Link
US (1) US9116686B2 (ja)
EP (1) EP2648090A3 (ja)
JP (1) JP2013254484A (ja)
KR (1) KR101511837B1 (ja)
CN (1) CN103383640B (ja)
BR (1) BR102013007865A2 (ja)
TW (1) TWI512617B (ja)
WO (1) WO2013151861A1 (ja)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014182796A (ja) * 2013-03-15 2014-09-29 Intel Corp 書き込みマスク・レジスタの末尾の最下位マスキング・ビットを判定するためのシステム、装置、および方法
JP2017509064A (ja) * 2014-03-28 2017-03-30 インテル・コーポレーション マスクド結果要素に伝搬する対応アンマスクド結果要素にソース要素を記憶するプロセッサ、方法、システム、及び命令
JP2018500659A (ja) * 2014-12-23 2018-01-11 インテル・コーポレーション 高速ベクトルによる動的なメモリ競合検出
US10223113B2 (en) 2014-03-27 2019-03-05 Intel Corporation Processors, methods, systems, and instructions to store consecutive source elements to unmasked result elements with propagation to masked result elements
JP2022500777A (ja) * 2018-09-18 2022-01-04 アドバンスト・マイクロ・ディバイシズ・インコーポレイテッドAdvanced Micro Devices Incorporated ループ終了予測を用いたプロセッサのループモードの促進又は抑制

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10241793B2 (en) 2013-03-15 2019-03-26 Analog Devices Global Paralleizing loops in the presence of possible memory aliases
GB2519107B (en) 2013-10-09 2020-05-13 Advanced Risc Mach Ltd A data processing apparatus and method for performing speculative vector access operations
GB2519108A (en) 2013-10-09 2015-04-15 Advanced Risc Mach Ltd A data processing apparatus and method for controlling performance of speculative vector operations
US10289417B2 (en) * 2014-10-21 2019-05-14 Arm Limited Branch prediction suppression for blocks of instructions predicted to not include a branch instruction
GB2540941B (en) * 2015-07-31 2017-11-15 Advanced Risc Mach Ltd Data processing
GB2545248B (en) 2015-12-10 2018-04-04 Advanced Risc Mach Ltd Data processing
GB2548602B (en) * 2016-03-23 2019-10-23 Advanced Risc Mach Ltd Program loop control
GB2549737B (en) * 2016-04-26 2019-05-08 Advanced Risc Mach Ltd An apparatus and method for managing address collisions when performing vector operations
GB2571527B (en) * 2018-02-28 2020-09-16 Advanced Risc Mach Ltd Data processing
US11860996B1 (en) 2018-04-06 2024-01-02 Apple Inc. Security concepts for web frameworks
US11403256B2 (en) * 2019-05-20 2022-08-02 Micron Technology, Inc. Conditional operations in a vector processor having true and false vector index registers
US11507374B2 (en) 2019-05-20 2022-11-22 Micron Technology, Inc. True/false vector index registers and methods of populating thereof
US11327862B2 (en) 2019-05-20 2022-05-10 Micron Technology, Inc. Multi-lane solutions for addressing vector elements using vector index registers
US11340904B2 (en) 2019-05-20 2022-05-24 Micron Technology, Inc. Vector index registers
CN115113934B (zh) * 2022-08-31 2022-11-11 腾讯科技(深圳)有限公司 指令处理方法、装置、程序产品、计算机设备和介质

Citations (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH1185515A (ja) * 1997-09-10 1999-03-30 Ricoh Co Ltd マイクロプロセッサ
JP2000322257A (ja) * 1999-05-10 2000-11-24 Nec Corp 条件分岐命令の投機的実行制御方法
US20010032308A1 (en) * 1998-08-04 2001-10-18 Grochowski Edward T. Method and apparatus for performing predicate prediction
WO2008029450A1 (fr) * 2006-09-05 2008-03-13 Fujitsu Limited Dispositif de traitement d'informations comprenant un mécanisme de correction d'erreur de prédiction d'embranchement
JP2008529191A (ja) * 2005-02-03 2008-07-31 クゥアルコム・インコーポレイテッド 電力的に効率的な命令プリフェッチ機構
US20100042807A1 (en) * 2008-08-15 2010-02-18 Apple Inc. Increment-propagate and decrement-propagate instructions for processing vectors
JP2010152843A (ja) * 2008-12-26 2010-07-08 Nec Corp 分岐予測の信頼度見積もり回路及びその方法
JP2010524107A (ja) * 2007-04-10 2010-07-15 インターナショナル・ビジネス・マシーンズ・コーポレーション プロセッサによる電力消費を低減する方法、プロセッサ、及び、情報処理システム
US20100325398A1 (en) * 2008-08-15 2010-12-23 Apple Inc. Running-min and running-max instructions for processing vectors
US20100325399A1 (en) * 2008-08-15 2010-12-23 Apple Inc. Vector test instruction for processing vectors
US20100325483A1 (en) * 2008-08-15 2010-12-23 Apple Inc. Non-faulting and first-faulting instructions for processing vectors
US20110035567A1 (en) * 2008-08-15 2011-02-10 Apple Inc. Actual instruction and actual-fault instructions for processing vectors
US20110035568A1 (en) * 2008-08-15 2011-02-10 Apple Inc. Select first and select last instructions for processing vectors
US20110093681A1 (en) * 2008-08-15 2011-04-21 Apple Inc. Remaining instruction for processing vectors
US20110113217A1 (en) * 2008-08-15 2011-05-12 Apple Inc. Generate predictes instruction for processing vectors
US20110276782A1 (en) * 2008-08-15 2011-11-10 Apple Inc. Running subtract and running divide instructions for processing vectors
US20110283092A1 (en) * 2008-08-15 2011-11-17 Apple Inc. Getfirst and assignlast instructions for processing vectors
US20120060020A1 (en) * 2008-08-15 2012-03-08 Apple Inc. Vector index instruction for processing vectors
JP2013175201A (ja) * 2012-02-24 2013-09-05 Apple Inc ゼロ述語分岐予測ミスにおける分岐予測ミス振舞い抑制

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5228131A (en) * 1988-02-24 1993-07-13 Mitsubishi Denki Kabushiki Kaisha Data processor with selectively enabled and disabled branch prediction operation
US5903750A (en) 1996-11-20 1999-05-11 Institute For The Development Of Emerging Architectures, L.L.P. Dynamic branch prediction for branch instructions with multiple targets
US6988183B1 (en) 1998-06-26 2006-01-17 Derek Chi-Lan Wong Methods for increasing instruction-level parallelism in microprocessors and digital system
WO2000011548A1 (en) * 1998-08-24 2000-03-02 Advanced Micro Devices, Inc. Mechanism for load block on store address generation and universal dependency vector
US7159099B2 (en) 2002-06-28 2007-01-02 Motorola, Inc. Streaming vector processor with reconfigurable interconnection switch
US7571302B1 (en) 2004-02-04 2009-08-04 Lei Chen Dynamic data dependence tracking and its application to branch prediction
US20060168432A1 (en) 2005-01-24 2006-07-27 Paul Caprioli Branch prediction accuracy in a processor that supports speculative execution
US20070288732A1 (en) * 2006-06-08 2007-12-13 Luick David A Hybrid Branch Prediction Scheme
US8006070B2 (en) 2007-12-05 2011-08-23 International Business Machines Corporation Method and apparatus for inhibiting fetch throttling when a processor encounters a low confidence branch instruction in an information handling system
US20100115233A1 (en) 2008-10-31 2010-05-06 Convey Computer Dynamically-selectable vector register partitioning
US8521996B2 (en) 2009-02-12 2013-08-27 Via Technologies, Inc. Pipelined microprocessor with fast non-selective correct conditional branch instruction resolution
US9176737B2 (en) 2011-02-07 2015-11-03 Arm Limited Controlling the execution of adjacent instructions that are dependent upon a same data condition

Patent Citations (27)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH1185515A (ja) * 1997-09-10 1999-03-30 Ricoh Co Ltd マイクロプロセッサ
US20010032308A1 (en) * 1998-08-04 2001-10-18 Grochowski Edward T. Method and apparatus for performing predicate prediction
JP2000322257A (ja) * 1999-05-10 2000-11-24 Nec Corp 条件分岐命令の投機的実行制御方法
JP2008529191A (ja) * 2005-02-03 2008-07-31 クゥアルコム・インコーポレイテッド 電力的に効率的な命令プリフェッチ機構
WO2008029450A1 (fr) * 2006-09-05 2008-03-13 Fujitsu Limited Dispositif de traitement d'informations comprenant un mécanisme de correction d'erreur de prédiction d'embranchement
JP2010524107A (ja) * 2007-04-10 2010-07-15 インターナショナル・ビジネス・マシーンズ・コーポレーション プロセッサによる電力消費を低減する方法、プロセッサ、及び、情報処理システム
US20100049951A1 (en) * 2008-08-15 2010-02-25 Apple Inc. Running-and, running-or, running-xor, and running-multiply instructions for processing vectors
US20100325399A1 (en) * 2008-08-15 2010-12-23 Apple Inc. Vector test instruction for processing vectors
US20100042789A1 (en) * 2008-08-15 2010-02-18 Apple Inc. Check-hazard instructions for processing vectors
US20100042816A1 (en) * 2008-08-15 2010-02-18 Apple Inc. Break, pre-break, and remaining instructions for processing vectors
US20100042817A1 (en) * 2008-08-15 2010-02-18 Apple Inc. Shift-in-right instructions for processing vectors
US20100049950A1 (en) * 2008-08-15 2010-02-25 Apple Inc. Running-sum instructions for processing vectors
US20100042815A1 (en) * 2008-08-15 2010-02-18 Apple Inc. Method and apparatus for executing program code
US20100058037A1 (en) * 2008-08-15 2010-03-04 Apple Inc. Running-shift instructions for processing vectors
US20120060020A1 (en) * 2008-08-15 2012-03-08 Apple Inc. Vector index instruction for processing vectors
US20100042807A1 (en) * 2008-08-15 2010-02-18 Apple Inc. Increment-propagate and decrement-propagate instructions for processing vectors
US20100325398A1 (en) * 2008-08-15 2010-12-23 Apple Inc. Running-min and running-max instructions for processing vectors
US20100042818A1 (en) * 2008-08-15 2010-02-18 Apple Inc. Copy-propagate, propagate-post, and propagate-prior instructions for processing vectors
US20100325483A1 (en) * 2008-08-15 2010-12-23 Apple Inc. Non-faulting and first-faulting instructions for processing vectors
US20110035567A1 (en) * 2008-08-15 2011-02-10 Apple Inc. Actual instruction and actual-fault instructions for processing vectors
US20110035568A1 (en) * 2008-08-15 2011-02-10 Apple Inc. Select first and select last instructions for processing vectors
US20110093681A1 (en) * 2008-08-15 2011-04-21 Apple Inc. Remaining instruction for processing vectors
US20110113217A1 (en) * 2008-08-15 2011-05-12 Apple Inc. Generate predictes instruction for processing vectors
US20110276782A1 (en) * 2008-08-15 2011-11-10 Apple Inc. Running subtract and running divide instructions for processing vectors
US20110283092A1 (en) * 2008-08-15 2011-11-17 Apple Inc. Getfirst and assignlast instructions for processing vectors
JP2010152843A (ja) * 2008-12-26 2010-07-08 Nec Corp 分岐予測の信頼度見積もり回路及びその方法
JP2013175201A (ja) * 2012-02-24 2013-09-05 Apple Inc ゼロ述語分岐予測ミスにおける分岐予測ミス振舞い抑制

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
SRILATHA MANNE, ARTUR KLAUSER, DIRK GRUNWALD: "Pileline Gating : Speculation Control For Energy Reduction", PROCEEDINGS OF THE 25TH ANNUAL INTERNATIONAL SYMPOSIUM ON COMPUTER ARCHITECTURE, JPN6014033282, 27 June 1998 (1998-06-27), pages 132 - 141, ISSN: 0002871129 *

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014182796A (ja) * 2013-03-15 2014-09-29 Intel Corp 書き込みマスク・レジスタの末尾の最下位マスキング・ビットを判定するためのシステム、装置、および方法
US10223113B2 (en) 2014-03-27 2019-03-05 Intel Corporation Processors, methods, systems, and instructions to store consecutive source elements to unmasked result elements with propagation to masked result elements
JP2017509064A (ja) * 2014-03-28 2017-03-30 インテル・コーポレーション マスクド結果要素に伝搬する対応アンマスクド結果要素にソース要素を記憶するプロセッサ、方法、システム、及び命令
US10223119B2 (en) 2014-03-28 2019-03-05 Intel Corporation Processors, methods, systems, and instructions to store source elements to corresponding unmasked result elements with propagation to masked result elements
JP2018500659A (ja) * 2014-12-23 2018-01-11 インテル・コーポレーション 高速ベクトルによる動的なメモリ競合検出
JP2022500777A (ja) * 2018-09-18 2022-01-04 アドバンスト・マイクロ・ディバイシズ・インコーポレイテッドAdvanced Micro Devices Incorporated ループ終了予測を用いたプロセッサのループモードの促進又は抑制
JP7301955B2 (ja) 2018-09-18 2023-07-03 アドバンスト・マイクロ・ディバイシズ・インコーポレイテッド ループ終了予測を用いたプロセッサのループモードの促進又は抑制

Also Published As

Publication number Publication date
EP2648090A3 (en) 2017-11-01
CN103383640A (zh) 2013-11-06
TW201403470A (zh) 2014-01-16
WO2013151861A1 (en) 2013-10-10
US9116686B2 (en) 2015-08-25
CN103383640B (zh) 2016-02-10
KR20130112009A (ko) 2013-10-11
US20130262833A1 (en) 2013-10-03
EP2648090A2 (en) 2013-10-09
BR102013007865A2 (pt) 2015-07-07
KR101511837B1 (ko) 2015-04-13
TWI512617B (zh) 2015-12-11

Similar Documents

Publication Publication Date Title
KR101511837B1 (ko) 벡터 분할 루프들의 성능 향상
KR101417597B1 (ko) 제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제
US8359460B2 (en) Running-sum instructions for processing vectors using a base value from a key element of an input vector
US8417921B2 (en) Running-min and running-max instructions for processing vectors using a base value from a key element of an input vector
US8793472B2 (en) Vector index instruction for generating a result vector with incremental values based on a start value and an increment value
US8271832B2 (en) Non-faulting and first-faulting instructions for processing vectors
US8447956B2 (en) Running subtract and running divide instructions for processing vectors
TWI494851B (zh) 用於推測式述詞指令之功能單元、處理器及方法
US8959316B2 (en) Actual instruction and actual-fault instructions for processing vectors
US8984262B2 (en) Generate predicates instruction for processing vectors
US9182959B2 (en) Predicate count and segment count instructions for processing vectors
US9389860B2 (en) Prediction optimizations for Macroscalar vector partitioning loops
US20110035568A1 (en) Select first and select last instructions for processing vectors
US20100325399A1 (en) Vector test instruction for processing vectors
US20110283092A1 (en) Getfirst and assignlast instructions for processing vectors
US9715386B2 (en) Conditional stop instruction with accurate dependency detection
US20130318332A1 (en) Branch misprediction behavior suppression using a branch optional instruction
US9390058B2 (en) Dynamic attribute inference

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20140806

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20141105

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20141110

A524 Written submission of copy of amendment under article 19 pct

Free format text: JAPANESE INTERMEDIATE CODE: A524

Effective date: 20141202

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20150105