(57)【特許請求の範囲】
【請求項１】
複数の配列要素を含むベクトルレジスタファイルと、
各々が前記配列要素に格納されたデータに対して演算処理を行う複数のパイプライン演算器を有する複数の実行ユニットと、
命令を発行し、前記命令に基づいて前記ベクトルレジスタファイル及び前記実行ユニットの動作を制御することにより、パイプライン処理を制御する命令発行制御回路と、を備え、
前記命令発行制御回路は、１系列のデータの個数を規定するベクトル長を記憶するベクトル長レジスタを備え、前記ベクトル長で規定された前記１系列のデータを処理するように１つまたは前記複数の実行ユニットに命令をそれぞれ発行するベクトルプロセッサであって、
２つ以上の前記実行ユニットは、基本ビット幅のデータを処理する複数の基本パイプライン演算器を備え、前記複数の基本パイプライン演算器は、ｘ（２≦ｘ≦Ｘ、Ｘ：２のべき）個の前記基本パイプライン演算器を組合せて、前記基本ビット幅のｘ倍のビット幅のデータを処理可能であり、
前記命令発行制御回路は、前記基本ビット幅のｘ倍のビット幅の１系列のデータの処理を実行する場合に、１系列のデータの処理をｘ個の前記実行ユニットで実行するための命令を発行することが可能である、
ことを特徴とするベクトルプロセッサ。
【請求項２】
前記命令発行制御回路は、１系列のデータを処理するための先行する命令に対する、１系列のデータを処理するための後続の命令のペナルティ値に基づいて、１系列のデータを処理するための後続の命令を発行するかストールさせるかを制御するものである、請求項１記載のベクトルプロセッサ。
【請求項３】
前記ベクトルプロセッサは、ｍ（ｍ：２のべき）個の実行ユニットを有し、
各実行ユニットは、ｎ（ｎ：２のべき）個の基本パイプライン演算器を有し、
前記ベクトル長は、ＶＬ（ＶＬ：２のべき）であり、
前記基本ビット幅は、ｗ（ｗ：２のべき）であり、
Ｘは、ｍおよびｎ以下であり、
前記基本ビット幅ｗの処理を行うための命令に関しては、１つの前記実行ユニットを使用して、ＶＬ／ｎサイクル＋命令固有のペナルティで、処理が実行され、
前記基本ビット幅ｗのｘ倍のビット幅の処理を行うための命令に関しては、ｎ個の隣接するデータが同じ副系列に属するように、かつ、ｎ個のデータ毎に異なる副系列に属するように、１系列のデータがｘ個の副系列のデータに分割された上で、ｘ個の副系列のデータは、ｘ個の前記実行ユニットを使用して、ＶＬ／ｎサイクル＋命令固有のペナルティで、処理が実行されることが可能である、請求項１または２記載のベクトルプロセッサ。
【請求項４】
前記ベクトルプロセッサは、前記複数の実行ユニットに対応して設けられ、各実行ユニットで処理するデータを保持する複数のパイプラインレジスタを備え、
前記命令発行制御回路は、前記１系列のデータを、ｘ個の前記実行ユニットに対応して設けられたｘ個の前記パイプラインレジスタに格納するための命令を発行することが可能である、請求項１から３のいずれか１項記載のベクトルプロセッサ。
【請求項５】
前記ベクトルプロセッサは、前記複数の実行ユニットの処理結果を、前記ベクトルレジスタファイルを介さずに、前記複数のパイプラインレジスタに直接書き込むバイパス回路を備える請求項４記載のベクトルプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施例の一側面において開示する技術は、ベクトルプロセッサに関する。
【背景技術】
【０００２】
データの演算処理を行う回路として、ベクトルプロセッサが知られている。ベクトルプロセッサは、一般にスーパーコンピュータにおいて用いられており、ベクトルレジスタファイルの配列要素に格納された配列型のデータを扱う。
【０００３】
ベクトルプロセッサは、指定された個数（ベクトル長：ＶＬ（Ｖｅｃｔｏｒ  Ｌｅｎｇｔｈ））の演算を１命令で実行する。ベクトルプロセッサは、複数（ｎ）個のパイプライン演算器を有する実行ユニットを持ち、ＶＬ個のデータをｎ個ずつ（ＶＬ／ｎ）サイクルに分割して演算を行なう。実行ユニットを複数設けて並列実行することで性能を向上させる。さらに、ベクトルプロセッサが実行する一連の命令の間にはデータの依存関係があることが多く、実行ユニット間でデータをパイパスして先行命令の演算結果を後続命令に渡すことで、レジスタへの書き込みに対する待ちを発生させずに効率良く演算を行なう。また、演算リソースやメモリバンド幅の問題から、乗算やロード・ストアを実行できる実行ユニットは限定されており、非対称であることが多い。
【０００４】
スーパーコンピュータ向けのベクトルプロセッサでは、ベクトルプロセッサが扱う最大のデータ語長（例えば、６４ビット）を基本単位として配列要素のサイズが割り当てられている。データ語長の長さが半分の場合（例えば、３２ビット）には、各配列要素において前半の３２ビットのみを使用し、後半の３２ビットは不使用とする方法が採用されている。
【０００５】
従来、ベクトルプロセッサは、スーパーコンピュータのようなハイパフォーマンスコンピューティングの分野において使用されてきた。しかし、近年、ベクトルプロセッサを無線ベースバンド処理のような信号処理系アプリケーションの分野に応用することが検討されている。この場合、ベクトルプロセッサは、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）のような組み込み機器向けのプロセッサにおいて使用されることが想定される。
【０００６】
組み込みシステムでは、メモリサイズや処理量削減のために、データ語長を節約して１６ビット演算を行なうことが多いが、精度が必要なところでは３２ビット演算を行なう。そのため、上記の無線ベースバンド処理のような分野で使用されるベクトルプロセッサでは、データ語長が１６ビットであるハーフワード（Ｈａｌｆｗｏｒｄ）命令とデータ語長が３２ビットであるワード（Ｗｏｒｄ）命令のように、データ語長が異なる命令をプログラム中に混在させて使用するケースが頻繁に発生する。
【０００７】
先行命令と後続命令との間でデータ語長が異なる場合であっても、レジスタ干渉の有無を判定する必要がある。そこで、スーパーコンピュータ向けのベクトルプロセッサと同様に、データ語長の異なる命令が混在する場合であっても、常に同じサイズの配列要素をアクセス単位としてベクトルレジスタファイルへのアクセスを行うことが考えられる。しかしながら、半分のサイズのデータ語長の命令（ハーフワード命令）を実行する場合、各配列要素の後半部分が使用されないため、実質的にベクトルレジスタファイルの半分の領域が使用されず、レジスタの使用に大きな無駄を生じる。このことは、限られた容量のレジスタしか搭載することができず、ベクトルレジスタファイルの全体の容量を十分に大きくすることが困難な、組み込み機器向けプロセッサにおいては大きな問題となる。
【０００８】
一方、データ語長の異なる命令が混在する場合には、レジスタ干渉の有無に関わらず無条件で、先行命令の処理が終了するまで後続命令をストールさせるように、後続命令の実行を遅延させることにより、レジスタ干渉が生じる危険を回避することも考えられる。
【０００９】
しかしながら、この場合、各パイプライン演算器において実質的にパイプライン処理が並行して実行されないことになるので、ベクトル処理回路の利点を活かすことができず、命令実行の効率が極めて悪くなる。このことは、限られた処理能力の演算器しか搭載することができず、パイプライン演算器の処理能力を十分に大きくすることが困難な、組み込み機器向けプロセッサにおいては大きな問題となる。
【００１０】
さらに、組み込みシステム用ベクトルプロセッサでは、回路規模を削減するために、３２ビット演算は、２個の１６ビット演算器を使って実行することにより、１６ビットと３２ビットの演算器を共有して実現することが行われる。
【００１１】
１６ビットと３２ビットの演算器を共有するベクトルプロセッサでは、３２ビット演算を行なう場合は１６ビット演算と比較して、１サイクルで１／２のデータの処理しか行なえない。そのため、１命令の３２ビット演算に要するサイクル数は、１６ビット演算の２倍（２×ＶＬ／ｎ）となる。
【００１２】
一連の命令を実行する場合に、１６ビット演算を完了するのに要するサイクル数と３２ビット演算を完了するのに要するサイクル数に違いがあると、１６ビット演算と３２ビット演算の間でのデータのバイパスには待ちが発生するため、性能が上がらないという問題が生じる。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開平１０−１１０６８６号公報
【特許文献２】特開平１０−１２４３１３号公報
【特許文献３】特公平０７−８６８３８号公報
【特許文献４】特開昭６１−５２７４０号公報
【特許文献５】特開２０００−２２７８５８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１４】
従って、本実施例の一側面におけるベクトルプロセッサは、プログラム中にデータ語長が異なる命令が混在する場合であっても、パイプライン処理の乱れを抑制し、待ち時間を削減して、処理時間を短縮することを目的とする。
【課題を解決するための手段】
【００１５】
本実施例に係るベクトルプロセッサは、複数の配列要素を含むベクトルレジスタファイルと、各々が配列要素に格納されたデータに対して演算処理を行う複数のパイプライン演算器を有する複数の実行ユニットと、命令を発行し、命令に基づいてベクトルレジスタファイル及び実行ユニットの動作を制御することにより、パイプライン処理を制御する命令発行制御回路と、を有し、命令発行制御回路は、１系列のデータの個数を規定するベクトル長を記憶するベクトル長レジスタを有し、ベクトル長で規定された１系列のデータを処理するように複数の実行ユニットに命令をそれぞれ発行するベクトルプロセッサであって、２つ以上の実行ユニットは、基本ビット幅のデータを処理する複数の基本パイプライン演算器を備え、複数の基本パイプライン演算器は、ｘ（ｘ≦Ｘ、ｘ：２のべき、Ｘ：２のべき）個の基本パイプライン演算器を組合せて、基本ビット幅のｘ倍のビット幅のデータを処理可能であり、命令発行制御回路は、基本ビット幅のｘ倍のビット幅の１系列のデータの処理を実行する場合に、１系列のデータの処理をｘ個の実行ユニットで実行することが適切であるか判定し、適切であると判定した時に、１系列のデータの処理をｘ個の実行ユニットで実行する命令を発行する。
【発明の効果】
【００１６】
本実施例に係るベクトルプロセッサでは、基本ビット幅のｘ倍のビット幅のデータの処理を実行する場合に、ｘ個の実行ユニットで実行することで、基本ビット幅のデータの処理を１個の実行ユニットで実行する場合と同じ処理時間になる。これにより、データ語長が異なる命令が混在する場合であっても、パイプライン処理の乱れを抑制できる。これにより、待ち時間を削減して、処理時間を短縮できる。
【図面の簡単な説明】
【００１７】
【図１】図１は、ベクトルプロセッサの基本的な構成例を示す図である。
【図２】図２は、ベクトルプロセッサのパイプライン処理を説明するための図である。
【図３】図３は、ベクトルレジスタファイルの構成例を示す図である。
【図４】図４は、実施形態のベクトルプロセッサの概略構成およびパイプラインステージを示す図である。
【図５】図５は、実行ユニットにおいて、１６ビット演算器を２個組み合わせて３２ビット演算器を実現する場合を説明する図である。
【図６】図６はベクトルレジスタファイルの構成例を示す図である。
【図７】図７は、命令発行制御回路が４つの実行ユニットに対して発行する命令構成と、スロット制御信号の信号構成を示す図である。
【図８】図８は、実施形態のペクトルプロセッサを動作させるためのプログラムの例を示し、（Ａ）はオリジナルＣ言語で記載したプログラムを、（Ｂ）はベクトル化Ｃ言語で記載したプログラムを示す。
【図９】図９は、３２ビット命令を１つの実行ユニットで処理した場合の処理シーケンスを示す図である。
【図１０】図１０は、図９の処理シーケンスを行う場合の命令発行制御回路における命令発行処理を示すフローチャートである。
【図１１】図１１は、実施形態のベクトルプロセッサで、図８のプログラム処理した場合の処理シーケンスを示す図である。
【図１２】図１２は、図１１の処理シーケンスを行う場合の命令発行制御回路における命令発行処理を示すフローチャートである。
【図１３】図１３は、図１１の処理シーケンスにおけるバイパス回路の動作を説明する図である。
【図１４】図１４は、実施形態のベクトルプロセッサに６個の実行ユニットを設けて、図８のプログラム処理した場合の処理シーケンスを示す図である。
【発明を実施するための形態】
【００１８】
実施形態を説明する前に、スーパーコンピュータ向け等の一般的なベクトルプロセッサの基本的な構成および動作を説明する。ここでは説明を簡単にするため、ベクトルプロセッサが、４個の実行ユニットを有し、各実行ユニットの算術論理演算ユニットが８個のパイプライン演算器を有する例を説明する。
【００１９】
図１は、ベクトルプロセッサ２００の基本的な構成例を示す図である。図１に示したように、ベクトルプロセッサ２００は、ベクトルレジスタファイル２０１と、命令発行制御回路２０２と、４つの実行ユニット２０３〜２０６及び命令バッファ２０７と、を含み、後述する複数のパイプラインステージに従ってパイプライン処理を実行する。
【００２０】
命令バッファ２０７は、ベクトルプロセッサ２００が実行する命令を格納する。命令発行制御回路２０２は、命令バッファ２０７に接続され、命令バッファ２０７から命令を受けとる。命令発行制御回路２０２は、受けとった命令に基づいてベクトルレジスタファイル２０１及び実行ユニット２０３〜２０６の動作を制御する。命令発行制御回路２０２は、受けとった命令（後続命令）と、すでに実行中の命令（先行命令）との間でレジスタ干渉の有無を判定し、判定結果に応じて後続命令の発行タイミングを調整する。また、命令発行制御回路２０２は、ベクトル長（ＶＬ）を指定するＶＬレジスタ２１０を含む。
【００２１】
ベクトルレジスタファイル２０１は、４つの実行ユニット２０３〜２０６が処理するデータを格納する。ベクトルレジスタファイル２０１は、命令発行制御回路２０２の制御の下、各実行ユニット２０３〜２０６に処理すべきデータを供給する。ベクトルレジスタファイル２０１の詳細については後述する。
【００２２】
ベクトルレジスタファイル２０１と各実行ユニット２０３〜２０６の間には、各実行ユニットが処理するデータを格納する各パイプラインレジスタ２０８が設けられる。各パイプラインレジスタ２０８は、ベクトルレジスタファイル２０１から、対応する実行ユニットが処理するデータを受けとる。
【００２３】
各実行ユニット２０３〜２０６は、算術論理演算ユニットＡＬＵ２１１を含み、各ＡＬＵ２１１は８個のパイプライン演算器を含む。各パイプライン演算器は対応するパイプラインレジスタ２０８と接続され、パイプラインレジスタ２０８から処理すべきデータの供給を受け、命令発行制御回路２０２の制御の下、所望の演算を実行する。ここで、各パイプライン演算器は、同時に１６ビットのデータを演算することが可能な１６ビット演算器である。このため、１つのＡＬＵは１サイクルで、１６ビットのデータであれば８個のデータを処理することができる。また、後述するように、１６ビット演算器を２個組み合わせて３２ビット演算器を形成可能であり、３２ビットのデータであれば４個のデータを処理することができる。
【００２４】
各実行ユニット２０３〜２０６は、ＡＬＵ２１１の演算結果を格納するパイプラインレジスタ２０９を含む。パイプラインレジスタ２０９は、ベクトルレジスタファイル２０１を接続されている。各実行ユニット２０３〜２０６は、パイプラインレジスタ２０９を介して、その演算結果をベクトルレジスタファイル２０１に書き戻すことができる。
【００２５】
図２は、ベクトルプロセッサ２００のパイプライン処理を説明するための図である。図２において、ＩＦは命令フェッチ（Ｉｎｓｔｒｕｃｔｉｏｎ  Ｆｅｔｃｈ）を、ＩＤは命令デコード（Ｉｎｓｔｒｕｃｔｉｏｎ  Ｄｅｃｏｄｅ）を、ＲＲはレジスタロード（Ｒｅｇｉｓｔｅｒ  Ｒｅａｄ）を、ＥＸは命令実行（Ｅｘｅｃｕｔｉｏｎ）を、ＷＢは書き戻し（Ｗｒｉｔｅ  Ｂａｃｋ）を表す。すなわち、ベクトルプロセッサ２００のパイプライン処理はＩＦ、ＩＤ、ＲＲ、ＥＸ及びＷＢからなる５段のパイプラインステージを有する。５段のパイプラインステージは連続する５つのサイクルにおいて順番に実行される。
【００２６】
まず、ＩＦステージにおいて、命令バッファ２０７は、ベクトルプロセッサ２００の外部に設けられた命令メモリ（不図示）から、処理すべき命令を受け取る。ここで、命令は、実行ユニット２０３〜２０６が処理する演算の内容を示す命令コードと、演算の対象となる配列データが格納された配列レジスタの論理番号を示すソース情報と、演算結果を格納すべき配列レジスタの論理番号を示すディスティネーション情報を含む。
【００２７】
次に、ＩＤステージにおいて、命令発行制御回路２０２は命令バッファ２０７から命令を受けとり、受けとった命令をデコードする。
【００２８】
次に、ＲＲステージにおいて、命令発行制御回路２０２は、命令デコードの結果得られたソース情報に基づいて、ベクトルレジスタファイル２０１に対して、読み出し対象となる配列データが格納された配列レジスタの論理番号を指定する。ベクトルレジスタファイル２０１は、命令発行制御回路２０２の制御の下、指定された論理番号に対応する配列レジスタにおいて所望の配列要素を選択し、選択した配列要素のデータを、命令が実行されるパイプライン演算器に対応するパイプラインレジスタ２０８に格納する。
【００２９】
次に、ＥＸステージにおいて、各実行ユニット２０３〜２０６に含まれるＡＬＵ２１１は、命令発行制御回路２０２の制御の下、パイプラインレジスタ２０８に格納されたデータに対して、デコードの結果得られた命令コードに応じた演算を実行する。各実行ユニット２０３〜２０６の演算結果は、対応するパイプラインレジスタ２０９に格納される。
【００３０】
次に、ＷＢステージにおいて、各実行ユニット２０３〜２０６は、パイプラインレジスタ２０９に格納された演算結果のデータをベクトルレジスタファイル２０１に書き戻す。このとき、命令発行制御回路２０２は、命令デコードの結果得られたディスティネーション情報に基づいて、ベクトルレジスタファイル２０１に対して、書き込み対象となる配列レジスタの論理番号を指定する。パイプラインレジスタ２０８に格納された演算結果のデータは、ベクトルレジスタファイル２０１において、指定された論理番号に対応する配列レジスタに順次格納される。
【００３１】
ベクトルプロセッサ２００は４つの実行ユニット２０３〜２０６を有するので、上述の５段のパイプラインステージを有するパイプライン処理を実行ユニット２０３〜２０６の各々において並行して実行することができる。すなわち、ベクトルプロセッサ２００は４つの実行パイプラインを有する。
【００３２】
尚、上述のパイプライン処理では５段のパイプラインステージを用いたが、パイプライン処理のステージ構成はこれに限定されない。例えば、ＥＸステージとＷＢステージの間に、ベクトルプロセッサ２００の外部メモリ（不図示）に対するデータの読み出しや書き込みを行う、メモリアクセスＭＡ（Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）ステージを設けてもよい。ＭＡステージを設けた場合には、ＭＡステージの処理結果のデータを格納するためのパイプラインレジスタが追加で設けられる。
【００３３】
次に、ベクトルレジスタファイル２０１について説明する。
【００３４】
図３はベクトルレジスタファイル２０１の構成例を示す図である。図３に示したベクトルレジスタファイル２０１は、１ダブルワード（ｄｏｕｂｌｅｗｏｒｄ）×２５６エントリの構成を有し、ベクトル長は１６である（ＶＬ＝１６）。
【００３５】
図３に示した例では、１つの配列要素３０２はそれぞれ６４ビットのデータを格納する。１６個の配列要素３０２により１つの配列レジスタ３０３が構成され、ベクトルレジスタファイル２０１は１６個の配列レジスタ３０３により構成されている。各配列レジスタ３０３には配列データ３０４が格納されている。各配列要素には物理番号（０〜２５５）が割り当てられており、各配列レジスタには論理番号（０〜１５）が割り当てられている。ベクトルレジスタファイル２０１に対するアクセスは、配列レジスタの論理番号を指定することにより行われるが、更に、指定された論理番号とベクトル長に基づいて、配列要素の物理番号を生成することにより行なわれる。
【００３６】
また、図３の構成例では、ベクトルプロセッサ２００が扱う最大のデータ語長（例えば、６４ビット）を基本単位として配列要素のサイズが割り当てられている。データ語長の長さが半分の場合（例えば、３２ビット）には、各配列要素において前半の３２ビットのみを使用し、後半の３２ビットは不使用とする方法が採用されている。図３に示したように、例えば、ベクトルプロセッサが倍精度処理型の命令を扱う場合には、データ語長は６４ビットであり、例えば、各配列要素において６４ビット全てを使用する。一方、単精度処理型の命令を扱う場合には、データ語長は３２ビットであるため、各配列要素において前半の３２ビットのみを使用する。この場合、実質的にベクトルレジスタファイルの半分の領域が使用されず、レジスタの使用に大きな無駄を生じる。
【００３７】
ところで、ベクトル処理回路においては、命令発行時に、先行命令と後続命令の間でレジスタ干渉の有無が判定される、これは、先行命令で指定された配列レジスタと、後続命令で指定された配列レジスタとが重複する場合、先行命令における処理結果（配列データ）を適切に後続命令における処理に反映させるために、相互の命令の発行タイミングを適切に調整する必要があるからである。
【００３８】
通常、各パイプライン演算器で処理される配列データは対応する配列レジスタを構成する先頭の配列要素の物理番号（または、論理番号）のみで区別することができる。配列データは同一の数の配列要素で構成され、１つの命令に対して、対応する配列レジスタを構成する複数の配列要素が一体として処理されるためである。例えば、図３に示したベクトルレジスタファイル２０１においては、各配列レジスタ（論理番号０〜１５）の配列データの区別は、各配列レジスタの先頭の配列要素の物理番号（０，１６，３２，・・・，２４０）により可能である。
【００３９】
このため、先行命令と後続命令の間でレジスタ干渉の有無を判定するときには、先行命令で指定された配列レジスタの先頭の配列要素の物理番号と、後続命令で指定された配列レジスタの先頭の配列要素の物理番号を比較するのが一般的である。
【００４０】
また、先行命令と後続命令の間でレジスタ干渉が検出された場合、先行命令における処理結果がレジスタファイルに書き込まれるまで一定のサイクルだけ遅延させてから後続命令を実行させる技術が知られている。
【００４１】
以上、一般的なベクトルプロセッサの基本的な構成および動作を説明したが、以下に説明する実施形態のベクトルプロセッサは、説明しない要素については、一般的なベクトルプロセッサの構成および動作を使用して実現されるものとする。
【００４２】
図４は、実施形態のベクトルプロセッサ４００の概略構成およびパイプラインステージを示す図である。
【００４３】
図４に示すように、ベクトルプロセッサ４００は、ベクトルレジスタファイル４０１と、命令発行制御回路４０２と、４つの実行ユニット４０３〜４０６と、命令バッファ４０７と、４つのパイプラインレジスタ４０８と、バイパス回路４１２と、を含む。ベクトルプロセッサ４００は、図示したパイプラインステージＩＦ、ＩＤ、ＲＲ、ＥＸ、ＭＡおよびＷＢに従ってパイプライン処理を実行する。ベクトルレジスタファイル４０１、４つの実行ユニット４０３〜４０６、４つのパイプラインレジスタ４０８およびバイパス回路４１２は、データパスＤＰを形成する。なお、図示していないが、命令発行制御回路４０２は、ベクトル長（ＶＬ）を指定するＶＬレジスタを含む。
【００４４】
ベクトルプロセッサ４００は、図１および図２に示した一般的なベクトルプロセッサ２００で、バイパス４１２をさらに設け、パイプラインステージにメモリアクセスを行うステージＭＡを増加させている。ベクトルレジスタファイル４０１、命令発行制御回路４０２、４つの実行ユニット４０３〜４０６、命令バッファ４０７および４つのパイプラインレジスタ４０８の基本的な構成および動作は、図１および図２で説明した一般的なベクトルプロセッサ２００の要素と同じであり、異なる事項について説明する。
【００４５】
ベクトルプロセッサ４００は、図示のように、４つの実行ユニット４０３〜４０６を有する。実行ユニット４０３〜４０６を、ＶＳ０、ＶＳ１、ＶＳ２およびＶＳ３で表す。各実行ユニットは、８個のパイプライン演算器を有する。ＶＳ０およびＶＳ１の算術論理演算ユニットＡＬＵ２１１Ａは、ロード・ストア処理および算術演算処理を実行可能な８個のパイプライン演算器を有する。ＶＳ２およびＶＳ３の算術論理演算ユニットＡＬＵ２１１Ｂは、８個の算術演算命令専用のパイプライン演算器を有する。算術演算のうち乗算処理は実行ユニットＶＳ２およびＶＳ３でのみ実行され、ロード・ストア処理は実行ユニットＶＳ０およびＶＳ１でのみ実行されるものとする。ベクトルプロセッサ４００が処理するデータの基本ビット幅は１６ビットであり、基本ビット幅の２倍の３２ビット処理が混在したデータを処理する。ベクトル長ＶＬは６４であるとする。
【００４６】
上述のように、メモリアクセスを行うステージＭＡを増加させているため、ＡＬＵ２１１Ａおよび２１１Ｂの出力する演算結果を格納するためのパイプラインレジスタ４１３が設けられる。さらに、ＶＳ０およびＶＳ１では、パイプラインレジスタ４１３と４０９の間にメモリアクセスのためのメモリアクセス回路４１４が設けられる。
【００４７】
バイパス回路４１２は、ＡＬＵ４１１Ａおよび４１１Ｂ、パイプラインレジスタ４１３およびパイプラインレジスタ４０９の出力する演算結果を、ベクトルレジスタファイル４０１に書き戻さずに、直接パイプラインレジスタ４０８に書き込む。これにより、先行命令の演算結果を後続命令に渡す場合に、レジスタへの書き込みに対する待ちの発生をなくすことができ、効率よく演算を行うことができる。
【００４８】
図５は、各実行ユニットのＡＬＵにおけるパイプライン演算器の構成を示す図である。
【００４９】
図５に示すように、各実行ユニットのＡＬＵは、８個の１６ビット演算器５０１を有しており、隣接する２個の１６ビット演算器５０１は、組み合わせて３２ビット演算器５０２として動作可能である。言い換えれば、各実行ユニットのＡＬＵは、８個の１６ビット演算器５０１を有する状態と、４個の３２ビット演算器５０２を有する状態と、の間で動作状態を切替可能である。
【００５０】
図６はベクトルレジスタファイル４０１の構成例を示す図である。
【００５１】
上述のように、無線ベースバンド処理のような分野にベクトル処理回路を応用する場合、例えば、データ語長が１６ビットであるハーフワード命令とデータ語長が３２ビットであるワード（Ｗｏｒｄ）命令のように、先行命令と後続命令の間でデータ語長が異なる命令が混在するケースが頻繁に発生する。
【００５２】
そこで、ベクトルレジスタファイル４０１においては、ハーフワード命令時の論理番号及び物理番号の割り当てが定められるとともに、ワード命令時の論理番号及び物理番号の割り当てが定められている。
【００５３】
まず、ハーフワード命令時の論理番号及び物理番号の割り当ての一例を、図６を用いて説明する。これらの論理番号及び物理番号の割り当ては命令発行制御回路４０２によって管理される。
【００５４】
図６に示したベクトルレジスタファイル４０１は、例えば、１ハーフワード（Ｈａｌｆｗｏｒｄ）×１０２４エントリの構成を有し、ベクトル長は６４である（ＶＬ＝６４）。
【００５５】
図６に示した例では、１つの配列要素６０２はそれぞれ１６ビットのデータを格納する。６４個の配列要素３０２により１つの配列レジスタ６０３が構成され、ベクトルレジスタファイル４０１は１６個の配列レジスタ６０３により構成されている。各配列レジスタ６０３には配列データ６０４が格納されている。
【００５６】
命令発行制御回路４０２は各配列要素６０２に物理番号０〜１０２３を割り当て、各配列レジスタ６０３に論理番号０〜１５を割り当てる。ベクトルレジスタファイル４０１に対するアクセスは、配列レジスタ６０３の論理番号を指定することにより行われるが、更に、指定された論理番号及びベクトル長に基づいて、命令発行制御回路４０２が配列要素６０２の物理番号を生成することにより行われる。
【００５７】
尚、図６に示した例では、各実行ユニット（ＶＳ０、ＶＳ１、ＶＳ２、ＶＳ３）４０３〜４０６は、１サイクルで８つの配列要素６０２のデータを演算する。上述のとおり、各実行ユニット４０３〜４０６のＡＬＵ４１１Ａおよび４１１Ｂは、１サイクルで８個の１６ビットデータを処理することができるから、１つの配列データ６０４の全ての部分データに対する演算処理を実行するためには、８（＝６４／８）サイクルが必要である。各実行ユニット４０３〜４０６のＡＬＵ４１１Ａおよび４１１Ｂは、１つの配列データ６０４に対して、物理番号の小さいものから８個ずつ分けられた配列要素６０２からなる８個の部分データを、８サイクルに分けて順番に演算していく。
【００５８】
次に、ワード命令時の論理番号及び物理番号の割り当ての一例を、図６を用いて説明する。これらの論理番号及び物理番号の割り当ては命令発行制御回路４０２によって管理される。
【００５９】
ワード命令時の配列レジスタの構成と対応する論理番号の割り当ては、ハーフワード命令時の配列レジスタの構成と対応する論理番号の割り当てとは異なるが、それらを利用したものとなっている。
【００６０】
ワード命令時においては、命令発行制御回路４０２は、ハーフワード命令に対して割り当てられた物理番号に関して、偶数の物理番号Ａを有するものと、奇数の物理番号Ａ＋１を有するものからなる、隣接する２つの配列要素６０２を、１つの配列要素６０５として扱う。
【００６１】
また、命令発行制御回路４０２は、ハーフワード命令に対して割り当てられた論理番号に関して、偶数の論理番号Ｎを有するものと、奇数の論理番号Ｎ＋１を有するものからなる、隣接する２つの配列レジスタ６０３を１つの配列レジスタ６０６として扱う。各配列レジスタ６０６には配列データ６０７が格納されている。
【００６２】
命令発行制御回路４０２は、各配列要素６０５に、対応する２つの配列要素６０２のうちの偶数の物理番号を有する配列要素６０２と同一の物理番号を割り当て、偶数のみの物理番号０，２，４，・・・，１０２０，１０２２を割り当てる。命令発行制御回路４０２は、各配列レジスタ６０６に、対応する２つの配列レジスタ６０３のうちの偶数の論理番号を有する配列レジスタ６０３と同一の論理番号を割り当て、偶数のみの論理番号０，２，４，・・・，１２，１４を割り当てる。ベクトルレジスタファイル４０１に対するアクセスは、配列レジスタ６０６の論理番号を指定することにより行われるが、更に、指定された論理番号とベクトル長に基づいて、命令発行制御回路４０２が配列要素６０５の物理番号を生成することにより行われる。
【００６３】
すなわち、ベクトルレジスタファイル４０１においては、データ語長が異なる命令が混在する場合、短い方のデータ語長に合わせて、配列要素及び配列レジスタのサイズや構成を定めておき、長い方のデータ語長に対しては、長い方のデータ語長と短い方のデータ語長の長さの比率に応じて、短い方のデータ語長に対して定められた配列要素及び配列レジスタを複数個組合わせて、仮想的に１つの配列要素及び配列レジスタとして取り扱う方法を採用する。
【００６４】
これにより、ベクトルレジスタファイル４０１においては、データ語長が異なる命令が混在する場合であっても、各データ語長に合わせて配列要素及び配列レジスタの割り当てを最適化することができるので、ベクトルレジスタファイルにおいて使用されない配列要素のビットをなくすことができる。
【００６５】
従って、実施形態に係るベクトルレジスタファイル４０１においては、データ語長が異なる命令が混在する場合であって、ベクトルレジスタファイル４０１が限られたレジスタ容量しか持たない場合であっても、これを無駄なく使用しながら、データ語長が異なる命令を適切に処理することができる。
【００６６】
尚、図６に示した例では、各実行ユニットは１サイクルで４つの配列要素６０５のデータを演算する。上述のとおり、各実行ユニット４０３〜４０６のＡＬＵ４１１Ａおよび４１１Ｂは１サイクルで４個の３２ビットのデータを処理することができるからである。１つの配列レジスタ６０６が６４個の配列要素６０５により構成されることから、１つの配列データ６０７の全ての部分データに対する演算処理を実行するためには、１６（＝６４／４）サイクルが必要である。各実行ユニット４０３〜４０６のＡＬＵ４１１Ａおよび４１１Ｂは１つの配列データ６０７に対して、物理番号の小さいものから４個ずつ分けられた配列要素６０５からなる６４個の部分データを、１６サイクルに分けて順番に演算していく。
【００６７】
図４に示すように、命令発行制御回路４０２は、ＩＤステージで命令を発行する命令発行部４１１を有し、ＲＲ、ＥＸ、ＭＡおよびＷＢの各ステージで、データパスＤＰの各部を制御するスロット制御信号を出力する。
【００６８】
図７は、命令発行制御回路４０２が４つの実行ユニット（ＶＳ０、ＶＳ１、ＶＳ２、ＶＳ３）４０３〜４０６に対して発行する命令構成と、スロット制御信号の信号構成を示す図である。
【００６９】
命令発行部４１１は、命令バッファ４０７から受けとった命令に基づいて、ＶＳ０、ＶＳ１、ＶＳ２、ＶＳ３の動作を制御する信号を発行する。この信号は、発行する命令、処理対象のデータ系列を含み、ＶＳ０、ＶＳ１、ＶＳ２、ＶＳ３ごとに出力される。
【００７０】
ＲＲ、ＥＸ、ＭＡおよびＷＢの各ステージで命令発行制御回路４０２が出力するスロット制御信号は、制御信号およびオペランドを指定するオペランド指定データが含まれる。
【００７１】
以下、実施形態のペクトルプロセッサの動作を、具体的な処理を行う場合を例として説明する。
【００７２】
図８は、実施形態のペクトルプロセッサを動作させるためのプログラムの例を示し、（Ａ）はオリジナルＣ言語で記載したプログラムを、（Ｂ）はベクトル化Ｃ言語で記載したプログラムを示す。
【００７３】
図８（Ａ）の繰り返し部分の処理は、図８（Ｂ）では、データロード命令ｖｌｄ３２、即値命令ａｄｄｉ、変換命令ｖｃｕｔ１６、ストア命令ｖｓｔ１６、およびインクリメント命令ａｄｄｉで表される。ｖｌｄ３２は、３２ビットのデータロード命令で、レジスタｖｓｒ１のアドレスから３２ビットデータをＶＬ個読み出してｖｒ０レジスタに格納する命令である。ａｄｄｉは、スカラレジスタに対する即値加算命令で、ｖｓｒ１レジスタに２５６を加算してｖｓｒ１に格納する命令である。ｖｃｕｔ１６は、３２ビットのデータを１６ビットのデータに変換する命令で、ｖｒ０レジスタに格納されているＶＬ個の３２ビットデータをＶＬ個の１６ビットデータに変換し、ｖｒ２レジスタに格納する命令である。ｖｓｔ１６は、ｖｒ３レジスタの値をｖｓｒ３レジスタのアドレスに１６ビットでストアする命令である。ａｄｄｉは、ストアアドレスを１２８インクリメントする命令である。
【００７４】
実施形態のベクトルプロセッサでは、図８のプログラムを実行する場合に、ｖｌｄ３２命令およびｖｃｕｔ１６命令をそれぞれ２つの実行ユニットを利用して８サイクルで処理する。実施形態のベクトルプロセッサの動作を説明する前に、ｖｌｄ３２命令およびｖｃｕｔ１６命令をそれぞれ１つの実行ユニットで処理した場合の動作を説明する。
【００７５】
図９は、ｖｌｄ３２命令およびｖｃｕｔ１６命令をそれぞれ１つの実行ユニットで処理した場合の処理シーケンスを示す図であり、繰り返しループの２回目のループの途中までを表現している。
【００７６】
最初のｖｌｄ３２命令は、３２ビット命令のため、ＶＳ０で、パイプライン演算器を２個組み合わせた３２ビット演算器を４個利用し、４つずつデータを処理する。ｖｌｄ３２命令は、１サイクル目から開始され、６４個のデータの読み出しに１６サイクルを必要とする。
【００７７】
ａｄｄｉ命令は、スカラ実行ユニットＳＳで実行し、１サイクルで終了する。
【００７８】
ｖｃｕｔ１６命令は、３２ビットデータを１６ビットデータに変換するため、ＶＳ２で、パイプライン演算器を２個組み合わせた３２ビット演算器を４個利用し、４つずつデータを処理する。ｖｃｕｔ１６命令は、ｖｌｄ３２命令の演算結果を処理対象とするため、ｖｌｄ３２命令の最初の演算結果が出力された後開始される。この際、演算結果をメモリからロードする必要があり、そのために１サイクルのペナルティがあるため、ｖｌｄ３２命令の処理は、４サイクル目から開始され、６４個のデータを変換するのに１６サイクルを必要とする。
【００７９】
ｖｓｔ１６命令は、１６ビットデータをレジスタにストアする処理であり、ＶＳ０で、１６ビットパイプライン演算器を８個利用し、８つずつデータを処理し、８サイクルで終了する。ｖｓｔ１６命令は、ｖｃｕｔ１６命令の演算結果を処理対象とするため、ｖｃｕｔ１６命令の演算結果が求められた後でなければ開始できない。この際、ｖｃｕｔ１６命令の演算結果が求められる１９サイクル目から逆算して、ｖｓｔ１６命令は、１３サイクル目から開始される。
【００８０】
２回目のループは、ＶＳ０での１回目のループのｖｌｄ３２命令が終了した後１７サイクル目から開始される。以下、上記と同じ処理が繰り返される。
【００８１】
図１０は、図９の処理シーケンスを行う場合の命令発行制御回路４０２の命令発行部４１１における命令発行処理を示すフローチャートである。
【００８２】
ステップＳ１では、実行中のすべての先行命令に対し、発行する後続命令のペナルティ値の判定が完了したかを判定し、完了していなければステップＳ２に進み、完了していればステップＳ３に進む。
【００８３】
ステップＳ２では、先行命令に対し、発行する後続命令のペナルティ値の判定を行い、ステップＳ１に戻る。ペナルティ値の判定については後述する。
【００８４】
ステップＳ３では、すべての先行命令に対する後続命令のペナルティ値が、１つでも１以上のものが無いか判定し、あればステップＳ５に進み、無ければステップＳ４に進む。
【００８５】
ステップＳ４では、発行しようとしている後続命令が、先行命令を実行している実行ユニットを使用する資源競合が発生するか判定し、発生する場合にはステップＳ５に進み、発声しなければステップＳ６に進む。
【００８６】
ステップＳ５では、後続命令の発行を見合わせるストールを行い、最初に戻る。この場合、後続命令の発行を遅らせた上で、再度Ｓ１からＳ５をＳ６に進むまで繰り返す。
【００８７】
ステップＳ６では、後続命令を発行して終了する。
【００８８】
以上のように、図１０のフローチャートに従って命令発行処理を行う場合、実行中の各命令とのペナルティおよび資源競合を判定して、ペナルティがなく資源競合が発生していない場合に、命令を発行する。図９の処理シーケンスでは、命令のデータ幅によらず１つの実行ユニットに対して命令を発行するため、３２ビット演算は１６ビット演算の２倍の処理時間を要するため、ペナルティが増大することになる。このため、図９に示すように、ｖｃｕｔ１６命令で３２ビットデータを１６ビットデータに変換するのに１６サイクルを必要とし、実行ユニットは空き状態であるにもかかわらず、８サイクルの待ちが発生する。このように、ｖｓｔ１６を実行する実行ユニットは空いているにもかかわらず、長い待ちが発生する。
【００８９】
図１１は、実施形態のベクトルプロセッサで、図８のプログラム処理した場合の処理シーケンスを示す図であり、繰り返しループの２回目のループの途中までを表現している。
【００９０】
実施形態のベクトルプロセッサでは、図８のプログラムを実行する場合に、ｖｌｄ３２命令およびｖｃｕｔ１６命令をそれぞれ２つの実行ユニットを利用して８サイクルで処理する。
【００９１】
ｖｌｄ３２命令は、３２ビットのロード・ストア命令であるため、ＶＳ０およびＶＳ１の２つの実行ユニットを利用して実行する。実行ユニットのパイプライン演算器の個数をｎ（ここではｎ＝８）とし、ＶＬ／ｎ＝８個のデータを実行ユニットＶＳ０で２サイクルをかけて実行する。次の１サイクル遅れたサイクルで、次の８個のデータを実行ユニットＶＳ１で２サイクルかけて実行する。これにより、ｖｌｄ３２命令は、図９のシーケンスに比べて約１／２の９サイクルで実行される。
【００９２】
また、ｖｃｕｔ１６命令は、空いている実行ユニットＶＳ２およびＶＳ３を用いて同様に処理が行なわれる。ＶＳ２におけるｖｃｕｔ１６命令の処理は、ＶＳ０におけるｖｌｄ３２命令の開始から３サイクル遅れて開始される。ＶＳ３におけるｖｃｕｔ１６命令の処理は、ＶＳ１におけるｖｌｄ３２命令の開始から同様に３サイクル遅れて開始される。したがって、ｖｃｕｔ１６命令は、図９のシーケンスに比べて約１／２の９サイクルで実行される。
【００９３】
ＶＳ０およびＶＳ１がｖｌｄ３２命令を実行し、ＶＳ２およびＶＳ３がｖｃｕｔ１６命令を実行している間、空き状態のパイプライン演算器は無い。そのため、後続のｖｓｔ１６命令は、ＶＳ０が空き状態になるのを待って９番目のサイクルから開始される。ｖｓｔ１６命令は、ＶＳ０で、１６ビットパイプライン演算器を８個利用し、８つずつデータを処理し、８サイクルで終了する。
【００９４】
以上のように、図１１の処理シーケンスでは、ｖｌｄ３２、ｖｃｔ１６およびｖｓｔ１６は、命令の実行完了に要するサイクル数がほぼ一致しており、ペナルティを小さくできるので、待ち時間を削減してデータをバイパスすることができる。
【００９５】
図１２は、図１１の処理シーケンスを行う場合の命令発行制御回路４０２の命令発行部４１１における命令発行処理を示すフローチャートである。ここで、１命令の１系列のデータをｘ個の実行ユニットで実行する場合に、０番目からｘ−１番目の実行ユニットを表すパラメータｋを導入する。したがって、ｋ＜ｘである。例えば、図１１の処理シーケンスで、ｖｌｄ３２は１命令で、その処理対象のデータは２副系列（ｘ＝２）に分けられ、１番目（ｋ＝０）の実行ユニットと、２番目（ｋ＝１）の実行ユニットと、で実行される。ｖｃｔ１６についても同様である。
【００９６】
ステップＳ１１では、新規のフェッチ命令であるかを判定し、新規のフェッチ命令であればステップＳ１２に進み、新規でなければステップＳ１３に進む。
【００９７】
ステップＳ１２では、パラメータｋに０を設定する。
【００９８】
ステップＳ１３では、実行中のすべての先行命令に対し、副系列ｋについて発行する後続命令のペナルティ値の判定が完了したかを判定し、完了していなければステップＳ１４に進み、完了していればステップＳ１５に進む。
【００９９】
ステップＳ１４では、先行命令に対し、発行する副系列ｋについての後続命令のペナルティ値の判定を行い、ステップＳ１に戻る。ペナルティ値の判定については後述する。
【０１００】
ステップＳ１５では、すべての先行命令に対する後続命令のペナルティ値が、１つでも１以上のものが無いか判定し、あればステップＳ１７に進み、無ければステップＳ１６に進む。
【０１０１】
ステップＳ１６では、発行しようとしている後続命令が、先行命令を実行している実行ユニットを使用する資源競合が発生するか判定し、発生する場合にはステップＳ１７に進み、発声しなければステップＳ１８に進む。
【０１０２】
ステップＳ１７では、発行しようとしている後続命令の発行を見合わせるストールを行い、最初に戻る。この場合、後続命令の発行を遅らせた上で、再度Ｓ１からＳ５をＳ６に進むまで繰り返す。
【０１０３】
ステップＳ１８では、副系列ｋを対象として後続命令を発行し、ｋ＝ｋ＋１としてステップＳ１９に進む。
【０１０４】
ステップＳ１９では、ｘ＝ｋであるかを判定し、ｘ＝ｋであればステップＳ２０に進み、ｘ＝ｋでなければ一旦この処理を終了する。
【０１０５】
ステップＳ２０では、次の命令をフェッチし、一旦この処理を終了する。
一旦この処理を終了した後、適宜上記の処理を繰り返す。
【０１０６】
次に、ペナルティ値の判定について説明する。
上記のように、ｋは、１命令の１系列のデータをｘ個の実行ユニットで実行する場合に、０番目からｘ−１番目の実行ユニットを表す。
ステップＳ１４では、実行中の各命令に対し、フェッチされた命令(発行命令と呼ぶ)のｋ番目の副系列に対してペナルティ値を求める。なお、副系列ｋは発行命令のデータ幅ｘによって異なるベクトル・データの集合である。
【０１０７】
基本ビット幅＊ｘの演算に対するベクトル・レジスタｖｒ０に対する副系列ｋのデータは、次の通り表される。
副系列k = ｛ vr[i*n + k*(n/x) +j] | 0 ≦ i ＜ VL/n, 0 ≦ j ＜ n/x  ｝
【０１０８】
まず、図９および図１０に示した１命令の１系列のデータを１個の実行ユニットで実行する場合のペナルティ値は次のように求められる。
ペナルティ値(Ie,Ii,Ce) = 
max(RAWペナルティ値(Ie,Ii,Ce), WAWペナルティ値(Ie,Ii,Ce), WARペナルティ値(Ie,Ii,Ce))
RAWペナルティ値(Ie, Ii, Ce) = RAWレジスタ干渉(Ie,Ii)? max(RAW最大ペナルティ値(Ie,Ii) - Ce, 0) : 0
WAWペナルティ値(Ie, Ii, Ce) = WAWレジスタ干渉(Ie,Ii)? max(WAW最大ペナルティ値(Ie,Ii) - Ce, 0) : 0
WARペナルティ値(Ie, Ii, Ce) = WARレジスタ干渉(Ie,Ii)? max(WAR最大ペナルティ値(Ie,Ii) - Ce, 0) : 0
RAWレジスタ干渉(Ie,Ii) = (出力レジスタ番号(Ie) == 入力レジスタ番号(Ii))
WAWレジスタ干渉(Ie,Ii) = (出力レジスタ番号(Ie) == 出力レジスタ番号(Ii))
WARレジスタ干渉(Ie,Ii) = (入力レジスタ番号(Ie) == 出力レジスタ番号(Ii))
実行中の命令Ieに対して、判定対象の命令Iiに対して、RAW, WAW, RAWの各ケースに対してペナルティ値を求め、最大の値を全体のペナルティ値とする。RAWレジスタ干渉する場合は、実行中の命令Ieと判定対象の命令Iiの間の最大ペナルティ値を求め、実行中の命令が発行されてから経過したサイクル数を引いた値をRAWペナルティ値とする。ただし、減算した結果、0より小さくなる場合は0とする。また、レジスタ干渉が発生しない場合は0とする。RAW最大ペナルティ値(Ie,Ii)は、先行命令Ieの直後にIi命令が連続発行された場合のペナルティ値で、命令の組み合わせによって一意に決まる値である。また、RAWレジスタ干渉は、実行中の命令Ieが出力するレジスタ番号と判定対象の命令Iiのレジスタ番号が一致する場合に発生する。WAW, WARについてもRAWの場合と同様である。
【０１０９】
図１１および図１２に示した１命令の１系列のデータをｘ個の実行ユニットで実行する場合のペナルティ値は次のように求められる。
ペナルティ値(Ie,Ii,ke,ki,Ce) = 
max(RAWペナルティ値(Ie,Ii,ke,ki,Ce), WAWペナルティ値(Ie,Ii,ke,ki,Ce), WARペナルティ値(Ie,Ii,ke,ki,Ce))
RAWペナルティ値(Ie,Ii,ke,ki,Ce) =  (RAWレジスタ干渉(Ie,Ii) && (系列衝突(Ie,Ii, ke, ki)))? max(RAW最大ペナルティ値(Ie,Ii) - Ce, 0) : 0
WAWペナルティ値(Ie,Ii,ke,ki,Ce) =  (WAWレジスタ干渉(Ie,Ii) && (系列衝突(Ie,Ii, ke, ki)))? max(WAW最大ペナルティ値(Ie,Ii) - Ce, 0) : 0
WARペナルティ値(Ie,Ii,ke,ki,Ce) =  (WARレジスタ干渉(Ie,Ii) && (系列衝突(Ie,Ii, ke, ki)))? max(WAR最大ペナルティ値(Ie,Ii) - Ce, 0) : 0
RAWレジスタ干渉(Ie,Ii) = (出力レジスタ番号(Ie) == 入力レジスタ番号(Ii))
WAWレジスタ干渉(Ie,Ii) = (出力レジスタ番号(Ie) == 出力レジスタ番号(Ii))
WARレジスタ干渉(Ie,Ii) = (入力レジスタ番号(Ie) == 出力レジスタ番号(Ii))
系列衝突(Ie,Ii, ke, ki) = ((インデックス(xe, ke) ∩ インデックス(xi, ki) ) ≠ φ)
インデックス(x, k) = ｛ t * x + k | 0 ≦ t < (X/x) ｝
ここで、系列衝突をハードウェアで実装するならば、
(xe > xi) ? (ke/(xe/xi) == ki) : (ke == ki/(xi/xe))
とすることもできる。
ただし、
Ie: 実行中の命令
Ii: 判定対象命令
Ce: 実行中命令の発行後サイクル数
xe: 実行中命令のデータ幅
ke: 実行中命令のデータ系列
xi: 判定対象命令のデータ幅
ki: 判定対象命令のデータ系列
X: 命令セットで定義されるxの最大値
【０１１０】
上記の算出方法では、実行中の先行命令ｌｅに対して発行している命令ｌｉがRAWレジスタ干渉を起こしていない場合は次の実行ユニットをチェックする。RAWレジスタ干渉が発生しており、実行中命令で処理中のデータ系列ｋｅに対して、発行しようとしている命令ｌｉのデータ系列が重なっている場合は、命令間のペナルティ値を求める。命令間のペナルティ値は命令セットによって決まるものを想定する。ペナルティ値よりも実行中の先行命令の発行されたサイクル数が多い場合は、ペナルティ値を０とする。サイクル数が少ない場合は、差分をペナルティ値とする。これをWAR, RAWについても計算し、最も大きな値をペナルティ値として返す。
【０１１１】
ステップＳ１５では、全ての先行命令に対してペナルティを判定し、その結果ペナルティがある（ペナルティが１以上）場合は、ステップＳ１７でストールする。ペナルティがなく、ステップＳ１６で資源競合が発生しないと判定した場合は、ステップＳ１７で、系列ｋを対象としてフェッチした命令を発行する。命令を発行すると、ｋを１増加し、ｋがｘに到達するまで、フェッチした命令の発行を続け、ｋがｘに到達すると次命令のフェッチを行なう。
【０１１２】
図１３は、図１１の処理シーケンスにおけるバイパス回路４１２の動作を説明する図である。
【０１１３】
レジスタ・リードステージ（ＲＲ）では、発行された命令に対して、系列ｋの中の（ｎ／ｘ）個のデータをそれぞれリードして、実行ステージに送る。
【０１１４】
ここで、レジスタ・リードステージでは、実行中の各パイプラインに対して、処理するデータのバイパスを判定し、バイパスするデータか存在する場合は、最も近いステージからデータをバイパスする。例えば、図１１において、ｖｌｄ３２命令によりＶＳ０で処理された配列要素０−７、１６−２３、３２−３９および４８−５５のデータに対する処理結果は、ｖｃｕｔ１６命令によりＶＳ２でただちに利用される。そこで、ＶＳ０から出力された配列要素０−７、１６−２３、３２−３９および４８−５５のデータに対する処理結果は、ベクトルレジスタファイル４０１を介さずに、バイパス回路４１２により、ＶＳ２に接続されるパイプラインレジスタ４０８に格納される。ＶＳ１から出力された配列要素８−１５、２４−３１、４０−４７および５６−６３のデータに対する処理結果も、ベクトルレジスタファイル４０１を介さずに、バイパス回路４１２により、ＶＳ３に接続されるパイプラインレジスタ４０８に格納される。これにより、読み出しにおける待ちを低減できる。
【０１１５】
なお、バイパスするかの判定を行う判定回路が、命令発行制御回路４０２に設けられるが、判定回路を簡略化するために、ベクトル・レジスタを（ｎ／ｘ）個単位でインデックス化して判定する。
【０１１６】
図１１に示した実施形態のベクトルプロセッサの処理シーケンスでは、処理の実行中に、空き状態の実行ユニットが無い、すなわち実行ユニットの不足に起因する待ちが発生している。例えば、実施形態のベクトルプロセッサで、６個の実行ユニットＶＳ０〜ＶＳ５を設け、ＶＳ０〜ＶＳ２の３つがロード・ストア処理可能で、ＶＳ３〜ＶＳ５が乗算処理可能で、ＶＳ０〜ＶＳ５が算術演算を実行可能とすると、図１４に示す処理シーケンスが実現できる。図１４の処理シーケンスでは、さらに待ちが解消されて性能が向上する。
【０１１７】
以上、実施形態を説明したが、記載した例には各種の変形例が可能である。例えば、上記の実施形態では、１６ビット演算と３２ビット演算が混在する場合の例を説明したが、３２ビット演算と６４ビット演算が混在する場合にも、１６ビット演算と３２ビット演算と６４ビット演算が混在する場合にも、適用可能であり、演算のビット数は限定されない。また、実行ユニット数、ＡＬＵ数等も、記載した例に限定されるものではない。
【０１１８】
以上、実施形態を説明したが、ここに記載したすべての例や条件は、発明および技術に適用する発明の概念の理解を助ける目的で記載されたものであり、特に記載された例や条件は発明の範囲を制限することを意図するものではなく、明細書のそのような例の構成は発明の利点および欠点を示すものではない。発明の実施形態を詳細に記載したが、各種の変更、置き換え、変形が発明の精神および範囲を逸脱することなく行えることが理解されるべきである。
【符号の説明】
【０１１９】
４００    ベクトルプロセッサ
４０１    ベクトルレジスタファイル
４０２    命令発行制御回路
４０３〜４０６    実行ユニット
４１１Ａ，４１１Ｂ    算術論理演算ユニット
５０１    １６ビット演算器
５０２    ３２ビット演算器
【図１】
0005786719.tif 000002
【図２】
0005786719.tif 000003
【図３】
0005786719.tif 000004
【図４】
0005786719.tif 000005
【図５】
0005786719.tif 000006
【図６】
0005786719.tif 000007
【図７】
0005786719.tif 000008
【図８】
0005786719.tif 000009
【図９】
0005786719.tif 000010
【図１０】
0005786719.tif 000011
【図１１】
0005786719.tif 000012
【図１２】
0005786719.tif 000013
【図１３】
0005786719.tif 000014
【図１４】
0005786719.tif 000015