JP6236093B2 - 並列パイプラインにおいてブランチを分岐するためのハードウェアおよびソフトウェアソリューション - Google Patents

並列パイプラインにおいてブランチを分岐するためのハードウェアおよびソフトウェアソリューション Download PDF

Info

Publication number
JP6236093B2
JP6236093B2 JP2015555420A JP2015555420A JP6236093B2 JP 6236093 B2 JP6236093 B2 JP 6236093B2 JP 2015555420 A JP2015555420 A JP 2015555420A JP 2015555420 A JP2015555420 A JP 2015555420A JP 6236093 B2 JP6236093 B2 JP 6236093B2
Authority
JP
Japan
Prior art keywords
instruction
given
instructions
processor
lane
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.)
Active
Application number
JP2015555420A
Other languages
English (en)
Other versions
JP2016504699A (ja
Inventor
ヤズダニ レザ
ヤズダニ レザ
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.)
Advanced Micro Devices Inc
Original Assignee
Advanced Micro Devices 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 Advanced Micro Devices Inc filed Critical Advanced Micro Devices Inc
Publication of JP2016504699A publication Critical patent/JP2016504699A/ja
Application granted granted Critical
Publication of JP6236093B2 publication Critical patent/JP6236093B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • 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
    • G06F9/3818Decoding for concurrent execution
    • G06F9/3822Parallel decoding, e.g. parallel decode units
    • 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/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
    • 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/3853Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution of compound 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
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • 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/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • G06F9/38873Iterative single instructions for multiple data lanes [SIMD]

Landscapes

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

Description

