(57)【要約】キャッシュ・メモリのヒット・ミスによるＭＰＵの利用率の低下を低減させる。実行ユニット２６が実行する命令に、複数の命令を含む所要のルーチン又は複数のデータを含む所要のデータ構造体がキャッシュ・メモリ２０，３０内に存在するか否かを確認するテスト命令が追加されたマイクロプロセッサ１０を用いて、前記ルーチン又はデータ構造体に含まれる並列処理が可能なルーチン又はデータ構造体を読み出す直前に、その読み出そうとしているルーチン又はデータ構造体がキャッシュ・メモリ２０，３０内に存在するか否かをマイクロプロセッサ１０に確認させ、並列処理が可能なルーチン又はデータ構造体の中で、キャッシュ・メモリ２０，３０に存在するルーチン又はデータ構造体から優先的にマイクロプロセッサ１０に処理させる。
2002069150.tif 000002
【特許請求の範囲】
【請求項１】
外部メモリから読み出される命令の一部及びデータの一部が記憶されるキャッシュ・メモリと、キャッシュ・メモリ又は外部メモリから読み出された命令又は読み出されたデータを使用する命令を実行する実行ユニットとを備え、プログラムに指示された順序で命令を処理するマイクロプロセッサであって、
前記実行ユニットが実行する命令に、複数の命令を含む所要のルーチン又は複数のデータを含む所要のデータ構造体が前記キャッシュ・メモリ内に存在するか否かを確認するテスト命令が含まれるマイクロプロセッサ。
【請求項２】
前記テスト命令が、前記所要のルーチン又はデータ構造体の先頭アドレス部分が前記キャッシュ・メモリ内に存在するか否かを確認する命令を含む請求項１のマイクロプロセッサ。
【請求項３】
前記キャッシュ・メモリが、
ルーチンが記憶される命令キャッシュ・メモリと、
データ構造体が記憶されるデータ・キャッシュ・メモリと
を含む請求項１又は請求項２のマイクロプロセッサ。
【請求項４】
前記テスト命令が、前記所要のルーチンが前記命令キャッシュ・メモリ内に存在するか否かを確認する命令と、
前記所要のデータ構造体が前記データ・キャッシュ・メモリ内に存在するか否かを確認する命令と
を含む請求項３のマイクロプロセッサ。
【請求項５】
前記実行ユニットの命令実行と並行して、所要のルーチン又はデータ構造体の読み出しを行うフェッチ・ユニットをさらに含む請求項１乃至請求項４のいずれかのマイクロプロセッサ。
【請求項６】
プログラムが指定する順序で、外部メモリ又はキャッシュ・メモリから読み出された複数の命令を含むルーチン又は複数のデータを含むデータ構造体を使用するルーチンをマイクロプロセッサに実行させる場合の、前記ルーチン又はデータ構造体に含まれる並列処理が可能なルーチン又はデータ構造体に対する命令実行順序のスケジューリング方法であって、
並列処理が可能なルーチン又はデータ構造体を読み出す直前に、そのルーチン又はデータ構造体がキャッシュ・メモリ内に存在するか否かを確認する確認ステップと、
前記並列処理が可能なルーチン又はデータ構造体の中で、キャッシュ・メモリ内に存在することが確認されたルーチン又はデータ構造体から優先的にマイクロプロセッサに処理させる優先実行ステップと
を含む命令実行順序スケジューリング方法。
【請求項７】
前記優先実行ステップが、読み出そうとしているルーチン又はデータ構造体がキャッシュ・メモリ内に存在すれば、そのルーチン又はデータ構造体をキャッシュ・メモリから読み出してマイクロプロセッサに処理させる実行ステップと、
読み出そうとしているルーチン又はデータ構造体がキャッシュ・メモリ内に存在しなければ、そのルーチン又はデータ構造体を外部メモリから読み出すようマイクロプロセッサに指示する指示ステップと
を含む請求項６の命令実行順序スケジューリング方法。
【請求項８】
前記指示ステップのルーチン又はデータ構造体の外部メモリからの読み出しが、前記実行ステップと並行して行われる請求項７の命令実行順序スケジューリング方法。
【請求項９】
前記確認ステップが、前記実行ステップ又は指示ステップの後、処理が未完了のルーチン又はデータ構造体が存在するか確認するステップと、
処理が未完了のルーチン又はデータ構造体が存在すれば、そのルーチン又はデータ構造体がキャッシュ・メモリ内に存在するかマイクロプロセッサに確認させるステップと
を含む請求項６乃至請求項８のいずれかの命令実行順序スケジューリング方法。
【請求項１０】
前記実行ステップが、処理が完了したルーチン又はデータ構造体に対し、ルーチン又はデータ構造体が処理されたか否かを示す実行完了情報を更新するステップを含み、
前記処理が未完了のルーチン又はデータ構造体が存在するか確認するステップが、前記実行完了情報に基づいて処理が未完了のルーチン又はデータ構造体が存在するか確認を行う請求項７乃至請求項９のいずれかの命令実行順序スケジューリング方法。
【請求項１１】
前記確認ステップが、前記ルーチン又はデータ構造体の先頭アドレス部分に基づいてキャッシュ・メモリ内の存在確認を行う請求項６乃至請求項９のいずれかの命令実行順序スケジューリング方法。
【発明の詳細な説明】
技術分野
本発明は、マイクロプロセッサ及び命令実行順序スケジューリング方法に関し、より詳しくは、プログラムが指示する順序で命令を実行するマイクロプロセッサ及びマイクロプロセッサの命令実行順序のスケジューリング方法に関する。
背景技術
図４にＭＰＵ（マイクロプロセッサ・ユニット）１０’の一構成例を示す。ＭＰＵ１０’は、外部メモリ４０よりも小容量かつ高速アクセス可能で、外部メモリ４０から読み出される命令の一部及びデータの一部が記憶されるキャッシュ・メモリ１４と、キャッシュ・メモリ１４又は外部メモリ４０から命令又はデータを読み出すフェッチ・ユニット２２と、読み出された命令を実行する実行ユニット２６’と、実行中の命令が使用するデータが記憶される汎用レジスタ３２と、外部デバイス（４０）が接続されるバスインターフェイス・ユニット１２を含む。
キャッシュ・メモリ１４は、命令が記憶される命令キャッシュ２０とデータが記憶されるデータ・キャッシュ３０とを含む。ＭＰＵ１０’はバスインターフェイス・ユニット１２を介して外部メモリ（半導体記憶装置）４０に接続されており、外部メモリ４０とＭＰＵ１０’間で命令及びデータの読み書きが行われる。ただし、キャッシュ・メモリ２０，３０のアクセス速度は外部メモリ４０よりも６０〜１００倍高速なので、外部メモリ４０よりもキャッシュ・メモリ２０，３０の方を優先的に利用する。
ＭＰＵ１０’が必要とする命令又はデータがキャッシュ・メモリ２０，３０に存在しない場合は、外部メモリ４０から命令又はデータを読み出す。このキャッシュ・メモリ２０，３０に存在しない場合の外部メモリ４０からの命令又はデータの読み出しはハードウェアで制御される。例えば、ＭＰＵ１０’全体の制御を行うコントロール・ユニット（図示していない）がこの制御を行う。
外部メモリ４０はハード・ディスク（固定磁気記憶装置）４２とも接続されており、外部メモリ４０とハード・ディスク４２間で命令及びデータの読み書きが行われる。ＭＰＵ１０’が必要とする命令又はデータが外部メモリ４０に存在しない場合は、ハード・ディスク４２から命令又はデータを読み出す。この外部メモリ４０に存在しない場合のハード・ディスク４２からの命令又はデータの読み出しはソフトウェアで制御される。通常はＯＳ（オペレーティング・システム）がこの制御を行う。
ＭＰＵ１０’に命令を実行させる場合、フェッチ・ユニット２２がその命令を命令キャッシュ２０又は外部メモリ４０から読み出す。命令キャッシュ２０に目的の命令が存在すれば命令キャッシュ２０からその命令を読み出し、無ければ外部メモリ４０から読み出す。外部メモリ４０から命令を読み出した場合、読み出した命令は命令キャッシュ２０にも送られ記憶される。
フェッチ・ユニット２２に読み出された命令は、実行ユニット２６’に送られ実行される。命令の実行に必要なデータは、データ・キャッシュ３０又は外部メモリ４０から汎用レジスタ３２に読み出される。データ・キャッシュ３０に目的のデータが存在すればデータ・キャッシュ３０からそのデータを読み出し、無ければ外部メモリ４０から読み出す。外部メモリ４０から読み出したデータはデータ・キャッシュ３０にも送られ記憶される。
図５（ａ）に、２つのデータ（ＤＡＴＡｓＡ，ＤＡＴＡｓＢ）を使用する２種類のルーチン（ＦｕｎｃＡ，ＦｕｎｃＢ）をＭＰＵ１０’に実行させるプログラムを例としたフロー・チャートを示す。図５（ａ）では、主にデータ（ＤＡＴＡｓＡ，ＤＡＴＡｓＢ）の読み出し及び処理部分を図示している。ＭＰＵ１０’は、図５（ａ）に示すプログラムで指示された実行順序でデータの読み出し及び処理を行う。
ＤＡＴＡｓＡとＤＡＴＡｓＢは、それぞれ幾つかのデータ（ＤＡＴＡ−Ａ０，ＤＡＴＡ−Ａ１，ＤＡＴＡ−Ａ２，・・・・・と、ＤＡＴＡ−Ｂ０，ＤＡＴＡ−Ｂ１，ＤＡＴＡ−Ｂ２，・・・・・）から構成されたデータ構造体である。これらＤＡＴＡｓＡとＤＡＴＡｓＢは各々独立したデータである。
ＦｕｎｃＡ，ＦｕｎｃＢは、プログラムの一部分を構成する、ある機能をもった一連の命令群である。ＦｕｎｃＡとＦｕｎｃＢは、それぞれ幾つかの命令（Ｉｎｓｔ−Ａ０，Ｉｎｓｔ−Ａ１，Ｉｎｓｔ−Ａ２，・・・・・と、Ｉｎｓｔ−Ｂ０，Ｉｎｓｔ−Ｂ１，Ｉｎｓｔ−Ｂ２，・・・・・）から構成されている。ＦｕｎｃＡとＦｕｎｃＢは各々独立した命令であり、例えば、分岐命令が無い限りＦｕｎｃＡはＩｎｓｔ−Ａ０，Ｉｎｓｔ−Ａ１，Ｉｎｓｔ−Ａ２，・・・・・の順に命令を実行し、ＦｕｎｃＢはＩｎｓｔ−Ｂ０，Ｉｎｓｔ−Ｂ１，Ｉｎｓｔ−Ｂ２，・・・・・の順に命令を実行する。
図５（ａ）に示すように、ＭＰＵ１０’は、ＤＡＴＡｓＡを読み出して（Ｓ１７２）、ＤＡＴＡｓＡを使用したＦｕｎｃＡを実行し（Ｓ１７４）、次にＤＡＴＡｓＢを読み出して（Ｓ１７６）、ＤＡＴＡｓＢを使用したＦｕｎｃＡを実行する（Ｓ１７８）。続いて、ＤＡＴＡｓＡを読み出して（Ｓ１７２’）、ＤＡＴＡｓＡを使用したＦｕｎｃＢを実行し（Ｓ１８２）、次にＤＡＴＡｓＢを読み出して（Ｓ１７６’）、ＤＡＴＡｓＢを使用したＦｕｎｃＢを実行する（Ｓ１８６）。
図５（ａ）に示す順序でデータを読み出す場合、読み出そうとしているデータがデータ・キャッシュ３０に無ければ、ＭＰＵ１０’の待ち時間が増加する。例えばＤＡＴＡｓＡを読み出してＦｕｎｃＡ（Ｓ１７４）を実行する場合、もしＤＡＴＡｓＡがデータ・キャッシュ３０に無ければ、外部メモリ４０からＤＡＴＡｓＡを読み出す。外部メモリ４０のアクセス速度はデータ・キャッシュ３０よりも６０〜１００倍遅いので、この外部メモリ４０からのデータ読み出しによるＭＰＵ１０’の待ち時間は６０〜１００倍長くなる。
しかも、仮にＤＡＴＡｓＢがデータ・キャッシュ３０内に存在し、ＤＡＴＡｓＢの方がＤＡＴＡｓＡよりも短時間（１／１００〜１／６０の時間）で読み出せる状態であっても、ＤＡＴＡｓＡを外部メモリ４０から読み出して（Ｓ１７２）、この読み出したＤＡＴＡｓＡを使用したＦｕｎｃＡ（Ｓ１７４）が実行し終わるまで、ＤＡＴＡｓＢの読み出し（Ｓ１７６）及びＦｕｎｃＢ（Ｓ１７８）を実行することはできない。
ＤＡＴＡｓＡとＤＡＴＡｓＢとは独立したデータであり、ＦｕｎｃＡとＦｕｎｃＢとは独立した命令であるので、プログラムの実行順序を図５（ａ）のフロー・チャートから図５（ｂ）に示すフロー・チャートに変更することも可能である。ＭＰＵ１０’は、ＤＡＴＡｓＡを読み出して（Ｓ１７２）ＦｕｎｃＡ及びＦｕｎｃＢを実行し（Ｓ１７４，Ｓ１８２）、次にＤＡＴＡｓＢを読み出して（Ｓ１７６）ＦｕｎｃＡ及びＦｕｎｃＢを実行する（Ｓ１７８，Ｓ１８６）。しかし、この場合も図５（ａ）と同様に、読み出そうとしているデータがデータ・キャッシュ３０に無ければ、ＭＰＵ１０’の待ち時間が増加する。
以上、ＤＡＴＡｓＡ，ＤＡＴＡｓＢの読み出しを例にして説明したが、ＦｕｎｃＡ，ＦｕｎｃＢを実行する際のＦｕｎｃＡ，ＦｕｎｃＢの読み出しも同様である。図６に、２つのルーチン（ＦｕｎｃＡ，ＦｕｎｃＢ）をＭＰＵ１０’に実行させるプログラムを例としたフロー・チャートを示す。ＭＰＵ１０’は、ＦｕｎｃＡを読み出して（Ｓ１９０）実行し（Ｓ１９２）、次にＦｕｎｃＢを読み出して（Ｓ１９４）実行する（Ｓ１９６）。
このＦｕｎｃＡ，ＦｕｎｃＢの実行の場合も、上述したデータ（図５（ａ），（ｂ））の場合と同様に、命令キャッシュ２０に目的のルーチンが無ければ、ＭＰＵ１０の待ち時間が長くなり、ＭＰＵ１０の利用率は低下する。
このようなキャッシュ・メモリ２０，３０のヒット・ミスによるＭＰＵ１０’の待ち時間の増加を減少させる方法として、実行中の処理と並行して、プログラムが近い将来必要になると予想した命令又はデータをあらかじめＭＰＵ１０’に読み出しておくプリフェッチ（先読み）がある。
プリフェッチには、例えばタッチ命令を使用する。タッチ命令は、命令又はデータの読み出しをフェッチ・ユニット２２に指示する命令である。タッチ命令が実行されると、タッチ命令で要求された命令又はデータが外部メモリ４０からキャッシュ・メモリ２０，３０に読み出される。タッチ命令の実行中であっても、実行ユニット２６’は他の命令を並列して実行することができる。タッチ命令を用いることで、プログラム側からＭＰＵ１０’に、近い将来アクセスを行うと予想される命令又はデータを知らせることができる。ＭＰＵ１０’はタッチ命令で知らされた命令又はデータをキャッシュ・メモリ２０，３０に予め読み出しておくことで、キャッシュ・メモリ２０，３０のヒット率の向上を図る。
しかし、プリフェッチする命令又はデータの予測は、通常プログラムを実行する以前のソース・プログラムの状態で行われる。プログラムの実行以前に必要になると予想された命令又はデータを読み出すため、プリフェッチされた命令又はデータが本当に必要になるとは限らない。プリフェッチが有効に機能するかどうかはプログラム実行前の予測の精度に左右され、必ず効果が現れるわけではない。
プログラムの実行途中で、ＯＳによって命令実行順序の変更を行うマルチ・スレッドと呼ばれる方法もある。実行中のスレッドが待ち状態になると、スケジューラが実行可能な他のスレッドを実行状態に切り換える。スレッドはプログラムを構成する実行順序の入れ替えが可能な単位であり、各スレッドはプログラムの実行状態に関するコンテクストと呼ばれる情報を持つ。ＯＳがスレッド単位で実行順序を入れ替えるときには、コンテクスト・スイッチと呼ばれるコンテキストのレジスタへの退避及び復帰が発生する。コンテクスト・スイッチの実行には、実行中のスレッドが待ち状態になったことを示す割り込み，スケジューラの起動，レジスタへのアクセス，スレッドの実行切り換えが伴う。ハード・ディスクへのアクセス待ち時間にコンテキスト・スイッチを実行する場合は、コンテクスト・スイッチの実行時間は十分短く、マルチ・スレッドは有効に機能する。しかし、キャッシュ・ミスによる待ち時間にコンテキスト・スイッチを実行する場合は、コンテキスト・スイッチの実行時間は短くなく、マルチ・スレッドは有効に機能しない。
プログラムの実行途中で、ＭＰＵ内部で命令実行順序の変更を行うアウト・オブ・オーダーと呼ばれる方法もある。アウト・オブ・オーダは、複数の実行ユニットを用いた並列処理を行うスーパー・スカラー方式のＭＰＵで行われ、実行ユニットが待ち状態になると、プログラムが指示する命令実行順序に制限されず、実行可能な命令から先に実行していく。しかし、ＭＰＵ側で勝手に命令実行順序を変更しているので、先に実行した命令が全て無駄になることも多い。
発明の開示
本発明の目的は、キャッシュ・メモリのヒット・ミスによるＭＰＵの利用率の低下を低減させることにある。
本発明のマイクロプロセッサは、実行ユニットが実行する命令に、所要のルーチン又はデータ構造体が前記キャッシュ・メモリ内に存在するか否かを確認するテスト命令が含まれる。このようなマイクロプロセッサは、ルーチン又はデータ構造体を読み出す直前にテスト命令を実行することにより、読み出そうとしているルーチン又はデータ構造体がキャッシュ・メモリ内に存在するか否かを事前に知ることができる。
本発明の命令実行順序スケジューリング方法は、並列処理が可能なルーチン又はデータ構造体を読み出す直前に、そのルーチン又はデータ構造体がキャッシュ・メモリ内に存在するか否かを確認する確認ステップと、並列処理が可能なルーチン又はデータ構造体の中で、キャッシュ・メモリ内に存在することが確認されたルーチン又はデータ構造体から優先的にマイクロプロセッサに処理させる優先実行ステップとを含む。
発明を実施するための最良の態様
次に、本発明に係るマイクロプロセッサ及び命令実行順序スケジューリング方法の実施の形態について、図面に基づいて詳しく説明する。
図１に示すように、本発明に係るＭＰＵ１０の実行ユニット２６には、指定されたルーチン又はデータ構造体がキャッシュ・メモリ１４内に存在するか確認するテスト命令が追加されている。テスト命令がＭＰＵ１０に送られると、ＭＰＵ１０はテスト命令が指定するルーチン又はデータ構造体が命令キャッシュ２０又はデータ・キャッシュ３０に存在するか調べ、存在している（“１”）か存在していない（“０”）かの結果を返す。この結果は汎用レジスタ３２に記憶される。テスト命令は、他の命令と同様にＭＰＵ１０の実行ユニット２６で実行される。
プログラムで指示される処理順序をハードウェアの視点に基づいて入れ換えることはできない。しかし、ソフトウェアの視点に基づいて処理順序を入れ換えても問題無く処理を行える場合もある。例えば、依存関係の無い複数のデータ構造体に対して同じ処理を繰り返す場合や、独立の処理を複数行う場合である。本実施形態では、従来（図５（ｂ））のＤＡＴＡｓＡ，ＤＡＴＡｓＢを使用したＦｕｎｃＡ，ＦｕｎｃＢの実行順序のスケジューリングを例にして説明を行う。ＤＡＴＡｓＡ，ＤＡＴＡｓＢは各々独立したデータ構造体であり、ＦｕｎｃＡ，ＦｕｎｃＢは各々独立したルーチンであり、ＤＡＴＡｓＡ，ＤＡＴＡｓＢの読み出し、ＦｕｎｃＡ，ＦｕｎｃＢの読み出し及び実行の順序はそれぞれ入れ替え可能である。ＤＡＴＡｓＡ，ＤＡＴＡｓＢ及びＦｕｎｃＡ，ＦｕｎｃＢはそれぞれプログラムから見たデータ単位及び命令単位である。
図２に、従来（図５（ｂ））のフロー・チャートに本発明のスケジューリング部分（Ｓ１１０，Ｓ１１２，Ｓ１１４，Ｓ１１６，Ｓ１１８，Ｓ１２２，Ｓ１２４，Ｓ１２６，Ｓ１２８，Ｓ１３０）を追加したフロー・チャート図を示す。ＤＡＴＡｓＡ及びＤＡＴＡｓＢの読み出し及び処理部分（Ｓ１７２，Ｓ１７４，Ｓ１８２，Ｓ１７６，Ｓ１７８，Ｓ１８６）は従来（図５（ｂ））と同様である。
本発明のスケジューリング方法は、ＤＡＴＡｓＡを読み出す（Ｓ１７２）直前に、ＤＡＴＡｓＡがデータ・キャッシュ３０に存在するか確認する（Ｓ１１４）。この確認は、テスト命令を用いて行う。テスト命令をＭＰＵ１０に送ると、ＭＰＵ１０はＤＡＴＡｓＡがデータ・キャッシュ３０に存在する（“１”）か存在しない（“０”）かを調べ、その結果（“１”ｏｒ“０”）を汎用レジスタ３２に記憶する。
ＤＡＴＡｓＡがデータ・キャッシュ３０内に存在していれば、ＤＡＴＡｓＡをデータ・キャッシュ３０から読み出して（Ｓ１７２）、ＤＡＴＡｓＡを使用したＦｕｎｃＡ及びＦｕｎｃＢをＭＰＵ１０に実行させる（Ｓ１７４，Ｓ１８２）。存在していなければ、従来から用いられているタッチ命令をＭＰＵ１０に送り、ＤＡＴＡｓＡのプリフェッチを行う（Ｓ１１８）。このプリフェッチは、実行ユニット２６の他の命令実行と並行して行うことが可能である。
ＤＡＴＡｓＢについても、ＤＡＴＡｓＡと同様に、ＤＡＴＡｓＢを読み出す（Ｓ１７６）直前に、ＤＡＴＡｓＢがデータ・キャッシュ３０内に存在するかテスト命令で確認する（Ｓ１２４）。ＤＡＴＡｓＡの場合と同様に、ＤＡＴＡｓＢがデータ・キャッシュ３０内に存在する場合はＤＡＴＡｓＢを読み出して（Ｓ１７６）、ＭＰＵ１０にＦｕｎｃＡ及びＦｕｎｃＢを実行させる（Ｓ１７８，Ｓ１８６）。存在しない場合はＤＡＴＡｓＢをプリフェッチする（Ｓ１２８）。
本発明では、ＤＡＴＡｓＡを使用したＦｕｎｃＡ及びＦｕｎｃＢが完了したか否かを示すパラメータＤｏｎｅＤＡと、ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢが完了したか否かを示すパラメータＤｏｎｅＤＢを使用している。ＤｏｎｅＤＡ，ＤｏｎｅＤＢが“１”の場合はＤＡＴＡｓＡ，ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢがそれぞれ完了していることを示し、ＤｏｎｅＤＡ，ＤｏｎｅＤＢが“０”の場合はＤＡＴＡｓＡ，ＤＡＴＡｓＢを使用するＦｕｎｃＡ及びＦｕｎｃＢがそれぞれ未完了であることを示す。ＤｏｎｅＤＡ及びＤｏｎｅＤＢはデータ・キャッシュ３０又は外部メモリ４０に記憶される。
ＤｏｎｅＤＡ，ＤｏｎｅＤＢの初期値は、“０”である（Ｓ１１０）。ＤＡＴＡｓＡを使用したＦｕｎｃＡ及びＦｕｎｃＢが完了すれば、ＤｏｎｅＤＡは“１”に更新され（Ｓ１１６）、ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢが完了すれば、ＤｏｎｅＤＢも“１”に更新される（Ｓ１２６）。ＤｏｎｅＤＡ，ＤｏｎｅＤＢを参照することにより、ＤＡＴＡｓＡ，ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢが完了したか否かをそれぞれ確認することができる（Ｓ１１２，Ｓ１２２，Ｓ１３０）。
ＤｏｎｅＤＡを参照したときに（Ｓ１１２）ＤＡＴＡｓＡを使用したＦｕｎｃＡ及びＦｕｎｃＢが未完了の場合は、ＤＡＴＡｓＡがデータ・キャッシュ３０内に存在するか確認を行う（Ｓ１１４）。同様に、ＤｏｎｅＤＢを参照したときに（Ｓ１２２）ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢが未完了の場合は、ＤＡＴＡｓＢがデータ・キャッシュ３０内に存在するか確認を行う（Ｓ１２４）。
データ又は命令のプリフェッチ中でも、実行ユニット２６は他の命令を実行できる。例えば、ＤｏｎｅＤＡが“０”かつＤＡＴＡｓＡがデータ・キャッシュ３０に無く、ＤｏｎｅＤＢが“０”かつＤＡＴＡｓＢがデータ・キャッシュ３０内に存在する場合、ＤＡＴＡｓＡのプリフェッチ中にＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢを実行することができる。
次に、ＤＡＴＡｓＡ，ＤＡＴＡｓＢを使用したＦｕｎｃＡ，ＦｕｎｃＢの実行順序のスケジューリングについて、その作用を説明する。
最初にＤｏｎｅＤＡ及びＤｏｎｅＤＢが初期化される（Ｓ１１０）。次に、ＤＡＴＡｓＡを使用したＦｕｎｃＡ及びＦｕｎｃＢが完了しているか否かを、ＤｏｎｅＤＡを参照して調べる（Ｓ１１２）。ＤｏｎｅＤＡが“０”の場合は、ＤＡＴＡｓＡを使用したＦｕｎｃＡ及びＦｕｎｃＢがまだ実行されていないので、ＤＡＴＡｓＡがデータ・キャッシュ３０内に存在するか否かをテスト命令で確認する（Ｓ１１４）。
ＤＡＴＡｓＡがデータ・キャッシュ３０内に存在するか否かの判断は、ＤＡＴＡｓＡに含まれる全データがデータ・キャッシュ３０に存在するか否かで判断することもできるが、簡略化して、ＤＡＴＡｓＡの先頭データＤＡＴＡ−Ａ０がデータ・キャッシュ３０内に存在するか否かで判断することもできる。ＤＡＴＡ−Ａ０がデータ・キャッシュ３０に存在すれば、他の部分（ＤＡＴＡ−Ａ１，ＤＡＴＡ−Ａ２，・・・・・）もデータ・キャッシュ３０に存在すると見なすことで、キャッシュ・ヒットとヒット・ミスの判断を簡単かつ高速に行うことができる。
ＤＡＴＡｓＡがデータ・キャッシュ３０内に存在した場合は、ＤＡＴＡｓＡをデータ・キャッシュ３０から読み出して（Ｓ１７２）、ＦｕｎｃＡ，ＦｕｎｃＢを実行する（Ｓ１７４，Ｓ１８２）。ＤＡＴＡｓＡを使用したＦｕｎｃＡ及びＦｕｎｃＢが完了すると、ＤｏｎｅＤＡを“１”に更新する（Ｓ１１６）。ＤｏｎｅＤＡが“１”であると、これらＤＡＴＡｓＡに関係する部分（Ｓ１１４，Ｓ１７２，Ｓ１７４，Ｓ１８２，Ｓ１１６，Ｓ１１８）は実行されなくなる（Ｓ１１２）。
ＤＡＴＡｓＡがデータ・キャッシュ３０内に存在しない場合は、従来のプリフェッチでも使用していたタッチ命令をＭＰＵ１０に送り（Ｓ１１８）、ＤＡＴＡｓＡをプリフェッチする。このＤＡＴＡｓＡのプリフェッチ中に、ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢを並行して実行することも可能である。
次のＤＡＴＡｓＢに関係する部分（Ｓ１２２，Ｓ１２４，Ｓ１７６，Ｓ１７８，Ｓ１８６，Ｓ１２６，Ｓ１２８）は、上述したＤＡＴＡｓＡに関係する部分（Ｓ１１２，Ｓ１１４，Ｓ１７２，Ｓ１７４，Ｓ１８２，Ｓ１１６，Ｓ１１８）と同様である。ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢが未完了であれば（Ｓ１２２）、ＤＡＴＡｓＢがデータ・キャッシュ３０内に存在するか否かをテスト命令で確認する（Ｓ１２４）。データ・キャッシュ３０内に存在した場合は、ＤＡＴＡｓＢをデータ・キャッシュ３０から読み出して（Ｓ１７６）、ＦｕｎｃＡ，ＦｕｎｃＢを実行する（Ｓ１７８，Ｓ１８６）。存在しない場合は、ＤＡＴＡｓＢのプリフェッチを行う（Ｓ１２８）。
ＤｏｎｅＤＡ及びＤｏｎｅＤＢが共に“１”であれば、ＤＡＴＡｓＡ，ＤＡＴＡｓＢを使用したＦｕｎｃＡ，ＦｕｎｃＢは全て完了している（Ｓ１３０）。従来（図５（ｂ））の場合と異なり、例えばＤＡＴＡｓＡがデータ・キャッシュ３０に無く、ＤＡＴＡｓＢがデータ・キャッシュ３０に存在する場合、ＤＡＴＡｓＡのプリフェッチ（Ｓ１１８）と並行して、ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢが実行できる（Ｓ１７８，Ｓ１８６）。ＤＡＴＡｓＢを使用したＦｕｎｃＡ及びＦｕｎｃＢが完了すると（Ｓ１２６）、その処理中にデータ・キャッシュ３０にプリフェッチされたＤＡＴＡｓＡを使用したＦｕｎｃＡ及びＦｕｎｃＢを実行する（Ｓ１７４，Ｓ１８２）。
データ・キャッシュ３０に存在しないＤＡＴＡｓＡよりもデータ・キャッシュ３０に存在するＤＡＴＡｓＢを先に処理すると共に、ＤＡＴＡｓＢの処理と並行してＤＡＴＡｓＡのプリフェッチを行えるため、データ・キャッシュ３０のヒット・ミス時のＭＰＵ１０の待ち時間を短くできる。データ・キャッシュ３０のヒット・ミスを確認した後にプリフェッチを行うので、プログラムの実行前の予想に基づいた従来のプリフェッチとは異なり、無駄なプリフェッチは実行されない。
以上、２つのデータ構造体（ＤＡＴＡｓＡ，ＤＡＴＡｓＢ）を例にして説明したが、この並列処理が可能なデータ構造体数は任意である。例えば並列処理が可能なデータ構造体数が５個の場合は、各データ構造体を使用したルーチンが完了しているか否かを示すパラメータを５つ（例えばＤｏｎｅＤＡ，ＤｏｎｅＤＢ，ＤｏｎｅＤＣ，ＤｏｎｅＤＤ，ＤｏｎｅＤＥ）に増やして、図２と同様に各データ構造体を読み出す直前にテスト命令を実行し、データ・キャッシュ３０内に存在することが確認されたデータ構造体から処理を実行することができる。並列処理が可能なデータ構造体のグループが複数存在する場合もある。データ構造体は、データを１つだけしか含まない場合もある。
以上、データ構造体（ＤＡＴＡｓＡ，ＤＡＴＡｓＢ）を例にして説明したが、ルーチン（ＦｕｎｃＡ，ＦｕｎｃＢ）を実行する際のＦｕｎｃＡ，ＦｕｎｃＢの読み出しについても、本発明のスケジューリング方法を用いることができる。図３に、従来（図６）のフロー・チャートに本発明のスケジューリング部分（Ｓ１４０，Ｓ１４２，Ｓ１４４，Ｓ１４６，Ｓ１４８，Ｓ１５２，Ｓ１５４，Ｓ１５６，Ｓ１５８，Ｓ１６０）を追加したフロー・チャートを示す。ＦｕｎｃＡ及びＦｕｎｃＢの読み出し及び実行部分（Ｓ１９０，Ｓ１９２，Ｓ１９４，Ｓ１９６）は従来（図６）と同様である。
図３において、ＤｏｎｅＦＡはＦｕｎｃＡが実行されたか否かを示すパラメータであり、ＤｏｎｅＦＢはＦｕｎｃＢが実行されたか否かを示すパラメータである。ＤｏｎｅＦＡ，ＤｏｎｅＦＢが“１”の場合はＦｕｎｃＡ，ＦｕｎｃＢがそれぞれ実行済みであることを示し、ＤｏｎｅＦＡ，ＤｏｎｅＦＢが“０”の場合はＦｕｎｃＡ，ＦｕｎｃＢがそれぞれ実行されていないことを示す。
ルーチン（ＦｕｎｃＡ，ＦｕｎｃＢ）のスケジューリングは、上述したデータ構造体（ＤＡＴＡｓＡ，ＤＡＴＡｓＢ）のスケジューリングと同様である。ＦｕｎｃＡ，ＦｕｎｃＢの読み出し（Ｓ１９０，Ｓ１９４）前に、ＦｕｎｃＡ，ＦｕｎｃＢが命令キャッシュ２０に存在するか否かをテスト命令で確認する（Ｓ１４４，Ｓ１５４）。存在すれば、その命令を命令キャッシュ２０から読み出して（Ｓ１９０，Ｓ１９４）、実行する（Ｓ１９２，Ｓ１９６）。存在しなければ、その命令をプリフェッチする（Ｓ１４８，Ｓ１５８）。
ＦｕｎｃＡが命令キャッシュ２０内に存在するか否かの判断は、ＦｕｎｃＡに含まれる全命令が命令キャッシュ２０に存在するか否かで判断することもできるが、簡略化して、ＦｕｎｃＡの先頭命令Ｉｎｓｔ−Ａ０が命令キャッシュ２０内に存在するか否かで判断することもできる。Ｉｎｓｔ−Ａ０が命令キャッシュ２０に存在すれば、他の部分（Ｉｎｓｔ−Ａ１，Ｉｎｓｔ−Ａ２，・・・・・）も命令キャッシュ２０に存在すると見なすことで、キャッシュ・ヒットとヒット・ミスの判断を簡単かつ高速に行うことができる。
従来（図６）の場合と異なり、ＦｕｎｃＡが命令キャッシュ２０に無く、ＦｕｎｃＢが命令キャッシュ２０に存在する場合は、ＦｕｎｃＡのプリフェッチ（Ｓ１４８）と並行して、ＦｕｎｃＢを実行することができる（Ｓ１９６）。ＦｕｎｃＢが実行し終わると（Ｓ１５６）、ＦｕｎｅＢが実行されている間に命令キャッシュ２０にプリフェッチされたＦｕｎｃＡを実行する（Ｓ１９２）。
命令キャッシュ２０に存在しないＦｕｎｃＡよりも命令キャッシュ２０に存在するＦｕｎｃＢを先に実行すると共に、ＦｕｎｃＢの実行と並行してＦｕｎｃＡのプリフェッチを行えるため、命令キャッシュ２０のヒット・ミス時のＭＰＵ１０の待ち時間を短くできる。命令キャッシュ２０のヒット・ミスを確認した後にプリフェッチを行うので、プログラム実行前の予想に基づいた従来のプリフェッチとは異なり、無駄なプリフェッチは実行されない。
以上、２つのルーチン（ＦｕｎｃＡ，ＦｕｎｃＢ）を例にして説明したが、この並列実行が可能なルーチン数は任意である。例えば並列実行が可能なルーチン数が５個の場合は、各ルーチンの実行が終了しているか否かを示すパラメータを５つ（例えばＤｏｎｅＦＡ，ＤｏｎｅＦＢ，ＤｏｎｅＦＣ，ＤｏｎｅＦＤ，ＤｏｎｅＦＥ）に増やして、図３と同様に各ルーチンの読み出し前にテスト命令を実行し、命令キャッシュ２０内に存在することが確認されたルーチンから実行していくことができる。並列処理が可能なルーチンのグループが複数存在する場合もある。ルーチンは、命令を１つだけしか含まない場合もある。
上述したデータ構造体の読み出し時のスケジューリングとルーチンの読み出し時のスケジューリングとは、任意に組み合わせることができる。例えば、図２に示したＦｕｎｃＡ及びＦｕｎｃＢの読み出しに、図３に示したスケジューリングを用いることもできる。命令キャッシュ２０とデータ・キャッシュ３０とは各々独立しているので、命令キャッシュ２０の読み書きとデータ・キャッシュ３０の読み書きとはそれぞれ独立して実行できる。
図５（ｂ）及び図６に示す従来のフロー・チャートに追加された本発明のスケジューリング部分は、従来のルーチン又はデータ構造体の読み出し及び処理に関係しない部分には一切分岐していない。本発明で追加したスケジューリング部分がフロー・チャートの他の部分に影響を与えることはない。本発明は、データ構造体及びルーチンの順序入れ換えをプログラムで指示している。ＯＳのスケジューラで入れ替えを制御するマルチ・スレッドと異なり、コンテクスト・スイッチを起動させないため、ＭＰＵ及びＯＳの負担も少なく高速処理が可能である。
並列処理が可能なルーチン又はデータ構造体を読み出す直前部分へのテスト命令等の追加は、コンパイル時に自動で追加できる場合と、ソース・プログラムに手動で追加する場合がある。一般に、行列演算等のアルゴリズムの場合はコンパイラが並行性を検出できるので、コンパイル時にテスト命令等を自動的に追加できることが多い。Ｉ／Ｏ（入力／出力）に関係する部分は、コンパイラで並行性を検出できないので、手動でテスト命令等を追加することが多い。
以上、本発明は特定の実施例について説明されたが、本発明はこれらに限定されるものではない。例えば、アドレス変換時に使用されるＴＬＢ（Ｔｒａｎｓｌａｔｉｏｎ  Ｌｏｏｋａｓｉｄｅ  Ｂｕｆｆｅｒ）にテスト命令を送ることもできる。ＴＬＢは、外部メモリ４０に存在するアドレス変換テーブルの一部が記憶されるキャッシュ・メモリである。ＴＬＢに格納されたアドレス変換テーブルの入れ替えは、ＰＴＥ（Ｐａｇｅ  Ｔａｂｌｅ  Ｅｎｔｒｙ）の自動検索によって行われる。ＴＬＢを使用する場合、キャッシュ・ヒットは、命令キャッシュ（又はデータ・キャッシュ）とＴＬＢの両方がキャッシュ・ヒットしたことを意味する。
ＰＴＥの自動検索は、外部メモリ４０を複数回アクセスしながらＴＬＢの格納データの入れ替えを行う。本発明のＭＰＵ及び命令実行順序スケジューリング方法を用いることにより、データ・キャッシュ及び命令キャッシュのヒット・ミスの場合と同様に、ＴＬＢのヒット・ミスの場合もＭＰＵの待ち時間を短くすることができる。テスト命令は、命令キャッシュ，データ・キャッシュ，ＴＬＢの各キャッシュ・ヒットを一括して調べてもよいし、各々のキャッシュ・ヒットを独立に調べてもよい。その他、本発明はその趣旨を逸脱しない範囲で当業者の知識に基づき種々なる改良，修正，変形を加えた態様で実施できるものである。
本発明のマイクロプロセッサは、所要のルーチン又はデータ構造体がキャッシュ・メモリ（命令キャッシュ，データ・キャッシュ）に存在するか確認する命令（テスト命令）が追加されている。テスト命令により、これから読み出すルーチン又はデータ構造体がキャッシュ・メモリに存在するか否かを、そのルーチン又はデータ構造体を読み出す直前に知ることができる。
本発明のスケジューリング方法は、上述したテスト命令により、並列処理が可能なルーチン又はデータ構造体に対して、これから読み出すルーチン又はデータ構造体がキャッシュ・メモリに存在するか否かを調べ、その結果に基づいて、キャッシュ・メモリに存在するルーチン又はデータ構造体を優先的に読み出す。キャッシュ・メモリに存在しないルーチン又はデータ構造体よりもキャッシュ・メモリに存在するルーチン又はデータ構造体を先に読み出して処理すると共に、その処理と並行してキャッシュ・メモリに存在しないルーチン又はデータ構造体のプリフェッチを行うため、キャッシュ・メモリのヒット・ミスにより生じるマイクロプロセッサの待ち時間を短くすることができる。
【図面の簡単な説明】
図１は、本発明に係るＭＰＵの一構成例を示すブロック図である。
図２は、本発明に係るスケジューリングの一実施例を示すフロー・チャートである。
図３は、本発明に係るスケジューリングの他の実施例を示すフロー・チャートである。
図４は、従来のＭＰＵの一構成例を示すブロック図である。
図５（ａ）は、ＭＰＵが行うデータ処理の一例を示すフロー・チャートであり、図５（ｂ）は図５（ａ）中の同一データ構造体を使用するルーチンを続けて実行するフロー・チャート図である。
図６は、ＭＰＵのルーチン実行の一例を示すフロー・チャートである。
【図１】
2002069150.tif 000003
【図２】
2002069150.tif 000004
【図３】
2002069150.tif 000005
【図４】
2002069150.tif 000006
【図５】
2002069150.tif 000007
【図６】
2002069150.tif 000008
【国際調査報告】
2002069150.tif 000009
2002069150.tif 000010
2002069150.tif 000011
2002069150.tif 000012