(57)【特許請求の範囲】
【請求項１】
要素データ列の演算を行う命令をメモリから取得する命令フェッチ手段と、
前記取得された命令を復号し当該復号された命令をサイクル単位に発行するデコード発行手段と、
前記発行された命令をそれぞれ処理する複数の演算ユニットを有する演算手段と、
前記要素データ列が連続するアドレスに格納されるレジスタとを有し、
前記複数の演算ユニットは、第１種命令を処理する第１の演算ユニットと、前記第１種命令に加えて第２種命令を処理する第２の演算ユニットとを有し、
前記デコード発行手段は、発行対象の命令の要素データが分割された複数の分割命令が前記第２の演算ユニットで処理されるとき、前記発行対象の命令に後続する命令に前記第２種命令がない場合に前記分割命令を発行し、前記第２種命令がある場合は前記発行対象の命令を分割せずに発行するベクトルプロセッサ。
【請求項２】
請求項１において、
前記演算ユニットは１つまたは複数の演算器をそれぞれ有し、
前記第１、２種命令は、さらに、前記要素データ列を構成する各要素データが第１ビット幅であってそれぞれＭ（Ｍ≧１）個の演算器によって処理される第１ビット幅命令と、前記各要素データが前記第１ビット幅のＮ（Ｎ≧２）倍であってそれぞれＭ×Ｎ個の演算器によって処理される第２ビット幅命令とを有し、
前記発行対象の前記第２ビット幅命令に後続する命令に、当該第２ビット幅命令の要素データ列がＮ個に区分された第１区分要素データ列とその後に処理される第２区分要素データ列のうち、前記第２区分要素データ列を処理対象とする前記第１ビット幅命令がある場合に、前記複数の分割命令は、前記第１、２区分要素データ列を処理対象とする前記Ｎ個の命令として分割されるベクトルプロセッサ。
【請求項３】
請求項２において、
前記デコード発行手段は、前記発行対象の命令を分割しないとき、前記発行対象の第２ビット幅命令の前記第２区分要素データ列が優先して処理されるように前記要素データ列の処理順を変更して前記第２ビット幅命令を発行するベクトルプロセッサ。
【請求項４】
請求項１乃至３のいずれかにおいて、
前記発行対象の命令に後続する命令は、前記複数の分割命令の処理が終了する前に発行される命令であるベクトルプロセッサ。
【請求項５】
請求項２乃至４のいずれかにおいて、
前記発行対象の第２ビット幅命令に後続する命令は、前記発行対象の第２ビット幅命令の処理が終了する前に発行される命令であるベクトルプロセッサ。
【請求項６】
要素データ列の演算を行う命令をメモリから取得する命令フェッチ工程と、
前記取得された命令を復号し当該復号された命令をサイクル単位に発行するデコード発行工程と、を有し、
前記発行された命令は複数の演算ユニットによってそれぞれ処理され、前記複数の演算ユニットのうち第１の演算ユニットは第１種命令を処理し、第２の演算ユニットは前記第１種命令に加えて第２種命令を処理し、前記要素データ列はレジスタの連続するアドレスに格納され、
前記デコード発行工程は、発行対象の命令の要素データが分割された複数の分割命令が前記第２の演算ユニットで処理されるとき、前記発行対象の命令に後続する命令に前記第２種命令がない場合に前記分割命令を発行し、前記第２種命令がある場合は前記発行対象の命令を分割せずに発行するベクトルプロセッサの処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ベクトルプロセッサ、ベクトルプロセッサの処理方法に関する。
【背景技術】
【０００２】
配列をなす大量の要素データに対し一定の演算を繰り返すベクトル処理において、ベクトルプロセッサが用いられる。ベクトルプロセッサによれば、一命令により配列の要素データを連続的に処理することで、高い演算スループットを得ることができる。
【０００３】
ベクトルプロセッサは、たとえば、ロード・ストア用、演算用のパイプラインを有する。演算パイプラインは、演算命令のフェッチ、デコードを一回的に行い、レジスタ（以下、ベクトルレジスタという）から要素データを順次連続して読み出し、算術演算などの演算を実行する。そして、演算パイプラインは、演算結果を示す要素データを処理順序でベクトルレジスタに格納する。
【０００４】
また、ベクトルプロセッサでは、要素データのビット幅（例えば、８ビット、１６ビット、３２ビット、６４ビット等）の異なる演算命令が処理される。一般的に、演算パイプラインは、それぞれ所定ビットの演算を行う演算ユニットを複数有し、１サイクルで複数配列分の演算処理を行う。このため、要素データのビット幅が演算命令によって異なる場合、１サイクルで処理される要素データの配列数も演算命令によって異なる。ベクトルプロセッサでは、各命令の要素データの配列数は同一に設定されるため、要素データのビット幅が演算命令によって異なる場合、演算命令によって演算命令に所要の処理サイクル数が異なることを意味する。例えば、所定の条件において、要素データのビット幅が１６ビットのHalfWord命令は処理に４サイクル要するのに対し、ビット幅が３２ビットのWord命令は処理に８サイクル要する。
【０００５】
このように、要素データのビット幅の異なる演算命令を処理する場合、後続の演算命令の発行遅延が発生することがある。例えば、先行のWord命令（例えば、８サイクル）の後続に、HalfWord命令（例えば、４サイクル）が処理される場合を挙げる。また、このとき、後続のHalfWord命令は、先行のWord命令の処理対象の要素データのうち、後半４サイクルで処理される要素データを処理対象とするものとする。
【０００６】
このとき、先行のWord命令が発行された直後のサイクルに、後続のHalfWord命令が発行されると、先行のWord演算命令において、後続のHalfWord命令で処理対象となる要素データの処理が終了していない。このため、ベクトルプロセッサは、当該要素データの処理の終了を待って、後続のHalfWord命令を発行する。これにより、後続のHalfWord命令の発行が遅延し、演算スループットが低下する。
【０００７】
そこで、ベクトルプロセッサは、演算パイプラインを複数有する場合、処理サイクルの多いWord命令を例えば２つの演算命令に分割し、分割した演算命令をそれぞれ別の演算パイプラインで処理させる。これにより、後続のHalfWord命令で処理対象となる要素データの処理の終了が早くなり、ベクトルプロセッサは、後続のHalfWord命令の発行を早めることができる。これにより、演算スループットの低下が抑えられる。
【０００８】
ところで、複数の演算パイプラインを有するベクトルプロセッサでは、乗算器などの回路量の多い演算器や、使用頻度の低い演算器をすべての演算パイプラインに実装すると、プロセッサ全体の回路量が大きくなってしまう。そこで、回路量の多い演算器や、使用頻度の低い演算器は、複数の演算パイプラインのうち、一部の演算パイプラインにのみ実装される。
【０００９】
ベクトルプロセッサについては、例えば、特許文献１、２に記載される。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特許第２５４４７７０号
【特許文献２】特開２００９−１９３３７８
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、上記のように演算命令が分割され、一部の演算パイプラインを含む複数の演算パイプラインで処理された場合、後続の演算命令が当該一部の演算パイプラインでのみ処理可能な命令であったとき、ベクトルプロセッサは、当該後続の演算命令を発行することができない。そこで、ベクトルプロセッサは、一部の演算パイプラインが空くまで、後続の演算命令の発行を遅延させておく。これにより、演算スループットが低下してしまう。
【００１２】
本発明は、要素データのビット幅が異なる演算命令のスループットを向上させるベクトルプロセッサ、ベクトルプロセッサの処理方法を提供することにある。
【課題を解決するための手段】
【００１３】
第１の側面は、要素データ列の演算を行う命令をメモリから取得する命令フェッチ手段と、前記取得された命令を復号し当該復号された命令をサイクル単位に発行するデコード発行手段と、前記発行された命令をそれぞれ処理する演算ユニットを複数有する演算手段と、前記要素データ列が連続するアドレスに格納されるレジスタとを有し、前記複数の演算ユニットは、第１種命令を処理する第１の演算ユニットと、第１種命令に加えて第２種命令を処理する第２の演算ユニットとを有し、前記デコード発行手段は、発行対象の命令の要素データが分割された複数の分割命令が前記第２の演算ユニットで処理されるとき、発行対象の命令に後続する命令に前記第２種命令がない場合に前記分割命令を発行し、前記第２種命令がある場合は前記発行対象の命令を分割せずに発行する。
【発明の効果】
【００１４】
第１の側面によれば、演算スループットが向上する。
【図面の簡単な説明】
【００１５】
【図１】本実施形態が適用されるベクトルプロセッサの構成を説明する例図である。
【図２】ベクトルプロセッサで処理される命令の一例を説明する図である。
【図３】ベクトルプロセッサの演算パイプラインの処理シーケンスを説明する例図である。
【図４】演算ユニットが有する演算器の一例を示す図である。
【図５】Halfword命令のサイクル毎の要素データを説明する例図である。
【図６】Word命令の処理サイクル毎の要素データを説明する例図である。
【図７】Halfword命令とWord命令の各要素データ列について説明する図である。
【図８】Word命令の後にHalfword命令を連続して処理する場合であって、データハザードが発生する場合における各演算パイプラインの処理シーケンスを表す例図である。
【図９】Word命令の分割による後続のHalfWord命令の処理シーケンスについて説明する例図である。
【図１０】命令の分割の有無による処理シーケンスを説明する例図である。
【図１１】命令の要素データ列の処理順の変更による処理シーケンスを説明する例図である。
【図１２】デコード発行部の命令発行制御部の構成を示す例図である。
【図１３】令発行制御部の処理の詳細を説明するフローチャート図である。
【図１４】命令発行可否部の処理について説明するフローチャート図である。
【図１５】第２の実施の形態例の命令の分割有無による処理シーケンスを説明する例図である。
【図１６】第２の実施の形態例における命令の要素データ列の処理順の変更による処理シーケンスを説明する例図である。
【発明を実施するための形態】
【００１６】
以下、図面にしたがって実施の形態について説明する。但し、適用される技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１７】
［ベクトルプロセッサの概要］
図１は、本実施形態が適用されるベクトルプロセッサ１の構成を説明する例図である。ベクトルプロセッサは１、１つの命令に基づいて所定の配列をなす要素データの演算処理を行う。同図のベクトルプロセッサ１は、命令メモリ２、命令フェッチ部３、デコード発行部４、複数の演算ユニットＵ０〜Ｕ３、ベクトルレジスタ５、スカラレジスタ６を有する。ベクトルプロセッサ１は、たとえば、信号処理用ＬＳＩ（Large Scale Integrated circuit）である。
【００１８】
命令メモリ（メモリ）２は、演算ユニットＵ０〜Ｕ３で処理される命令を格納する。命令メモリ２は、たとえばＳＲＡＭである。命令フェッチ部３は命令メモリ２から命令を読み出す。そして、デコード発行部４の命令発行制御部１０は、命令フェッチ部３によって取得された命令を復号して、必要に応じて命令の分割及び変更処理を行うと共に、シーケンサＳ０〜Ｓ３を制御する。シーケンサＳ０〜Ｓ３は、命令及び命令に要する要素データをベクトルレジスタ５から読み出して、演算ユニットＵ０〜Ｕ３に入力する。
【００１９】
演算ユニットＵ０〜Ｕ３は、それぞれ入力される命令に従って動作する。演算ユニットＵ０〜Ｕ３は、加減算、乗算といった算術演算や、論理演算などの演算を実行し、演算結果を示す要素データをベクトルレジスタ５に書き込む。また、ベクトルレジスタ（レジスタ）５には、配列をなす要素データ（以下、要素データ列）が連続したアドレスに格納される。要素データ列の各要素データは、演算ユニットＵ０〜Ｕ３による演算用データ、及び、演算結果を示すデータである。なお、スカラレジスタ６には、配列をなさない演算用データ、及び、演算結果を示すデータが格納される。
【００２０】
また、図１の例において、演算ユニットＵ０〜Ｕ３のうち、演算ユニットＵ３は、各種演算に加えて、除算等の特定の演算を行う。除算器の回路は、回路量が多いことから、すべての演算ユニットに実装するとプロセッサ全体の回路量が大きくなってしまう。このため、除算器や使用頻度が少ない回路は、特定の演算ユニットＵ３にのみ実装される。
【００２１】
［ベクトルプロセッサの命令］
図２は、ベクトルプロセッサ１で処理される命令の一例を説明する図である。ベクトルプロセッサ１で処理される命令は、例えば、要素データ列同士の演算を、同じ列単位に行う命令である。同図に例示する命令Ｃ１「ｖａｄｄ ｖｒ１, ｖｒ２, ｖｒ０」は、配列数ＶＬ３２の要素データ列ｖｒ１と要素データ列ｖｒ２とを同列同士で加算した結果を、要素データ列ｖｒ０の各要素データとして出力し、ベクトルレジスタ５に格納する命令である。
【００２２】
１つの命令の要素データ列ｖｒ０〜ｖｒ２は、同じビット幅の要素データαによって構成される。また、要素データ列ｖｒ０〜ｖｒ２の配列数ＶＬは、ベクトルプロセッサ上で共通値に設定される。本実施の形態例では、要素データ列の配列数ＶＬは３２である。また、１つの命令は、ひとつの演算ユニットで処理され、命令における各列の処理順序はいずれの順でもよい。
【００２３】
なお、ベクトルプロセッサ１で処理される命令には、図２に例示した命令以外にも、要素データ列から最大値や最小値等を示す１の要素データαを出力する命令や、要素データ列の平均値を出力する命令等がある。この場合、演算結果は、ベクトルレジスタ５ではなく、スカラレジスタ６に格納される。
【００２４】
［ベクトルプロセッサの処理シーケンス］
続いて、図１のベクトルプロセッサのように、複数の演算ユニットＵ０〜Ｕ３を有するベクトルプロセッサにおける各演算パイプラインＰ０〜Ｐ３の命令の処理シーケンスについて説明する。
【００２５】
図３は、図１のベクトルプロセッサ１における４つの演算パイプラインＰ０〜Ｐ３の処理シーケンスを説明する例図である。同図の処理シーケンス図Ｚ１において、縦軸は処理ステージを示し、横軸は時間（処理サイクル）を示す。処理シーケンス図Ｚ１における各マス目内の数字１〜６は、処理対象の命令１〜命令６を示す。命令１〜命令６は、図２に例示したような配列同士の演算を行う命令であり、命令１から命令６に順に処理される。
【００２６】
本実施の形態例における演算パイプラインＰ０〜Ｐ３は、それぞれ３つの処理ステージを有する。３つの処理ステージは、命令のフェッチステージ「fetch」（以下、ＩＦステージ）、命令のデコード・発行ステージ「decode」（以下、ＩＤステージ）、演算ユニットによって命令を実行する実行ステージ「execute」（以下、ＥＸステージ）である。なお、ＩＤステージでは、ＥＸステージの制御や処理対象の要素データ列のベクトルレジスタ５からの読み出し、ＥＸステージでは演算結果のベクトルレジスタ５への書き込み処理も行われる。
【００２７】
このようなベクトルプロセッサ１において、１つの命令について、ＩＦステージ及びＩＤステージは一回的に実行される。演算パイプラインＰ０〜Ｐ３は、１つの命令について、ＩＦステージで命令をフェッチし、ＩＤステージにてデコードし、ＥＸステージでは必要な処理サイクル数かけて命令の演算処理を行う。図３の例では、各命令は、ＥＸステージで４サイクルかけて処理され、３つの処理ステージによって６サイクルかけて処理される。なお、ＩＤステージは、ＥＸステージの制御を行うため、図３において、ＥＸステージに要するサイクル数分、処理状態となっている。
【００２８】
また、本実施の形態例のベクトルプロセッサでは、処理サイクル単位に、１つの命令がフェッチされる。つまり、命令のフェッチ処理は、複数の演算パイプラインＰ０〜Ｐ３で同タイミングに行われない。このため、処理シーケンス図Ｚ１において、１サイクル目、演算パイプラインＰ０で命令１のフェッチが行われ、次の２サイクル目で、演算パイプラインＰ１において命令２がフェッチされる。そして、演算パイプラインＰ０において、命令１の処理の終了にあわせて、５サイクル目で命令５がフェッチされる。
【００２９】
このように、ベクトルプロセッサ１では、命令のフェッチとデコードを一回的に行い、要素データを順次連続して処理する。これにより、命令のフェッチやデコードの時間が節減され、スループットが向上する。また、本実施の形態例において、演算ユニットＵ０〜Ｕ３は、それぞれに複数の演算器を備えることで、演算器の並列動作によって、さらに高いスループットを得る。図１の演算ユニットＵ０〜Ｕ３は、それぞれ、例えば、８つの演算器を有する。
【００３０】
図４は、演算ユニットＵ０〜Ｕ３が有する演算器Ｕ０−１〜Ｕ０−８の一例を示す図である。同図の演算ユニットＵ０は、例えば、図１の演算ユニットＵ０に対応する。また、８つの演算器Ｕ０−１〜Ｕ０−８は、それぞれ１６ビットのデータの演算処理を１サイクルで行う。演算ユニットＵ０は、それぞれ１６ビットの演算を行う演算器を８つ有することにより、１サイクルで、１６×８ビットの演算を行う。なお、他の演算ユニットＵ１〜Ｕ３についても同様である。
【００３１】
ところで、ベクトルプロセッサ１で処理される命令の要素データ列における各要素データαのビット幅は、１つの命令では共通に設定されるが、命令間では異なる。命令の各要素データαのビット幅によって、各要素データαに用いられる演算器Ｕ０−１〜Ｕ０−８の数も異なる。
【００３２】
［命令の要素データのビット幅］
命令の要素データのビット幅は、例えば、命令によって、８ビット（Byte型）、１６ビット（Halfword型）、３２ビット（Word型）、６４ビット（Doubleword型）等のように設定される。以下、要素データが８ビットの命令をByte命令、１６ビットの命令をHalfword命令、３２ビットの命令をWord命令、６４ビットの命令をDoubleword命令と称する。このように、命令によって要素データαのビット幅が異なる場合、命令の各要素データαの処理に用いられる演算器Ｕ０−１〜Ｕ０−８の数が異なることにより、演算パイプラインのＥＸステージに要する処理サイクル数も異なる。以下、Halfword命令とWord命令の例に基づいて説明する。
【００３３】
まず、Halfword命令の例ＨＷ１について説明する。Halfword命令の各要素データαのビット幅は１６ビットである。このため、Halfword命令の要素データαは、１つの演算器によって処理される。これは、８つの演算器Ｕ０−１〜Ｕ０−８によって、１サイクルで８列分の要素データαが処理可能であることを意味する。一方、Word命令の場合（Ｗ１）、各要素データαのビット幅は３２ビットである。このため、Word命令の要素データαは、２つの演算器によって処理される。これは、８つの演算器Ｕ０−１〜Ｕ０−８によって、１サイクルで４列分の要素データαが処理可能であることを意味する。
【００３４】
なお、演算器Ｕ０−１〜Ｕ０−８が１６ビットの演算器の場合、１６ビットより要素データのビット幅の小さい命令（例えば、Byte命令）は処理の対象外となる。このため、本実施の形態例における演算器Ｕ０−１〜Ｕ０−８は、例えば、Halfword命令、Word命令、Doubleword命令を処理対象の命令とする。
【００３５】
このように、ＥＸステージの１サイクルで処理可能な要素データの列数は、Halfword命令とWord命令とで異なる。また、ベクトルプロセッサ１で処理される各命令の配列数ＶＬは共通に設定されるため、Halfword命令とWord命令とでは、ＥＸステージに要する処理サイクル数が異なる。続いて、この相違について、具体例に基づいて説明する。
【００３６】
［Halfword命令のＥＸステージの処理例］
図５は、１つの演算パイプラインのＥＸステージにおけるHalfword命令のサイクル毎の要素データを説明する例図である。この例におけるHalfword命令は、例えば、図２の命令Ｃ１「ｖａｄｄ ｖｒ１, ｖｒ２, ｖｒ０」であり、要素データ列ｖｒ１、ｖｒ２の加算結果を要素データ列ｖｒ０に出力する命令である。また、要素データ列ｖｒ０〜ｖｒ２の各要素データαのビット幅は１６ビットである。また、この例において、命令の演算処理は、図４に示した演算ユニットＵ０で行われることを前提とする。
【００３７】
なお、図５の各要素データαに示すＶＲ０〜ＶＲ９５は、当該要素データが格納されるベクトルレジスタのアドレスを示す。具体的に、要素データ列ｖｒ０をなす各要素データは、ベクトルレジスタの連続したアドレスＶＲ０〜ＶＲ３１に格納される。同様に、要素データ列ｖｒ１をなす各要素データは、ベクトルレジスタの連続したアドレスＶＲ３２〜ＶＲ６３に、要素データ列ｖｒ２をなす各要素データはアドレスＶＲ６４〜ＶＲ９５に格納される。
【００３８】
演算器Ｕ０−１〜Ｕ０−８は、１サイクルで１６×８ビットの演算が可能であるため、Halfword命令の場合、１サイクルで８列分の要素データの演算が可能になる。そのため、図５の（Ａ）において、初めのサイクル１Ｃｙで、配列番号１〜８の要素データｖｒ１[１〜８]とｖｒ２[１〜８]との演算が行われ、演算結果を示す要素データｖｒ０[１〜８]がそれぞれ出力される。具体的に、同図の（Ｂ）のように、アドレスＶＲ３２〜ＶＲ３９に格納された要素データｖｒ１［１〜８］と、アドレスＶＲ６４〜ＶＲ７１に格納された要素データｖｒ１［１〜８］とが同列間で加算された要素データｖｒ０［０〜７］の値が、アドレスＶＲ０〜ＶＲ７に格納される。
【００３９】
続いて、２サイクル目２Ｃｙでは、図５の（Ａ）（Ｂ）のように、アドレスＶＲ４０〜ＶＲ４７に格納された要素データｖｒ１［９〜１６］と、アドレスＶＲ７２〜ＶＲ７９に格納された要素データｖｒ１［９〜１６］とが同列間で加算された要素データｖｒ０［９〜１６］の値が、アドレスＶＲ８〜ＶＲ１５に格納される。３サイクル目３Ｃｙ、４サイクル目４Ｃｙも同様である。
【００４０】
このように、Halfword命令の場合、演算器Ｕ０−１〜Ｕ０−８は、１サイクルで８列分の要素データ、即ち、配列数ＶＬ３２のうち１／４列の要素データの演算処理を行う。これにより、４サイクル（１Ｃｙ〜４Ｃｙ）でＥＸステージの処理が終了する。続いて、Word命令の場合について説明する。
【００４１】
［Word命令のＥＸステージの処理例］
図６は、１つの演算パイプラインのＥＸステージにおけるWord命令の処理サイクル毎の要素データを説明する例図である。この例におけるWord命令は、例えば、命令「ｖａｄｄ ｖｒ２, ｖｒ４, ｖｒ０」であり、要素データ列ｖｒ２、ｖｒ４の加算結果を要素データ列ｖｒ０に出力する命令である。また、要素データ列ｖｒ０、ｖｒ２、ｖｒ４の各要素データαのビット幅は３２ビットである。また、この例においても、命令の演算処理は、図４に示した演算ユニットＵ０で行われることを前提とする。
【００４２】
図５と同様にして、ＶＲ０〜ＶＲ１９１は、当該要素データが格納されるベクトルレジスタのアドレスを示す。ただし、Word命令の場合、要素データのビット幅が３２ビットであるため、１つの要素データαが２つ分のレジスタに格納される。ベクトルレジスタ５の各レジスタは演算器Ｕ０−１〜Ｕ０−８の処理ビット数に対応するためである。したがって、要素データ列ｖｒ０をなす各要素データはアドレスＶＲ０〜ＶＲ６３に、要素データ列ｖｒ２をなす各要素データはアドレスＶＲ６４〜ＶＲ１２７に、要素データ列ｖｒ４をなす各要素データはアドレスＶＲ１２８〜ＶＲ１９１に格納される。
【００４３】
演算器Ｕ０−１〜Ｕ０−８は、１サイクルで１６×８ビットの演算が可能であるため、Word命令の場合、１サイクルで４列分の要素データの演算が可能になる。そのため、図６の（Ａ）において、初めのサイクル１Ｃｙで、配列番号１〜４の要素データｖｒ２[１〜４]とｖｒ４[１〜４]との演算が行われ、演算結果を示す要素データｖｒ０[１〜４]がそれぞれ出力される。具体的に、同図の（Ｂ）のように、アドレスＶＲ６４〜ＶＲ７１に格納された要素データｖｒ２［１〜４］と、アドレスＶＲ１２８〜ＶＲ１３５に格納された要素データｖｒ２［１〜４］とが同列間で加算された要素データｖｒ０［１〜４］の値が、アドレスＶＲ８〜ＶＲ１５に格納される。
【００４４】
同様にして、２サイクル目２Ｃｙでは、図６の（Ａ）（Ｂ）のように、アドレスＶＲ８〜ＶＲ１５に配列番号５〜８の演算結果が格納される。続く３サイクル目３Ｃｙから８サイクル目８Ｃｙについても同様である。８サイクル目８Ｃｙには、配列番号２９〜３２の演算結果がアドレスＶＲ５６〜ＶＲ６３に格納される。このように、Word命令の場合、演算器Ｕ０−１〜Ｕ０−８は、１サイクルで４列分の要素データ、即ち、配列数ＶＬ３２のうち１／８列の要素データの演算処理を行う。これにより、８サイクル（１Ｃｙ〜８Ｃｙ）でＥＸステージの処理が終了する。
【００４５】
図５、６のとおり、要素データの配列数ＶＬが３２の場合、ＥＸステージに要するサイクル数は、Halfword命令は４サイクル、Word命令は８サイクルである。このように、Halfword命令とWord命令とでは、処理に要するサイクル数が異なる。続いて、Halfword命令とWord命令について、要素データ列が格納されるベクトルレジスタについて、図示して説明する。
【００４６】
［Halfword命令、Word命令の単位ベクトルレジスタ］
図７は、ベクトルレジスタ８に格納されたHalfword命令とWord命令の各要素データ列について説明する図である。図５−１´は、図５−１を拡大した図である。図７において、ＶＲｘｘが記される各マスはレジスタを、ＶＲｘｘのｘｘはベクトルレジスタ８におけるアドレスを示す。なお、この例において、演算器Ｕ０−１〜Ｕ０−８の処理ビット数が１６ビットであることから、各レジスタのビット幅は１６ビットである。また、ｖｒｘｘが記されるレジスタの領域は、命令の要素データ列が格納される単位ベクトルレジスタを示す。
【００４７】
前述したとおり、Halfword命令の場合、要素データ列の各要素データのビット幅は１６ビットである。そのため、Halfword命令の要素データ列ｖｒ０［ＨＷ］、ｖｒ１［ＨＷ］、ｖｒ２［ＨＷ］は、それぞれ、１６ビット幅の連続した３２個のレジスタ（単位ベクトルレジスタ）に格納される。具体的に、図５−１、５−２のように、Halfword命令における要素データ列ｖｒ０［ＨＷ］は、アドレスＶＲ０、ＶＲ１、…、ＶＲ３１の計３２個のレジスタに連続して格納される。要素データ列ｖｒ１［ＨＷ］、ｖｒ２［ＨＷ］についても同様である。
【００４８】
一方、Word命令の場合、要素データ列の各要素データのビット幅は３２ビットである。この例において、各レジスタのビット幅は１６ビットであるため、Word命令の各要素データはそれぞれ２つのレジスタに格納される。そのため、要素データ列ｖｒ０［Ｗ］、ｖｒ２［Ｗ］、ｖｒ４［Ｗ］は、それぞれ、１６ビット幅の連続した６４個のレジスタに格納される。具体的に、図５−１、５−２のように、Word命令における要素データ列ｖｒ０［Ｗ］は、アドレスＶＲ０、ＶＲ１、…、ＶＲ６３の６４個のレジスタに連続して格納される。要素データ列ｖｒ２［Ｗ］、ｖｒ４［Ｗ］についても同様である。
【００４９】
このように、Halfword命令とWord命令とでは要素データのビット幅が異なるため、要素データ列が格納される単位ベクトルレジスタのサイズも異なる。なお、本実施の形態例において、Word命令の要素データ列ｖｒ０［Ｗ］は、Halfword命令の要素データ列ｖｒ０［ＨＷ］と要素データ列ｖｒ１［ＨＷ］とに対応する。同様にして、Word命令の要素データ列ｖｒ２［Ｗ］は、Halfword命令の要素データ列ｖｒ２［ＨＷ］と要素データ列ｖｒ３［ＨＷ］とに対応する。この例において、Word命令の要素データ列はｖｒ２、ｖｒ４の名前は、Halfword命令の要素データ列に合わせて与えられている。
【００５０】
図４〜図７にかけて要素データのビット幅が異なる命令の処理及びベクトルレジスタについて、Halfword命令とWord命令を例示して説明してきた。このように、要素データのビット幅が異なる命令間では、処理に要するサイクル数、及び、要素データ列に対応する単位ベクトルレジスタのサイズが異なる。処理サイクルの異なる命令が混在して複数の演算パイプラインで処理される場合、データハザードが発生することがある。ベクトルプロセッサ１は、データハザードの回避のために、後続の命令の発行を遅延させる。続いて、データハザード及びその具体例について説明する。
【００５１】
［データハザード］
データハザードとは、パイプラインハザードの一種である。パイプラインハザードとは、パイプライン処理を行う場合において、複数の命令同士が持つ依存関係から後続の命令の発行を遅延せざるを得ない状況を示す。データハザードとは、パイプラインハザードのうち、処理するデータの依存関係に起因して発生するハザードを示す。
【００５２】
また、データハザードには、例えば、リード・アフター・ライト（ＲＡＷ）ハザードと、ライト・アフター・リード（ＷＡＲ）ハザードがある。ＲＡＷハザードは、命令（先行命令）の後に命令（後続命令）が処理される場合、先行命令が演算結果をレジスタに書き込む前に、後続命令が当該レジスタから値を読み出す場合に発生するハザードである。一方、ＷＡＲハザードは、先行命令がレジスタからデータを読み出す前に、後続命令が当該レジスタに値を書き込む場合に発生するハザードである。データハザードが発生した場合、ベクトルプロセッサ１は、例えば、後続命令の発行を遅延させることで、データハザードを回避する。
【００５３】
［データハザードによる遅延の具体例］
図８は、Word命令の後にHalfword命令を連続して処理する場合であって、データハザードが発生する場合における各演算パイプラインＰ０〜Ｐ３の処理シーケンスを表す例図である。同図上の処理シーケンス図Ｚ２−１はＲＡＷハザード、同図下の処理シーケンス図Ｚ２−２はＷＡＲハザードが発生する場合のＥＸステージにおける処理シーケンス図である。
【００５４】
図８の処理シーケンス図Ｚ２−１、Ｚ２−２において、マス目内の数値は、ＥＸステージの各サイクルで処理対象となる要素データ列が格納されるベクトルレジスタのアドレス（例えば、ＶＲ０〜ＶＲ０７）における初めのアドレスの数（例えば、ＶＲ０における０）を示す。例えば、この例において、処理シーケンス図Ｚ２−１の演算パイプラインＰ０の１サイクル目の数値０は、ベクトルレジスタのアドレスＶＲ０〜ＶＲ７に格納される要素データの演算処理が行われることを示す。
【００５５】
まず、処理シーケンス図Ｚ２−１について説明する。同図では、演算パイプラインＰ０にてWord命令Ｗ１が、続いて、演算パイプラインＰ１にてHalfword命令ＨＷ１が処理される。具体的に、Word命令Ｗ１「ｖａｎｄ ｖｒ２，ｖｒ４，ｖｒ０」は、要素データ列ｖｒ２と要素データ列ｖｒ４とを配列毎に加算し、要素データ列ｖｒ０として出力する命令である。そして、Halfword命令ＨＷ１「ｖｓｌｌｈ ｖｒ１，ｖｒ６，ｖｒ７」は、要素データ列ｖｒ１の各要素データについて、要素データ列ｖｒ６の同配列の要素データで指定したビット数分、左にシフトして要素データ列ｖｒ７に出力する命令である。
【００５６】
この例において、図８のベクトルレジスタ５−２に示すように、後続のHalfwordＨＷ１の要素データ列ｖｒ１［ＨＷ］は、先行のWord命令Ｗ１の演算結果である要素データ列ｖｒ０［Ｗ］のうち、配列の後半の要素データ列（ＶＲ３２〜ＶＲ６３）に該当する。処理シーケンス図Ｚ２−１によると、Word命令Ｗ１について、要素データ列ｖｒ０［Ｗ］の後半の要素データ列の値は、サイクル５からサイクル８にかけて確定する。このため、演算パイプラインＰ１は、６サイクル目以降に、後続のHalfwordＨＷ１のＥＸステージの処理を開始する（ＲＡＷハザードによる遅延）。これにより、HalfwordＨＷ１の処理は、演算パイプラインＰ１が処理を開始可能な２サイクル目から４サイクル分Ｄ１遅延する。
【００５７】
続いて、処理シーケンス図Ｚ２−２について説明する。同図では、演算パイプラインＰ０にてWord命令Ｗ２が、続いて、演算パイプラインＰ１にてHalfword命令ＨＷ２が処理される。具体的に、Word命令Ｗ２「ｖａｎｄ ｖｒ０，ｖｒ２，ｖｒ４」は、要素データ列ｖｒ０と要素データ列ｖｒ２とを配列毎に加算し、要素データ列ｖｒ４として出力する命令である。そして、Halfword命令ＨＷ２「ｖｓｌｌｈ ｖｒ６，ｖｒ７，ｖｒ１」は、要素データ列ｖｒ６の各要素データについて、要素データ列ｖｒ７の同配列の要素データで指定したビット数分、左にシフトして要素データ列ｖｒ１に出力する命令である。
【００５８】
この例において、後続のHalfwordＨＷ２の演算結果が出力される要素データ列ｖｒ１［ＨＷ］は、先行のWord命令Ｗ２の処理対象の要素データ列ｖｒ０［Ｗ］の後半の配列の要素データ列（ＶＲ３２〜ＶＲ６３）に該当する。このため、Word命令Ｗ２の後半の要素データ列の読み出し処理が終了してから、後続のHalfwordＨＷ２の要素データ列ｖｒ１［ＨＷ］への演算結果の出力が行われる必要がある。これにより、演算パイプラインＰ１は、６サイクル目以降に、後続のHalfwordＨＷ２のＥＸステージの処理を開始する（ＷＡＲハザードによる遅延）。これにより、HalfwordＨＷ２の処理は、演算パイプラインＰ１が処理を開始可能な２サイクル目から４サイクル分Ｄ２遅延する。
【００５９】
このように、例えば、Word命令の後続にHalfWord命令が実行される場合であって、先行のWord命令の後半の要素データと、後続のHalfWord命令の要素データに依存関係がある場合、後続のHalfWord命令の発行が遅延される。このような場合、ベクトルプロセッサ１は、後続のWord命令を分割することによって、後続命令の発行の遅延を改善する。
【００６０】
［命令の分割］
図９は、図８のWord命令の分割による後続のHalfWord命令の処理シーケンスについて説明する例図である。同図の処理シーケンス図Ｚ３−１は図８の処理シーケンス図Ｚ２−１に、処理シーケンス図Ｚ３−２は図８の処理シーケンス図Ｚ２−２に対応する。
【００６１】
まず、処理シーケンス図Ｚ３−１について説明する。同図において、Word命令Ｗ１が、２つの分割Word命令Ｗ１−１、Ｗ１−２に分割されている。分割Word命令Ｗ１−１、Ｗ１−２は、それぞれ、要素データ列ｖｒ０［Ｗ］の配列が半分に区分された区分要素データ列ｖｒ０−１［Ｗ］、ｖｒ０−２［Ｗ］を処理対象とする。具体的に、区分要素データ列ｖｒ０−１［Ｗ］は要素データ列ｖｒ０［Ｗ］の配列番号１〜１６、区分要素データ列ｖｒ０−２［Ｗ］は要素データ列ｖｒ０［Ｗ］の配列番号１７〜３２の要素データ列に該当する。
【００６２】
各分割Word命令Ｗ１−１、Ｗ１−２のＥＸステージに要する処理サイクル数は、処理対象の要素データ列の配列数が半分になったことにより、８サイクルから４サイクルに短縮される。また、各分割Word命令Ｗ１−１、Ｗ１−２がそれぞれ別の演算パイプラインＰ０、Ｐ１によって処理されることにより、後続のHalfword命令ＨＷ１の処理は、３サイクル目から開始可能となる。これにより、Halfword命令ＨＷ１の遅延は１サイクルＤ３に抑えられる。
【００６３】
処理シーケンス図Ｚ２−２についても同様である。同図において、Word命令Ｗ２が、２つの分割Word命令Ｗ２−１、Ｗ２−２に分割されている。分割Word命令Ｗ２−１、Ｗ２−２は、それぞれ、要素データ列ｖｒ０［Ｗ］の配列が半分に区分された区分要素データ列ｖｒ０−１［Ｗ］、ｖｒ０−２［Ｗ］を処理対象とする。これにより、各分割Word命令Ｗ２−１、Ｗ２−２のＥＸステージに要する処理サイクル数が８サイクルから４サイクルに短縮される。また、各分割Word命令Ｗ２−１、Ｗ２−２がそれぞれ別の演算パイプラインＰ０、Ｐ１によって処理されることにより、後続のHalfword命令ＨＷ２の処理は、３サイクル目から開始可能となる。これにより、Halfword命令ＨＷ２の遅延は１サイクルＤ４に抑えられる。
【００６４】
このように、命令の分割によって、処理のスループットが改善される。ただし、このとき、ベクトルプロセッサは命令の分割によって、別の遅延要因を生じることがある。
【００６５】
［命令分割による別の遅延］
図１で前述したように、本実施の形態例におけるベクトルプロセッサ１は複数の演算ユニットＵ０〜Ｕ３を有するが、一部の演算ユニット（以下、特定演算ユニット）Ｕ３は、通常の演算に加えて、除算演算等の特定の演算処理を行う。このため、除算命令は特定演算ユニットＵ３に対応する演算パイプライン（特定演算パイプライン）Ｐ３によって、処理される必要がある。しかしながら、Word命令が分割された複数の分割Word命令がそれぞれ演算パイプラインで処理されることにより、特定演算パイプラインＰ３が使用されることがある。このとき、Word命令の後続に除算命令がある場合、特定演算パイプラインＰ３が空き状態になるまで除算命令の発行が遅延され、処理のスループットが低下する。具体例に基づいて説明する。
【００６６】
図１０は、命令の分割の有無による処理シーケンスを説明する例図である。処理シーケンス図Ｚ４−１は命令分割を行う場合、処理シーケンス図Ｚ４−２は命令分割を行わない場合における処理シーケンス図の一例である。同図において、マス目内の数字１〜６は命令１〜命令６を示し、各命令は、命令１から命令６にかけて順に処理される。この例において、命令３はWord命令、その他の命令１、２、４〜６はHalfWord命令である。また、命令４は除算命令であり、特定演算パイプラインＰ３でのみ処理可能である。
【００６７】
この例において、Word命令３の要素データ列（１列〜３２列）のうち後半の要素データ列（１７列〜３２列）は、HalfWord命令５の要素データ列と依存関係にある。これにより、命令５のＥＸステージの処理は、命令３の後半の要素データ列の値が確定する８サイクル目から開始可能である。そこで、処理のスループットを向上するため、命令３が分割され、各分割命令が例えば演算パイプラインＰ２、Ｐ３で処理される。しかし、特定演算パイプラインＰ３が使用されることにより、かえって、除算命令４は、特定演算パイプラインＰ３が空き状態となるまで待機されることになる。この結果、命令５の処理は９サイクル目から開始可能となり、命令３を分割しない場合（Ｚ４−２）に対して、開始サイクルが１サイクル遅延する。
【００６８】
＜第１の実施の形態例＞
そこで、本実施の形態例におけるベクトルプロセッサ１は、発行対象の命令の要素データが分割された複数の分割命令が特定の演算パイプラインを占有するとき、発行対象の命令に後続する命令に除算演算等の特定の演算パイプラインでのみ処理される特定命令がある場合は発行対象の命令を分割せずに発行する。一方、発行対象の命令に後続する特定命令がない場合、ベクトルプロセッサ１は、発行対象の命令を分割した複数の分割命令を発行する。
【００６９】
つまり、本実施の形態例におけるベクトルプロセッサ１は、分割対象の命令（図１０の例では、命令３）の後続に特定演算パイプラインＰ３でしか処理できない特定命令（図１０の例では、命令４）があり、分割対象の命令を分割して発行することにより特定パイプラインＰ３を占有し特定命令の発行が遅延する場合、分割対象の命令を分割することなく元の1命令として発行する。
【００７０】
［命令の分割の判定］
図１０の処理シーケンス図Ｚ４−２は、命令３を分割しない場合の処理シーケンス図の一例である。本実施の形態例におけるベクトルプロセッサ１は、分割対象の命令３の後続に特定パイプラインＰ３でのみ処理可能な命令４があり、命令３の分割命令が特定演算パイプラインＰ３を占有する場合、命令３の分割を行わない。これにより、命令３が１つの演算パイプラインＰ２で処理され、命令４は特定演算パイプラインＰ３で４サイクル目から処理可能となる。また、命令５は、命令３の配列後半の要素データとの依存関係に基づいて、８サイクル目から処理が開始される。
【００７１】
この結果、命令３を分割する場合（Ｚ４−１）に対して、命令５の開始サイクルが１サイクル分Ｄ５早まる。これにより、処理のスループットが改善される。このように、本実施の形態例にベクトルプロセッサは、発行対象の命令の要素データが分割された複数の分割命令が特定の演算パイプラインを占有するとき、発行対象の命令に後続する命令に特定命令がある場合は、命令の分割を行わないことにより、処理のスループットを改善する。
【００７２】
また、本実施の形態例におけるベクトルプロセッサ１は、特定命令があることにより発行対象の命令を分割しないとき、発行対象の命令の要素データ列の処理順を、後続の命令と依存関係のある要素データ列が優先して処理されるように変更することで、処理のスループットをさらに改善する。
【００７３】
つまり、本実施の形態例におけるベクトルプロセッサ１は、命令３の要素データ列のうち、命令５の要素データ列と依存関係のある後半の要素データ列を優先して処理することによって、命令５の処理の開始サイクルを早めることを可能にする。続いて、具体例に基づいて説明する。
【００７４】
［命令の要素データの処理順の変更］
図１１は、命令の要素データ列の処理順の変更による処理シーケンスを説明する例図である。図Ｚ５−１は、命令３の要素データ列の処理順を変更しない場合、図Ｚ５−２は、命令３の要素データ列の処理順を変更する場合における処理シーケンス図である。図１１のベクトルレジスタ５−５は、命令３の配列番号１〜３２の演算結果が格納される単位ベクトルレジスタ（ＶＲ０〜ＶＲ６３）を示す。レジスタＶＲ０〜ＶＲ６３のうち、レジスタＶＲ３２〜ＶＲ６２（ｖｒＡ）には、命令５で処理対象となる要素データが格納される。
【００７５】
図１１の処理シーケンス図Ｚ５−１では、配列番号１〜１６の要素データ列（ＶＲ０〜ＶＲ３１）がサイクル３〜６で、配列番号１７〜３２の要素データ列ｖｒＡ（ＶＲ３２〜ＶＲ６２）がサイクル７〜１０で処理される。つまり、要素データ列が番号の小さい配列から順に処理される。このため、命令５の処理は、８サイクル目から開始可能となる。
【００７６】
これに対し、処理シーケンス図Ｚ５−２では、配列番号１７〜３２の要素データ列ｖｒＡ（ＶＲ３２〜ＶＲ６２）が、配列番号１〜１６の要素データ列（ＶＲ０〜ＶＲ３１）に優先して処理される。これにより、命令５と依存関係のある要素データ列ｖｒＡの値がサイクル３〜６で確定し、命令５の処理は４サイクル目から開始可能となる。この例では、命令４の処理開始サイクル（４サイクル目）に続く５サイクル目で、命令５の処理が開始される。これにより、命令５の処理の開始サイクルが３サイクル分Ｄ６、早くなる。
【００７７】
このように、本実施の形態例にベクトルプロセッサは、特定命令があることにより発行対象の命令を分割しないとき、発行対象の命令の要素データ列を区分した区分要素データ列のうち、後続の命令と依存関係にある区分要素データ列が優先して処理されるように、命令の要素データ列の処理順を変更して発行する。これにより、ベクトルプロセッサは、命令の分割を行わないことによって改善された処理のスループットをさらに改善することができる。また、命令の分割を行わないことによって処理のスループットが低下した場合であっても、処理のスループットを改善することができる。
【００７８】
続いて、本実施の形態例におけるベクトルプロセッサ１の処理について、ベクトルプロセッサ１のデコード発行部４の構成図と、デコード発行部４の処理のフローチャート図に基づいて順次説明する。
【００７９】
［本実施の形態例におけるデコード発行部の構成］
図１２は、本実施の形態例のベクトルプロセッサ１におけるデコード発行部４の命令発行制御部１０の構成を示す例図である。命令発行制御部１０は、例えば、命令データサイズ判定部１１、後続命令特定ＰＬ使用判定部１２、命令分割部１３、後続命令データ依存判定部１４、ベクトル命令順序並び替え部１５、ベクトル命令順序記憶部１６、分割命令接続部１７、命令発行可否判定部１８、命令バッファ１９を有する。
【００８０】
命令フェッチ部３は、命令メモリ２から読み出した命令をデコード発行部４に入力する。そして、デコード発行部４の命令発行制御部１０は、命令の分割の及び要素データの処理順の変更の要否判定に基づいて必要に応じて命令を制御し、シーケンサＳ０〜Ｓ３を介して演算ユニットＵ０〜Ｕ３に入力する。続いて、デコード発行部４の命令発行制御部１０における各部の処理の詳細について、フローチャート図に基づいて説明する。
【００８１】
［本実施の形態例におけるデコード発行部の処理の流れ］
図１３は、デコード発行部４の命令発行制御部１０の処理の詳細を説明するフローチャート図である。命令発行制御部１０の命令データサイズ判定部１１は、まず、命令フェッチ部３から取得した命令の要素データのビット幅を判定する。具体的に、命令データサイズ判定部１１は、要素データのビット幅が演算器の処理ビット数と同一であるか否かを判定する（Ｓ１１）。同一である場合（Ｓ１１のＹＥＳ）、命令の変更は行われない。これは、例えば、図４のように、演算器が１６ビット演算器の例において、Halfword命令の場合を示す。
【００８２】
一方、要素データのビット幅が演算器の処理ビット数と異なる場合（Ｓ１１のＮＯ）、即ち、命令の要素データのビット幅が演算器の処理ビット数より大きい場合、後続命令特定ＰＬ使用判定部１２は、取得した対象命令に後続する命令に特定の演算パイプラインＰ３でのみ処理可能な命令があるか否かを判定する（Ｓ１２）。要素データのビット幅が演算器の処理ビット数より大きい命令とは、図４のような１６ビット演算器の例において、Word命令またはDoubleword命令等を示す。このとき、後続命令は、多くとも、対象命令を分割した場合の複数の分割命令の処理が終了する前に発行される命令を含む。
【００８３】
後続する命令に特定演算パイプラインＰ３でのみ処理可能な特定命令がある場合（Ｓ１２のＹＥＳ）、後続命令特定ＰＬ使用判定部１２は、さらに、対象命令を分割して発行することにより、特定演算パイプラインＰ３を占有するか否かを判定する（Ｓ１３）。占有しない場合（Ｓ１３のＮＯ）、及び、後続する命令に特定命令がない場合（Ｓ１２のＮＯ）、命令分割部１３は、対象命令を複数の分割命令に分割する（Ｓ１４）。
【００８４】
命令の分割は、１要素データにＭ（Ｍ≧１）×Ｎ（Ｎ≧２）個の演算器を要する発行対象の命令（先行命令）に後続する命令（後続命令）に、１要素データにＭ個の演算器を要する命令であって、当該発行対象の命令の要素データ列がＮ個に区分された第１区分要素データ列とその後に処理される第２区分要素データ列のうち、第２区分要素データ列と依存関係がある後続命令がある場合に行われる。命令の分割によって、発行対象の先行命令は、第１、２区分要素データ列を処理対象とするＮ個の分割命令が生成され、発行される。このとき、後続命令は、多くとも発行対象のビット幅が後続命令のＮ倍である先行命令の処理が終了する前に発行される命令を含む。
【００８５】
例えば、図１０のように、図４のような１６ビット演算器の例において、先行命令がWord命令（３２ビット）、後続命令がHalfword命令であるとき、次のように命令の分割が行われる。具体的に、Word命令の後続に、Word命令の要素データ列が２つ（Ｎ個）に区分された区分要素データ列のうち後に処理される区分要素データ列と依存関係があるHalfword命令がある場合に、Word命令の分割が行われる。このとき、Word命令は、２つ（Ｎ個）の区分要素データ列を処理対象とする２つの分割命令に分割され、発行される。
【００８６】
さらに、図４のような１６ビット演算器の例において、先行命令がDoubleWord命令（６４ビット）、後続命令がHalfword命令（１６ビット）である場合について例示する。このとき、DoubleWord命令の後続に、DoubleWord命令の要素データ列が４つ（Ｎ個）に区分された区分要素データ列のうち、初めに処理される区分要素データ列以外の区分要素データ列と依存関係があるHalfword命令がある場合に、DoubleWord命令の分割が行われる。このとき、DoubleWord命令は、４つの区分要素データ列を処理対象とする４つ（Ｎ個）の分割命令に分割され、発行される。
【００８７】
なお、図４のような１６ビット演算器の例において、先行命令がDoubleWord命令（６４ビット）、後続命令がWord命令（３２ビット）である場合について例示する。このとき、DoubleWord命令の後続に、DoubleWord命令の要素データ列が２つ（Ｎ個）に区分された区分要素データ列のうち、初めに処理される区分要素データ列以外の区分要素データ列と依存関係があるWord命令がある場合に、DoubleWord命令の分割が行われる。このとき、DoubleWord命令は２つ（Ｎ個）の分割命令に分割され、発行される。
【００８８】
このように、ビット幅が後続命令のＮ倍である先行命令がＮ個に分割されることによって、先行命令と後続命令の処理サイクル数が同一になる。これにより、先行及び後続の命令間で処理対象の要素データ列が重複する場合であっても、サイクル単位に命令がフェッチされるプロセッサにおいて各命令の処理サイクル数が同一化されることによりデータハザードによる遅延が回避または緩和される。従って、要素データのビット幅が異なる命令を処理するベクトルプロセッサにおいて、命令間の要素データのビット幅が異なることに起因して発生する処理のスループット低下が改善される。
【００８９】
フローチャート図に戻り、一方、特定の演算パイプラインを占有するとき（Ｓ１３のＹＥＳ）、命令分割部１３は、対象命令の要素データ列を、Ｎ個の区分要素データ列に区分しておく（Ｓ１５）。そして、後続命令データ依存判定部１４は、初めに処理される区分要素データ列以外の区分要素データ列と、後続命令の要素データ列とに依存関係があるか否かを判定する（Ｓ１６）。このとき、後続命令は、多くとも発行対象のビット幅が後続命令のＮ倍である先行命令の処理が終了する前に発行される命令を含む。
【００９０】
依存関係がある場合（Ｓ１６のＹＥＳ）、ベクトル命令順序並び替え部１５は、対象命令の区分要素データの処理順を、依存関係のある区分要素データ列が優先して処理されるように並び替えることによって、依存関係が解消されるか否かを判定する（Ｓ１７）。解消される場合（Ｓ１７のＹＥＳ）、ベクトル命令順序並び替え部１５は、発行対象の命令の要素データ列の処理順を、依存関係のある区分要素データ列が優先して処理されるように、区分要素データ単位に並び替える（Ｓ１８）。そして、ベクトル命令順序記憶部１６及び分割命令接続部１７は、区分要素データ列を接続した変更後の命令を命令バッファ１９に記憶する。
【００９１】
一方、依存関係がない場合（Ｓ１６のＮＯ）、及び、依存関係が解消されない場合（Ｓ１７のＮＯ）、ベクトル命令順序並び替え部１５は、対象命令の区分要素データの処理順の並び替えを行わない。そして、ベクトル命令順序記憶部１６及び分割命令接続部１７は、命令を変更することなく、命令バッファ１９に記憶する。
【００９２】
続いて、命令発行可否判定部１８は、命令バッファ１９に記憶された命令が発行可能かを判定し、シーケンサＳ０〜Ｓ３を介して、演算パイプラインに入力する。この処理について、フローチャート図に基づいて説明する。
【００９３】
図１４は、命令発行制御部１０における命令発行可否部１８の処理について説明するフローチャート図である。同図において、命令発行可否判定部１８は、空き状態の演算パイプラインがあるか否かを判定する（Ｓ２１）。空き状態の演算パイプラインがない場合（Ｓ２１のＮＯ）、命令発行可否判定部１８は、命令の発行を待機させる（Ｓ２５）。一方、空きの演算パイプラインがある場合（Ｓ２１のＹＥＳ）、命令発行可否判定部１８は、発行対象の命令と、既に演算パイプラインで処理中の命令との間に、要素データ列の依存関係があるか否かを判定する（Ｓ２２）。依存関係がある場合、即ち、データハザードが発生する場合（Ｓ２２のＹＥＳ）、命令発行可否判定部１８は、命令の発行を待機する（Ｓ２５）。
【００９４】
一方、依存関係がない場合（Ｓ２２のＮＯ）、命令発行可否判定部１８は、空き状態の演算パイプラインにシーケンサを介して命令を発行する。そして、命令発行可否判定部１８は、発行した命令が分割命令であって、同一の命令に基づいて生成された他の分割命令が残存している場合は（Ｓ２４のＹＥＳ）、同様にして空き状態の演算パイプラインがあるか否かを判定する（Ｓ２１）。このようにして、必要に応じて分割または変更された命令が演算パイプラインに発行される。
【００９５】
以上のように、本実施の形態例におけるベクトルプロセッサは、発行対象の命令の要素データが分割された複数の分割命令が特定の演算ユニットで処理されるとき、発行対象の命令に後続する命令に特定の演算ユニットでのみ処理可能な命令がない場合には分割命令を発行する。そして、ベクトルプロセッサは、特定の演算ユニットでのみ処理可能な命令がある場合には、発行対象の命令を分割せずに発行する。
【００９６】
これにより、本実施の形態例におけるベクトルプロセッサは、命令の分割によって特定の演算ユニットを占有することによって、当該演算ユニットでのみ処理可能な特定の命令の発行が遅延されることを回避する。また、ベクトルプロセッサは、命令の分割をしても特定演算ユニットを占有しない場合、または、後続に特定命令がない場合は、命令を分割することによって、後続命令とのデータハザードによる遅延を改善する。
【００９７】
また、本実施の形態例におけるベクトルプロセッサは、発行対象の命令を分割しないとき、発行対象の要素データ列が区分された区分要素データ列のうち、初めに処理される区分要素データ列以外の区分要素データ列が後続の命令と依存関係のある場合に、当該依存関係のある区分要素データ列が優先して処理されるように前記要素データ列の処理順を変更して処理する。
【００９８】
これにより、本実施の形態例におけるベクトルプロセッサは、分割対象の命令が分割されず元の１の命令として発行される場合に、後続の命令と依存関係のある一部の要素データ列を優先して先に処理することによって、後続の命令の発行を早めることができる。
【００９９】
以上のようにして、本実施の形態例におけるベクトルプロセッサによると、要素データのビット幅の異なる命令が混在して処理される場合であっても、命令の分割に因る特定命令の発行遅延を回避すると共に、データハザードに基づく後続命令の発行遅延を回避または緩和することができる。これにより、本実施の形態例におけるベクトルプロセッサは、要素データのビット幅の異なる命令が混在して処理される場合であっても、処理のスループットを向上させることができる。
【０１００】
なお、図４〜図１１では、演算器Ｕ０−１〜Ｕ０−８の処理ビット数が１６ビットであるベクトルプロセッサについて例示したが、別の実施の形態例として、演算器の処理ビット数がそれぞれ８ビットであって、命令の配列数ＶＬが６４に設定されるベクトルプロセッサについて例示する。
【０１０１】
＜第２の実施の形態例＞
演算器の処理ビット数が８ビットであるベクトルプロセッサは、例えば、要素データのビット幅が１６ビットのHalfword命令、３２ビットのWord命令、６４ビットDoubleWord命令に加えて、８ビットのByte命令を処理対象とする。また、この例において、６つの演算パイプラインＰ０〜Ｐ５で処理が行われるものとする。また、演算パイプラインＰ５は、特定の演算命令を処理する特定演算パイプラインＰ５である。また、前述したとおり、配列数ＶＬは６４に設定される。この場合における命令の分割の判定、及び、要素データ列の処理順の変更について、具体例に基づいて説明する。
【０１０２】
［命令の分割の判定］
図１５は、第２の実施の形態例における命令の分割の有無による処理シーケンスを説明する例図である。処理シーケンス図Ｚ６−１は命令分割を行う場合、処理シーケンス図Ｚ６−２は命令分割を行わない場合における処理シーケンス図の一例である。同図において、マス目内の数字１１〜１６は命令１１〜命令１６を示し、各命令は、命令１１から命令１６にかけて順に処理される。また、命令１３はWord命令、その他の命令１１〜１２、１４〜１６はByte命令である。また、命令１４は除算命令であり、演算パイプラインＰ５でのみ処理可能である。
【０１０３】
この例において、各命令の要素データ列の配列数ＶＬは６４であって、各演算ユニットは８ビット演算器を８つ有する。即ち、演算ユニットは、１サイクルに８×８ビットの処理を可能とする。したがって、要素データのビット幅が８ビットのByte命令の場合、１サイクルで８列分（８／６４）の配列を処理可能とし、１つの命令は８サイクルかけて処理される。一方、要素データのビット幅が３２ビットのWord命令の場合、１つの要素データの処理に４つの演算ユニットを使用することから、１サイクルで２列分（２／６４）の配列を処理可能とし、１つの命令は３２サイクルかけて処理される。
【０１０４】
また、この例において、命令１３の１〜６４番目の配列の要素データ列のうち、４つに区分した区分要素データ列のうち、２番目に処理される区分要素データ列ｖｒＢ（１７〜３２番目の配列の要素データ列）と、命令１５の要素データ列ｖｒＢに依存関係がある。従って、命令１５は、命令１３の区分要素データ列ｖｒＢの値が確定するまで、処理が待機される。
【０１０５】
そこで、処理シーケンス図Ｚ６−１のように、命令１３が４つ（Ｎ個）の分割命令に分割され、演算パイプラインＰ２〜５でそれぞれ処理される。しかしながら、分割命令によって特定演算パイプラインＰ５が使用されることにより、後続の除算命令１４は、特定演算パイプラインＰ５が空き状態となるまで待機される。この結果、命令１４の次にフェッチされる命令１５の演算処理は１５サイクル目から開始可能となり、命令１３を分割しない場合（Ｚ６−２）に対して、開始サイクルが３サイクルＤ７遅延する。
【０１０６】
そこで、本実施の形態例におけるベクトルプロセッサ１は、分割命令が特定演算パイプラインＰ５を占有し、分割対象の命令１３の後続に特定パイプラインＰ５でのみ処理可能な命令１４がある場合、分割対象の命令１３の分割を行わない。これにより、処理シーケンス図Ｚ６−２のように、命令１３が１つの演算パイプラインＰ２で処理されるため、命令１４は、特定演算パイプラインＰ５で４サイクル目から処理可能となる。また、このとき、命令１５は、命令１３の要素データ列ｖｒＢとの依存関係に因り、１２サイクル目から処理が開始可能となる。この結果、命令１３を分割する場合よりも命令１５の開始サイクルが３サイクルＤ７早まり、処理のスループットが改善する。
【０１０７】
このように、分割対象の命令（この例では、命令１３）の分割数が多い場合、命令が分割されることによってより多くの演算パイプラインを占有するため、特定演算パイプラインを占有する確率が高くなる。これにより、特定命令の遅延がより発生し易くなる。そのため、本実施の形態例にベクトルプロセッサは、発行対象の命令の要素データが分割された複数の分割命令が特定の演算パイプラインを占有するとき、発行対象の命令に後続する命令に特定命令がある場合は、命令の分割を行わないことにより、処理のスループットをより効果的に改善する。
【０１０８】
続いて、第２の実施の形態例において要素データの処理順を変更する例について説明する。
【０１０９】
［命令の要素データの処理順の変更］
図１６は、第２の実施の形態例における命令の要素データ列の処理順の変更による処理シーケンス図を説明する例図である。図Ｚ７−１は、命令１３の要素データ列の処理順を変更しない場合、図Ｚ７−２は、命令１３の要素データ列の処理順を変更する場合における処理シーケンス図である。処理シーケンス図Ｚ７−１において、命令１３は、配列番号（１〜６４）の小さい要素データ列から順に処理される。このため、命令１５の処理は、１２サイクル目から開始可能となる。
【０１１０】
これに対し、処理シーケンス図７−２では、配列番号１〜６４の要素データ列のうち、後続の命令１５と依存関係のある一部の区分要素データ列が優先して処理される。命令１３の要素データ列は４つの区分要素データ列（配列番号１〜１６、配列番号１７〜３２、配列番号３３〜４８、配列番号４９〜６４）に区分される。この例において、区分要素データ列のうち、配列番号１７〜３２の要素データ列ｖｒＢが、命令１５の要素データ列と依存関係にあるため、本実施の形態例におけるベクトルプロセッサは、配列番号１７〜３２の区分要素データ列ｖｒＢを優先して処理する（サイクル３〜１０）。
【０１１１】
これにより、区分要素データ列ｖｒＢの値がサイクル３〜１０で確定するため、命令１５の演算処理は４サイクル目から開始可能となる。この例では、命令１４の処理開始サイクル（４サイクル目）に続く５サイクル目で、命令１５の処理が開始される。これにより、命令１５の処理の開始サイクルが７サイクルＤ８、早くなる。
【０１１２】
このように、本実施の形態例にベクトルプロセッサは、特定命令があることにより発行対象の命令を分割しないとき、発行対象の命令の要素データ列を区分した区分要素データ列のうち、後続の命令と依存関係にある区分要素データ列が優先して処理されるように、命令の要素データ列の処理順を変更して発行する。これにより、本実施の形態例のように発行対象の命令に要する処理サイクル数が多い場合、ベクトルプロセッサは、処理順を変更することによって、より効果的に処理のスループットを改善できる。
【０１１３】
以上の実施の形態をまとめると、次の付記のとおりである。
【０１１４】
（付記１）
要素データ列の演算を行う命令をメモリから取得する命令フェッチ手段と、
前記取得された命令を復号し当該復号された命令をサイクル単位に発行するデコード発行手段と、
前記発行された命令をそれぞれ処理する演算ユニットを複数有する演算手段と、
前記要素データ列が連続するアドレスに格納されるレジスタとを有し、
前記複数の演算ユニットは、第１種命令を処理する第１の演算ユニットと、第１種命令に加えて第２種命令を処理する第２の演算ユニットとを有し、
前記デコード発行手段は、発行対象の命令の要素データが分割された複数の分割命令が前記第２の演算ユニットで処理されるとき、発行対象の命令に後続する命令に前記第２種命令がない場合に前記分割命令を発行し、前記第２種命令がある場合は前記発行対象の命令を分割せずに発行するベクトルプロセッサ。
【０１１５】
（付記２）
付記１において、
前記演算ユニットは１つまたは複数の演算器をそれぞれ有し、
前記第１、２種命令は、さらに、要素データ列を構成する各要素データが第１ビット幅であってそれぞれＭ（Ｍ≧１）個の演算器によって処理される第１ビット幅命令と、前記各要素データが第１ビット幅のＮ（Ｎ≧２）倍であってそれぞれＭ×Ｎ個の演算器によって処理される第２ビット幅命令とを有し、
前記発行対象の前記第２ビット幅命令に後続する命令に、当該第２ビット幅命令の要素データ列がＮ個に区分された第１区分要素データ列とその後に処理される第２区分要素データ列のうち、前記第２区分要素データ列と依存関係がある前記第１ビット幅命令がある場合に、前記複数の分割命令は、前記第１、２区分要素データ列を処理対象とする前記Ｎ個の命令として分割されるベクトルプロセッサ。
【０１１６】
（付記３）
付記２において、
前記デコード発行手段は、前記発行対象の命令を分割しないとき、前記発行対象の第２ビット幅命令の前記第２区分要素データ列が優先して処理されるように前記要素データ列の処理順を変更して第２ビット幅命令を発行するベクトルプロセッサ。
【０１１７】
（付記４）
付記１乃至３のいずれかにおいて、
前記発行対象の命令に後続する命令には、多くとも前記複数の分割命令の処理が終了する前に発行される命令が含まれるベクトルプロセッサ。
【０１１８】
（付記５）
付記２乃至４のいずれかにおいて、
前記発行対象の第２ビット幅命令に後続する命令には、多くとも前記発行対象の第２ビット幅命令の処理が終了する前に発行される命令が含まれるベクトルプロセッサ。
【０１１９】
（付記６）
要素データ列の演算を行う命令をメモリから取得する命令フェッチ工程と、
前記取得された命令を復号し当該復号された命令をサイクル単位に発行するデコード発行工程と、を有し、
前記発行された命令は演算ユニットによってそれぞれ処理され、複数の前記演算ユニットのうち第１の演算ユニットは第１種命令を処理し、第２の演算ユニットは第１種命令に加えて第２種命令を処理し、前記要素データ列はレジスタの連続するアドレスに格納され、
前記デコード発行工程は、発行対象の命令の要素データが分割された複数の分割命令が前記第２の演算ユニットで処理されるとき、発行対象の命令に後続する命令に前記第２種命令がない場合に前記分割命令を発行し、前記第２種命令がある場合は前記発行対象の命令を分割せずに発行するベクトルプロセッサの処理方法。
【符号の説明】
【０１２０】
１：ベクトルプロセッサ、２：命令メモリ、３：命令フェッチ部、４：デコード発行部、５：ベクトルレジスタ、６：スカラレジスタ、１０：命令発行制御部、Ｓ０〜Ｓ３：シーケンサ、Ｕ０〜Ｕ３：演算ユニット
【図１】
0005834997.tif 000002
【図２】
0005834997.tif 000003
【図３】
0005834997.tif 000004
【図４】
0005834997.tif 000005
【図５】
0005834997.tif 000006
【図６】
0005834997.tif 000007
【図７】
0005834997.tif 000008
【図８】
0005834997.tif 000009
【図９】
0005834997.tif 000010
【図１０】
0005834997.tif 000011
【図１１】
0005834997.tif 000012
【図１２】
0005834997.tif 000013
【図１３】
0005834997.tif 000014
【図１４】
0005834997.tif 000015
【図１５】
0005834997.tif 000016
【図１６】
0005834997.tif 000017