本開示は、コンピューティングシステムに関し、より詳細には、プロセッサ内のハードウェア並列実行レーンで命令を効率的に処理することに関する。
コンピュータシステムのスループットを向上させるために、タスクの並列化が用いられている。この目的のために、コンパイラは、並列化されたタスクをプログラムコードから抽出して、システムハードウェア上で並行して実行し得る。ハードウェア上での並列実行を向上するために、プロセッサは、複数の並列実行レーン(例えば、単一命令複数語(SIMD)マイクロアーキテクチャ内など)を含み得る。このタイプのマイクロアーキテクチャは、特定のソフトウェアアプリケーションに対して、単一レーンのマイクロアーキテクチャまたは汎用マイクロアーキテクチャよりも高い命令スループットを提供し得る。SIMDマイクロアーキテクチャから恩恵を受けるタスクのいくつかの例は、ビデオグラフィックスレンダリング、暗号化、およびガーベジコレクションを含む。
多くの場合、特定のソフトウェアアプリケーションは、各作業項目の実行や並列関数呼出しがその内部のデータ依存となるようなデータ並列処理を有する。例えば、第1の作業項目が第2の作業項目から独立したデータである場合には、第1および第2の作業項目の各々は、SIMDマイクロアーキテクチャ内の別個の並列実行レーン上に同時にスケジューリングされている。しかし、第1および第2の作業項目の各々で実行されるある量の命令は、データ依存の場合がある。分岐命令として実装された条件テストは、第1の作業項目に対してパスし得るが、各作業項目に対するデータに依存する第2の作業項目に対しては不合格になり得る。
第2の作業項目が、実行を停止して、第1の作業項目が進行中の実行を継続するのを待機するので、並列実行の効率が低下し得る。パスしたテストに起因して2〜3の作業項目だけが実行を継続し、他方、不合格になったテストのために、ほとんどの作業項目がアイドルである場合には、効率の悪さが増大する。
プロセッサ内のハードウェア並列実行レーンで命令を効率的に処理するためのシステムおよび方法を検討する。様々な実施形態では、バックエンドコンパイラは、ソフトウェアアプリケーションのプログラム命令を検査して、ターゲットプロセッサ上で命令を効率的に処理するように、命令を配置してコードを生成する。ターゲットプロセッサは、単一命令複数データ(SIMD)マイクロアーキテクチャ内に複数の並列実行レーンを含んでもよい。コンパイラは、ループと、対応する基本ブロックとを識別してもよい。ループ内の分岐点は、分岐命令を含んでもよい。例えば、if−elseif−else構成、if−else構成、case構成などが、識別されたループ内のプログラム命令で使用されてもよい。分岐点と対応する収束点との間での、翻訳されコンパイルされたプログラム命令の実行中に、複数のトレースパスがトラバースされてもよい。
コンパイル中、識別されたループ内の所与の分岐点に応じて、コンパイラは、識別されたループ内の命令を、1つ以上の超大命令語(VLIW:very large instruction word)に配置してもよい。少なくとも1つのVLIWは、所与の分岐点と対応する収束点との間の異なる基本ブロックから混ぜ合わされた命令を含んでもよい。例えば、4つの命令を有する基本ブロックAと、6つの命令を有する基本ブロックBとが、所与の分岐点と対応する収束点との間に存在する場合には、コンパイラは、命令を6つのVLIW内に配置してもよい。最初の4つのVLIWは、基本ブロックAおよび基本ブロックBの各々から1つの命令を含んでもよい。第1のVLIWは、基本ブロックAおよび基本ブロックBの各々からの第1の命令を含んでもよい。第2のVLIWは、基本ブロックAおよび基本ブロックBの各々からの第2の命令を含んでもよく、以下同様である。最後の2つのVLIWは、nop(ノーオペレーション)とともにグループ化された基本ブロックBからの命令を含んでもよい。コンパイラは、各VLIWをポイントするプログラムカウンタ(PC)値を追跡してもよい。
コンパイラは、翻訳されコンパイルされた命令で、挿入するためのコードを生成してもよい。挿入されたコードは、実行される際に、所与のVLIW内の命令を、ターゲットプロセッサ内の複数の並列実行レーンに実行時に割り当ててもよい。所与のレーンに対する割り当ては、実行時に、所与の分岐点で、所与のレーンに対して見つかった分岐方向に基づいてもよい。前述の例を続けると、VLIWが、基本ブロックAおよび基本ブロックBから生成された第2のVLIWであって、所与のレーンに対する分岐命令が選択された場合には、所与のレーンは、第2のVLIW内の基本ブロックA内の第2の命令が割り当てられてもよい。分岐命令が選択されない場合には、所与のレーンは、第2のVLIW内の基本ブロックB内の第2の命令が割り当てられてもよい。様々な実施形態では、VLIWは可変長である。挿入されたコードは、実行される際に、次のPCに対応するVLIWのサイズを更新してもよい。
いくつかの実施形態では、プロセッサは、単一命令複数データ(SIMD)マイクロアーキテクチャ内に複数の並列実行レーンを含む。プロセッサは、可変長VLIWのサイズを格納するためのサイズレジスタを含んでもよい。プロセッサ内の制御ロジックは、格納したサイズに等しい所与のVLIW内のいくつかの命令を、それぞれのサイクル内でフェッチして復号してもよい。複数の実行レーンは、所与のVLIW内でいくつかの命令を同時に実行してもよい。さらに、プロセッサは、複数の実行レーンのうち対応するレーンと関連付けられたビット範囲を有するベクトルレジスタを含んでもよい。ビット範囲はオフセットを格納してもよい。所与のオフセットは、実行するために関連付けられたレーンに対してフェッチされたVLIW内の所与の命令を識別してもよい。
これらの実施形態および他の実施形態は、以下の記載および図面を参照することによって、さらに理解されるであろう。
単一命令複数データ(SIMD)パイプライン実行フローの一実施形態の一般化されたブロック図である。 制御フローグラフの一実施形態の一般化されたブロック図である。 制御フローグラフに対する実行順序の一実施形態の一般化されたブロック図である。 プロセッサに対するSIMDマイクロアーキテクチャの論理レイアウトの一実施形態の一般化されたブロック図である。 オブジェクトコード配置の一実施形態の一般化されたブロック図である。 コンパイラ技術を用いて、プロセッサ内で複数の作業項目の並列実行を最適化するための方法の一実施形態の一般化されたフロー図である。 ハードウェア技術を用いて、プロセッサ内で複数の作業項目の並列実行を最適化するための方法の一実施形態の一般化されたフロー図である。 オブジェクトコード配置の別の実施形態の一般化されたブロック図である。
実施形態は、様々な修正および代替形式を受け入れる余地があるが、特定の実施形態が例として図面に示され、本明細書で詳細に説明されている。しかし、図面およびそれに関する詳細な説明は、実施形態が、開示された特定の形式に限定されることを意図しておらず、それとは逆に、添付の請求項によって定義されるように、実施形態の趣旨および範囲に含まれる全ての修正、均等物および代替手段を包含することが理解されるべきである。
以下の記載では、実施形態の完全な理解を提供するために、多数の具体的な詳細が記載されている。しかし、当業者は、これらの具体的な詳細なしに、実施形態が実施され得ることを理解するはずである。いくつかの場合には、実施形態を曖昧にするのを避けるために、周知の回路、構造および技術が詳細に示されていない。
図1を参照すると、単一命令複数データ(SIMD)パイプライン実行フロー100の一実施形態を示す一般化されたブロック図が示されている。命令102〜108はフェッチされ、関連するデータと共にSIMDパイプラインに送信されてもよい。並列で垂直な実行レーン内の複数の計算ユニットが示されている。いくつかの計算ユニットは、アクティブな計算ユニット110である。他の計算ユニットは、所与のパイプステージ中に無効にされていることに起因する、非アクティブな計算ユニット112である。制御ロジックおよび記憶素子(例えば、パイプラインレジスタなど)は、説明を容易にするために示されていない。
ハードウェア計算ユニットは、関連付けられたデータを使用して、所与の作業項目の所与の命令の実行を行うハードウェアを含む。このハードウェアは、加算、乗算、ゼロ検出、ビット単位シフト、除算、ビデオグラフィックスおよびマルチメディア命令、または、プロセッサ設計の当業者に周知の他の操作を実行するように構成された演算論理装置を含んでもよい。SIMDパイプライン内に並列実行レーンを有するプロセッサの例は、グラフィック処理装置(GPU)、デジタル信号処理(DSP)などを含む。一実施形態では、SIMDパイプラインは、ビデオカード上に配置されてもよい。別の実施形態では、SIMDパイプラインは、マザーボード上に統合されてもよい。
SIMDパイプラインは、ゲーム、エンタテインメント、科学および医療分野で使用される多種多様なデータ並列アプリケーションに対する計算性能を向上させ得る。かかるアプリケーションは、一般に、多数のオブジェクトについて同じプログラムを実行することを伴う。各オブジェクトは、他のオブジェクトと関係なく処理されるが、同じ順序の操作が使用されるので、SIMDマイクロアーキテクチャは、相当な性能強化を提供する。GPUは、非グラフィック計算用にも想定されている。
ソフトウェアアプリケーションは、関数呼出しまたは計算カーネルの集合、および、内部関数の集合を含んでもよい。ソフトウェアプログラマは、関数呼出しを定義してもよく、他方、内部関数は所与のライブラリ内で定義されてもよい。例えば、ソフトウェアアプリケーションは、例えば画像ファイルなどの2次元(2D)配列のデータのデータ処理を実行し得る。ソフトウェアアプリケーションは、ソフトウェアプログラマによって開発されたアルゴリズムを、2D画像の画素ごとまたは2次元行列の要素ごとに、実行し得る。所与の関数呼出しは、インデックス空間を介して呼び出されてもよい。インデックス空間は、次元空間とも呼ばれ得る。データ並列ソフトウェアアプリケーションに対して、N次元計算領域は、1、2もしくは3次元空間、または、インデックス空間を定義してもよい。一例は、2D画像内の画素である。
関数呼出しは、データの1つ以上のレコードと照合されて、1つ以上の計算の作業項目を生成してもよい。従って、2つ以上の作業項目は、単一の関数呼出しの同じ命令を利用し得るが、データの異なるレコードについて動作し得る。関数呼出しは、フォーク(fork)を生成する制御フロー転送命令を含んでもよく、他方、コンピュータプログラム内のフォークは、通常、共通の定義によってソフトウェアスレッドを生成する。インデックス空間内の所与の時点における関数呼出しの所与のインスタンスが、「作業項目」と呼ばれてもよい。作業項目は、作業ユニットとも呼ばれてよい。前述の例を続けると、作業項目は、2D画像の所与の画素(所与のインデックス)に対応するデータのレコードについて、関数呼出し内の1つ以上の命令で動作してもよい。通常、作業項目は、関連付けられた一意の識別子(ID)を有する。
インデックス空間は、十分なハードウェアサポートがある場合に並行して実行する作業項目の総数を定義してもよい。例えば、インデックス空間は、280の数の作業項目を定義してもよいが、GPUは、いつでも64の作業項目の同時実行をサポートし得る。作業項目の総数は、グローバルな作業サイズを定義し得る。作業項目は、さらに作業グループにグループ化され得る。各作業グループは、一意の識別子(ID)を有してもよい。所与の作業グループ内の作業項目は、相互に通信して、実行を同期させ、メモリアクセスを調整することが可能であってよい。いくつかの作業項目は、SIMD方式でGPU上での同時実行のためにウェーブフロント(wave front)にクラスタ化されてもよい。280の総作業項目に対する前述の例に関して、ウェーブフロントは64の作業項目を含んでもよい。
命令102〜108は、フェッチされて、関連付けられたデータと共にSIMDパイプラインに入ってもよい。命令104は、例えば条件分岐などの制御フロー転送命令であってよい。命令106は、条件が真の場合に実行されるパス内の第1の命令であってよい。命令108は、条件が偽の場合に実行されるパス内の第1の命令であってよい。例えば、分岐命令104は、高水準言語プログラムにおけるIF文と関連付けられてもよい。命令106は、高水準言語プログラムにおけるTHEN文と関連付けられてもよい。命令108は、高水準言語プログラムにおけるELSE文と関連付けられてもよい。
所与の行内の各計算ユニットは、同じ計算ユニットであってよい。これらの計算ユニットの各々は、同じ命令であるが、異なる作業項目と関連付けられた異なるデータについて動作してもよい。図に示すように、いくつかの作業項目は、条件分岐命令104によって提供されたテストをパスし、他の作業項目はテストに不合格になる。SIMDパイプライン内の制御ロジックは、利用可能なパスの各々を実行して、現在のパスを選択しなかった作業項目に対応する実行ユニット(例えば、計算ユニットなど)を選択的に無効にしてもよい。例えば、If−Then−Else構成文の実行中、SIMDアーキテクチャの各列内には、「Then」(パスA)および「Else」(パスB)のパスを実行するように構成された実行ユニットがある。
第1および第2の作業項目が実行を停止して、第3の作業項目が進行中の実行を継続するのを待機すると、並列実行の効率が低下し得る。従って、分岐命令104の実行後、所与の行における全ての計算ユニットがアクティブな計算ユニット110というわけではない。図に示すように、1つ以上の計算ユニットは、実行に関して無効にされた非アクティブな計算ユニット112である。多数の計算ユニットが所与のパイプステージ中に非アクティブである場合には、SIMDコアの効率およびスループットが低下する。一実施形態では、「Else」パスは、関数呼出しに対するリターン(return)である。関数呼出しの実行が終了して、対応する作業項目がアイドルになる。しかし、SIMDコア内の隣接する作業項目は、実行を継続してもよい。
ここで図2を参照すると、制御フローグラフ200の一実施形態を示す一般化されたブロック図が示されている。一般的に言えば、制御フローグラフは、コンパイラ最適化器および静的解析ツールによって使用され得る。制御フローグラフ200は、プログラムまたはプログラムの一部が、その実行中にトラバースされ得る全てのパスを表し得る。制御フローグラフでは、グラフ内の各ノードは、基本ブロックを表している。ほとんどの表現は、制御が制御フローグラフに入るための入口ブロックと、制御が制御フローグラフを出るための出口ブロックと、を含む。
コンパイル中、ソフトウェアアプリケーションは、基本ブロック0(BB 0)から基本ブロック7(BB 7)まで番号付けされた8つの基本ブロック(BB)を有する制御フローグラフ200を提供し得る。8つの基本ブロックが示されているが、他の例では、別の数の基本ブロックが使用され得る。制御フローグラフ200において、基本ブロック1が入口ブロックであり、基本ブロック6が出口ブロックである。基本ブロック0〜7の各々は、1つの入口点と1つの出口点とを有する命令のストレートラインシーケンスである。制御フローグラフ200は、ループを表してもよい。ループの内部では、制御フローグラフ200は、基本ブロック1〜4を有するIF−THEN−ELSE構成と、基本ブロック4〜6を有するIF構成と、を表してもよい。
ここで図3を参照すると、制御フローグラフに対する実行順序300の一実施形態を示す一般化されたブロック図が示されている。実行順序310は、既に示した制御フローグラフ200がSIMDパイプラインに割り当てられた場合の典型的な実行順序を表している。単一のループの繰返しに対する実行時間は、ループ内の各基本ブロック(例えば、BB 1〜BB 6など)の実行時間の合計である。しかし、所与の作業項目および対応するハードウェア実行レーンに対して、BB 2およびBB 3のうち1つのみが実行される。同様に、BB 5が所与の作業項目に対してスキップされ得る。特定の基本ブロックが所与の作業項目に対して実行されない可能性があるが、関連付けられた実行時間は、ループの繰返しに対する実行時間の総合計に寄与する。
実行順序320は、既に示した制御フローグラフ200が、修正されたSIMDパイプラインに割り当てられた場合の代替の実行順序を表している。単一のループの繰返しに対する実行時間は、ループ内の各基本ブロックの実行時間の合計ではなく、単一のループの繰返し内で実際に実行された基本ブロックの実行時間の合計である。実行順序320は、制御フローグラフ200の実行を変換する。コンパイラは、ソースコードのオブジェクトコードへのコンパイル中に、この変換を実行し得る。
いくつかの実施形態では、コンパイラは、各基本ブロックの終わりにコードを生成し、そのコードは、実行される際に、次に実行する基本ブロックを識別する。生成コードは、基本ブロックの終わりに挿入され得る。あるいは、制御を次の基本ブロックに転送する前に、制御フローを追加のコードに転送するために、分岐命令が基本ブロックの終わりに挿入され得る。追加のコードは、中央基本ブロックを示すBB Cによって表される。実行時、分岐する基本ブロックの各々(例えば、BB 1、BB 4、BB 6など)は、制御の転送先となる次の基本ブロックを識別する。識別は、分岐解決に基づくものであり、分岐解決は、データの特定レコードおよび分岐命令にさらに基づいている。実行時、BB Cは、ターゲットの基本ブロックのアドレスを各作業項目から受信して、それぞれのターゲットの基本ブロックを実行するためのスレッドレジスタをセットアップする。SIMDパイプライン内で実行されている異なる作業項目にわたって、所与の作業項目は、分岐、ジャンプおよびケース文などのように、制御フロー転送命令に対する単一のターゲットを有する。
実行順序320では、BB 4の完了時に、第1の作業項目は、BB 5に分岐して、対応するアドレスをBB Cに渡し得る。BB 4の完了時に、第2の作業項目は、BB 6に分岐して、対応するアドレスをBB Cに渡し得る。コンパイラは、同時に実行される各ターゲット基本ブロックからの命令を含む、動的超大命令語(DVLIW)を生成し得る。実行される際に、コンパイラによって生成されたコードは、次のプログラムカウンタ(PC)値に応じて実行する次のDVLIWのサイズを更新し得る。加えて、実行される際に、生成されたコードは、所与の並列実行レーン内で実行されている所与の作業項目と、実行する次のDVLIW内の命令へのポインタとの間のマッピングを更新し得る。ポインタは、次のDVLIW内の命令のうち関連付けられた命令であって、フェッチされる命令を識別しているオフセットであってよい。
図4を参照すると、プロセッサに対するSIMDマイクロアーキテクチャの論理レイアウト400の一実施形態を示す一般化されたブロック図が示されている。プロセッサは、データおよび命令を格納するためのダイナミックランダムアクセスメモリ(DRAM)450を有する。いくつかの実施形態では、所与のレベルのキャッシュメモリサブシステムが、DRAMに加えて使用される。図に示すように、プロセッサは、計算ユニットの行ごとに、制御ロジック420と一緒にグループ化された比較的小規模のキャッシュメモリサブシステム430を有してもよい。説明を簡略にするために、パイプラインレジスタなどの記憶素子は示されていないが、プロセッサ内のデータフローは、パイプライン化されてもよい。所与のパイプラインのステージでは、このステージ内の関連付けられた命令が、既に不合格になったテスト(例えば、選ばれなかった分岐など)に基づいて実行されない場合には、計算ユニットは使用されない可能性がある。
SIMDパイプラインは、レーンA〜Fを有する作業項目460を含む。レーンA〜Fの各々は、計算ユニットを含む垂直で並列なハードウェアレーンの各々に対応し得る。さらに、パイプラインは、ベクトルレジスタ462を含んでもよい。ベクトルレジスタ462は、並列実行レーンの各々に対して、エントリ、フィールドまたはビット範囲を含んでもよい。各エントリは、それぞれの作業項目上で実行している所与のトレースを識別するための第1のビット数と、特別コードをサポートするための第2のビット数と、を含むビット総数を含んでもよい。特別コードは、待ち状態またはスリープ状態、ループ終了状態、ループを終了するため以外の実行を停止するためのバリア識別子、イベント識別子などを識別してもよい。特別コードが所与のエントリ内に格納されない場合には、格納された値は、実行するために関連付けられたレーンについてDVLIW内の命令の各々を識別してもよい。
プログラムカウンタ(PC)レジスタ466は、i−キャッシュなどのメモリからフェッチするために、次のDVLIWをポイントしているポインタ値またはアドレスを格納してもよい。プロセッサは、DVLIWのサイズ、すなわち長さを格納するサイズレジスタ468をさらに含んでもよい。いくつかの実施形態では、サイズは、可変長DVLIW内の命令数を表す整数であってよい。
DVLIW 464内の命令Instr A〜Instr Gの各々は、制御フローグラフ内の実行トレースを表している。コンパイラは、DVLIWを、i−キャッシュなどのメモリ内に配置してもよい。一例では、作業項目460内のレーンBは、SIMDパイプライン内の左から2番目の垂直な実行レーンに対応し得る。ベクトルレジスタ462内に格納されたオフセットBは、レーンBと関連付けられて、DVLIW 464内の最初の命令をポイントし得るが、その命令は、Instr Aである。従って、レーンBは、Instr Aを受信して処理し得る。同様に、作業項目460内のレーンAは、SIMDパイプライン内の最も左の垂直な実行レーンに対応し得る。ベクトルレジスタ462内に格納されたオフセットAは、レーンAと関連付けられて、DVLIW 464内の最後の命令(Instr G)をポイントし得る。従って、レーンAは、Instr Gを受信して処理し得る。
図示していないが、命令キャッシュ(i−キャッシュ)は、DVLIWをサポートするための複数の実施態様のうち1つを含んでもよい。i−キャッシュは、DVLIWに対応する所与の単一のPCに対する1つ以上の命令をフェッチするための複数の小型のキャッシュを含んでもよい。同じPCは、DVLIWのサイズに応じて、小型のキャッシュのうち1つ以上のキャッシュ内の有効な命令をインデックスしてもよい。i−キャッシュは、PCレジスタ466内に格納されたポインタまたはアドレス値に加えて、サイズレジスタ468内に格納されたサイズを受信し得る。代替として、i−キャッシュは、同じ有効なキャッシュラインまたはキャッシュセット内の1つ以上の命令にアクセスするための複数のデータポートを有してもよい。この場合もやはり、フェッチする有効な命令の数は、サイズレジスタ468からの受信したサイズに等しい可能性がある。
ここで図5を参照すると、オブジェクトコード配置500を示す一実施形態の一般化されたブロック図が示されている。コード配置500は、図2および図3にそれぞれ示す、制御フローグラフ200および付随の実行順序320に対してコンパイラにより生成され得るオブジェクトコードレイアウトの一実施形態を示している。基本ブロックコード504は、各基本ブロックに対するコードを表す。例えば、基本ブロック0〜3,7に対するコードの1つのコピーが、レイアウト500内に配置されて示されている。基本ブロック4〜5に対するコードの2つのコピーが、レイアウト500内に配置され示されている。基本ブロック6に対するコードの4つのコピーが、レイアウト500内に示されている。
コード502は、ループなどの領域のエントリに対して、コンパイラによって生成および挿入され得る。後に実行される場合、コード502は、次のDVLIWのサイズを更新し、フェッチされたDVLIW内の命令と、ターゲットプロセッサ内の並列実行レーンとの間のマッピングを更新し得る。例えば、ターゲットプロセッサ内のサイズレジスタおよびベクトルレジスタは、それらに格納された内容を、実行されたコード502によって更新させてもよい。図に示すように、コード502は、基本ブロック0,1,7の開始時に挿入され得る。
コード506は、基本ブロック1,4,6などの分岐点に移行するために、コンパイラによって生成および挿入され得る。後に実行される場合、コード506は、DVLIWのサイズ変更、および、フェッチされたDVLIW内の命令とターゲットプロセッサ内の並列実行レーンとの間の対応するマッピング変更を判断し得る。従って、サイズおよびマッピングが、制御フローグラフ内の分岐点および収束点において更新される。コンパイラは、DVLIWのサイズが変わる点、および、マッピングが変わる点を識別する。第1のインデックスがトレース識別子(ID)を示し、第2のインデックスが基本ブロック(BB)IDを示す表記法BBC(0,1)を使用すると、コード506を挿入するための識別された点は、BBC(0,1)、BBC(0,4)、BBC(0,6)、BBC(1,4)、BBC(1,6)、BBC(2,6)およびBBC(3,6)に存在し得る。この例におけるトレースIDは、対応するオフセットと同じであってよい。
オブジェクトコード配置500の開始時に、コード502は、初期化ステップを実行して、DVLIWサイズを1に設定してもよい。ベクトルレジスタの各エントリ内のオフセットは、例えば0のオフセットなどのように、BB 0内の同じ命令をポイントするように設定され得る。従って、PCは、0または別の適切な開始アドレスに設定され得る。図に示すように、4つの可能な並列トレースが存在しているが、作業項目の数は独立であってよい。例えば、SIMDパイプラインは、割り当てられた作業項目を処理するための、8、16、64または別の数の並列実行レーンを有してもよい。SIMDパイプライン内の各作業項目は、ベクトルレジスタ内に格納された0のオフセットを有しており、同じ命令を実行し得る。各作業項目に対するこの同じ命令は、BB 0からの命令である。BB 0内の命令は、各作業項目によって1つずつ実行され、各命令フェッチの後にPCが増加する。
BB 0の実行が完了した後、ループ入口ブロックであるBB 1が次に処理される。コード502は、BB 1の開始時に、DVLIWサイズを1として保持し、各作業項目に対するオフセットを0として保持する。ベクトルレジスタのエントリの各々のオフセットは、例えば0のオフセットなどのように、BB 1内の同じ命令をポイントするように設定され得る。PCは、BB 0の完了時に増加された値のままであってよい。SIMDパイプライン内の各作業項目は、ベクトルレジスタ内に格納された0のオフセットを有しており、同じ命令を実行することになる。作業項目ごとのこの同じ命令は、BB 1からの命令である。BB 1内の命令は各作業項目によって1つずつ実行され、各命令のフェッチ後にPCが増加する。
実行される際に、コード506は、BB 1の終わりにあるBBC(0,1)において、格納されたDVLIWサイズを1から2に変更する。ここで、BB 3内の命令は、フェッチされたDVLIWに追加される。さらに、実行される際に、コード506は、BBC(0,1)にて、BB 3に分岐する作業項目に対するベクトルレジスタ内のエントリを、値1を格納するように設定する。BB 2に分岐する作業項目に対するベクトルレジスタ内のエントリは、0を継続して格納することにより、変更されないままである。0および1の値がこのように使用されるが、対応する指示およびマッピングを設定するために他の数値が使用されてもよい。この時点で、DVLIWは2つの命令を有し、これらは、2つの別個の基本ブロックBB 2およびBB 3から混ぜ合わされている。PCが継続して増加されるので、フェッチされたDVLIWは、BB 2の処理が完了するまで、これらの2つの基本ブロックからの混ぜ合わされた命令を含み続ける。コンパイラは、DVLIW内の命令の並列実行をサポートするために、メモリ内でこのように混ぜ合わされるように命令を配置してもよい。
BB 2の完了時に、DVLIWサイズは2のままである。ベクトルレジスタ内に格納されたオフセットもそれらの値のままである。しかし、この時、オフセット0は、BB 2ではなく、BB 4内の命令に対応する。BBC(0,4)の完了時に、コード506は、トレース0内のBB 4の終わりにおいて、3を格納するようにサイズレジスタを更新し、BB 6に分岐する作業項目に対するエントリを、2を格納するように更新する。単一のPCおよび格納されたサイズをi−キャッシュに送信した後に、長さ3のDVLIWがi−キャッシュからフェッチされる。DVLIWは、BB 3またはBB 4と、BB 5と、BB 6とから混ぜ合わされた命令を含む。ベクトルレジスタ内に関連する格納された0のオフセットを有する作業項目は、BB(0,5)からフェッチされた命令を得る。ベクトルレジスタ内に関連する格納された1のオフセットを有する作業項目は、どの程度までPCが増加されているかに応じて、BB(1,3)またはBB(1,4)の何れかから結果を得る。ベクトルレジスタ内に関連する格納された2のオフセットを有する作業項目は、BB(2,6)からフェッチされた命令を得る。単一のPCおよび格納されたサイズが、フェッチするDVLIWのタイプをi−キャッシュに対して示すように、コンパイラは、命令をこの方式でメモリ内に既に配置している。
BBC(1,4)の完了時に、コード506は、トレース1内のBB 4の終わりにおいて、4を格納するようにサイズレジスタを更新し、BB(3,6)に分岐する作業項目に対するエントリを、3を格納するように更新する。単一のPCおよび格納されたサイズをi−キャッシュに送信した後に、長さ4のDVLIWがi−キャッシュからフェッチされる。DVLIWは、BB 6の第1のコピーと、BB 5の単一のコピーと、BB 6の第2のコピーと、BB 6の第3のコピーと、から混ぜ合わされた命令を含む。ベクトルレジスタ内に関連する格納された0のオフセットを有する作業項目は、BB(0,6)からフェッチされた命令を得る。ベクトルレジスタ内に関連する格納された1のオフセットを有する作業項目は、BB(1,5)から結果を得る。ベクトルレジスタ内に関連する格納された2のオフセットを有する作業項目は、BB(2,6)からフェッチされた命令を得る。ベクトルレジスタ内に関連する格納された3のオフセットを有する作業項目は、BB(3,6)からフェッチされた命令を得る。単一のPCおよび格納されたサイズが、フェッチするDVLIWのタイプをi−キャッシュに対して示すように、コンパイラは、命令をこの方式でメモリ内に既に配置している。
BB(0,6)、BB(1,6)、BB(2,6)およびBB(3,6)の各々に対して、制御フローは、BB 6の終わりにおいて、ループの別の繰り返しのためにBB 1に戻ってもよいし、ループを終了してもよい。関連付けられた分岐命令および対応するレコード内のデータは、実行時に制御フローの方向を判断するであろう。いくつかの作業項目は、別の繰り返しを継続してもよく、他の作業項目は、ループを終了してもよい。特別コード状態は、ベクトルレジスタ内の対応するエントリ内に格納され、どのパスが選ばれるかを示してもよい。所与の作業項目が別のループの繰返しを継続し、複数の作業項目のうち少なくとも1つの他の作業項目が、関連付けられた基本ブロックに対するコードを処理しているという判断に応じて、スリープ状態符号化は、所与の作業項目に対するベクトルレジスタ内の関連付けられたエントリに格納され得る。
所与の作業項目がループを終了するという判断に応じて、終了状態符号化は、所与の作業項目に対するベクトルレジスタ内の関連付けられたエントリに格納され得る。スリープ状態符号化および終了状態符号化の各々は、ループ繰返し中に使用されるオフセットから一意であって、互いに一意である。いくつかの実施形態では、スリープ状態または終了状態にある所与の作業項目に対して、コード506は、所与の作業項目の実行を停止して、少なくとも次のプログラムカウンタ(PC)および作業項目識別子(ID)を、例えば高速読み出しのためのスタックメモリなどのメモリに格納する。
コード506は、BB 6の終わりにおいて、各作業項目の状態をチェックし得る。各作業項目がスリープ状態であるか、または各作業項目が終了状態であるという判断に応じて、プロセッサは、コード506を実行している間に、それぞれの格納された次のPCに分岐することにより、各作業項目に対する実行を再開し得る。各作業項目が停止されており、且つ、少なくとも1つの作業項目が別の作業項目と異なる状態にあるという判断に応じて、プロセッサは、コード506を実行している間に、それぞれの格納された次のPCに分岐することにより、スリープ状態にある作業項目のみについて実行を再開し得る。少なくとも1つの作業項目が、依然として、ループ内の基本ブロックにある命令を処理している場合には、その少なくとも1つの作業項目について実行を継続する一方で、特別な状態にある他の作業項目を待機する。スリープ状態を終えている作業項目は、BB 1に分岐して戻る。また、コード502は、BB 1の開始時に、ベクトルレジスタおよびサイズレジスタを初期化する。終了状態を終えている作業項目は、BB 7に分岐する。また、コード502は、BB 7の開始時に、それに応じて、ベクトルレジスタおよびサイズレジスタを再初期化する。
前述の例では、ループは単一の出口を有する。複数の出口を有する他の場合には、例えば、少なくとも次のPCおよび作業項目IDなどのような対応する状態情報が、例えばスタックなどのメモリに格納され得る。後に、状態情報は、再開のために、例えばスタックからポップするなどのように取得され得る。スリープ状態または終了状態にある両方の作業項目は、例えばスタックなどのメモリに格納された状態情報を有し得る。異なる作業項目が異なるループ繰返しでループを終了し得るので、状態情報を有する複数のエントリが、例えばスタックなどのメモリに置かれ得る。再開時において、実行される際に、コンパイラ生成コードが状態情報をポップして、同じ次のPCから再開する作業項目に対する情報を組み合わせ得る。
ここで図6を参照すると、コンパイラ技術を用いて、プロセッサ内で複数の作業項目の並列実行を最適化するための方法600の一実施形態が示されている。議論を進めるために、本実施形態、および後述する方法の後続の実施形態におけるステップは、連続した順序で示されている。しかし、他の実施形態では、いくつかのステップは、示されたものとは異なる順番で起こってもよく、いくつかのステップは同時に実行されてもよく、いくつかのステップは他のステップと組み合わされてもよく、また、いくつかのステップは存在しなくてもよい。
ブロック602では、ソフトウェアプログラムまたはサブルーチンが検出され解析され得る。プログラムコードは、設計者により、例えばCまたは別の言語などの高水準言語で書かれてもよい。このソフトウェアプログラムは、ゲーム、ビジネス、医療および他の分野などにおいて、並列データアプリケーションのコンパイルおよび実行のために書かれてもよい。プログラムコードは、ソフトウェアアプリケーション、サブルーチン、ダイナミックリンクライブラリ、または他の任意の部分を指してもよい。パス名は、ユーザーによりコマンドプロンプトに対して入力され得る。あるいは、パス名は、ソースコードのコンパイルを開始するために、所与のディレクトリ位置、またはその他から読み込まれてもよい。プログラムコード内の命令は、検査され、翻訳され、最適化されて、コンパイル中にさらに処理されてもよい。
いくつかの実施形態では、ソースコードが静的にコンパイルされる。かかる実施形態では、フロントエンドのコンパイル中に、ソースコードが中間表現(IR)に翻訳されてもよい。バックエンドのコンパイルステップは、IRを機械コードに翻訳してもよい。静的なバックエンドコンパイルは、さらなる変換および最適化を実行してもよい。他の実施形態では、ソースコードは、ジャストインタイム(JIT)方式でコンパイルされる。JIT方式は、システム構成を取得した後に、適切なバイナリコードを生成し得る。何れの方法でも、コンパイラは、関数呼出し、ループ、ループ内のトレースおよびプログラムコード内の基本ブロックを識別し得る。1つ以上の制御フローグラフが、プログラム解析中に構築され得る。
様々な実施形態では、プログラムコードは、例えば汎用プロセッサなどのプロセッサ上でコンパイルされる。プログラムコードは、ターゲットプロセッサに対してコンパイルされてもよく、ターゲットプロセッサは、例えばSIMDマイクロアーキテクチャなどの並列マイクロアーキテクチャを含む。データの1つ以上の関連付けられたレコードは、1つ以上の作業項目を生成するために、関数呼出しに割り当てられてもよい。
プログラムコード内の任意の分岐点を検出する前に、コンパイラは、解析され翻訳された命令を、それらがプログラムコード内に出現する通りにメモリ内に配置し得る。基本的に、コンパイラは、1のサイズをもつVLIWを生成している場合がある。コンパイラは、識別されたループ内で分岐点を検出すると(条件ブロック604:はい)、ブロック606において、超大命令語(VLIW)を生成し得る。コンパイラは、分岐点と対応する収束点との間の複数の基本ブロックから混ぜ合わされた命令をメモリに配置することにより、VLIWを生成し得る。データの1つ以上の関連付けられたレコードは、生成されたVLIW内の混ぜ合わされた命令を一緒にするために配置され割り当てられて、1つ以上の関連付けられた作業項目を生成し得る。
ブロック608では、生成されたコードが挿入されてもよく、生成されたコードは、実行される際に、VLIW内の命令をポイントしているオフセットを、ターゲットプロセッサ内の複数の並列実行レーンの所与のレーンにマッピングする。あるいは、マッピングは、オフセットと作業項目IDとの間であってよい。ブロック610では、実行される際に、フェッチするための次のVLIWのサイズを更新する、生成されたコードが挿入され得る。ブロック612では、実行される際に、スリープ状態または終了状態になろうとしている実行のレーンに対する状態情報を格納する、生成されたコードが、ループの終わりに挿入され得る。生成されたコードは、上述した例で説明したように、プログラムコード内の特定のポイントに挿入され得る。分岐点および収束点と関連付けられた基本ブロックは、マッピングおよびDVLIWサイズに対する更新を維持するための追加の挿入されたコードを有し得る。
ここで図7を参照すると、ハードウェア技術を使用して、プロセッサ内で複数の作業項目の並列実行を最適化するための方法700の一実施形態が示されている。議論を進めるために、本実施形態、および後述する方法の後続の実施形態におけるステップは、連続した順序で示されている。しかし、他の実施形態では、いくつかのステップは、示されたものとは異なる順番で起こってもよく、いくつかのステップは同時に実行されてもよく、いくつかのステップは他のステップと組み合わされてもよく、また、いくつかのステップは、存在しなくてもよい。
ブロック702では、データの関連付けられたレコードが、複数の作業項目を生成するために、コンパイル済みコードに割り当てられる。ブロック704では、作業項目が、単一命令複数データ(SIMD)マイクロアーキテクチャを有するターゲットプロセッサに対してスケジューリングされる。ブロック706では、更新されたVLIWサイズおよび単一のプログラムカウンタ(PC)を使用して、更新されたVLIWサイズに等しい長さを有するVLIWが、例えばi−キャッシュなどのメモリからフェッチされる。VLIW内の命令は、ループ内の分岐点と収束点との間の別個の基本ブロックからのものであってよい。
ブロック708では、フェッチされたVLIW内の命令と、作業項目を実行しているプロセッサ内の並列実行レーンとの間のマッピング情報のために、ベクトルレジスタが読み取られる。マッピング情報は、所与の作業項目および対応する実行レーンに対して、VLIW内のどの命令を処理するかを判断し得る。ブロック710では、VLIW内の命令が、並列実行レーンを使用して同時に実行される。所与の作業項目についてループの終わりに達し(条件ブロック712:はい)、アクティブであると検出された作業項目がない(条件ブロック714:いいえ)場合には、ブロック716において、それぞれの状態情報が、並列実行レーンに割り当てられた各作業項目に対して読み取られる。状態情報は、少なくとも次のPCおよび作業項目IDを含んでもよい。状態情報は、並列実行レーン内で実行を継続するために使用されてもよい。所与の作業項目についてループの終わりに達し(条件ブロック712:はい)、いずれかの作業項目がアクティブであると検出された(条件ブロック714:はい)場合には、ブロック718において、所与の作業項目に対する状態情報が後で使用されるために格納される。所与の作業項目は、実行を停止させてもよく、スリープ状態または終了状態に置かれ得る。
ここで図8を参照すると、オブジェクトコード配置800を示す別の実施形態の一般化されたブロック図が示されている。コード配置800は、図2および図3にそれぞれ示す制御フローグラフ200および付随する実行順序320に対して、コンパイラによって生成され得るオブジェクトコードレイアウトの一実施形態を示している。コード502〜506は、既に説明したものと同じ機能を実行し得る。
基本ブロックのサイズはコンパイル時に分かっている。コンパイラは、初期化コードを最小限にしてDVLIWサイズを削減するようにプログラムコードの命令を配置してスケジューリングし得る。制御フローグラフ200およびオブジェクトコード配置500を使用する前述の例では、BB 6の4つのコピーが使用される。コンパイラは、ギャップを取り入れることにより、トレース数および付随のオフセットを削減し得る。ギャップは、nop操作を利用し得る。
コード配置500に関して前述したステップがここで使用され得る。BB 2の完了時に、DVLIWサイズは2のままである。しかし、フェッチされたDVLIW内の2つの命令のうち1つの命令は、配置800内のギャップを提供するnop操作である。オフセット0はnop操作に対応しており、オフセット1はBB 3内の命令に対応している。BB 3の完了時に、DVLIWは、2から1に減らされる。この時、オフセット0はBB 4内の命令に対応しており、オフセット1はnop操作に対応している。
BBC(0,4)の完了時に、コード506は、トレース0内のBB 4の終わりにおいて、サイズレジスタを1から2に更新する。また、コード506は、BB 6に分岐している作業項目に対するエントリを、1を格納するように更新する。単一のPCおよび格納されたサイズをi−キャッシュに送信した後に、長さ2のDVLIWがi−キャッシュからフェッチされる。DVLIWは、BB 5およびBB 6からの混ぜ合わされた命令を含む。ベクトルレジスタ内に関連する格納された0のオフセットを有する作業項目は、BB(0,5)からフェッチされた命令を得る。ベクトルレジスタ内に関連する格納された1のオフセットを有する作業項目は、BB(1,6)からフェッチされた命令を得る。
BB(1,6)の完了時に、コード506は、DVLIWサイズを2から1に更新する。BB(1,6)に対応する作業項目は、実行を停止して、状態情報を格納し、次のPCで実行を再開するまで待機する。次のPCは、BB 1またはBB 7をポイントしてもよい。前述したように、他のステップが実行されてもよい。コード配置800は、検出された所与の分岐点と対応する収束点との間の第1のトレースパスが、所与の分岐点と対応する収束点との間の第2のトレースパスよりも小さいという判断に応じて、コンパイラが、第1のトレースパスの完了と対応する収束点との間で生成されたVLIW内の第2のトレースパスに対応する命令とともにnopをグループ化し得ることを示す。
前述した実施形態の各々に対して、コードを、ループの外部でループ内のコードと並列化することによって、さらなる並列化が生じてもよい。例えば、BB 7に対するプログラムコードは、ループを完了する作業項目に対するプログラムを終了するために、BB 1と並列化されてもよい。また、オフセットが、単一の命令ではなく、VLIW内の複数の資源に依存しない命令に対応していることの検出に応じて、関連付けられた作業項目および実行レーンが、実行レーン内の複数の資源に依存しない命令を同時に実行してもよい。
さらに、コンパイラは、レジスタ割当てを使用して、DVLIWサイズを削減してもよい。プログラムコードは、次の文:X=(A+B)+(B+M)を含み得る。ここでは、2つの演算が同じ演算コードを使用する。第1のトレースは、T1=A+BなどのADD演算を含む。第2のトレースは、T2=C+DなどのADD演算を含む。0などのオフセットを有する基本ブロックX(BB X)からのT1を使用する作業項目がある。1などのオフセットを有するBB YからのT2を使用する他の作業項目がある。第1のオペランド対「C」および「A」、第2のオペランド対「B」および「D」、ならびに、結果対「T1」および「T2」の各々が、BB XおよびBB Y内の同じレジスタに割り当てられる場合には、式r3=r1+r2が、1のサイズを有するDVLIWとして使用され得る。復号時間を節約するか、またはスロットを解放するために、対応するオフセットが0に設定され得る。
前述の実施形態は、ソフトウェアを含み得ることに留意されたい。かかる実施形態では、方法および/または機構を実装するプログラム命令は、コンピュータ可読媒体上で伝達され、または格納され得る。プログラム命令を格納するように構成されている多数のタイプの媒体が利用可能であり、ハードディスク、フロッピィ(登録商標)ディスク、CD−ROM、DVD、フラッシュメモリ、プログラマブルROM(PROM)、ランダムアクセスメモリ(RAM)、および、様々な他の形式の揮発性または不揮発性記憶装置を含む。一般的に言えば、コンピュータアクセス可能記憶媒体は、命令および/またはデータをコンピュータに提供するために、使用中にコンピュータによってアクセス可能な任意の記憶媒体を含み得る。例えば、コンピュータアクセス可能記憶媒体は、磁気または光媒体などの記憶媒体、例えば、ディスク(固定または取り外し可能)、テープ、CD−ROMもしくはDVD−ROM、CD−R、CD−RW、DVD−R、DVD−RW、または、Blu−Ray(登録商標)を含み得る。記憶媒体は、RAM(例えば、シンクロナスダイナミックRAM(SDRAM)、ダブルデータレート(DDR、DDR2、DDR3など)SDRAM、低電力DDR(LPDDR2など)SDRAM、ラムバスDRAM(RDRAM)、スタティックRAM(SRAM)など)、ROM、フラッシュメモリ、ユニバーサルシリアルバス(USB)インタフェースなどの周辺インタフェースを経由してアクセス可能な不揮発性メモリ(例えば、フラッシュメモリ)などの、揮発性または不揮発性メモリ媒体をさらに含み得る。記憶媒体は、微小電気機械システム(MEMS)、ならびに、ネットワークおよび/または無線リンクなどの通信媒体を経由してアクセス可能な記憶媒体を含み得る。
さらに、プログラム命令は、例えばCなどの高水準プログラミング言語、例えばVerilog、VHDLなどの設計言語(HDL)、または、例えばGDS IIストリーム形式(GDSII)などのデータベース形式、におけるハードウェア機能の動作レベル記述またはレジスタ転送レベル(RTL)記述を含み得る。いくつかの場合には、記述は、合成ライブラリからのゲートのリストを含むネットリストを生成するために記述を合成し得る合成ツールによって読み取られてもよい。ネットリストは、システムを含むハードウェアの機能を表すゲートのセットを含む。ネットリストは、次いで、マスクに適用される幾何学形状を記述するデータセットを生成するために配置され、ルーティングされ得る。マスクは、次いで、システムに対応する半導体回路または複数の回路を製造するために様々な半導体作製ステップで使用され得る。あるいは、コンピュータアクセス可能記憶媒体上の命令は、必要に応じて、ネットリスト(合成ライブラリの有無にかかわらず)またはデータセットであってよい。また、命令は、Cadence(登録商標)、EVE(登録商標)およびMentor Graphics(登録商標)などのベンダーからのハードウェアベースタイプのエミュレータによるエミュレーションのために利用され得る。
上記実施形態はかなり詳細に説明されているが、上述した開示が完全に理解されると、多数の変形および修正が当業者において明らかになるであろう。以下の請求項は、かかる変形および修正の全てを包含すると解釈されることを意図する。

