(57)【要約】【課題】複数命令フロー間の効率的なデータ受渡しを可能とし、プログラムを複数命令フローに分割して実行する高効率かつ高性能なプロセッサを提供する。【解決手段】他命令フローの参照レジスタへの書込み指示を有する命令、及び参照レジスタ無効化指示を有する命令を定義し、複数の単純な命令フローを実行するプロセッサ（ＣＰＵ１，ＣＰＵ２）の総体として通常の機能を有するデータプロセッサを構成する。他命令フローの参照レジスタへの書込み指示を有する命令を実行する際は、書込みレジスタが無効であることを確認し、無効でなければ無効になるのを待ち、無効であれば書き込みを行う。参照レジスタ無効化指示を有する命令を実行した場合は参照の終わったレジスタを無効化する。更に、参照レジスタが無効な場合は有効になるまで参照命令の実行が抑止される。【選択図】図１３
2008139964.tif 000002
【特許請求の範囲】
【請求項１】
夫々が異なる命令フローを実行する複数のデータ処理回路を有し、
夫々のデータ処理回路は命令フローで参照される複数のレジスタと、前記複数のレジスタが保有するデータに対する有効性をレジスタ毎に示すフラグビットとを有し、
前記データ処理回路は、他のデータ処理回路の前記レジスタにデータを書込む操作を指示する第１命令を実行するとき、当該第１命令で前記書込む操作が指示されているレジスタが無効であるか否かを確認し、無効でなければ無効になるのを待ち、無効であれば書き込みを行い、また、前記レジスタに対する参照に併せて当該参照されるレジスタのデータを対応するフラグビットを用いて無効化する指示を与える第２命令を実行するとき、当該第２命令でデータ無効化の指示がなされているレジスタが無効な場合は有効になるまで参照の実行を抑止し、当該第２命令を実行したとき参照の終わったレジスタを無効化する制御を行う、データプロセッサ。
【請求項２】
前記命令セットに含まれるロード命令及びアドレス生成命令を実行するデータ処理回路は前記命令セットに含まれるストア命令及びアドレス生成命令を実行するデータ処理回路とは分離されている請求項１記載のデータプロセッサ。
【請求項３】
前記命令セットに含まれるメモリアクセス命令及びアドレス生成命令を実行するデータ処理回路は其の他の演算命令を実行するデータ処理回路から分離されている請求項１記載のデータプロセッサ。
【請求項４】
命令フェッチを実行するデータ処理回路と演算を実行するデータ処理回路とを別々に有し、前記演算を実行するデータ処理回路の命令キューは前記命令フェッチを実行するデータ処理回路が扱うレジスタとみなされ、命令フェッチを実行するデータ処理装置は前記第１命令として命令キューのエントリへの書込み指示を有する命令を実行し、演算を実行するデータ処理装置は前記第２命令として命令キューのエントリ参照後に対応するフラグビットを用いてエントリの無効化を指示する命令を実行して、命令フェッチを実行するデータ処理回路から演算を実行するデータ処理回路への命令の受け渡しを行なう請求項１記載のデータプロセッサ。
【請求項５】
前記第１命令はディスティネーションレジスタフィールドに対応して書込み先のデータ処理回路を特定する第１パラメータの指定フィールドを有する請求項１記載のデータプロセッサ。
【請求項６】
前記第１命令はレジスタ間接アドレシングモードで指定するメモリからレジスタにデータを転送するロード命令である、請求項５記載のデータプロセッサ。
【請求項７】
前記第２命令は参照後に無効にするか否かを指示する第２パラメータの指定フィールドをレジスタフィールドに対応して有する請求項１記載のデータプロセッサ。
【請求項８】
前記第２パラメータの指定フィールドを有するレジスタフィールドはリードレジスタを指定するフィールドである、請求項７記載のデータプロセッサ。
【請求項９】
前記第２パラメータの指定フィールドを有するレジスタフィールドにはライトレジスタを指定するフィールドおよびリード・モディファイレジスタを指定するフィールドが除外される請求項８記載のデータプロセッサ。
【請求項１０】
夫々が異なる命令フローを実行する複数のデータ処理回路を有し、
夫々のデータ処理回路は命令フローで参照される複数のレジスタと、前記複数のレジスタが保有するデータの有効性をレジスタ毎に示すフラグビットとを有し、
一のデータ処理回路が他のデータ処理回路の前記レジスタにデータを書込む操作を指示する第１命令と、データ処理回路の前記レジスタに対する参照に併せて当該参照されるレジスタのフラグビットに対するデータ無効化の指示を与える第２命令とを、前記複数のデータ処理回路の命令セットに含む、データプロセッサ。
【請求項１１】
前記データ処理回路は、前記第１命令を実行するとき、当該第１命令で前記書込む操作が指示されているレジスタが無効であるか否かを確認し、無効でなければ無効になるのを待ち、無効であれば書き込みを行い、また、前記第２命令を実行するとき当該第２命令でデータ無効化の指示がなされているレジスタが既に無効な場合は有効になるまで参照命令の実行を抑止し、当該第２命令を実行したとき参照の終わったレジスタを無効化する制御を行う、請求項１０記載のデータプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データプロセッサに関し、複数命令フロー間の効率的な情報交換を可能にする技術に関する。
【背景技術】
【０００２】
近年、単一のプロセッサコアの性能向上が限界に来ており，性能向上の継続には複数プロセッサコアを１つのチップに集積するマルチコア化が重要な選択肢となっている。しかしながら、一般的なマルチコアチップにおいては、複数プロセッサコア間でのデータ受渡しに時間がかかるため、このことがオーバーヘッドとなってN（Nは自然数）個のコアを搭載してもN倍の性能は実現できない。したがって、一般的なマルチコアチップではコア当りの性能が低下し面積効率が低下する。
【０００３】
一方、マルチコア化が進むと従来のように１つのプロセッサコアが何でも処理する必要はないため、様々なプロセッサコアを搭載して各コアが得意な処理を行うことによって効率を上げることが可能となる。そして、従来型汎用プロセッサコアとの互換性を維持してソフトウェア等の継続性を保つレガシーコアと、互換性を捨てて得意な処理に特化することによって効率を上げたエンジンコアとを搭載するヘテロジーニャスマルチコアチップであれば、マルチコア化しながら面積効率も向上させることが可能となる。
【０００４】
また、単一のプロセッサコアの性能向上が限界に来ている一つの要因は、単一のプログラムフローを高速に処理しようとしている点にある。本来のアルゴリズムに並列性があっても単一フローで記述すると並列性を明示的に示せないため、そこからハードウェアで極限まで並列性を抽出しようとすると、大量のハードウェアを必要とし効率が低下してしまう。そして、実装限界まで面積や電力を投入しても、投入に見合った性能向上は得られないという状況になっている。
【０００５】
例えば、現在ハイエンドプロセッサの方式として一般的なアウトオブオーダ方式では、実行すべき命令アドレスを単一のプログラムカウンタで管理する単一の命令フローを大容量のバッファに保持してデータ依存関係をチェックし入力データが揃った命令から実行し、実行後に再び本来の命令フローの順序に従ってプロセッサ状態を更新する。この際に、レジスタオペランドの逆依存や出力依存による命令発行制限をなくすために大容量レジスタファイルを用意して、レジスタリネーミングを行う。先行して実行した結果は後続命令が本来より早く使用することが可能となり性能向上に寄与するものの、途中でプログラムの実行を停止させたようなときに外部から認識できるプロセッサ状態の更新までアウトオブオーダにしてしまうことはできない。プログラムを一旦止めて後で再開するというプロセッサの基本的な処理ができなくなってしまうためである。したがって、先行して実行した結果は大容量のリオーダバッファに蓄えられ本来の順序でレジスタファイル等に書き戻される。このように単一命令フローのアウトオブオーダ実行は、大容量バッファと複雑な制御を必要とする効率の低い方式である。例えば、文献１では、25ページの図２のように整数発行キュー（Integer issue queue）を20エントリ、浮動小数点発行キュー（Floating-point issue queue）を15エントリ、整数レジスタファイル（Integer register file）を80本2セット、浮動小数点レジスタファイル（Floating-point register file）を72本用意し、大規模なアウトオブオーダ発行を可能にしている。
【０００６】
【非特許文献１】R. E. Kessler, ‘THE ALPHA 21264 MICROPROCESSOR,' IEEE Micro, vol.19, no.2, pp.24-36, MARCHAPRIL 1999.
【発明の開示】
【発明が解決しようとする課題】
【０００７】
前述のように、大規模なアウトオブオーダ実行は単一フローの性能を向上させる反面、レジスタリネーミング、命令実行順序の入替え、リオーダリングといった単一フローを基本とするために必要となる様々な処理の効率を低下させる。一方。マルチコアチップは複数フローを扱える半面、複数命令フロー間の効率的なデータ受渡しが困難であるために、大規模なプログラムを分割して実行した場合に効率が低下する。
【０００８】
単一命令フローを基本とする従来アーキテクチャはデータ依存関係をプログラムの命令実行順序で定義する。そして、命令実行順序を厳密に守れば全てのデータ依存関係は保証される。しかしながら、このためにはパイプライン処理、スーパースカラ処理、及びアウトオブオーダ実行を禁止する必要があり性能が著しく低下する。そこで、データ依存関係だけを守って命令実行順序を変える為のルールが確立されている。以下の３ルールである。
（１）ある命令実行前にその命令が参照するデータが全て揃っていること、即ちその命令が読出すレジスタやメモリへの先行命令による書込みが全て完了していること（フロー依存）
（２）ある命令が更新することによって破壊されてしまうデータへの参照が全て完了していること、即ちその命令が書込むレジスタやメモリへの先行命令による読出しが全て完了していること（逆依存）
（３）ある命令が更新したデータを先行する命令が上書きしないこと、即ちレジスタやメモリの更新順序が保たれること(出力依存)
そして、上記３つの依存関係を守るためには、ある命令の実行前に先行する全ての命令をデコードする必要がある。この結果、アウトオブオーダ方式のプロセッサでは前述のように大容量のバッファを用意して命令デコードを先行させ、上記３つの依存関係の解析を大幅に早めて、先行実行可能な命令を抽出している。
【０００９】
また、複数プロセッサ間でデータを受渡す場合もデータ依存関係をプログラムの命令実行順序で定義している。即ち、複数プロセッサが実行するプログラムに同期ポイントを設け、あるプロセッサは他のプロセッサが同期ポイントまでの実行を完了していることを確認することにより、同期ポイント以降の命令を実行してもデータ依存関係が保たれることを間接的に確認する。この場合、他のプロセッサが実際にはいつ依存関係のあるデータの参照や更新を行っているかの観測は困難であるため、アウトオブオーダ的な実行は困難であり、頻繁に同期ポイントを設定するとそこで一旦処理が逐次化され、同期に要する時間と相俟って性能が低下する。
【００１０】
以上のように、単一命令フローであっても複数命令フローであってもデータ依存関係のある処理を効率的に実行することは困難である。
【００１１】
本発明の目的は、複数命令フロー間の効率的なデータ受渡しを可能とし、大規模なプログラムを複数命令フローに分割して実行することにより、単一フローを基本とするために発生する様々な効率低下を排除して、高効率かつ高性能なデータプロセッサを提供することにある。
【００１２】
本発明の別の目的は、複数命令フロー間の効率的なデータ受渡しを可能とし、各命令フローを単純化、単機能化した高効率なデータプロセッサを提供することにある。
【００１３】
本発明の更に別の目的は、複数命令フロー間の効率的なデータ受渡しを可能とし、プログラム構造定義とデータ処理を別命令フローとして効率的な命令供給が可能なデータプロセッサを提供することにある。
【００１４】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１５】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１６】
〔１〕本発明に係るデータプロセッサは、他命令フローの参照レジスタへの書込み指示を有する命令、及び参照レジスタ無効化指示を有する命令を実行する。
【００１７】
上記より、他命令フローへの効率的なデータ転送が可能となる。他命令フローの参照レジスタへの書込み指示を有する命令を実行する際は、書込みレジスタが無効であることを確認し、無効でなければ無効になるのを待ち、無効であれば書き込みを行う。一方、参照レジスタ無効化指示を有する命令を実行した場合は参照の終わったレジスタを無効化する。更に、参照レジスタが無効な場合は有効になるまで参照命令の実行が抑止される。この結果、参照終了まではレジスタが有効であるために他フローからの書込みが抑止され、逆依存関係のチェックが正しく行われる。また、他フローからの書込みが行われるまではレジスタが無効であるため参照命令の実行が抑止され、依存関係のチェックが正しく行われる。
【００１８】
〔２〕本発明に係るデータプロセッサは、複数の単純な命令フローを実行するプロセッサの総体として通常の機能を有するプロセッサを構成する。単純な命令フローとは、ロード命令のみ、演算命令のみ、或いはストア命令のみの命令フローなどである。以下単純な命令フローを実行するプロセッサをナノプロセッサと呼ぶことにする。即ち、ロード命令のみを実行するプロセッサはロードナノプロセッサ、演算命令のみを実行するプロセッサは演算ナノプロセッサ、そしてストア命令のみを実行するプロセッサはストアナノプロセッサである。
【００１９】
上記より、各ナノプロセッサが単純化され効率が向上する。
【００２０】
〔３〕本発明に係るデータプロセッサは、ナノプロセッサとして命令フェッチナノプロセッサを有する。そして、演算ナノプロセッサ等のデータ処理ナノプロセッサの命令キューを命令フェッチナノプロセッサが扱うレジスタとみなし、命令フェッチナノプロセッサが命令キューのエントリへの書込み指示を有する命令を実行し、データ処理ナノプロセッサが命令キューのエントリ参照後に無効化指示を出すことにより、命令の受け渡しを可能にする。
【００２１】
上記より、プログラム構造定義を別命令フローとし、データ処理中に先行的にプログラム構造に従った命令供給を行うとこにより、複雑な分岐処理ハードウェアを用いない効率的な命令供給が可能となる。
【発明の効果】
【００２２】
本願において開示される発明のうち代表的なものについて簡単に説明すれば下記のとおりである。
【００２３】
すなわち、複数命令フロー間の効率的なデータ受渡しを可能とし、大規模なプログラムを複数命令フローに分割して実行することにより、単一フローを基本とするために発生する様々な効率低下を排除して、高効率かつ高性能なプロセッサを提供できる。
【００２４】
また、各命令フローを単純化、単機能化した高効率なプロセッサを提供できる。更に、プログラム構造定義とデータ処理を別命令フローとして効率的な命令供給が可能なプロセッサを提供できる。
【発明を実施するための最良の形態】
【００２５】
１．代表的な実施の形態（representative forms of embodiments of the inventions）
先ず、本願において開示される発明の代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００２６】
〔１〕本発明の代表的な実施の形態に係るデータプロセッサは、夫々が異なる命令フローを実行する複数のデータ処理回路を有する。夫々のデータ処理回路は命令フローで参照される複数のレジスタと、前記複数のレジスタが保有するデータに対する有効性をレジスタ毎に示すフラグビットとを有する。前記データ処理回路は、他のデータ処理回路の前記レジスタにデータを書込む操作を指示する第１命令を実行するとき、当該第１命令で前記書込む操作が指示されているレジスタが無効であるか否かを確認し、無効でなければ無効になるのを待ち、無効であれば書き込みを行い、また、前記レジスタに対する参照に併せて当該参照されるレジスタのデータを対応するフラグビットを用いて無効化する指示を与える第２命令を実行するとき、当該第２命令でデータ無効化の指示がなされているレジスタが既に無効な場合は有効になるまで参照の実行を抑止し、当該第２命令を実行したとき参照の終わったレジスタを無効化する制御を行う。
【００２７】
上記より、複数のデータ処理回路が夫々別々に命令フローを実行するとき、一方のン命令フローから他方の命令フローへの依存関係のあるオペランドに対し、参照終了まではそのオペランドを保有するレジスタが有効であるため他の命令フローからの書込みが抑止され、逆依存関係のチェックが正しく行われる。また、参照されて無効化されたレジスタは他の命令フローからの書込みが行われるまでは無効であるため参照命令の実行が抑止され、依存関係のチェックが正しく行われる。
【００２８】
具体的な一つの形態として、前記命令セットに含まれるロード命令及びアドレス生成命令を実行するデータ処理回路は前記命令セットに含まれるストア命令及びアドレス生成命令を実行するデータ処理回路とは分離されている。夫々別々に命令フローを実行するデータ処理回路の構成は単純化され、データ処理効率の向上に寄与する。
【００２９】
別の具体的な形態として、前記命令セットに含まれるメモリアクセス命令及びアドレス生成命令を実行するデータ処理回路は其の他の演算命令を実行するデータ処理回路から分離されている。夫々別々に命令フローを実行するデータ処理回路の構成は単純化され、データ処理効率の向上に寄与する。
【００３０】
別の具体的な形態として、命令フェッチを実行するデータ処理回路と演算を実行するデータ処理回路とを別々に有する。前記演算を実行するデータ処理回路の命令キューは前記命令フェッチを実行するデータ処理回路が扱うレジスタとみなされ、命令フェッチを実行するデータ処理装置は前記第１命令として命令キューのエントリへの書込み指示を有する命令を実行し、演算を実行するデータ処理装置は前記第２命令として命令キューのエントリ参照後に対応するフラグビットを用いてエントリの無効化を指示する命令を実行して、命令フェッチを実行するデータ処理回路から演算を実行するデータ処理回路への命令の受け渡しを行なう。
【００３１】
別の具体的な形態として、前記第１命令はディスティネーションレジスタフィールドに対応して書込み先のデータ処理回路を特定する第１パラメータの指定フィールドを有する。オペコードの種別を増大させずに第１命令を実現できる。例えば第１命令は、レジスタ間接アドレシングモードで指定するメモリからレジスタにデータを転送するロード命令である。
【００３２】
別の具体的な形態として、前記第２命令は参照後に無効にするか否かを指示する第２パラメータの指定フィールドをレジスタフィールドに対応して有する。オペコードの種別を増大させずに第２命令を実現できる。例えば前記第２パラメータの指定フィールドを有するレジスタフィールドはリードレジスタを指定するフィールドである。前記第２パラメータの指定フィールドを有するレジスタフィールドにはライトレジスタを指定するフィールドおよびリード・モディファイレジスタを指定するフィールドが除外される。当該命令のオペレーションにおいて更新されることが前提のレジスタフィールドに対して無駄なパレメータ指定フィールドが付随されない。
【００３３】
〔２〕別の観点による実施の形態に係るデータプロセッサは、夫々が異なる命令フローを実行する複数のデータ処理回路を有する。夫々のデータ処理回路は命令フローで参照される複数のレジスタと、前記複数のレジスタが保有するデータの有効性をレジスタ毎に示すフラグビットとを有する。一のデータ処理回路が他のデータ処理回路の前記レジスタにデータを書込む操作を指示する第１命令と、データ処理回路の前記レジスタに対する参照に併せて当該参照されるレジスタのフラグビットに対するデータ無効化の指示を与える第２命令とを、前記複数のデータ処理回路の命令セットに含む。
【００３４】
例えば、前記データ処理回路は、前記第１命令を実行するとき、当該第１命令で前記書込む操作が指示されているレジスタが無効であるか否かを確認し、無効でなければ無効になるのを待ち、無効であれば書き込みを行い、また、前記第２命令を実行するとき当該第２命令でデータ無効化の指示がなされているレジスタが既に無効な場合は有効になるまで参照命令の実行を抑止し、当該第２命令を実行したとき参照の終わったレジスタを無効化する制御を行う。これにより、他命令フローへの効率的なデータ転送が可能となる。
【００３５】
２．実施の形態の説明
次に、実施の形態について更に詳述する。
【００３６】
《単一命令フローによるプログラム実行》
本発明に係る各実施形態を詳細に説明する前に、まず、各実施形態の比較例となる単一命令フローによるプログラムの実行について説明する。図１には、単一命令フローによるプログラムの実行動作例を説明するための第１のプログラムが例示される。第１のプログラムは、Ｃ言語で記述されているように、Ｎ個の要素を持つ２つの配列ａ［ｉ］とｂ［ｉ］を加算し、配列ｃ［ｉ］に格納するプログラムである。この第１のプログラムを、アセンブラで記述した場合について説明する。このアセンブラプログラムでは、ポストインクリメントタイプのロード及びストア命令を有するアーキテクチャを想定している。
【００３７】
まず、初期設定として４つの即値転送命令「ｍｏｖ  ＃＿ａ，ｒ０」、「ｍｏｖ  ＃＿ｂ，ｒ１」、「ｍｏｖ  ＃＿ｃ，ｒ２」及び「ｍｏｖ  ＃Ｎ，ｒ３」によって、３つの配列の先頭アドレス＿ａ、＿ｂ、＿ｃ、及び配列の要素数Ｎを、それぞれレジスタｒ０、ｒ１、ｒ２、及びｒ３に格納する。次に、ループ部では、ポストインクリメントロード命令「ｍｏｖ  ＠ｒ０＋，ｒ４」及び「ｍｏｖ  ＠ｒ１＋，ｒ５」によって、ｒ０及びｒ１の指す配列ａ及びｂのアドレスから配列要素をｒ４及びｒ５にロードすると同時に、ｒ０及びｒ１をインクリメントして次の配列要素を指すようにする。次に、加算命令「ａｄｄ  ｒ４，ｒ５」によって、ｒ４及びｒ５にロードされた配列要素を加算し、ｒ５に格納する。そして、ポストインクリメントストア命令「ｍｏｖ  ｒ５，＠ｒ２＋」によって、配列ｃの要素アドレスに配列要素の加算結果であるｒ５の値をストアする。その後、デクリメント・テスト命令「ｄｔ  ｒ３」によって、ｒ３に格納された要素数Ｎをデクリメントし、その結果がゼロかどうかをテストし、ゼロであれば条件分岐用のフラグ（Ｔ）をセットし、ゼロでなければフラグ（Ｔ）をクリアする。最後に、条件分岐命令「ｂｆ  ＿Ｌ００」によって、フラグ（Ｔ）をチェックし、クリアされていれば、残り要素数Ｎがまだゼロではないので、ラベル＿Ｌ００の指すループの先頭に分岐する。
【００３８】
図２には、第１のプログラムをアウトオブオーダ方式のデータプロセッサで実行した場合のループ部の動作が例示される。１ループ目から５ループ目の途中まで動作を記述している。ここで、ロードレイテンシは３を想定しており、ロード命令とロードデータ使用命令の距離が３以上であれば、ロードデータ使用命令の実行が可能である。また、分岐予測ヒット時の分岐命令の実行サイクル、即ち、分岐命令とターゲット命令の距離も３としている。アウトオブオーダ方式では通常の命令は発行までに長いサイクルを要するが、分岐命令はできるだけ上流のパイプラインステージで実行して命令フェッチが滞らないようになっている。更に、命令フェッチは８命令ずつ行い十分な数の命令をバッファできるものとする。図２では１ループの命令数が６であるため６命令目の後の２命令もフェッチされるがループを抜けるまでは実行されずにキャンセルされるため空欄にしている。
【００３９】
この結果、図２では、１ループ目は命令発行スロットに空きがあるものの、２ループ目では、１ループ目の加算命令「ａｄｄ  ｒ４，ｒ５」及びポストインクリメントストア命令「ｍｏｖ  ｒ５，＠ｒ２＋」、並びに、３ループ目のポストインクリメントロード命令「ｍｏｖ  ＠ｒ０＋，ｒ４」及び「ｍｏｖ  ＠ｒ１＋，ｒ５」とのアウトオブオーダ方式の実行順序交換により、メモリパイプでは毎サイクル命令を実行している。３ループ目以降も同様に実行間隔が詰められ高速実行される。このとき、命令バッファの３番目の加算命令より１４番目の分岐命令を先に実行しており、実行間隔を詰めるには多数の命令の実行可否判定を毎サイクル行って適切な命令を選択する必要がある。また、条件分岐命令「ｂｆ  ＿Ｌ００」は本来デクリメント・テスト命令「ｄｔ  ｒ３」の結果であるフラグは確定してから実行すべきであるが、分岐予測によって先行的に実行できるものとしている。更に、２回目のポストインクリメントロード命令「ｍｏｖ  ＠ｒ０＋，ｒ４」及び「ｍｏｖ  ＠ｒ１＋，ｒ５」を1回目の加算命令「ａｄｄ  ｒ４，ｒ５」に先行して実行するために、ｒ４及びｒ５には1回目とは別の物理レジスタを割り当てている。
【００４０】
図３には、ロードレイテンシを図２で仮定した３から１０に伸ばした場合のループ部の動作が例示される。大規模データを扱う場合高速な小容量メモリには収まらないため、長いレイテンシを仮定することは現実的であるといえる。一方、プログラムには十分なローカリティがあって、命令フェッチが高速な小容量メモリに殆どヒットすることを期待しても良い。このため、分岐命令の実行サイクルは図２の場合と同じ３サイクルとする。さて、１ループ目の６命令は灰色に色付けされている。そして、図のように１サイクル目に３命令、２サイクル目に１命令、１２サイクル目に１命令、１３サイクル目に１命令実行される。この間、アウトオブオーダ実行によって後続命令が先行実行され、１３サイクル目には５ループ目の分岐命令「ｂｆ  ＿Ｌ００」が実行される。即ち、１ループ目と５ループ目の命令が同時に実行されており、命令バッファには５ループ分４０命令を保持する必要がある。図２のロードレイテンシが３の場合には２ループ分の１６命令内の実行順序入替えであったものが大幅に増加している。このように、アウトオブオーダ方式はレイテンシ増に対して性能を維持しようとすると大規模なハードウェアが更に大規模化する。
【００４１】
《実施形態１》
図４には、本発明の実施形態１に係るデータプロセッサのパイプライン構成が概略的に例示される。２つの命令フローを扱うために同一構成の中央演算処理装置であるナノプロセッサＣＰＵ１及びＣＰＵ２を備えている。夫々のナノプロセッサＣＰＵ１及びＣＰＵ２は別々の命令フローを実行し、双方のナノプロセッサによる機能の総体として一つの中央演算処理機能若しくはデータプロセッサ機能が実現される。
【００４２】
各ナノプロセッサＣＰＵ１，ＣＰＵ２の基本構造は一般的なインオーダ発行型スカラプロセッサである。パイプラインは２段の命令フェッチステージＩ１及びＩ２、デコードステージＤ、実行ステージＥ、及び２段のメモリアクセスステージＭ１及びＭ２から成る。２つのナノプロセッサＣＰ１，ＣＰＵ２は同一構成であるため代表として一方のナノプロセッサＣＰＵ１の構成について説明する。まず、Ｉ１及びＩ２で命令メモリＩ−ＭＥＭから命令ＩＮＳＴをフェッチし命令キューＩＱにラッチする。通常の命令フェッチはアドレスをインクリメントしながらの連続アドレスフェッチであるが、分岐命令等でアドレスが不連続に変化する場合は分岐処理部ＢＲからの命令アドレスＩＡ１を使用して命令フェッチを行う。実行すべき命令アドレスを保有するプログラムカウンタは図４において命令デコーダＩＤの回路ブロックに含まれている。そして、Ｄステージで命令デコーダＩＤ及び分岐処理部ＢＲによって命令デコード及び分岐処理を行うと共に、命令デコード情報に基づいてレジスタリード部ＲＲでレジスタファイルＲＦからのレジスタリードを行う。レジスタファイルＲＦは命令実行に用いられる汎用レジスタ等のレジスタを複数個有する。更に、必要に応じてフォワーディング部ＦＷＤで演算部ＡＬＵの演算結果ＡＬＵ１又はデータメモリＤ−ＭＥＭからのロードデータＬＤのフォワーディングを行う。その後、ＥステージのＡＬＵで演算、アドレス計算等を行い、必要に応じてＭ１及びＭ２ステージでデータロード又はデータストアを行う。そして、演算結果ＡＬＵ１又はロードデータＬＤをレジスタファイルＲＦにラッチする。尚、本データプロセッサにおいて例えば２つのナノプロセッサＣＰＵ１、ＣＰＵ２はプログラムカウンタを別々の持ち、命令メモリＩ−ＭＥＭ及びデータメモリＤ−ＭＥＭをシェアしている。
【００４３】
図５には、本発明の実施形態１に係るデータプロセッサ向けにアセンブルしたプログラムが例示される。図１の単一命令フローを２分割し、第１の命令フローは配列ａ及びｂからデータを読出し、第２の命令フローは読出した値を加算して配列ｃにストアしている。図１の単一命令フローと比較すると、ループ構造を規定する命令である即値転送命令「ｍｏｖ  ＃Ｎ，ｒ３」、デクリメント・テスト命令「ｄｔ  ｒ３」、及び条件分岐命令「ｂｆ  ＿Ｌ１０」「ｂｆ  ＿Ｌ２０」を双方に記述し、他の命令は分配している。ナノプロセッサＣＰＵ１，ＣＰＵ２には、レジスタファイルＲＦ内のレジスタが保有するデータ（レジスタオペランド）の有効／無効を示すフラグビットとしてレジスタバリッドビットｒｖが設けられている。ナノプロセッサＣＰＵ１，ＣＰＵ２相互間でのレジスタオペランドの参照や更新に際して、ナノプロセッサＣＰＵ１，ＣＰＵ２は命令デコードにおいてレジスタバリッドビットｒｖを参照し、対応するレジスタバリッドビットｒｖが有効を意味するときレジスタオペランドを参照し（無効なときは有効になるまで待つ）、対応するレジスタバリッドビットｒｖが無効を意味するときレジスタオペランドの更新を行う（有効なときは無効になるになるまで待つ）。
【００４４】
ナノプロセッサＣＰＵ１，ＣＰＵ２の命令セットには相互間でのデータの参照や更新のための制御用いられるキープパラメータｋ、ナノプロセッサ番号パラメータｎｐを有する命令が含まれる。例えば各レジスタオペランドはデフォルトでは、参照されたら（レジスタから読出されたら）無効化され（ｋ＝０のとき）、書込みは同一命令フローのレジスタに行うものとされる（ｎｐ＝自ナノプロセッサ番号指定）。読出しても有効なまま保持する場合はｋ＝１を付ける。また、他の命令フローのレジスタに書込む場合はｎｐに指定する他のナノプロセッサ番号を付ける。図５の例では同一の値を２度使用することがないためｋ＝１の付いた命令はない。尚、デクリメント・テスト命令「ｄｔ  ｒ３」のｒ３と加算命令「ａｄｄ  ｒ４，ｒ５」のｒ５はモディファイレジスタであるため新たな値が書込まれて有効となり、無効化指示をする意味がない。即ち、無効化指示は読出しオペランドにおいてのみ意味がある。他の命令フローのレジスタに書込む場合の例は第１の命令フローの２つのロード命令「ｍｏｖ  ＠ｒ０＋，ｒ４／２」及び「ｍｏｖ  ＠ｒ１＋，ｒ５／２」である。／２が第２の命令フローのレジスタに書込むことを示している。
【００４５】
図６には、本発明を適用したデータプロセッサ向けの命令コードフォーマットが例示される。命令語は１６ビット長及び３２ビット長が混在している。図６に示される命令フォーマットは他命令フローの参照レジスタへの書込み指示を有する命令、及び参照レジスタ無効化指示を有する命令をエンコードできるように定義されている点に特徴がある。図中、ｅは命令コードの拡張部ｅｘｔの有無を表し、ｅ＝１であれば拡張部ｅｘｔを持つ。ｏｐはオペコード（オペレーションコード）、ｉｍは命令コードに埋め込まれた即値であり、ｏｐ／ｉｍはオペコードと即値に適宜割り振ることを表す。ｒａ、ｒｂ、ｒｃは読出しレジスタ番号フィールド、ｍａ、ｍｂはモディファイレジスタ番号フィールド、ｗａは書込みレジスタ番号フィールドである。ｋは読出しレジスタの無効化を指示するキープフィールドであり、１であれば有効なまま保持、０であれば無効化する。ｎｐはナノプロセッサ番号フィールドであり、ｍａ又はｗａの書込みナノプロセッサを指定するフィールドである。尚、図６においてｍａ，ｍｂ，ｗａの各フィールドがディスティネーションを指定するフィールドとされ、ｒａ，ｒｂ，ｍａ，ｍｂの各フィールドがソースを指定するフィールドとされ、ｒｃのフィールドは３オペランド命令フォーマットにおける第２ソースフィールドとされる。以下において参照するプログラム及びプログラム動作を説明するための図面においてキープフィールドｋ及びナノプロセッサ番号フィールドｎｐの値はデフォルト以外を図示し、デフォルト値の図示は省略する。
【００４６】
図７には、本発明の実施形態１に係るデータプロセッサによる図５に示したプログラムの動作が例示される。各命令の右側にはプログラムで使用しているレジスタの有効無効状態を意味するレジスタバリッドビットｒｖの値が示される。値が１であれば、前から有効であったか、新たに有効になったかを示している。値が0であれば、前から無効であったか、新たに無効になったかを示している。図７では新たに有効又は無効になった場合は太枠で囲んで強調している。尚、レジスタの最後の読出しと新たな書込みが同サイクルで行われる場合、サイクル単位では無効状態にならない。1サイクルレイテンシのモディファイレジスタや、最後の読出しと同サイクルに他の命令フローからの書込みが行なわれた場合にはこうした動作になる。そして、命令実行可能であるためには命令実行前に読出すレジスタが有効である必要がある。
【００４７】
第１の命令フローでは、最初の３命令で２つの配列へのポインタとループ回数をセットアップする。この結果、ｒ０、ｒ１、及びｒ３が逐次有効となる。次にループ内の４命令を実行した後で分岐によるパイプラインストールが２サイクル発生しループの先頭に戻る。ループ内では、まず２つのロード命令「ｍｏｖ  ＠ｒ０＋，ｒ４／２」及び「ｍｏｖ  ＠ｒ１＋，ｒ５／２」が実行される。ｒ０及びｒ１は有効なので命令はストールなく実行される。ｒ０及びｒ１はポストインクリメントによって次の配列要素を指すようにモディファイされ、再び有効となる。ロードレイテンシは３としているので命令実行から３サイクル目にロード先のレジスタである第２命令フローのｒ４及びｒ５が有効となる。次に、デクリメント・テスト命令「ｄｔ  ｒ３」を実行する。ｒ３は有効なので命令はストールなく実行され、ｒ３はデクリメント後に再び有効となる。テスト結果のフラグであるＴビットも有効となる。ループ回数が残っていてｒ３が０にならなければＴビットは０となる。ループの最後では条件分岐命令「ｂｆ  ＿Ｌ１０」が実行され、Ｔビットは０なので分岐が成立し、ループの先頭に戻る。以下、ループ回数がデクリメントされて０になるまでループ内の処理を繰り返す。
【００４８】
一方、第２の命令フローでは最初の２命令で配列へのポインタとループ回数をセットアップし、ループ先頭の加算命令「ａｄｄ  ｒ４，ｒ５」が使用するｒ４及びｒ５が有効になるのを待つ。第１の命令フローでは４，５サイクル目にｒ４及びｒ５へのロードを開始し、３サイクルかかるので６，７サイクル目にｒ４及びｒ５が有効になる。この結果、８サイクル目に加算命令「ａｄｄ  ｒ４，ｒ５」が実行可能となる。そして、ｒ４が最後の読出しによって無効となり、ｒ５が加算結果の書込みによって、再び有効となる。続いてストア命令「ｍｏｖ  ｒ５，＠ｒ２＋」によって演算結果のストアを行う。ｒ２及びｒ５が有効なためストールなく実行される。そして、ｒ５が最後の読出しによって無効となり、ｒ２が再び有効となる。最後に第１の命令フローと同様に、デクリメント・テスト命令「ｄｔ  ｒ３」及び条件分岐命令「ｂｆ  ＿Ｌ２０」を実行し、２サイクルストール後にループの先頭に戻る。
【００４９】
このように、第２の命令フローは第１の命令フローの詳細な実行状態を把握しなくても、第１の命令フローによるレジスタ書込みによってレジスタが有効になったことを知るだけで、適切なタイミングで依存関係のある命令を実行することができる。
【００５０】
図２のように、３命令同時発行可能で、大規模な発行命令キューを持つアウトオブオーダプロセッサは１ループ当り３サイクルで実行可能であった。これに対して図７では１ループ当り６サイクルかかっており、ハードウェア量を考えると性能の割には効率的であるといえるが、分岐性能を改善すれば１ループ当り３サイクルで実行することも可能である。例えば、ＤＳＰにおいて一般的な小ループ構造定義命令を用いれば、ループの先頭、末尾、ループ回数を指定して、ループ内の命令を命令キューに保持し続け、指定ループ回数実行した後に、ループ構造を抜けて後続命令に進むことが可能となる。この場合、図５のプログラムは図８のようになる。３本のレジスタ、ｓｔａｒｔ、ｅｎｄ、及びｌｏｏｐにループ開始アドレス、ループ終了アドレス、及びループ回数を書込むことによってループ構造が定義され、ループ回数レジスタｌｏｏｐの値をデクリメントして０になったらループ構造を抜けて後続命令に進む。
【００５１】
図９には、図８のプログラムの動作が示される。分岐命令が不要となった結果、ロードストアリソースネックで性能が決まり、ループ４回目以降の定常状態では１ループ当り３サイクルで実行している。この結果、２つの単純なインオーダ型スカラプロセッサで、大規模なアウトオブオーダ型スーパースカラプロセッサと同等性能を達成している。
【００５２】
図９では図７に比べて命令発行間隔が縮まっているため逆依存のルールを無視しているように見える。図２の説明で言及したように従来のアウトオブオーダ型プロセッサでは物理レジスタの割当てを変えることにより逆依存を解消している。しかし、本発明では他の命令フローを実行しているＣＰＵのレジスタに書込む場合はレジスタが無効になるのを待つため、書込み命令発行が早過ぎても逆依存の問題は発生しない。図９では、第１の命令フローの５サイクル目のｒ４へのロードは、第２の命令フローの７サイクル目の加算によるｒ４の最後の読出しによるｒ４の無効化を待って、ｒ４への書込みを行う。同様に、第１の命令フローの６サイクル目のｒ５へのロードは、第２の命令フローの８サイクル目のストアによるｒ５の最後の読出しによるｒ５の無効化を待って、ｒ５への書込みを行う。
【００５３】
「実行を開始した命令が、書込みレジスタが無効でないために無効になるのを待つ」という動作は従来のデータプロセッサにはなかった動作である。しかし、類似の動作はある。例えば、キャッシュストア時にキャッシュミスした場合、ストアデータを保持しておいて、パイプラインストールするかストアバッファに書込んでおいて後続命令の処理を進めながら待つかしてキャッシュエントリのリプレースを待って、ストアデータの書き込みを行う。本発明の場合も、パイプラインストール又は書込みデータバッファを実装すれば、書込みレジスタが無効になることを待つことができる。しかも、ストアバッファのように後続のロードとのアドレスの一致比較や一致した場合のストアデータのロードデータへのフォワーディングといった処理が不要であるため、小規模なハードウェアで実現可能である。
【００５４】
図１０には、ロードレイテンシ１０の場合の図８のプログラムの動作が示される。ロードレイテンシが伸びた分、第２の命令フローの実行が遅延しているが、第１の命令フローはそれに影響されることなく先行実行されるので、ロードレイテンシは隠蔽され、１ループ当り３サイクルのスループットは維持される。先行実行されるロード命令が増える分、前述の書込みデータバッファのエントリ数を増やす必要があるけれども、前述のようにエントリ数の割には小規模なハードウェアで実現可能である。
【００５５】
図１１には、レジスタ有効性判定論理１の例が示される。判定論理１はレジスタ毎に用意する。図６のように様々な命令フォーマットが定義されると、命令によってレジスタオペランドの数が異なる。レジスタオペランドが読出し用、書込み用、モディファイ用のいずれであるかも異なる。そこで、図のように命令コードからレジスタフィールドａ、ｂ、及びｃが読出しレジスタであることを示す信号ｒｅａｄ＿ａ＿ｖａｌｉｄ、ｒｅａｄ＿ｂ＿ｖａｌｉｄ、及びｒｅａｄ＿ｃ＿ｖａｌｉｄと、レジスタフィールドａ及びｂが自分のレジスタへの１サイクルレイテンシの書込みであることを示す信号ｗｒｉｔｅ＿ａ＿ｖａｌｉｄ及びｗｒｉｔｅ＿ｂ＿ｖａｌｉｄを生成し、レジスタ毎の判定論理１に出力する。また、命令コードのレジスタフィールドａ（ｒａ，ｍａ，ｗａ），ｂ（ｒｂ，ｍｂ），ｃ（ｒｃ）をデコードしてデコード結果ａ＿ｉｓ［ｘ］、ｂ＿ｉｓ［ｘ］、ｃ＿ｉｓ［ｘ］を各判定論理１に分配する。ｘはレジスタ番号を表す。図６のフォーマットではレジスタフィールドは３ビットなのでレジスタファイルは０〜７の８本とする。したがって、ｘは０〜７である。このとき、併せて前記キープフィールドｋのデコードも行い、レジスタの読出しが最後であることを示す信号ｒｅａｄ＿ａ＿ｌａｓｔ、ｒｅａｄ＿ｂ＿ｌａｓｔ、及びｒｅａｄ＿ｃ＿ｌａｓｔを生成し、レジスタ毎の判定論理１に出力する。
【００５６】
レイテンシが１でない場合はレジスタが有効になるのに時間がかかるため一旦書込み番号をバッファして後で有効信号と共に供給する。レイテンシが１サイクルでない場合は３サイクルであるとすると、２サイクルバッファしてから供給する。図１１ではバッファした番号がラッチｄｅｌａｙにあるものとし、これをデコードしてデコード結果ｄ＿ｉｓ［ｘ］を各判定論理１に送る。同時に書込み有効信号ｗｒｉｔｅ＿ｄ＿ｖａｌｉｄを全判定論理１に送る。また、他のナノプロセッサからの書込みもあるので、他のナノプロセッサからの書込みレジスタ番号ｅｘｔもデコードし、デコード結果ｅ＿ｉｓ［ｘ］を各判定論理１に送る。同時に他のナノプロセッサからの書込みの有効信号ｗｒｉｔｅ＿ｅ＿ｖａｌｉｄを全判定論理１に送る。
【００５７】
各レジスタ用の判定論理１ではまず、読出しありＲｅａｄ［ｘ］、書込みありｗｒｉｔｅ［ｘ］及び最後の読出しｒｅａｄ＿ｌａｓｔ［ｘ］を生成し、これらの信号からストール指示ｓｔａｌｌ［ｘ］、書込み待ち指示ｗｒｉｔｅ＿ｗａｉｔ［ｘ］、及び次サイクル有効ｖａｌｉｄ＿ｎｅｘｔ［ｘ］を生成して出力する。ストール指示ｓｔａｌｌ［ｘ］は、対応レジスタにリードが指定されているが当該レジスタが無効（〜ｒｅｇ＿ｖａｒｉｄ［ｘ］）のとき活性化される。書込み待ち指示ｗｒｉｔｅ＿ｗａｉｔ［ｘ］は、対応レジスタにライトが指定されていて当該レジスタが有効（ｒｅｇ＿ｖａｒｉｄ［ｘ］）であって最後の読出しでない（〜ｒｅａｄ＿ｌａｓｔ［ｘ］）のとき活性化される。次サイクル有効ｖａｌｉｄ＿ｎｅｘｔ［ｘ］は、対応レジスタにライトが指定されているか、又は当該レジスタが有効（ｒｅｇ＿ｖａｒｉｄ［ｘ］）であって最後の読出しでない（〜ｒｅａｄ＿ｌａｓｔ［ｘ］）とき、活性化される。図１１においてｒｅｇ＿ｖａｌｉｄ［ｘ］はレジスタ毎のレジスタバリッドビットｒｖを意味する。２はナノプロセッサＣＰ１の８個のレジスタに夫々対応されるレジスタバリッドビットｒｖを備えたバリッドビットフラグレジスタである。
【００５８】
この後、各レジスタ用の判定論理１から出力されたストール指示ｓｔａｌｌ［ｘ］を全てＯＲしてナノプロセッサのストール指示ｓｔａｌｌ＿ｎａｎｏｐｒｏｃｅｓｓｏｒを生成する。同様に、各レジスタ用の判定論理１から出力された書込み待ち指示ｗｒｉｔｅ＿ｗａｉｔ［ｘ］を全てＯＲしてナノプロセッサの書込み待ち指示ｗｒｉｔｅ＿ｗａｉｔを生成する。更に、各レジスタ用の判定論理１から出力されたｖａｌｉｄ＿ｎｅｘｔ［ｘ］をラッチしてレジスタ有効信号ｒｅｇ＿ｖａｌｉｄ［ｘ］とする。即ち、ｋ＝０が指示されているレジスタに対する読出しの場合はｖａｒｉｄ＿ｎｅｘｔに対応するレジスタのレジスタバリッドビットｒｖが無効化され、ｋ＝１が指示されているレジスタに対する読出した場合はｖａｒｉｄ＿ｎｅｘｔに対応するレジスタのレジスタバリッドビットｒｖは有効のままにされ、書き込みの場合も対応するレジスタのレジスタバリッドビットｒｖは有効にされる。
【００５９】
以上のような論理によって各レジスタの有効性が適切に管理され、各ナノプロセッサの命令実行可否判定のストールやナノプロセッサ間のデータ交換の同期が可能となる。
【００６０】
図１２には、レジスタ有効性判定論理１の動作フローが示される。有効性判定論理に従って、レジスタリード可能（Ｒｅａｄ  ＯＫ）か、ストールが必要（ｓｔａｌｌ）か、書込み可能（Ｗｒｉｔｅ  ＯＫ）か、待たせる（Ｗｒｉｔｅ  Ｗａｉｔ）か、レジスタが有効（Ｖａｌｉｄ）になるか、無効（Ｉｎｖａｌｉｄ）になるかを判定する。判定にはレジスタが有効か（ｒｅｇ＿ｖａｌｉｄ？）、読出しがあるか（Ｒｅａｄ？）、最後の読出しか（ｒｅａｄ＿ｌａｓｔ？）及び書込みがあるか（Ｗｒｉｔｅ？）を使用する。
【００６１】
まず、レジスタが有効かつ読出しがあればレジスタリード可能（Ｒｅａｄ  ＯＫ）であるため、左から４ケースの＃１〜＃４ではレジスタリード可能（Ｒｅａｄ  ＯＫ）となっている。逆に、レジスタが無効かつ読出しがあればストールが必要（ｓｔａｌｌ）であるため、＃７及び＃８ではストールが必要（ｓｔａｌｌ）となっている。ストールが必要かどうかという観点からは＃７及び＃８以外は不要である。また、レジスタ書込みがある奇数番目のケースでは、最後の読出しの終わった＃１と元々無効であった＃７及び＃９では書込み可能（Ｗｒｉｔｅ  ＯＫ）であり、レジスタが有効で最後の読出しではなかった＃３と読出しがなくレジスタが有効なままの＃５では書込みが待たされる。更に、最後の読出しがあって書込みのない＃２とレジスタが無効のまま書き込みのない＃８と＃１０ではレジスタが無効（Ｉｎｖａｌｉｄ）になり、他の場合では、＃１、＃７、及び＃９では新たな書込みによってレジスタが有効（Ｖａｌｉｄ）になり、＃３〜＃６では有効な値が保持されたままであるために引き続き有効（Ｖａｌｉｄ）になっている。
【００６２】
《実施形態２》
図１３には、本発明の実施形態２に係るデータプロセッサが例示される。実施形態２においては、各ナノプロセッサが単機能化されており、命令フェッチナノプロセッサ（ＩＦ  Ｎａｎｏｐｒｏｃｅｓｓｏｒ）ＩＦＮ、演算ナノプロセッサ（ＥＸ  Ｎａｎｏｐｒｏｃｅｓｓｏｒ）ＥＸＮ、ロードナノプロセッサ（ＬＤ  Ｎａｎｏｐｒｏｃｅｓｓｏｒ）ＬＤＮ、ストアナノプロセッサ（ＳＴ  Ｎａｎｏｐｒｏｃｅｓｓｏｒ）ＳＴＮ、命令メモリ（Ｉ−ＭＥＭ）、及びデータメモリ（Ｄ−ＭＥＭ）からなる。
【００６３】
各ナノプロセッサのパイプラインは通常のプロセッサのパイプラインを簡素化したものになっている。また、基本構成は類似しており、デコードステージＤ、実行ステージＥ、及び２段のメモリアクセスステージＭ１及びＭ２から成る。
【００６４】
まず、命令フェッチナノプロセッサＩＦＮについて説明する。命令キューＩＱの命令をＤステージで命令デコーダＩＤによって命令デコードすると共に、命令デコード情報に基づいてレジスタリード部ＲＲでレジスタファイルＲＦからのレジスタリードを行う。更に、必要に応じてフォワーディング部ＦＷＤで命令アドレス生成部ＩＡＧ出力ＩＡのフォワーディングを行う。その後、Ｅステージの命令アドレス計生成部ＩＡＧで命令アドレスＩＡの生成を行い、Ｍ１及びＭ２ステージで命令フェッチを行う。そして、フェッチした命令ＩＮＳＴを４つのナノプロセッサの内のいずれかの命令キューＩＱにラッチする。どの命令キューＩＱにラッチするかは命令フェッチナノプロセッサが実行する命令で指定する。命令の種類については後述する。
【００６５】
次に、演算ナノプロセッサＥＸＮについて説明する。命令キューＩＱの命令をＤステージで命令デコーダＩＤによって命令デコードすると共に、命令デコード情報に基づいてレジスタリード部ＲＲでレジスタファイルＲＦからのレジスタリードを行う。更に、必要に応じてフォワーディング部ＦＷＤで演算部ＥＸ出力ＥＸＯ又はデータメモリＤ−ＭＥＭからのロードデータＬＤのフォワーディングを行う。その後、Ｅステージの演算部ＥＸで演算を行い、出力ＥＸＯをレジスタファイルＲＦに格納する。格納するレジスタファイルは演算ナノプロセッサＥＸＮが実行する命令で指定する。他のナノプロセッサのレジスタに書込むことによって複雑なアドレス計算を行ってロードナノプロセッサＬＤＮ又はストアナノプロセッサＳＴＮに渡したり、演算結果をストアするためにストアナノプロセッサＳＴＮに渡したりすることが可能となる。
【００６６】
次に、ロードナノプロセッサＬＤＮについて説明する。命令キューＩＱの命令をＤステージで命令デコーダＩＤによって命令デコードすると共に、命令デコード情報に基づいてレジスタリード部ＲＲでレジスタファイルＲＦからのレジスタリードを行う。更に、必要に応じてフォワーディング部ＦＷＤでロードアドレス生成部ＬＡＧ出力ＬＡ又はデータメモリＤ−ＭＥＭからのロードデータＬＤのフォワーディングを行う。その後、Ｅステージのロードアドレス生成部ＬＡＧでロードアドレスＬＡを生成し、Ｍ１及びＭ２ステージでデータメモリＤ―ＭＥＭからのロードを行い、ロードデータＬＤをレジスタファイルＲＦに格納する。格納するレジスタファイルＲＦはロードナノプロセッサＬＤＮが実行する命令で指定する。通常は演算ナノプロセッサＥＸＮに渡して演算するが、メモリ間データ転送であればストアナノプロセッサＳＴＮに渡し、データリンクをたどるような場合はロードナノプロセッサＬＤＮのレジスタファイルＲＦに格納する。また、アドレスレジスタを更新する場合はロードアドレス生成部ＬＡＧの出力ＬＡをレジスタファイルＲＦに格納する。
【００６７】
次に、ストアナノプロセッサＳＴＮについて説明する。命令キューＩＱの命令をＤステージで命令デコーダＩＤによって命令デコードすると共に、命令デコード情報に基づいてレジスタリード部ＲＲでレジスタファイルＲＦからのレジスタリードを行う。更に、必要に応じてフォワーディング部ＦＷＤでストアアドレス生成部ＳＡＧ出力ＳＡ又はデータメモリＤ−ＭＥＭからのロードデータのフォワーディングを行う。その後、Ｅステージのストアアドレス生成部ＳＡでストアアドレスＳＡを生成し、Ｍ１及びＭ２ステージでデータメモリＤ―ＭＥＭにストアデータＳＤをストアする。また、アドレスレジスタを更新する場合はストアアドレス生成部ＳＡＧの出力ＳＡをレジスタファイルＲＦに格納する。
【００６８】
図１４には、本発明の実施形態２に係るデータプロセッサ向けにアセンブルした第２のプログラムが例示される。図１のプログラムはデータを２度以上使用することがなく本発明の特徴である読出しデータの保持と無効化のうち保持する例が現れない。そこで図１の第１のプログラムとは別の第２のプログラムを使用する。（１）はC言語で表したプログラムである。第２のプログラムは２つの配列ａ及びｂの各要素の和と差をとり、それぞれ別の配列ｃ及びｄに格納する。（２）は図１３に例示した実施形態２に係るプロセッサ用のアセンブラコードである。４つのナノプロセッサ用に４つのフローに分割されている。
【００６９】
命令フェッチフローでは、残りの３つのデータ処理フロー用コードの各命令キューＩＱへのロードを行う。まず、命令キューロード・ループ設定命令「ｉｑｌｐ／ｌｄ  ＿ＬＤ０，４，３，４，Ｎ」はラベル＿ＬＤ０から４命令をロードナノプロセッサＬＤＮの命令キューＩＱにロードし、３命令目から４命令目をＮ回ループさせるように設定する命令である。オペランドが多いので３２ビット命令とし、ラベルアドレスをプログラムカウンタからの８ビットオフセットで示し、ロード命令数、ループ開始命令、及びループ終了命令を３ビットずつ、ループ回数を６ビットで表現したとすると２３ビットをオペランドに使用する。更にビット数を増やしたい場合は、命令を命令キューロードとループ設定用に分割すればよい。図１４の例では１命令にパックすることが可能である。図６の命令フォーマットでは１番目のレジスタオペランドのないフォーマットを使用すればよい。先頭ビットのeを１にすれば３２ビット命令となる。同様に、「ｉｑｌｐ／ｅｘ  ＿ＥＸ０，２，１，２，Ｎ」はラベル＿ＥＸ０から２命令を演算ナノプロセッサＥＸＮの命令キューＩＱにロードし、１命令目から２命令目をＮ回ループさせるように設定する。また、「ｉｑｌｐ／ｓｔ  ＿ＳＴ０，４，３，４，Ｎ」はラベル＿ＳＴ０から４命令をストアナノプロセッサＳＴＮの命令キューＩＱにロードし、３命令目から４命令目をＮ回ループさせるように設定する。
【００７０】
ロードフローではループ前に配列ａ及びｂの先頭アドレスをｒ０及びｒ１に設定し、ループ内で「ｍｏｖ  ＠ｒ０＋，ｒ０／ｅｘ」及び「ｍｏｖ  ＠ｒ１＋，ｒ１／ｅｘ」によって配列ａ及びｂの要素をアドレスの小さい方から逐次ロードしていく。アドレス用のｒ０及びｒ１はロードナノプロセッサＬＤＮのレジスタであり、ロード後にインクリメントされる。ｒ０／ｅｘ及びｒ１／ｅｘは演算ナノプロセッサＥＸＮのレジスタである。ロードデータを演算するために、ロード命令のデスティネーションを演算ナノプロセッサＥＸＮのレジスタにしている。これらのロード命令は図６の命令フォーマットでは8番目を使用する。アドレス用のｒ０及びｒ１はｍｂフィールドに割当て、デスティネーションのｒ０／ｅｘ及びｒ１／ｅｘにはｗａフィールドを使用し、ｎｐフィールドでｅｘナノプロセッサのレジスタであることを指定する。
【００７１】
演算フローではロードされた２つの値を加算命令「ａｄｄ  ｒ０／ｋ，ｒ１／ｋ，ｒ０／ｓｔ」及び減算命令「ｓｕｂ  ｒ０，ｒ１，ｒ１／ｓｔ」によって加減算する。このとき、ロードデータｒ０及びｒ１を２度ずつ参照するので１回目の加算による参照では／ｋを付けて値を保持している。２回目の減算による参照後はレジスタを無効化する。ｒ０／ｓｔ及びｒ１／ｓｔはストアナノプロセッサＳＴＮのレジスタである。演算結果はストアするためにストアナノプロセッサＳＴＮに送る。これらの加減算命令は図６の命令フォーマットでは９番目を使用する。本フォーマットにより読出しオペランドに適宜／ｋを付けて値を保持することが可能となる。加算命令のｒ０／ｓｔ及び減算命令のｒ１／ｓｔはｗａフィールドに割当て、ｎｐフィールドでストアナノプロセッサＳＴＮを指定する。
【００７２】
ストアフローではループ前に配列ｃ及びｄの先頭アドレスをｒ２及びｒ３に設定し、ループ内で演算ナノプロセッサＥＸＮから送られてきたデータを「ｍｏｖ  ｒ０，＠ｒ２＋」及び「ｍｏｖ  ｒ１，＠ｒ３＋」によって配列ｃ及びｄの要素へ逐次ストアしていく。これらのストア命令には図６の命令フォーマットでは６番目を使用する。ストアデータにｒｂフィールドを、ポストインクリメントするアドレスにｍａフィールドを割当てる。
【００７３】
図１５には、実施形態２のデータプロセッサによる図１３のプログラムの動作が示される。まず、命令フェッチフローの３命令を実行し、図１３のロード、演算、及びストアナノプロセッサＬＤＮ，ＥＸＮ，ＳＴＮの命令キューＩＱにロード、演算、及びストアフローを実行するための命令をセットアップする。より詳細には、命令キューロード・ループ設定命令「ｉｑｌｐ／ｌｄ  ＿ＬＤ０，４，３，４，Ｎ」が命令フェッチナノプロセッサＩＦＮの命令キューＩＱに書込まれると、命令デコーダＩＤで命令がデコードされ、＿ＬＤ０で示されるロードフローの先頭アドレスの生成用制御情報がセットアップされる。そして命令アドレス生成部ＩＡＧによって命令アドレスＩＡが生成され、命令メモリＩ−ＭＥＭをアクセスして、ロードフローの４命令をフェッチし、ロードナノプロセッサＬＤＮの命令キューＩＱに書込む。更に、ループ構造指定に従って、３，４命令目をＮ回繰り返すように制御を設定する。この結果、命令フェッチナノプロセッサＩＦＮの命令キューＩＱへの書込みから、ロードナノプロセッサＬＤＮの命令キューＩＱへの書込みまでは、命令フェッチナノプロセッサＩＦＮのＤ、Ｅ、Ｍ１、及びＭ２の４ステージを通過するので４サイクルかかり、図１５の５サイクル目からロードナノプロセッサＬＤＮの実行を開始する。同様に、演算及びストアフローの命令をセットアップすると、６および７サイクル目から実行可能となる。
【００７４】
ロードフローでは、最初の２命令でロード元の２つの配列ａ及びｂへのポインタをセットアップする。この結果、ｒ０及びｒ１が逐次有効となる。その後はループ動作に入り２つのロード命令「ｍｏｖ  ＠ｒ０＋，ｒ０／ｅｘ」及び「ｍｏｖ  ＠ｒ１＋，ｒ１／ｅｘ」を交互に実行していく。１１サイクル目に空きがあるのは、このサイクルで演算フローの加算命令「ａｄｄ  ｒ０／ｋ，ｒ１／ｋ，ｒ０／ｓｔ」がｒ０の値を保持したために９サイクル目のロード命令「ｍｏｖ  ＠ｒ０＋，ｒ０／ｅｘ」がｒ０／ｅｘの書込みを待たされるため、最小限の書込みデータバッファで実現するために後続命令をストールさせているためである。１０サイクル目の「ｍｏｖ  ＠ｒ１＋，ｒ１／ｅｘ」は既に発行しているためストールが間に合わず書込みデータバッファで書込みを待たせる。１３サイクル目以降はストアフローもメモリアクセスをして競合が起こるため、ロードが先行し過ぎることはなくなり、ロードデータの書込みが待たされることはなくなる。即ち、１３サイクル目以降のストールはストアフローとのメモリアクセス競合によるものである。
【００７５】
演算フローでは前述のように６サイクル目から実行可能となっており、先頭の加算命令「ａｄｄ  ｒ０／ｋ，ｒ１／ｋ，ｒ０／ｓｔ」がｒ０及びｒ１が有効になるのを待っている。そして１０サイクル目で有効となるので１１サイクル目に実行を開始する。そして、１１サイクル目ではｒ０及びｒ１の値を保持し、１２サイクル目で減算命令「ｓｕｂ  ｒ０，ｒ１，ｒ１／ｓｔ」を実行するとｒ０及びｒ１が無効化される。そして、書込みを待たされていたロードデータが１２及び１３サイクル目に書込まれて再びｒ０及びｒ１が有効になる。また、加減算命令のデスティネーションはストアナノプロセッサＳＴＮのｒ０及びｒ１なので、フォワーディングパスを使わずにストアナノプロセッサＳＴＮのレジスタファイルＲＦに書込む。このため、ストアナノプロセッサＳＴＮには加減算命令のレイテンシが２サイクルに見える。その後も、ループ制御によって加減算命令を繰り返し、ロードフローからの書込みによってｒ０及びｒ１が有効になる度に加減算命令を実行する。
【００７６】
ストアフローでは前述のように７サイクル目から実行可能となるので、最初の２命令でストア先の配列ｃ及びｄの先頭アドレスへのポインタをセットアップする。この結果、ｒ２及びｒ３が逐次有効となる。その後はループ動作に入り２つのストア命令「ｍｏｖ  ｒ０，＠ｒ２＋」及び「ｍｏｖ  ｒ１，＠ｒ３＋」を交互に実行していく。まず、１２サイクル目に演算フローからの書込みによってストアデータのｒ０が有効になるので１３サイクル目に「ｍｏｖ  ｒ０，＠ｒ２＋」を実行する。そして、ｒ０の値をｒ２の指すアドレスにストアし、ｒ０を無効化して、ｒ２をインクリメントする。同様に、１３サイクル目にストアデータのｒ１が有効になるので１４サイクル目に「ｍｏｖ  ｒ１，＠ｒ３＋」を実行する。以下同様に、ｒ０及びｒ１が有効になる度にストア命令を実行し、ｒ０及びｒ１の無効化とｒ２及びｒ３の更新を行っていく。
【００７７】
以上のように、４つのナノプロセッサＩＦＮ，ＥＸＮ，ＬＤＮ，ＳＴＮが協調してプログラムを効率的に実行することができる。また、図１０で実施形態１の場合について示したように本発明の方式はレイテンシの増加に対して効率的に対応することができる。本実施形態２の場合においてもレイテンシ増に応じて図１５の演算及びストアフローの開始が遅れるだけで対応可能である。この時、前述の９、１０サイクル目のロードのように発行済みでストールが効かず書込みを待たされる命令数がレイテンシに比例して増加するため、そのための書込みバッファエントリ数は適宜増やす必要がある。
【００７８】
《実施形態３》
図１６には、本発明の実施形態３に係るデータプロセッサが例示される。実施形態３においては、実施形態２の各ナノプロセッサのうち、ロードナノプロセッサＬＤＮとストアナノプロセッサＳＴＮを統合して、ロードストアナノプロセッサ（ＬＳ  Ｎａｎｏｐｒｏｃｅｓｓｏｒ）ＬＳＮとしている。演算に先行して実行され演算用のソースオペランドをメモリから供給するロードと演算後に演算結果をメモリに格納するストアでは、本来、最適な実行タイミングが異なるため実施形態２のように分割してタイミングをずらせるようにすると性能向上に寄与する。しかしながら、メモリアクセス間の依存関係解析を容易にするにはメモリアクセスを逐次実行することが望ましい。そして特にアドレスの処理が逐次的であることが重要である。そこで、実施形態３ではロードストアナノプロセッサＬＳＮがメモリアクセスを逐次実行し、ストア処理では、ストアバッファを用いてストアデータを遅く受取れるようにして、メモリアクセス間の依存関係解析を容易にしながら、ストア処理を実質的に遅らせられるようにしている。
【００７９】
各ナノプロセッサのうち、命令フェッチ及び演算ナノプロセッサＩＦＮ，ＥＸＮは実施形態２と同様である。違いは、命令フェッチナノプロセッサＩＦＮの命令供給先が４から３になり、演算ナノプロセッサＥＸＮがデータを渡す相手がロード及びストアナノプロセッサＬＤＮ，ＳＴＮの２つからロードストアナノプロセッサＬＳＮのみとなった点である。ロードストアナノプロセッサＬＳＮは構造的には実施形態２のストアナノプロセッサＳＴＮと同様である。違いは、Ｄ−ＭＥＭに対してストアだけでなくロードのリクエストも行う点である。また、Ｄ−ＭＥＭ内にはストアバッファを用意し、ストアデータの遅れによるパイプラインの乱れを隠蔽する。
【００８０】
図１７には、本発明の実施形態３に係るプロセッサ向けにアセンブルした第２のプログラムが例示される。命令フェッチフローでは、ロードストア及び実行のデータ処理フロー用コードの各命令キューＩＱへのロードを行う。まず、命令キューロード・ループ設定命令「ｉｑｌｐ／ｌｓ  ＿ＬＳ０，８，５，８，Ｎ」はラベル＿ＬＳ０から８命令をロードストアナノプロセッサＬＳＮの命令キューＩＱにロードし、５命令目から８命令目をＮ回ループさせるように設定する命令である。同様に、「ｉｑｌｐ／ｅｘ  ＿ＥＸ０，２，１，２，Ｎ」はラベル＿ＥＸ０から２命令を演算ナノプロセッサＥＸＮの命令キューＩＱにロードし、１命令目から２命令目をＮ回ループさせるように設定する。
【００８１】
ロードストアフローではループ前に配列ａからｄの先頭アドレスをｒ０からｒ３に設定し、ループ内で「ｍｏｖ  ＠ｒ０＋，ｒ０／ｅｘ」及び「ｍｏｖ  ＠ｒ１＋，ｒ１／ｅｘ」によって配列ａ及びｂの要素をアドレスの小さい方から逐次ロードしていき、「ｍｏｖ  ｒ４，＠ｒ２＋」及び「ｍｏｖ  ｒ５，＠ｒ３＋」によって加減算結果を配列ｃ及びｄの要素へ逐次ストアしていく。一方、演算フローは図１４と同様であるが、デスティネーションがストアナノプロセッサＳＴＮからロードストアナノプロセッサＬＳＮに変わったために、ｎｐフィールドがｓｔからｌｓに変わっている。
【００８２】
図１８には、実施形態３のプロセッサによる図１７のプログラムの動作が示される。まず、命令フェッチフローの２命令を実行し、図１６のロードストア及び演算ナノプロセッサＬＳＮ，ＥＸＮの命令キューＩＱにロードストア及び演算フローを実行するための命令をセットアップする。詳細な動作は図１５の場合と同様である。そして、５サイクル目からロードストアフローを、６サイクル目から演算フローを実行できる。
【００８３】
ロードストアフローでは、最初の４命令で４つの配列ａからｄへのポインタをセットアップする。この結果、ｒ０からｒ３が逐次有効となる。その後はループ動作に入り２つのロード命令「ｍｏｖ  ＠ｒ０＋，ｒ０／ｅｘ」及び「ｍｏｖ  ＠ｒ１＋，ｒ１／ｅｘ」並びに２つのストア命令「ｍｏｖ  ｒ４，＠ｒ２＋」及び「ｍｏｖ  ｒ５，＠ｒ３＋」の4命令を繰返し実行していく。一方、演算フローの動作は図１５と同様である。ロードストアフローでのロード開始が図１５より２サイクル遅いため、演算フローも２サイクル遅れの動作となっている。
【００８４】
本動作例ではロードレイテンシを３サイクルとしているため、例えば１０サイクル目に開始したロード命令のロードデータは１２サイクル目の終わりに有効となり、１３サイクル目から使用可能となる。ロードストアフローの１１サイクル目のストア命令「ｍｏｖ  ｒ４，＠ｒ２＋」は演算フローの１３サイクル目の加算命令「ａｄｄ  ｒ０／ｋ，ｒ１／ｋ，ｒ４／ｌｓ」の演算結果を使用する。しかし、演算結果は待たずに先行して処理を開始し、ストアバッファによって演算結果の遅れを吸収する。同様に、１２サイクル目のストア命令「ｍｏｖ  ｒ５，＠ｒ３＋」は１４サイクル目の減算命令「ｓｕｂ  ｒ０，ｒ１，ｒ４／ｌｓ」の演算結果を使用するが、演算結果は待たずに先行して処理を開始する。この結果、ロードストアフローはストールせずに毎サイクル命令を実行し、メモリポートが１ポートの場合の最大スループットを維持できる。
【００８５】
図１９には、ストアバッファによるデータ依存ストールの回避動作の詳細が示される。図１８の１１から１６サイクルの動作を示している。ロードストアフローの１１サイクル目のストア命令「ｍｏｖ  ｒ４，＠ｒ２＋」は、Ｄステージで命令デコードＩＤ及びレジスタリードＲＲを行い、Ｅステージでデータアドレス生成ＤＡＧを行い、Ｍ１ステージでアドレスライトバックＷＢ及びストアバッファアドレス書込みＳＢＡを行い、ストアデータの到着を待つ。尚、Ｄ−ＭＥＭがキャッシュの場合はタグアレイを引いてヒットミス判定をしておく。更に、アドレス変換やメモリ保護チェックを行なう場合もＭ１ステージで行う。ストアデータは演算フローの１３サイクル目の加算命令「ａｄｄ  ｒ０／ｋ，ｒ１／ｋ，ｒ４／ｌｓ」が生成するので、この加算命令のレジスタ書込みステージＷＢで有効となり、このタイミングでストアバッファデータ書込みＳＢＤを行う。その後、直ちにＤ−ＭＥＭに書込めるタイミングでは、１４サイクル目のロード「ｍｏｖ  ＠ｒ１＋，ｒ１／ｅｘ」がＭ１ステージでＤ−ＭＥＭのデータアレイにアクセスしているため、１サイクル待って１５サイクル目のストア命令「ｍｏｖ  ｒ４，＠ｒ２+」のＭ１ステージで行う。このストア命令は１１サイクル目のと同様にアドレスライトバックＷＢ及びストアバッファアドレス書込みＳＢＡ等を行っているが、データ書込のためのデータアレイアクセスはしないため、ストアバッファからのデータアレイにアクセスが可能となる。このように、ストアバッファは後続命令がＭ１ステージでデータアレイにアクセスしない場合にメモリへの書込みを行う。以上のようにストアバッファによってデータ依存ストールの回避が可能となる。
【００８６】
《実施形態４》
前述の実施形態１はナノプロセッサを２つ必要とし、実施形態２及び３では複数命令フローを必要とする。命令フロー分割が最も効果的なのはレイテンシの長いロード命令を先行実行する場合であるため、この場合に限定して処理フローを分割すれば既存プロセッサに近い構成を採っても処理能力を高めることが出来る。
【００８７】
図２０には、本発明の実施形態４に係るデータプロセッサが例示される。本実施形態では中央演算処理装置（単にＣＰＵとも記す）は既存プロセッサと同様な構成であるため内部構造の詳細説明は省略する。ＣＰＵはデータ転送ユニットＤＴＵ、命令メモリＩ−ＭＥＭ、データメモリＤ−ＭＥＭ、及び拡張メモリＥ−ＭＥＭと接続されている。命令メモリＩ−ＭＥＭには命令アドレスＩＡを出力して命令ＩＮＳＴを受取る。データメモリＤ−ＭＥＭにはデータアドレスＤＡを出力してロードデータＬＤを受取るか、データアドレスＤＡ及びストアデータＳＤを出力してストアを行わせるかする。データ転送ユニットＤＴＵにはデータアドレスや転送タイプ等をＤＴＩＮＦとして送り、データ転送ユニットＤＴＵがデータアドレスＥＤＡを出力して、ＣＰＵがそれと同期してロードデータＥＬＤを受取るか、ストアデータＥＳＤを出力する。また、ロードデータをレジスタやフォワーディングハード等で受取れない場合に備えてロードデータオーバランバッファＬＤＯＢを備えている。
【００８８】
図２１には、実施形態４に係るデータプロセッサ向けにアセンブルした第１のプログラムが例示される。最初の５命令はデータ転送ユニットＤＴＵに対する配列ａからの連続ロード要求である。最初の命令でデータ転送ユニットＤＴＵの転送チャネルｃｈ１の制御レジスタアドレスをｒ０に格納する。次の命令で配列ａへのポインタをｒ１に格納する。そして、次の命令でｒ０の指す転送チャネルｃｈ１のアドレスレジスタにｒ１に格納された配列ａへのポインタを書込む。この時ｒ０の値は保持する。次の命令では転送チャネルｃｈ１の制御情報ｃｈ１ｃｎｔｌをｒ１に書込む。そして、次の命令でｒ０の指す転送チャネルｃｈ１の制御レジスタにｒ１に格納された制御情報ｃｈ１ｃｎｔｌを書込む。次の５命令は、同様にデータ転送ユニットＤＴＵの転送チャネルｃｈ２に配列ｂからの連続ロード要求を出している。その後、ｒ２に配列ｃへのポインタを格納し、繰返し回数Ｎをｒ３に格納して初期化処理を完了する。
【００８９】
ループ部では、転送チャネルｃｈ１及びｃｈ２からの配列ａ及びｂの値をそれぞれｒ４及びｒ５で受け、これらを加算命令で加算し、ループ変数ｒ３をデクリメントしてゼロかどうかをチェックしてフラグに反映し、加算結果ｒ５をｒ２の指す配列ｃに格納し、分岐命令でフラグをチェックしてｒ３がゼロになっていればループを抜け、そうでなければループ先頭に戻る。
【００９０】
図２２には、ロードレイテンシが１０の場合の実施形態４のデータプロセッサによる図２１のプログラムの動作が示される。実施形態４のＣＰＵは２命令同時発行のスーパスカラプロセッサとする。まず、初期化部の１２命令を２命令ずつ実行し、データ転送ユニットＤＴＵに配列ａ及びｂからの連続ロードを開始させる。更に、ｒ２に配列ｃへのポインタを格納し、繰返し回数Ｎをｒ３に格納して初期化処理を完了する。
データ転送ユニットＤＴＵでは３及び５サイクル目にそれぞれｃｈ１及びｃｈ２のセットアップが完了してロードを開始する。そして、レイテンシ１０を仮定しているため、ｃｈ１及びｃｈ２の最初のデータはそれぞれ１２及び１４サイクル目の終りに到着する。この結果、ループ部は１５サイクル目から開始される。そして、１５サイクル目で加算命令を実行するとｒ４が無効となるためｃｈ１からの次のデータがｒ４に書込まれる。更に、１６サイクル目でストア命令を実行するとｒ５が無効となるためｃｈ２からの次のデータがｒ５に書込まれる。この間、ループ制御のためのデクリメント及びテスト命令ｄｔ及び分岐命令ｂｆも実行される。その後はこれら４命令を繰返し実行する。この結果、１０サイクルという長いレイテンシであっても少ないレジスタ本数で滞りなく処理を進めることが出来る。そして、更に実施形態１のようなループ構造定義命令を用いればループ本体は２命令となり１ループを１サイクルで実行することも可能である。但し、この場合メモリアクセスネックとなる恐れがあるため、データ転送ユニットＤＴＵが４データずつロードしたり、ストア処理を４データずつコンバインしたりするか、メモリを多バンク又は多ポートにする必要がある。
【００９１】
図２３には、ロードデータオーバランバッファＬＤＯＢの例が示される。ロードデータＥＬＤと共に書込み情報ＷＩＮＦを受取り、レジスタが有効で書込めなかったり、レジスタ書込みポートが空いていなかったりした場合には、これらをＷＩＮＦ０〜ｎ及びＬＤ０〜ｎのいずれかに書込む。そして、書込み可能となったらバッファから読出してレジスタに書込む。１０サイクルレイテンシでもロードデータを滞りなく供給するには１０サイクル分のロードデータオーバランバッファＬＤＯＢが必要となる。データが消費されるのは早くて１０サイクル後であるから、データが毎サイクル消費されることを期待して１０サイクル連続でデータロードした後で全くデータが消費されない場合、１１回目のロードを発行しなければロードデータはロードデータオーバランバッファＬＤＯＢに収まる。その後は１つ消費したら１つロードすればロードデータは十分供給され、ロードデータネックでストールすることはない。
【００９２】
《実施形態５》
前述の実施形態１から４では命令体系を刷新し、各命令においてレジスタを無効化できるようにしている。本実施形態５では、既存命令体系を温存したまま本発明の基本であるレジスタの無効化を可能とする。そして、実施形態４と同一構成で命令体系を差し替える。具体的には通常プロセッサの命令体系にレジスタ無効化命令を追加する。図２４には、実施形態５に係るデータプロセッサ向けにアセンブルした第１のプログラムが例示される。初期化部は図２１とほぼ同様であるが、図８のプログラムと同様にループ構造定義命令を使用してループ内の命令数を減らしている。ループ部ではレジスタ使用後にレジスタを無効化してデータ転送ユニットＤＴＵが次のデータを供給できるようにしている。具体的には、まず加算命令「ａｄｄ  ｒ４，ｒ５」で２つの配列のデータを加算した後、レジスタ無効化命令「ｒｅｇｉ  ｒ４」でｒ４を無効化し、ｒ４に新しいロードデータを書込めるようにする。更に、加算結果をストア命令「ｍｏｖ  ｒ５，＠ｒ２＋」でストアした後、レジスタ無効化命令「ｒｅｇｉ  ｒ５」でｒ５を無効化し、ｒ５に新しいロードデータを書込めるようにする。
【００９３】
図２５には、ロードレイテンシが１０の場合の実施形態５のデータプロセッサによる図２４のプログラムの動作が示される。ＣＰＵは実施形態４と同様に２命令同時発行のスーパスカラプロセッサとする。まず、初期化部の１４命令を２命令ずつ実行し、データ転送ユニットＤＴＵに配列ａ及びｂからの連続ロードを開始させる。更に、ｒ２に配列ｃへのポインタを格納し、ループ構造を定義して初期化処理を完了する。ループ部の開始は実施形態４と同様に１５サイクル目である。１５サイクル目では加算命令「ａｄｄ  ｒ４，ｒ５」とレジスタ無効化命令「ｒｅｇｉ  ｒ４」を、１６サイクル目ではストア命令「ｍｏｖ  ｒ５，＠ｒ２＋」とレジスタ無効化命令「ｒｅｇｉ  ｒ５」を実行し、以下この２サイクルの動作を繰返す。実施形態４と比較するとレジスタ無効化命令分だけ命令数が増加しているものの、ＣＰＵ本体でロードを行わないためロード命令の実行が不要となっており、ロード命令の代わりにレジスタ無効化命令を実行していると考えると、一般のプロセッサと実行命令数は同じである。そして、一般のプロセッサにおける、多数のレジスタによるループアンローリングや大規模ハードウェアによるアウトオブオーダ実行より効率的にロードレイテンシの隠蔽が可能となる。
【００９４】
《実施形態６》
これまでに例示した第１及び第２のプログラムはループ構造はあるものの条件分岐によって処理が変わるということがなかった。そして、フローが変わったので、ロードしたレジスタを使わなくなるとか、無効化したレジスタを再度使用するといった要求はなかった。本実施形態６では、実施形態５で導入したレジスタ無効化命令及び新たに導入するレジスタ有効化命令により、フロー変化に伴うレジスタ使用状態の変化に対応できるようにする。
【００９５】
図２６には、文字列比較プログラムのＣ言語プログラムと実施形態３及び５用のアセンブラプログラムが例示される。高速化された文字列比較プログラムでは複数の文字を同時に比較する方式が一般的であるが、この方式は前処理後処理を複雑化させるものであり、処理の幅を広げることによる高速化は本発明とは独立に適用可能であるため、図２６では一文字ずつ処理するプログラムとしている。
まず、Ｃ言語プログラムを説明する。文字列比較プログラムは何文字目で不一致となったか或いは何文字の文字列が一致したかで動作が変化する。ここでは、配列ａおよびｂにはそれぞれ文字列“ｃａｒｄ”及び“ｃａｒ”が入っているものとし、４文字目で不一致となるのもとする。また、文字列の最大文字数はＮとする。プログラム本体ではＮ回ループしてｉ文字目で不一致であるか文字列が終わったらループを抜けて文字コードの差を生成する。尚、変数ｃはレジスタ変数とする。文字列の終りは不一致比較でループを抜けなかった場合、即ち文字が一致した場合に一方の文字のみチェックしている。一致しているのでもう一方をチェックする必要はない。
【００９６】
次に、実施形態３用アセンブラプログラムについて説明する。命令フェッチフローでは、ロードストア及び実行のデータ処理フロー用コードの各命令キューＩＱへのロードを行う。まず、命令キューロード・ループ設定命令「ｉｑｌｐ／ｌｓ  ＿ＬＳ０，４，３，４，Ｎ」はラベル＿ＬＳ０から４命令をロードストアナノプロセッサＬＳＮの命令キューＩＱにロードし、３命令目から４命令目をＮ回ループさせるように設定する命令である。同様に、「ｉｑｌｐ／ｅｘ  ＿ＥＸ０，６，２，３，Ｎ」はラベル＿ＥＸ０から６命令を演算ナノプロセッサＥＸＮの命令キューＩＱにロードし、２命令目から３命令目をＮ回ループさせるように設定する。更に分岐設定命令「ｂｆ／ｅｘ  ＿ＥＸ１，＿ＥＸ３」及び「ｂｔ／ｅｘ  ＿ＥＸ２，＿ＥＸ３」によって、ラベル＿ＥＸ１の命令実行後にフラグがＦＡＬＳＥだった場合とラベル＿ＥＸ２の命令実行後にフラグがＴＲＵＥだった場合にラベル＿ＥＸ３に分岐するように設定する。
【００９７】
ロードストアフローではループ前に配列ａ及びｂの先頭アドレスをｒ０及びｒ１に設定し、ループ内で「ｍｏｖ．ｂ  ＠ｒ０＋，ｒ０／ｅｘ」及び「ｍｏｖ．ｂ  ＠ｒ１＋，ｒ１／ｅｘ」によって配列ａ及びｂの要素をアドレスの小さい方から逐次ロードしていく。
【００９８】
演算フローではループ前に文字列の終りを示す値“０”をｒ２に設定する。そして、ループ内では比較命令「ｃｍｐ／ｅｑ  ｒ０／ｋ，ｒ１」によってロードされた２つの値を比較してフラグを更新する。この時もう一度使用するｒ０は保持する。そして、前述の分岐設定によってフラグがＦＡＬＳＥだった場合はラベル＿ＥＸ３に分岐する。更に、比較命令「ｃｍｐ／ｅｑ  ｒ０，ｒ２／ｋ」によってロードされた値の一方と文字列の終りを示す値“０”を比較してフラグを更新する。この時、もう一度使用するｒ２は保持する。そして、前述の分岐設定によってフラグがＴＲＵＥだった場合はラベル＿ＥＸ３に分岐する。ループを抜けると不一致した文字のコード差を計算するため、ｒ０及びｒ１を有効にする。ここでは２つのレジスタを有効にするレジスタ有効化命令「ｒｅｇｖ  ｒ０，ｒ１」を使用している。その後、減算命令「ｓｕｂ  ｒ０，ｒ１」で不一致した文字のコード差を計算する。最後に、不要となりながら無効化していないｒ２をレジスタ無効化命令「ｒｅｇｉ  ｒ２」で無効化する。
【００９９】
次に、実施形態５用アセンブラプログラムについて説明する。初期化部は第１のプログラム用の図２４と同様である。ループ部では比較命令「ｃｍｐ／ｅｑ  ｒ４，ｒ５」によってロードされた２つの値を比較してフラグを更新する。そして、分岐命令「ｂｆ  ＿Ｌ０３」によってフラグがＦＡＬＳＥだった場合はラベル＿Ｌ０３に分岐する。ＴＲＵＥの場合は次のレジスタ無効化命令「ｒｅｇｉ  ｒ５」でｒ５を無効化し、ｒ５に新しいロードデータを書込めるようにする。次に、比較命令「ｃｍｐ／ｅｑ  ｒ４，ｒ２」によってロードされた値の一方と文字列の終りを示す値“０”を比較してフラグを更新する。そして、分岐命令「ｂｔ  ＿Ｌ０３」によってフラグがＴＲＵＥだった場合はラベル＿ＥＸ２に分岐する。ＦＡＬＳＥの場合は次のレジスタ無効化命令「ｒｅｇｉ  ｒ４」でｒ４を無効化し、ｒ４に新しいロードデータを書込めるようにする。そして、ループ構造によってこれらの６命令を繰り返す。ループを２回目の比較結果で抜けた場合は、既にｒ５が無効化されているためラベル＿Ｌ０２から実行してレジスタ有効化命令「ｒｅｇｖ  ｒ５」で有効化する。そして、最後に減算命令「ｓｕｂ  ｒ４，ｒ５」で不一致した文字のコード差を計算する。
【０１００】
図２７には、実施形態３のデータプロセッサによる図２６（２）のプログラムの動作が示される。まず、命令フェッチフローの２命令を実行し、ロードストア及び演算ナノプロセッサＬＳＮ，ＥＸＮの命令キューＩＱにロードストア及び演算フローを実行するための命令をセットアップする。更に、次の２命令によって条件分岐を設定する。そして、５サイクル目からロードストアフローが、６サイクル目から演算フローが実行可能となる。
【０１０１】
ロードストアフローでは、最初の２命令で２つの配列ａ及びｂへのポインタをセットアップする。この結果、ｒ０及びｒ１が逐次有効となる。その後はループ動作に入り２つのロード命令「ｍｏｖ  ＠ｒ０＋，ｒ０／ｅｘ」及び「ｍｏｖ  ＠ｒ１＋，ｒ１／ｅｘ」を交互に実行していく。
【０１０２】
一方、演算フローでは、６サイクル目に文字列の終りを示す値“０”をｒ２に書込み、ロードデータが有効になるのを待つ。本動作例ではロードレイテンシを３サイクルとしているため、７、８サイクル目に開始したロード命令のロードデータは１０、１１サイクル目から使用可能となる。先頭の比較命令「ｃｍｐ／ｅｑ  ｒ０，ｒ１／ｋ」はこれらのロードデータを使用するため１１サイクル目に実行を開始する。以降の比較命令はロードデータが揃っていてストールすることはない。その後、文字列は４文字目で不一致となるため、１７サイクル目の「ｃｍｐ／ｅｑ  ｒ０，ｒ１／ｋ」でフラグがＦＡＬＳＥとなり、演算フローの１８，１９サイクル目のループ側の実行をキャンセルして、２０サイクル目からループを抜けた後の命令を実行する。この時、ロードストアフローは先行してロードを進めており、１５サイクル目以降のロード命令をキャンセルする。キャンセルの詳細については後述する。そして、演算フローでは２０サイクル目に一旦無効化したｒ０及びｒ１をレジスタ有効化命令「ｒｅｇｖ  ｒ０，ｒ１」で有効化する。その後、減算命令「ｓｕｂ  ｒ０，ｒ１」で不一致した文字のコード差を計算し、最後にレジスタ無効化命令「ｒｅｇｉ  ｒ２」でｒ２を無効化する。
【０１０３】
図２８には、図２７の動作フローにおける演算ナノプロセッサＥＸＮによるロードキャンセルの動作が例示される。１７サイクル目の「ｃｍｐ／ｅｑ  ｒ０，ｒ１／ｋ」の実行（Ｅ）ステージで比較結果が確定し、この結果で１５サイクル目のロード命令「ｍｏｖ  ＠ｒ０＋，ｒ０／ｅｘ」のライトバック（ＷＢ）ステージをキャンセルする。他にも多くの処理をキャンセルする必要があるがタイミングが緩くなるので、キャンセル信号をファンアウトさせることは可能である。また、タイミングが厳しい場合はパイプライン段数を伸ばしてＷＢステージを遅らせればよい。  
【０１０４】
図２９には、実施形態５のデータプロセッサによる図２６（３）のプログラムの動作が示される。まず、初期化部の１４命令を２命令ずつ実行し、データ転送ユニットＤＴＵに配列ａ及びｂからの連続ロードを開始させる。更に、ｒ２に配列ｃへのポインタを格納し、ループ構造を定義して初期化処理を完了する。データ転送ユニットＤＴＵを経由する場合セットアップのオーバヘッドがあるためそれを２サイクルとして５サイクルでロードデータの先頭が到着するものとする。この時、ループ部の開始は１０サイクル目となる。分岐処理はＮｏｔ  Ｔａｋｅｎ予測でストールなく進むものとし、Ｔａｋｅｎの場合はフラグを生成する比較命令から２サイクルストールするものとする。この時、１０サイクル目では比較命令「ｃｍｐ／ｅｑ  ｒ４，ｒ５」と条件分岐命令「ｂｆ  ＿Ｌ０３」を、１１サイクル目でレジスタ無効化命令「ｒｅｇｉ  ｒ４」と比較命令「ｃｍｐ／ｅｑ  ｒ５，ｒ２」を、１２サイクル目で条件分岐命令「ｂｔ  ＿Ｌ０２」とレジスタ無効化命令「ｒｅｇｉ  ｒ５」を実行する。そして、２つのレジスタ無効化命令によるレジスタ無効化によって新たなロードデータが書込まれ処理が進んでいく。無効化命令はレイテンシ１のロード命令のように見える。レイテンシ０に見せることも可能であるがロードデータのレジスタの無効化命令と使用命令のデコードが同時となるため制御系のクリティカルパスが厳しくなる可能性が高い。その後、文字列は４文字目で不一致となるため、１９サイクル目の比較命令で不一致が検出されて条件分岐命令でラベル＿Ｌ０３の減算命令に分岐する。この時、ループ側の４命令がキャンセルされる。特にレジスタ無効化命令もキャンセルされるため減算命令実行前のレジスタ有効化は不要である。例えば、配列ａの文字列も配列ｂと同じ“ｃａｒ”であった場合は、４文字目が一致してかつ文字列の終りを示す値“０”であるため、２０サイクル目の比較命令がＴＲＵＥとなり、２１サイクル目の条件分岐命令でラベル＿Ｌ０２に分岐する。この場合は、ｒ５の無効化はキャンセルされるものの、ｒ４は無効化済みであるため、レジスタ有効化命令「ｒｅｇｖ  ｒ４」で有効化してから、減算命令を実行する。このように、レジスタ無効化及び有効化命令を追加するだけで、独立して動作するデータ転送ユニットＤＴＵとの木目細かな同期が可能となり、ロードレイテンシの隠蔽が容易となる。また、レジスタ無効化前に分岐することにより、レジスタの有効化を不要に出来るため、レジスタ有効化命令は必ずしも必要ないが、性能やプログラミングの容易さには貢献するといえる。
【０１０５】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【０１０６】
例えば、動作例は図１、図１４、図２６に例示されたＣ言語記述のプログラムに限定されず、本発明はその他の任意のプログラムの実行に広く適用することができる。
【図面の簡単な説明】
【０１０７】
【図１】第１のプログラムを例示する説明図である。
【図２】第１のプログラムをアウトオブオーダ方式のデータプロセッサで実行した場合のループ部の動作を例示する説明図である。
【図３】ロードレイテンシ１０の場合のループ部の動作を例示する説明図である。
【図４】第１の実施形態のデータプロセッサのパイプライン構成を例示する説明図である。
【図５】第１の実施形態のデータプロセッサ向けに第１のプログラムをアセンブルした場合を例示する説明図である。
【図６】本発明を適用したデータプロセッサ向けの命令コードフォーマットを例示する説明図である。
【図７】実施形態１のデータプロセッサによる図５プログラムの動作を例示する説明図である。
【図８】ループ構造定義命令を使用して第１のプログラムを書換えた場合を例示する説明図である。
【図９】実施形態１のデータプロセッサによる図８のプログラムの動作を例示する説明図である。
【図１０】ロードレイテンシ１０の場合の図８のプログラムの動作を例示する説明図である。
【図１１】レジスタ有効性判定論理を示す説明図である。
【図１２】レジスタ有効性判定論理の動作フローを示す説明図である。
【図１３】第２の実施形態のデータプロセッサのパイプライン構成を例示する説明図である。
【図１４】第２のプログラムを例示する説明図である。
【図１５】実施形態２のデータプロセッサによる第２のプログラムの動作を例示する説明図である。
【図１６】実施形態３のデータプロセッサのパイプライン構成を例示する説明図である。
【図１７】実施形態３向けに第２のプログラムをアセンブルした例である。
【図１８】実施形態３のデータプロセッサによる第２のプログラムの動作を例示する説明図である。
【図１９】ストアバッファによるデータ依存ストールの回避を例示する説明図である。
【図２０】実施形態４のデータプロセッサのブロック構成を例示する説明図である。
【図２１】実施形態４向けに第１のプログラムをアセンブルした例である。
【図２２】実施形態４のデータプロセッサによるロードレイテンシ１０の場合の図２１のプログラムの動作を例示する説明図である。
【図２３】ロードオーバーランバッファの構成を例示する説明図である。
【図２４】実施形態５向けに第１のプログラムをアセンブルした例である。
【図２５】実施形態５のデータプロセッサによるロードレイテンシ１０の場合の図２４のプログラムの動作を例示する説明図である。
【図２６】文字列比較プログラムを例示する説明図である。
【図２７】実施形態３のデータプロセッサによる文字列比較プログラムの動作を例示する説明図である。
【図２８】演算ナノプロセッサによるロードキャンセルを例示する説明図である。
【図２９】実施形態５のデータプロセッサによる文字列比較プログラムの動作を例示する説明図である。
【符号の説明】
【０１０８】
ＣＰＵ１、ＣＰＵ２  ナノプロセッサ
ｋ  キープフィールド
ｎｐ  ナノプロセッサ番号フィールド
ｒａ、ｒｂ、ｒｃ  読出しレジスタ番号フィールド
ｍａ，ｍｂ  モディファイレジスタ番号フィールド
ｗａ  書込みレジスタ番号フィールド
ＩＦＮ  命令フェッチナノプロセッサ
ＥＸＮ演算ナノプロセッサ
ＬＤＮ  ロードナノプロセッサ
ＳＴＮ  ストアナノプロセッサ
ＬＳＮ  ロードストアナノプロセッサ
１  有効性判定論理
２  バリッドビットフラグレジスタ
【図１】
2008139964.tif 000003
【図２】
2008139964.tif 000004
【図３】
2008139964.tif 000005
【図４】
2008139964.tif 000006
【図５】
2008139964.tif 000007
【図６】
2008139964.tif 000008
【図７】
2008139964.tif 000009
【図８】
2008139964.tif 000010
【図９】
2008139964.tif 000011
【図１０】
2008139964.tif 000012
【図１１】
2008139964.tif 000013
【図１２】
2008139964.tif 000014
【図１３】
2008139964.tif 000015
【図１４】
2008139964.tif 000016
【図１５】
2008139964.tif 000017
【図１６】
2008139964.tif 000018
【図１７】
2008139964.tif 000019
【図１８】
2008139964.tif 000020
【図１９】
2008139964.tif 000021
【図２０】
2008139964.tif 000022
【図２１】
2008139964.tif 000023
【図２２】
2008139964.tif 000024
【図２３】
2008139964.tif 000025
【図２４】
2008139964.tif 000026
【図２５】
2008139964.tif 000027
【図２６】
2008139964.tif 000028
【図２７】
2008139964.tif 000029
【図２８】
2008139964.tif 000030
【図２９】
2008139964.tif 000031