JP2014010832A - ステージド・ループ命令 - Google Patents

ステージド・ループ命令 Download PDF

Info

Publication number
JP2014010832A
JP2014010832A JP2013124943A JP2013124943A JP2014010832A JP 2014010832 A JP2014010832 A JP 2014010832A JP 2013124943 A JP2013124943 A JP 2013124943A JP 2013124943 A JP2013124943 A JP 2013124943A JP 2014010832 A JP2014010832 A JP 2014010832A
Authority
JP
Japan
Prior art keywords
loop
instruction
instructions
stage
kernel
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.)
Granted
Application number
JP2013124943A
Other languages
English (en)
Other versions
JP5882950B2 (ja
Inventor
Michael G Perkins
ジー. パーキンス,マイケル
Andrew J Higham
ジェイ. ハイアム,アンドリュー
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.)
Analog Devices Inc
Original Assignee
Analog 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 Analog Devices Inc filed Critical Analog Devices Inc
Publication of JP2014010832A publication Critical patent/JP2014010832A/ja
Application granted granted Critical
Publication of JP5882950B2 publication Critical patent/JP5882950B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; 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/3802Instruction prefetching
    • G06F9/3808Instruction prefetching for instruction reuse, e.g. trace cache, branch target cache
    • G06F9/381Loop buffering
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4452Software pipelining
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; 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

Landscapes

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

Abstract

【課題】
ハードウェア並列性の効率的な使用
【解決手段】ループ命令が分析されて、それらの間の依存性および利用可能なマシンリソースに基づいて、ステージ番号が割り当てられる。ループ命令は、そのステージ番号に基づいて選択的に実行され、それによって明示的なループセットアップ命令およびループテアダウン命令を不要にする。単一命令多重データ(SIMD)マシン上で、各命令の最終インスタンスは、オリジナルループの反復数に応じて、処理要素またはベクトル要素のサブセット上で実行してもよい。
【選択図】図1

Description

