(57)【特許請求の範囲】
【請求項１】
ベクトル・オペランドを保存するように構成されるベクトル・レジスタ・ストアと、
Ｎ本の並列処理レーンを提供し、指定されたベクトル・オペランドが提供するＮ個までのデータ要素にセグメント化された演算を実行するように構成されるベクトル処理回路であって、各データ要素が前記Ｎ本のレーンのうち１つに割り当てられ、前記Ｎ個までのデータ要素が複数のセグメントを形成し、前記セグメント化された演算の実行が各セグメントの当該データ要素に別個の演算を実行することを含み、前記別個の演算が、前記関連するセグメントの当該データ要素を含む前記レーン間の相互作用を伴う、ベクトル処理回路と、
異なるセグメントからのデータ要素を含むレーン間の相互作用を防ぐために、複数のセグメント記述子を含む入力ベクトル・オペランドを指定する記述子計算命令に応答して、前記複数のセグメントのそれぞれの間の境界を維持する前記セグメント化された演算の実行時に前記ベクトル処理回路によって使用されるレーンごとの述語情報を生成するように構成された述語生成回路と
を含む、データ処理装置。
【請求項２】
前記ベクトル処理回路が複数のパイプライン段を備え、前記複数セグメントのそれぞれの間の前記境界を維持するために、前記複数のパイプライン段のそれぞれで実行される計算を制御するために前記レーンごとの述語情報を利用するように構成される、請求項１に記載のデータ処理装置。
【請求項３】
各パイプライン段において、前記ベクトル処理回路は、異なるセグメントからのデータ要素を含むレーン間の相互作用を防ぐために、前記レーンごとの述語情報に従って１つ又は複数の計算を選択的に無効化するように構成される、請求項２に記載のデータ処理装置。
【請求項４】
１つ又は複数の前記パイプライン段のそれぞれについて、前記ベクトル処理回路は、そのパイプライン段でどの計算を無効化するかを特定する制御データを得るために、前記レーンごとの述語情報に論理演算を実行するように構成される、請求項３に記載のデータ処理装置。
【請求項５】
前記レーンごとの述語情報が各レーンのためのバイナリ値を含む、請求項１から４までのいずれか一項に記載のデータ処理装置。
【請求項６】
前記バイナリ値が、あるセグメントの最後のデータ要素が割り当てられた個々のレーンを特定するために第１の値に設定され、その他のすべてのレーンについては第２の値に設定される、請求項５に記載のデータ処理装置。
【請求項７】
前記バイナリ値が、あるセグメントのデータ要素を含むレーンを特定するために第１の値に設定され、隣接するセグメントのデータ要素を含むレーンを特定するために第２の値に設定される、請求項５に記載のデータ処理装置。
【請求項８】
前記複数のセグメント記述子が、データ要素をもたないセグメントが少なくとも１つ存在することを示す場合に、前記述語生成回路が制御フィールドを設定するようにさらに構成される、請求項１から７までのいずれか一項に記載のデータ処理装置。
【請求項９】
前記ベクトル処理回路が、前記制御フィールドが設定されていることに応答して、前記セグメント化された演算に関連した追加の処理のステップを実行する、請求項８に記載のデータ処理装置。
【請求項１０】
前記追加処理のステップが、前記複数のセグメント記述子からデータ要素をもたない個々のセグメントの位置を特定することと、前記セグメント化された演算によって生成された結果データ内のその位置に所定のデータ値を挿入することとを含む、請求項９に記載のデータ処理装置。
【請求項１１】
前記セグメント化された演算がキャリーイン・スカラー値をさらに指定し、前記セグメント化された演算を実行すると結果データ要素のベクトルとキャリーアウト・スカラー値とが得られる、請求項１から１０までのいずれか一項に記載のデータ処理装置。
【請求項１２】
前記ベクトル処理回路がセグメント化された命令に応答して前記セグメント化された演算を実行し、前記データ処理装置が、Ｎ個を超えるデータ要素を含むデータ要素のセットに対して前記セグメント化された演算を実行するように前記記述子計算命令と前記セグメント化された命令とを複数回繰り返して実行するように構成され、ある繰り返しの回で前記セグメント化された演算を実行して得られた前記キャリーアウト・スカラー値が、次の繰り返しで前記セグメント化された演算を実行するための前記キャリーイン・スカラー値として使用される、請求項１１に記載のデータ処理装置。
【請求項１３】
前記ベクトル処理回路がセグメント化された命令に応答して前記セグメント化された演算を実行し、前記データ処理装置が、Ｎ個を超えるデータ要素を含むデータ要素のセットに対して前記セグメント化された演算を実行するように前記記述子計算命令と前記セグメント化された命令とを複数回繰り返して実行するように構成され、前記データ要素のセットが複数のセグメントを含む、請求項１から１２までのいずれか一項に記載のデータ処理装置。
【請求項１４】
前記セグメントのそれぞれの内のデータ要素の数が不規則である、請求項１３に記載のデータ処理装置。
【請求項１５】
前記セグメントが、ネスティングされたループ内の所定ループの繰り返しの各回に関連するデータ要素を特定する、請求項１３又は１４に記載のデータ処理装置。
【請求項１６】
前記ベクトル処理回路が、疎行列の各行について複数の乗算結果を得るために、第１のデータ要素の疎行列に第２のベクトル要素のベクトルを乗算する、疎行列乗算演算を実行するように構成され、前記乗算結果が前記セグメント化された演算を実行する対象となる前記データ要素のセットを形成し、各セグメントが前記疎行列の前記行のうち１つの前記乗算結果を含む、請求項１３から１５までのいずれか一項に記載のデータ処理装置。
【請求項１７】
前記セグメント化された演算が各セグメント内の前記乗算結果に累算演算を実行する、請求項１６に記載のデータ処理装置。
【請求項１８】
前記セグメント記述子が、各セグメントの終わり及び各セグメントの始まりのうち１つへのポインタを提供する、請求項１から１７までのいずれか一項に記載のデータ処理装置。
【請求項１９】
前記セグメント記述子が各セグメントの長さを特定する、請求項１から１７までのいずれか一項に記載のデータ処理装置。
【請求項２０】
前記複数のセグメント記述子が符号付き整数を含む、請求項１から１９までのいずれか一項に記載のデータ処理装置。
【請求項２１】
前記複数のセグメント記述子が符号付き整数を含み、
繰り返しの各回に、先行する繰り返しの間に前記先行する繰り返しのためのレーンごとの述語情報を生成するために使用されたいかなるセグメント記述子も削除するように、前記入力ベクトル・オペランドが更新される、請求項１３から２０までのいずれか一項に記載のデータ処理装置。
【請求項２２】
前記述語生成回路が、現在の繰り返しのための前記レーンごとの述語情報を生成する前に、前記現在の繰り返しのために提供された前記複数のセグメント記述子から、先行するすべての繰り返しによって処理されたデータ要素の総数に等しい値を減算するように構成される、請求項２１に記載のデータ処理装置。
【請求項２３】
前記セグメント化された演算が、セグメント化されたスキャン演算とセグメント化された縮約演算のいずれか１つである、請求項１から２２までのいずれか一項に記載のデータ処理装置。
【請求項２４】
複数の述語レジスタを提供する述語レジスタ・ファイルをさらに備え、前記記述子計算命令が前記レーンごとの述語情報が保管される前記述語レジスタのうちの１つを指定するように構成される、請求項１から２３までのいずれか一項に記載のデータ処理装置。
【請求項２５】
ベクトル・オペランドを保存するように構成されるベクトル・レジスタ・ストアと、Ｎ本の並列処理レーンを提供するベクトル処理回路とを有するデータ処理装置内でセグメント化された演算を実行する方法であって、
前記ベクトル処理回路内で、指定されたベクトル・オペランドが提供するＮ個までのデータ要素にセグメント化された演算を実行することであって、各データ要素が前記Ｎ本のレーンのうち１つに割り当てられ、前記Ｎ個までのデータ要素が複数のセグメントを形成し、前記セグメント化された演算の実行が各セグメントの当該データ要素に別個の演算を実行することを含み、前記別個の演算が、前記関連するセグメントの当該データ要素を含む前記レーン間の相互作用を伴う、実行することと、
異なるセグメントからのデータ要素を含むレーン間の相互作用を防ぐために、複数のセグメント記述子を含む入力ベクトル・オペランドを指定する記述子計算命令に応答して、前記複数のセグメントのそれぞれの間の境界を維持する前記セグメント化された演算の実行時に前記ベクトル処理回路によって使用されるレーンごとの述語情報を生成することとを含む、方法。
【請求項２６】
ベクトル・オペランドを保存するベクトル・レジスタ保存手段と、
Ｎ本の並列処理レーンを提供し、指定されたベクトル・オペランドが提供するＮ個までのデータ要素にセグメント化された演算を実行するベクトル処理手段であって、各データ要素が前記Ｎ本のレーンのうち１つに割り当てられ、前記Ｎ個までのデータ要素が複数のセグメントを形成し、前記セグメント化された演算の実行が各セグメントの当該データ要素に別個の演算を実行することを含み、前記別個の演算が、前記関連するセグメントの当該データ要素を含む前記レーン間の相互作用を伴う、ベクトル処理手段と、
異なるセグメントからのデータ要素を含むレーン間の相互作用を防ぐために、複数のセグメント記述子を含む入力ベクトル・オペランドを指定する記述子計算命令に応答して、前記複数セグメントのそれぞれの間の境界を維持する前記セグメント化された演算の実行時に前記ベクトル処理手段によって使用されるレーンごとの述語情報を生成する述語生成手段と
を含む、データ処理装置。
【請求項２７】
請求項１から２４までのいずれか一項に記載のデータ処理装置に対応するプログラム命令のための仮想マシン実行環境を提供するようにコンピュータを制御するためのコンピュータ・プログラムを、非一時的な形で保管するコンピュータ・プログラム製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、セグメント化された演算を実行するためのデータ処理装置及び方法に関する。
【背景技術】
【０００２】
データ処理装置の性能を改善するための１つの知られた技法は、ベクトル演算の実行をサポートする回路を提供することである。ベクトル演算は少なくとも１つのベクトル・オペランドについて実行され、各ベクトル・オペランドは複数のデータ要素を含む。そして、ベクトル演算の実行は、ベクトル・オペランド内の様々なデータ要素にわたり、１つの演算を繰り返し施すことを伴う。
【０００３】
ベクトル演算の実行をサポートする通常のデータ処理システムには、ベクトル・オペランドを保管するためにベクトル・レジスタ・ファイルが備わる。よって、例えば、ベクトル・レジスタ・ファイル内の各ベクトル・レジスタは複数のデータ要素を含むベクトル・オペランドを保管し得る。
【０００４】
一定の実装例では、ベクトル・オペランド内の様々なデータ要素に、並列して演算を実行するために、複数の並列処理レーンを備えるベクトル処理回路（しばしば、ＳＩＭＤ（Single Instruction Multiple Data）処理回路と呼ばれる）を備えることもまた知られている。
【０００５】
ベクトル演算を使用することにより、それと等価な一連のスカラー演算のパフォーマンスとの比較においてパフォーマンス上の著しい利益が実現可能である。
【０００６】
ベクトル処理回路の複数の異なるレーン内で並列処理できるようにベクトル化することが可能な一定のタイプの演算のためにベクトル処理回路を効率的に利用できるようにすることは困難である。例えば、ループの繰り返しごとに実行される演算は多々あるが、繰り返しの各回でそれらの演算によって処理されるデータ要素の数が、繰り返しの各回で処理されるデータ要素の数に規則性がないように変化する可能性がある。繰り返しの各回について、ベクトル処理回路のそれぞれのレーン内で様々なデータ要素の処理が可能ではあり得るが、このことは、ベクトル処理回路の利用可能レーンの有効利用に必ずしもつながらない。例えば、ベクトル処理回路がＮ本の並列処理レーンを有するとして、実際には、多くの場合で繰り返しのうち何回かについてはＮ個より少ないデータ要素が処理され、ベクトル処理回路の非効率的な利用につながることもある。さらに、繰り返しの各回でデータ要素が不規則であるという性質に起因して、繰り返しの任意の回で何本のレーンが必要になるか正確には分からないので、ベクトル処理回路をさらに効率的に利用することは実際的ではないと、これまでは考えられてきた。
【０００７】
そのような不規則な数のデータ要素を処理する必要のあるアルゴリズムの１つの実例は、疎行列の各行について多くの乗算結果を生成するために第１のデータ要素の疎行列を第２のデータ要素のベクトルに乗算する、疎行列乗算アルゴリズムである。各行内の乗算結果は次に、各行の結果を得るために累算される。しかしながら、各行について生成される乗算結果の数は疎行列の各行における０ではないデータ要素の数に依存するので、乗算結果の数は異なる行の間で極めて著しく異なる可能性がある。任意の特定の行について乗算結果を累算するために必要な累算演算はベクトル処理回路のレーンを使用して実行されるのに適するが、繰り返しの任意の特定の回について必要なレーンの数は変動し、その結果ベクトル処理回路の利用効率が著しく低くなる傾向にあり、それによって、このような演算を実行するときのベクトル処理回路のパフォーマンス及びエネルギー消費の両方に影響する。
【０００８】
疎行列ベクトル乗算などの不規則な問題の解決についての試みでは、最近、スループット指向のプロセッサ又はグラフィックス処理ユニット（ＧＰＵ）の使用が注目されている。ＧＰＵは計算をメモリ・アクセスと重複させて遅延を見えなくすることに非常に優れているが、データ構造の不規則性が計算負荷の不均衡として現れる場合には問題が生じる。その結果、この試みが成功するのは、特別なデータ形式が使用される場合、又は例えば、根底にある物理問題がモデル化されて適切な構造の疎行列が得られる場合に限られる。
【０００９】
下記に、不規則なデータ構造を取り扱うための技法について説明された様々な文献の実例を示す。
【先行技術文献】
【非特許文献】
【００１０】
【非特許文献１】Shubhabrata Sengupta、「Efficient Primitives and Algorithms for Many-core architectures」、PhD Thesis、２０１０年
【非特許文献２】G. E. Blelloch、J. C. Hardwick、J. Sipelstein、M. Zagha、S. Chatterjee、「Implementation of a Portable Nested Data-Parallel Language」、Journal of Parallel and Distributed Computing、Volume 21、Issue 1、１９９４年４月
【非特許文献３】B. Ren、G. Agrawal、J. R. Larus、T. Mytkowicz、T. Poutanen、W. Schulte、「SIMD Parallelization of Applications that Traverse Irregular Data Structures」、２０１３年
【非特許文献４】M. Billeter、O. Olsson、U. Assarsson、「Efficient Stream Compaction on Wide SIMD Many-Core Architectures」、Conference on High Performance Graphics予稿集、２００９年
【発明の概要】
【発明が解決しようとする課題】
【００１１】
ベクトル処理回路の利用効率を改善して、例えば前述した不規則なデータ構造などの様々なデータのセットを取り扱うときに並列処理レーンをより効率的に利用できるようにするための機構を提供することが望ましい。
【課題を解決するための手段】
【００１２】
第１の態様から見れば、本発明は、ベクトル・オペランドを保存するように構成されるベクトル・レジスタ・ストアと、Ｎ本の並列処理レーンを提供し、指定されたベクトル・オペランドが提供するＮ個までのデータ要素にセグメント化された演算を実行するように構成されるベクトル処理回路であって、各データ要素が前記Ｎ本のレーンのうち１つに割り当てられ、前記Ｎ個までのデータ要素が複数のセグメントを形成し、セグメント化された演算の実行が各セグメントのデータ要素について別個の演算を実行することを含み、前記別個の演算が、関連するセグメントのデータ要素を含むレーン間の相互作用を伴う、ベクトル処理回路と、異なるセグメントからのデータ要素を含むレーン間の相互作用を防ぐために、複数のセグメント記述子を含む入力ベクトル・オペランドを指定する記述子計算命令に応答して、前記複数のセグメントのそれぞれの間の境界を維持する前記セグメント化された演算の実行時にベクトル処理回路によって使用されるレーンごとの述語情報を生成するように構成された述語生成回路とを含む、データ処理装置を提供する。
【００１３】
本発明によれば、述語生成回路は記述子計算命令に応答して、入力された複数のセグメント記述子を考慮しながら、レーンごとの述語情報を生成する。ベクトル処理回路は次に、２つ以上のセグメントを形成するＮ個までのデータ要素（Ｎは並列処理レーンの数）にセグメント化された演算を実行するように準備される。セグメント化された演算を実行することによって、異なるセグメントからのデータ要素を含むレーン間の相互作用を回避しつつ、各セグメントのデータ要素に別個の演算を実行できるように、レーンごとの述語情報が、それらの各セグメント間の境界が維持されるために、使用される。
【００１４】
セグメント化された演算は通常、Ａ、Ａ＋Ｂ、Ａ＋Ｂ＋Ｃ、Ａ＋Ｂ＋Ｃ＋Ｄ（ここでＡ、Ｂ、Ｃ及びＤは別個のレーンに割り当てられるデータ要素）などのデータ要素への一連の演算の適用を表す結果を生成する。要素が計算される順序は（結合性を仮定すれば）関係ないが、結果のベクトルは入力要素の順序に基づく数学的シーケンスを表す。レーンごとの述語情報がなければ、数学的シーケンスはＮ個までのデータ要素の全セットに適用されることになるが、レーンごとの述語情報のおかげで、各セグメント内で別個の数学的シーケンスが生成されるように、隣接するセグメント間の境界が維持される。
【００１５】
一実施例では、各セグメントについて実行される別個の演算は本質的に同一の演算であり、レーンごとの述語情報を使用して維持されるそれぞれの境界により、各セグメント内で別個に実行される。各セグメントで実行される別個の演算の一部として発生する「レーン間の相互作用」は通常、少なくとも２つの異なるレーンによって与えられる要素に係るバイナリ演算を伴う。そのような演算には、計算、データ移動（例えば最小／最大）又は代入（例えば飽和加算／飽和減算）などが含まれ得る。レーンごとの述語情報により、隣接するレーン間のそのような相互作用がセグメント境界で防がれる。
【００１６】
本発明の技法によれば、ベクトル処理回路で１回又は複数回の繰り返しを通して個別にセグメントを処理する必要はなく、代わりに、複数セグメントからのデータ要素に演算を行うためにベクトル処理回路で１回の繰り返しをさせるようにすることにより、Ｎ本の並列処理レーンのより効率的な利用が実現し得る。これは、複数セグメント間の境界の維持を可能にするレーンごとの述語情報を得る、記述子計算命令の実行によって可能である。
【００１７】
そのような手法により、各種の広範な演算を実行する際のパフォーマンス向上と消費エネルギー節約の両方が得られる。これは、各セグメント内のデータ要素の数が不規則な複数のセグメントから成るデータ構造を処理するときに、ベクトル処理回路のより効率的な利用を可能にするために特に良く適している。
【００１８】
一実施例では、ベクトル処理回路は複数のパイプライン段を備え、前記複数のセグメントのそれぞれの間の境界を維持するために、複数のパイプライン段のそれぞれで実行される計算を制御するためにレーンごとの述語情報を利用するように構成される。よって、そのような実施例では、異なるセグメントからのデータ要素を含むレーン間の一切の相互作用を防ぐために、レーンごとの述語情報が、各パイプライン段で実行される計算を管理するために使用される。
【００１９】
一実施例では、各パイプライン段において、ベクトル処理回路は、異なるセグメントからのデータ要素を含むレーン間の相互作用を防ぐために、前記レーンごとの述語情報に従って１つ又は複数の計算を選択的に無効化するように構成される。よって、一実施例では、ベクトル処理回路はＮ本の並列処理レーンに割り当てられたＮ個のデータ要素にわたってセグメント化されていないバージョンの演算を実行できるようにする回路要素を含んでもよいが、レーンごとの述語情報を使用すれば、セグメント化されていないバージョンの演算の中で実行されるであろう演算の１つ又は複数が、演算を、各セグメント内のデータ要素に対してセグメント化された形で実行することができるように、無効化される。
【００２０】
ベクトル処理回路がレーンごとの述語情報をどのように使用するかは実施例により異なってもよい。しかし、一実施例では、１つ又は複数のパイプライン段のそれぞれについて、ベクトル処理回路は、そのパイプライン段でどの計算を無効化するかを特定する制御データを得るために、レーンごとの述語情報に論理演算を実行するように構成される。特定の一実施例では、述語生成回路によって生成されたレーンごとの述語情報は、最初の繰り返し回では「無加工で」使用されるが、後続の繰り返しでは、そのような後続の繰り返しのために必要な制御データが得るために、レーンごとの述語情報をシフトしたバージョンと論理和演算される。
【００２１】
レーンごとの述語情報は様々な形をとることができる。一実施例では、各レーンのためのバイナリ値を含む。ある特定の一構成では、バイナリ値は、あるセグメントの最後のデータ要素が割り当てられた個々のレーンを特定するために第１の値に設定され、その他のすべてのレーンについては第２の値に設定される。よって、実例として、レーンごとの述語情報内の論理１の値の各出現が、それに割り振られたデータ要素がセグメントの終わりを示すレーンを特定するように、第１の値が論理１の値で、第２の値が論理０の値であってもよい。よって、第１の値は、Ｎ本の並列処理レーン内で各セグメントの終わりを特定するためのポインタとして効率よく使用される。
【００２２】
しかしながら、レーンごとの述語情報をそのようにして指定する必要はない。例えば、別の実施例では、バイナリ値は、あるセグメントのデータ要素を含むレーンを特定するために第１の値に設定され、隣接するセグメントのデータ要素を含むレーンを特定するために第２の値に設定される。よって、レーンごとの述語情報は、Ｎ本の並列処理レーンの中のセグメントのそれぞれを特定するように、一連の第１の値と一連の第２の値が交互になる。３つ以上のセグメントが特定される場合には、隣接する個々のセグメントは、バイナリ値の変遷によって示されるであろう。個々のセグメントについて、同じ値のバイナリ値の数はセグメント内のデータ要素の総数を特定する。
【００２３】
一実施例では、セグメントがデータ要素をもたないと定めることが可能である。一実施例では、そのようなセグメントは事実上、レーンごとの述語情報によって特定することはできない。その代わり、一実施例では、複数のセグメント記述子が、データ要素をもたないセグメントが少なくとも１つ存在することを示す場合に、述語生成回路が制御フィールドを設定するようにさらに構成される。制御フィールドは様々な方法で設定することができる。例えば、データ要素をもたないセグメントが少なくとも１つ存在することを特定するためにフラグを設定してもよいし、ある値をＣＰＵの汎用レジスタに保存することもできる。
【００２４】
ベクトル処理回路が制御フィールドの設定にどのように次に応答するかは実施例によって異なり得る。実際には、いくつかの実施例では、ベクトル処理回路が制御フィールドの設定に応答して何の処置を実行する必要もないかもしれない。しかし、一実施例では、ベクトル処理回路は制御フィールドが設定されていることに応答して、セグメント化された演算に関連した追加の処理のステップを実行する。
【００２５】
特定の一実施例では、追加処理のステップは、複数のセグメント記述子からデータ要素をもたない個々のセグメントの位置を特定することと、セグメント化された演算によって生成された結果データ内のその位置に所定のデータ値を挿入することとを含む。
【００２６】
フラグによって制御フィールドが実装される実施例では、フラグは、データ要素をもたないセグメントが少なくとも１つ存在することを示す目的のみに提供される専用フラグであってもよい。或いは、別個の専用フラグが提供される必要はなく、例えばキャリー・フラグなどの既存のフラグを使用してもよい。さらに、ゼロ長のセグメントの位置などの付随情報を保持するために追加のフラグを使用することもできる。
【００２７】
一実施例ではセグメント化された演算は入力されたデータとして指定されたベクトル・オペランドのデータ要素のみをとり得るが、別の実施例ではセグメント化された演算はキャリーイン・スカラー値をさらに指定してもよく、セグメント化された演算を実行すると、結果データ要素のベクトルとキャリーアウト・スカラー値とが得られる。よって、例えば、セグメント化された演算の実行中の適切な時点において最初のセグメントに関連するレーンのそれぞれにキャリーイン・スカラー値を伝えることによって、指定されたベクトル・オペランドによって提供されるデータ要素に対してベクトル処理回路内で実行される計算に、そのキャリーイン・スカラー値が組み込まれる。結果データ要素のベクトルを生成することに加えて、キャリーアウト・スカラー値もまた得られる。いくつかの状況では、キャリーアウト・スカラー値は、キャリーアウト値が存在しないことを特定するのに使用される中立値に設定されてもよい。
【００２８】
しかしながら、別の実施例では、キャリーアウト値をプロセスの別の繰り返しのキャリーイン値として使用することができる。具体的には、一実施例において、ベクトル処理回路がセグメント化された命令に応答してセグメント化された演算を実行し、データ処理装置が、Ｎ個を超えるデータ要素を含むデータ要素のセットに対してセグメント化された演算を実行するように記述子計算命令とセグメント化された命令とを複数回繰り返して実行するように構成され、ある繰り返しの回でセグメント化された演算を実行して得られたキャリーアウト・スカラー値は、次の繰り返しでセグメント化された演算を実行するためのキャリーイン・スカラー値として使用される。これによって、大きなデータセットに演算を実行しながら、必要な繰り返しのすべての実行の間、ベクトル処理回路のリソースをより効率的に利用できるようになる。セグメントが２回以上の繰り返しにまたがる場合には、そのセグメントのデータ要素に関して演算を継続して実行することができるように次回の繰り返しに適切な値を伝えられるよう、ある繰り返しの最後に得られるキャリーアウト・スカラー値を次回の繰り返しのキャリーイン・スカラー値として使用することができる。
【００２９】
そのような取り決めにおいては、各セグメント内のデータ要素の数が不規則であってもベクトル処理回路の有効利用が実現される。
【００３０】
一実施例では、セグメントは、ネスティングされたループ内の所定ループの繰り返しの各回に関連するデータ要素を特定する。所定のループは、例えばネスティングされたループの内側のループであってもよい。
【００３１】
一実施例では、ベクトル処理回路は、疎行列の各行について複数の乗算結果を得るために、第１のデータ要素の疎行列に第２のベクトル要素のベクトルを乗算して。疎行列乗算演算を実行するように構成され、前記乗算結果はセグメント化された演算を実行する対象となる前記データ要素のセットを形成し、各セグメントは疎行列内の行のうちの１つの乗算結果を含む。これは、各セグメントに提供されるデータ要素の数が不規則であるとおそらく考えられる特定の例示的シナリオを表す。
【００３２】
セグメント化された演算は様々な形をとることができるが、一実施例では各セグメント内の乗算結果に累算演算を実行する。
【００３３】
記述子計算命令への入力として提供されるセグメント記述子は様々な形をとることができる。一実施例ではセグメント記述子は、各セグメントの終わりか各セグメントの始まりのいずれかへのポインタを提供し、別の実施例ではセグメント記述子は各セグメントの長さを特定する。セグメント記述子が各セグメントの長さを特定する場合には、現在のセグメントの終わりを直前のセグメントに相対するオフセットに基づいて計算することができる。
【００３４】
セグメント記述子は任意の適切なデータ型で提供されてよい。一実施例では、それらは符号付き整数を含み、特定の一実施例では各セグメント記述子は３２ビットの符号付き整数で表される。
【００３５】
そのような符号付き整数がセグメント記述子として使用される一実施例では、記述子計算命令とセグメント化された命令との繰り返しの各回に、先行する繰り返しの間にその先行する繰り返しのためのレーンごとの述語情報を生成するために使用されたいかなるセグメント記述子も削除するように、入力ベクトル・オペランドが更新される。これにより使用済みのセグメント記述子が廃棄され、後の繰り返しで再考慮されないことが確実にされる。
【００３６】
一実施例では、述語生成回路は、現在の繰り返しのためのレーンごとの述語情報を生成する前に、現在の繰り返しのために提供された複数のセグメント記述子から、先行するすべての繰り返しによって処理されたデータ要素の総数に等しい値を減算するように構成される。特定の一実施例では、最後の繰り返し回を除く繰り返しの各回でＮ個のデータ要素が処理され、したがって、修正済みのセグメント記述子を生成し、次にそれを使用してレーンごとの予測情報を生成するために、複数のセグメント記述子からＮの倍数が減算される。これにより、現在の繰り返し回に存在するいずれのセグメント境界も特定するために、現在の繰り返し回のための適切な並列処理レーンにセグメント記述子を対応付けることができる。
【００３７】
セグメント化された演算は様々な形をとることができるが、一実施例では、セグメント化されたスキャン演算又はセグメント化された縮約演算のどちらかである。スキャン演算に従って、漸増する数のデータ要素に特定されたバイナリ演算が繰り返し実行される。バイナリ演算は、例えば、加算演算、乗算演算、最小値検出演算、最大値検出演算などの様々な形をとることができる。スキャン演算を実行した結果、そのそれぞれは様々な数のデータ要素に対してのバイナリ演算の適用に関連する、一連の結果を有するベクトルが生成される。特定の実例として、スキャン演算はバイナリ演算として加算演算を指定してもよく、そのようなスキャン加算（scan add）命令は、プレフィックス・サム（prefix sum）演算と呼ばれることもある。
【００３８】
縮約（reduction）演算はスキャン演算に類似するが、最後のスキャン結果のみが出力として保持される（したがって中間のスキャン結果を保持する必要はなく、いつかの実施例では計算する必要もない）。
【００３９】
述語生成回路によって生成されたレーンごとの述語情報を、セグメント化された演算の実施の間にベクトル処理回路が続いて使用するために保持することができる方法はいくつもある。一実施例では、レーンごとの述語情報を保管するために専用のレジスタが提供されてもよい。しかしながら、別の実施例では、複数の述語レジスタを提供する述語レジスタ・ファイルを装置がさらに備え、複数の述語レジスタのうち、レーンごとの述語情報を保管する１つを指定するように記述子計算命令が構成される。よって、記述子計算命令の中で、使用される特定の予測レジスタを直接特定することができる。
【００４０】
第２の態様から見れば、本発明は、ベクトル・オペランドを保存するように構成されるベクトル・レジスタ・ストアと、Ｎ本の並列処理レーンを提供するベクトル処理回路とを有するデータ処理装置内でセグメント化された演算を実行する方法であって、ベクトル処理回路内で、指定されたベクトル・オペランドが提供するＮ個までのデータ要素にセグメント化された演算を実行することであって、各データ要素が前記Ｎ本のレーンのうち１つに割り当てられ、前記Ｎ個までのデータ要素が複数のセグメントを形成し、セグメント化された演算の実行が各セグメントのデータ要素に別個の演算を実行することを含み、前記別個の演算が、関連するセグメントのデータ要素を含むレーン間の相互作用を伴う、実行することと、異なるセグメントからのデータ要素を含むレーン間の相互作用を防ぐために、複数のセグメント記述子を含む入力ベクトル・オペランドを指定する記述子計算命令に応答して、前記複数セグメントのそれぞれの間の境界を維持する前記セグメント化された演算の実行時にベクトル処理回路によって使用されるレーンごとの述語情報を生成することとを含む、方法を提供する。
【００４１】
第３の態様から見れば、本発明は、ベクトル・オペランドを保存するベクトル・レジスタ保存手段と、Ｎ本の並列処理レーンを提供し、指定されたベクトル・オペランドが提供するＮ個までのデータ要素にセグメント化された演算を実行するベクトル処理手段であって、各データ要素が前記Ｎ本のレーンのうち１つに割り当てられ、前記Ｎ個までのデータ要素が複数のセグメントを形成し、セグメント化された演算の実行が各セグメントのデータ要素に別個の演算を実行することを含み、前記別個の演算が、関連するセグメントのデータ要素を含むレーン間の相互作用を伴う、ベクトル処理手段と、異なるセグメントからのデータ要素を含むレーン間の相互作用を防ぐために、複数のセグメント記述子を含む入力ベクトル・オペランドを指定する記述子計算命令に応答して、前記複数セグメントのそれぞれの間の境界を維持する前記セグメント化された演算の実行時にベクトル処理手段によって使用されるレーンごとの述語情報を生成する述語生成手段とを含む、データ処理装置を提供する。
【００４２】
第４の態様から見れば、本発明は、本発明の第１の態様によるデータ処理装置に対応するプログラム命令のための仮想マシン実行環境を提供するようにコンピュータを制御するためのコンピュータ・プログラムを、非一時的な形で保管するコンピュータ・プログラム製品を提供する。
【００４３】
添付の図面に示されるとおりのその実施例を参照しながら、単なる実例として、本発明についてさらに説明する。
【図面の簡単な説明】
【００４４】
【図１】一実施例によって、入力ベクトル・オペランドを指定する記述子計算（compute descriptor）命令の実行によってレーンごとの述語情報が生成される様子の概略を示す。
【図２】一実施例によってセグメント化されたスキャン演算を実行するために、レーンごとの述語情報を使用する様子の概略を示す。
【図３】一実施例によるデータ処理装置のブロック線図。
【図４Ａ】一実施例によって、図３の装置を使用してデータ要素のセットをセグメント化された演算にかける方法のフロー図。
【図４Ｂ】一実施例による図４Ａの任意選択のフラグ評価ステップを、より詳細に示す。
【図５Ａ】レーンごとの述語情報を生成するために、一実施例によって、記述子計算ユニット１５０内に提供される構成要素を示す。
【図５Ｂ】任意選択のフラグを生成するために、一実施例によって、記述子計算ユニット１５０内に提供される構成要素を示す。
【図６】一実施例によって、図３の装置を使用して疎行列乗算が実行され得る様子を概略的に示す。
【図７】一実施例によって、レーンごとの述語情報及び繰り返しの各回についてのフラグを生成するために、パックされた記述子のセットが複数の繰り返しの間、使用される様子を概略的に示す。
【図８】一実施例によってセグメント化された縮約（reduction）演算を実行するために、レーンごとの述語情報が使用され得る様子を示す。
【図９】一実施例によって記述子計算命令内に提供されるフィールドを概略的に示す。
【図１０】一実施例によってセグメント化された縮約命令内に提供されるフィールドを概略的に示す。
【図１１】一実施例によるデータ処理装置の仮想マシン実装を概略的に示す。
【発明を実施するための形態】
【００４５】
図１は、一実施例による、記述子計算（compute descriptor）演算の実行の概略を示す。具体的には、一実施例において、データ処理装置内の述語生成回路は、データ処理装置のベクトル処理回路により、セグメント化された演算を次いで実行するのに使用されるレーンごとの述語情報１５を生成するために、複数のセグメント記述子を含む入力ベクトル・オペランド１０を指定する記述子計算命令に応答するように構成されている。一実施例では、図１に示されるように、入力ベクトル・レジスタ１０が一連の符号なしデータ値を含み、特定の一実施例では、入力ベクトル・レジスタは一連の８つの３２ビットの符号なし値を含む。この実施例では、符号なし値はそれぞれセグメントの終わりを表す。
【００４６】
この実例では、ベクトル処理回路は８本の並列処理のレーンを提供し、よって、任意の特定の繰り返し回において一連の８個までのデータ要素にセグメント化された演算を実行することができると仮定されている。通常、セグメント化された演算はデータ要素の特定の入力ベクトル・オペランドを指定するセグメント化された命令に応答して、各データ要素がベクトル処理回路内の並列処理のレーンの１つに割り当てられた状態で、実行される。
【００４７】
一連の符号なし３２ビット値を指定する記述子計算命令の入力ベクトル・オペランドについての考察に戻ると、最初の符号なし値１１の値は１であり、最初のセグメントがデータ要素位置１で終わることを示している。これにより、レーンごとの述語情報１５（本明細書ではマスクとも呼ぶ）の第２ビット１６が１に等しく設定される。同様に、入力オペランド１０内の２つ目の符号なし３２ビット値１２の値は６であり、次のセグメントがデータ要素位置６で終わることを示す。これによって、マスク１５内のビット１７が１に等しく設定される。しかし、次の符号なし値１３は８より大きい値（この場合の値は９）を有するので、１回の繰り返し回でベクトル処理回路によって処理可能なデータ要素の数の範囲外にある。したがって、入力オペランド１０内の３つ目以降の符号なし値は、現在の繰り返し回では無視される。マスク内で、入力オペランド１０の内容により論理１の値に等しく設定されなかった任意のビット位置は、図１に示されるように、０に等しく設定される値を有する。入力オペランド１０内の残りの符号なし値は、図７を参照しながら実例として詳細に考察するように、後続の繰り返し回で使用することができる。
【００４８】
一実施例では、記述子計算命令を実行すると、マスク１５に加えて、フラグ２０の値も操作される。フラグの状態は、入力オペランド・レジスタ１０内の２つの連続する符号なし値の値が同じであるか否かを示し、これは、データ要素をもたないセグメントの存在を示す。一実施例では、このフラグは入力ベクトル・レジスタ１０内の２つの連続する要素が等しいときに論理１の値に設定されるが、それ以外のときは論理０の値にクリアされる。したがって、図１の実例では、フラグ２０は論理０の値にクリアされる。いくつかの実施例ではアルゴリズム／プログラマはこのフラグを無視すると決めてもよいが、一実施例では、例えば図４Ｂを参照しながら後に考察するように、別途の扱いを必要とする入力ベクトルを特定するために使用される。
【００４９】
図２は、一実施例によって、図１で生成されたマスク１５を使用してベクトル処理回路内でセグメント化されたスキャン演算を実行する様子の概略を示す図である。この実例では、スキャン（scan）演算はそのバイナリ演算として加算（add）演算を指定する。値ｘ０、ｘ１、ｘ２…の一連の入力を考えると、スキャン加算（scan add）の適用により、下記の、一連の結果ｙ０、ｙ１、ｙ２…が得られる。
ｙ０＝ｘ０
ｙ１＝ｘ０＋ｘ１
ｙ２＝ｘ０＋ｘ１＋ｘ２
…
【００５０】
図２に示される実例では、入力ソース・ベクトル・オペランド２５はｖ０からｖ７の８つのデータ要素を含む。セグメント化しない場合は、これらの８つのデータ要素にスキャン加算演算を実行すると、加算演算が各レーン内の増え続ける数のデータ要素に実行され、入力データ要素ｖ７を含む最後のレーンでは、得られる結果は８つのデータ要素ｖ０からｖ７のすべての和を表すよう、ベクトル処理回路の並列処理の８本のレーンのそれぞれにわたって繰り返して加算演算が適用されることが理解されよう。
【００５１】
しかしながら、記載された実施例によれば、ベクトル処理回路の動作はマスク１５、具体的には、セグメントの終わりを特定するマスク内の論理１の値のそれぞれが提供されることによって修正される。したがって、最初のセグメントがベクトル要素ｖ０及びｖ１を含み、そして２個目のセグメントはベクトル要素ｖ２、ｖ３、ｖ４、ｖ５、ｖ６を含む。最後のベクトル要素ｖ７は、入力ベクトル・オペランド２５によって表されるベクトル長８の中で終わらない３個目のセグメントに含まれる。
【００５２】
図２に示されるように、セグメント化されたスキャン演算は、分離した４つの部分２７、３２、４２、及び５７で実行される。最初の部分２７では、部分２７内の２本の破線で示された計算が無効化されるように入力マスク１５が使用される。したがって、残りの加算演算の実行により、入力ベクトル２５が中間形式３０に変換される。
【００５３】
スキャン演算３２の次の部分では、新しいマスク３５を得るために、マスクとそれ自体を１ビットだけシフトしたバージョンとの論理和を行って修正されたマスクが実行される。ここで新しいマスク３５によってスキャン演算の２番目の部分３２内の破線で示された３つの演算が無効化され、その結果として、残りの加算演算の実行により、中間ベクトル４０が得られる。
【００５４】
スキャン演算の３番目の部分４２では、マスク３５とそれ自体を２ビットだけシフトしたバージョンとの論理和を実行することによって、さらに修正されたマスク４５が得られる。これは３番目の部分４２内の破線で示された３つの計算を無効化し、結果、中間ベクトル５０が得られる。
【００５５】
スキャン演算の最後の部分５７は、最初のセグメントの各レーン内のデータ要素にスカラー入力を加算することを伴う。この実例では、最初のセグメントはレーン０とレーン１のみにデータ要素をもつので、スカラー・オペランド５５は他のいずれのレーンにも伝播されない。これにより結果のベクトル６０が得られる。加えて、レーン７はベクトル要素ｖ７を含み、これは終わっていない３個目のセグメントの一部であり、よって、ベクトル要素ｖ７はキャリーアウト・スカラー値６５として出力される。そして、キャリーアウト・スカラー値６５を、セグメント化されたスキャンの次の繰り返し回のキャリーイン・スカラー値として使用することができ、その後に続く任意のそのような繰り返し回のために、既に使用済みの記述子値「１」及び「６」を除いた修正済み入力ベクトル・オペランドに基づいて記述子計算命令をさらに実行することによって、新しいマスクが生成される。セグメント化されたスキャン処理の後続の繰り返し回のためにマスクを生成するプロセスについては、図７を参照しながら後述する。
【００５６】
図３は、一実施例によるデータ処理装置を示す。装置によって実行されるべき命令が命令キュー１００に置かれており、ここからデコード回路１０５に渡される。デコード回路は、発行キュー１１０内に置かれる特定の、マイクロオペレーション（micro-ops）と呼ばれることもある制御情報を生成するために命令をデコードする。次に発行キューが、受け取られた命令によって指定される演算を実行させるために、適切な制御情報を装置内の関連する処理ユニットにディスパッチする。
【００５７】
図示される実例には複数のベクトル処理ユニット１１５が備わり、これらのユニットはスキャンユニット１２０、算術論理演算ユニット（ＡＬＵ）１２５、積和演算（ＭＡＣ）ユニット１３０、浮動小数点ユニット（ＦＰＵ）１３５及び、記述子計算ユニット１５０を含む。したがって、発行キュー１１０内で特定された浮動小数点演算は処理のためにＦＰＵ１３５に転送され、乗算及び／又は積和演算はＭＡＣユニット１３０に渡され、標準の算術演算はＡＬＵ１２５に渡される。スキャンユニット１２０自体は別の算術論理演算ユニットによって形成されてもよいし、記載される実施例のスキャン演算を実行するために準備される専用ユニットであってもよい。一実施例では、スキャンユニット１２０とＡＬＵ１２５との間で転送経路を使用しながら必要なセグメント化されたスキャン演算を実行するために、スキャンユニット１２０とＡＬＵ１２５を組み合わせて使用してもよい。よって、例えば、いくつかのレーン内（その数は、実行される繰り返し回で並列処理レーン内のどこに最初のセグメント境界があるかに依存する）のベクトル要素にスカラー値が加算されるスキャン演算の最後の部分５７を行うために、ＡＬＵを使用してもよい。
【００５８】
記述子計算ユニット１５０は、上記で考察した記述子計算命令を実行するために使用され、一実施例では、結果のマスクが述語レジスタ・ファイル１５５内の述語レジスタの１つに保管されるように構成される。述語レジスタは予め定められていてもよいし、又は、記述子計算命令の１つのフィールド内で特定されてもよい。記述子計算命令の実行によってフラグも操作される場合には、記述子計算ユニット１５０はフラグ１６０への書き込みアクセスを有する。スキャンユニット１２０（及び、任意選択でＡＬＵ１２５）は次に、前述のセグメント化されたスキャン演算を実行するときには述語レジスタ・ファイル１５５及びフラグ１６０へのアクセスを有する。
【００５９】
ベクトル処理ユニット１１５によって要求される様々な入力オペランドは、ベクトル・レジスタ・ファイル１４０内のレジスタから読み込まれる。加えて、それぞれのユニット（出力が述語レジスタ・ファイルに保管される記述子計算ユニットを除く）によって生成される結果オペランドは通常、ベクトル・レジスタ・ファイル１４０内の目的地レジスタに書き戻される。ロード命令及びストア命令は、オペランド・データがメモリからベクトル・レジスタ・ファイル１４０の指定されたレジスタにロードされるか、又は１つ若しくは複数のベクトル・レジスタの現在の内容をメモリに書き戻すために、対応するロード演算又はストア演算がベクトル・ロード／ストア・ユニット（ＬＳＵ）１４５によって実行されるように使用される。
【００６０】
図４Ａは、一実施例によって、記述子計算命令及び関連するセグメント化されたスキャン命令を複数回繰り返して実行することにより、１組のデータ要素にセグメント化されたスキャン演算を実行するよう図３のデータ処理装置が構成される様子を示すフロー図である。図４Ａのステップ２００に示されるように、パラメータＮはセグメント化されたスキャン演算を実行するために使用されるＳＩＭＤ処理ユニット内の並列処理レーンの数を示す。別の実施例では、スキャンユニットは、例えばスキャン演算の最後の部分５７をＡＬＵ１２５に委託することによってセグメント化されたスキャン演算を実行するために、ＡＬＵ１２５と組み合わせて使用されてもよいが、図３の実例では、このＳＩＭＤ処理ユニットはスキャンユニット１２０の形をとる。図２に示される実例などの特定の一実施例では、Ｎは８に等しい。
【００６１】
これも図４Ａのステップ２００に示されるように、パラメータＸは処理されるデータ要素セット内のデータ要素の総数を特定する。この実例では、ＸはＮより大きいと仮定され、したがって、すべてのデータ要素を処理するためには、スキャンユニットで複数回の繰り返しを実行することが必要になる。ステップ２００で、最後に、ポインタＰが０に等しく設定される。
【００６２】
ステップ２０５で、最初のＮ個のデータ要素が取得される。これは通常、そのベクトル・オペランドが、あるセグメント化されたスキャン命令の入力オペランドとして指定されることに先立って、ベクトル・レジスタ・ファイル１４０のベクトル・レジスタのうち１つにそれらのＮ個のデータ要素が保管されることによって起こる。
【００６３】
ステップ２１０で、ポインタＰから始まるＮ個の記述子要素がベクトル・レジスタＶにロードされる。一実施例では、ベクトル・レジスタＶはベクトル・レジスタ・ファイル１４０内のベクトル・レジスタのうち１つであり、記述子計算命令の入力オペランドとして指定される。上記で図１を参照しながら考察したように、一実施例では、それぞれの記述子要素は符号付き３２ビット値の形をとる。
【００６４】
上記で図１を参照しながら考察したように、マスク、及び任意選択でフラグ値を生成するために、ステップ２１０に続いて、記述子計算ユニット１５０内でベクトル・レジスタＶをソース・オペランドとして使用して記述子計算命令が実行される。後に図７の考察で明らかになるように、ベクトル・レジスタＶ内の記述子要素を使用する前に、セグメント化されたスキャンプロセスの先行する繰り返しによって処理されたデータ要素の総数に等しい値が記述子要素から減算される。したがって、第１の繰り返し回では、処理されたデータ要素がなく、記述子要素は修正されずに使用される。ベクトル長を８と仮定して（すなわち、ＳＩＭＤユニット内に８本の並列処理のレーンがあるとして）、以前の繰り返しの各回で、並列処理のそれらのレーン内で８つのデータ要素が処理されるなら、第２の繰り返し回では入力された記述子要素から８の値が減算され、第３の繰り返し回では記述子要素から１６の値が減算され、以下同様である。修正された記述子要素に基づいて、上記で図１を参照しながら考察した方法を使用してマスクが生成される。
【００６５】
一実施例では、この減算プロセスは記述子計算命令の実行の一部として組み込まれているが、別の実施例では、一度、記述子計算命令が実行されると、入力ベクトル・オペランド内で指定されるように記述子要素を修正する必要がなくなるように、ベクトル・レジスタ・ファイル１４０内のベクトル・レジスタＶを、そのベクトル・レジスタが記述子計算命令の入力オペランドとして指定される前に修正するように、別の命令を使用してもよいことが理解されよう。
【００６６】
ステップ２１５に続いて、ステップ２２０で、例えば、上記で図２を参照しながら考察したように、セグメントの分離を維持するためにマスクを使用して、ＳＩＭＤ処理ユニット内でセグメント化された演算が実行される。一実施例では、処理すべきデータ要素を含むベクトル・オペランドをスキャン命令の１つの入力で指定し、セグメント化されたスキャン演算を実行するときに使用されるべきマスクを含む述語レジスタを別の入力で指定して、スキャンユニット１２０（及び、任意選択でＡＬＵ１２５）に必要なスキャン演算を実行させるために、セグメント化されたスキャン命令が使用される。
【００６７】
ステップ２２５には、後に図４Ｂを参照しながら考察するように、任意選択のフラグ評価ステップがあり、このステップを実行するか否かは、記述子計算命令がフラグ１６０のうちの１つの値を操作するのに使用されるか否かに依存する。
【００６８】
ステップ２３０で、次に、Ｘ個すべてのデータ要素が処理されたか判断され、もしまだであれば、次にプロセスは、セグメント・カウント値Ｃが計算されるステップ２３５に進む。具体的には、セグメント・カウントＣは、終了したばかりの繰り返し回で処理されたセグメントの数を特定する。図１の実例で考えると、その繰り返し回についてはＣは２に等しく設定されることになる。
【００６９】
ステップ２３５に続いて、パラメータＰがセグメント・カウントＣの値だけ増加される。その後、ステップ２４５で、例えば、データ要素を、ベクトル・レジスタ・ファイル１４０内の、次のセグメント化されたスキャン命令の入力オペランドとして指定される、１つのベクトル・レジスタにロードすることによって、次のＮ個のデータ要素が取得される。その後、プロセスはステップ２１０に戻る。この時点で、ポインタＰからベクトル・レジスタＶにロードされるＮ個の記述子要素は、ステップ２４０で計算されたポインタＰの修正後の値に依存している。
【００７０】
すべてのデータ要素の処理されるまで上記のプロセスが繰り返され、その後、プロセスがステップ２５０で終了する。最後の繰り返し回では、処理されるデータ要素はＮ個より少ないステップ２４５があり得ることに留意されたい。この場合、残りのデータ要素がロードされるベクトル・レジスタは、ベクトル・オペランドの残りのデータ要素を埋めるために、いくつかのダミーデータを含んでもよい。また、スキャンユニット１２０（及びＡＬＵ１２５）内の並列処理の一定のレーンを無効化して、アクティブなデータに演算を実行しない、レーン内での処理要素をオフにするために、述語制御情報を使用することも可能である。
【００７１】
図４Ｂは、一実施例による任意選択のフラグ評価ステップ２２５を示すフロー図である。ステップ２６０で、直前のステップ２１５で記述子計算命令の実行によってフラグが設定されたか判断される。設定されていない場合は、処置は必要ない。しかし、フラグが設定されていた場合は、現在の繰り返し回についてベクトル・レジスタＶの中のＮ個の記述子要素から、各ゼロ長のセグメントの位置が判断される。一実施例では、ゼロ長のセグメントはそれぞれ、同じ値をもつ２つの連続した記述子要素の存在によって示される。任意の特定されたゼロ長のセグメントについて、ステップ２７０で、ステップ２２０で実行されたセグメント化された演算の出力の中の各ゼロ長のセグメントの位置に所定の値（例えば、論理０の値）が挿入される。よって、前述の図１及び図２の実例を考えると、入力レジスタ１０が最初の３つの記述子要素として値１、１、及び６を有するなら、セグメント化されたスキャン演算は図２に示されるように実行されるが、ステップ２７０で、最初のセグメントの最後のデータ要素に関連して得られた値、すなわちｖ１＋ｖ０＋ｓの値と、２個目のセグメントの合計に対して得られた値との間に所定の値が挿入される。
【００７２】
所定の値は論理０の値である必要はなく、特定の実装に対して適切な任意の他の所定の値であってもよいことが理解されよう。さらに、必要に応じて、所定の値の挿入以外に、追加の／代替の処置を呼び出すために、フラグの存在を使用することができる。例えば、ゼロ長のセグメントの存在が、予想外であって、入力データの生成におけるエラーの兆候である場合には、例外又はアボートを実行することもできる。
【００７３】
図５Ａは、一実施例によって、記述子要素の入力オペランドからマスクを生成するために、図３の記述子計算ユニット１５０内に提供されてもよい構成要素を示す。図５Ａに示されるように、ベクトル・オペランドは８つの記述子要素（記述子要素０〜７として示される）を含み、各記述子要素の符号なし３２ビット値が、対応する回路ブロック３００、３０５、３１０、３１５に入力されると仮定される。８本の並列処理レーンだとすると、各符号なし３２ビット値の下位３ビットのみが、回路３００、３０５、３１０、３１５のそれぞれの中でデコーダブロック３２５によって検査される必要がある。それらの３ビットに基づいてデコーダは、それらの下位３ビットの値によって示されるセグメントの終わりの位置を特定するために、多くても１つのビットが設定される、８ビットのマスク値を出力する。
【００７４】
加えて、残りのビット３〜３０が、それらのビットがすべて０に設定されていれば論理１の値を提供するＮＯＲゲートを通して渡される。これは具体的には、符号なし３２ビット値が０から７の範囲にあるのでデコーダからの出力が有効であり、よって現在の８本の並列処理レーン内のセグメント境界を特定することを示す。
【００７５】
ＮＯＲゲート３２０からの論理１の値の出力により、デコーダ３２５からの出力がマルチプレクサ３３０から出力される。しかし、記述子要素のビット３〜３０のいずれかがセットされていればＮＯＲゲート３２０から論理０の値が出力され、マルチプレクサ３３０はその出力として８つの論理０の値を含むデフォルトのマスクを選択する。
【００７６】
異なる回路ブロック３００、３０５、３１０、３１５によって生成されたマスクはすべて次に、セグメント化されたスキャン演算を実行するときに使用されるマスクを生成するために、ＯＲゲート３４０を使用して論理ＯＲ演算にかけられる。
【００７７】
図５Ｂは、隣接するセグメント記述子が同じ値を有する状況において任意選択でフラグを設定するために、記述子計算ユニット１５０内に提供されてもよい回路を示す。具体的に、回路はセグメント記述子の入力ベクトル・オペランド内の最初の２つの記述子を比較するように示されているが、セグメント記述子の他の隣接するペアのそれぞれについて同じ回路を繰り返すことができることが理解されよう。下位３ビットのみを比較する必要があり、対応するビットがセグメント記述子のペアから関連するＸＮＯＲゲート３５０、３５５、３６０に入力される。理解されるように、各ＸＮＯＲゲートは、その入力の両方が同一である場合にのみ論理１の値を出力する。ＸＮＯＲゲート３５０、３５５、３６０からの出力がすべて３つとも論理１であれば、これは比較対象である両方のセグメント記述子の下位３ビットが同一であることを示す。検討中である２つのセグメント記述子のために図５Ａの関連するマスク生成回路によって生成された有効要素情報が、ＸＮＯＲゲートからの出力と共にＡＮＤゲート３７０に次に入力される資格信号（qualifying signal）を生成するために、ＮＡＮＤゲート３６５を通して渡される。したがって、両方のセグメント記述子の下位３ビットが同一で、且つ、両方のセグメント記述子に対して有効な要素信号が生成されていれば、ＡＮＤゲート３７０からの出力は論理１の値になることが理解されよう。その他の場合はすべて、論理０の値になる。セグメント記述子の隣接するペアを評価するために使用された各回路からの出力は、次にＯＲゲート３７５に入力され、これらの回路のいずれかがそれぞれのＡＮＤゲート３７０から出力される論理１を得る場合、フラグが次に設定される。
【００７８】
図５Ａ及び５Ｂの実例において、繰り返しの各回の間に８本の並列処理レーンのすべてがデータ要素の処理に使用されると仮定されることに留意されたい。しかし、別の実施例では、入力ベクトルが８個より少ない有効なデータ要素を含むように、命令によって考慮されるアクティブなデータ要素の数を制限できるようにレーンごとの述語が提供されてもよい。そのような場合は、マスク及びフラグを生成するときにＯＲゲート３４０、３７５への一定の入力を無効にするために、述語情報を利用する追加の構成要素が必要になることが理解されよう。この技法は、例えば、適合アルゴリズムを扱うときにセグメント境界を（動的に）修正するために使用することができる。
【００７９】
図６は、記載される実施例のセグメント化された演算を使用してもよいアルゴリズムの実例を示す。具体的には、図６は、結果４１５が生成するために、データ要素の配列４０５にベクトル４１０が乗算される、疎行列乗算アルゴリズムを示す。具体的に、行列４０５の各行について、その行内のアクティブなデータ要素にベクトル４１０内の対応するベクトル要素が乗算され、各行に１つの結果が得るために乗算結果が次に累算される。メモリ内で、配列４０５を形成するデータは一連のデータ値４００として表現されてもよい。論理０の値は通常、（例えば、疎行列にＹａｌｅフォーマットを使用する場合、）明示的にはメモリに格納されないことに留意されたい。
【００８０】
記載される実施例のセグメント化された演算手法を使用するとき、ベクトル乗算演算はすべて、セグメント化された演算に対するデータ要素のセットとしてブロック４１５に含まれる様々な乗算結果を得るために実行される。しかしながら、この段階では、それらの結果の累算はまだ実行されていない。その代わりに、累算は、記述子計算命令及び関連するセグメント化された命令の複数の繰り返しを通して実行することができる。
【００８１】
図６に示される実例では、ベクトル処理回路は４本の並列処理レーンを備えると仮定され、よって、繰り返しの各回では４つまでのデータ要素をベクトル処理回路に入力することができる。繰り返しの各回でデータ要素がどのように消費されるかが、縦の破線がデータ要素が４つのデータ要素ブロックに分けられる様子を示し、縦の実線４２０、４２５、４３０、４３５、４４０が特定される必要があるセグメント境界を特定して、図６の下部半分に概略的に示される。これによって、繰り返しの最初の回の間では、記述子計算命令がセグメント境界４２０を特定するために実行され、次にベクトル処理回路が、最初のセグメントに対して最初の３本のレーン内のデータ要素の累算を生成するために、セグメント化された演算を実行する。次に４本目のレーン内のデータ要素が未修正のまま渡されて、次回の繰り返しへのキャリーイン・スカラー値として入力されるために、キャリーアウト・スカラー値として出力される。次の繰り返し回では、記述子計算命令を実行するとセグメント境界４２５が特定される。したがって、セグメント化された演算のこの繰り返し回の間では、２個目のセグメントの結果を生成するために、最初の繰り返し回からのキャリーアウト・スカラー値によって形成されるキャリーイン・スカラー値に１本目のレーンのデータ要素が加算される。さらに、２本目、３本目、及び４本目のレーン内のデータ要素が、３回目の繰り返しでキャリーイン・スカラー値としての使用のためのキャリーアウト・スカラー値として次に渡される結果を得るために、一緒に累算される。
【００８２】
３回目の繰り返しでは、記述子計算命令を実行すると、３つのセグメント境界４３０、４３５、４４０が特定される。そして、セグメント化された演算を実行する間、１本目のレーンのデータ要素が、３個目のセグメントの結果を生成するために、キャリーイン・スカラー値に加算され、それと別に、レーン２及び３のデータ要素が、４個目のセグメントの結果を生成するために、一緒に加算される。４本目のレーンのデータ要素は未修正のまま渡されて５個目のセグメントの結果を形成し、そして、この繰り返し回にはキャリーアウト・スカラー値はない。
【００８３】
最後に、４回目の繰り返しではアクティブなデータ要素はただ１つであり、この要素が、６個目のセグメントの結果を形成するために、未修正のままで渡される。
【００８４】
その結果、ベクトル処理回路を通した４回の繰り返しのみを使用して、参照番号４１５によって集合的に示される６つの累算結果のそれぞれが生成されていることが理解されよう。
【００８５】
図７は、繰り返しの各回について必要なマスク及びフラグ値を生成するために、パックされた記述子のセット５００が複数の繰り返しの間に使用される様子を示す。最初の繰り返し回の間に、メモリに保管されているパックされた記述子のセット５００から一連の８つのセグメント記述子を入力ベクトル・オペランド５０５にロードするために、一跨ぎロード（unit stride load）演算が実行される。次に、先行する繰り返しによって処理されたデータ要素の総数をこれらのセグメント記述子の値から減算するために、減算演算が使用される。最初の繰り返し回の間では、それ以前にデータ要素は処理されていないので、このプロセスの間に調節は行われず、その結果ベクトル・オペランド５１０はベクトル・オペランド５０５から変更されない。マスク５１５及びフラグ５２０を生成するために、次に記述子計算命令が実行される。このプロセスについては図１を参照しながら前述した。このプロセスの結果、参照番号５２５で示されるように、最初の２つのセグメント記述子「１」及び「６」が使用され、したがって、その事実を示すためにポインタが更新される。
【００８６】
したがって、２回目の繰り返しの間には、一跨ぎロードは、セット５００から、３つ目の記述子「９」から始めてさらに８つの記述子５３０をロードする。前回の繰り返しの間には８つのデータ要素はマスク５１５を使用して処理されたと仮定され、よって、修正されたオペランド５３５をもたらすように、各セグメント記述子から値８が減算される。この修正されたオペランドは次に、マスク５４０及び関連するフラグ５４５を生成するように、記述子計算命令によって使用される。図７から分かるように、最初の３つのセグメント記述子がこのプロセスの間に使用され、その結果、参照番号５５０で示されるように、これらの３つのセグメント記述子をその後の考慮の対象から除外するために、ポインタが更新される。オペランド５３０を修正されたオペランド５３５に変換するために実行される減算は、記述子計算命令が実行される前に別の命令によって実行することもできることに留意されたい。その場合は、記述子計算命令によって特定されるベクトル・レジスタは、修正されたセグメント記述子５３５を既に含む。或いは、記述子計算命令そのものが、指定されたベクトル・レジスタから入力セグメント記述子５３０を取得した後に減算を行ってもよい。
【００８７】
３回目の繰り返しで、一連のセグメント記述子５５５がベクトル・レジスタにロードされ、次にベクトル長の２倍の減算が、セグメント記述子の個々の値から１６が減算され、修正された入力ベクトル・オペランド５６０を得るために、実行される。この場合、セグメント記述子の値はそれぞれベクトル長よりも長く、したがって、マスク５６５のすべてのビットはクリアされる。フラグ５７０は論理０の値のままとなる。ベクトル処理回路は次に、３回目の繰り返しに与えられる８つのデータ要素について、これらのデータ要素のすべてが同一のセグメント内に含まれるので、全幅の演算を実行する。参照番号５７５で示されるように、セグメント記述子は使用されないので、ポインタは更新されない。
【００８８】
したがって、４回目の繰り返しでも同じ８つのセグメント記述子のセットが入力オペランド・レジスタ５８０にロードされるが、（先行する３回の繰り返しで、それぞれ８つのデータ要素を処理したので）今回は２４の値が減算される。その結果が、修正された入力ベクトル・オペランド５８５となる。その修正されたベクトル・オペランドを使用して記述子計算命令が実行されると、結果としてマスク５９０が生成される。加えて、使用されたセグメント記述子のうち２つが同じ値を有するので、フラグ５９５がセットされる。
【００８９】
すべてのデータ要素の処理されるまで、パックされた記述子の残りのそれぞれについて前述のプロセスが反復され得る。
【００９０】
図７では説明を簡単にするために、記述子は繰り返しの各回で再ロードされると仮定したが、メモリからロードを繰り返す必要を避けることもでき、その代わりに、先行する繰り返しで消費されたセグメント記述子を置き換えるために必要な追加のセグメント記述子のみをロードするように、ロード演算を修正することができる。
【００９１】
図２ではセグメント化されたスキャン演算を実行したが、別の実施例では、図８に示されるようにセグメント化された縮約演算を実行する。図８を図２と比較すると分かるように、マスクは同じ方法で生成されて使用されるが、演算の最後に、各セグメントの最上レーン内の値のみが保持される。したがって、最初のセグメントについては結果ｖ１＋ｖ０＋ｓが結果ベクトル６００の最初の要素位置６０５に保存される。同様に、結果ｖ６＋ｖ５＋ｖ４＋ｖ３＋ｖ２が２番目の要素位置６１０に保存される。最後のレーン、つまりｖ７の内容が、後続の繰り返し回での使用のために、キャリーアウト・スカラー値６１５に出力される。説明を簡単にするために、セグメント化された縮約演算はセグメント化されたスキャン演算に準じて中途の累算演算をすべて実行するとして示されているが、これらの中間計算のすべてを実行する必要はないことは理解されよう。
【００９２】
図８に示される最後のステップに従って結果を動かすとき、述語を使用して、不要な結果を含むすべてのレーンを非アクティブ化することができる。さらに、キャリー値は、最上レーンが特定セグメントの最後のレーンを表さない場合にのみ維持される。その代わり、記述子計算命令によって特定される最後のセグメントが完了した場合は、キャリー値がないことを特定するためにキャリー値が中立値に等しく設定される。
【００９３】
図９は、一実施例によって記述子計算命令内に提供されるフィールドを概略的に示す図である。オペコード７００は、命令が記述子計算命令であることを特定する。述語ソース・フィールド７０５は、一定のセグメント記述子を考慮から除外するために使用されてもよい任意選択フィールドである。ベクトル・ソース・フィールド７１０は、例えば前述の実例を使用すれば８つのセグメント記述子である、複数のセグメント記述子を含むベクトル・レジスタを特定する。述語目的地レジスタ７１５は、述語レジスタ・ファイル１５５の中の、記述子計算演算によって生成されたマスクが保存される述語レジスタを特定する。
【００９４】
図１０は、一実施例によってセグメント化された縮約命令（又は、実際にはセグメント化されたスキャン命令）内に提供されるフィールドを概略的に示す図である。オペコード７２０は命令がセグメント化された縮約（又はスキャン）命令であることを特定する。述語ソース０のフィールド７３０は、その前に実行された記述子計算命令によって生成されたマスクが保存されている述語レジスタを特定する。述語ソース１のフィールド７２５は、ベクトル処理回路内の１つ又は複数の並列処理レーンを無効化するために特定される追加の述語情報を特定することができる任意選択のフィールドである。フィールド７３５はキャリーイン・スカラー値を含むスカラー・レジスタを特定し、フィールド７４０はキャリーアウト・スカラー値が保存される目的地レジスタを特定する。一実施例では、これらの２つのレジスタは同じレジスタとして設定することができ、それによって命令内の一定のエンコーディング空間を開放することができる。
【００９５】
最後に、フィールド７４５はセグメント化された命令によって処理されるソース・データ要素を含むベクトル・ソース・レジスタを特定し、同様にフィールド７５０は結果が保存される目的地レジスタを特定する。スカラーのソース及び目的地レジスタと同様に、これらのベクトルのソース及び目的地レジスタも同じレジスタであると設定することができ、それによって命令内のエンコーディング空間を節約することができる。さらに、２つの述語ソース・フィールド７２５、７３０の内容は、セグメント化された縮約命令を発行する前に、単一の述語マスクに統合させることができる。例えば、記述子計算命令の実行によって得られるマスクは、別の述語マスクとの論理積をとって、次に述語レジスタの１つに保存される、修正されたマスクを生成してもよく、その修正されたマスクが次にセグメント化された縮約命令によって参照される。
【００９６】
図１１は、使用され得る仮想マシンへの実装を示す。前述した実施例は、関連する技法をサポートする特定の処理ハードウェアを操作するための装置及び方法に関して本発明を実装するが、ハードウェア機器の、いわゆる仮想マシン実装を提供することも可能である。これらの仮想マシン実装は、仮想マシン・プログラム８１０をサポートするホスト・オペレーティング・システム８２０を、通常、実行するホスト・プロセッサ８３０上で実行する。しばしば、妥当な速度で実行する仮想マシン実装を提供するためには大型の強力なプロセッサが必要とされるが、そのような手法も、互換性又は再利用の理由から別のプロセッサに特有のコードを実行することが要望されるときなどの一定の状況では合理的な場合もある。仮想マシン・プログラム８１０は、そのような実物のハードウェア機器によるプログラムの実行によって得られるのと同じ結果を得るように、アプリケーション・プログラム（又はオペレーティング・システム）８００を実行することができる。よって、前述した記述子計算命令及びセグメント化され阿多命令を含むプログラム命令は、仮想マシン・プログラム８１０を使用してアプリケーション・プログラム８００の中から実行されてもよい。
【００９７】
上記の考察から明らかになるように、記述子計算命令を使用することによってレーンごとの述語情報の生成が可能になり、Ｎ本の並列処理レーンを備えるベクトル処理回路内でセグメント化された演算を実行することが可能になる。特に、レーンごとの述語情報の使用を通して、ベクトル処理回路の並列処理レーンのより適切な利用が実現され、ＳＩＭＤデータ経路内で一定の演算をより効率的に実行することが可能になる。そのような手法の恩恵を得られ得る演算は多種にわたり、一実例として、様々な特定されるセグメントが、ネスティングされたループ内の所定ループの繰り返しの各回に関連するデータ要素を含むことがある、ネスティングされたループに基づくアルゴリズムがある。記載されたセグメント化された演算の手法から恩恵を得られ得るアルゴリズムの一実例として疎行列乗算について説明したが、そのようなセグメント化された演算手法を使用して、ＳＩＭＤデータ経路内で同様により効率的に実行することができるアルゴリズムが他に多くあることが理解されよう。
【００９８】
一実施例では、記述子計算命令の入力ベクトル・オペランド内のセグメント記述子はそれぞれ、ポインタ表現を使用する、すなわち個々の値がセグメントの終わりを示すが、別の手法では、セグメント記述子はそれぞれ、直前のセグメントからのオフセットに基づいて現在のセグメントの終わりが計算されるように、セグメントの長さを特定してもよい。
【００９９】
記述子計算命令によって生成された出力マスクは、専用のベクトル・マスク・レジスタに保存されてもよいし、別の実施例では、図３を参照しながら考察したように、述語レジスタ・ファイル１５５内の特定された述語レジスタに保存されてもよい。さらに別の実施例では、ベクトル・レジスタは、ベクトル・レジスタ内の各ベクトル要素がマスクのうち１つを特定するように、複数の繰り返しのためのマスクを保存するために使用されてもよい。さらに別の代替手段として、セグメント化された演算によって処理されるベクトル・オペランドの対応するデータ要素に対するマスク値（０又は１）をマスクの各ビットが表すように、各マスクを保存するためにスカラー・レジスタを使用することもできる。
【０１００】
さらに、記載された実施例では、マスク内でセグメントの終わりを特定するために論理１の値を使用した（この形式は、複数のセグメント化された命令間で値を伝播させるために特に適することが判明した）が、別の実施例では、セグメントの始まりを印すために論理１の値を使用してもよいし、１の連続（最初のセグメント）と０の連続（２番目のセグメント）、さらに１の連続（３番目のセグメント）、というように交互に使用することによって隣接するセグメントを互いに識別してもよい。
【０１０１】
上記で考察したように、フラグ値のセット及びクリアは任意選択である。記載された実施例では、フラグをセットするか判断するときに隣接するセグメント記述子を比較するが、この技法は連続するセグメント記述子の検討に限定される必要はなく、別の実施例では代わりに、フラグをセットするか判断するときに特定の入力オペランド内のすべてのセグメント記述子を互いに比較することもできる。フラグ値を保存するために専用のフラグを導入してもよいし、或いは、既存のフラグ（例えばキャリー・フラグ）を再利用することも可能としてよい。
【０１０２】
本明細書では特定の実施例について説明したが、本発明がそれらに限定されず、それらへの多くの修正及び追加が本発明の範囲内で行われてもよいことが理解されよう。例えば、本発明の範囲から逸脱することなく、下記の従属クレームの特徴の様々な組み合わせが、独立クレームの特徴とともにされてもよい。
【図１】
0006469120.tif 000002
【図２】
0006469120.tif 000003
【図３】
0006469120.tif 000004
【図４Ａ】
0006469120.tif 000005
【図４Ｂ】
0006469120.tif 000006
【図５Ａ】
0006469120.tif 000007
【図５Ｂ】
0006469120.tif 000008
【図６】
0006469120.tif 000009
【図７】
0006469120.tif 000010
【図８】
0006469120.tif 000011
【図９】
0006469120.tif 000012
【図１０】
0006469120.tif 000013
【図１１】
0006469120.tif 000014