Claims (20)

  1. コンピュータシステムの少なくとも1つのプロセッサによる実行のために構成された少なくとも1つのプログラムを格納するコンピュータ可読記憶媒体であって、
    前記少なくとも1つのプログラムは、前記プロセッサによって実行されると、
    複数のプログラム命令を解析することと、
    前記複数のプログラム命令内でループおよび対応する基本ブロックを識別することと、
    前記複数のプログラム命令内の識別されたループ内の所与の分岐点を識別したことに応じて、前記識別されたループ内の複数の命令を複数の超大命令語(VLIW)に配置することであって、少なくとも1つのVLIWは、前記所与の分岐点と対応する収束点との間の異なる基本ブロックから混ぜ合わされた命令を含む、ことと、
    を前記プロセッサに実行させる命令を含む、
    コンピュータ可読記憶媒体。
  2. 前記少なくとも1つのプログラムは、前記識別されたループ内の前記所与の分岐点を検出したことに応じて、第1の命令を前記複数のプログラム命令に追加すること、を前記プロセッサに実行させるための命令をさらに含み
    前記第1の命令は、所与のVLIW内の命令を、単一命令複数データ(SIMD)マイクロアーキテクチャを含むターゲットプロセッサ内の複数の並列実行レーンに実行時に割り当てることを前記ターゲットプロセッサに実行させるためのものである、請求項1に記載のコンピュータ可読記憶媒体。
  3. 前記第1の命令は、実行時に、前記所与の分岐点において所与のレーンに対して検出された分岐方向に少なくとも部分的に基づいて、前記複数の命令のうち何れかの命令を前記所与のレーンに割り当てることを前記ターゲットプロセッサに実行させる、請求項2に記載のコンピュータ可読記憶媒体。
  4. 前記少なくとも1つのプログラムの前記命令は、次のプログラムカウンタ(PC)に対応するVLIWの格納されたサイズを前記ターゲットプロセッサに更新させるように構成された第2の命令を追加することを前記プロセッサに実行させる、請求項2に記載のコンピュータ可読記憶媒体。
  5. 前記少なくとも1つのプログラムの前記命令は、前記ターゲットプロセッサに対して、前記検出された所与の分岐点と前記対応する収束点との間で第1の命令シーケンスが第2の命令シーケンスよりも小さいことに応じて、nopを、VLIW内の前記第2の命令シーケンスに対応する命令とグループ化させるように構成された第3の命令を追加することを前記プロセッサに実行させる、請求項4に記載のコンピュータ可読記憶媒体。
  6. 実行時に、前記所与のVLIW内の命令を前記複数の並列実行レーンに割り当てるために、前記第1の命令は、前記複数の実行レーンのうち対応するレーンと関連付けられているベクトルレジスタ内の特定のビット範囲にオフセットを書き込むように前記ターゲットプロセッサに実行させ、前記オフセットは、実行のために関連付けられたレーンに対してフェッチされた所与のVLIW内の所与の命令を識別する、請求項4に記載のコンピュータ可読記憶媒体。
  7. 前記少なくとも1つのプログラムの前記命令は、
    所与の命令シーケンスが、前記識別されたループの終わりに達していることに応じて、
    実行時に、前記所与の命令シーケンスが、前記識別されたループの開始に分岐して戻るようにスケジューリングされているという判断に応じて、前記ベクトルレジスタ内の対応するビット範囲内にスリープ状態を書き込むことと、
    実行時に、前記所与の命令シーケンスが、前記識別されたループの外部に分岐するようにスケジューリングされているという判断に応じて、前記ベクトルレジスタ内の前記対応するビット範囲内に終了状態を書き込むことと、
    を前記ターゲットプロセッサに実行させるように構成された第4の命令を追加することを前記プロセッサに実行させる、
    請求項6に記載のコンピュータ可読記憶媒体。
  8. 前記少なくとも1つのプログラムの前記命令は、
    前記複数のレーンのうち、前記スリープ状態または前記終了状態にある前記所与の命令シーケンスに対応するレーンを検出したことに応じて、
    前記所与の命令シーケンスの実行を停止することと、
    少なくとも次のプログラムカウンタ(PC)および前記所与の命令シーケンスに対応する識別子(ID)を格納することと、
    を前記ターゲットプロセッサに実行させるように構成された第5の命令を追加することを前記プロセッサに実行させる、
    請求項7に記載のコンピュータ可読記憶媒体。
  9. 前記少なくとも1つのプログラムの前記命令は、
    レーンが前記スリープ状態にあるか前記終了状態にあることに応じて、前記レーン内の命令の実行を、個別に格納された次のPCで再開することを前記ターゲットプロセッサに実行させるように構成された第6の命令を追加することを前記プロセッサに実行させる、請求項8に記載のコンピュータ可読記憶媒体。
  10. 前記少なくとも1つのプログラムの前記命令は、
    スリープ状態にある命令のみの実行を、個別に格納された次のPCで再開することを前記ターゲットプロセッサに実行させるように構成された第7の命令を追加することを前記プロセッサに実行させる、請求項8に記載のコンピュータ可読記憶媒体。
  11. 単一命令複数データ(SIMD)マイクロアーキテクチャ内の複数の並列実行レーンと、
    超大命令語(VLIW)のサイズを格納するように構成されたサイズレジスタと、
    プログラムコードを実行するように構成された制御ロジックと、
    を備え、
    前記プログラムコードは、
    数のプログラム命令内でループおよび対応する基本ブロックを識別することと、
    前記複数のプログラム命令内の識別されたループ内の所与の分岐点を識別したことに応じて、前記識別されたループ内の複数の命令を複数の超大命令語(VLIW)に配置することであって、少なくとも1つのVLIWは、前記所与の分岐点と対応する収束点との間の異なる基本ブロックから混ぜ合わされた命令を含む、ことと、により生成される、複数のVLIWを含むものである、
    プロセッサ。
  12. 前記複数の並列実行レーンのうち対応するレーンと関連付けられている特定のビット範囲内にオフセットを格納するように構成されたベクトルレジスタをさらに備え、
    前記オフセットは、実行のために関連付けられたレーンに対してフェッチされた所与のVLIW内の所与の命令を識別する、請求項11に記載のプロセッサ。
  13. 前記ベクトルレジスタの前記ビット範囲に格納される前記オフセットの有効な値としてありうる、互いに異なる値の数は、前記サイズレジスタに格納されたサイズと等しい、請求項12に記載のプロセッサ。
  14. オフセットが、前記VLIW内の複数の資源に依存しない命令に対応しているとの検出に応じて、前記複数の並列実行レーンのうち前記オフセットに関連付けられたレーンは、関連付けられたレーン内の前記複数の命令を同時に実行するようにさらに構成されている、請求項12に記載のプロセッサ。
  15. 所与の命令シーケンスが前記識別されたループの終わりに達しており、且つ、前記所与の命令シーケンス、及び、対応するレーンが、前記識別されたループの開始に分岐して戻るようにスケジューリングされていることを示すスリープ状態、または、前記識別されたループの外側に分岐するようにスケジューリングされていることを示す終了状態のいずれかであることに応じて、前記制御ロジックは、
    前記所与の命令シーケンスの実行を停止することと、
    少なくとも次のプログラムカウンタ(PC)および前記所与の命令シーケンスに対応する前記レーンの識別子(ID)を格納することと、
    を行うようにさらに構成されている、請求項12に記載のプロセッサ。
  16. 前記複数の並列実行レーンの各レーンが、前記スリープ状態または前記終了状態にあることに応じて、前記制御ロジックは、個別に格納された次のPCに分岐することにより、レーンごとの実行を再開するようにさらに構成されている、請求項15に記載のプロセッサ。
  17. 前記複数の並列実行レーンの各レーン、前記スリープ状態または前記終了状態にあることに応じて、前記制御ロジックは、個別に格納された次のPCに分岐することにより、スリープ状態にあるレーンのみの実行を再開するようにさらに構成されている、請求項15に記載のプロセッサ。
  18. 複数のプログラム命令内でループおよび対応する基本ブロックを識別することと、
    識別されたループ内の所与の分岐点に応じて、前記識別されたループ内の複数の命令を複数の超大命令語(VLIW)に配置することとであって、少なくとも1つのVLIWは、前記所与の分岐点と対応する収束点との間の異なる基本ブロックから混ぜ合わされた命令を含む、ことと、
    を含む、方法。
  19. 前記識別されたループ内の前記所与の分岐点に応じて、前記所与の分岐点において所与のレーンの実行時に検出した分岐方向に基づいて、実行時に、所与のVLIW内の命令を、単一命令複数データ(SIMD)マイクロアーキテクチャを含むターゲットプロセッサ内の複数の並列実行レーンに割り当てることをさらに含む、請求項18に記載の方法。
  20. 実行時に、前記所与のVLIW内の命令を前記複数の並列実行レーンに割り当てるために、前記複数の並列実行レーンのうち対応するレーンと関連付けられている指示を格納することをさらに含み、
    前記指示は、実行するために関連付けられたレーンに対して前記所与のVLIW内の所与の命令を識別する、請求項19に記載の方法。
