(57)【要約】【課題】複数命令を同時発行し、複数の演算部で並行に処理するプロセッサを有し、分岐ペナルティが小さく、回路規模の小さな演算装置の実現。【解決手段】複数命令を同時発行するプロセッサ11と、複数バンク31A-31Dおよび複数バンクの出力を結合する結合部32を有し、アドレスを指定することにより複数バンクから命令を出力する命令メモリ12と、を有し、プロセッサ11は、命令メモリより取得する命令を指示し、命令をフェッチするフェッチアドレス生成部21と、命令をデコードすると共に、命令が分岐命令であるか判定し、分岐命令である場合に分岐命令のアドレスを出力するデコード部25と、命令を処理する複数の演算部26A-26Cと、を有し、フェッチアドレス生成部は、複数の演算部の処理結果、デコード部の判定結果および分岐命令のアドレスに基づいて、命令メモリのいずれのバンクのいずれのアドレスから命令を取得するか決定する。【選択図】図２
2015184979.tif 000002
【特許請求の範囲】
【請求項１】
複数命令を同時発行するプロセッサと、
複数バンクおよび前記複数バンクの出力を結合する結合部を有し、各バンクは複数のアドレスを有し、各バンクの前記複数のアドレスの１つを指定することにより、前記複数バンクに格納された命令を出力する命令メモリと、を備え、
前記プロセッサは、
前記命令メモリより取得する命令を指示し、前記命令メモリの出力した命令をフェッチするフェッチアドレス生成部と、
前記フェッチした命令をデコードすると共に、命令が分岐命令であるか判定し、分岐命令である場合に分岐命令のアドレスを出力するデコード部と、
前記デコード部のデコードした命令を処理する複数の演算部と、を備え、
前記フェッチアドレス生成部は、前記複数の演算部の処理結果、前記デコード部の判定結果および分岐命令のアドレスに基づいて、前記命令メモリのいずれのバンクのいずれのアドレスから命令を取得するか決定することを特徴とする演算装置。
【請求項２】
前記フェッチアドレス生成部は、前記デコード部が判定した分岐命令の分岐を予測する分岐予測部を有し、前記分岐予測部の予測結果に基づいた優先順位にしたがって前記命令メモリから取得する命令を決定する請求項１に記載の演算装置。
【請求項３】
前記フェッチアドレス生成部は、前記命令メモリから一度に取得した複数の命令に複数の分岐命令が含まれる場合、前記分岐予測部の予測結果に基づいた前記複数の分岐命令の優先順位を判定し、判定した優先順位にしたがって前記命令メモリから取得する命令を決定する請求項１または２に記載の演算装置。
【請求項４】
前記フェッチアドレス生成部は、前記命令メモリから一度に取得した複数の命令に複数の分岐命令が含まれる場合、前記複数の分岐命令の固定優先順位に基づいて前記複数の分岐命令の優先順位を判定し、判定した優先順位にしたがって前記命令メモリから取得する命令を決定する請求項１に記載の演算装置。
【請求項５】
複数の演算部を有し、複数命令を同時発行するプロセッサが、複数バンクおよび前記複数バンクの出力を結合する結合部を有し、各バンクは複数のアドレスを有し、各バンクの前記複数のアドレスの１つを指定することにより、前記複数バンクに格納された命令をバンク単位で出力する命令メモリから命令を取得する命令フェッチ方法であって、
前記命令メモリより命令を取得し、
前記取得した命令をデコードすると共に、命令が分岐命令であるか判定し、分岐命令である場合に分岐命令のアドレスを出力し、
前記デコードした命令を、前記複数の演算部で処理し、
前記複数の演算部の処理結果、前記命令デコードの判定結果および分岐命令のアドレスに基づいて、前記命令メモリのいずれのバンクのいずれのアドレスから命令を取得するか決定する、ことを特徴とする命令フェッチ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算装置および命令フェッチ方法に関する。
【背景技術】
【０００２】
パイプライン方式のプロセッサや、複数の演算部を有するプロセッサ、さらにこれらを組み合わせたパイプライン方式の複数の演算部を有するプロセッサなど、演算処理速度を向上するための各種のプロセッサが提案されている。具体的には、スーパー・スカラプロセッサやＶＬＩＷ(Very Long Instruction Word set)プロセッサが、複数の演算部を有するプロセッサとして知られている。以下の記載では、スーパー・スカラプロセッサを使用する演算装置を例として説明する。
【０００３】
一般に、プロセッサは、プログラムカウンタを有し、命令メモリにアドレス順に格納された命令列を順に取得（フェッチ）して実行するようにプログラムカウンタの値を変化させ、分岐命令の場合にはプログラムカウンタの値を分岐先のアドレスに変化させる。さらに、プロセッサにはインオーダー(In-order)型とアウトオブオーダー(Out-of-order)型がある。インオーダー型のプロセッサの場合には、上記のように、実行する命令列は命令メモリに順に格納されているが、アウトオブオーダー型のプロセッサの場合には、これに限定されない。ここでは、インオーダー型のスーパー・スカラプロセッサを例として説明する。
【０００４】
スーパー・スカラプロセッサ（以下、プロセッサと称する場合がある）は、複数の演算部を有し、複数の演算部に対応してフェッチした複数の命令をデコードして保持する命令バッファを有する。スーパー・スカラプロセッサを含む演算装置では、命令メモリとプロセッサの間をバスで接続し、プロセッサが命令メモリから取得する命令のアドレスを指定する。命令メモリは、指定されたアドレスの命令を読み出してバスを介して出力し、プロセッサがバス上の命令をフェッチする。複数の命令を並列に取得できるように、バスを拡張し、命令メモリのビット幅も同様に拡張し、複数の命令を並列にフェッチできるようにする。この構成では、同時にフェッチする命令のアドレス関係は固定される。
【０００５】
命令メモリを複数バンクに分割し、各バンクは１つの出力ポートを有し、バンク内のアドレスを指定することにより、複数の出力ポートから複数の命令が出力されるインターリーブ方式の命令メモリが提案されている。スーパー・スカラプロセッサを含む演算装置に、インターリーブ方式の命令メモリを使用することが考えられる。この場合、スーパー・スカラプロセッサは、任意のバンクから命令を取得できるようにする。
【０００６】
一般にプロセッサにおいて、分岐が発生すると分岐先命令を新たに取得するまでの間処理の実行を止めるという分岐ペナルティが発生する。例えば、演算部に供給するデコードした命令を保持する命令バッファが設けられ、命令バッファには次に実行する命令が保持されている。ここで、演算部で分岐処理が発生すると、次に実行する分岐先のアドレスの命令は命令バッファに保持されていないので、命令メモリから新たに取得する。次に実行する新たな命令を取得し、デコードが完了するまで、演算は行われない。この待機動作を、演算部のストールと称する。命令バッファに保持される命令は１つに限定されず、特にパイプライン方式のプロセッサでは、複数段の命令バッファを有するのが一般的である。パイプライン方式のプロセッサは、一般に複数段のメモリバッファを有するため、分岐が発生すると、複数の命令を新たに取得することになる。
【０００７】
スーパー・スカラプロセッサも、パイプライン方式を採用するのが一般的である。そのため、スーパー・スカラプロセッサは、分岐発生までは複数の命令を含む命令列を、複数の命令バッファに保持しておき、分岐が発生すると、複数の命令バッファは、分岐先の複数の命令を含む命令列を、命令メモリから新たに取得していた。言い換えれば、複数の命令バッファは、分岐が発生すると、それまで保持していた分岐元命令を含む複数の命令を破棄し、新たに分岐先命令をフェッチする。そのため、スーパー・スカラプロセッサの分岐ペナルティは、１命令実行型のプロセッサに比べて大きくなる。すなわち、スーパー・スカラプロセッサは、処理性能が大きい代わりに分岐ペナルティの被害も大きくなる。
【０００８】
さらに、メモリへのアクセス速度を向上するため、キャッシュメモリを設け、メモリを階層構造にすることが知られている。キャッシュを有する１命令実行型のプロセッサにおいて、分岐ペナルティを低減するため、分岐しない場合の命令列を保持する命令キャッシュと、分岐した場合の命令列を記憶する分岐用命令キャッシュと、を設けることが提案されている。命令列をあらかじめデコードして分岐命令が存在するかを検出し、分岐命令が存在する場合には、分岐用命令キャッシュに分岐先アドレスの命令をロードしておく。また、キャッシュでなく、分岐しない場合の命令列を保持する分岐元命令メモリと、分岐した場合の命令列を記憶する分岐命令メモリと、を設けることも提案されている。しかし、キャッシュを使用すると、１回目の命令メモリアクセス時にミスヒットによる分岐ペナルティがかならず発生するという問題がある。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０００−０２９６９３号公報
【特許文献２】特開２０００−０２９７０１号公報
【特許文献３】特開平３−３３９３２号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかし、スーパー・スカラプロセッサおよびインターリーブ方式の命令メモリを使用する演算装置では、分岐先アドレスの命令を保持するインターリーブ方式の命令メモリを別に設けることは行われていない。この原因は、インターリーブ方式の命令メモリを二重構成にして、分岐元命令と分岐先命令を格納すると、命令メモリの規模が大きくなるためと考えられる。これはキャッシュを設ける場合も同様であり、スーパー・スカラプロセッサ、およびインターリーブ方式の演算装置で、分岐元命令と分岐先命令の二重構成の命令キャッシュメモリを使用するものは知られていない。
【００１１】
さらに、２つ以上の分岐命令が連続する多重分岐の場合もあり、二重構成の命令メモリでは、多重分岐に対応することはできない。
【００１２】
実施形態によれば、複数命令を同時発行し、複数の演算部で並行に処理するプロセッサを有し、分岐ペナルティの小さな演算装置で、小さな回路規模で実現される。
【課題を解決するための手段】
【００１３】
実施形態の第１の態様の演算回路は、複数命令を同時発行するプロセッサと、命令メモリと、を有する。命令メモリは、複数バンクおよび複数バンクの出力を結合する結合部を有し、各バンクは複数のアドレスを有し、各バンクの複数のアドレスの１つを指定することにより、複数バンクに格納された命令を出力する。プロセッサは、フェッチアドレス生成部と、デコード部と、複数の演算部と、を有する。フェッチアドレス生成部は、命令メモリより取得する命令を指示し、命令メモリの出力した命令をフェッチする。デコード部は、フェッチした命令をデコードすると共に、命令が分岐命令であるか判定し、分岐命令である場合に分岐命令のアドレスを出力する。複数の演算部は、デコード部のデコードした命令を処理する。フェッチアドレス生成部は、複数の演算部の処理結果、デコード部の判定結果および分岐命令のアドレスに基づいて、命令メモリのいずれのバンクのいずれのアドレスから命令を取得するか決定する。
【００１４】
実施形態の第２の態様の命令フェッチ方法は、複数の演算部を有し、複数命令を同時発行するプロセッサが、命令メモリから命令を取得する命令フェッチ方法である。命令メモリは、複数バンクおよび複数バンクの出力を結合する結合部を有し、各バンクは複数のアドレスを有し、各バンクの前記複数のアドレスの１つを指定することにより、複数バンクに格納された命令をバンク単位で出力する命令メモリから命令を取得する。命令フェッチ方法によれば、命令メモリより命令を取得し、取得した命令をデコードすると共に、命令が分岐命令であるか判定し、分岐命令である場合に分岐命令のアドレスを出力する。さらに、デコードした命令を、複数の演算部で処理し、複数の演算部の処理結果、命令デコードの判定結果および分岐命令のアドレスに基づいて、命令メモリのいずれのバンクのいずれのアドレスから命令を取得するか決定する。
【発明の効果】
【００１５】
実施形態の演算装置では、複数の演算部を有し、複数命令を同時発行するプロセッサに対して、インターリーブ方式の命令メモリを設ける。そして、分岐命令の有無の判定を行い、複数の演算部の処理結果命令デコードの判定結果および分岐命令のアドレスに基づいて、命令メモリのいずれのバンクのいずれのアドレスから命令を取得するか決定する。これにより、インターリーブ方式の命令メモリからフェッチする命令を、分岐ペナルティが小さくなるように選択すれば、分岐ペナルティを小さくできる。さらに、インターリーブ方式の命令メモリから取得する命令を選択するのみで行えるので、回路規模の増加も小さい。
【図面の簡単な説明】
【００１６】
【図１】図１は、一般的なスーパー・スカラプロセッサを含む演算装置の構成例を示す図である。
【図２】図２は、第１実施形態の演算装置の構成を示す図である。
【図３】図３は、インターリーブメモリの機能を説明する図であり、（Ａ）がバンクの競合無しの場合を、（Ｂ）がバンクの競合有りの場合を示す。
【図４】図４は、命令メモリから取得する命令の優先順位の例を示す図である。
【図５】図５は、プロセッサにおけるフェッチアドレス生成部の処理を示すフローチャートである。
【図６】図６は、動作例で実行する命令列の例を示す図である。
【図７】図７は、動作例の１６パターンを示す図である。
【図８】図８は、１６パターンの１つについての動作図である。
【図９】図９は、１６パターンの１つについての動作図である。
【図１０】図１０は、１６パターンの１つについての動作図である。
【図１１】図１１は、１６パターンの１つについての動作図である。
【図１２】図１２は、１６パターンの１つについての動作図である。
【図１３】図１３は、１６パターンの１つについての動作図である。
【図１４】図１４は、１６パターンの１つについての動作図である。
【図１５】図１５は、１６パターンの１つについての動作図である。
【図１６】図１６は、１６パターンの１つについての動作図である。
【図１７】図１７は、１６パターンの１つについての動作図である。
【図１８】図１８は、１６パターンの１つについての動作図である。
【図１９】図１９は、１６パターンの１つについての動作図である。
【図２０】図２０は、１６パターンの１つについての動作図である。
【図２１】図２１は、１６パターンの１つについての動作図である。
【図２２】図２２は、１６パターンの１つについての動作図である。
【図２３】図２３は、１６パターンの１つについての動作図である。
【図２４】図２４は、図１の演算装置と第１実施形態の演算装置の分岐ペナルティの比較結果を示す図である。
【図２５】図２５は、命令がアウトオブオーダーであり、図６の命令列を処理する場合で、１番目の分岐命令で分岐すると予測し、実際に分岐し、２番目の分岐命令で分岐すると予測し、実際に分岐した場合の動作例を示す図である。
【図２６】図２６は、分岐予測機構を設けずに、命令メモリに要求するアドレスを決定する場合の固定の優先順位の例を示す図である。
【図２７】図２７は、第２実施形態の演算装置の構成を示す図である。
【図２８】図２８は、第２実施形態の演算装置に使用するプロセッサの構成を示す図である。
【図２９】図２９は、第２実施形態の演算装置の動作例を示す図である。
【図３０】図３０は、第２実施形態の演算装置で、第２実施形態のアドレス生成の制御を行わず、分岐を行うと分かると、それまでフェッチした命令をすべて廃棄し、分岐先の命令を新たにフェッチするようにした場合の動作例を示す図である。
【発明を実施するための形態】
【００１７】
実施形態を説明する前に、複数の演算部を有するスーパー・スカラプロセッサの命令フェッチ機構および命令フェッチ動作について説明する。
【００１８】
図１は、一般的なスーパー・スカラプロセッサを含む演算装置の構成例を示す図である。
【００１９】
この演算装置は、スーパー・スカラプロセッサ１０１と、命令を記憶する命令メモリ１０２と、データを記憶するデータメモリ１０３と、バス１０４と、を有する。スーパー・スカラプロセッサ１０１は、分岐元の命令を記憶する分岐元命令キャッシュ１１２と、分岐先の命令を記憶する分岐先命令キャッシュ１１３と、デコード・フェッチアドレス生成部１１５と、３個の演算部１１６Ａ−１１６Ｃと、を有する。分岐元命令キャッシュ１１２および分岐先命令キャッシュ１１３には、バス１０４、入力経路１０５および内部バス１１１を介して命令メモリ１０２から命令が転送される。キャッシュに転送する命令を制御する機構は広く知られているので、説明は省略する。デコード・フェッチアドレス生成部１１５は、分岐元命令キャッシュ１１２または分岐先命令キャッシュ１１３を指定して、取得する（フェッチする）命令のアドレスを生成すると共に、フェッチした命令をデコードして演算部１１６Ａ−１１６Ｃに供給する。演算部１１６Ａ−１１６Ｃは、供給された命令を実行し、必要に応じてデータメモリ１０３から演算に使用するデータを取得し、演算結果のデータをデータメモリ１０３に出力する。なお、図１では、命令キャッシュのみを設ける例を示したが、データキャッシュを設ける場合や、キャッシュを設けない場合もある。
【００２０】
図１の例では、デコード・フェッチアドレス生成部１１５は、実行する命令をデコードすることにより、命令が分岐命令であるかを判定し、分岐命令の場合には分岐先のアドレスを生成する。分岐先のアドレスの命令が分岐先命令キャッシュ１１３に格納されていない場合には、分岐先のアドレスの命令が命令メモリ１０２から分岐先命令キャッシュ１１３に転送される。実際に分岐するかは、分岐条件が満たされたと演算部１１６Ａ−１１６Ｃが判定した場合に決定され、次に処理する命令は分岐先命令キャッシュ１１３から取得する。したがって、この時点で、分岐先命令キャッシュ１１３と分岐元命令キャッシュ１１２の機能が交代し、元の分岐元命令キャッシュ１１２には、デコードにより判明した次の分岐命令の分岐先アドレスの命令が格納される。なお、実行する命令が、分岐元命令キャッシュ１１２および分岐先命令キャッシュ１１３に無い場合にはキャッシュミスが発生する。キャッシュミスが発生した場合には、演算部１１６Ａ−１１６Ｃは、実行する命令が分岐元命令キャッシュ１１２または分岐先命令キャッシュ１１３に転送され、デコードが完了するまで待機する。分岐元命令キャッシュ１１２および分岐先命令キャッシュ１１３への命令の転送は、一般にキャッシュ全体またはブロックごとに命令を書き換えることにより行う。
【００２１】
デコード・フェッチアドレス生成部１１５は、３個の演算部１１６Ａ−１１６Ｃのそれぞれが実行する命令を供給するため、３個のデコード部を有する。３個のデコード部は、それぞれ実行する命令を分岐元命令キャッシュ１１２または分岐先命令キャッシュ１１３から並列にフェッチする。このため、命令メモリ１０２、バス１０４、命令経路１０５、分岐元命令キャッシュ１１２または分岐先命令キャッシュ１１３は、３倍のビット幅を有し、３個のデコード部がフェッチする命令のバス幅内での位置は固定である。これは、命令キャッシュを設けずに、デコード・フェッチアドレス生成部１１５が外部メモリ１０２から直接命令を取得する場合も同様であり、命令のビット幅およびバス幅をデコード部の個数に応じて拡張する。そして、上記のように、分岐元命令キャッシュ１１２および分岐先命令キャッシュ１１３への命令の転送は、一般にキャッシュ全体またはブロックごとに命令を書き換えることにより行う。
【００２２】
しかし、スーパー・スカラプロセッサおよびインターリーブ方式の命令メモリを使用し、命令メモリを分岐元命令と分岐先命令を格納する二重構成とした演算装置は、知られていない。この理由は、インターリーブ方式の命令メモリは通常のメモリに比べて複雑な構成を有するため、それを二重構成にして、分岐元命令と分岐先命令を格納すると、命令メモリの規模が大きくなるためと考えられる。これは命令キャッシュを設ける場合も同様であり、スーパー・スカラプロセッサ、およびインターリーブ方式で分岐元命令と分岐先命令の二重構成の命令キャッシュメモリを使用する演算装置も知られていない。
【００２３】
さらに、分岐元命令と分岐先命令を格納する二重構成の命令メモリでは、１つ目までの分岐命令には対応可能であるが、分岐命令が連続または近接する場合には、２つ目以降の分岐命令に対応できず、大きな分岐ペナルティが発生する。この問題を回避するには、命令メモリを更に多重化することが考えられるが、命令メモリの容量が増加する。
【００２４】
以下に説明する実施形態では、スーパー・スカラプロセッサおよびインターリーブ方式の命令メモリを使用し、命令メモリの容量を増加させずに、多重分岐（連続した分岐命令）でも分岐ペナルティが小さい演算装置が開示される。
【００２５】
図２は、第１実施形態の演算装置の構成を示す図である。
第１実施形態の演算装置は、スーパー・スカラプロセッサ１１と、命令を記憶する命令メモリ１２と、データを記憶するデータメモリ１３と、バス１４と、を有する。スーパー・スカラプロセッサ１０１は、フェッチアドレス生成部２１と、デコード部２５と、３個の演算部２６Ａ−２６Ｃと、を有する。フェッチアドレス生成部２１は、単にアドレス生成部２１と称する場合がある。デコード部２５は、演算部２６Ａ−２６Ｃに供給する命令の順番を保持するキュー２８を有する。ここでは、デコード部２５は、３個の演算部２６Ａ−２６Ｃに対応して３個のデコード部を有し、３個のデコード部には３個のキューが設けられる。
【００２６】
フェッチアドレス生成部２１は、取得する（フェッチする）命令のアドレスを生成して命令メモリ１２に出力し、命令メモリ１２が出力する命令を、バス１４および命令経路１５を介してフェッチし、フェッチした命令をデコード部２５に出力する。デコード部２５は、フェッチアドレス生成部２１に保持された命令をデコードし、演算部２６Ａ−２６Ｃに供給する。デコード部２５は、フェッチアドレス生成部２１のフェッチした命令を、３個の演算部２６Ａ−２６Ｃのいずれにも命令を供給できるものとする。さらに、フェッチアドレス生成部２１は、デコード部２５のデコード結果から、命令が分岐命令であるか判定し、分岐命令の場合にはどのような確率で分岐するかを推定する分岐予測機構を有するものとする。演算部２６Ａ−２６Ｃは、供給された命令を実行し、必要に応じて、データメモリ１３との間でデータ経路１６を介して、演算に使用するデータを取得し、演算結果のデータを出力する。さらに、演算部２６Ａ−２６Ｃは、演算結果（分岐したか否か）を、フェッチアドレス生成部１１５およびデコード部２５のキュー２８に供給する。キュー２８は、演算部２６Ａ−２６Ｃからの演算結果に応じて演算部２６Ａ−２６Ｃに供給する命令を変更する。フェッチアドレス生成部１１５は、演算部２６Ａ−２６Ｃからの演算結果に応じて命令メモリ１２に出力要求する命令のアドレスを変更する。
【００２７】
命令メモリ１２は、複数（ここでは４個）の命令バンク３１Ａ−３１Ｄと、命令バンク３１Ａ−３１Ｄの出力を結合してバス１４に出力する結合部３２と、を有するインターリーブメモリである。例えば、１６ビット命令の場合には、結合部３２は、１６ビット×４＝６４ビットの命令にして６４ビット幅のバス１４に出力する。したがって、命令経路１５も６４ビット幅であり、フェッチアドレス生成部２１は、４個の１６ビット命令を６４ビット幅でフェッチする。
【００２８】
図３は、インターリーブメモリの機能を説明する図であり、（Ａ）がバンクの競合無しの場合を、（Ｂ）がバンクの競合有りの場合を示す。
インターリーブメモリは、例えば、命令の配置されたメモリを並列にアクセス可能な４バンク３１Ａ−３１Ｄを有する。図示のように、各バンクではアドレスに対応して命令が格納されており、バンクとアドレスを指定することにより命令が出力され、４つのバンクから並列に出力された命令を結合部３２が結合してバス１４に出力する。ただし、同一のバンクから２つのアドレスを同時に指定することはできない。１バンク構成の通常のメモリの場合、取得できるのは連続した４命令と限定されていたが、インターリーブメモリの場合、バンク競合さえなければ離れた箇所の４つの命令を取得可能となる。
【００２９】
図３では、縦方向にバンク３１Ａから３１Ｄが配置され、同じ列で順番に１ずつアドレスが増加し、さらに横方向に順番に４ずつアドレスが増加する。したがって、バンク３１Ａから３１Ｄの順でアドレス“０”、“１”、“２”、“３”が付され、次の列では“４”、“５”、“６”、“７”の順でアドレスが付され、次の列では “８”、“９”、“１０”、“１１”の順でアドレスが付されている。
【００３０】
図３の（Ａ）に示すように、アドレス０，１，６，７が指定されると、指定されたアドレスは、バンク３１Ａ，３１Ｂ，３１Ｃ，３１Ｄにそれぞれ存在するので、アドレスは競合無しない。したがって、結合部３２からは、アドレス０，１，６，７に格納された命令が結合されて出力される。
【００３１】
図３の（Ｂ）に示すように、アドレス０，１，２，６が指定されると、指定されたアドレス０，１は、バンク３１Ａに存在するが、アドレス２，６は両方バンク３１Ｃに存在するので、アドレスは競合有りである。したがって、結合部３２からは、アドレス０，１，２に格納された命令が結合されて出力されるが、アドレス６に格納された命令は出力されず、４番目の命令のビット幅部分に対応する命令は無い。対応する命令が無しの場合、例えばＮＯＰを示す命令が出力される。
【００３２】
第１実施形態では、フェッチアドレス生成部２１は、分岐予測機構を有し、分岐命令の場合にはどのような確率で分岐するかを推定し、推定結果に基づいて次に命令メモリ１２が出力する命令のアドレスを制御する。具体的には、フェッチアドレス生成部２１は、命令メモリ１２の４バンク３１Ａ−３１Ｄから出力する命令に含める命令を、分岐元命令とするか、分岐先命令とするか、さらにはそれらをどのように組み合わせるかを制御する。
【００３３】
図４は、命令メモリ１２から取得する命令の優先順位の例を示す図である。
図４は、４バンクの命令メモリで、連続する分岐命令が２個までの場合の優先順位であり、１番から７番までの７種類の場合がある。１番目は、分岐命令が無い場合で、４バンクから出力する命令は、すべて分岐しない場合の連続した４つの命令である。ここでは、これを分岐元命令と称し、最優先の命令である。２番目は、分岐命令が１個で、分岐すると予測する場合で、４バンクから出力する命令は、１つの分岐元命令と、最優先の３つの分岐先（分岐先１）命令とする。３番目は、分岐命令が１個で、分岐しないと予測する場合で、４バンクから出力する命令は、３つの分岐元命令と、最優先の１つの分岐先（分岐先１）命令とする。４番目は、分岐命令が２個で、前側の分岐命令で分岐すると予測し、後側の分岐命令で分岐すると予測する場合である。この場合は、４バンクから出力する命令は、１つの分岐元命令と、最優先の２つの前側の分岐先（分岐先１）命令とし、２番目の優先度の１つの後側の分岐先（分岐先２）命令とする。５番目は、分岐命令が２個で、前側の分岐命令で分岐すると予測し、後側の分岐命令で分岐しないと予測する場合である。この場合は、４バンクから出力する命令は、１つの分岐元命令と、最優先の３つの前側の分岐先（分岐先１）命令とする。６番目は、分岐命令が２個で、前側の分岐命令で分岐しないと予測し、後側の分岐命令で分岐すると予測する場合である。この場合は、４バンクから出力する命令は、１つの分岐元命令と、２番目の優先度の１つの前側の分岐先（分岐先１）命令と、最優先の２つの後側の分岐先（分岐先２）命令とする。７番目は、分岐命令が２個で、前側の分岐命令で分岐しないと予測し、後側の分岐命令で分岐しないと予測する場合である。この場合は、４バンクから出力する命令は、２つの分岐元命令と、最優先の１つの前側の分岐先（分岐先１）命令と、２番目の優先度の１つの後側の分岐先（分岐先２）命令とする。
【００３４】
フェッチアドレス生成部２１は、分岐予測機構の推定結果に基づいて、図４の優先順位にしたがって、次に命令メモリ１２が出力する命令のアドレスを制御する。
【００３５】
デコード部２５は、スーパー・スカラプロセッサで広く用いられるレジスタ名の入れ替えや演算パイプラインへの命令の供給は、一般的なものと同様に行うものとし、説明は省略する。もし、分岐命令がキュー２８に含まれていた場合には前からＮ個の分岐命令の数と分岐先をフェッチアドレス生成部２１へ伝達する。ここで、図４の優先順位の場合には、Ｎ＝２であるが、Ｎ＞２でも優先順位を作ることができる。ただし、命令メモリが４バンク構成とした場合Ｎを４以上にしても優先順位判断の効果はあまりあがらない。さらに、デコード部２５は、分岐が確定し必要なくなった命令をキューから削除する。
【００３６】
図５は、プロセッサ１１におけるフェッチアドレス生成部２１の処理を示すフローチャートである。
【００３７】
ステップＳ１１では、演算部２６Ａ−２６Ｃで、分岐が確定したかの情報を受け、分岐が確定したら、ステップＳ１２に進み、分岐でなければその時点の命令を分岐元としてステップＳ１３に進む。
【００３８】
ステップＳ１２では、デコード部２５にあるどの命令が分岐元の命令かという情報に切り替え、ステップＳ１３に進む。
ステップＳ１３では、デコード部２５からの情報で、分岐元の命令に続く命令の分岐命令があるか判定し、なければステップＳ１４に進み、あればステップＳ１５に進む。
【００３９】
ステップＳ１４では、分岐元から先の４つのアドレスを生成し、終了する。
ステップＳ１５以降は、分岐命令がある場合で、分岐命令の数と分岐予測結果を、図４に示した優先順位に適用し、次にフェッチする４つの命令のアドレスを生成する。
【００４０】
ステップＳ１５では、デコード部２５からの情報に基づいて分岐命令の個数を調べ、図４に示したような優先順位にしたがって、最優先命令のアドレスを生成する。最優先命令のアドレスが複数の場合もある。
【００４１】
ステップＳ１６では、次に（２番目に）優先度の高い命令が、最優先命令と同じバンクに格納されているか、すなわち競合するか判定し、競合する場合はステップＳ１７に進み、競合しない場合はステップＳ１８に進む。
【００４２】
ステップＳ１７では、最優先命令のみのアドレスを生成して出力する。
ステップＳ１８では、次の次に（３番目に）優先度の高い命令が、最優先命令および２番目に優先度の高い命令と競合するか判定し、競合する場合はステップＳ１９に進み、競合しない場合はステップＳ２０に進む。
【００４３】
ステップＳ１９では、最優先命令および次に（２番目に）優先度の高い命令のアドレスを生成して出力する。
ステップＳ２０では、各優先度の命令を合わせたアドレスを生成して出力する。
【００４４】
以上のようにして、フェッチアドレス生成部２１は、優先順位にしたがって候補となる命令を決定し、それらの命令のバンクの競合を確認し、競合しなければアドレスを追加する。こうしてできた１から４命令分のアドレスの命令を命令メモリ１２に要求する。なお、図５の例は、４バンク分岐２多重まで対応した場合の例であり、分岐条件を追加することでバンク数、対応多重数を増やすことは可能である。
【００４５】
次に、第１実施形態の演算装置における動作例を、説明する。
図６は、動作例で実行する命令列の例を示す図である。
【００４６】
図６に示すように、分岐元の命令列では、最初の位置から、INST0, INST1, INST2, INST3, INST4, Branch0, Branch1, INST5, INST6, INST7, INST8, INST9の順で命令が配置されている。分岐が発生しなければINST0からINST9へと処理が進んでいく。Branch0で分岐が発生した場合には、２列目の命令列へジャンプする。Branch1で分岐した場合には３列目の命令列へジャンプする。Branch0で分岐後、さらに最初の命令Branch2で分岐した場合には３列目の命令列へジャンプする。２列目の命令列では、Branch2の後に、BINST0X, BINST1X, BINST2X, BINST3X, BINST4Xが配置される。３列目の命令列では、BINST0Y, BINST1Y, BINST2Y, BINST3Y, BINST4Y, BINST5Yが配置される。４列目の命令列では、BINST0Z, BINST1Z, BINST2Z, BINST3Z, BINST4Z, BINST5Zが配置される。
【００４７】
命令は配置の順番に実行される。図６の例では、分岐命令を２回実行する。したがって、実際に実行されるパターンは、Branch0,1を両方通過、Branch0で分岐してBranch1を通過、Branch0で分岐してBranch1で分岐、Branch0を通過してBranch1で分岐の４通りの場合がある。さらに、それぞれの分岐に対し分岐するまたは分岐しないと分岐予測する２通りの予測が出る。そのため、パターンとして、２つの分岐がそれぞれ２パターンで、それぞれの分岐に対し予測が２パターンとなり、全部で２の４乗、１６パターンとなる。
【００４８】
図７は、上記の１６パターンを示す図である。
図８から図２３は、上記の１６パターンについての動作図である。
【００４９】
図８は、Branch0で分岐すると予測し、実際に分岐し、Branch1で分岐すると予測し、実際に分岐した場合を示す。
図９は、Branch0で分岐すると予測し、実際に分岐し、Branch1で分岐すると予測したが、実際には分岐しなかった場合を示す。
【００５０】
図１０は、Branch0で分岐すると予測し、実際に分岐し、Branch1で分岐しないと予測したが、実際には分岐した場合を示す。
図１１は、Branch0で分岐すると予測し、実際に分岐し、Branch1で分岐しないと予測し、実際に分岐しなかった場合を示す。
【００５１】
図１２は、Branch0で分岐すると予測したが、実際には分岐せず、Branch1で分岐すると予測し、実際に分岐した場合を示す。
図１３は、Branch0で分岐すると予測したが、実際には分岐せず、Branch1で分岐すると予測したが、実際には分岐しなかった場合を示す。
【００５２】
図１４は、Branch0で分岐すると予測したが、実際には分岐せず、Branch1で分岐しないと予測したが、実際には分岐した場合を示す。
図１５は、Branch0で分岐すると予測したが、実際には分岐せず、Branch1で分岐しないと予測し、実際に分岐しなかった場合を示す。
【００５３】
図１６は、Branch0で分岐しないと予測したが、実際には分岐し、Branch1で分岐すると予測し、実際に分岐した場合を示す。
図１７は、Branch0で分岐しないと予測したが、実際には分岐し、Branch1で分岐すると予測したが、実際には分岐しなかった場合を示す。
【００５４】
図１８は、Branch0で分岐しないと予測したが、実際には分岐し、Branch1で分岐しないと予測したが、実際には分岐した場合を示す。
図１９は、Branch0で分岐しないと予測したが、実際には分岐し、Branch1で分岐しないと予測し、実際に分岐しなかった場合を示す。
【００５５】
図２０は、Branch0で分岐しないと予測し、実際に分岐せず、Branch1で分岐すると予測し、実際に分岐した場合を示す。
図２１は、Branch0で分岐しないと予測し、実際に分岐せず、Branch1で分岐すると予測したが、実際には分岐しなかった場合を示す。
【００５６】
図２２は、Branch0で分岐しないと予測し、実際に分岐せず、Branch1で分岐しないと予測したが、実際には分岐した場合を示す。
図２３は、Branch0で分岐しないと予測し、実際に分岐せず、Branch1で分岐しないと予測し、実際に分岐しなかった場合を示す。
【００５７】
図８から図２３において、サイクル行はサイクル数を表す。アドレスはアドレス生成部２１が要求した４つのアドレスを表す。INST*が分岐無で続いた場合の命令、BINST*X-Zが分岐先のアドレスを表し、XがBranch0の分岐先アドレスを、YがBranch1の分岐先アドレスを、ZがBranch2の分岐先アドレスを、それぞれ示す。命令メモリ出力は、要求したアドレスに対する命令メモリ１２の出力である。フェッチ部は、プロセッサのフェッチアドレス生成部２１に対応し、命令メモリ１２からプロセッサのフェッチアドレス生成部２１が取得した命令を表す。デコード部は、デコード部２５に対応し、フェッチした命令をデコード部２５が解読し、キュー２８にたまっている命令を表しており、ここで分岐命令の存在がわかる。処理部は、演算部２６Ａ−２６Ｃに対応し、演算部２６Ａ−２６Ｃで実行する命令を表し、ここで分岐するかどうかの判断がつく。この例では、２サイクル目の命令列に分岐命令が２つ存在する。さらに、図において、点線の枠は、デコード部２５における分岐命令の存在を認識する処理を表す。
【００５８】
図８のBranch0で分岐すると予測し、実際に分岐し、Branch1で分岐すると予測し、実際に分岐した場合を説明する。
１サイクル目（サイクル０）に命令を要求し、２サイクル目（サイクル１）に命令メモリが命令を出力する。
【００５９】
５サイクル目（サイクル４）でデコード部２５に分岐命令が到達する。２つの分岐命令 (Branch0, Branch1)が存在し、この時点での分岐予測がどちらも分岐先を示しているので図４の優先順位判断に従って分岐先アドレスを生成する。この場合、図４のNo.4に相当するため、まず、先の分岐命令(Branch0)の命令の２つのアドレス(Branch2, BIST0X)を優先的に生成する。その後右側優先のため次の分岐命令(Branch1)の分岐先アドレス(BINST0Y)を追加する。最後に可能であれば分岐元の次の命令(INST18)を追加する。なお、図４に示した優先順位の比率の数値は一例であり、数値が異なっていても構わない。このサイクルでは、演算部２６Ａ−２６Ｃは、分岐元のINST0-2を実行する。
【００６０】
６サイクル目（サイクル５）も、デコード部２５の状態は同様であるため同じ処理を行う。ただし、この例では分岐元の次のアドレス(INST19)がその他の命令のアドレスと同じバンクになるため競合が発生し取得要求は出さない。このサイクルでは、演算部２６Ａ−２６Ｃは、分岐元のINST3-4を実行する。
【００６１】
７サイクル目（サイクル６）で、演算部２６Ａが最初の分岐命令(Branch0)を処理し、その処理結果が判明する。分岐すると判明したため、デコード部２５は分岐元の命令(INST5-13)を削除する。なお、フェッチアドレス生成部２１では命令を解読できていないためINST14-17はデコード部２５に来てから削除する。
【００６２】
８，９サイクル目（サイクル７，８）では、実行する命令がデコード部２５にないため演算部２６Ａ−２６Ｃの処理がストールする。９サイクル目で、デコード部２５がBranch2を認識する。分岐予測は分岐すると判断したため図４のNo.2に従って分岐先(BINST0Z-BINST2Z)命令を３個優先して取得する。
【００６３】
１０サイクル目（サイクル９）では、演算部２６Ａが２番目の分岐命令(Branch1)を処理し、その処理結果が判明する。Branch2の分岐先命令がまだ到達していないため１３サイクル目（サイクル１２）までストールする。
【００６４】
１４サイクル目（サイクル１３）からBranch2のとび先の命令(BINST0Z-BINST6Z)を順次実行する。
【００６５】
次に、図１２のBranch0で分岐すると予測したが、実際には分岐せず、Branch1で分岐すると予測し、実際に分岐した場合を説明する。
１サイクル目（サイクル０）に命令を要求し２サイクル目（サイクル１）に命令メモリが命令を出力する。
【００６６】
５サイクル目（サイクル４）でデコード部に分岐命令が到達する。２つの分岐命令(Branch0, Branch1)が存在し、この時点での分岐予測がどちらも分岐先を示しているので図４の優先順位に従ってアドレスを生成する。この場合図４のNo.4に相当するため、まず、先の分岐命令(Branch0)の命令２つのアドレス(Branch2, BINST0X)を優先的に生成する。その後右側優先のため２番目の分岐命令(Branch1)の分岐先アドレス(BINST0Y)を追加する。最後に可能であれば分岐元の次の命令(INST18)を追加する。図４の優先順位の比率の数値は１例であり、数値が異なっていても構わない。
【００６７】
６サイクル目（サイクル５）でも、デコード部２５は同様の状態であるため同じ処理を行う。ただし、この例では分岐元の次のアドレス(INST19)がその他の命令のアドレスと同じバンクになるため競合が発生し取得要求は出さない。
【００６８】
７サイクル目（サイクル６）で最初の分岐命令(Branch0)の結果がわかる。分岐しないとわかったため、Branch0の分岐先の命令列(Xが付された命令）は、以後デコード部２５で削除する。また、デコード部２５でBranch1を解読し、分岐予測が分岐すると予測したため図４のNo.2に従って３個の分岐先命令(BINST2Y-BINST4Y)を優先して取得する。
【００６９】
８サイクル目（サイクル７）で、演算部２６Ａが分岐元の次の命令Branch1を実行する。
９サイクル目（サイクル８）では、Branch1の次の命令が無いためストールする。
１０サイクル目（サイクル９）からBranch1の次の命令BINST0Yが到達するため実行し、以降のサイクルでBranch1の順次到達する命令を実行し続ける。
【００７０】
次に、図２３のBranch0で分岐しないと予測し、実際に分岐せず、Branch1で分岐しないと予測し、実際に分岐しない場合を説明する。
１サイクル目（サイクル０）に命令を要求し２サイクル目（サイクル１）に命令メモリが命令(INST0-3)を出力する。
【００７１】
５サイクル目（サイクル４）でデコード部２５に分岐命令(Branch0, Branch1)が到達する。分岐命令が２つ存在し、この時点での分岐予測がどちらも分岐元を示しているので図４の優先順位にしたがってアドレスを生成する。この場合図４のNo.7に相当するため、まず、Branch0の分岐先の命令(Branch2)、次にBranch1の分岐先の命令(BINST0Y)、最後に分岐元の命令(INST18)という優先順位で取得する。ここで、INST19は競合するため取得されない。
【００７２】
６サイクル目（サイクル５）でも、デコード部２５は同様の状態であるため同じ処理を行う。
７サイクル目（サイクル６）で、最初の分岐命令Branch0の結果がわかる。分岐しないとわかったためBranch0の分岐先の命令列は以後デコード部２５で削除する。さらに、デコード部２５がBranch1を解読し、分岐予測が分岐しないと予測したため、図４のNo.3に従って１個の分岐先命令(BINST2Y)を１個優先して取得する。
【００７３】
８サイクル目（サイクル７）で、２番目の分岐命令(Branch1)の結果がわかる。分岐しないとわかったためBranch1の分岐先の命令列は以後デコード部２５で削除する。
以降、分岐元の命令列INT5以降を順次実行する。
【００７４】
以上図７の１６パターンのうちの３つのパターンの動作例について説明した。他のパターンの動作例については、上記の説明に基づいて容易に理解できるので説明は省略する。
【００７５】
次に、図１に示した分岐元命令キャッシュおよび分岐先命令キャッシュを有するスーパー・スカラプロセッサを含む演算装置と第１実施形態の演算装置で発生すると推定される分岐ペナルティ（ストールサイクル）を比較した結果を説明する。この比較は、図８から図２３で説明した動作で一部シミュレーションを行い、そこから推測した値で行った。
【００７６】
図２４は、図１の演算装置と第１実施形態の演算装置の分岐ペナルティの比較結果を示す図である。
各パターンでの数値が、図１の演算装置と第１実施形態の演算装置の推定ストールサイクル数を示し、その差を合わせて示す。右端はそれらの値の合計ある。図１の演算装置の場合は、キャッシュがすべてヒットしたという最良条件を想定している。
【００７７】
すべてのパターンが一様に発生すると仮定した場合、第１実施形態では、ストールサイクルが約３４％減少する。
【００７８】
以上説明したように、第１実施形態によれば、図１に示したキャッシュを有する演算装置で、１回目の命令取得時に必ず発生していたミスヒットによる分岐ペナルティを回避し、多重分岐による分岐ペナルティ発生を削減する。したがって、プロセッサの処理性能が向上する。
【００７９】
以上の説明は、命令がインオーダーである場合の説明であるが、アウトオブオーダーの場合にも同様に適用できる。命令がアウトオブオーダーの場合には、通常結果をリオーダーリングバッファ(Reordering Buffer)に格納し、順番の整合性が取れたら物理レジスタに格納するという処理を行う。以下、命令がアウトオブオーダーの場合の動作を説明する。
【００８０】
図２５は、命令がアウトオブオーダーであり、図６の命令列を処理する場合で、Branch0で分岐すると予測し、実際に分岐し、Branch1で分岐すると予測し、実際に分岐した場合の動作例を示す図である。
【００８１】
図２５の動作例の条件は、命令がインオーダーである場合の図８の処理例に対応する。図における表示は、図８−図２３の説明と同じである。リオーダーバッファは、アウトオブオーダーにより行われた順番の入れ替えを元に戻すためのバッファで、結果の順序性が確保されたら次のレジスタ更新へ移る。レジスタ更新では実際にレジスタを更新する。図２５は、２サイクル目の命令列に分岐命令が２つ存在した場合の例を示している。
【００８２】
５サイクル目（サイクル４）までは、図８と同じであり、説明は省略する。
６サイクル目（サイクル５）で、Branch0の分岐先命令Branch3, BINST0X、Branch1の分岐先命令BINST0Yおよび分岐元命令INST18のアドレスが命令メモリ１２に要求される。この時、デコード部２５の状態は同じ状態であるため同じ処理を行う。
【００８３】
７サイクル目（サイクル６）では、分岐元の次のアドレスがその他の命令のアドレスと同じバンクになるため競合が発生し取得要求は出さない。さらに、このサイクルで最初の分岐命令Branch0の結果がわかる。分岐するとわかったためデコード部２５は分岐元の命令INST5-13を削除する。前述の通り、INST14-17はデコード部に来てから削除する。
【００８４】
８および９サイクル目（サイクル７，８）では、インオーダーであれば演算部２６Ａ−２６Ｃが実行する命令はないが、アウトオブオーダーの場合には、デコード部２５にある命令を実行する。
【００８５】
９サイクル目（サイクル８）で、デコード部２５によりBranch2が認識される。分岐予測は分岐すると判断したため、図４のNo.2に従って３個の分岐先命令BINST0Z-BINST2Zを優先して取得する。
【００８６】
１０サイクル目（サイクル９）で、演算部２６ＡがBranch2を実行し、その結果が判明する。Branch0でジャンプしたことはわかっているため、Branch0の分岐先の命令列を先読みして実行する。なおリオーダーバッファで最初の分岐元の命令列が分岐して不要となったことを解読し、レジスタ更新は行わない。
【００８７】
１１サイクル目（サイクル１０）以降、Branch0の分岐先の命令は分岐元の命令であり、分岐はしたため結果の整合性がとれないのでレジスタ更新は行わない。
１４サイクル目（サイクル１３）から、Branch2の分岐先の命令を順次実行する。
以上、命令がアウトオブオーダーである場合の動作例を説明した。
【００８８】
第１実施形態では、プロセッサが分岐予測機構を有し、分岐命令が分岐するか否かを推定した。これは、上記の命令がアウトオブオーダーである場合の動作も同様である。しかし、分岐予測機構を設けず、分岐先の個数に応じてあらかじめ定められた固定の優先順位に基づいて、命令メモリ１２に要求するアドレスを決定してもよい。
【００８９】
図２６は、分岐予測機構を設けずに、命令メモリに要求するアドレスを決定する場合の固定の優先順位の例を示す図である。
【００９０】
図２６の例は、４バンクの命令メモリで、連続する分岐命令が２個までの場合の優先順位であり、１番から３番までの３種類の場合がある。１番目は、分岐命令が無い場合で、４バンクから出力する命令は、すべて分岐しない場合の連続した４つの分岐元命令である。２番目は、分岐命令が１個で、４バンクから出力する命令は、２つの分岐元命令と、最優先の２つの分岐先（分岐先１）命令とする。３番目は、分岐命令が２個で、４バンクから出力する命令は、１つの分岐元命令と、最優先の２つの分岐先（分岐先１）命令と、２番の優先度の１つの分岐先（分岐先２）命令と、する。
【００９１】
図２６に示すように、分岐予測有りの場合に比べて項目は少なくなる。図２６における数字は、設計者が設計時点で決める。
【００９２】
図２７は、第２実施形態の演算装置の構成を示す図である。
第２実施形態の演算装置は、命令メモリ１２およびデータメモリ１３をローカルメモリとして有し、バスを介さず直接アクセス可能ということが、第１実施形態と異なる。この携帯は、組み込み向けのプロセッサによく用いられる形態である。命令メモリ１２は、インターリーブメモリである。
【００９３】
図２８は、第２実施形態の演算装置に使用するプロセッサの構成を示す図である。
プロセッサ１１は、フェッチアドレス生成部２１と、デコード部２５と、３個の演算部２６Ａ−２６Ｃと、を有する。フェッチアドレス生成部２１は、通常用プログラムカウンタ（ＰＣ０）４１Ａと、第１分岐用プログラムカウンタ（ＰＣ１）４１Ｂと、第２分岐用プログラムカウンタ（ＰＣ２）４１Ｃと、アドレス生成部４２と、分岐予測部４３と、を有する。
【００９４】
プログラムカウンタ４１Ａ−４１Ｃは、多重する分岐の数分有する。図２８では、３個のプログラムカウンタを有するので、分岐が２多重まで対応可能である。前述のように、分岐予測部４３は、必須ではなく、設けない場合には固定の優先順位を使用する。アドレス生成部４２は、デコード部２５から分岐命令の有無と分岐先アドレスを取得し、プログラムカウンタと分岐予測結果を元に図４の優先順位判断を行ってアドレスを生成し命令メモリ１２から命令を取得する。デコード部２５のキュー２８は、複数の命令バッファを有し、演算部２６Ａ−２６Ｃへの命令の発行を制御する。デコード部２５は、キュー２８にたまっている命令が分岐元命令か先命令かを把握しており、演算部２６Ａ−２６Ｃでの分岐判定結果に基づいていらなくなった命令の廃棄を行う。
【００９５】
図２９は、第２実施形態の演算装置の動作例を示す図である。
図２９の動作例は、分岐命令が２連続で存在し分岐予測はどちらも分岐すると判定し実際に分岐した場合の動作であり、図８の処理例に対応する。図８の処理例と異なる事項は、デコード部２５で分岐命令の存在を確認してから次のサイクルで分岐先命令をフェッチできる点で、そのため分岐ペナルティが少なくなる。図２９に示した動作例では、演算部のストールがなくなっている。
【００９６】
図２４には、図１の演算装置と、第１実施形態の演算装置の分岐ペナルティの比較結果を示した。図１の演算装置は分岐元キャッシュと分岐先キャッシュを有するのに対して、第１実施形態の演算装置はキャッシュを有さないという条件での比較である。そのため、デコード部が分岐命令の存在を認識した時点で命令メモリから取得する命令のアドレスを制御するという実施形態の効果が、明確でなかった。そこで、第２実施形態の演算装置で、デコード部における分岐命令の認識では命令メモリから取得する命令のアドレスを制御しない場合の動作例を示す。すなわち、演算部で分岐を行うと分かると、それまでフェッチした命令をすべて廃棄し、分岐先の命令を新たにフェッチするようにした場合の動作例について説明する。
【００９７】
図３０は、第２実施形態の演算装置で、第２実施形態のアドレス生成の制御を行わず、分岐を行うと分かると、それまでフェッチした命令をすべて廃棄し、分岐先の命令を新たにフェッチするようにした場合の動作例を示す図である。
【００９８】
図３０は、分岐命令が１つのみ含まれる場合の動作例である。図３０に示すように、演算部において分岐すると判定されると、次のサイクルで、フェッチ部は、分岐先の命令をフェッチし、デコード部はそれまでの分岐元の命令をすべて廃棄する。そのため、演算部が分岐すると判定した後、分岐先の命令が演算部に入るのは３サイクル後であり、２サイクルのストールが発生する。
【００９９】
上記のように、分岐命令が１つであるというより簡単な条件でも図３０の動作例では２サイクルのストールが発生するのに対して、図２９の第２実施形態の演算装置では、２個の分岐命令があってもストールは発生しない。
【０１００】
以上、第１および第２実施形態について説明したが、各種の変形例が可能であるのは言うまでもない。例えば、第１および第２実施形態では、プロセッサがスーパー・スカラプロセッサである例を説明したが、ＶＬＩＷ(Very Long Instruction Word)プロセッサにも適用可能である。ＶＬＩＷプロセッサの場合、例えば演算部が４つあるとすると、４命令をコンパイラがパッキングしフェッチ部が４命令同時取得を行う。レジスタリソースなどの競合はコンパイラがコードを生成する時点で判断し、どうしても命令を配置できない場所はＮＯＰにする、あるいは最後尾ビットを設けるなどの処理を行う。例えば、ＶＬＩＷ命令のパッキングが４命令で、一度に１６命令を命令メモリから取得できプロセッサの場合であれば、１６命令のうち４命令を分岐先からとるという実施形態と同様の処理を行えば同様の効果が得られる。この場合、ＶＬＩＷプロセッサでは実装されることの少ないデコード部のＦＩＦＯを追加する必要がある。
【０１０１】
第１および第２実施形態では、インターリーブ方式の命令メモリは外部メモリである例を示したが、命令キャッシュをインターリーブ方式とし、命令キャッシュから取得する命令を実施形態のように決定してもよい。
【０１０２】
以上、実施形態を説明したが、ここに記載したすべての例や条件は、発明および技術に適用する発明の概念の理解を助ける目的で記載されたものである。特に記載された例や条件は発明の範囲を制限することを意図するものではなく、明細書のそのような例の構成は発明の利点および欠点を示すものではない。発明の実施形態を詳細に記載したが、各種の変更、置き換え、変形が発明の精神および範囲を逸脱することなく行えることが理解されるべきである。
【符号の説明】
【０１０３】
１１    プロセッサ
１２    命令メモリ
１３    データメモリ
１４    バス
２１    フェッチアドレス生成部
２５    デコード部
２６Ａ−２６Ｃ    演算部
２８    キュー
３１Ａ−３１Ｄ    バンク
３２    結合部
【図１】
2015184979.tif 000003
【図２】
2015184979.tif 000004
【図３】
2015184979.tif 000005
【図４】
2015184979.tif 000006
【図５】
2015184979.tif 000007
【図６】
2015184979.tif 000008
【図７】
2015184979.tif 000009
【図８】
2015184979.tif 000010
【図９】
2015184979.tif 000011
【図１０】
2015184979.tif 000012
【図１１】
2015184979.tif 000013
【図１２】
2015184979.tif 000014
【図１３】
2015184979.tif 000015
【図１４】
2015184979.tif 000016
【図１５】
2015184979.tif 000017
【図１６】
2015184979.tif 000018
【図１７】
2015184979.tif 000019
【図１８】
2015184979.tif 000020
【図１９】
2015184979.tif 000021
【図２０】
2015184979.tif 000022
【図２１】
2015184979.tif 000023
【図２２】
2015184979.tif 000024
【図２３】
2015184979.tif 000025
【図２４】
2015184979.tif 000026
【図２５】
2015184979.tif 000027
【図２６】
2015184979.tif 000028
【図２７】
2015184979.tif 000029
【図２８】
2015184979.tif 000030
【図２９】
2015184979.tif 000031
【図３０】
2015184979.tif 000032