特許第5882950号(P5882950)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ アナログ・デバイシズ・インコーポレーテッドの特許一覧

<>
  • 特許5882950-ステージド・ループ命令 図000005
  • 特許5882950-ステージド・ループ命令 図000006
  • 特許5882950-ステージド・ループ命令 図000007
  • 特許5882950-ステージド・ループ命令 図000008
  • 特許5882950-ステージド・ループ命令 図000009
  • 特許5882950-ステージド・ループ命令 図000010
  • 特許5882950-ステージド・ループ命令 図000011
  • 特許5882950-ステージド・ループ命令 図000012
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】5882950
(24)【登録日】2016年2月12日
(45)【発行日】2016年3月9日
(54)【発明の名称】ステージド・ループ命令
(51)【国際特許分類】
   G06F 9/32 20060101AFI20160225BHJP
   G06F 9/30 20060101ALI20160225BHJP
   G06F 9/45 20060101ALI20160225BHJP
   G06F 15/80 20060101ALI20160225BHJP
   G06F 17/16 20060101ALI20160225BHJP
【FI】
   G06F9/32 330A
   G06F9/30 350A
   G06F9/44 322G
   G06F15/80
   G06F17/16 G
   G06F17/16 J
   G06F17/16 E
【請求項の数】16
【外国語出願】
【全頁数】26
(21)【出願番号】特願2013-124943(P2013-124943)
(22)【出願日】2013年6月13日
(65)【公開番号】特開2014-10832(P2014-10832A)
(43)【公開日】2014年1月20日
【審査請求日】2014年7月16日
(31)【優先権主張番号】13/537,731
(32)【優先日】2012年6月29日
(33)【優先権主張国】US
(73)【特許権者】
【識別番号】501144003
【氏名又は名称】アナログ・デバイシズ・インコーポレーテッド
(74)【代理人】
【識別番号】100102842
【弁理士】
【氏名又は名称】葛和 清司
(72)【発明者】
【氏名】パーキンス,マイケル ジー.
(72)【発明者】
【氏名】ハイアム,アンドリュー ジェイ.
【審査官】 清木 泰
(56)【参考文献】
【文献】 特開2003−108387(JP,A)
【文献】 特表2011−526045(JP,A)
【文献】 特開2009−230338(JP,A)
【文献】 米国特許第7302557(US,B1)
【文献】 IA-64 アプリケーション・デベロッパーズ・アーキテクチャ・ガイド 資料番号:245188J-001,Intel Corporation,1999年 5月,Pages:4の32〜4の36,7の11〜7の14,引用頁の続き:12の1〜12の12,12の21〜12の23,URL,http://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/adag_j.pdf
【文献】 中田育男,森公一郎,リターゲッタブルコード生成,コンピュータソフトウェア,日本,日本ソフトウェア科学会,2008年12月 5日,第25巻,第1号,Pages:47〜64
【文献】 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,IEEE,1992年12月 1日,Pages:158-169
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/30− 9/42
G06F 9/44− 9/455
G06F17/16
G06F15/80
(57)【特許請求の範囲】
【請求項1】
コンピュータプロセッサによってループを実行する方法であって、
前記ループ用のループカーネル命令であって、それぞれがそれに関連するステージ番号を有するループカーネル命令を、前記コンピュータプロセッサのメモリにロードすること;
前記ループの各反復中に、ループアンロール係数と等しい量だけ増分されるステージ閾値を決定すること;
前記ステージ閾値およびステージ番号に基づいて、前記ループカーネル命令の第1のサブセットを実行することによってループプロログを実行すること;
前記ループカーネル命令を繰り返し実行することによってループカーネルを実行すること;
前記ステージ閾値およびステージ番号に基づいて、前記ループカーネル命令の第2のサブセットを実行することによって、ループエピログを実行すること
を含む、前記方法。
【請求項2】
コンピュータプロセッサがスカラープロセッサであって、ループカーネル命令が、命令レベル並列性またはマルチサイクルレーテンシを有する命令を含み、前記ループカーネル命令がソフトウェアパイプライン化されている、請求項1に記載の方法。
【請求項3】
ステージ番号が、アンロールされたループカーネルの各コピーに応じて調節される、請求項1に記載の方法。
【請求項4】
ループ命令の最終的な実行は、ループの初期の反復におけるよりも、より少ない処理要素またはベクトル要素上で行われる、請求項1に記載の方法。
【請求項5】
より少ない処理要素またはベクトル要素が、各処理要素またはベクトル要素を制御するマスクビットに応じて選択される、請求項4に記載の方法。
【請求項6】
ステージ閾値に関する情報を含む、ループセットアップ命令を受け取ることをさらに含む、請求項1に記載の方法。
【請求項7】
ループセットアップ命令が、合計ループ数、ループ命令を実行するのに使用する処理要素の数、ステージ数、またはループアンロール係数を含む、請求項6に記載の方法。
【請求項8】
ループエピログ、ループカーネル、およびループプロログを実行することが、命令ステージ番号をコンピュータプロセッサ内のステージ閾値と比較することを含む、請求項1に記載の方法。
【請求項9】
コンピュータ実行可能なループ命令を実行するシステムであって、
ループ情報を含むループセットアップ命令を受け取るためのシーケンサ;
ループアンロール係数と等しい量だけ増分されることが決定されるステージ閾値に関係するデータであって、前記ループ情報から導出されるデータを記憶する、1つまたは2つ以上のレジスタ;および
(i)前記ステージ閾値と、ループカーネル命令に関連するステージ番号に基づいて、受け取ったループカーネル命令の第1のサブセットを実行することによって、ループプロログを実行し、(ii)前記ループカーネル命令を繰り返し実行することによって、ループカーネルを、また(iii)前記ステージ閾値およびステージ番号に基づいて、前記ループカーネル命令の第2のサブセットを実行することによって、ループエピログを実行する、処理要素
を含む、前記システム。
【請求項10】
レジスタがステージマスクレジスタまたはステージ閾値レジスタを含む、請求項9に記載のシステム。
【請求項11】
前記システムが、ループカーネル命令を実行する少なくとも1つの追加の処理要素を含むか、
または、
前記システムにおける前記処理要素が、複数データ要素を並列に処理するためのベクトル命令を実行するベクトル要素であり、前記システムが、複数の前記ベクトル要素を含むものである、請求項9に記載のシステム。
【請求項12】
命令の最終実行中に、処理要素またはベクトル要素のサブセットだけが、ループカーネル命令を実行する、請求項11に記載のシステム。
【請求項13】
マスクレジスタが、最終反復においてループカーネル命令を実行することに関係した情報を記憶する、請求項12に記載のシステム。
【請求項14】
ループ情報が、合計ループ数、ループ命令を実行するのに使用する処理要素の数、ステージ数、またはループアンロール係数を含む、請求項9に記載のシステム。
【請求項15】
ループ数を記憶するループ数レジスタをさらに含む、請求項9に記載のシステム。
【請求項16】
ループ数が、合計ループ数を、ループ命令を実行するのに使用する処理要素の数で割ることによって導出されて、ステージ数に応じて調節されるとともに、ループアンロール係数に応じて丸められる、請求項15に記載のシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の態様は、一般的にはハードウェア並列性の効率的な使用に関し、具体的にはループアンローリング(loop unrolling)およびソフトウェアパイプライン化に関する。
【背景技術】
【0002】
コンパイラは、高レベル汎用言語(例えば、C、C++、またはJava(登録商標))で書かれたコンピュータソースコードを取り込み、それを低レベルの特定マシン向けオブジェクトコードに変換する。簡単な、シングルコアプロセッサ用のコンパイルコードは、比較的に単純明快な高レベル命令の低レベル命令への一対一の変換で構成することができる。例えば、C++クラスにおけるデータへのアクセスは、アドレス計算およびメモリアクセスのマシンレベル命令にコンパイルしてもよい。
【0003】
しかしながら、複数の機能ユニット、またはベクトル処理に対するサポートを有するプロセッサ用のコンパイルコードは、ずっと複雑になることがある。典型的な目標は、各コア(および/または所与のデバイスの特定のハードウェアに応じて、各プロセッサ、実行ユニット、およびパイプライン)をできるだけビジーに保つことによって、できる限り迅速にコンパイルされたプログラムを走らせることである。しかしながら、この目標には、最初に直列的/逐次的に書かれた命令を、並列に走るようにコンパイルすることが必要であるが、すべての命令が同時に実行可能であるわけではない。例えば、第2の命令に対する入力が、第1の命令の結果に依存する場合には、第1および第2の命令を並列に走らせることは不可能であり、第2の命令は第1の命令が完了するのを待たなければならない。
【0004】
「スマート」コンパイラは、並列に走らせることのできる命令を認識して、(超長命令語(VLIW:very-long-instruction-word)プロセッサ用に生成されたコードのように明示的に、またはスーパースカラプロセッサ用に生成されたコードのように暗示的に)それを行わせるように適合されたマシンコードを作成する。並列化可能な状況の2つの広範なカテゴリとして、(i)命令レベル並列性を発揮する命令、および(ii)データレベル並列性を発揮する命令があげられる。命令レベル並列性とは、互いの出力に対して依存性がなく、したがって並列に演算することのできる、2つ以上の命令を意味する。データレベル並列性とは、セットのメンバに対する個々のオペレーションが、他のメンバに関係するオペレーションに依存しない、データのセット(すなわち、ベクトル)に対して、オペレーションを実行することを意味している。例えば、2つのマトリックスを互いに加算するためには、要素レベルの加算オペレーションは独立であるので、マトリックス内の要素のデータレベル並列性を利用して、要素加算命令の一部または全部を並列に走らせてもよい。
【0005】
コンパイラが、命令レベルおよびデータレベルの並列性を達成する1つの方法は、ソースコード内に書かれたループ(例えば、forループまたはwhileループを)を利用することによる。ループの2回以上の反復を、並列に実行(すなわち、データレベル並列性を利用する、「ベクトル化」)してもよく、かつ/またはループの連続的反復を部分的に重複化(すなわち、命令レベル並列性を利用する、「ソフトウェアパイプライン化」)を行ってもよい。ソフトウェアパイプライン化の強力なアルゴリズムの1つが、「モジュロスケジューリング(modulo scheduling)」として知られている。ベクトル化に関しては、次のような場合には、(例えば)forループを呼び出して10回反復させてもよい;すなわち各反復において実行される命令が、その他の反復の命令と独立であり、かつコンパイラが(例えば)5つの処理要素にアクセスできる場合には、コンパイラは、5つの処理要素のそれぞれにおいて、当該ループの2回の反復を並列に実行させる、アセンブリコードを作成してもよい。ソフトウェアパイプライン化に関しては、例えば、あるループが2つの命令を含むが、第1の命令が、前回反復の第2の命令の結果に依存しない場合には、ループの次回反復の第1の命令を、ループの現行反復のまだ実行中の第2の命令と、並列に走るようにスケジュール化してもよい。
【0006】
ベクトル化およびソフトウェアパイプライン化の1つの短所は、実行コードのサイズを増大させることである。ベクトル化には、ループの奇数サイズの最終反復に対応するコードが必要となる(例えば、ループが11回の反復を必要とし、5つの処理要素が利用可能である場合には、最後の反復は、処理要素の1つだけを使用する)。この「部分的に充填された」最終反復は、単に不効率であるだけにとどまらないことがある。つまり、多くの大規模プロセッサ配列は、正当なデータの安定したストリームを期待して調節されており、個々の処理要素をオフにすることは、それほど容易でないこともある。ソフトウェアパイプライン化には、効率的なコア命令のセット(「ループカーネル(loop kernel)」)を走らせる前に、ハードウェア環境を準備するために、セットアップ命令(「ループプロログ(loop prolog)」)を必要とし、その後には、ループをテアダウン(tear down)し、さらに別の命令のためのハードウェア環境をクリーンアップするオーバヘッド命令(「ループエピログ(loop epilog)」)がさらに必要である。多くの場合に、この追加の、オーバヘッドコードは、ループカーネルコードそれ自体よりも大きくなることもあり、制限された命令キャッシュまたはバッファキャパシティを有するプロセッサ上で、性能を低下させることがある。もう一つの短所は、可変の反復数(ループの「トリップ数」と呼ばれる)を有するループの扱いのまずさであり、この理由は、トリップ数はコンパイル時には知ることはできず、トリップ数の様々なテストが実行時には必要となり、それによって(特に、トリップ数が小さいときに)プログラムのランタイムが増大するためである。
【0007】
これらの欠点に対処しようとする既存のシステムは、さらなる短所を生成するだけである場合がある。例えば、プロセッサによっては(例えば、ベクトルプロセッサは)、ループの最終反復において、個々の処理要素を選択的に動作不能にする方法を実装するものもある。しかしながら、ループの最終反復において処理エレメントを動作不能にすることは、ループカーネルにおける様々な反復からの命令と重複する、ソフトウェアパイプライン化とうまく相互作用しない。その他のシステムは、ループ命令を固定サイズのバッファに記憶して、特殊なループ命令を発行することによって、ループのセットアップ、テアダウンおよび定常状態を表わすが、これらのシステムは、(固定バッファのサイズに基づいて)ループカーネルのサイズを制限するだけでなく、より複雑なループ(レジスタリネーミング(register renaming)を必要とするものなど)を取り扱うこともできない。さらに別のシステムは、精密な回転ハードウェアレジスタ(rotating hardware resistor)を使用して、複雑なループに対処するが、これらのレジスタは、プロセッサの他の部分から貴重なリアルエステートを取り上げる。したがって、任意のサイズと複雑度のループカーネルを効率的に実行する方法に対するニーズがある。
【発明の概要】
【0008】
一般的には、本明細書に記載されるシステムおよび方法の様々な観点は、ソフトウェアプロログおよびエピログを必要とすることなく、ソフトウェアパイプライン化された、ベクトル化ループのセットアップおよびテアダウンを可能にする、コンパイラとハードウェアメカニズムを提供する。本発明の態様は、コードサイズを低減して、未知のトリップ数の場合には、結果として得られるコードの性能を向上させる。ループコードが分析されて、各命令に、実行の全体順序を反映するステージ番号が割り当てられ、具体的には、各命令を、時間的に順序づけられた複数の「ステージ」の1つに割り当ててもよく、これらのステージのそれぞれは、実行順序内でその位置を反映する「ステージ番号」を有する。このループが実行されると、その中の命令が、そのステージ番号に基づいて、選択的に実行される。
【0009】
一観点において、コンピュータプロセッサによってループを実行する方法は、このループ用のループカーネル命令を、コンピュータプロセッサのメモリ中にロードすることを含む(この場合に、各ループカーネル命令は、それに関連するステージ番号を有する)。ステージ閾値がループの各反復中に判定されて、このステージ閾値およびステージ番号に基づいて、ループカーネル命令のサブセットを実行することによって、ループプロログが実行される。ループカーネルは、ループカーネル命令を繰り返し実行することによって実行され、ループエピログは、ステージ閾値とステージ番号に基づいてループカーネル命令のサブセットの内の第2のセットを実行することによって実行される。
【0010】
コンピュータプロセッサは、スカラープロセッサとしてもよく、この場合に、ループカーネル命令は、命令レベル並列性またはマルチサイクルレーテンシを有する命令を含み、かつ/またはループカーネル命令がソフトウェアパイプライン化されている。ステージ番号は、アンロールされたループカーネルの各コピーに応じて調節してもよい。ループ命令の最終的な実行は、ループの初期の反復におけるよりも、より少ない処理要素またはベクトル要素上で行ってもよい。このより少ない処理要素またはベクトル要素は、各処理要素またはベクトル要素を制御するマスクビットに応じて、選択してもよい。ステージ閾値に関する情報を含むループセットアップ命令を受け取ってもよく、このループセットアップ命令には、合計ループ数、ループ命令を実行するのに使用する処理要素の数、ステージ数(stage count)、またはループアンロール係数(loop-unroll factor)を含めてもよい。ループエピログ、ループカーネル、およびループプロログを実行することには、命令ステージ番号をコンピュータプロセッサ内のステージ閾値と比較することを含めてもよい。
【0011】
別の観点においては、コンピュータ実行可能なループ命令を実行するシステムは、ループ情報を含むループセットアップ命令を受け取るためのシーケンサを含む。1つまたは2つ以上のレジスタが、ステージ閾値に関係するデータを記憶する(このデータは、前記ループ情報から導出される)。処理要素は、(i)ループカーネル命令に関連するステージ閾値およびステージ番号に基づいて、受け取ったループカーネル命令のサブセットを実行することによって、ループプロログを実行し、(ii)ループカーネル命令を繰り返し実行することによって、ループカーネルを実行し、また(iii)ステージ閾値およびステージ番号に基づいて、ループカーネル命令のサブセットの第2のセットを実行することによって、ループエピログを実行する。
【0012】
レジスタは、ステージマスクレジスタまたはステージ閾値レジスタを含めてもよい。少なくとも1つの追加の処理要素がループカーネル命令を実行するか、またはベクトル命令が、複数のデータ要素を並列に処理してもよい。命令の最終実行中に、処理要素またはベクトル要素のサブセットだけが、ループカーネル命令を実行してもよい。マスクレジスタは、最終反復においてループカーネル命令を実行することに関係した情報を記憶してもよい。ループ情報には、合計ループ数、ループ命令を実行するのに使用する処理要素の数、ステージ数、またはループアンロール係数を含めてもよい。ループ数レジスタはループ数を記憶してもよく、このループ数は、合計ループ数を、ループ命令を実行するのに使用する処理要素の数で割ることによって導出して、ステージ数に応じて調節するとともに、ループアンロール係数に応じて丸めてもよい。
【0013】
本明細書において開示する本発明の長所と特徴と共に、これらおよびその他の目的は、以下の説明、添付の図面および特許請求の範囲を参照すれば、より明白になるであろう。さらに、本明細書に記載する様々な態様の特徴は、互いに排他的ではなく、様々な組合せと順列で存在することができることを理解されたい。
【図面の簡単な説明】
【0014】
図面において、同一の参照符号は、異なる図を通して、全体的に同一の部品を指している。以下の説明においては、本発明の様々な態様を、以下の図面を参照して説明する。
【0015】
図1図1は、本発明の一態様による、ループ命令にステージ情報の注釈をつける方法を示すフローチャートである。
図2図2は、本発明の一態様による、ステージド・ループの実行を示すブロック図である。
図3図3は、本発明の一態様による、部分的にアンロールされたステージド・ループの実行を示すブロック図である。
図4図4は、本発明の一態様による、遅延開始を必要とする部分的にアンロールされたステージド・ループの実行を示すブロック図である。
図5図5は、本発明の一態様による、複数処理要素上で走るステージド・ループの実行を示すブロック図である。
図6図6は、本発明の一態様による、ループ命令にステージを用いて注釈をつけるシステムのブロック図である。
図7図7は、本発明の一態様による、ステージド・ループ命令を実行するシステムのブロック図である。
図8図8は、本発明の一態様による、ステージド・ループ命令を実行する方法のフローチャート図である。
【0016】
詳細な説明
本明細書においては、効率的にループカーネルをセットアップおよびテアダウンするために、どの命令を、どの順序で、実行しなければならないかに関する追加の情報を、ループカーネル命令、またはループ命令のグループにタグ付けすることによって、複数の処理要素または機能ユニットを有する、コンピュータシステム上でループを走らせる方法およびシステムの様々な態様を記載する。プロセッサが命令を受け取ると、タグ情報を分析し、それに基づいて、ループカーネルを実行する前後に、ループカーネル情報のあるものを実行し、それによって明示的なループセットアップ/テアダウン命令を不要にする。例えば、コンパイラは、ループ内のいくつかの命令に[0]タグを、その他の命令に[1]タグを、さらに他の命令に[2]タグをタグ付けしてもよく、非常におおざっぱには、以下でより詳細に説明するように、タグ付けされたグループ内の命令は、命令レベル並列性を示し、より大きい番号でタグ付けされたグループにおける命令は、より小さい番号のグループにおける命令の出力に依存することがある。ループの最初の反復において、プロセッサは、[0]をタグ付けされた命令を(並列に)実行し、第2の反復において、[0]または[1]をタグ付けされた命令を、そして第3および後続の反復において、すべての命令(すなわち、[0]、[1]または[2]のいずれかをタグ付けされた命令)を実行してもよい。ループの最後から2番目の反復において、プロセッサは、[1]または[2]をタグ付けされた命令だけを実行し、ループの最終反復において、[2]をタグ付けされた命令だけを実行してもよい。以下でより詳細に説明するように、この簡単な例を、より複雑なループおよび/またはプロセッサアーキテクチャに拡張することができる。
【0017】
説明の目的で、ループについてのいくつかの一般属性または特性を最初に定義する。従来型のループ用のコードは、ループセットアップ命令(すなわち、ループプロログ)、ループカーネル、およびループテアダウン命令(すなわち、ループエピログ)が含まれる。本発明の一態様によって実行されるループは、ループ命令のすべてが実行されるわけではない、その実行の発端での1回または2回以上の反復、ループ命令のすべてが実行される、1回または2回以上の反復(すなわち、ループの実行の「定常状態」部分)、および、最終的に、ループ命令のすべてが実行されるわけではない、ループの実行の終端における、1回また「は2回以上の反復を含む。一態様において、ループ実行の発端および終端での反復によって、ループの定常状態部分に対するセットアップおよびテアダウン機能が、それを行うための明示的な追加命令を必要とすることなく、得られる。
【0018】
パイプライン化されたループにおける、それぞれの連続するループ反復の始点間の合計サイクル数は、開始間隔(initiation interval)と呼ばれており、これは、定常状態ループカーネル内の命令行数でもある。この定常状態において全(開始間隔)サイクルを実行するときに、新規の反復が始まり、同時に、先に始まった反復がその実行を終了する。開始間隔は、非パイプライン化ループの反復を完了するのに要する合計サイクル数よりも短く、その理由は、最初のループの複数反復が重複して、ループの後からの反復を、先の反復が完了する前に始めることを可能にするからである。例えば、開始間隔が2であり、反復を完了するのに必要な合計サイクル数が6であるとすると、反復n、n+1、およびn+2は、すべて同時にインフライト(in flight)となる。
【0019】
ループ内の命令は、ループ反復が始まってから経過した開始間隔の倍数によって決まる「ステージ番号」が与えられる。上記の例において、非パイプライン化ループにおける最初の2つの命令行は第1のステージに属し、命令行3および4は第2のステージに属するのに対して、命令行5および6は、第3のステージに属する。ステージの合計数は、ステージ数と呼ばれ、この例においては、ステージ数は3である。ループカーネルの定常状態においては、反復nは、最終ステージ(この場合には、第3のステージ)における命令を実行しており、反復n+1は、最後から2番目のステージ(この場合には、第2のステージ)を実行しており、以下同様である。我々の例においては、反復n+2は、第1のステージにおいて命令を実行することによって、実行を開始している。
【0020】
本発明の一態様においては、ステージ番号は、ループカーネルにおける命令にタグ付けするのに使用される。第1のステージに属する命令は[0]をタグ付けされ、第2のステージに属する命令は[1]をタグ付けされ、以下同様である。
【0021】
開始間隔が小さくなるほど、より効率的なループカーネルが得られる。開始間隔を減少させるのを助ける要因としては、プロセッサ上で利用可能な機能ユニット数が大きいこと、および命令間のデータ依存性の数が小さいことがあげられる。また、小さい開始間隔は、一般に、ループのためのコードを発生させるのに必要なステージ数を増大させ、これによって、明示的なループプロログおよびエピログを発生させなければならない場合には、より多くのコード拡張につながる。ループが定常状態に達する前に走らせる必要のあるステージの数は、ステージ数より1つ少ない数(すなわち、ステージ数−1)であり、ループが定常状態に達する前に走らせる必要のあるサイクルの数は、(ステージ数−1)×(開始間隔)である。本発明の一態様においては、このオーバヘッドに対するコード拡張は除外される。
【0022】
ループをアンロールすることは、ループ命令の一部または全部を、より多数の非ループ命令でリライトすることを意味する。6回反復する、2命令forループは、例えば、12の通常(非ループ)命令としてリライトすることによって完全にアンロールすることができる。別の例として、そのforループは、反復毎の命令は多いが、合計反復は少なくなるようにリライトすることによって、部分的にアンロールすることができる(例えば、3回反復する4命令forループ)。ループが最初に、奇数の反復数を有するように書かれている場合(例えば、5回反復する2命令forループ)には、この部分アンロール技法は、ループ外に初期(または最終)命令セットを含めることができる(例えば、2命令+2回反復する4命令forループ)。
【0023】
ループアンローリングは、ループが、その結果が長時間、ライブである(すなわち、利用可能にしておく必要がある)命令を包含するときに、ソフトウェアパイプライン化を容易にするのに使用してもよい。パイプライン化されたカーネル内で、毎(開始間隔)サイクル、新規の反復が始まるので、命令の結果は、普通、その定義後に(開始間隔)サイクルを超えて使用することができず、結果として、この使用に達する前の後続の反復における命令のコピーによって上書きまたは「クロバリング(clobbering)」される。この問題は、ループカーネルをアンロールすることによって解決してもよい。ループをアンロールすることは、勿論のこと、長寿命命令の別のコピーをループカーネル中に導入し、この命令が長寿命値を上書きすることを避けるために、(先の命令の結果をクロバリングするのを回避するように、)その値をその中に記憶する、リネームされたレジスタが与えられる。上記で定義された用語の1つを使用すると、ループカーネルは、ループの開始間隔(すなわち、ループの「長さ」)が、ループ内の命令の1つ(すなわち、「長寿命」命令)の寿命よりも短い場合に、アンロールされる。必要なアンローリングのレベルは、開始間隔をどの程度、超えているかの関数であり、ループアンロール係数と呼ばれている。アンローリングが必要でない場合には、ループアンロール係数は1であり、ループカーネルの2つのコピーが必要である場合には、ループアンロール係数は2であり、以下同様である。
【0024】
ループの別の属性は、その反復回数が固定であるか、可変であるかである。固定であれば、コンパイラは、(例えば)反復回数が奇数であるか、または偶数であるか(これは、上記で考察したように、部分的にアンロールされたループに影響を与える)を試験して、それに応じてコードを発生させることによって、その実行を容易にスケジューリングすることができる。しかしながら、反復回数が可変である場合には(例えば、1からxまで反復するforループ)、コンパイラは、反復回数が奇数であるか、偶数であるかを知ることができない。
【0025】
次に、本発明の一態様に注目すると、図1は、ループに対するコードをコンパイルする方法100を示している。第1ステップ102において、命令依存関係(例えば、命令レベルまたはデータレベルの並列性に対する障害)が、ループ命令において判定される。第2ステップ104において、マシン上で利用可能な並列リソースを超えることなく、(開始間隔)サイクル毎に、新規の反復を開始させて、現在実行中の反復と重複させるように、開始間隔と共に、これらの依存関係に従う、ループの非パイプライン化版が生成される。第3ステップ106において、ループに対するループアンロール係数が(例えば、ループの開始間隔およびループ命令の寿命に基づいて)判定される。第4ステップ108において、ループの反復数(例えば、未知か既知か、既知であれば、奇数か偶数か)が判定される。第5ステップ110において、依存関係およびハードウェア上で利用可能な並列性に少なくとも部分的に基づいて、ステージ番号がループ内の命令に対して割り当てられる。
【0026】
一態様においては、所与のループに対する命令は、それらの間の依存関係を有するが、ループに対するアンロール係数は1であり(すなわち、アンローリングを必要としない)、ループの反復数は既知である。この態様においては、コンパイラは、各ループ命令に、パイプライン情報、すなわちステージ番号をタグ付けする。この情報は、3ビットまたは4ビットのバイナリ数の形態にすることができるが、本発明は、この情報のいかなる特定の表現にも限定されるものではない。ステージ番号は、命令コード化自体の範囲に保持するか、または並列データ構造などの、別のメカニズムで規定してもよい。
【0027】
実行中に、ループの走行は最終的に定常状態に達し、この状態では、各反復においてすべてのループ命令が実行されるが、定常状態に達する前には、各反復においてループ命令のサブセットだけが実行される。独立した命令が最初に実行され、場合によっては、それらの最初の命令に依存する可能性のある中間の命令が続き、最初の命令および中間の命令に依存する可能性のある命令が続き、すべての命令が実行されるまで、以下同様である。ループの最後の数回の反復において、最初に実行を始めた命令が実行を停止し、後に追加された、依存性を有する命令が、すべての命令がその指示された回数実行されるまで、実行される。
【0028】
意味論的(semantically)には、命令は、そのステージ番号を、各反復において変わる可能性のあるステージ閾値に対して試験することによって、実行される。ループセットアップ部分において、命令は、そのステージ番号がステージ閾値以下である場合に実行され、ループテアダウン部分においては、命令は、そのステージ番号がステージ閾値以上である場合に実行される。ステージ閾値は、ループセットアップ部分およびテアダウン部分の間には、各反復毎に増分され、ステージ閾値は、ループセットアップ部分においてその最も低い値に初期化され、ループテアダウン部分において2番目に低い値に初期化される。ステージ閾値は、ループの定常状態部分においては一定のままである。一態様においては、ステージ閾値は、以下により詳細に説明するように、ループアンロール係数と等しい量だけ増分される。ハードウェアにおけるそのような意味論を達成するのには多くの方法があり、本発明はステージ閾値を使用することに制限されるものではないことを当業者は理解するであろう。同一の結果を得るためのその他の方法として、ループカーネルの次の反復を始めるに当たり、シフトさせることのできるマスクレジスタを使用すること、またはループトリップ数、ステージ数およびアンロール係数の値から導出される、その他の状態の使用することがある。ステージ閾値の考察は、本明細書においては、説明を分かり易くする目的だけで使用される。
【0029】
図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]に割り当てる。
【0030】
ループカーネルの開始間隔も判定してもよい。上記で考察したように、開始間隔は、パイプライン化されたループカーネルの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サイクルで実行
【0031】
この情報を使用して、命令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の実行の後に行われ、それによって命令間の依存関係/コンフリクトが満足されることに留意されたい。
【0032】
この例200においては、ループは、第3の反復202において定常状態に入る。ステージ閾値は、再び、[2]へ増分されて、全部の命令が実行される。その他のループは、ループの性質に応じて、より少ない、またはより多いセットアップ反復を必要とすることがあり、本発明は、いかなる特定のセットアップ(またはテアダウン)反復の回数にも限定はされない。
【0033】
ループが最後から2番目の反復に到達すると、そのループは、ループカーネル202を出て、第1のテアダウン反復208へと入る。ステージ閾値は、2番目に低い値(すなわち[1])に初期化されて、テアダウン部分において、ステージ閾値以上のステージ番号を有する命令(すなわち、命令c[1]、d[2]、およびe[2])だけが実行される。言い換えると、この例では、命令aおよびbは、すでに、それらが必要とされる3回の回数、実行されており、それらの実行は、第1のテアダウン反復208において停止される。ステージ閾値は、再び[2]に増分されて、最終テアダウン反復210においては、命令d[2]およびe[2]だけが実行されて、各命令が3回実行されるという要件を満足し、同時に命令間の依存関係を尊重する。
【0034】
本発明の別の態様において、再び図1のステップ104を参照すると、ループは部分的なアンローリングを必要とする。上記で考察したように、この要件は、ループ内の命令の結果の寿命が、ループの開始間隔を超えるときに行われる。上記のように、命令には、それらの依存関係に応じたステージ番号が割り当てられるとともに、命令は、その命令を走らせるハードウェアの制限に応じて、ループの各反復においてスケジューリングされる。さらに、この態様においては、長寿命命令結果がそれを使用するまで保存されることを可能にする必要があるので、ループカーネルはアンロールされる(すなわち、ループ命令は、ループカーネルにおいて複製される)。一態様において、オリジナルループカーネルの、それぞれの連続的複製において、(i)命令のステージ番号が、1だけ減分され、(ii)複製の(すなわち、リネームされた)レジスタが、(それによってそれらの値が互いにクロバリングするのを防止するために)ループカーネルでの長寿命命令の複製(複数を含む)に対して定義される。最終的に、(ループアンロール係数が1である)上記の例においては、命令は、ステージ閾値を1だけ増分させることによって実行するために選択されるが、ステージ閾値は、(ループの2つ以上のアンロールされた反復が、ループカーネルにおいて存在することを反映するために)ループアンロール係数だけ増分される。また、この機能を提供するその他の方法が、それに制約はされないが、マスクレジスタの使用を含む、ハードウェアにおいて可能である。本明細書における、ステージ閾値による説明は、分かり易くするために示したものである。
【0035】
一般に、ステージ番号の範囲は、ゼロから必要な最大値(例えば、1、2、またはそれ以上)までにわたるように割り当てることができる。しかしながら、ループアンロール係数が、1よりも大きいときには、ステージ番号範囲の下限は、負の数としてもよい。一態様において、下限は(1−ループアンロール係数)に等しく、上限は(ステージ数−1)に等しい。任意の便利な範囲を使用してもよいが、本発明は、いかなる特定の範囲にも限定されない。例えば、(1−ループアンロール係数−ステージ数)から−1までの全負の範囲によって、ハードウェアの設計を簡略化してもよい。
【0036】
前例のように、説明のための例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と同様の方法で、ループを走らせてもよい。
【0037】
しかしながら、この場合には、命令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];
【0038】
再び図3を参照すると、ループカーネル302が、ループカーネル命令a[0]、b[1]、およびc[3]の第1の反復を含む、第1の部分304、およびステージ番号を1だけ減分された(例えば、a[-1],b[0],c[2])、同一の命令を含む、第2の部分306と共に、示されている。上記の例のように、このループを実行するシステムは、この情報(すなわち、ループカーネル命令およびそのタグ情報)だけを渡されて、それらだけに基づいて、ループセットアップ命令およびループテアアダン命令を導出してもよい。
【0039】
すなわち、ループの第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]の結果に上書きするのを避けるために、リネームされたレジスタに記憶される。
【0040】
上記のように、第2の反復310の命令が実行されて、(かつ、命令b[0]の場合には、まだ実行中であると)、ループカーネル302の命令の実行が始まる。一態様においては、ステージ閾値は、再び、2だけ(すなわち、ループアンロール係数に等しい量だけ)増分して[4]にされて、[4]は最大ステージ番号よりも大きいので、ループ内のすべての命令が実行される。ここでも、ループカーネル302の1つのコピーだけが図示されているが、これは、ループの定常状態部分であり、(オリジナルソースコードに指定されたループパラメータに応じて、)任意の回数、実行してもよい。
【0041】
ループの最後から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サイクル後に実行される)。
【0042】
本発明の別の態様においては、図1のステップ108を参照すると、ループの反復数は、コンパイル時には既知ではないことがある。図2に示された例200におけるように、ループアンロール係数が1である場合には、反復回数における不確定性は問題とはならず、ループの定常状態部分は、実行時反復回数に応じて、必要な回数だけ単に繰り返えされる。しかしながら、ループアンロール係数が1より大きい場合には、必要な反復数を生成するのはより困難である。ループカーネルにおける部分的にアンロールされたループは、2つ以上の反復を内蔵しているので、これらの2つ以上のアンロール反復の倍数ではない、合計ループ反復回数は、構築するのが困難であろう。
【0043】
例として、図3に示されたループ300は、(ループアンロール係数2を有する、)部分的にアンロールされたカーネル302を有する。その簡単な例においては、カーネル302は、1回だけ実行され、ループの合計反復数は7(すなわち、各命令は7回、実行される)である。合計反復数が9、11、または13などである場合には、ループカーネル302は、2、3、または4回繰り返されて、必要な合計反復数を生成する。しかしながら、所望の反復の合計数が8である場合に、図3のループ構造は、修正なしにその数を生成することはできない(すなわち、ループ302の1回の反復は少なすぎるが、2回の反復は多すぎる)。
【0044】
一態様において、ループセットアップの第1の反復を構成する命令は、所望の合計反復数を生成するために、必要に応じて、1回または2回以上の開始間隔だけ遅延される。ソースコードにおいてオリジナルループによってコールされる反復数はNであり、本発明の態様により構築されるループの反復数は(N+[ステージ数−1])であり、この場合に、(ステージ数−1)の追加反復は、ループセットアップおよびテアダウンの反復に使用することができる。(N+[ステージ数−1])がループアンロール係数の整数倍数でない場合には、そうなるまで切り上げられる(すなわち、ループを、少なくとももう1反復、走らせるように設定される)。この場合には、ステージ閾値の初期値は、ゼロより低く低減されて、その結果として、パイプライン化されたループに入ると、アンロールされたループの初期部分はオフにされる。
【0045】
ここで再び、例をあげるのが役立つ。7回の合計反復を走らせるように構成された、図3のループ300が、図4の図解400に示されるように、8回の反復を走らせるように修正されている。普通は、ループの合計9回の反復を生成することになる、ループカーネル402が、2回実行されるように複製されている。しかしながら、この場合に、ステージ閾値の初期値が[−1]に設定されている。このラインにおけるすべての命令が、初期ステージ閾値よりも大きいステージ番号を有するので、したがって、ループプロログの第1のサイクル404は動作不能にされる。結果として、命令a、b、cのそれぞれは、(9回ではなく)8回実行される。
【0046】
404において指示される遅延の別の利点には、ループアンローリングにおいて必要なレジスタリネーミングが含まれる。パイプライン化されたループから外に出ると、ループ中に演算されて、その外部で使用される値は、正しい値を見出すことを可能にするために、既知のレジスタに記憶させなくてはならない。しかしながら、ループアンローリング中に、長寿命を有する結果のレジスタリネーミングの行為は、2つ以上のレジスタを生成し、その中では、ループの間中、その値はライブ状態である。ループカーネル402が、その実行の途中で出ることができる場合には(または、その実行が完全に終わる以外のある点において、2より大きいループアンローイング係数を有するループの場合には)、ループの外部で使用される結果の最終値は、これらのリネーミングされたレジスタのいずれかに保持してもよく、すなわち、ループトリップ数がコンパイル時に未知の場合には、どのレジスタがその最終結果を保持するかは分からない。ループプロログ404の始めに遅延404を設置することによって、カーネル402は、その実行を完了した後に出ることによって、どのレジスタがループにおける結果の最終値を保持しているかが常に確実にわかるようになる。カーネル402に入ると、必要であれば、リネーミングされたレジスタのすべてのコピーが、正しい初期値に初期化されることを確実にするのは容易である。
【0047】
一態様においては、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]を実行する。
【0048】
ループ命令にステージ番号を注釈付けする、システム600の一態様が、図6に示される。ソースコード分析モジュール602は、命令レベルまたはデータレベルの並列性を示す、候補命令(例えば、ループ命令)に対するソースコードを分析する。(モジュールは、通常、ソフトウェア形態で、すなわちプロセッサによる実行のために非揮発性メモリに記憶されたコンピュータ実行可能な命令のセットとして実現される。プログラムモジュールとしては、特定のタスクを実行するか、特定の抽象データタイプを実装する、ルーチン、プログラム、オブジェクト、構成要素、および/またはデータ構造、その他があげられる。しかしながら、当該技術において周知のように、機能モジュールも、特定のアプリケーションの要件に応じて、ハードウェアに実装するか、またはソフトウェア/ハードウェア混合構成要素として実装してもよい。)
【0049】
ソースコード分析モジュール602は、ソースコード内のこれらの命令を、パターンマッチング、構文解析、部分(または全体)コンパイル、または当該技術において知られているコードを分析するその他任意の方法に基づいて識別してもよい。任意の種類のソースコードが、本発明の範囲内である。識別がされると、本発明の態様によれば、ステージ番号発生モジュール604が、命令間依存関係、コードを走らせるハードウェアの制限または特徴、あるいはその他任意の関係する要因に基づいて、ステージ番号を命令に割り当てる。モジュール602、604の一方または両方が、開始間隔、ステージ数、および/またはループアンロール係数などのループに関係する特性を判定して、これらの特性の一部または全部を、ステージ番号を命令に割り当てる際に使用してもよい。ステージ番号が、命令の一部または全部に対して判定されると、アセンブリコードまたはオブジェクトコード出力モジュール606が、1つまたは2つ以上のターゲットプロセッサ上で実行するのに適した、(ステージ番号を含む)アセンブリコードまたはオブジェクトコードを、準備、フォーマット、かつ出力してもよい。しかしながら、本発明は、これらのモジュール602、604、606だけを含む、実装に限定されることはなく、当業者は、モジュール602、604、606に実装された機能は、より多数または少数のモジュールに実装してもよいことを理解するであろう。
【0050】
ステージ番号注釈を有するコードを実行するシステム700が、図7に示されている。シーケンサ702は、状態情報を包含し、1つまたは複数の処理要素(PE)704に命令を発行する。シーケンサ702は、ループアンロール係数、ループ内に残る反復数(すなわち、「ループ数」)、ループの各反復においてどのステージ番号を実行すべきか、および複数の処理要素704の内のどれが、ループの最後の反復において命令を実行すべきか、などの現在実行中のループに関する情報を記憶してもよい。当業者は、シーケンサ702を(または、その類似の機能を別の機能ブロック中に)実装する多くの方法があり、本発明はいずれの特定の実装形態に限定されないことを認識するであろう。さらに、処理要素704は、シーケンサによって制御される、任意のタイプの汎用または専用コンピューティングブロックとしてもよい。さらに、本発明はまた、この意味で別個の処理要素内に存在するかのように取り扱うことのできる、単一のコンピューティングユニット内で処理されるベクトル内の独立した要素の制御にも適用されることも理解されたい。そのようなマシンは、通常、単一命令多重データ(SIMD)プロセッサと呼ばれる。
【0051】
シーケンサ702(より具体的には、それを実装するハードウェア)は、ループ数を記憶するループ数(LC)レジスタ706や、(モジュロ可変拡張、または「MVE」アンロール係数としても知られている)ループアンロール数を記憶するループアンロール係数レジスタ708などの、状態情報を記憶するためのレジスタを含む。ステージマスクレジスタ710には、(そのステージ番号に基づいて)どの反復においてどの命令を実行すべきかに関する情報が場所を占めており、例えば、ステージマスクレジスタ710の1ビットが、ステージ[0]の命令が実行されるべきことを指示し、別のビットが、ステージ[1]の命令が実行されるべきことを指示し、また以下同様にしてもよい。ステージマスクレジスタは、(各処理要素794が、各反復において異なるステージ番号を有する命令を実行してもよいことを説明するために)各処理要素704において、ローカルステージマスクレジスタ714内に再生してもよい。最終反復マスク(FMASK)レジスタ712は、ループの最終反復において、複数の処理要素704の内のどれを、オンまたはオフにすべきかを指示するのに使用してもよい。
【0052】
ループ数レジスタ706は、サイズが8ビット、16ビット、またはその他のビット数であってもよく、ループ数レジスタ706に記憶された値は、ループが反復する毎に(例えば、ループアンロール係数だけ)減少する。ループ数レジスタ706内の値が、ゼロに達すると、ループは、反復を停止する。ループアンロール係数レジスタ708は、サイズを2ビットとして、最大アンロール係数4をサポートとするか、サイズを3ビットとして最大アンロール係数8をサポートするか、またはその他のサイズとしてもよい。ステージマスクレジスタ710は、少なくとも、ループアンロール係数と最大ステージ数の合計に等しいサイズにしてもよい。一態様において、ステージマスクレジスタ710は、サイズが23ビットである。最終反復マスクレジスタ712は、処理要素704のそれぞれに対して1ビットを有してもよい。
【0053】
ループ命令を、シーケンサ702内の、状態レジスタ706、708、710、712を初期化するのに使用してもよい。このループ命令には、合計ループ数、使用する処理要素の数、ステージ数、およびループアンロール係数を指示するパラメータを含めてもよい。ループアンロール係数レジスタ708には、ループ命令において与えられる、ループアンロール係数の値をロードしてもよく、その他のレジスタ706、710、712の値は、以下に示すように、式(1)〜(3)に従って、ループ命令パラメータから導出してもよい。
【数1】
【数2】
【数3】
【0054】
式(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)番目ビット位置に再配置するのに使用される。
【0055】
ステージマスクレジスタ710の再演算されたコンテンツは、次いで、各処理要素704におけるレジスタのローカルコピー714に押し出され、ここで(LC−1)番目ビット位置は、それに到達すると、最後の反復中に、一部の処理要素704のスイッチをオフにさせる。各処理要素704は、命令を受け取り、デコードして、各命令のステージ番号を検査し、その処理要素のローカルマスクレジスタ714における、それに対応するビットエントリが設定されている場合には、命令が実行される。一態様において、ローカルマスクレジスタ714内の対応するステージ番号のビット位置が、コンパイル時またアセンブリ時に演算されて、命令内にコード化され、それによって値を演算および/または記憶することからハードウェアを解放する。
【0056】
一例において、ループ命令は、ループ数が523であり、処理要素の数(VLEN)が4であり、ステージ数が3であり、ループアンロール(MVE)係数が2であることを規定する。この例においては、ループ数レジスタ706は、134の値を受け取り、ループアンロール係数レジスタ708は、2の値を受け取り、ステージマスクレジスタ710は、(すべてのローカルレジスタ714と同様に)11…11000の値を受け取り、最終反復マスクレジスタ712は、0111の値を受け取る。
【0057】
状態レジスタ706および710は、ループが反復する度毎に更新してもよい。一態様においては、ループ数レジスタ706は、ループアンロールレジスタ708の値だけ減分され、状態マスクレジスタ710は、ループアンロール係数レジスタ708の値に等しい回数だけ、右にシフトされる。ループが、その最後の数回の反復に近づいている場合(例えば、ループ数レジスタ706の値が、ステージマスクレジスタ710におけるビット数以下である場合)には、ゼロがシフトインされ、そうでない場合には、1がシフトインされる。上述のように、ループがその最後の(または最後の数回の)反復中である場合には、最終反復マスクレジスタ712の値が、(その(LC−1)番目ビット位置において)ローカルマスクレジスタ714にコピーされる。
【0058】
例えば、最後の例において紹介された、ループの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を有するように、再び、更新される。
【0059】
本発明の態様によるループ命令を実行する方法800が、図8に示されている。第1のステップ802において、ループ命令が、走らせようとするループについての情報(例えば、ループアンロール係数および反復数)とともに、受け取られる。(例えば、シーケンサ内の)状態レジスタが、この情報(および/またはそれから導出される値)によって初期化される。第2のステップ804において、マスクが、1つまたは2つ以上の処理要素に対して演算されて、それに送られ、このマスク(例えば、図7を参照して上述されたステージマスク)は、命令のどのステージを実行するかについての情報を包含する。第3のステップ806において、ループ命令は、そのステージ番号とマスクに応じて実行される。第4のステップ808において、マスク(および状態情報)は折り返し時に更新される。処理要素を制御するビットを、マスクレジスタ内、またはその他の方法で編成することのできる多くの方法があり、本発明は、シーケンサ内部に保持されるグローバルマスクレジスタ、および各処理要素内部のローカルマスクレジスタとして説明した実装形態に限定されないことを、当業者は認識するであろう。例えば、すべての必要な状態をシーケンサ内部に保持して、どの命令が現在、各処理要素に対して動作可能にされているかに応じて、命令を処理要素に分散させることが同等に可能である。
【0060】
なお、本発明の態様は、1つまたは2つ以上の製造物上、またはその中に具現化される、1つまたは2つ以上のコンピュータ可読プログラムとして、提供することもできることに留意されたい。製造物は、例えば、フレキシブルディスク、ハードディスク、CDROM、CD−RW、CD−R、DVDROM、DVD−RW、DVD−R、フラッシュメモリカード、PROM、RAM、ROM、または磁気テープなどの、任意好適なハードウェア装置としてもよい。一般に、コンピュータ可読プログラムは、任意のプログラム言語で実装してもよい。使用することのできる言語の例としては、C、C++、またはJAVA(登録商標)があげられる。ソフトウェアプログラムは、機械言語または仮想マシン命令にさらに変換して、その形態でプログラムファイルに記憶させてもよい。次いで、このプログラムファイルを、1つまたは2つ以上の製造物上、またはその中に記憶させてもよい。
【0061】
本発明のいくつかの態様を上記で説明した。しかしながら、本発明はそれらの態様に限定されることはなく、むしろ本明細書において明白に記載された内容に対する追加および修正も、本発明の範囲に含めることを意図するものであることに、特に留意されたい。さらに、本明細書に記載された様々な態様の特徴は、互いに排他的ではなく、様々な組合せおよび順列で存在することが、たとえそのような組合せまたは順列が本明細書において明白にされていなくても、本発明の趣旨と範囲から逸脱することなく、可能であることを理解されたい。実際に、本明細書において記載されたものの変形形態、修正形態、およびその他の実装形態は、本発明の趣旨と範囲から逸脱することなく、当業者は思い付くであろう。したがって、本発明は、前述の例証のための説明だけによって定義されるものではない。
図1
図2
図3
図4
図5
図6
図7
図8