JP2015555420A 2013-01-29 2014-01-28 並列パイプラインにおいてブランチを分岐するためのハードウェアおよびソフトウェアソリューション Active JP6236093B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/753,098 2013-01-29
US13/753,098 US9830164B2 (en) 2013-01-29 2013-01-29 Hardware and software solutions to divergent branches in a parallel pipeline
PCT/US2014/013455 WO2014120690A1 (en) 2013-01-29 2014-01-28 Hardware and software solutions to divergent branches in a parallel pipeline

Publications (2)

Publication Number Publication Date
JP2016504699A JP2016504699A (ja) 2016-02-12
JP6236093B2 true JP6236093B2 (ja) 2017-11-22

Family

ID=51224341

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015555420A Active JP6236093B2 (ja) 2013-01-29 2014-01-28 並列パイプラインにおいてブランチを分岐するためのハードウェアおよびソフトウェアソリューション

Country Status (6)

Country Link
US (1) US9830164B2 (ja)
EP (1) EP2951682B1 (ja)
JP (1) JP6236093B2 (ja)
KR (1) KR101787653B1 (ja)
CN (1) CN105074657B (ja)
WO (1) WO2014120690A1 (ja)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9612811B2 (en) * 2014-01-21 2017-04-04 Nvidia Corporation Confluence analysis and loop fast-forwarding for improving SIMD execution efficiency
EP3106982B1 (en) * 2015-06-18 2021-03-10 ARM Limited Determination of branch convergence in a sequence of program instructions
JP6167193B1 (ja) * 2016-01-25 2017-07-19 株式会社ドワンゴ プロセッサ
CN110716750A (zh) * 2018-07-11 2020-01-21 超威半导体公司 用于部分波前合并的方法和系统
KR102329368B1 (ko) * 2019-02-26 2021-11-19 미쓰비시덴키 가부시키가이샤 정보 처리 장치, 정보 처리 방법 및 기록 매체에 저장된 정보 처리 프로그램
CN112230995B (zh) * 2020-10-13 2024-04-09 广东省新一代通信与网络创新研究院 一种指令的生成方法、装置以及电子设备
CN113885877A (zh) * 2021-10-11 2022-01-04 北京超弦存储器研究院 编译的方法、装置、设备及介质
US11762762B1 (en) * 2022-03-24 2023-09-19 Xilinx, Inc. Static and automatic inference of inter-basic block burst transfers for high-level synthesis

