このループは、2つのベクトルに対して要素単位の乗算を実行する。このループは、ベクトル形式で、ベクトルA、B、CについてC[i]=A[i]*B[i]、i=0、...、n−1を実行する。
この例では、中間値が、作られ、即座に消費される。これらの値は、連続的にレジスタr6およびr7に書き戻され、読み取られる。これらは、作られ、1回だけ消費されるので、これらの値を、しばしば限られているレジスタ記憶空間に蓄積することは非効率的である。この状況は、残念ながら、ベクトル動作がload−store ISA(Instruction Set Architecture)を使用して表される時に、不可避である。
より効率的な手法は、複数の機能ユニットを一緒にチェーンにし、各ユニットが特定のタスクを実行することである。この形で、中間値が機能ユニットによって作られる時に、その値が、チェーン内の次の機能ユニットに直接に渡され、これによって、値のストアお
よび検索に関連するレジスタ・ファイルへの読取トラフィックおよび書込トラフィックが回避される。
ベクトル動作またはベクトル実行をパイプライン化し、すべてのサイクルに1つの結果を作り得るようにすることも可能である。一般に、ベクトル動作を実行するのに必要な時間は、Ts+n/Trによって与えられ、ここで、Tsは、初期セットアップ・コストであり、nは、ベクトルの長さであり、Trは、各サイクルに作られる結果の個数単位のスループット・レートである。スカラ計算機が、同等のプログラム・ループの1つの反復を実行するのにmサイクルを要する場合に、ベクトル計算機を使用することによる速度向上は、nm/(Ts+n/Tr)またはTr=1の場合にnm/(Ts+n)によって与えられる。最大の速度向上は、Tsが十分に小さく、nが十分に大きい時に達成し得る。この場合に、速度向上がmに達し、これは、スカラ計算機がプログラム・ループの1つの反復を実行するのに要するサイクル数である。
ベクトル処理は、複数の効果を有する。様々な動作を単一のデータ・ストリームでパイプライン化し、改善された性能をもたらし得る。効率的なデータのストレージおよび移動がもたらされる。というのは、大量の一時データが作られ、レジスタ・ファイルまたはメモリ・システムを通らずに、隣接する機能ユニットによって消費されるからである。さらに、ベクトル処理では、小さいルーティング区域が使用される。というのは、データ・パス全体にブロードキャストするのではなく、機能ユニットが、デスティネーション機能ユニットに直接にルーティングされるからである。効率的なデータ移動およびより小さいルーティング区域によって、電力消費が減る傾向がある。さらに、ベクトル実行中に命令を要求する必要がないので、より低い命令フェッチ帯域幅が達成される。ベクトル処理パラダイムの威力によって、ベクトル処理パラダイムが、低コスト、低電力組込みコンピュータ・システムに非常に適するようになる。
あるベクトルA、B、およびCについて、
C[i]=A[i]*B[i]、i=0、...、n−1
によって記述されるベクトル演算を実行するループは、非常にベクトル化可能なループである。ループ・ベクトル化のしやすさは、通常は、ハードウェアおよびシステム構成の関数である。一般に、実行される算術関数を決定するのに実行時情報に依存しないループは、ベクトル化しやすい。本明細書で使用されるCVA(Canonical Vector Arithmetic)は、非常にベクトル化可能なループによって実行し得るベクトル算術を表す。下に、CVAのもう1つの例を示す。
C[i]=4*A[i]+(B[i]>>1)、i=0、...、n−1
このCVAは、次のように複数のCVAに分解し得る。ある一時ベクトルT1およびT2について、
T1[i]=4*A[i];T2[i]=B[i]>>1;C[i]=T1[i]+T2[i]、i=0、...、n−1
DSPアルゴリズムまたはDSP機能は、組込み計算機で実施される時に、しばしばプログラム・ループに変換される。最適化コンパイラは、ループを再構成し、すべての可能な並列性を計算機によって簡単に利用し得るようにする。しかし、そのようなプログラム・ループは、ベクトル化が簡単でない。そのようなプログラム・ループは、コンパイラによってベクトル処理パラダイムに「あてはまる」ように変換された後にベクトル化可能になる可能性がある。これらの変換には、マスク生成、動作の収集および分散などが含まれる可能性がある、ある追加のベクトル動作の追加が含まれる。
たとえば、
C[i]=(A[i]>B[i])?A[i]2:A[i]+B[i]、i=0、.
..、n−1
によって記述されるベクトル動作を実行するループは、ベクトル化が困難であるか高コストである。具体的に言うと、このループは、条件
A[i]>B[i]
に動的に頼って、結果の要素C[i]を得るために実行される算術関数を決定する。このタイプの算術を、本明細書ではPVA(Pseudo−Vector Arithmetic)と称する。
DSPタイプの計算機は、プログラム・ループの実行を最適化することによって、PVA算術を効率的に実行する。これらの計算機で、(i)ループ制御機構、(ii)定数ストライド・ロード、および(iii)定数ストライド・ストアに関連するオーバーヘッドの多くを除去することによって性能が改善される。
伝統的なDSPプロセッサの命令によって、複数の計算動作およびメモリ動作を並列に実行することを指定し得る。そのようなプロセッサの動作は、複数の動作が並列に発行されるVLIW(Very Long Instruction Word)プロセッサの動作に非常に類似する。
本発明は、ベクトル・タイプ処理を使用するベクトル化可能ループおよびDSPタイプの処理を使用するベクトル化が困難または不可能なループの処理の手段を提供する。ループのタイプに応じて、計算機は、ある条件の下ではベクトル・プロセッサのように振る舞い、他の条件の下ではDSPプロセッサのように振る舞う。さらに、この計算機は、単一データ・パスを使用して、プログラムのすべてのベクトル算術ならびにスカラ部分(すなわち非ループ部分)を実行し、同一のハードウェア・リソースの効率的な再利用を可能にする。
本発明は、ベクトル・タイプ処理またはDSPタイプ処理のどちらを使用するかを決定する判断機構としてベクトル化を組み込む。前者を、CVA実行とも称する。後者を、PVA実行とも称する。この新しい処理パラダイムを、本明細書では「擬似ベクトル計算機(Pseudo−Vector Machine)」と称する。
この新しい処理パラダイムによれば、実行モデルが、2つのモードすなわち、(i)制御機能に関するスカラ実行モードおよび(ii)命令レベル並列性(instruction level parallelism、ILP)を利用するベクトル実行モードで動作し得る。図1に、本発明の1実施形態の実行モードを示す。2つの基本モードが、スカラおよびベクトルであり、ベクトル・モードには、さらに特定の実行モードが含まれる。CVAおよびPVAは、ベクトル・モードでのみ使用可能であり、CVAモード実行には、(i)コンパウンド(compound)、(ii)リダクション(reduction)、および(iii)ハイブリッド(hybrid)という3つのタイプがある。それに対応して、この計算機には、2つのベクトル命令すなわち、CVA命令およびPVA命令がある。
図1の実行モデルでは、スカラ・モードおよびベクトル・モードが、時間的にオーバーラップしない。モデルは、単一の命令ストリームを使用して、単一のデータ・パスでこの2つのモードを実行する。このストリーム内の各命令は、スカラ命令またはベクトル命令のいずれかとして分類し得る。ベクトル命令がフェッチされ、デコードされる時に、計算機は、ベクトル実行モードに入る。計算機は、少数の事前定義の機構を介してのみベクトル・モードから出る。
非常にベクトル化可能であるループに関して、計算機は、CVA実行モードすなわち、
「真の」ベクトル処理パラダイムを使用して、ループを処理する。ベクトル化が困難または不可能であるループに関して、計算機は、PVA実行モードすなわち、DSPスタイルの処理に似た「擬似」ベクトル処理パラダイムを使用して、ループを処理する。最適化コンパイラは、この場合に、所与のプログラム・ループにどの実行モードが最も適するかを判断する。一般に、コンパイラは、まず、ベクトル処理パラダイムの低電力態様および高性能態様を利用することを試みて、真のベクトル命令またはCVA命令を使用するループのベクトル化を試みる。これが可能でない場合には、コンパイラは、PVA命令または両方の組合せを使用して、DSPスタイルのループベース実行にフォール・バックする。
普通の意味でのベクトル化は、ベクトル化可能プログラム・ループを識別し、ある同等のベクトル演算と置換することを指す。さらに、本発明は、プログラム・ループを識別し、DSPスタイルのループ構造と置換するベクトル化を提供する。これには、DO UNTIL命令またはDO WHILE命令を含め得る。そのようなループは、普通の意味ではベクトル化が困難または不可能である可能性がある。擬似ベクトル計算機で、PVA命令が、DSPタイプ・プログラム・ループの構成およびベクトル化に使用される。
プログラム・ループが、1つまたは複数のベクトル命令(CVA命令および/またはPVA命令)からなる同等のコードに置換される時に、そのプログラム・ループを、ベクトル化されたという。このベクトル化されたコード・セグメントを、元のスカラ・プログラム・ループと同等の機能を実行するので、元のスカラ・プログラム・ループのベクトル同等物とも称する。ベクトル化は、アセンブリ・レベルまたはソース・コード・レベルで行い得る。
ループが、CVA構成を使用してベクトル化可能である場合に、これをCVAベクトル化可能という。ループが、PVA構成を使用してベクトル化可能である場合に、これをPVAベクトル化可能という。ループが、CVAベクトル化可能である場合に、そのループは、PVAベクトル化可能でもある。しかし、逆は一般に真でない。PVA構成は、より一般的なベクトル化機構を表す。同等のハードウェア・コストで、CVA実行は、通常は、非常にベクトル化可能であるループのより高い性能の利益を提供する。ベクトル化が不可能またはコストが高すぎるループについて、PVA実行が、よりよい性能の利益を提供する。
DSPタイプ実行および/またはVLIWタイプ実行と、ベクトル・タイプ実行との間の区別を、図2および3に示す。図2に、DSPタイプ実行の動作を示すが、ここでは、複数の独立の動作が、複数の機能ユニットに同時に発行される。これらの独立の機能ユニットによって作られた結果が、あるアーキテクチャ的レジスタおよび/またはメモリ・システムに書き戻される。図2に示された動作によって、VLIW計算機の動作も記述されることに留意されたい。
図3に、伝統的なベクトル実行を示すが、ここでは、複数の機能ユニットが、一緒にチェーンにされて、依存する動作を実行する。チェーンされた機能ユニットの間の一時的結果は、アーキテクチャ的レジスタに書き戻されず、メモリ・システムにも書き込まれない。さらに、ベクトル実行は、ベクトル命令の最初のフェッチおよびデコードの後に、そのベクトル実行の残りについてさらなる命令要求をまったく行わないという事実も特徴とする。
本発明は、DSPタイプ実行とベクトル実行を1つの統合されたデータ・パスで組み合わせる方法を提供する。本明細書で使用されるPVA実行は、DSPタイプ実行であり、CVA実行は、ベクトル実行である。したがって、本発明は、1つの処理システム内の各タイプの実行の利益を利用する。
図4に、本発明の1実施形態による処理システム2を示す。処理システム2には、単一のデータ・パスでスカラ実行、CVA実行、およびPVA実行を実行する処理アーキテクチャが組み込まれる。実行コア4に、第1ロード・ユニットL06および第2ロード・ユニットL18が含まれる。情報は、メモリM0 14からL06に、およびメモリM1 16からL18にロードされる。
本発明の1実施形態で、M0 14およびM1 16が、ランダム・アクセス・メモリ(RAM)ブロックであるが、他のタイプのメモリ・ストレージ・デバイスを使用して実施し得る。メモリM0 14は、M0_dbusを介してデータ情報を、M0_abusを介してアドレス情報を、処理システム2の残りと通信する。同様に、M1 16は、M1_dbusを介してデータ情報を、M1_abusを介してアドレス情報を通信する。
実行コア4に、プログラム・シーケンサ24、M0_dbus、およびM0_abusに結合されたループ・キャッシュ22も含まれる。プログラム・シーケンサ24は、M0_dbusおよびM0_abusにも結合され、プログラム・シーケンサ24には、さらに、カウント・インデックス・レジスタ(CIR)50が含まれる。CIR50には、2つの独立のレジスタすなわち(i)カウント・レジスタ(CR)および(ii)インデックス・レジスタ(IXR)が含まれる。CIR50は、図11にも示されており、この図では、CR51が、CVA実行のベクトル長またはPVA実行の反復回数を指定するのに使用される。ループ・キャッシュは、M0_dbusを介してデータを受け取るように結合される。プログラム・シーケンサ24は、M0_abusを介してM0 14にアドレス情報を提供する。
レジスタ・ファイル(RF)26も設けられ、データが、L06からL0_dbusを介して、およびL18からL1_dbusを介してRF26に供給される。RF26、L06、およびL08のすべてが、マルチプレクサ28、30、および32に結合される。マルチプレクサ28は、xbusを介して主算術ユニット(P)34に情報を供給する。1実施形態で、P34は、汎用機能ユニットである。P34は、基礎になるISAで定義されたスカラ算術機能のすべてを実行し得る。マルチプレクサ30は、ybusを介してP34に情報を供給する。
P34の結果は、p_busを介して副算術/ストア・ユニット(S)36に供給される。P34の結果は、マルチプレクサ40にも供給される。メモリ・ストア動作を実行するほかに、S36は、「add」、「and」、「or」、「xor」などの単純な算術論理ユニット(ALU)算術も実行し得る。マルチプレクサ32は、zbusを介してラッチ38に情報を供給し、この情報は、ラッチ38からマルチプレクサ41に供給される。マルチプレクサ41の出力は、zs_busを介してS36に情報を供給する。S36のデータ出力は、s_dbusを介してマルチプレクサ40、マルチプレクサ41、M1_dbus、M0_dbus、および一時メモリ(商標)20に供給される。S36のアドレス出力は、s_abusを介してM0_abus、M1_abus、および一時メモリ(TM)20にも供給される。マルチプレクサ40の出力は、result_busを介して、RF26、L06、L18、SSR42、マルチプレクサ28、およびマルチプレクサ30に情報を供給する。
スカラ・モードで実行する時に、実行コアは、単一発行パイプライン式計算機のように振る舞う。実行コアは、スカラ計算にレジスタ・ファイルRF26およびP34を使用し、メモリ・ロード/ストア動作にL06、L18、およびS36を使用する。具体的に言うと、これらのロード/ストア動作のメモリ・アドレスが、S36によって、TM20、M0 14、およびM1 16を含むメモリ・システムに供給される。メモリ・ストア動
作について、データが、S36ユニットによって供給される。メモリ・ロード動作について、データは、メモリ・システムによって、L06およびL18を介し、L0_dbusおよびL1_dbusを介して、RF26およびP34に供給される。
ベクトル・モードで実行する時に、ベクトル命令すなわち、CVA命令またはPVA命令によって、任意選択として、2つまでの入力データ・ストリームL0およびL1および1つのデータ・ストリームをイネーブルし得る。
ベクトル・モードで実行する時に、データを、M0 14からL06およびL0_dbusを介して継続的にフェッチし、RF26、P34、またはS36への複数のパスのいずれかによって供給し得る。第1パスは、L0_dbusを介してRF26にデータをストリーミングするのに使用される。第2パスは、マルチプレクサ28を介してP34にデータをストリーミングするのに使用され、第3パスは、マルチプレクサ30を介してP34にデータをストリーミングするのに使用される。第4パスは、マルチプレクサ32、ラッチ38、およびマルチプレクサ41を介してS36にデータをストリーミングするのに使用される。PVA実行に関して、第1パス、第2パス、および第3パスの1つまたは複数を、PVA命令に応じて使用し得る。CVA命令に関して、第2パス、第3パス、および第4パスの1つまたは複数を、CVA命令に応じて使用し得る。これらのデータ・ストリームのどれをも、入力データ・ストリームL0と称する。
同様に、ベクトル・モードで実行する時に、データを、L18およびL1_dbusを介してM1 16から継続的にフェッチし、複数のパスのいずれかによってRF26、P34、またはS36に供給し得る。第1パスは、L1_dbusを介してRF26にデータをストリーミングするのに使用される。第2パスは、マルチプレクサ28を介してP34にデータをストリーミングするのに使用され、第3パスは、マルチプレクサ30を介してP34にデータをストリーミングするのに使用される。第4パスは、マルチプレクサ32、ラッチ38、およびマルチプレクサ41を介してS36にデータをストリーミングするのに使用される。PVA実行に関して、第1パス、第2パス、および第3パスの1つまたは複数を、PVA命令に応じて使用し得る。CVA命令に関して、第2パス、第3パス、および第4パスの1つまたは複数を、CVA命令に応じて使用し得る。これらのデータ・ストリームのどれをも、入力データ・ストリームL1と称する。
また、ベクトル・モードでは、データを、S36からメモリ・モジュールM0 14、M1 16、またはTM20の1つに継続的にストアし得る。この出力データ・ストリームを、出力データ・ストリームSと称する。
実行コア4に、さらに、対応するロード/ストア動作がイネーブルされる場合にL0ストリーム、L1ストリーム、およびSストリームのストライドおよびオペランド・サイズを指定するストライド・サイズ・レジスタ(SSR)42が含まれる。SSR42は、L06、L18、RF26およびS36に結合される。SSR42は、さらに、result_busを介して情報を受け取るためにマルチプレクサ40に結合される。一時メモリ・ストレージ・ユニット、TM20が、S36、L06、およびL18に結合される。TM20は、一時ベクトルまたは任意のデータのストアに使用し得る。TM20にストアされるベクトルは、固定ベクトル長に制限されない。
処理システム2で実行されるCVAの3つのタイプを表すデータ依存性グラフを、図5に示す。図5に示されたCVAの3つのタイプのすべてで、2つの入力の近くで実行される第1算術を、主算術と呼び、p_opと表す。この算術は、図3のP34によって実行される。出力の近くで実行される第2算術を、副算術と呼び、s_opと表す。この算術は、図3のS36によって実行される。
図5に、本発明の1実施形態に関する、CVAの入力データ・ストリームL0およびL1とソース・オペランドX、Y、およびZの間の関係を示す。オペランドXは、L0ストリーム、L1ストリーム、またはレジスタr4からソーシングし得る。オペランドYは、L0ストリーム、L1ストリーム、またはレジスタr5からソーシングし得る。オペランドZは、L0ストリーム、L1ストリーム、またはレジスタr6からソーシングし得る。XオペランドおよびYオペランドは、主算術p_opで使用される。主算術の結果が、副算術s_opに転送される。CVAのタイプに応じて、副算術s_opは、オペランドZまたはs_op自体の出力からソーシングし得る。
図5の(A)に示されたコンパウンドCVAは、ベクトル計算の結果としてデスティネーション・ベクトルを作る。コンパウンドCVAの一般形式を次のように表し得る。
ソースXおよびソースYがすべてベクトルである場合に
Ri=(Xi p_op Yi)s_op Zi、i=0、...、n−1
ここで、nは、ベクトルの長さを表し、p_opは、主算術を表し、s_opは、副算術を表し、Riは、デスティネーション・ベクトルの第i要素を表し、Xi、Yi、およびZiは、それぞれベクトルX、Y、およびZの第i要素である。
ソースXが、スカラx定数であり、ソースYがベクトルである場合には
Ri=(x p_op Yi)s_op Zi、i=0、...、n−1
である。
ソースXが、ベクトルであり、ソースYが、スカラ定数yである場合には、
Ri=(Xi p_op y)s_op Zi、i=0、...、n−1
である。副算術s_opを、「ノー・オペレーション」にすることも可能であることに留意されたい。
リダクションCVAについて、図5の(B)に示されているように、XオペランドおよびYオペランドのソースは、コンパウンド・タイプと同一であるが、Zオペランドは使用されない。副算術の出力が、s_op自体への入力としてフィードバックされる。この場合に、Sストリームはディスエーブルされる。リダクションCVAは、ベクトル・リダクション演算を実行し、この動作では、1つまたは複数のベクトルが、ベクトル演算の結果として、スカラ結果に換算される。リダクションCVAの一般形式を、次のように表し得る。
ソースXおよびソースYのすべてがベクトルである場合に、
S0=(X0 p_op Y0)
Si=(Xi p_op Yi)s_op Si−1、i=1、...、n−1;
r=Sn−1
ここで、Siは、i番目の部分的結果を表し、rは、ベクトル・リダクション演算のスカラ結果を表す。
ソースXが、スカラ定数xであり、ソースYがベクトルである場合には、
S0=(x p_op Y0)
Si=(x p_op Yi)s_op Si−1、i=1、...、n−1;
r=Sn−1
ソースXが、ベクトルであり、ソースYが、スカラ定数yである場合には、
S0=(X0 p_op y)
Si=(Xi p_op y)s_op Si−1、i=1、n−1;
r=Sn−1
である。
副算術に関連するフィードバック・パスは、部分的結果を計算し、累算し、最終的に最後のスカラ結果を作る責任を負う。そのようなリダクション演算の例が、Σi(A[i]*B[i])によって記述される、2つのベクトルの内積である。この場合に、主算術は、「乗算」関数であり、副算術は、累算的「加算」関数である。
図5を継続すると、(C)として示されたハイブリッドCVAを用いると、リダクションの場合と同一の、XオペランドおよびYオペランドのソースならびに副算術のフィードバックが可能になるが、ハイブリッドの場合には、Sストリームがイネーブルされる。ハイブリッドCVAは、中間の部分的結果が、Sストリームを介してデスティネーション・ベクトルに継続的に書き込まれることを除いて、リダクションCVAと同一である。ハイブリッドCVAの一般形式は、部分的結果Si、i=0、...、n−1も、デスティネーション・ベクトルRを形成し、Ri=Si、i=0、...、n−1であることを除いて、リダクションCVAと同一である。ハイブリッドCVAについて、2つのデスティネーションすなわち、スカラ・デスティネーションおよびベクトル・デスティネーションがある。
ハードウェア・コストを制限するために、本発明の1実施形態では、複数の制約を課す。第1に、コンパウンドCVAでは、組み合わされる2つの算術が、2つまでの別個のベクトルからソーシングすることだけが可能である。しかし、この制約は、2つまでの別個のベクトルからソーシングする限り、3つのすべてのソース・オペランドがベクトルである場合を除外しない。たとえば、C[i]=A[i]*A[i]+B[i]によって記述されるベクトル演算は、2つの別個のベクトルAおよびBからソーシングする、3つのソース・ベクトル・オペランドを有する。別個のソース・ベクトルの数に関するこの制約によって、最大メモリ帯域幅要件が、1サイクルあたり3つのデータ・フェッチから1サイクルあたい2つのデータ・フェッチに減る。
上記の制約のほかに、副算術を、少数の単純な可換ALU関数に制限し得る(ALU関数opは、すべてのスカラxおよびyについてx op y==y op xである場合に、可換という)。この関数に、add、and、or、またはxorなどが含まれる。
CVAの少数の例を、下の表に示す。
この例のそれぞれに、対応するCVA命令ならびにL
0ストリーム、L
1ストリーム、およびSストリームのイネーブル設定およびディスエーブル設定も詳細に示されている。このCVA命令で、「@」は、データ・ストリームを表す。具体的に言うと、「@L0」は、メモリからの第1入力データ・ストリームL
0を表し、「@L1」は、メモリからの第2入力データ・ストリームL
1を表し、「@P」は、主算術p_opによって作られる中間結果ストリームを表し、「@S」は、メモリへの出力データ・ストリームSを表す。
1実施形態で、L
0ストリーム、L
1ストリーム、およびSストリームのすべてが、一定のストライドのメモリ動作である。
コンパウンドCVA動作に関して、CVA命令で、上の表1の(a)および(b)に示されているように、主算術と副算術の両方を指定し得る。この2つの算術は、CVA命令で、それらを区切るコンマを用いて指定され、主算術が先に指定され(この例では、主算術が、3番目のコンマの左に、単語「add」の前に配置される)、副算術がそれに続く(この例では、副算術が、3番目のコンマの右に、単語「add」から始めて配置される)。命令は、「;」記号で終わる。この例では、「@P」ストリームが、主算術のデスティネーションとして現れ、副算術にもソースとして現れる。
コンパウンドCVA動作に関して、CVA命令で、上の表1の(c)から(f)のように、主算術を指定するが、副算術を指定しないことが可能である。副算術、この例ではs_opは、「ノー・オペレーション」であり、主算術によって作られた結果が、「@S」ストリームを介してメモリに直接にストアされる。「@P」ストリームは、これらの命令で指定されない。
リダクションCVAについて、CVA命令では、上の表1の(g)から(i)のように、主算術と副算術の両方が指定される。この例では、「@P」ストリームが、主算術のデスティネーションとして現れ、副算術にもソース・オペランドの1つとして現れる。副算術のデスティネーションおよび第2ソース・オペランドは、レジスタR3である。リダクションCVAに関して、R3が、リダクション演算の部分的結果ならびに最終スカラ結果をストアするように指定される。
副算術は可換なので、速記表記を使用して、リダクションCVAを記述し得る。この場合に、副算術式全体が、s_opの関数名によって置換される。たとえば、内積を計算するCVA命令(上の表1の例(g))を、下記のように書き得る。
CVA mul @L0、@L1、add;//リダクションCVAの速記表記
ハイブリッドCVAについて、命令構文は、副算術が2つのデスティネーションすなわちSストリームおよびレジスタR3を有することを除いて、リダクションCVAの構文に類似する。2つのデスティネーションは、CVA命令では「{@S、R3}」という形で現れる。ハイブリッドCVAの速記表記はない。
図6に、1実施形態による、図4の実行コア4によって3タイプのCVA(図5に図示)がどのように実行されるかを示す。ストリームL0が、L0_dbusを介してL06に供給され、ストリームL1が、L1_dbusを介してL18に供給される。図6では、オペランドX、Y、およびZが、ストリームL0、ストリームL1、またはRF26の指定されたレジスタからソーシングし得る。具体的に言うと、Zオペランドが、マルチプレクサ32、ラッチ38、マルチプレクサ41、およびzs_busを介してS36に供給される。さらに、s_dbus、マルチプレクサ41、およびzs_busが、リダクションCVAおよびハイブリッドCVAの部分的結果を累算するフィードバック・パスとして使用される。リダクションCVAおよびハイブリッドCVAについて、これらの部分的結果は、常に、s_dbusおよびresult_busを介してレジスタR3に書き戻される。
図7に、本発明の1実施形態による、CVA命令のフォーマットを示す。この命令には、イネーブル・フィールドが含まれ、E0、E1、およびESが、それぞれL0ストリーム、L1ストリーム、およびSストリームのイネーブル・ビットである。Vx0/Vx1、Vy0/Vy1、およびVz0/Vz1ビットは、それぞれ、CVA命令のオペランド
X、Y、およびZがその入力をどのようにソーシングし得るかを指定する。具体的に言うと、これらのビットによって、ストリームL0、L1、または指定されたレジスタからのこれらのオペランドのソーシングが選択される。Vz0ビット、Vz1ビット、およびESビットの組合せによって、実行されるCVAのタイプが定義される。p_opフィールドおよびs_opフィールドによって、それぞれP34およびS36で実行される主算術および副算術のオペコードが指定される。
CVA実行に関して、カウント・レジスタ(CR)51と称する特殊なレジスタが、ベクトル長の指定に使用される。CR51の1実施形態が、図4のCIR50の下位半分として図11に示されている。CIR50の上位半分は、インデックス・レジスタ(IXR)70と称し、PVA実行だけに使用される。
1実施形態で、CIR50は、特殊な「move−to−control−register」命令または「move−from−control−register」命令を使用してソフトウェア・プログラムによってアクセスされる特殊な制御レジスタとして実施される。他の実施形態では、CR51およびIXR70を、2つの別々のレジスタとして実施し得る。
CVA実行について、CR51を、CVA実行の前に適当なベクトル長を用いてソフトウェアによって初期化しなければならない。CVA実行中に、処理されるベクトル要素ごとに、CR51が、自動的に1つ減分される。CR51が0に達し、ベクトル全体が処理されていることが示される時に、CVA実行が終了する。計算機は、命令ストリームで、CVA命令またはPVA命令のいずれかである次のベクトル命令に出会うまで、スカラ・モードに入る。
あるスカラsに関するベクトル演算C[i]=sA[i]+B[i]を、次のようにCVA命令を使用してベクトル化し得る。
これは、コンパウンドCVAである。この例では、L
0ストリーム、L
1ストリーム、およびSストリームのすべてがイネーブルされる。ストリームL
0は、ベクトルAに割り当てられ、ストリームL
1は、ベクトルBに割り当てられ、ストリームSは、ベクトルCに割り当てられる。レジスタR5は、CVA実行の前に、スカラsに初期化される。主算術は、「乗算」関数であり、副演算は、「加算」関数である。
CVA命令の前に、L0ストリームをベクトルAに割り当て、L1ストリームをベクトルBに割り当て、SストリームをベクトルCに割り当てる初期化コードがある。この「割り当て」は、ある特別に指定されたレジスタを、ベクトルA、B、およびCにアクセスするための適当な開始ベクトル位置、ストライド値、および要素サイズに初期化することを指す。
次のプログラム・ループの例を検討されたい。
このループは、PVA構成を使用して、下記のようにベクトル化し得る。
このループでは、L
0ストリームおよびSストリームがイネーブルされるが、L
1ストリームはイネーブルされない。PVAループ・サイズは、3命令である。各反復で、「cmplt」命令は、R0(または要素A[i])を読み取り、R6にストアされた定数値16と比較する。「movt」命令は、cビット(または条件コード)がセットされている場合に、R4をR2へ条件付きで移動する。そうでない場合に、「movt」命令は、R2をR2に移動し、値は変化しない。
「movt」命令は、ループ本体の中の「cs−store」ラベルに配置されている。Sストリームを介するcs−store動作は、この「movt」命令が実行される時に、必ず自動的に開始される。このcs−store動作に使用されるデータは、「movt」命令によって書き戻されるものと同一のデータである。このPVAループを実行する時に、「movt」命令によって作られる結果が、P34によってp_busに駆動され、マルチプレクサ40およびresult_busを介してRF26に常に書き戻される。S36は、p_busでこの結果を取り込み、これらの取り込まれたデータを使用してメモリ・システムへのcs−store動作を実行する。
この例では、「movt」命令に関連するストア動作が、アセンブリ・コードで、ループ本体の中のプログラム・ラベル「cs−store」を使用して指定される。しかし、機械コード(またはアセンブルされたバイナリ・コード)では、そのようなストア動作は、「movt」命令にエンコードされない。そうではなく、ストア動作は、ループを構成するのに使用されるPVA命令で暗黙のうちに指定される。この場合では、PVA命令が、ES=1にされ、その「cs−store−index」フィールドが、「movt」命令をポイントしている。このタイプのストア動作を、「暗黙ストア」動作と称する。このストア動作をトリガし得るループ本体内の命令(この例では「movt」)を、暗黙ストア命令と称する。
上の実施形態では、PVA命令内に「cs−store−index」フィールドが1つだけあり、したがって、1つの「cs−store」ラベルだけが、ループ本体の中で許容される。その結果、1つの暗黙ストア動作だけが、各反復で許容される。代替実施形態では、複数の暗黙ストア動作を、特殊なマスク・レジスタを使用することによって実行
し得る。そのような代替実施形態では、マスク・レジスタを16ビット・レジスタとすることが可能であり、このレジスタの各ビットは、ループ本体内のスカラ命令に対応する。このレジスタの各ビットによって、命令内の対応するスカラ命令に関するcs−store動作がイネーブルまたはディスエーブルされる。したがって、ループ本体の16個までの命令によって、各反復でcs−store動作を開始し得る。ソフトウェアは、PVA実行の前にこのマスク・レジスタを初期化する。PVA実行中に、命令が結果を書き戻し、それに対応するマスク・レジスタ内のビットをセットする時に、その命令によって書き戻されたデータを使用して、cs−store動作が開始される。16個のcs−storeデータ・アドレス、ストライド、およびオペランド・サイズを指定するために、ハードウェア・サポートが必要である。
暗黙ストア動作を使用するもう1つの実施形態では、cs−store−indexではなく、cs−store−reg−designator(cs−storeレジスタ指定子)フィールド(レジスタ・フィールドとも称する)をPVA命令で指定し得る。たとえば、図25に、cs−store−reg−designatorフィールドを有するPVA命令の1実施形態を示し、図26に、図25のPVA命令フォーマットを使用して構成されるプログラム・ループを示す。このcs−store−reg−designatorフィールドによって、ループ本体の内部の命令のデスティネーション・レジスタの関数としての暗黙ストア動作が定義される。たとえば、cs−store−reg−designatorフィールドによってレジスタ3が示される場合に、デスティネーションとしてレジスタ3を有するすべての命令が、暗黙ストアを呼び出す。例の命令が、「add R3、R5」であり、これは、「命令デスティネーション、ソース」というフォーマットを有する。このadd命令では、レジスタ3がデスティネーション・レジスタとして使用され、したがって、このadd命令は、暗黙ストア動作に対応する。ループ本体の中の複数の命令が、デスティネーション・レジスタとしてレジスタ3を使用する場合には、複数の命令が、暗黙ストア動作を開始し得る。しかし、「cmpnei R3、#2」などの命令は、この例ではR3がデスティネーション・レジスタとして使用されないので、暗黙ストア動作に対応し得ない。「cmpnei」命令(ならびに他の命令)は、デスティネーション・レジスタに書き込まれる結果値を生成せず、このフォーマットは、この例ではソース値の対を指定している。さらに、代替実施形態では、PVA命令で複数のレジスタを定義することを可能にして、より多くの暗黙ストアを可能にし得る。
もう1つの実施形態で、PVA命令に、継続機能を組み込むことも可能である。この機能を有するPVA命令のフォーマットを、図20に示す。このPVA命令には、早期継続フィールド内の2つの追加ビットすなわちECビットおよびCCビットがある。ECビットによって、早期継続機能がイネーブルまたはディスエーブルされ、CCビットによって、この機能がイネーブルされる場合に、この早期継続が行われる条件コードの値が指定される。
次の高水準コードに、プログラム・ループの残りの実行をスキップするのにこの早期継続機能をどのように使用し得るかを示す。
この例では、ベクトルAの要素が、スカラsと比較される。あるiについてA[i]<sである場合に、上で「<さらなるコード>」と示されたプログラム・ループの残りの部分が、スキップされ、実行は、次の反復の先頭から継続される。これは、事前に指定された条件が満たされる時にループの実行が即座に終了する、前に説明した「早期終了機能」と対照的である。
このループを、次のようにベクトル化し得る。
このPVA命令では、E
C=1かつC
C=1である。PVA命令の構文「cc=x」によって、E
C=1であることがアセンブラに指示される。「cmplt」命令によって条件コードに1がセットされる時に、必ず、そのA[i]とsの間の比較動作の結果として、実行が、即座に次の反復から継続され、「<さらなるコード>」の実行がスキップされる。
早期終了機能および早期継続機能の両方がイネーブルされた(ET=EC=1)PVA命令では、ループ本体内の命令が、条件コードを変更することが可能であり、これによって、現在の反復の実行が終わる。条件コードに、CTビットによって指定される値がセットされている場合には、ループ実行が、完全に終了する。条件コードに、CCビットによって指定される値がセットされている場合には、ループ実行は、次の反復から継続される。条件コードに、CTビットおよびCCビットの両方によって指定される値がセットされている(両方が条件コードについて同一の値を指定する)場合には、ループ実行が終了する。すなわち、この実施形態では、早期終了機能が、早期継続機能の地位を奪う。他の実施形態では、早期継続機能が、早期終了機能の地位を奪う。図示されていないが、早期継続機能を、早期終了について図23に示したものに似た形で設けることも可能である。Coffset−cフィールドおよびCCビットを命令フォーマットに加えることが可能であり、あるいは、Coffset指定子およびCT指定子と置換し得る。Coffset−cフィールドおよびCCビットによって、条件設定命令のPVA命令からの命令単位のオフセットと、指定された命令がPVA命令でセットされたCCビットと一致する条件コードを生成する時にループの早期継続をもたらすのに使用される条件値を指定し得る。
PVA構成は、一般に、(i)ループ制御機構、(ii)cs−loadを介する入力データ・ストリーム化、および(iii)cs−storeを介する出力データ・ストリーム化に関連するある種の実行オーバーヘッドを除去し得る。PVA命令に、システムの必要に応じて、上で説明した諸フィールドの組合せを、適当に含めることも可能である。たとえば、代替実施形態で、暗黙ストア動作を実行する、上で説明したものと異なるフィールドおよび方法を使用し得る。
図10に、データ・ストリームL0、L1、およびSのストライド値およびオペランド・サイズを指定するSSR42の1実施形態を示す。このレジスタは、CVA実行とPV
A実行の両方に使用される。この実施形態では、レジスタが、3つのデータ・ストリームL0、L1、およびSのそれぞれに1つの3つの部分に区分される。ストライド・フィールドSTR0、STR1、およびSTRSは、9ビット幅である。サイズ・フィールドSZ0、SZ1、およびSZSは、2ビット幅であり、それぞれによってバイト、ハーフワード、またはフルワードが指定される。
2つのベクトルの内積、Σi(A[i]*B[i])を実施する下記の例を検討されたい。この動作は、CVA命令を使用して下記のように実行し得る。この例では、SSR[STR0]が、SSRレジスタのSTR0フィールドを表し、他も同様である。
CRをベクトル長に初期化する。
SSR[STR0]をベクトルAのストライド値に初期化する。
SSR[STR1]をベクトルBのストライド値に初期化する。
R0をベクトルAの開始アドレスに初期化する。
R1をベクトルBの開始アドレスに初期化する。
CVA mul @L0、@L1、add;
この例では、L0およびL1がイネーブルされ、Sがディスエーブルされ、したがって、これはリダクションCVAである。このリダクション演算の主算術は、「mul」関数であり、副算術は、「add」関数である。CVA実行中に、部分的結果が、継続的にレジスタR3に書き戻される。ベクトル計算が完了した時に、最終結果すなわち内積が、R3に暗黙ストアされる。この例のCVAは、Vx1/Vx0=01、Vy1/Vy0=10、Vz1=Vz0=11、ES=0、ET=0、CT=「ドント・ケア」という設定を有する。
この例では、ベクトル実行が割り込まれる場合に、レジスタR3に、内積計算の中間の部分的結果が含まれる。割込みからリターンする時に、計算が、中断されたところから継続され、最初の部分的結果としてレジスタR3の内容が使用される。
もう1つの例で、すべてのiに関するベクトル算術C[i]=sA[i]を実施する。
CRをベクトル長に初期化する。
SSR[STR0]をベクトルAのストライド値に初期化する。
SSR[STRS]をベクトルCのストライド値に初期化する。
R0をベクトルAの開始アドレスに初期化する。
R2をベクトルCの開始アドレスに初期化する。
R5をsに初期化する。
CVA mul @L0、R5、@S;
これはコンパウンドCVAである。第2算術は「ノー・オペレーション」である。この場合に、L0ストリームおよびSストリームは、イネーブルされるが、L1ストリームはイネーブルされない。ベクトル実行の前に、R5が、スカラ定数sによって初期化される。この例のCVA命令は、Vx1/Vx0=01、Vy1/Vy0=00、Vz0/Vz1=00、ES=1、ET=0、CT=「ドント・ケア」という設定を有する。
図12から14に、L06、L18、およびS36の1つの可能な実施形態を示す。L06、L18、およびS36のそれぞれが、それぞれレジスタR0、R1、およびR2のローカル・コピーを有する。このローカル・コピーを、L_R0 114、L_R1 124、およびL_R2 136と表す。
スカラ実行中に、L06(またはL18)ユニットは、レジスタR0(またはR1)への書き戻しアクティビティについてresult_busを常時スヌープし、レジスタのローカル・コピーL_R0 114(またはL_R1 124)を更新する。同様に、S36は、レジスタR2への書き戻しアクティビティについてp_busを常時スヌープし、レジスタのローカル・コピーL_R2 136を更新する(図14参照)。
CVA実行中またはPVA実行中に、これらのローカル・レジスタの内容が、メモリ・ブロックのロード・アドレスまたはストア・アドレスとして適当に使用される。これらのレジスタは、対応するデータ・ストリームがイネーブルされている時に、適当なストライド値を加算することによって、ハードウェアによって常時更新される。すなわち、L_R0 114、L_R1 124、およびL_R2 136は、それぞれ、実行されるcs−load動作またはcs−store動作のそれぞれについて、SSR[STR0]、SSR[STR1]、およびSSR[STRS]によって指定される量と合計される。
ベクトル命令(CVA命令またはPVA命令)が、そのE0(またはE1)ビットをセットされて最初にデコードされる時に、第1ロード・アドレスとしてL_R0 114(またはL_R1 124)を使用して、cs−loadが即座に開始される。その後、メモリからプリフェッチされるデータごとに、L_R0 114(またはL_R1 124)が更新される。
図12および13に示された実施形態では、ロード・ユニットL06およびL18内のデータ・キューが、2つだけの深さである。L06への入力に、M0_dbusおよびTM_dbusが含まれる。この2つの入力が、マルチプレクサ110に供給される。マルチプレクサ110の出力は、データ・キューの末尾111に供給される。データ・キューの末尾111は、マルチプレクサ113およびデータ・キューの第2エントリ112にデータを供給する。この第2エントリ112も、マルチプレクサ113にデータを供給する。データは、マルチプレクサ113からL0_dbusに供給される。
ロード・ユニットL06内で、M0_dbusおよびTM_dbusからのデータを、マルチプレクサ110を介し、末尾エントリ111およびマルチプレクサ113を介し、第2データエントリ112をバイパスして、L0_dbusに供給し得る。データを、第2エントリ112からマルチプレクサ113を介してL0_dbusに供給することも可能である。
図12を継続すると、加算器116が、SSR42、SSR[STR0]、およびロード・アドレスをL_R0 114から受け取る。加算器116の出力は、マルチプレクサ115に結合される。result_busも、マルチプレクサ115に結合される。マルチプレクサ115の出力は、L_R0 114に結合され、L_R0 114は、L0_abusに結合される。ベクトル実行中に、SSR[STR0]によって指定される量が、ストリームL0を介して実行されるcs−load動作ごとに、L_R0 114に加算される。マルチプレクサ115およびL_R0 114を用いると、ロード・ユニットL06が、レジスタR0へのすべての書き戻しについてresult_busをスヌープし得るようになる。スカラ実行中には、L_R0 114が、RF26のレジスタ0と同一の値に維持される。同様の動作および接続性が、図13に示されたロード・ユニットL18にもあてはまる。
図14を参照すると、ストア・ユニットS36内で、p_busによって、データがラッチ130に供給される。このラッチおよびzs_busの出力によって、ALU131にデータが供給される。ALU131は、ラッチ132にデータを供給し、ラッチ132は、マルチプレクサ133にデータを供給する。マルチプレクサ133は、ラッチ130
およびラッチ132からデータをとり、s_dbusにデータを供給する。
データを、p_busから、ラッチ130およびマルチプレクサ133を介してs_dbusに供給することも可能である。このパスによって、ストア・ユニットS36内のALU131の計算がバイパスされる。データを、ALU131の出力からラッチ132およびマルチプレクサ133を介してs_dbusに供給することも可能である。このパスでは、ALU131の結果が、受け取られ、s_dbusに渡される。
ベクトル算術では、メモリから定数ストライド・ロードを介してロードされるほとんどのデータが、単一の反復で消費され、絶対に再利用されないという意味で、一時的でしかない。ベクトル算術への割込みが許容される場合に、ベクトル実行に関連するすべての定数ストライド・ロード/ストア・アドレスを保存して、割込みからのリターンの後にロード/ストア動作を再開し得るようにする必要がある。
メモリからプリフェッチされるすべての一時的なものならびにロード/ストア・アドレスを、汎用レジスタ・ファイルまたは制御レジスタなどのアーキテクチャ的に可視の記憶空間を使用してストアすることは、これらの貴重なリソースの非効率的な使用になる可能性がある。本発明は、レジスタ・オーバーレイを使用して、この問題に対処する。この手法では、PVA実行モードに入る時に、アーキテクチャ的に可視のレジスタ・ファイルの一部が、レジスタの新しい組によって「オーバーレイ」される。レジスタは、オーバーレイされる時に、(i)オーバーレイされたインスタンスおよび(ii)一時的インスタンスという2つのインスタンスを有する。PVAモードでは、その一時的インスタンスだけが、プログラマに可視であり、オーバーレイされたインスタンスは不可視である。逆に、実行が、PVAモードを出てスカラ・モードに入る時に、オーバーレイされたインスタンスが、再び可視になり、一時的インスタンスは、存在しなくなる。
図15に、3つの実行モードすなわちスカラ、PVA、およびスカラのシーケンスにまたがる、オーバーレイされたレジスタの可視性を示す。1実施形態で、レジスタR0およびR1が、PVA実行中にオーバーレイされ得るレジスタの組として指定される。これを、下の表2に示す。これらのレジスタのオーバーレイされたインスタンスは、対応するcs−loadロード・アドレスをストアするのに使用される。これらのレジスタの一時的インスタンスは、cs−load L0およびL1を介してメモリからプリフェッチされるデータをストアするのに使用される。
R0およびR1の一時的インスタンスを、それぞれT_R0およびT_R1と表す。R0およびR1のオーバーレイされるインスタンスを、それぞれO_R0およびO_R1と表す。
T_R0およびT_R1は、読取専用レジスタである。ループ本体内でのこの一時レジ
スタへの書込は、ハードウェアによって無視される。これらの一時レジスタは、PVA実行中に限って定義される。PVAループが、その実行を終了する時に、これらの一時レジスタに含まれるデータは、失われる。その時点でのそのようなレジスタへのアクセスによって、レジスタのオーバーレイされたインスタンスが検索され、これは、最後に実行されたcs−load動作のロード・アドレスである。
また、PVA実行が割り込まれる時に、T_R0およびT_R1は、コンテキストの一部として保存されない。割込みからリターンする時に、データをT_R0およびT_R1にプリフェッチしたcs−load動作が、O_R0およびO_R1にストアされたロード・アドレスを使用して再初期化される。レジスタT_R0およびT_R1は、普通のPVA実行を再開し得るようになる前に再初期化される。
図16に、図4のレジスタ・ファイルRFの1実施形態を示す。RF26には、他のレジスタの中でも、O_R0 142、T_R0 143、O_R1 152、およびT_R1 153が含まれる。RF26内では、レジスタO_R0 142、O_R1 152、およびR2 162が、それぞれ加算器140、150、および160を使用して更新される。
レジスタO_R0 142の値が、マルチプレクサ144に供給される。この値は、加算器140の入力にもフィードバックされる。加算器140のもう1つの入力は、SSR[STR0]に結合される。加算器140の出力は、入力としてマルチプレクサ141に供給される。マルチプレクサ141の出力は、O_R0 142の入力に結合される。マルチプレクサ164が、もう1つの入力としてマルチプレクサ141に供給される。T_R0 143は、その入力をL0_dbusから取り、その出力をマルチプレクサ144のもう1つの入力に供給する。マルチプレクサ144の出力は、RF26の出力R0として供給される。加算器140、マルチプレクサ141、およびO_R0 142を使用することによって、O_R0 142を、各サイクルにSSR[STR0]によって指定される量だけ増分し得る。
同一の機構を使用して、各サイクルに、O_R1 152およびR2 162を、それぞれストライド値SSR[STR1]およびSSR[STRS]を加算することによって、類似するハードウェア構成によって更新し得る。
PVA実行中に、O_R0 142およびT_R0 143の更新が、対応するcs−load動作がRF26にコミットされるのと同時に行われる。同様に、O_R1 152およびT_R1 153の更新は、対応するcs−load動作がRF26にコミットされるのと同時に行われる。R2 162の更新は、対応するcs−storeがメモリにコミットされるのと同時に行われる。任意の所与の時点で、T_R0 143(またはT_R1 153)に、メモリからプリフェッチされたデータが含まれ、アドレスは、O_R0 142(またはO_R1 152)にストアされる。この一貫性は、PVA実行中の命令境界にまたがって維持される。一時レジスタT_R0 144およびT_R1 154が、CVA実行またはスカラ実行に不要であることに留意されたい。
PVA実行中の一時インスタンスおよびオーバーレイされるインスタンスの一貫性を、図17に示す。5命令の実行シーケンスが示されている。水平軸は、時間を表し、レジスタR0の一時的インスタンスおよびオーバーレイされるインスタンスが、それぞれ垂直軸に表されている。命令境界は、垂直の破線によって示されている。この例では、ストリームL0を介してストリーミングされるデータが、D0、D1、D2、D3、...であり、A0、A1、A2、A3、...が、対応するロード・アドレスである。この5つの命令の中で、I0、I2、およびI3が、レジスタR0を読み取る命令である。R0からの
読み取りは、図17に示されているように、次の命令境界の先頭での新しい「アドレス−データ」対によるO_R0 142およびT_R0 143の同時更新を引き起こす。命令I1は、R0を読み取らない命令であり、したがって、O_R0 142およびT_R0 143は、次の命令境界で更新されない。レジスタO_R0 142およびT_R0
143は、レジスタR0の読み取りに続く次の命令境界で更新される。それまでは、このレジスタは最後に更新された値を維持する。レジスタO_R1 152およびT_R1
153は、類似する形でハードウェアによって更新される。
図16に戻って、RF26からのR0の読取は、T_R0 143とO_R0 142の間で選択される。この選択は、マルチプレクサ144によって、PVA_exe0と称する制御信号を使用して制御される。この信号は、計算機がPVAモードで実行しており、ストリームL0がイネーブルされる時にアサートされる。RF26からのR0の読取によって、この場合には、T_R0 143の内容が出力される。それ以外で、PVA_exe0がアサートされない時には、R0からの読取によって、O_R0 142の内容が出力される。類似する制御機構が、PVA実行中のRF26からのR1読取に関して存在する。
レジスタR2 162は、オーバーレイされない。RF26のレジスタR3からR15と同様に、R2は、単一のインスタンスを有する。しかし、R2は、SストリームがイネーブルされたPVA実行中に、レジスタO_R0 142およびO_R1 152に類似する形で更新される。
スカラ実行に関して、メモリ・ロードは、メモリ・ブロックM0 14からL06を介してL0_dbusに、またはM1 16からL18を介してL1_dbusに、データをフェッチすることと、その後、RF26のレジスタのいずれかに書き込むことによって実行される。したがって、L0_dbusまたはL1_dbusからRF26のレジスタのいずれかにデータを書き込むパスが必要である。このパスは、図16に示されているように、RF26内のマルチプレクサ164によって提供される。マルチプレクサ164は、その入力をL0_dbus、L1_dbus、およびresult_busから取り、その出力をマルチプレクサ141、マルチプレクサ151、マルチプレクサ161、およびレジスタ・アレイ163に供給する。レジスタ・アレイ163によって、アーキテクチャ的レジスタR3からR15が実施される。マルチプレクサ164を介して、L0_dbusおよびL1_dbusが、T_R0 143およびT_R1 153を除く、RF26内のレジスタのいずれかに書き込み得る。この実施形態では、一時レジスタT_R0 143およびT_R1 153が、スカラ実行中に使用可能でない。
ベクトル実行(CVA実行またはPVA実行)の前に、あるレジスタを、正しく初期化する必要がある。これらの特殊なレジスタには、ハードウェアが正しいベクトル実行を実行するのに必要なすべての情報が含まれる。表3に、これらの特殊なレジスタを詳細に示す。
この実施形態では、SSR42およびCIR50だけが、特殊な制御レジスタである。他のすべてのレジスタが、汎用レジスタである。ベクトル演算に応じて、これらのレジスタが、ベクトル動作中に特殊な意味を伝える場合とそうでない場合がある。たとえば、R2は、ベクトル実行中にSストリームがイネーブルされる時に特殊な意味を有するが、この特殊な意味は、Sストリームに関する最新のcs−storeアドレスがストアされることを指す。
表3には、R0およびR1のオーバーレイされるインスタンスだけが含まれる。割込みまたは例外の時に、SSR42およびCIR50が、ハードウェアによって保存される。これらの特殊な制御レジスタを保存するために、追加のハードウェア・サポートが必要である。レジスタR0からR6は、汎用レジスタなので、ハードウェアによって自動的に保存される。一時レジスタT_R0 143およびT_R1 153(表3に示さず)だけが、ハードウェアによって保存されない。
割込みからリターンする時に、通常の実行を再開する前に、下記の情報を計算機に復元する必要がある。O_R0 142、O_R1 152、およびR2 162の内容を、RF26から、それぞれL_R0 114(L06内)、L_R1 124(L18内)、およびL_R2 136(S36内)コピーする必要がある。後者の3つのローカル・レジスタは、それぞれ図12から14に示されている。
さらに、リダクションCVAおよびハイブリッドCVAに関して、R3にストアされた中間の部分的結果を、S36内のラッチ130に復元し、さらに、マルチプレクサ133を介してs_dbusに復元する必要がある(図14参照)。この部分的結果の復元には、RF26からR3を読み取り、そのデータをP34を介し、p_busに、さらにS36を介してs_dbusに転送することが含まれる(図4参照)。
図4からわかるように、3つの独立のオンチップ・メモリ・ブロック、M0 14、M1 16、およびTM20がある。PVA実行中にプログラム・ループ命令をストアする
ループ・キャッシュ22もある。M0 14およびM1 16は、メインのオンチップ・メモリである。M0 14は、命令およびデータのストアに使用される。M1 16は、データのみのストアに使用される。TM20も、データのみのストアに使用され、具体的には、ベクトル実行中に一時ベクトルをストアするのに使用される。
図4に示された1実施形態のメモリ・システムでは、ロード・ユニットL06が、M0
14およびTM20への読取アクセスを有し、ロード・ユニットL18が、M1 16およびTM20への読取アクセスを有し、S36が、M0 14、M1 16、およびTM20のすべてへの書込アクセスを有する。M0 14およびM1 16は、単一ポート式メモリであるが、TM20は、1つの読取ポートおよび1つの書込ポートを有する。これらのメモリ・ブロックの内容、アクセシビリティ、ならびに読取ポートおよび書込ポートの数を、表4に示す。代替実施形態で、スカラ動作およびベクトル動作を許容する他のメモリ構成を実施し得る。
ストリームL
0、L
1、およびSをイネーブルされたコンパウンドCVAまたはハイブリッドCVAを実行するために、メモリ・システムは、1サイクルあたり1結果のピーク・スループット・レートを維持するために、1サイクルあたり2つのデータ読取および1つのデータ書込をサポートする必要がある。CVA実行中には命令要求がない。これは、CVA命令がデコードされ、実行されたならば、CVA実行の残りに関してさらなる命令が不要であるからである。2つのデータ読取および1つのデータ書込に加えて、PVA実行では、各サイクルに1つの命令フェッチも必要になる可能性がある。
各サイクルに、図4に示されたメモリ・システムは、M0 14、M1 16、およびTM20を介する2つのデータ読取および1つのデータ書込までをサポートすることが可能であり、同一のサイクルに、ループ・キャッシュ22の使用を介する1つの命令フェッチもサポートすることが可能である。3つのメモリ・ブロックM0 14、M1 16、およびTM20は、ある事前定義のメモリ空間を参照することによってアクセスし得る、すなわち、これらは、メモリ・マッピングされたブロックである。
1実施形態によれば、図4に示されたTM20は、ベクトル実行中に一時ベクトルをストアするのに使用される小さいRAMメモリである。TM20は、ディジタル・フィルタリングの係数ベクトルなど、頻繁に使用される定数ベクトルに使用することも可能である。TM20は、一時ベクトルを保持する、従来のベクトル計算機のベクトル・レジスタの拡張である。従来のベクトル計算機の最適化コンパイラと同様に、最適化コンパイラは、メモリに書き戻す前に、可能な限りこれらの一時ベクトルを操作することを試みる。TM20は、M0 14およびM1 16に対するメモリ帯域幅圧力を減らすのに役立つ。TM20は、これらのより大きいメモリ・ブロックの電力消費を減らすのにも役立つ。
TM20へのアクセスは、ベクトル・レジスタ番号など、ベクトル命令で指定される明示的な参照ではなく、適当なメモリ空間を参照することによって行われる。具体的に言うと、これらのアクセスは、ストリームL0、L1、およびSをセットアップすることによって行われる。
これらの一時ベクトルを構成し、割り振り、使用する時に、コンパイラは、一時記憶空間の編成においてより高い柔軟性を有する。たとえば、TM20または他の類似する一時メモリが、n要素のベクトルをストアし得る場合に、そのメモリを、それぞれがn/m要素の長さを有するm個のベクトルの記憶空間として編成することも可能である。TM20を、異なる長さの複数のベクトルの記憶空間として編成することも可能である。この場合に、コンパイラは、TM20内のフラグメンテーションを最小にするようにベクトル割振りを管理することを試みる。
次の例では、TM20が、1つの読取ポートおよび1つの書込ポートを有する直接マッピングされる512バイトであると仮定する。TM20を使用して、この例では、ベクトル実行を高速化し得る。
やはり、例2に示されたループを検討されたい。このループが、C[i]=(lsr(A[i],R9)|lsl(A[i]、R8)を実行していることを想起されたい。ベクトル化されたコードを、下に示す。
この例では、一時ベクトルが、TM20内で作成され、割り振られる。第1のCVA命令のデスティネーションおよび第2のCVA命令のソース・オペランドの1つによって、TM20を介して一時ベクトルがアクセスされる。第1のCVA命令は、M0 14からL
0ストリームを介してベクトルAをソーシングし、Sストリームを介して一時ベクトルをTM20に書き込む。第2のCVA命令は、M0 14からL
0ストリームを介してベクトルAをソーシングし、L
1ストリームを介してTM20から一時ベクトルをソーシングする。また、この命令は、Sストリームを介してM1 16に結果ベクトルを書き込む。
この例では、第2のCVA命令で、3つのデータ・ストリームすなわち、2つの入力、および1つの出力が使用される。これらのベクトル実行では、メモリ衝突は生じない。M0 14およびM1 16だけを使用すると、メモリ衝突が引き起こされる。TM20がなければ、第2のCVA命令は、各結果要素を作るのに2サイクルを要する。
処理されるベクトルのサイズが、TM20のサイズより大きい時には、ベクトル動作が、ソフトウェア制御の下で複数のベクトル動作に分割され、各ベクトル動作が、TM20のストレージで使用可能な長さのベクトルを操作する。この意味で、TM20の使用は、ベクトル・レジスタの「ストリップマイニング(strip−mining)」に類似する。しかし、固定長ベクトル・レジスタと異なって、コンパイラは、この場合に、割振りと使用が可能な一時ベクトルの数とストリップマイニング反復の間のトレードオフに対する柔軟性を有する。
もう1つの例として、ベクトル長がコンパイル時に未知であると仮定して、上のループのストリップマイニングおよびベクトル化を行う。要素サイズは、ワード(4バイト)であることが既知である。各ベクトル要素が、4バイト長であり、TM20が512バイトなので、128要素を超える長さのベクトルは、TM20のオーバーフローを避けるために、多少のストリップマイニングを必要とする。
この例では、2つのCVA命令および1つの一時ベクトルだけが使用され、TM20全体を、128以下の長さの一時ベクトルのストア専用にし得る。下に、C風の言語での、未知のベクトル長nを有するストリップマイニングされたコードを示す。
ある独立のベクトルA、B、C、およびDに関して、ベクトル・リダクション演算
Σ
i((A[i]*B[i]+C[i])* A[i]*B[i]*D[i])
の実行の例のように、最高の可能な性能レベルを維持しながら電力消費を減らすのにTM20を使用することも可能である。ベクトルAおよびCが、M0 14内にあり、ベクトルBおよびDが、M1 16内にあると仮定する。
3つの一時ベクトルおよび4つのCVA命令(3つのコンパウンドCVAおよび1つのリダクションCVA)を使用する、実行時間に関する最適解を下に示す。
(1)T1[i]=A[i]*B[i];
(2)T2[i]=T1[i]+C[i];
(3)T3[i]=T1[i]*D[i];
(4)リダクション結果=Σi(T2[i]*T3[i])
ベクトルAおよびBは、M0 14およびM1 16にあるので、ベクトルT1は、TM20内で割り振られなければならない。したがって、ベクトルT3は、ベクトルDがM1
16内にあるものとして、M0 14内になければならない。ベクトルCはM0 14にあるので、ベクトルT2は、M1 16またはTM20内に置き得る。表5に、一時ベクトルT1およびT2の割振りの2つの可能な解決を示す。
この解決の両方が、メモリ衝突をこうむらない。両方の解決が、この計算機での最適性能レベルを達成する。しかし、表5の解決(II)は、ベクトルT2がTM20に割り振られるので、より低電力の解決を与える。解決(II)の短所は、一時ベクトルT1およびT2の両方が同時にTM20に存在することを必要とすることである。TM20が、両方のベクトルを保持するのに十分に大きくはない場合に、解決(I)が、唯一の実行可能な解決である。TM20が、単一のベクトルにも小さすぎる場合には、解決(I)をストリップマイニングする必要がある。
本発明の1実施形態のベクトル実行のすべてが、割込み可能である。割込みは、ベクトル計算の完了の前のベクトル実行の一時的中断を引き起こし得る。スカラ・コンテキストに加えて、追加のベクトル・コンテキストを保存し、その結果、割込みからのリターンの際にベクトル実行を正しく再開可能にする必要がある。割り込み時に、これらのベクトル・コンテキストの一部は保存され、一部は破棄される。保存されるベクトル・コンテキストに、表3に示されたすべてのレジスタが含まれる。このレジスタには、SSR42、CIR50、オーバーレイされるインスタンスO_R0 142およびO_R1 152、R2 162、およびRF26内の他のレジスタすなわち、T_R0 143およびT_R1 153を除くRF26内のすべてのレジスタが含まれる。
CVA実行に関して、各ベクトル要素に対する動作は、あるベクトル要素に対する動作の結果が割込み発生時に書き戻されない場合に、すべての中間結果が破棄されるという意味で、「アトミック」である。この1つまたは複数の要素に対して実行されるすべての動作が、割込みからのリターンの際に繰り返されなければならない。リダクションCVA実行またはハイブリッドCVA実行に関して、各サイクルに作られる部分的結果が、RF26内のレジスタR3に継続的に書き戻される。割込み時に、部分的結果が既にRF26にあるので、したがって、部分的結果は自動的に保存される。これによって、部分的結果を保存するための追加の浪費される時間が除去される。しかし、割込みからのリターンの時に、RF26内のレジスタR3の内容が、通常のCVA実行を再会する前にs_dbusに復元される。
PVA実行に関して、ループ本体で作られるすべての中間結果が、レジスタ・ファイル、RF26にストアされる。したがって、中間結果を保存するために追加の時間は浪費されない。一時レジスタT_R0 143およびT_R1 153は、ベクトル・コンテキストの一部として保存されない。割込みからリターンする時に、これらの一時物をフェッチしたcs−load命令は、入力ストリームがイネーブルされる場合に再初期化される。その後、一時レジスタT_R0 143およびT_R1 153が、通常のPVA実行
を再会する前にそれ相応に更新される。この場合に、ハードウェアは、割込みをサービスする過程の間にメモリ位置が変更されなかったと仮定する。
図18に、図4のプログラム・シーケンサ24の一部を示す。ループ実行おおび分岐のターゲットを監視するために、カウンタ・ベースの方式を使用し得る。PVA命令に出会う時に、その命令で指定されるLoop_sizeが、図4のプログラム・シーケンサ24などのハードウェアによって取り込まれる。さらに、IXR70(図11参照)を使用して、ループ本体のどの命令が現在実行されているかを追跡する。IXRの実施の1実施形態を、図18に示す。IXR70は、ループ本体の中でローカル・プログラム・カウンタ(PC)のように振る舞う。ループの最初の命令が実行されている時に、IXR70に1がセットされる。順次実行される命令ごとに、IXR70が1つ増分される。ループの最後の命令が実行されている時に、IXR70はLoop_sizeと等しい。IXR70が(Loop_size−1)と等しい時に、命令フェッチが、ループの最初の命令に向けられる。最後の命令が、シーケンシャル命令であるか、命令が制御フローの変更を引き起こさない(ターゲットがループ本体の外部にある)場合に、実行が、ループの先頭に転送され、IXR70が、1にリセットされる。
IXR70は、加算器72の出力であるIXR_count値を受け取る。IXR70にストアされた値は、一方の入力として加算器72に供給され、他方の入力は、マルチプレクサ74から来る。マルチプレクサ74への一方の入力は、1であり、他方の入力は、分岐命令の変位フィールドである。この形で、加算器72は、次の順次値または分岐変位値のいずれかを出力する。IXR70は、IXR70を1にリセットするreset信号と、次のIXR_countを受け入れるload信号も受け取る。
分岐がPVA実行中に採用される(順方向または逆方向のいずれか)場合に、分岐命令の分岐変位フィールドが、IXR70に加算される。この加算演算は、マルチプレクサ74および加算器72によって実行される。マルチプレクサ74は、この場合に、加算器72への分岐命令の変位フィールドを選択する。このレジスタ値と分岐変位の合計が負またはループ・サイズを超える場合には、分岐ターゲットがループ本体の外部にあることが示され、PVAループ実行が終了する。
図18を続けると、IXR_count値も、入力としてブロック76、78、および80に供給される。IXR_countは、継続的に0、Loop_size、およびLoop_size−1と比較される。(IXR_count<0)または(IXR_count>Loop_size)である場合に、命令がループ本体の外で実行されようとしていることが示される。ブロック78で(IXR_count<0)と判定される場合に、ブロック78の出力が、「or」ゲート82への入力としてアサートされる。同様に、ブロック80で(IXR_count>Loop_size)と判定される場合に、ブロック80の出力が、「or」ゲート82にアサートされる。どちらの場合でも、「or」ゲート82の出力によって、ループ実行が終了される。また、ブロック76で(IXR_count==Loop_size−1)と判定される場合に、ループの先頭からの命令フェッチが開始される。
PVA命令の最後の反復の終りに向かって、ループ内の最後の命令が、ループ本体の外のターゲット・アドレスを有する採用される条件分岐である場合に、ループの最初の命令を誤ってフェッチし、実行することに関する1サイクルのペナルティをこうむる。この場合に、この命令の実行の結果が、却下される、すなわち、結果が、破棄され、書き戻されない。分岐ターゲットを使用する新しい命令フェッチが開始される。
割込みからPVA実行を再開する時に、まず、必要なループ制御情報を回復しなければ
ならない。これは、複数の形で行い得る。1実施形態で、PVA命令に最初に出会う時に、PC(PVA命令のアドレス)が、一時ハードウェア位置に保存される。割込み時に、このハードウェア・コピーがPCとして保存される。割込みからリターンする時に、まずPCを使用してPVA命令をフェッチして、Loop_size、cs−store−indexなどを含むループ制御情報のすべてを回復する。この情報が回復された後に、IXR70の内容がPCに加算される。PVAループ実行が、新しいPCによってポイントされる命令から継続される。
もう1つの実施形態で、PVA実行が割り込まれる時に、PCは、ループ本体の中の、実行が割り込まれた命令をポイントする。このPCを、実行コンテキストの一部として保存する。割込みからリターンする時に、IXR72の内容をPCから減算して、PVA命令アドレスを得る。次に、PVA命令をフェッチして、cs−store−index、Loop_sizeなどを含むループ制御情報のすべてを回復する。
PVA実行では、「cs−store」ラベルに配置された命令およびそれに関連するcs−store動作の実行が、「アトミック」動作である。例4からのベクトル化されたPVAループをもう一度検討されたい。
「movt」命令および関連するcs−store動作は、「アトミック」である。cs−storeが、割込みに起因して完了しない場合に、「movt」命令も、「実行されない」と考えられる。割込みからリターンする時に、「movt」命令から実行が再開される。
上で示したベクトル化された例のそれぞれについて、コンパイラは、元のコードを評価するが、このコードは、高水準言語プログラミング言語またはアセンブリ・コードで記述され得る。コンパイラは、コードを分析して、CVA命令および/またはPVA命令に適用可能なループおよび他の構成を探す。本発明の1実施形態によるコンパイルの処理フローを、図19に示す。
図19からわかるように、この処理では、まず、判断菱形170で、ループまたはコードのセクションが、CVA実行を使用してベクトル化可能であるかどうかを判断し、そう
である場合に、ブロック171で、少なくとも1つのCVA命令を使用してコードをベクトル化する。次に、ブロック172で、CVAベクトル化されたループの実行時間を推定する。次に、判断菱形173に継続する。
その代わりに、コードがCVAベクトル化可能でない場合にも、判断菱形173に継続されて、CVA実行およびPVA実行の組合せを使用してコードをベクトル化可能であるかどうかを判定する。そうである場合には、ブロック174でそのような組合せを使用してコードをベクトル化し、ブロック175で、その実行速度を推定する。その後、処理フローは判断菱形176で継続される。
コードが、CVA単独またはCVA/PVA組合せのいずれによってもベクトル化可能でない場合にも、処理は、判断菱形176に継続されて、コードがPVAベクトル化可能であるかどうかを判定する。そうである場合には、ブロック177で、少なくとも1つのPVA命令を使用してコードをベクトル化する。ブロック178で、その実行時間を推定する。
判断菱形179では、ベクトル化されたコードの実行速度が、上で述べたベクトル化方法のいずれかを使用して、元のループより改善されるかどうかを判定する。改善がない場合には、ブロック181で、元のコードを変更しない。実行速度が改善された場合には、ステップ180で、最短の実行時間を有する最良のベクトル化方法を使用するコードを実施する。この実施形態では、コンパイラが、可能なすべてのベクトル化方法を試行し、その中から最良の方法を選択する。この実施形態では、実行時間が、唯一の選択判断基準として使用される。他の実施形態では、電力消費などの他の判断基準の使用を組み込んで、最良のベクトル化方法を選択することも可能である。
代替実施形態に、まずCVA構成だけを使用することによるコードのベクトル化を組み込むことも可能であることに留意されたい。この実施形態では、次に、コードがCVAベクトル化可能でない場合に限ってCVA/PVAの組合せを試行する。CVA/PVAの組合せを使用してもコードがベクトル化可能でない場合には、PVA構成を使用するベクトル化を試行する。この代替実施形態では、最も頻繁に、CVAベクトル化が実行速度の最大の改善を作り、次がCVA/PVAの組合せであり、最後がPVAベクトル化であることが認識されている。この処理は、コードをベクトル化し得る最初の方法を見つけた時に終了する。この代替実施形態は、実行時間を推定するのに使用されるプロファイル情報が入手可能でない時に有利である。他の代替実施形態で、所与のアプリケーションに適する他の順序付けを見つけ得る。
この実施形態によれば、PVA実行は、各サイクルに1つの命令を発行することに制限される。代替実施形態では、PVA実行を、図2に示されたものに類似する、各サイクルに複数の独立の命令を発行する機能を組み込むように拡張し得る。
そのような拡張の1つである二重発行擬似ベクトル計算機を、図21に示すが、この図では、各サイクルに、2つの独立の命令を、2つの独立の計算ユニット、P1 235およびP2 234に発行し得る。スカラ・モードまたはPVAモードで実行される時に、2つの結果を、レジスタ・ファイルRF236またはメモリに書き戻し得る。
図21で、レジスタ・ファイルRF226ならびにデータ・ストリームL0およびL1は、独立に、マルチプレクサ228、230、231、232、および233にデータを供給する。マルチプレクサ228および230は、機能ユニットP2 234にデータを供給する。マルチプレクサ231および232は、機能ユニットP1 235にデータを供給する。P2 234は、resultl_busを介してS236およびRF226
にデータを供給する。P1 235は、マルチプレクサ237およびS236にデータを供給する。マルチプレクサ241は、S236にデータを供給する。S236は、データ・ストリームSを介してメモリ・システムに、ならびにマルチプレクサ237および241にデータを供給する。マルチプレクサ237は、result2_busを介してRF226にデータを供給する。RF 226も、マルチプレクサ228、230、231、および232にデータを供給する。
この二重発行擬似ベクトル計算機では、3タイプのCVAすなわち、コンパウンドCVA、リダクションCVA、およびハイブリッドCVAがある。この3タイプのCVAの依存性グラフを、図22に示す。図5の依存性グラフと対照的に、この計算機では、リダクションCVAおよびハイブリッドCVAに、下記の一般形式を有する3入力算術関数s_opが含まれる。
スカラT、U、およびVについて、T s_op U s_op V
この依存性グラフでは、オペランドW、X、Y、およびZが、独立に、入力ストリームL0、入力ストリームL1、または指定されたレジスタからソーシングし得る。このオペランド・ソーシング・モードを、本明細書では独立ソーシング・モードと称する。その代わりに、これらのオペランドのそれぞれが、入力ストリームL0またはL1の0拡張された上位ハーフワードまたは下位ハーフワードからソーシングすることも可能である。このオペランド・ソーシング・モードを、本明細書ではクロス・ソーシング・モードと称する。表6に、独立ソーシング・モードおよび2つの異なるクロス・ソーシング・モード(クロス・ソーシング・モードIおよびII)を示す。
この表で、{0、L
0[15:0]}は、入力データ・ストリームL
0からの0拡張された下位ハーフワードを表す。{0、L
0[31:16]}は、入力データ・ストリームL
1からの0拡張された上位ハーフワードを表す。類似する表記が、L
1ストリームに使用される。これらの0拡張動作の結果は、32ビット・オペランドである。コンパウンドCVAの一般形式は、次のように表し得る。
Si=(Wi pl_op Xi)s_op(Yi p2_op Zi) i=0、...、n−1
リダクションCVAの一般形式は、次のように表し得る。
S0=(W0 pl_op X0)s_op(Y0 p2_op Z0);
Si=(Wi pl_op Xi)s_op(Yi p2_op Zi)s_op Si−1、 i=1、...、n−1;
R=Sn−1
ここで、Siは、i番目の部分的結果を表し、Rは、ベクトル・リダクション演算のスカラ結果を表す。
ハイブリッドCVAの一般形式は、Si、i=0、...、n−1が、Sストリームを介してメモリに書き込まれることを除いて、リダクションCVAと同一である。
クロス・ソーシング・モードの多数の使用の1つが、ベクトルA、B、およびCの要素のすべてが複素数である複素ベクトル乗算C[i]=A[i]*B[i]、i=0、...、n−1である。複素数は、メモリ・システム内で2つの16ビット・ハーフワードの連結として表すことが可能であり、上位ハーフワードは、複素数の実数部を表し、下位ハーフワードは、複数数の虚数部を表す。この表現を使用すると、複素数が、32ビット・データによって完全に表される。
2つの複素数XおよびYの乗算の結果は、(Re X*Re Y−Im X*Im Y)+j(Re X*Im Y+Im X*Re Y)によって与えられ、ここで、「Re
W」は、複素数Wの実数部を表し、「Im W」は、複素数Wの虚数部を表す。
図21に戻ると、2つの複素ベクトルAおよびBの間の乗算を、2つのコンパウンドCVAを使用することによって実行し得る。これらのCVAの両方が、L0ストリームを介するベクトルAおよびL1ストリームを介するベクトルBでストリーム化される。このCVAの両方で、p1_opおよびp2_opが、乗算関数であり、s_opが、加算関数である。第1CVA命令では、クロス・ソーシング・モードIを使用し、結果ベクトルCの虚数部を含む結果ベクトルが作られる。第2CVA命令では、クロス・ソーシング・モードIIを使用し、結果ベクトルCの実数部を含む結果ベクトルが作られる。ストリームSについて2のオペランド・サイズ(ハーフワード)および4のストライド値(1ワード離れる)を使用することによって、この2つのCVA命令を、同一のベクトル位置Cに書き込むことが可能であり、具体的には、2つのCVA命令を、互いの結果を上書きせずにベクトルCに書き込み得る。2つのCVA命令の実行の後に、ベクトルCの各要素に、要求された実数値および虚数値が含まれる。
上で説明したクロス・ソーシング・モードを、PVA実行にも使用し得る。この場合に、p1_opを実行するP1 235と、p2_opを実行するP2 234によって作られる2つの結果が、レジスタ・ファイルRF 226内の2つの別個のレジスタおよび/またはメモリ・システムに独立に書き戻される。
図27から36に、あるプログラム・ループ命令に関連するサイズまたは長さを拡張することによって、PVA実行に関連する能力を高める方法を示す。本発明の1実施形態では、PVA実行中に処理される命令などのループ実行に関連するある命令に、標準命令サイズを使用する標準部分と、第2の命令サイズを使用する増補命令部分が含まれる。増補命令部分の追加によって、ループ実行中に処理される増補命令の総合的なサイズが、強化された実行能力を提供するように拡張される。本発明のいくつかの実施形態は、あるプログラム・ループの命令に伴う追加の機能性を含めることによって、クリティカル・ループ実行の性能を高めるという長所を有する。
図27を参照すると、本発明の1実施形態による、標準命令および増補命令を処理するシステムを示すブロック図が示され、システム400として全体的に参照される。デコーダ430および440は、プログラム405の命令を処理するのに使用される。プログラム405は、メモリ450にストアされる。プログラム405には標準命令460および465ならびに増補命令470が含まれる。増補命令470には、標準命令部分すなわち標準命令部分475と、増補命令部分である増補命令部分477が含まれる。標準デコーダ430は、標準命令460および465ならびに増補命令470の標準命令部分475
の処理に使用される。副デコーダ440は、増補命令470の増補命令部分477の処理に使用される。
1実施形態で、標準デコーダ430が、標準命令460および465など、命令の特定のグループに関連する標準コマンドの処理に使用される。命令フェッチ・コンポーネント420が、メモリ450から次の命令にアクセスするのに使用される。たとえば、標準デコーダ430は、プログラム405の次に処理される命令にアクセスするように命令フェッチ・コンポーネント420に指示し得る。次の命令のアドレスに関連するメモリ・アドレスを命令フェッチ・コンポーネント420に供給して、メモリ450内の次の命令の位置を示し得る。代替案では、命令フェッチ・コンポーネント420が、プログラム・カウンタ(図示せず)を監視して、次に処理される命令のアドレスを判定し得る。
1実施形態で、命令フェッチ・コンポーネント420が、標準命令460の命令にアクセスする。したがって、命令フェッチ・コンポーネント420は、処理のために標準デコーダ430に命令を供給する。1実施形態で、標準命令460および465の命令に、スカラ命令または非ループ命令が含まれる。増補命令470の命令に、プログラム・ループ命令が含まれる。したがって、システム400は、増補命令470を処理するためにループ実行モードまたはPVA実行モードに切り替え得る。1実施形態で、ループ実行モードまたはPVA実行モードが、PVA命令またはループ初期化命令によってトリガされる。たとえば、増補命令470の最初の命令または標準命令460の最後の命令を、PVA実行を開始するのに使用されるPVA命令とすることが可能である。その代わりに、ループ実行またはPVA実行を、「WHILE」コマンドまたは「DO UNTIL」コマンドなどのプログラム・ループ命令によってトリガし得る。ループ実行モードまたはPVA実行モードをトリガする他の方法を、本発明の範囲から逸脱せずに使用可能であることに留意されたい。さらに、システムは、コンパイル処理中に、標準命令の代わりに増補命令を使用可能にし得る。コンパイラは、後で説明するように、ループまたはループ開始コマンドに出会う時に、増補命令の使用を可能にし得る。
システム400が、PVA実行モードまたはループ実行モードに入ったならば、副デコーダ440がイネーブルされる。1実施形態で、副デコーダ440は、INTER−DECODER CONTROL信号410を介するなど、標準デコーダ430によってイネーブルまたはディスエーブルされる。したがって、1実施形態で、副デコーダは、命令フェッチ・コンポーネント420に類似する命令フェッチ・コンポーネント421を使用して、標準デコーダ430によってアクセスされる標準命令部分475の標準命令部分に関連する増補命令部分477の増補命令部分にアクセスする。代替実施形態では、単一の命令フェッチ・コンポーネント420だけが、標準命令部分475ならびに増補命令部分477の両方をメモリ450からフェッチするのに使用し得る。そのような実施形態では、副デコーダ440が、命令フェッチ・コンポーネント420および標準デコーダ430によって増補命令470の増補命令部分477を受け取り得る。そのような代替実施形態では、標準デコーダ430が、修正またはデコードを実行せずに、副デコーダ440に増補命令部分477を供給し得る。代替案では、命令フェッチ・コンポーネント420が、副デコーダ440に増補命令部分477を直接に供給し得る。
1実施形態で、増補命令470が、プログラム・ループ480の一部である。プログラム・ループ480には、ループ初期化コマンドと、それに続くK個の増補命令の組が含まれ、ここで、Kは、1を超える、増補命令の数である。1実施形態で、ループ初期化コマンドが、ループ実行を初期化するために含まれる。たとえば、ループ初期化コマンドは、K個の増補命令が処理される反復の回数を示し得る。他のプログラム・ループに関連する命令を、標準命令460および465内に含め得ることに留意されたい。しかし、標準命令460および465のプログラム・ループ命令は、増補命令470のプログラム・ルー
プ命令と比較して、増補命令部分を有しない。K個の増補命令は、標準コードおよび増補コードのK個の組に分解される。
標準コードには、フォーマットにおいて標準命令460および465の少なくとも一部の命令に似るコードが含まれる。たとえば、標準コードに、オペコードおよび1つまたは複数のオペランドを含めることが可能であり、オペコードは、オペランドに対して実行される動作を指定し得る。標準コードは、標準デコーダ430を使用して処理される。1実施形態で、標準命令部分475の標準コードに、増補命令470の命令に関連する、ビット0からNなどのビットの第1の組が含まれる。増補命令部分477の増補コードに、増補命令470の命令の、ビットN+1からMなどのビットの第2の組が含まれる。本発明の範囲から逸脱せずに、標準コードで、他のフォーマットを使用し得ることを諒解されたい。NおよびMは、特定のビット位置を指定するのに使用され、MはNより大きい。1実施形態で、標準命令460および465ならびに標準命令部分475が、同一の固定サイズを有し、類似するか同一の命令エンコーディングを使用し得る。
増補命令部分477のコードによって、標準命令部分475の処理コードに関連する特定の拡張機能性を指定することが可能である。1実施形態で、標準命令部分475の処理が、増補命令部分477の処理に基づく。1実施形態で、標準デコーダ430が、standard_code_1などの特定の標準命令部分475にアクセスするので、副デコーダ440は、augmented_code_1などの関連する増補命令部分477にアクセスする。standard_code_1の処理は、augmented_code_1の処理に依存し得る。たとえば、1実施形態で、augmented_code_1を使用して、standard_code_1の条件実行が指定される。システム400の条件コードとaugmented_code_1によって指定される条件とのマッチングに応じて、副デコーダ440は、INTER−DECODER CONTROL信号410を使用して、標準デコーダ430でのstandard_code_1の処理を取り消し得る。
増補命令部分477は、標準命令部分475に関連する実行の他の形を指定するのに使用し得る。たとえば、増補命令部分477の個々のコードによって、標準命令部分475の個々のコードに関連する早期終了を指定し得る。したがって、増補命令部分477の命令によって、プログラム・ループ480のさらなる実行を終了しなければならないことを示し得る。したがって、システム400の条件コードと増補命令部分477の命令によって指定される条件に応じて、副デコーダ440は、INTER−DECODER CONTROL信号410を提供して、増補命令470のさらなる命令をスキップし得る。たとえば、標準デコーダ430に、増補命令470の代わりに標準命令465の最初の命令を処理するように指令し得る。
増補命令部分477のコードによって、標準命令部分475の関連コードを処理する時の早期継続を指定することも可能である。たとえば、システム400の条件コード値と、副デコーダ440によって処理されている増補命令部分477の現在のコードによって指定される条件とに応じて、副デコーダ440は、共通の標準デコーダ430にINTER−DECODER CONTROL信号410を供給して、プログラム・ループ480の次の反復をスキップし得る。
増補命令部分477のコードを使用して、標準命令部分475のコードを処理するための追加のオペランド指定子を提供することも可能である。1実施形態で、増補命令の増補コードによって、第1オペランドおよび第2オペランドの処理からの値が返される第3レジスタ・オペランドを指定し得る。1実施形態で、増補コードにイネーブル・ビットを含めて、デスティネーション・オペランドとしての第3オペランドの使用をイネーブルする
ことも可能である。増補命令部分477に関連するコードによって、標準命令部分475のコードの処理に関するオペランドとして使用される即値フィールドをエンコードすることも可能である。代替案では、増補命令部分477によって、標準命令部分475で既にエンコードされている即値フィールドの長さを拡張するのに使用される即値フィールドをエンコードすることも可能である。この拡張の結果として、即値フィールド・オペランドの結果の長さが増やされる。
本発明の1実施形態では、増補命令部分477を、後で図28で示すように、関連する標準命令部分475からメモリ450に別々にストアし得る。増補命令部分477を、後で図29で示すように、標準命令460の命令などの別々のコマンドを介して指定し得る。代替案では、標準命令部分475を、後で図30で示すように、標準命令部分475の各関連する部分に隣接して提供し得る。
本発明の1実施形態で、増補命令部分477が、標準デコーダ430で処理される関連する標準命令部分475と時間的に並行して副デコーダ440によって処理される。
図28を参照すると、本発明の1実施形態による、メモリに増補命令部分をストアする形を示すブロック図が示されている。標準命令460および465に、標準デコーダ430(図27)などの標準命令デコーダを使用して処理される標準命令が含まれる。1実施形態で、標準命令460および465に、同一の固定命令長が含まれる。増補命令が、特定の命令に関連する機能性を拡張するために提供され、この増補命令には、標準命令460および465の固定命令長より長い命令長が含まれる。増補命令は、標準命令部分510および増補命令部分515からなる。図示の実施形態では、増補命令部分515が、メモリ505のうちで、関連する標準命令部分510と異なる部分にストアされる。
増補命令は、一般に、ループ実行命令またはPVA実行命令である。標準命令部分510に、標準命令460および465に類似するコマンドが含まれ、標準命令460および465に関連するものと同一の固定命令長を含め得る。さらに、標準命令部分510を、標準命令460および465と同一の標準命令デコーダを使用して処理し得る。1実施形態で、標準命令部分510が、標準命令部分510が標準命令460および465に関連して処理される順序でメモリ505にストアされる。たとえば、標準命令部分510は、標準命令460が処理された後、標準命令465が処理される前に処理され得る。1実施形態で、標準命令部分510および増補命令部分515は、プログラム・ループに関連する。ループ初期化命令511を使用して、ループ実行および/または増補命令処理を初期化し得る。
増補命令部分515は、標準命令部分510に関連し、関連する標準命令部分510と時間的に並行して処理される。しかし、増補命令部分515は、標準命令部分510と別々のメモリのブロックにストアされる。たとえば、図示の実施形態で、増補命令部分515が、メモリ505内で、標準命令465の後にストアされる。増補命令レジスタ520が、増補命令部分515へのポインタを提供する。1実施形態で、増補命令レジスタ520が、レジスタ・ファイルにストアされる複数のレジスタの一部である。増補命令レジスタ520へのポインタを、命令を介して提供し得る。たとえば、ループ初期化命令511に、増補命令レジスタ520をポイントする命令フィールドを含め得る。その代わりに、ループ初期化命令511などの命令を使用して、増補命令レジスタ520のポインタを初期化して、増補命令部分515など、次に処理される増補命令部分の組の位置を提供し得る。
増補命令レジスタ520を使用して、標準命令部分510の関連する標準コードのとの並列処理のために、増補命令部分515の増補コードにアクセスし得る。たとえば、standard_code_1が標準命令デコーダによってアクセスされる時に、副デコー
ダ440(図27)などの副命令デコーダによってaugmented_code_1にアクセスし得る。増補命令レジスタ520によって提供されるポインタを使用して、次に処理される増補命令部分のメモリ・アドレスを更新し得る。したがって、K個の増補命令部分のそれぞれを、増補命令レジスタ520のポインタを介して、関連する標準命令部分と並列に処理し得る。
1実施形態で、増補命令レジスタ520に、各増補命令部分のポインタが含まれる。代替案では、増補命令レジスタ520を、増補命令部分515の最初の増補命令部分augmented_code_1だけに初期化し得る。augmented_code_1にアクセスした後に、増補命令レジスタ520に関連するメモリ・ポインタを、augmented_code_2をポイントするように増分し得る。同様に、増補命令レジスタ520の単一ポインタによって、K個のすべての増補命令部分へのアクセスを提供し得る。
図29を参照すると、本発明の1実施形態による、メモリ内で増補命令を提供する形を示すブロック図が示されている。命令のプログラムが、メモリ605にストアされる。命令のプログラムに、標準命令460、ループ初期化命令610、標準ループ命令620、および標準命令465が含まれる。1実施形態で、命令460、620、および465の各部分に、同一の固定命令長が含まれる。ループ初期化命令610は、命令460、620、および465と同一の命令長を有する標準初期化命令部分615および増補命令部分617の両方を含むように拡張される。
ループ初期化命令610は、標準命令460および465と比較して、拡張された命令長を有する増補命令として提供される。標準初期化部分615を使用して、標準ループ命令620の実行の初期化を提供し得る。たとえば、標準初期化命令部分615を使用して、増補命令部分617の処理をイネーブルすることが可能であり、あるいは標準ループ命令620のループ実行またはPVA実行をイネーブルすることが可能である。他の形のプログラム・ループ命令を、本発明の範囲から逸脱せずに標準命令460または465に含め得ることに留意されたい。
増補命令部分617を使用して、追加の処理機能を指定し得る。たとえば、増補命令部分617によって、標準ループ命令620のコード部分に関して実行される追加処理を指定し得る。たとえば、増補命令部分617のビットの第1の組によって、標準ループ命令620のstandard_code_1の処理の早期終条件を指定し得る。さらに、増補命令部分617のビットの第2の組を使用して、標準ループ命令620のstandard_code_2の処理を早期終了するように指定し得る。1実施形態で、増補命令部分617でエンコードされたビット・マスクのK個の組を使用して、標準ループ命令620の個々の命令の早期終了機能をイネーブルし、かつ/または指定し得る。たとえば、増補命令部分617のビットの第1の組によって、標準ループ命令620のstandard_code_1での早期終了を指定し得る。ビットの第1の組に、早期終了をイネーブルするイネーブル・ビットと、早期終了をトリガする条件を指定する条件ビットを含め得る。同様に、増補命令部分617のビットの第2の組によって、standard_code2など、標準ループ命令620の別の命令の早期終了を指定し得る。
代替案では、増補命令部分617を使用して、標準ループ命令620のそれぞれに早期継続機能を増補し得る。1実施形態で、増補命令部分617でエンコードされるビット・マスクのK個の組を使用して、標準ループ命令620の個々の命令の早期継続機能をイネーブルし、かつ/または指定する。
他の機能性を、増補命令部分617と共に提供することも可能であることに留意されたい。たとえば、増補命令部分617を使用して、標準ループ命令620のデスティネーシ
ョン・オペランドを指定し得る。
もう1つの例で、増補命令部分617を使用して、標準ループ命令620によって使用される様々な入力データ・ストリームおよび出力データ・ストリームをイネーブルするためなど、マスク・ベクトルを提供し得る。ループ初期化命令610以外の命令を使用して、増補命令部分617を提供し得ることを諒解されたい。
図30を参照すると、本発明の1実施形態による、増補命令部分727をストアする形を示すブロック図が示されている。命令のプログラムが、メモリ705に保管され、この命令のプログラムには、標準命令460、ループ初期化命令711、増補命令720、および標準命令465が含まれる。標準命令460および465ならびにループ初期化命令711に、標準エンコーディングの命令と、同一の固定命令長が含まれる。増補命令720に、標準命令部分725および増補命令部分727が含まれる。1実施形態で、標準命令部分725に、同一の標準エンコーディングの標準コードと、標準命令460および465と同一の固定命令長が含まれ、標準命令部分725は、標準命令デコーダによって処理される。しかし、増補命令部分727は、副命令デコーダを使用して、標準命令部分725と時間的に並行して処理される。
1実施形態で、ループ初期化命令711が、増補命令720に関連するループ実行モードをトリガするのに使用される。1実施形態で、ループ初期化命令711が、さらに、増補命令720の増補命令部分727を処理するのに使用される副命令デコーダをトリガするのに使用される。標準命令部分725は、標準命令460に関してそれらが処理される形でメモリにストアされ、標準命令460は、増補命令720および標準命令465の前に処理され、標準命令465は、増補命令720の後で処理される。
増補命令部分727に、標準命令部分725のコードの機能を拡張するコードが含まれる。増補命令部分727のaugmented_code_1は、標準命令部分725のstandard_code_1に対応する。増補命令部分727のアクセスを単純にするために、増補命令部分を、メモリ705内の関連する標準命令部分725に隣接してストアし得る。たとえば、augmented_code_1が、メモリ705内でstandard_code_1の次にストアされ、augemtned_code_2が、standard_code_2の次にストアされる。同様に、K個の増補命令部分のそれぞれが、めいめいの標準命令部分の次にストアされる。増補命令部分727を、標準命令部分725の次にストアされるものとして説明したが、増補命令部分727を、本発明の範囲から逸脱せずに各関連する標準命令部分の前に保管し得ることに留意されたい。
前に述べたように、増補命令部分727は、標準命令部分725に関連する処理機能性を拡張するか指定し得る。たとえば、増補命令部分は、特定の標準命令部分に関連する条件実行条件をイネーブルし、指定することが可能であり、この条件実行では、特定の標準命令部分の処理が、増補命令部分に関連する条件に基づいて条件的に実行される。増補命令部分は、特定の標準命令部分に関連する早期継続条件または早期終了条件を指定することも可能である。
図31を参照すると、本発明の1実施形態による、増補命令に関連するフィールドを示すブロック図が示されている。増補命令800などの増補命令が、あるプログラム・ループの命令に追加機能性を提供するのに使用される。増補命令800は、標準部分810および増補部分820に分割される。増補部分820には、プログラム・ループ内の標準命令部分810を処理する早期継続機能および早期終了機能を指定するビットET、CT、EC、およびCCが含まれる。
システム400(図27)など、増補命令800の処理に使用されるシステムに関連する条件コードは、システムによって処理されるコマンドに基づいて変更される。たとえば、「complt」命令をシステムによって処理して、2つの別々のレジスタ値を比較し得る。その比較に基づいて、条件コードを変更して、真の状態または偽の状態に影響を及ぼす。1実施形態で、処理システムが、条件コードに、現在の状態を示すために「1」または「0」のいずれかの値をセットする。代替実施形態では、複数の条件コード、あるいは複数のビットまたは値を有する条件コードが、存在することが可能であり、増補命令部分820によって指定され得る。
条件コードの現在値に基づいて、増補命令800は、増補命令800に関連するプログラム・ループの処理に影響を及ぼし得る。前に述べたように、標準命令デコーダを使用して、標準命令部分810を処理することが可能であり、副命令デコーダを使用して、増補命令部分820を処理することが可能である。増補命令部分820は、早期終了条件を確立し得る。早期終了条件を用いると、処理システム400が、増補命令800に関連するプログラム・ループのさらなる処理を取り消し得るようになる。早期終了イネーブル・ビットETを使用して、増補命令800の早期終了機能をイネーブルし得る。早期終了条件ビットCTをセットして、「0」または「1」のいずれかの値にセットされることによって特定の論理条件を示し得る。早期終了ビットETがイネーブル状態にセットされ、早期終了条件ビットCTが、処理システムの条件コードの値と等しい場合に、プログラム・ループのさらなる実行が停止される。標準命令デコーダが、標準命令部分810を処理したならば、次に処理される命令は、プログラム・ループの外の次の命令である。
早期終了に似て、早期継続ビットECおよびCCの組によって、早期継続条件を示し得る。早期継続イネーブル・ビットECを使用して、増補命令800に関連する早期継続をイネーブルし得る。早期継続イネーブル・ビットECに、イネーブル状態がセットされ、早期継続条件ビットCCの値がシステムの条件コードの値と同等である場合に、システムは、プログラム・ループの現在の反復でのさらなる命令の処理を停止し、プログラム・ループに関連する次の反復に継続し得る。
他の機能も、増補命令部分820に似た増補命令部分の使用を介して提供し得る。たとえば、増補命令部分によって、増補命令の条件実行機能を指定し得る。図32を参照すると、本発明の1実施形態による、条件実行機能を提供する増補命令に関連するフィールドを示すブロック図が示されている。増補命令750などの増補命令を使用して、一部のプログラム・ループの命令に追加機能を提供する。増補命令750は、標準命令部分752および増補命令部分751に分割される。
増補命令部分751に、条件実行制御フィールド755が含まれる。条件実行制御フィールド755に、条件実行のイネーブル・ビットEXおよび条件実行の条件コードCXが含まれる。条件実行のイネーブル・ビットEXによってイネーブルされる時に、増補命令750の実行が、条件実行の条件コードCXの値に基づいて条件的に行われる。条件実行の条件コードCXによって指定される条件が満たされる時に、標準命令部分752の実行が実行される。しかし、条件実行の条件コードCXによって指定される条件が満たされない時には、標準命令部分752の実行が実行されず、増補命令750は、効果的に「ノーオペレーション」命令として扱われる。条件実行制御フィールド755を提供することによって、標準命令部分752の通常の実行を、有利に条件的にし得る。代替実施形態で、条件実行制御フィールド755を拡張して、複数の条件コードおよび/または複数のビットを有する条件コード・フィールドを含め得ることに留意されたい。
増補命令の増補命令部分を使用して、標準命令部分の処理の追加オペランドを提供することも可能である。1実施形態で、標準命令部分が、2オペランド命令であり、算術演算
などの動作が、2つのソース・オペランドからの値を使用して実行される。普通のシステムでは、2オペランド命令の処理の結果は、ソース・オペランドの1つにストアされ、そのソース・オペランドの元の値が破壊される。その代わりに、増補命令部分を使用して、第1オペランドおよび第2オペランドの処理からの値を返し得る第3オペランドを提供し得る。
図33を参照すると、本発明の1実施形態による、追加オペランドを含む増補命令に関連するフィールドを示すブロック図が示されている。増補命令830などの増補命令を使用して、あるプログラム・ループの命令に追加機能性を提供する。増補命令830は、標準命令部分850および増補命令部分840に分割される。増補命令部分840には、追加オペランド指定子Rcが含まれ、このRcを使用して、前に述べたように第3オペランドを指定し得る。この第3オペランド値は、標準命令部分850の結果を受け取るデスティネーション・レジスタ指定子として使用し得る。追加オペランド指定子Rcを提供することによって、標準命令部分850の通常の破壊的動作を有利に防ぎ得る。
増補命令部部分を使用して、特定の標準命令部分の即値フィールドを指定することも可能である。したがって、標準命令部分によって、増補命令部分によって指定される即値フィールドをソース・オペランドとして使用し得る。その代わりに、増補命令部分を使用して、標準命令部分で指定される即値フィールドの長さを拡張し得る。
図34を参照すると、本発明の1実施形態による、即値フィールドを提供する増補命令に関連するフィールドを示すブロック図が示されている。増補命令860などの増補命令を使用して、あるプログラム・ループの命令に追加機能性を提供する。増補命令860は、標準命令部分870および増補命令部分880に分割される。増補命令部分880に、即値フィールド881が含まれ、即値フィールド881は、ソース・オペランドとして使用するか、これを使用して標準命令部分870で既に指定されている即値フィールドの長さを拡張し得る。拡張として即値フィールド881を提供することによって、標準命令部分870の即値の制限された範囲を有利に回避し得る。
本発明の1実施形態では、図32、33、および34に関して説明した機能を、増補命令部分をエンコードすることによって組み合わせ、選択し得る。図35を参照すると、ブロック図に、増補命令900に関連するエンコーディングおよび機能の例が示されている。増補命令900は、標準命令部分910および増補命令部分920からなる。増補命令930の増補命令部分は、即値フィールド932を備える。増補命令940の増補命令部分は、追加オペランド指定子Rcを備える。増補命令950の増補命令部分は、早期継続/早期終了制御フィールド952を備える。増補命令930および940は、条件実行制御フィールド934および944によって増補命令の条件実行を指定する機能も備える。
図35では、3つの追加機能が、増補命令部分920の上位ビット931、941、および951のエンコーディングによって区別される。図27の副デコーダ440は、これらの上位ビットを検査して、これらの増補命令部分によって指定される追加機能を判定する。
増補命令を使用して、標準命令幅を使用して可能ではないさらなる機能を定義する拡張命令幅を提供し得る。たとえば、前に図4で述べた実施形態は、データ・ストリーミング・サポートを提供した。図4で述べた実施形態では、2つの入力ストリーム、L06およびL18ならびに単一の出力ストリームS36だけがサポートされた。しかし、増補命令を使用すると、データ・ストリーミング・マスク・ベクトルを使用し得る。データ・ストリーミング・マスク・ベクトルには、異なるデータ・ストリームをイネーブルするのに使用し得る複数のビットが含まれる。たとえば、データ・ストリーミング・マスク・ベクト
ルの第1データ・ビットを使用して、第1データ・ストリームをイネーブルすることが可能であり、データ・ストリーミング・マスク・ベクトルの第2データ・ビットを使用して、第2データ・ストリームをイネーブルすることが可能である。1実施形態で、データ・ストリーミング・マスク・ベクトルが、ロード部分およびストア部分に分割され、ロード部分のビットは、入力データ・ストリームをイネーブルし、ストア部分のビットは、出力データ・ストリームをイネーブルする。データ・ストリーミング・マスク・ベクトルによって、複数の入力データ・ストリームおよび出力データ・ストリームを指定し得る。たとえば、1実施形態で、32ビット・データ・ストリーミング・マスク・ベクトルによって、16個までの入力データ・ストリームおよび16個までの出力データ・ストリームをイネーブルし得る。
1実施形態で、データ・ストリーム・マスク・ベクトルが、増補命令部分を介して指定される。たとえば、ループ初期化命令610(図29)などのループ初期化命令に関連する増補命令部分によって、データ・ストリーミング・マスク・ベクトル値を提供して、複数のデータ・ストリームを同時に初期化し得る。各データ・ストリームを、アーキテクチャ的レジスタRiに関連付け得る。アーキテクチャ的レジスタRiからの読取または書込によって、関連する入力データ・ストリームからデータ要素が検索されるか、関連する出力データ・ストリームにデータ要素がストアされる。図15に関して前に説明したように、アーキテクチャ的レジスタRiに、データ・ストリームの次のデータ要素に関連し、PVA実行中または非ループ実行中にのみ可視になる一時インスタンスと、スカラ実行中または非ループ実行中にのみ可視になるオーバーレイされるインスタンスが含まれる。
本明細書で述べない他の機能を、本発明の範囲から逸脱せずに、増補命令の使用を介して追加または拡張することも可能であることを諒解されたい。
図36を参照すると、本発明の1実施形態による、コマンドをコンパイルする方法を示す流れ図が示されている。コンパイラは、一般に、特定のプログラミング言語に従って記述されたコマンドを、コマンドを処理するのに使用される特定のプロセッサによって理解されるシステム・コードに変換するのに使用される。一般に、コンパイラは、特定のコマンドについて類似するコードを生成する。図示の実施形態では、コンパイラが、プログラム・ループに関連するコマンドを増補命令に変換する。したがって、コード密度は、大きくは影響されず、増補命令について前に述べた特徴を、プログラム・ループに関連するコマンドと共に使用し得る。
ステップ960で、コンパイラが、次に処理されるコマンドを受け取る。コマンドは、C、C++、Java(登録商標)、BASIC、および類似物など、特定のプログラミング言語のコマンドに関連するものとし得る。ステップ962で、受け取ったコマンドがプログラム・ループに関連するかどうかを判定する。コンパイラは、分岐コマンド、DO
UNTILコマンド、またはWHILEコマンドなどのプログラム・ループを初期化するか処理する既知のコマンドにコマンドを関連付けることによって、コマンドを認識し得る。同様に、コマンドを、PVA初期化命令に関連付け、コマンドがプログラム・ループに関連することを示し得る。
ステップ964で、コマンドがプログラム・ループに関連しない場合に、コンパイラは、コマンドを標準命令に変換する。前に述べたように、標準命令は、一般にコンパイラによってシステム・コードを提供するのに使用される命令を表し、固定サイズまたは標準サイズであるものとし得る。標準命令が生成されたならば、コンパイラは、ステップ960に戻って新しいコマンドを検索し得る。
ステップ966で、受け取ったコマンドがプログラム・ループに関連するものとして識別される場合に、コンパイラは、コマンドを増補命令に変換する。増補命令には、前に述
べた標準命令に類似する標準命令部分と、増補命令部分が含まれる。増補命令を使用して、前に述べたように、標準命令部分の処理に関する拡張プロパティを指定し得る。たとえば、増補命令部分によって、早期終了、早期継続、または条件実行の制御情報などの条件制御情報を指定し得る。その代わりに、増補命令部分によって、標準命令部分に関連するデータの処理に関するデータ・ストリーミングを指定し得る。増補命令部分を使用して、標準命令部分の処理に関する即値フィールドまたは即値フィールド拡張を提供することも可能である。本発明の範囲から逸脱せずに、他の機能を使用することも可能である。増補命令が、コマンドについて生成されたならば、コンパイラは、ステップ960に戻って、処理される新しいコマンドを検索し得る。1実施形態で、標準命令および標準命令部分は、標準デコーダ430(図27)などの標準デコーダによって処理されるが、増補命令部分は、副デコーダ440(図27)などの副デコーダを使用して処理される。
前述の明細書で、本発明を、特定の実施形態に関して説明した。しかし、当業者は、請求項に示された本発明の範囲から逸脱せずに、様々な修正および変更を行い得ることを諒解するであろう。たとえば、本明細書で教示されたソフトウェアを、コンピュータ・ハード・ディスク、フロッピ・ディスク、88.9mm(3.5インチ)ディスク、コンピュータ記憶テープ、磁気ドラム、スタティック・ランダム・アクセス・メモリ(SRAM)セル、ダイナミック・ランダム・アクセス・メモリ(DRAM)セル、電気的消去可能(EEPROM、EPROM、フラッシュ)セル、不揮発性セル、強誘電体メモリまたは強磁性体メモリ、コンパクト・ディスク(CD)、レーザ・ディスク、光ディスク、および類似するコンピュータ可読媒体の1つまたは複数で実施し得る。したがって、本明細書および図面は、制限的な意味ではなく例示的な意味であると考えられ、そのような修正のすべてが、本発明の範囲に含まれることが意図されている。