本発明の態様は、一般的にはハードウェア並列性の効率的な使用に関し、具体的にはループアンローリング(loop unrolling)およびソフトウェアパイプライン化に関する。
コンパイラは、高レベル汎用言語(例えば、C、C++、またはJava(登録商標))で書かれたコンピュータソースコードを取り込み、それを低レベルの特定マシン向けオブジェクトコードに変換する。簡単な、シングルコアプロセッサ用のコンパイルコードは、比較的に単純明快な高レベル命令の低レベル命令への一対一の変換で構成することができる。例えば、C++クラスにおけるデータへのアクセスは、アドレス計算およびメモリアクセスのマシンレベル命令にコンパイルしてもよい。
しかしながら、複数の機能ユニット、またはベクトル処理に対するサポートを有するプロセッサ用のコンパイルコードは、ずっと複雑になることがある。典型的な目標は、各コア(および/または所与のデバイスの特定のハードウェアに応じて、各プロセッサ、実行ユニット、およびパイプライン)をできるだけビジーに保つことによって、できる限り迅速にコンパイルされたプログラムを走らせることである。しかしながら、この目標には、最初に直列的/逐次的に書かれた命令を、並列に走るようにコンパイルすることが必要であるが、すべての命令が同時に実行可能であるわけではない。例えば、第2の命令に対する入力が、第1の命令の結果に依存する場合には、第1および第2の命令を並列に走らせることは不可能であり、第2の命令は第1の命令が完了するのを待たなければならない。
「スマート」コンパイラは、並列に走らせることのできる命令を認識して、(超長命令語(VLIW:very-long-instruction-word)プロセッサ用に生成されたコードのように明示的に、またはスーパースカラプロセッサ用に生成されたコードのように暗示的に)それを行わせるように適合されたマシンコードを作成する。並列化可能な状況の2つの広範なカテゴリとして、(i)命令レベル並列性を発揮する命令、および(ii)データレベル並列性を発揮する命令があげられる。命令レベル並列性とは、互いの出力に対して依存性がなく、したがって並列に演算することのできる、2つ以上の命令を意味する。データレベル並列性とは、セットのメンバに対する個々のオペレーションが、他のメンバに関係するオペレーションに依存しない、データのセット(すなわち、ベクトル)に対して、オペレーションを実行することを意味している。例えば、2つのマトリックスを互いに加算するためには、要素レベルの加算オペレーションは独立であるので、マトリックス内の要素のデータレベル並列性を利用して、要素加算命令の一部または全部を並列に走らせてもよい。
コンパイラが、命令レベルおよびデータレベルの並列性を達成する1つの方法は、ソースコード内に書かれたループ(例えば、forループまたはwhileループを)を利用することによる。ループの2回以上の反復を、並列に実行(すなわち、データレベル並列性を利用する、「ベクトル化」)してもよく、かつ/またはループの連続的反復を部分的に重複化(すなわち、命令レベル並列性を利用する、「ソフトウェアパイプライン化」)を行ってもよい。ソフトウェアパイプライン化の強力なアルゴリズムの1つが、「モジュロスケジューリング(modulo scheduling)」として知られている。ベクトル化に関しては、次のような場合には、(例えば)forループを呼び出して10回反復させてもよい;すなわち各反復において実行される命令が、その他の反復の命令と独立であり、かつコンパイラが(例えば)5つの処理要素にアクセスできる場合には、コンパイラは、5つの処理要素のそれぞれにおいて、当該ループの2回の反復を並列に実行させる、アセンブリコードを作成してもよい。ソフトウェアパイプライン化に関しては、例えば、あるループが2つの命令を含むが、第1の命令が、前回反復の第2の命令の結果に依存しない場合には、ループの次回反復の第1の命令を、ループの現行反復のまだ実行中の第2の命令と、並列に走るようにスケジュール化してもよい。
ベクトル化およびソフトウェアパイプライン化の1つの短所は、実行コードのサイズを増大させることである。ベクトル化には、ループの奇数サイズの最終反復に対応するコードが必要となる(例えば、ループが11回の反復を必要とし、5つの処理要素が利用可能である場合には、最後の反復は、処理要素の1つだけを使用する)。この「部分的に充填された」最終反復は、単に不効率であるだけにとどまらないことがある。つまり、多くの大規模プロセッサ配列は、正当なデータの安定したストリームを期待して調節されており、個々の処理要素をオフにすることは、それほど容易でないこともある。ソフトウェアパイプライン化には、効率的なコア命令のセット(「ループカーネル(loop kernel)」)を走らせる前に、ハードウェア環境を準備するために、セットアップ命令(「ループプロログ(loop prolog)」)を必要とし、その後には、ループをテアダウン(tear down)し、さらに別の命令のためのハードウェア環境をクリーンアップするオーバヘッド命令(「ループエピログ(loop epilog)」)がさらに必要である。多くの場合に、この追加の、オーバヘッドコードは、ループカーネルコードそれ自体よりも大きくなることもあり、制限された命令キャッシュまたはバッファキャパシティを有するプロセッサ上で、性能を低下させることがある。もう一つの短所は、可変の反復数(ループの「トリップ数」と呼ばれる)を有するループの扱いのまずさであり、この理由は、トリップ数はコンパイル時には知ることはできず、トリップ数の様々なテストが実行時には必要となり、それによって(特に、トリップ数が小さいときに)プログラムのランタイムが増大するためである。
これらの欠点に対処しようとする既存のシステムは、さらなる短所を生成するだけである場合がある。例えば、プロセッサによっては(例えば、ベクトルプロセッサは)、ループの最終反復において、個々の処理要素を選択的に動作不能にする方法を実装するものもある。しかしながら、ループの最終反復において処理エレメントを動作不能にすることは、ループカーネルにおける様々な反復からの命令と重複する、ソフトウェアパイプライン化とうまく相互作用しない。その他のシステムは、ループ命令を固定サイズのバッファに記憶して、特殊なループ命令を発行することによって、ループのセットアップ、テアダウンおよび定常状態を表わすが、これらのシステムは、(固定バッファのサイズに基づいて)ループカーネルのサイズを制限するだけでなく、より複雑なループ(レジスタリネーミング(register renaming)を必要とするものなど)を取り扱うこともできない。さらに別のシステムは、精密な回転ハードウェアレジスタ(rotating hardware resistor)を使用して、複雑なループに対処するが、これらのレジスタは、プロセッサの他の部分から貴重なリアルエステートを取り上げる。したがって、任意のサイズと複雑度のループカーネルを効率的に実行する方法に対するニーズがある。
一般的には、本明細書に記載されるシステムおよび方法の様々な観点は、ソフトウェアプロログおよびエピログを必要とすることなく、ソフトウェアパイプライン化された、ベクトル化ループのセットアップおよびテアダウンを可能にする、コンパイラとハードウェアメカニズムを提供する。本発明の態様は、コードサイズを低減して、未知のトリップ数の場合には、結果として得られるコードの性能を向上させる。ループコードが分析されて、各命令に、実行の全体順序を反映するステージ番号が割り当てられ、具体的には、各命令を、時間的に順序づけられた複数の「ステージ」の1つに割り当ててもよく、これらのステージのそれぞれは、実行順序内でその位置を反映する「ステージ番号」を有する。このループが実行されると、その中の命令が、そのステージ番号に基づいて、選択的に実行される。
一観点において、コンピュータプロセッサによってループを実行する方法は、このループ用のループカーネル命令を、コンピュータプロセッサのメモリ中にロードすることを含む(この場合に、各ループカーネル命令は、それに関連するステージ番号を有する)。ステージ閾値がループの各反復中に判定されて、このステージ閾値およびステージ番号に基づいて、ループカーネル命令のサブセットを実行することによって、ループプロログが実行される。ループカーネルは、ループカーネル命令を繰り返し実行することによって実行され、ループエピログは、ステージ閾値とステージ番号に基づいてループカーネル命令のサブセットの内の第2のセットを実行することによって実行される。
コンピュータプロセッサは、スカラープロセッサとしてもよく、この場合に、ループカーネル命令は、命令レベル並列性またはマルチサイクルレーテンシを有する命令を含み、かつ/またはループカーネル命令がソフトウェアパイプライン化されている。ステージ番号は、アンロールされたループカーネルの各コピーに応じて調節してもよい。ループ命令の最終的な実行は、ループの初期の反復におけるよりも、より少ない処理要素またはベクトル要素上で行ってもよい。このより少ない処理要素またはベクトル要素は、各処理要素またはベクトル要素を制御するマスクビットに応じて、選択してもよい。ステージ閾値に関する情報を含むループセットアップ命令を受け取ってもよく、このループセットアップ命令には、合計ループ数、ループ命令を実行するのに使用する処理要素の数、ステージ数(stage count)、またはループアンロール係数(loop-unroll factor)を含めてもよい。ループエピログ、ループカーネル、およびループプロログを実行することには、命令ステージ番号をコンピュータプロセッサ内のステージ閾値と比較することを含めてもよい。
別の観点においては、コンピュータ実行可能なループ命令を実行するシステムは、ループ情報を含むループセットアップ命令を受け取るためのシーケンサを含む。1つまたは2つ以上のレジスタが、ステージ閾値に関係するデータを記憶する(このデータは、前記ループ情報から導出される)。処理要素は、(i)ループカーネル命令に関連するステージ閾値およびステージ番号に基づいて、受け取ったループカーネル命令のサブセットを実行することによって、ループプロログを実行し、(ii)ループカーネル命令を繰り返し実行することによって、ループカーネルを実行し、また(iii)ステージ閾値およびステージ番号に基づいて、ループカーネル命令のサブセットの第2のセットを実行することによって、ループエピログを実行する。
レジスタは、ステージマスクレジスタまたはステージ閾値レジスタを含めてもよい。少なくとも1つの追加の処理要素がループカーネル命令を実行するか、またはベクトル命令が、複数のデータ要素を並列に処理してもよい。命令の最終実行中に、処理要素またはベクトル要素のサブセットだけが、ループカーネル命令を実行してもよい。マスクレジスタは、最終反復においてループカーネル命令を実行することに関係した情報を記憶してもよい。ループ情報には、合計ループ数、ループ命令を実行するのに使用する処理要素の数、ステージ数、またはループアンロール係数を含めてもよい。ループ数レジスタはループ数を記憶してもよく、このループ数は、合計ループ数を、ループ命令を実行するのに使用する処理要素の数で割ることによって導出して、ステージ数に応じて調節するとともに、ループアンロール係数に応じて丸めてもよい。
本明細書において開示する本発明の長所と特徴と共に、これらおよびその他の目的は、以下の説明、添付の図面および特許請求の範囲を参照すれば、より明白になるであろう。さらに、本明細書に記載する様々な態様の特徴は、互いに排他的ではなく、様々な組合せと順列で存在することができることを理解されたい。
図面において、同一の参照符号は、異なる図を通して、全体的に同一の部品を指している。以下の説明においては、本発明の様々な態様を、以下の図面を参照して説明する。
図1は、本発明の一態様による、ループ命令にステージ情報の注釈をつける方法を示すフローチャートである。 図2は、本発明の一態様による、ステージド・ループの実行を示すブロック図である。 図3は、本発明の一態様による、部分的にアンロールされたステージド・ループの実行を示すブロック図である。 図4は、本発明の一態様による、遅延開始を必要とする部分的にアンロールされたステージド・ループの実行を示すブロック図である。 図5は、本発明の一態様による、複数処理要素上で走るステージド・ループの実行を示すブロック図である。 図6は、本発明の一態様による、ループ命令にステージを用いて注釈をつけるシステムのブロック図である。 図7は、本発明の一態様による、ステージド・ループ命令を実行するシステムのブロック図である。 図8は、本発明の一態様による、ステージド・ループ命令を実行する方法のフローチャート図である。
詳細な説明
本明細書においては、効率的にループカーネルをセットアップおよびテアダウンするために、どの命令を、どの順序で、実行しなければならないかに関する追加の情報を、ループカーネル命令、またはループ命令のグループにタグ付けすることによって、複数の処理要素または機能ユニットを有する、コンピュータシステム上でループを走らせる方法およびシステムの様々な態様を記載する。プロセッサが命令を受け取ると、タグ情報を分析し、それに基づいて、ループカーネルを実行する前後に、ループカーネル情報のあるものを実行し、それによって明示的なループセットアップ/テアダウン命令を不要にする。例えば、コンパイラは、ループ内のいくつかの命令に[0]タグを、その他の命令に[1]タグを、さらに他の命令に[2]タグをタグ付けしてもよく、非常におおざっぱには、以下でより詳細に説明するように、タグ付けされたグループ内の命令は、命令レベル並列性を示し、より大きい番号でタグ付けされたグループにおける命令は、より小さい番号のグループにおける命令の出力に依存することがある。ループの最初の反復において、プロセッサは、[0]をタグ付けされた命令を(並列に)実行し、第2の反復において、[0]または[1]をタグ付けされた命令を、そして第3および後続の反復において、すべての命令(すなわち、[0]、[1]または[2]のいずれかをタグ付けされた命令)を実行してもよい。ループの最後から2番目の反復において、プロセッサは、[1]または[2]をタグ付けされた命令だけを実行し、ループの最終反復において、[2]をタグ付けされた命令だけを実行してもよい。以下でより詳細に説明するように、この簡単な例を、より複雑なループおよび/またはプロセッサアーキテクチャに拡張することができる。
説明の目的で、ループについてのいくつかの一般属性または特性を最初に定義する。従来型のループ用のコードは、ループセットアップ命令(すなわち、ループプロログ)、ループカーネル、およびループテアダウン命令(すなわち、ループエピログ)が含まれる。本発明の一態様によって実行されるループは、ループ命令のすべてが実行されるわけではない、その実行の発端での1回または2回以上の反復、ループ命令のすべてが実行される、1回または2回以上の反復(すなわち、ループの実行の「定常状態」部分)、および、最終的に、ループ命令のすべてが実行されるわけではない、ループの実行の終端における、1回また「は2回以上の反復を含む。一態様において、ループ実行の発端および終端での反復によって、ループの定常状態部分に対するセットアップおよびテアダウン機能が、それを行うための明示的な追加命令を必要とすることなく、得られる。
パイプライン化されたループにおける、それぞれの連続するループ反復の始点間の合計サイクル数は、開始間隔(initiation interval)と呼ばれており、これは、定常状態ループカーネル内の命令行数でもある。この定常状態において全(開始間隔)サイクルを実行するときに、新規の反復が始まり、同時に、先に始まった反復がその実行を終了する。開始間隔は、非パイプライン化ループの反復を完了するのに要する合計サイクル数よりも短く、その理由は、最初のループの複数反復が重複して、ループの後からの反復を、先の反復が完了する前に始めることを可能にするからである。例えば、開始間隔が2であり、反復を完了するのに必要な合計サイクル数が6であるとすると、反復n、n+1、およびn+2は、すべて同時にインフライト(in flight)となる。
ループ内の命令は、ループ反復が始まってから経過した開始間隔の倍数によって決まる「ステージ番号」が与えられる。上記の例において、非パイプライン化ループにおける最初の2つの命令行は第1のステージに属し、命令行3および4は第2のステージに属するのに対して、命令行5および6は、第3のステージに属する。ステージの合計数は、ステージ数と呼ばれ、この例においては、ステージ数は3である。ループカーネルの定常状態においては、反復nは、最終ステージ(この場合には、第3のステージ)における命令を実行しており、反復n+1は、最後から2番目のステージ(この場合には、第2のステージ)を実行しており、以下同様である。我々の例においては、反復n+2は、第1のステージにおいて命令を実行することによって、実行を開始している。
本発明の一態様においては、ステージ番号は、ループカーネルにおける命令にタグ付けするのに使用される。第1のステージに属する命令は[0]をタグ付けされ、第2のステージに属する命令は[1]をタグ付けされ、以下同様である。
開始間隔が小さくなるほど、より効率的なループカーネルが得られる。開始間隔を減少させるのを助ける要因としては、プロセッサ上で利用可能な機能ユニット数が大きいこと、および命令間のデータ依存性の数が小さいことがあげられる。また、小さい開始間隔は、一般に、ループのためのコードを発生させるのに必要なステージ数を増大させ、これによって、明示的なループプロログおよびエピログを発生させなければならない場合には、より多くのコード拡張につながる。ループが定常状態に達する前に走らせる必要のあるステージの数は、ステージ数より1つ少ない数(すなわち、ステージ数−1)であり、ループが定常状態に達する前に走らせる必要のあるサイクルの数は、(ステージ数−1)×(開始間隔)である。本発明の一態様においては、このオーバヘッドに対するコード拡張は除外される。
ループをアンロールすることは、ループ命令の一部または全部を、より多数の非ループ命令でリライトすることを意味する。6回反復する、2命令forループは、例えば、12の通常(非ループ)命令としてリライトすることによって完全にアンロールすることができる。別の例として、そのforループは、反復毎の命令は多いが、合計反復は少なくなるようにリライトすることによって、部分的にアンロールすることができる(例えば、3回反復する4命令forループ)。ループが最初に、奇数の反復数を有するように書かれている場合(例えば、5回反復する2命令forループ)には、この部分アンロール技法は、ループ外に初期(または最終)命令セットを含めることができる(例えば、2命令+2回反復する4命令forループ)。
ループアンローリングは、ループが、その結果が長時間、ライブである(すなわち、利用可能にしておく必要がある)命令を包含するときに、ソフトウェアパイプライン化を容易にするのに使用してもよい。パイプライン化されたカーネル内で、毎(開始間隔)サイクル、新規の反復が始まるので、命令の結果は、普通、その定義後に(開始間隔)サイクルを超えて使用することができず、結果として、この使用に達する前の後続の反復における命令のコピーによって上書きまたは「クロバリング(clobbering)」される。この問題は、ループカーネルをアンロールすることによって解決してもよい。ループをアンロールすることは、勿論のこと、長寿命命令の別のコピーをループカーネル中に導入し、この命令が長寿命値を上書きすることを避けるために、(先の命令の結果をクロバリングするのを回避するように、)その値をその中に記憶する、リネームされたレジスタが与えられる。上記で定義された用語の1つを使用すると、ループカーネルは、ループの開始間隔(すなわち、ループの「長さ」)が、ループ内の命令の1つ(すなわち、「長寿命」命令)の寿命よりも短い場合に、アンロールされる。必要なアンローリングのレベルは、開始間隔をどの程度、超えているかの関数であり、ループアンロール係数と呼ばれている。アンローリングが必要でない場合には、ループアンロール係数は1であり、ループカーネルの2つのコピーが必要である場合には、ループアンロール係数は2であり、以下同様である。
ループの別の属性は、その反復回数が固定であるか、可変であるかである。固定であれば、コンパイラは、(例えば)反復回数が奇数であるか、または偶数であるか(これは、上記で考察したように、部分的にアンロールされたループに影響を与える)を試験して、それに応じてコードを発生させることによって、その実行を容易にスケジューリングすることができる。しかしながら、反復回数が可変である場合には(例えば、1からxまで反復するforループ)、コンパイラは、反復回数が奇数であるか、偶数であるかを知ることができない。
次に、本発明の一態様に注目すると、図1は、ループに対するコードをコンパイルする方法100を示している。第1ステップ102において、命令依存関係(例えば、命令レベルまたはデータレベルの並列性に対する障害)が、ループ命令において判定される。第2ステップ104において、マシン上で利用可能な並列リソースを超えることなく、(開始間隔)サイクル毎に、新規の反復を開始させて、現在実行中の反復と重複させるように、開始間隔と共に、これらの依存関係に従う、ループの非パイプライン化版が生成される。第3ステップ106において、ループに対するループアンロール係数が(例えば、ループの開始間隔およびループ命令の寿命に基づいて)判定される。第4ステップ108において、ループの反復数(例えば、未知か既知か、既知であれば、奇数か偶数か)が判定される。第5ステップ110において、依存関係およびハードウェア上で利用可能な並列性に少なくとも部分的に基づいて、ステージ番号がループ内の命令に対して割り当てられる。
一態様においては、所与のループに対する命令は、それらの間の依存関係を有するが、ループに対するアンロール係数は1であり(すなわち、アンローリングを必要としない)、ループの反復数は既知である。この態様においては、コンパイラは、各ループ命令に、パイプライン情報、すなわちステージ番号をタグ付けする。この情報は、3ビットまたは4ビットのバイナリ数の形態にすることができるが、本発明は、この情報のいかなる特定の表現にも限定されるものではない。ステージ番号は、命令コード化自体の範囲に保持するか、または並列データ構造などの、別のメカニズムで規定してもよい。
実行中に、ループの走行は最終的に定常状態に達し、この状態では、各反復においてすべてのループ命令が実行されるが、定常状態に達する前には、各反復においてループ命令のサブセットだけが実行される。独立した命令が最初に実行され、場合によっては、それらの最初の命令に依存する可能性のある中間の命令が続き、最初の命令および中間の命令に依存する可能性のある命令が続き、すべての命令が実行されるまで、以下同様である。ループの最後の数回の反復において、最初に実行を始めた命令が実行を停止し、後に追加された、依存性を有する命令が、すべての命令がその指示された回数実行されるまで、実行される。
意味論的(semantically)には、命令は、そのステージ番号を、各反復において変わる可能性のあるステージ閾値に対して試験することによって、実行される。ループセットアップ部分において、命令は、そのステージ番号がステージ閾値以下である場合に実行され、ループテアダウン部分においては、命令は、そのステージ番号がステージ閾値以上である場合に実行される。ステージ閾値は、ループセットアップ部分およびテアダウン部分の間には、各反復毎に増分され、ステージ閾値は、ループセットアップ部分においてその最も低い値に初期化され、ループテアダウン部分において2番目に低い値に初期化される。ステージ閾値は、ループの定常状態部分においては一定のままである。一態様においては、ステージ閾値は、以下により詳細に説明するように、ループアンロール係数と等しい量だけ増分される。ハードウェアにおけるそのような意味論を達成するのには多くの方法があり、本発明はステージ閾値を使用することに制限されるものではないことを当業者は理解するであろう。同一の結果を得るためのその他の方法として、ループカーネルの次の反復を始めるに当たり、シフトさせることのできるマスクレジスタを使用すること、またはループトリップ数、ステージ数およびアンロール係数の値から導出される、その他の状態の使用することがある。ステージ閾値の考察は、本明細書においては、説明を分かり易くする目的だけで使用される。
図2に示された、例200は、本発明のこの態様を説明する助けとなる。例200は、特定の命令セットおよび依存関係を含むが、本発明は、この構成だけに限定されるものではなく、例200は、説明の目的だけを意味するものである。この例において、ループは、3回の反復を実行し、5つの命令:a、b、c、d、およびeを含む。命令aとcの間でコンフリクトが存在する(すなわち、命令cは命令aの出力に依存し、かつ/またはハードウェアはそれらの同時実行を可能にしない)。同様に、命令dとcは、別のコンフリクトのために、命令a、b、またはcと同時には走らせることはできない。これらの依存関係に基づいて、コンパイラは、命令aおよびbをステージ[0]に、命令cをステージ[1]に、命令dおよびeをステージ[2]に割り当てる。
ループカーネルの開始間隔も判定してもよい。上記で考察したように、開始間隔は、パイプライン化されたループカーネルの1回の反復を実行するのに要するサイクル数である。この例においては、ハードウェアは、第1サイクルにおいて命令a、cおよびdを、第2サイクルにおいて命令bおよびeを、実行することが可能であると仮定する。すなわち、すべてのループ命令を実行するのに2サイクルを要するので、開始間隔は2である。例えば、以下のようになる。
for(i=1;i<=3;i++{
a[0];c[1];d[2];//第1サイクルで実行
b[0]; e[2];//第2サイクルで実行
この情報を使用して、命令a、c、およびdを第1サイクルに、命令bおよびeを第2サイクルに示して、ループカーネル202を構築することができる。ループカーネル202の1回の反復だけが示されているが、ループカーネル202は、(オリジナルコードで指定された反復数に応じて)任意の回数、実行してもよい。命令には、それらのステージ番号[0]、[1]、および[2]が注釈されており、この情報を使用して、システムは、ステージ閾値に対してステージ番号を試験することによって、ループセットアップ命令およびテアダウン命令を導出してもよい。例えば、第1の反復204において、システムは、[0]のステージ閾値以下のステージ番号を有する命令(すなわち、命令a[0]およびb[0])を実行する。説明の目的で、命令には、それらが実行される回数に対応する添え字がさらに注釈されている(例えば、aおよびb)が、この情報は、システムが必要とするものではない。第2の反復206において、システムは、増分されたステージ閾値[1]以下のステージ番号を有する命令(すなわち、命令a[0]、b[0]、およびc[1])を実行する。なお、第2の反復206における命令cの第1の実行は、第1の反復204における命令aおよびbの第1の実行の後に行われ、それによって命令間の依存関係/コンフリクトが満足されることに留意されたい。
この例200においては、ループは、第3の反復202において定常状態に入る。ステージ閾値は、再び、[2]へ増分されて、全部の命令が実行される。その他のループは、ループの性質に応じて、より少ない、またはより多いセットアップ反復を必要とすることがあり、本発明は、いかなる特定のセットアップ(またはテアダウン)反復の回数にも限定はされない。
ループが最後から2番目の反復に到達すると、そのループは、ループカーネル202を出て、第1のテアダウン反復208へと入る。ステージ閾値は、2番目に低い値(すなわち[1])に初期化されて、テアダウン部分において、ステージ閾値以上のステージ番号を有する命令(すなわち、命令c[1]、d[2]、およびe[2])だけが実行される。言い換えると、この例では、命令aおよびbは、すでに、それらが必要とされる3回の回数、実行されており、それらの実行は、第1のテアダウン反復208において停止される。ステージ閾値は、再び[2]に増分されて、最終テアダウン反復210においては、命令d[2]およびe[2]だけが実行されて、各命令が3回実行されるという要件を満足し、同時に命令間の依存関係を尊重する。
本発明の別の態様において、再び図1のステップ104を参照すると、ループは部分的なアンローリングを必要とする。上記で考察したように、この要件は、ループ内の命令の結果の寿命が、ループの開始間隔を超えるときに行われる。上記のように、命令には、それらの依存関係に応じたステージ番号が割り当てられるとともに、命令は、その命令を走らせるハードウェアの制限に応じて、ループの各反復においてスケジューリングされる。さらに、この態様においては、長寿命命令結果がそれを使用するまで保存されることを可能にする必要があるので、ループカーネルはアンロールされる(すなわち、ループ命令は、ループカーネルにおいて複製される)。一態様において、オリジナルループカーネルの、それぞれの連続的複製において、(i)命令のステージ番号が、1だけ減分され、(ii)複製の(すなわち、リネームされた)レジスタが、(それによってそれらの値が互いにクロバリングするのを防止するために)ループカーネルでの長寿命命令の複製(複数を含む)に対して定義される。最終的に、(ループアンロール係数が1である)上記の例においては、命令は、ステージ閾値を1だけ増分させることによって実行するために選択されるが、ステージ閾値は、(ループの2つ以上のアンロールされた反復が、ループカーネルにおいて存在することを反映するために)ループアンロール係数だけ増分される。また、この機能を提供するその他の方法が、それに制約はされないが、マスクレジスタの使用を含む、ハードウェアにおいて可能である。本明細書における、ステージ閾値による説明は、分かり易くするために示したものである。
一般に、ステージ番号の範囲は、ゼロから必要な最大値(例えば、1、2、またはそれ以上)までにわたるように割り当てることができる。しかしながら、ループアンロール係数が、1よりも大きいときには、ステージ番号範囲の下限は、負の数としてもよい。一態様において、下限は(1−ループアンロール係数)に等しく、上限は(ステージ数−1)に等しい。任意の便利な範囲を使用してもよいが、本発明は、いかなる特定の範囲にも限定されない。例えば、(1−ループアンロール係数−ステージ数)から−1までの全負の範囲によって、ハードウェアの設計を簡略化してもよい。
前例のように、説明のための例300によって、本発明のこの態様の説明を助けることができる。この例においては、ループは7つの反復と3つの命令a、b、およびcを有し、命令bは命令aの出力に依存し、命令cは命令bの出力に依存する。コードを走らせるシステムは、3つの命令を同時に走らせて、ループの開始間隔を1に等しくすることができる。例えば、次のようになる。
for(i=1;i<=7;i++){
a;b;c;

すなわち、直截的な場合においては、3つの命令a、b、cは、それぞれ3つのステージ番号[0]、[1]、[3]を割り当てて、図2に示した上記の例200と同様の方法で、ループを走らせてもよい。
しかしながら、この場合には、命令bは完了するのに2サイクルを要し、その実行時間が、ループの開始間隔(すなわち1)よりも大きくなる。したがって、ループは、この命令に対応するためにアンロールしてもよく、1つのアンロールレベル(ループアンロール係数=2)は、より効率的な動作をもたらす(例えば、命令bのより長い実行時間による、パイプラインストールがないか、または少い動作)。さらに、命令bの出力に依存する、命令cには、この依存性を反映するために遅いステージ番号を割り当ててもよい。一態様においては、命令aにはステージ[0]を割当て、命令bにはステージ[1]を、命令cには[3]を割り当てる(すなわち、命令bの実行時間が長いために、ステージ[2]は空である)。アンロールに追加された、ループカーネル命令の第2のコピーは、1ユニットだけ減分されたステージ番号を有する。例えば、以下のようになる。
for(i=1;i<=7;i+=2){
a[0];b[1];c[3];
a[-1];b[0];c[2];
再び図3を参照すると、ループカーネル302が、ループカーネル命令a[0]、b[1]、およびc[3]の第1の反復を含む、第1の部分304、およびステージ番号を1だけ減分された(例えば、a[-1],b[0],c[2])、同一の命令を含む、第2の部分306と共に、示されている。上記の例のように、このループを実行するシステムは、この情報(すなわち、ループカーネル命令およびそのタグ情報)だけを渡されて、それらだけに基づいて、ループセットアップ命令およびループテアアダン命令を導出してもよい。
すなわち、ループの第1の反復308において、ステージ閾値はステージ番号[0]に設定され、0以下のステージ番号を有する、ループカーネル302における命令が走らされる(すなわち、命令a[0]、a[−1]およびb[0])。第2の反復310において、ステージ閾値は、ループアンロール係数2に応じて、[2]に増分され、[2]以下のステージ番号を有する命令が走らされる(すなわち、a[0]、b[1]、a[0]、b[0]およびc[2])。すなわち、第2の反復310において、命令a[0]およびb[1]は、ループの第1のアンロールインスタンスにおいて走らされて、命令a[-1]、b[0]およびc[2]は、ループの第2のアンロールインスタンスにおいて走らされる。命令bは、2サイクルの寿命を有するので、命令b[0]の結果は、先に実行された命令b[1]の結果に上書きするのを避けるために、リネームされたレジスタに記憶される。
上記のように、第2の反復310の命令が実行されて、(かつ、命令b[0]の場合には、まだ実行中であると)、ループカーネル302の命令の実行が始まる。一態様においては、ステージ閾値は、再び、2だけ(すなわち、ループアンロール係数に等しい量だけ)増分して[4]にされて、[4]は最大ステージ番号よりも大きいので、ループ内のすべての命令が実行される。ここでも、ループカーネル302の1つのコピーだけが図示されているが、これは、ループの定常状態部分であり、(オリジナルソースコードに指定されたループパラメータに応じて、)任意の回数、実行してもよい。
ループの最後から2番目の反復に到達すると、第1のテアダウン反復312が始まる。この反復においては、ステージ閾値は、2番目に低いステージ番号(すなわち、[0])に初期化され、ゼロ以上のステージ番号を有する命令(すなわち、a[0]、b[1]、c[3]、b[0]およびc[2])が実行される。最終的に、最終テアダウン反復314において、再び増分されたステージ閾値(すなわち[2])以上のステージ番号を有する命令が、実行される。上記の例と同様に、各命令a、b、cは、オリジナルループ反復回数に応じて7回、実行され、それぞれの依存関係が尊重される(すなわち、命令bの各インスタンスは、対応する命令aの実行より1クロックサイクル後に実行され、同様に、命令cは、命令bの2サイクル後に実行される)。
本発明の別の態様においては、図1のステップ108を参照すると、ループの反復数は、コンパイル時には既知ではないことがある。図2に示された例200におけるように、ループアンロール係数が1である場合には、反復回数における不確定性は問題とはならず、ループの定常状態部分は、実行時反復回数に応じて、必要な回数だけ単に繰り返えされる。しかしながら、ループアンロール係数が1より大きい場合には、必要な反復数を生成するのはより困難である。ループカーネルにおける部分的にアンロールされたループは、2つ以上の反復を内蔵しているので、これらの2つ以上のアンロール反復の倍数ではない、合計ループ反復回数は、構築するのが困難であろう。
例として、図3に示されたループ300は、(ループアンロール係数2を有する、)部分的にアンロールされたカーネル302を有する。その簡単な例においては、カーネル302は、1回だけ実行され、ループの合計反復数は7(すなわち、各命令は7回、実行される)である。合計反復数が9、11、または13などである場合には、ループカーネル302は、2、3、または4回繰り返されて、必要な合計反復数を生成する。しかしながら、所望の反復の合計数が8である場合に、図3のループ構造は、修正なしにその数を生成することはできない(すなわち、ループ302の1回の反復は少なすぎるが、2回の反復は多すぎる)。
一態様において、ループセットアップの第1の反復を構成する命令は、所望の合計反復数を生成するために、必要に応じて、1回または2回以上の開始間隔だけ遅延される。ソースコードにおいてオリジナルループによってコールされる反復数はNであり、本発明の態様により構築されるループの反復数は(N+[ステージ数−1])であり、この場合に、(ステージ数−1)の追加反復は、ループセットアップおよびテアダウンの反復に使用することができる。(N+[ステージ数−1])がループアンロール係数の整数倍数でない場合には、そうなるまで切り上げられる(すなわち、ループを、少なくとももう1反復、走らせるように設定される)。この場合には、ステージ閾値の初期値は、ゼロより低く低減されて、その結果として、パイプライン化されたループに入ると、アンロールされたループの初期部分はオフにされる。
ここで再び、例をあげるのが役立つ。7回の合計反復を走らせるように構成された、図3のループ300が、図4の図解400に示されるように、8回の反復を走らせるように修正されている。普通は、ループの合計9回の反復を生成することになる、ループカーネル402が、2回実行されるように複製されている。しかしながら、この場合に、ステージ閾値の初期値が[−1]に設定されている。このラインにおけるすべての命令が、初期ステージ閾値よりも大きいステージ番号を有するので、したがって、ループプロログの第1のサイクル404は動作不能にされる。結果として、命令a、b、cのそれぞれは、(9回ではなく)8回実行される。
404において指示される遅延の別の利点には、ループアンローリングにおいて必要なレジスタリネーミングが含まれる。パイプライン化されたループから外に出ると、ループ中に演算されて、その外部で使用される値は、正しい値を見出すことを可能にするために、既知のレジスタに記憶させなくてはならない。しかしながら、ループアンローリング中に、長寿命を有する結果のレジスタリネーミングの行為は、2つ以上のレジスタを生成し、その中では、ループの間中、その値はライブ状態である。ループカーネル402が、その実行の途中で出ることができる場合には(または、その実行が完全に終わる以外のある点において、2より大きいループアンローイング係数を有するループの場合には)、ループの外部で使用される結果の最終値は、これらのリネーミングされたレジスタのいずれかに保持してもよく、すなわち、ループトリップ数がコンパイル時に未知の場合には、どのレジスタがその最終結果を保持するかは分からない。ループプロログ404の始めに遅延404を設置することによって、カーネル402は、その実行を完了した後に出ることによって、どのレジスタがループにおける結果の最終値を保持しているかが常に確実にわかるようになる。カーネル402に入ると、必要であれば、リネーミングされたレジスタのすべてのコピーが、正しい初期値に初期化されることを確実にするのは容易である。
一態様においては、2つ以上の処理要素がコードの実行に利用可能であり、コンパイラは、データ独立性命令を各処理要素に送る。ループの反復数が、処理要素の数の倍数でない場合には、処理要素の一部は、ループの最後の反復においてアイドル状態になる(すなわち、その動作がマスキングにより無効にされる)ことがある。2処理要素システム上で実行される7反復ループの例示態様500が、図5に示されている。このコードは、以下の依存関係を示すであろう:
for(i=1;i<=7;i++){
a[1];c[0];
b[0];d[1];

ここで7は、2の偶数倍数ではないので、ループの4回の反復が、第1の処理要素502に送られて、3つの命令が第2の処理要素504に送られる。このステージ[0]命令は、ステージ閾値に応じて、第1のステージ506において実行を始め、ループカーネル508は、後続のステージにおいて実行される。カーネル508は、最初に第2のプロセッサ504上に出て、その間に、追加の反復を第1のプロセッサ502上で走らせる。両方のプロセッサ502、504は、最終反復510においてステージ[1]を実行する。
ループ命令にステージ番号を注釈付けする、システム600の一態様が、図6に示される。ソースコード分析モジュール602は、命令レベルまたはデータレベルの並列性を示す、候補命令(例えば、ループ命令)に対するソースコードを分析する。(モジュールは、通常、ソフトウェア形態で、すなわちプロセッサによる実行のために非揮発性メモリに記憶されたコンピュータ実行可能な命令のセットとして実現される。プログラムモジュールとしては、特定のタスクを実行するか、特定の抽象データタイプを実装する、ルーチン、プログラム、オブジェクト、構成要素、および/またはデータ構造、その他があげられる。しかしながら、当該技術において周知のように、機能モジュールも、特定のアプリケーションの要件に応じて、ハードウェアに実装するか、またはソフトウェア/ハードウェア混合構成要素として実装してもよい。)
ソースコード分析モジュール602は、ソースコード内のこれらの命令を、パターンマッチング、構文解析、部分(または全体)コンパイル、または当該技術において知られているコードを分析するその他任意の方法に基づいて識別してもよい。任意の種類のソースコードが、本発明の範囲内である。識別がされると、本発明の態様によれば、ステージ番号発生モジュール604が、命令間依存関係、コードを走らせるハードウェアの制限または特徴、あるいはその他任意の関係する要因に基づいて、ステージ番号を命令に割り当てる。モジュール602、604の一方または両方が、開始間隔、ステージ数、および/またはループアンロール係数などのループに関係する特性を判定して、これらの特性の一部または全部を、ステージ番号を命令に割り当てる際に使用してもよい。ステージ番号が、命令の一部または全部に対して判定されると、アセンブリコードまたはオブジェクトコード出力モジュール606が、1つまたは2つ以上のターゲットプロセッサ上で実行するのに適した、(ステージ番号を含む)アセンブリコードまたはオブジェクトコードを、準備、フォーマット、かつ出力してもよい。しかしながら、本発明は、これらのモジュール602、604、606だけを含む、実装に限定されることはなく、当業者は、モジュール602、604、606に実装された機能は、より多数または少数のモジュールに実装してもよいことを理解するであろう。
ステージ番号注釈を有するコードを実行するシステム700が、図7に示されている。シーケンサ702は、状態情報を包含し、1つまたは複数の処理要素(PE)704に命令を発行する。シーケンサ702は、ループアンロール係数、ループ内に残る反復数(すなわち、「ループ数」)、ループの各反復においてどのステージ番号を実行すべきか、および複数の処理要素704の内のどれが、ループの最後の反復において命令を実行すべきか、などの現在実行中のループに関する情報を記憶してもよい。当業者は、シーケンサ702を(または、その類似の機能を別の機能ブロック中に)実装する多くの方法があり、本発明はいずれの特定の実装形態に限定されないことを認識するであろう。さらに、処理要素704は、シーケンサによって制御される、任意のタイプの汎用または専用コンピューティングブロックとしてもよい。さらに、本発明はまた、この意味で別個の処理要素内に存在するかのように取り扱うことのできる、単一のコンピューティングユニット内で処理されるベクトル内の独立した要素の制御にも適用されることも理解されたい。そのようなマシンは、通常、単一命令多重データ(SIMD)プロセッサと呼ばれる。
シーケンサ702(より具体的には、それを実装するハードウェア)は、ループ数を記憶するループ数(LC)レジスタ706や、(モジュロ可変拡張、または「MVE」アンロール係数としても知られている)ループアンロール数を記憶するループアンロール係数レジスタ708などの、状態情報を記憶するためのレジスタを含む。ステージマスクレジスタ710には、(そのステージ番号に基づいて)どの反復においてどの命令を実行すべきかに関する情報が場所を占めており、例えば、ステージマスクレジスタ710の1ビットが、ステージ[0]の命令が実行されるべきことを指示し、別のビットが、ステージ[1]の命令が実行されるべきことを指示し、また以下同様にしてもよい。ステージマスクレジスタは、(各処理要素794が、各反復において異なるステージ番号を有する命令を実行してもよいことを説明するために)各処理要素704において、ローカルステージマスクレジスタ714内に再生してもよい。最終反復マスク(FMASK)レジスタ712は、ループの最終反復において、複数の処理要素704の内のどれを、オンまたはオフにすべきかを指示するのに使用してもよい。
ループ数レジスタ706は、サイズが8ビット、16ビット、またはその他のビット数であってもよく、ループ数レジスタ706に記憶された値は、ループが反復する毎に(例えば、ループアンロール係数だけ)減少する。ループ数レジスタ706内の値が、ゼロに達すると、ループは、反復を停止する。ループアンロール係数レジスタ708は、サイズを2ビットとして、最大アンロール係数4をサポートとするか、サイズを3ビットとして最大アンロール係数8をサポートするか、またはその他のサイズとしてもよい。ステージマスクレジスタ710は、少なくとも、ループアンロール係数と最大ステージ数の合計に等しいサイズにしてもよい。一態様において、ステージマスクレジスタ710は、サイズが23ビットである。最終反復マスクレジスタ712は、処理要素704のそれぞれに対して1ビットを有してもよい。
ループ命令を、シーケンサ702内の、状態レジスタ706、708、710、712を初期化するのに使用してもよい。このループ命令には、合計ループ数、使用する処理要素の数、ステージ数、およびループアンロール係数を指示するパラメータを含めてもよい。ループアンロール係数レジスタ708には、ループ命令において与えられる、ループアンロール係数の値をロードしてもよく、その他のレジスタ706、710、712の値は、以下に示すように、式(1)〜(3)に従って、ループ命令パラメータから導出してもよい。
式(1)に関して、ループ数は、命令を並列に実行する処理要素704の数(VLENまたはベクトル長)で除算した、オリジナルコードにおける反復数(N)に関係する。追加の反復(SC−1)が、ループセットアップおよびテアダウンに必要である。結果は、ループアンロール係数(MVE)の最も近い倍数に切り上げられる。式(2)に関して、バイナリの1は、ステージ数(SC)に応じて、ステージマスクレジスタ710中へとシフトされ、ループ数レジスタ706(LC)において演算されるループアンロール係数(MVE)によって必要となる切り上げが考慮に入れられる。式(3)に関して、処理要素704の数(VLEN)を法(modulo)とする、反復数(N)の剰余に等しい、最終反復マスクレジスタ712中に2値の1がシフトされて、最後の反復において不必要な処理要素704をマスキングで無効にする(すなわち、モジュロ演算は、最後の反復における「残存」命令の数を与える)。例えば、N=13かつVLEN=8であると、FMASK=00011111となり、一方でN=16であれば、FMASK=11111111となる。最終的に、ループ数レジスタ706の値が、ステージマスクレジスタ710内のビット数以下である(すなわち、ループの最後の数回の反復が接近している)場合には、ステージマスクレジスタ710内の(LC−1)番目ビットの上で、かつそれを含む任意のビットがクリアされて、最終反復マスクレジスタ712からの値が、ステージマスクレジスタ710における(LC−1)番目ビット位置に再配置するのに使用される。
ステージマスクレジスタ710の再演算されたコンテンツは、次いで、各処理要素704におけるレジスタのローカルコピー714に押し出され、ここで(LC−1)番目ビット位置は、それに到達すると、最後の反復中に、一部の処理要素704のスイッチをオフにさせる。各処理要素704は、命令を受け取り、デコードして、各命令のステージ番号を検査し、その処理要素のローカルマスクレジスタ714における、それに対応するビットエントリが設定されている場合には、命令が実行される。一態様において、ローカルマスクレジスタ714内の対応するステージ番号のビット位置が、コンパイル時またアセンブリ時に演算されて、命令内にコード化され、それによって値を演算および/または記憶することからハードウェアを解放する。
一例において、ループ命令は、ループ数が523であり、処理要素の数(VLEN)が4であり、ステージ数が3であり、ループアンロール(MVE)係数が2であることを規定する。この例においては、ループ数レジスタ706は、134の値を受け取り、ループアンロール係数レジスタ708は、2の値を受け取り、ステージマスクレジスタ710は、(すべてのローカルレジスタ714と同様に)11…11000の値を受け取り、最終反復マスクレジスタ712は、0111の値を受け取る。
状態レジスタ706および710は、ループが反復する度毎に更新してもよい。一態様においては、ループ数レジスタ706は、ループアンロールレジスタ708の値だけ減分され、状態マスクレジスタ710は、ループアンロール係数レジスタ708の値に等しい回数だけ、右にシフトされる。ループが、その最後の数回の反復に近づいている場合(例えば、ループ数レジスタ706の値が、ステージマスクレジスタ710におけるビット数以下である場合)には、ゼロがシフトインされ、そうでない場合には、1がシフトインされる。上述のように、ループがその最後の(または最後の数回の)反復中である場合には、最終反復マスクレジスタ712の値が、(その(LC−1)番目ビット位置において)ローカルマスクレジスタ714にコピーされる。
例えば、最後の例において紹介された、ループの1回の反復の後に、ループ数レジスタ706は、132の値に更新されて、ステージマスクレジスタ710は、(すべてのローカルレジスタ714がそうであるように)11…11110の値に更新される。その寿命の終端に近いが、終端ではないループの別の反復において、ループ数レジスタ706は4の値に更新され、ステージマスクレジスタ710は、00…00111の値に更新される。ローカルレジスタ714は、最終反復マスクレジスタ712に応じて、異なる値、すなわち00…1111、00…1111、00…1111、および00…0111を有するように更新される。ループの最終反復において、ループ数レジスタ706は、2の値に更新されて、ステージマスクレジスタ710は、00…001の値に更新される。ローカルレジスタ714は、最終反復マスクレジスタ712に応じて、異なる値、すなわち00…0011、00…0011、00…0011、00…0001を有するように、再び、更新される。
本発明の態様によるループ命令を実行する方法800が、図8に示されている。第1のステップ802において、ループ命令が、走らせようとするループについての情報(例えば、ループアンロール係数および反復数)とともに、受け取られる。(例えば、シーケンサ内の)状態レジスタが、この情報(および/またはそれから導出される値)によって初期化される。第2のステップ804において、マスクが、1つまたは2つ以上の処理要素に対して演算されて、それに送られ、このマスク(例えば、図7を参照して上述されたステージマスク)は、命令のどのステージを実行するかについての情報を包含する。第3のステップ806において、ループ命令は、そのステージ番号とマスクに応じて実行される。第4のステップ808において、マスク(および状態情報)は折り返し時に更新される。処理要素を制御するビットを、マスクレジスタ内、またはその他の方法で編成することのできる多くの方法があり、本発明は、シーケンサ内部に保持されるグローバルマスクレジスタ、および各処理要素内部のローカルマスクレジスタとして説明した実装形態に限定されないことを、当業者は認識するであろう。例えば、すべての必要な状態をシーケンサ内部に保持して、どの命令が現在、各処理要素に対して動作可能にされているかに応じて、命令を処理要素に分散させることが同等に可能である。
なお、本発明の態様は、1つまたは2つ以上の製造物上、またはその中に具現化される、1つまたは2つ以上のコンピュータ可読プログラムとして、提供することもできることに留意されたい。製造物は、例えば、フレキシブルディスク、ハードディスク、CDROM、CD−RW、CD−R、DVDROM、DVD−RW、DVD−R、フラッシュメモリカード、PROM、RAM、ROM、または磁気テープなどの、任意好適なハードウェア装置としてもよい。一般に、コンピュータ可読プログラムは、任意のプログラム言語で実装してもよい。使用することのできる言語の例としては、C、C++、またはJAVA(登録商標)があげられる。ソフトウェアプログラムは、機械言語または仮想マシン命令にさらに変換して、その形態でプログラムファイルに記憶させてもよい。次いで、このプログラムファイルを、1つまたは2つ以上の製造物上、またはその中に記憶させてもよい。
本発明のいくつかの態様を上記で説明した。しかしながら、本発明はそれらの態様に限定されることはなく、むしろ本明細書において明白に記載された内容に対する追加および修正も、本発明の範囲に含めることを意図するものであることに、特に留意されたい。さらに、本明細書に記載された様々な態様の特徴は、互いに排他的ではなく、様々な組合せおよび順列で存在することが、たとえそのような組合せまたは順列が本明細書において明白にされていなくても、本発明の趣旨と範囲から逸脱することなく、可能であることを理解されたい。実際に、本明細書において記載されたものの変形形態、修正形態、およびその他の実装形態は、本発明の趣旨と範囲から逸脱することなく、当業者は思い付くであろう。したがって、本発明は、前述の例証のための説明だけによって定義されるものではない。

Claims (16)

  1. コンピュータプロセッサによってループを実行する方法であって、
    前記ループ用のループカーネル命令であって、それぞれがそれに関連するステージ番号を有するループカーネル命令を、前記コンピュータプロセッサのメモリにロードすること;
    前記ループの各反復中に、ステージ閾値を判定すること;
    前記ステージ閾値およびステージ番号に基づいて、前記ループカーネル命令のサブセットを実行することによってループプロログを実行すること;
    前記ループカーネル命令を繰り返し実行することによってループカーネルを実行すること;
    前記ステージ閾値およびステージ番号に基づいて、前記ループカーネル命令のサブセットの内の第2のセットを実行することによって、ループエピログを実行すること
    を含む、前記方法。
  2. コンピュータプロセッサがスカラープロセッサであって、ループカーネル命令が、命令レベル並列性またはマルチサイクルレーテンシを有する命令を含み、前記ループカーネル命令がソフトウェアパイプライン化されている、請求項1に記載の方法。
  3. ステージ番号が、アンロールされたループカーネルの各コピーに応じて調節される、請求項1に記載の方法。
  4. ループ命令の最終的な実行は、ループの初期の反復におけるよりも、より少ない処理要素またはベクトル要素上で行われる、請求項1に記載の方法。
  5. より少ない処理要素またはベクトル要素が、各処理要素またはベクトル要素を制御するマスクビットに応じて選択される、請求項4に記載の方法。
  6. ステージ閾値に関する情報を含む、ループセットアップ命令を受け取ることをさらに含む、請求項1に記載の方法。
  7. ループセットアップ命令が、合計ループ数、ループ命令を実行するのに使用する処理要素の数、ステージ数、またはループアンロール係数を含む、請求項6に記載の方法。
  8. ループエピログ、ループカーネル、およびループプロログを実行することが、命令ステージ番号をコンピュータプロセッサ内のステージ閾値と比較することを含む、請求項1に記載の方法。
  9. コンピュータ実行可能なループ命令を実行するシステムであって、
    ループ情報を含むループセットアップ命令を受け取るためのシーケンサ;
    ステージ閾値に関係するデータであって、前記ループ情報から導出されるデータを記憶する、1つまたは2つ以上のレジスタ;および
    (i)前記ループカーネル命令に関連する前記ステージ閾値およびステージ番号に基づいて、受け取ったループカーネル命令のサブセットを実行することによって、ループプロログを実行し、(ii)前記ループカーネル命令を繰り返し実行することによって、ループカーネルを、また(iii)前記ステージ閾値およびステージ番号に基づいて、前記ループカーネル命令のサブセットの第2のセットを実行することによって、ループエピログを実行する、処理要素
    を含む、前記システム。
  10. レジスタがステージマスクレジスタまたはステージ閾値レジスタを含む、請求項9に記載のシステム。
  11. ループカーネル命令を実行する少なくとも1つの追加の処理要素、または複数データ要素を並列に処理するためのベクトル命令をさらに含む、請求項9に記載のシステム。
  12. 命令の最終実行中に、処理要素またはベクトル要素のサブセットだけが、ループカーネル命令を実行する、請求項11に記載のシステム。
  13. マスクレジスタが、最終反復においてループカーネル命令を実行することに関係した情報を記憶する、請求項12に記載のシステム。
  14. ループ情報が、合計ループ数、ループ命令を実行するのに使用する処理要素の数、ステージ数、またはループアンロール係数を含む、請求項9に記載のシステム。
  15. ループ数を記憶するループ数レジスタをさらに含む、請求項9に記載のシステム。
  16. ループ数が、合計ループ数を、ループ命令を実行するのに使用する処理要素の数で割ることによって導出されて、ステージ数に応じて調節されるとともに、ループアンロール係数に応じて丸められる、請求項15に記載のシステム。
JP2013124943A 2012-06-29 2013-06-13 ステージド・ループ命令 Active JP5882950B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US13/537,731 2012-06-29
US13/537,731 US9038042B2 (en) 2012-06-29 2012-06-29 Staged loop instructions

Publications (2)

Publication Number Publication Date
JP2014010832A true JP2014010832A (ja) 2014-01-20
JP5882950B2 JP5882950B2 (ja) 2016-03-09

Family

ID=48670409

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013124943A Active JP5882950B2 (ja) 2012-06-29 2013-06-13 ステージド・ループ命令

Country Status (4)

Country Link
US (1) US9038042B2 (ja)
EP (1) EP2680132B1 (ja)
JP (1) JP5882950B2 (ja)
CN (1) CN103530088B (ja)

Families Citing this family (33)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101962248B1 (ko) * 2012-03-16 2019-03-27 삼성전자주식회사 재구성 가능 프로세서의 검증 지원 장치 및 방법
US9244677B2 (en) 2012-09-28 2016-01-26 Intel Corporation Loop vectorization methods and apparatus
US10585801B2 (en) 2012-11-26 2020-03-10 Advanced Micro Devices, Inc. Prefetch kernels on a graphics processing unit
US9459871B2 (en) * 2012-12-31 2016-10-04 Intel Corporation System of improved loop detection and execution
EP2972781A4 (en) 2013-03-15 2016-10-19 Intel Corp METHOD AND SYSTEMS FOR VECTORIZING SCALAR COMPUTER PROGRAM GRINDINGS WITH GRINDING DEPENDENCIES
CN103942158B (zh) * 2014-02-17 2017-08-25 上海新储集成电路有限公司 一种具有智能优化循环指令模块功能的自学习系统
JP6245031B2 (ja) * 2014-03-27 2017-12-13 富士通株式会社 コンパイルプログラム、コンパイル方法およびコンパイル装置
GB2524126B (en) * 2014-08-28 2016-07-27 Imagination Tech Ltd Combining paths
CN104317572B (zh) * 2014-09-30 2017-05-24 南京大学 一种实时系统的循环边界内向分析方法
CN107193535B (zh) * 2017-05-16 2019-11-08 中国人民解放军信息工程大学 基于simd扩展部件的嵌套循环向量并行的实现方法及其装置
EP3776241B1 (en) * 2018-03-31 2023-06-28 Micron Technology, Inc. Loop thread order execution control of a multi-threaded, self-scheduling reconfigurable computing fabric
CN109086049B (zh) * 2018-07-25 2021-11-02 北京金和网络股份有限公司 遍历用户在线状态数据的方法
US10691430B2 (en) * 2018-08-27 2020-06-23 Intel Corporation Latency scheduling mehanism
JP2021039658A (ja) * 2019-09-05 2021-03-11 富士通株式会社 Ac並列化回路、ac並列化方法及び並列情報処理装置
US11366646B2 (en) * 2020-01-23 2022-06-21 Huawei Technologies Co., Ltd. Method and apparatus for predicting and scheduling copy instruction for software pipelined loops
WO2021161532A1 (ja) * 2020-02-14 2021-08-19 日本電気株式会社 ループアンローリング処理装置、方法およびプログラム
US20230110355A1 (en) * 2020-02-14 2023-04-13 Nec Corporation Loop unrolling processing apparatus, method, and program
US11340958B2 (en) 2020-07-08 2022-05-24 Vmware, Inc. Real-time simulation of compute accelerator workloads for distributed resource scheduling
JP7653021B2 (ja) * 2021-05-28 2025-03-28 富士通株式会社 コンパイラ、コンパイル方法、及びコンパイラ装置
US11782725B2 (en) * 2021-08-16 2023-10-10 Micron Technology, Inc. Mask field propagation among memory-compute tiles in a reconfigurable architecture
US12436750B2 (en) * 2021-11-24 2025-10-07 International Business Machines Corporation Selecting an epilogue vectorization factor for use in computer processing
US12182552B2 (en) * 2022-05-24 2024-12-31 Xilinx, Inc. Splitting vector processing loops with an unknown trip count
US12493466B1 (en) 2023-08-30 2025-12-09 Ventana Micro Systems Inc. Microprocessor that builds inconsistent loop that iteration count unrolled loop multi-fetch block macro-op cache entries
US12498928B1 (en) 2023-08-30 2025-12-16 Ventana Micro Systems Inc. Microprocessor that builds multi-fetch block macro-op cache entries in two-stage process
US12450067B1 (en) 2023-08-30 2025-10-21 Ventana Micro Systems Inc. Microprocessor that performs selective multi-fetch block macro-op cache entry invalidation
US12498926B1 (en) 2023-08-30 2025-12-16 Ventana Micro Systems Inc. Microprocessor that builds consistent loop iteration count unrolled loop multi-fetch block macro-op cache entries
US12498927B1 (en) * 2023-08-30 2025-12-16 Ventana Micro Systems Inc. Microprocessor that allows same-fetch block start address co-residence of unrolled loop multi-fetch block macro-op cache entry and loop body macro-op cache entry used to build same
US12498929B1 (en) 2022-11-03 2025-12-16 Ventana Micro Systems Inc. Microprocessor that performs partial fallback abort processing of multi-fetch block macro-op cache entries
US12450066B1 (en) 2023-08-30 2025-10-21 Ventana Micro Systems Inc. Microprocessor that builds sequential multi-fetch block macro-op cache entries
US12493469B1 (en) 2023-08-30 2025-12-09 Ventana Micro Systems Inc. Microprocessor that extends sequential multi-fetch block macro-op cache entries
US12498933B1 (en) 2023-08-30 2025-12-16 Ventana Micro Systems Inc. Prediction unit that predicts successor fetch block start address of multi-fetch block macro-op cache entry
US12487926B1 (en) 2023-08-30 2025-12-02 Ventana Micro Systems Inc. Prediction unit that predicts branch history update information produced by multi-fetch block macro-op cache entry
US12493468B1 (en) 2023-08-30 2025-12-09 Ventana Micro Systems Inc. Microprocessor that performs mid-macro-op cache entry restart abort processing

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003108387A (ja) * 2001-09-27 2003-04-11 Toshiba Corp ソフトウエア・パイプライニング処理方法及びソフトウエア・パイプライニング処理装置
US7302557B1 (en) * 1999-12-27 2007-11-27 Impact Technologies, Inc. Method and apparatus for modulo scheduled loop execution in a processor architecture
JP2009230338A (ja) * 2008-03-21 2009-10-08 Fujitsu Ltd プロセサおよび情報処理装置
JP2011526045A (ja) * 2008-06-27 2011-09-29 クゥアルコム・インコーポレイテッド ループ制御システムおよび方法

Family Cites Families (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5920724A (en) * 1996-03-28 1999-07-06 Intel Corporation Software pipelining a hyperblock loop
US6289443B1 (en) 1998-01-28 2001-09-11 Texas Instruments Incorporated Self-priming loop execution for loop prolog instruction
US6954927B2 (en) * 1999-02-17 2005-10-11 Elbrus International Hardware supported software pipelined loop prologue optimization
US6820250B2 (en) * 1999-06-07 2004-11-16 Intel Corporation Mechanism for software pipelining loop nests
US6754893B2 (en) 1999-12-29 2004-06-22 Texas Instruments Incorporated Method for collapsing the prolog and epilog of software pipelined loops
US6629238B1 (en) 1999-12-29 2003-09-30 Intel Corporation Predicate controlled software pipelined loop processing with prediction of predicate writing and value prediction for use in subsequent iteration
US6567895B2 (en) 2000-05-31 2003-05-20 Texas Instruments Incorporated Loop cache memory and cache controller for pipelined microprocessors
US6615403B1 (en) * 2000-06-30 2003-09-02 Intel Corporation Compare speculation in software-pipelined loops
US6912709B2 (en) 2000-12-29 2005-06-28 Intel Corporation Mechanism to avoid explicit prologs in software pipelined do-while loops
US20020144092A1 (en) * 2001-01-31 2002-10-03 Siroyan Limited. Handling of loops in processors
GB2398411B (en) * 2001-10-12 2005-04-27 Pts Corp Processors and compiling methods for processors
US7415601B2 (en) 2002-06-28 2008-08-19 Motorola, Inc. Method and apparatus for elimination of prolog and epilog instructions in a vector processor using data validity tags and sink counters
US7159099B2 (en) * 2002-06-28 2007-01-02 Motorola, Inc. Streaming vector processor with reconfigurable interconnection switch
JP3847672B2 (ja) * 2002-07-03 2006-11-22 松下電器産業株式会社 コンパイラ装置及びコンパイル方法
JP3958662B2 (ja) 2002-09-25 2007-08-15 松下電器産業株式会社 プロセッサ
JP3974063B2 (ja) 2003-03-24 2007-09-12 松下電器産業株式会社 プロセッサおよびコンパイラ
US7631305B2 (en) * 2003-09-19 2009-12-08 University Of Delaware Methods and products for processing loop nests
US7168070B2 (en) 2004-05-25 2007-01-23 International Business Machines Corporation Aggregate bandwidth through management using insertion of reset instructions for cache-to-cache data transfer
US20050283772A1 (en) * 2004-06-22 2005-12-22 Kalyan Muthukumar Determination of loop unrolling factor for software loops
US7669042B2 (en) * 2005-02-17 2010-02-23 Samsung Electronics Co., Ltd. Pipeline controller for context-based operation reconfigurable instruction set processor
US7721267B2 (en) * 2005-05-16 2010-05-18 Texas Instruments Incorporated Efficient protocol for encoding software pipelined loop when PC trace is enabled
US7778494B2 (en) 2005-10-13 2010-08-17 Texas Instruments Incorporated FIR-based interpolation in advanced video codecs on VLIW processor
US7984431B2 (en) * 2007-03-31 2011-07-19 Intel Corporation Method and apparatus for exploiting thread-level parallelism
US7813567B2 (en) * 2007-04-26 2010-10-12 Texas Instruments Incorporated Method of CABAC significance MAP decoding suitable for use on VLIW data processors
US8213511B2 (en) 2007-04-30 2012-07-03 Texas Instruments Incorporated Video encoder software architecture for VLIW cores incorporating inter prediction and intra prediction
US8136107B2 (en) * 2007-10-24 2012-03-13 International Business Machines Corporation Software pipelining using one or more vector registers
WO2010033622A2 (en) 2008-09-17 2010-03-25 Reservoir Labs, Inc. Methods and apparatus for joint parallelism and locality optimization in source code compilation
WO2013089749A1 (en) * 2011-12-15 2013-06-20 Intel Corporation Methods to optimize a program loop via vector instructions using a shuffle table and a mask store table
US8949809B2 (en) * 2012-03-01 2015-02-03 International Business Machines Corporation Automatic pipeline parallelization of sequential code
US9239712B2 (en) * 2013-03-29 2016-01-19 Intel Corporation Software pipelining at runtime

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7302557B1 (en) * 1999-12-27 2007-11-27 Impact Technologies, Inc. Method and apparatus for modulo scheduled loop execution in a processor architecture
JP2003108387A (ja) * 2001-09-27 2003-04-11 Toshiba Corp ソフトウエア・パイプライニング処理方法及びソフトウエア・パイプライニング処理装置
JP2009230338A (ja) * 2008-03-21 2009-10-08 Fujitsu Ltd プロセサおよび情報処理装置
JP2011526045A (ja) * 2008-06-27 2011-09-29 クゥアルコム・インコーポレイテッド ループ制御システムおよび方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
JPN6015017249; 中田育男,森公一郎: 'リターゲッタブルコード生成' コンピュータソフトウェア 第25巻,第1号, 20081205, Pages:47〜64, 日本ソフトウェア科学会 *
JPN6015017250; IA-64 アプリケーション・デベロッパーズ・アーキテクチャ・ガイド 資料番号:245188J-001 , 199905, Pages:4の32〜4の36,7の11〜7の14, Intel Corporation *
JPN6016000654; B. Ramakrishna Rau, Michael S. Schlansker, P. P. Tirumalai: 'Code Generation Schema for Modulo Scheduled Loops' Proceedings of the 25th Annual International Symposium on Microarchitecture , 19921201, Pages:158-169, IEEE *

Also Published As

Publication number Publication date
CN103530088A (zh) 2014-01-22
JP5882950B2 (ja) 2016-03-09
US20140007061A1 (en) 2014-01-02
EP2680132B1 (en) 2018-08-01
US9038042B2 (en) 2015-05-19
CN103530088B (zh) 2016-08-17
EP2680132A3 (en) 2016-01-06
EP2680132A2 (en) 2014-01-01

Similar Documents

Publication Publication Date Title
JP5882950B2 (ja) ステージド・ループ命令
JP4042604B2 (ja) プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
US5854934A (en) Optimizing compiler having data cache prefetch spreading
US9766894B2 (en) Method and apparatus for enabling a processor to generate pipeline control signals
US8214831B2 (en) Runtime dependence-aware scheduling using assist thread
KR101559090B1 (ko) 이종 코어를 위한 자동 커널 마이그레이션
KR102204282B1 (ko) 다수의 기능 유닛을 가지는 프로세서를 위한 루프 스케쥴링 방법
US9639371B2 (en) Solution to divergent branches in a SIMD core using hardware pointers
EP2951682B1 (en) Hardware and software solutions to divergent branches in a parallel pipeline
JP6245031B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
KR102379894B1 (ko) 벡터 연산들 수행시의 어드레스 충돌 관리 장치 및 방법
JP2018519602A (ja) 連続ブロックの並列実行を有するブロックベースアーキテクチャ
US9354850B2 (en) Method and apparatus for instruction scheduling using software pipelining
US11714619B2 (en) Method and apparatus for retaining optimal width vector operations in arbitrary/flexible vector width architecture
CN113853583B (zh) 用于使用向量索引寄存器来寻址向量元素的多通道解决方案
US20050257200A1 (en) Generating code for a configurable microprocessor
JP2021507374A (ja) 命令を実行するためのシステム及び方法
KR102161055B1 (ko) 소프트웨어 파이프라이닝을 이용한 명령어 스케줄링 방법 및 장치
US20250181334A1 (en) Loop pipelining semantics using structured control flow (scf) operations with explicitly passed-in asynchronous tokens
JPH06290057A (ja) ループ最適化方法
Sura et al. Using multiple threads to accelerate single thread performance
Gray et al. Static instruction scheduling for the HARP multiple-instruction-issue architecture

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20140716

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20150421

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20150512

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20150812

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20150914

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20151013

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: 20160113

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160204

R150 Certificate of patent or registration of utility model

Ref document number: 5882950

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

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