Family Cites Families (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4435758A (en) * 1980-03-10 1984-03-06 International Business Machines Corporation Method for conditional branch execution in SIMD vector processors
EP0374419A3 (en) 1988-12-21 1991-04-10 International Business Machines Corporation Method and apparatus for efficient loop constructs in hardware and microcode
DE69424370T2 (de) 1993-11-05 2001-02-15 Intergraph Corp., Huntsville Befehlscachespeicher mit Kreuzschienenschalter
GB2311882B (en) 1996-04-04 2000-08-09 Videologic Ltd A data processing management system
US6003128A (en) 1997-05-01 1999-12-14 Advanced Micro Devices, Inc. Number of pipeline stages and loop length related counter differential based end-loop prediction
US5898865A (en) 1997-06-12 1999-04-27 Advanced Micro Devices, Inc. Apparatus and method for predicting an end of loop for string instructions
US6157988A (en) 1997-08-01 2000-12-05 Micron Technology, Inc. Method and apparatus for high performance branching in pipelined microsystems
US6032252A (en) 1997-10-28 2000-02-29 Advanced Micro Devices, Inc. Apparatus and method for efficient loop control in a superscalar microprocessor
US6366999B1 (en) 1998-01-28 2002-04-02 Bops, Inc. Methods and apparatus to support conditional execution in a VLIW-based array processor with subword execution
US6356994B1 (en) 1998-07-09 2002-03-12 Bops, Incorporated Methods and apparatus for instruction addressing in indirect VLIW processors
JP2000259579A (ja) 1999-03-11 2000-09-22 Hitachi Ltd 半導体集積回路
JP3616556B2 (ja) * 1999-06-29 2005-02-02 株式会社東芝 拡張命令を処理する並列プロセッサ
US6986025B2 (en) * 2001-06-11 2006-01-10 Broadcom Corporation Conditional execution per lane
EP1367485B1 (en) * 2002-05-31 2012-10-31 STMicroelectronics Limited Pipelined processing
US7159103B2 (en) 2003-03-24 2007-01-02 Infineon Technologies Ag Zero-overhead loop operation in microprocessor having instruction buffer
US7200688B2 (en) * 2003-05-29 2007-04-03 International Business Machines Corporation System and method asynchronous DMA command completion notification by accessing register via attached processing unit to determine progress of DMA command
US7124318B2 (en) * 2003-09-18 2006-10-17 International Business Machines Corporation Multiple parallel pipeline processor having self-repairing capability
GB2409065B (en) * 2003-12-09 2006-10-25 Advanced Risc Mach Ltd Multiplexing operations in SIMD processing
US7366885B1 (en) 2004-06-02 2008-04-29 Advanced Micro Devices, Inc. Method for optimizing loop control of microcoded instructions
US7814487B2 (en) 2005-04-26 2010-10-12 Qualcomm Incorporated System and method of executing program threads in a multi-threaded processor
US7330964B2 (en) * 2005-11-14 2008-02-12 Texas Instruments Incorporated Microprocessor with independent SIMD loop buffer
US8327115B2 (en) * 2006-04-12 2012-12-04 Soft Machines, Inc. Plural matrices of execution units for processing matrices of row dependent instructions in single clock cycle in super or separate mode
JP2008090744A (ja) 2006-10-04 2008-04-17 Matsushita Electric Ind Co Ltd プロセッサおよびオブジェクトコード生成装置
EP2106584A1 (en) 2006-12-11 2009-10-07 Nxp B.V. Pipelined processor and compiler/scheduler for variable number branch delay slots
US7937574B2 (en) 2007-07-17 2011-05-03 Advanced Micro Devices, Inc. Precise counter hardware for microcode loops
US20090327674A1 (en) * 2008-06-27 2009-12-31 Qualcomm Incorporated Loop Control System and Method
US20100281483A1 (en) 2009-04-30 2010-11-04 Novafora, Inc. Programmable scheduling co-processor
CN101930358B (zh) * 2010-08-16 2013-06-19 中国科学技术大学 一种单指令多数据流结构上的数据处理方法及处理器
KR101700406B1 (ko) 2010-11-16 2017-01-31 삼성전자주식회사 재구성 가능 어레이의 실행 모드를 동적으로 결정하기 위한 장치 및 방법

Also Published As

Publication number Publication date
EP2951682A4 (en) 2016-12-28
CN105074657B (zh) 2018-11-30
WO2014120690A1 (en) 2014-08-07
EP2951682A1 (en) 2015-12-09
JP2016504699A (ja) 2016-02-12
KR20150112017A (ko) 2015-10-06
KR101787653B1 (ko) 2017-11-15
CN105074657A (zh) 2015-11-18
EP2951682B1 (en) 2018-08-22
US20140215183A1 (en) 2014-07-31
US9830164B2 (en) 2017-11-28

Similar Documents

Publication Publication Date Title
JP6159825B2 (ja) ハードウェアポインタを使用したsimdコア内での分岐ブランチに対するソリューション
JP6236093B2 (ja) 並列パイプラインにおいてブランチを分岐するためのハードウェアおよびソフトウェアソリューション
EP2710467B1 (en) Automatic kernel migration for heterogeneous cores
Yang et al. A GPGPU compiler for memory optimization and parallelism management
JP3601341B2 (ja) 並列プログラム生成方法
KR101417597B1 (ko) 제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제
US20120331278A1 (en) Branch removal by data shuffling
US20100250564A1 (en) Translating a comprehension into code for execution on a single instruction, multiple data (simd) execution
US9921838B2 (en) System and method for managing static divergence in a SIMD computing architecture
CN113360157A (zh) 一种程序编译方法、设备以及计算机可读介质
Hong et al. Improving simd parallelism via dynamic binary translation
US20130067196A1 (en) Vectorization of machine level scalar instructions in a computer program during execution of the computer program
US20160328236A1 (en) Apparatus and method for handling registers in pipeline processing
KR101118321B1 (ko) 리타게팅된 그래픽 프로세서 가속 코드의 범용 프로세서에 의한 실행
US20170315807A1 (en) Hardware support for dynamic data types and operators
Masuda et al. Software and Hardware Design Issues for Low Complexity High Performance Processor Architecture
Cowley Extending the Capabilities of Von Neumann with a Dataflow Sub-ISA
Berr Efficient Simulation of PRAM Algorithms on Shared Memory Machines
王昊 et al. A GCC Vectorizer based Instruction Translating Method for An Array Accelerator

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20160203

A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20160203

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20160222

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160622

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160802

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20161101

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20161228

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20170202

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20170516

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20170816

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20170912

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20171003

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20171027

R150 Certificate of patent or registration of utility model

Ref document number: 6236093

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250