(57)【要約】【課題】同期命令が欠落したソフトウェアから，同期命令が欠落していない場合に得られる，正常な実行結果を取得可能にする。【解決手段】  読み書き双方向けに同期命令を提供するプロセッサにおいて，書き側の同期命令の挙動を可変にし，書き側の同期命令の挙動を変更することにより，書き側にだけ同期命令があれば，読み側の同期命令が欠落していても，ソフトウェアを正常に実行可能にする（読み側の同期命令が欠落していない場合と同様に動作するようにする）。具体的には，書き側の同期命令に２つの動作モードを設け，その一方（通常の動作モード）では読み書き双方に同期命令がある場合にのみソフトウェアを正常に実行でき，もう一方（緊急動作モード）では書き側にだけ同期命令があればソフトウェアを正常に実行できるようにする。【選択図】  図３
2005258607.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサ間の通信に用いられる同期命令の動作を指定する記憶領域を有するプロセッサ。
【請求項２】
請求項１記載のプロセッサにおいて、
前記同期命令の動作を指定する記憶領域に，値を記録する命令を提供し，該命令を実行する機能を有するプロセッサ。
【請求項３】
プロセッサの有するプロセッサ間の通信に用いられる同期命令の動作を指定する記憶領域に値を記録する命令により、該記憶領域に，値を記録するプログラム。
【請求項４】
請求項１記載のプロセッサにおいて、
同期命令の実行にあたり，前記記憶領域を参照し，該記憶領域に記録してある値により，同期命令の実行を完了するまでの遅延を変更する機能を有するプロセッサ。
【請求項５】
請求項１記載のプロセッサにおいて、
同期命令の実行にあたり，前記記憶領域を参照し，該記憶領域に記録してある値により，ハードウェアトラップを発生する機能を有するプロセッサ。
【請求項６】
請求項１記載のプロセッサにおいて、
前記同期命令の動作は複数モードあり、それぞれの動作モードにおける同期処理に必要なサイクル数が異なることを特徴とするプロセッサ。
【請求項７】
請求項１記載のプロセッサにおいて、
前記同期命令の動作は複数モードあり、そのうちの１つの動作モードでは、同期処理に要するサイクル数が可変であることを特徴とするプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，電子回路の一種であるマイクロプロセッサに関する。
【背景技術】
【０００２】
キャッシュメモリを搭載するプロセッサを使って，マルチプロセッサ構成のコンピュータシステムを実現する場合に解決すべき問題に，キャッシュメモリの不整合がある。キャッシュメモリとは，プロセッサのメモリ参照を高速化するための記憶領域である。プロセッサがメモリ参照をおこなうにあたって，主記憶を参照すると，主記憶の記憶素子は大容量である代わりに動作が低速であることから，長い時間がかかる．そこで昨今のプロセッサは，メモリ参照を高速化するために，キャッシュメモリという高速小容量の記憶素子を搭載し，キャッシュメモリに主記憶の記憶内容の一部をコピーしておく。そして，メモリ参照にあたっては，まずキャッシュメモリに，参照したいアドレスに格納してある値のコピーがあるか調べ，あるならば高速なキャッシュメモリから値を読み取り，なければ低速な主記憶を参照する。主記憶を参照した際には，参照した値をキャッシュメモリに記憶し，次に同じアドレスを参照したときに，キャッシュメモリから参照できるようにする。参照した値をキャッシュメモリに記憶する際には，キャッシュメモリのどこかの領域を書き潰すことになる。書き潰した領域が主記憶のアドレスαに記憶してあった内容のコピーを保持していたとすると，書潰しの結果，プロセッサは次にアドレスαを参照するときには主記憶を参照することになる。キャッシュメモリに新しく値を書きこみ，古い値を書き潰すことを，キャッシュメモリの内容の入れ換えと呼ぶことにする。
【０００３】
マルチプロセッサ構成のコンピュータで問題となるキャッシュメモリの不整合とは，個々のプロセッサが同じ主記憶のアドレスに記憶してある値として，それぞれのキャッシュメモリに，互いに異なる値を記憶した場合に発生する。この問題が発生する例を次に示す。まず，プロセッサＡとプロセッサＢからなるコンピュータシステムにおいて，プロセッサＡが主記憶のアドレスαにある値をキャッシュメモリに記憶していたとする。ここでプロセッサＢがアドレスαに値を書き込むと，次の条件が満たされた場合に，キャッシュメモリの不整合から問題が発生する。
【０００４】
条件とは，プロセッサＢが値の書込みをキャッシュメモリに対してのみおこなうことである。昨今のプロセッサは，メモリへの書込みを高速化するために，メモリへの書込みを一旦，キャッシュメモリに対してのみおこない，キャッシュメモリの内容を入れ換える際に主記憶への書込みを実施する場合がある。こうすると，たとえば同じアドレスへの書込みが立て続けに発生した場合，主記憶への書込みは，最後に書き込んだ値のみで済むため，主記憶への書込みを減らし，メモリ参照を高速化できる。一方で主記憶への書込みを遅延すると，値を書き込んだことが他のプロセッサに伝わらないため，キャッシュメモリの不整合が発生する。キャッシュメモリの不整合は，解消しないとプログラムの実行結果がおかしくなりうるので，必ず解消する必要がある。
【０００５】
キャッシュメモリの不整合を解消するには，プロセッサＢが値を主記憶に書きこめばよい。プロセッサに主記憶への書込みを強制するには，「書き側の同期命令」という命令を実行させればよい。書き側の同期命令はキャッシュのみに書き込んだ値を主記憶に書き出す役割を果たす。昨今のプロセッサは主記憶への参照を覗き見（スヌープ）する機能を備えているのが一般的であり，あるプロセッサが書き側の同期命令を実行し，主記憶への書出しを実施すると，他のプロセッサはスヌープ機能によって書出しを検知して，キャッシュメモリに書出し前の古い値を保持しているか調べ，保持していたら，古い値を棄てる。この結果，キャッシュメモリの不整合が解消される。
【０００６】
なお，同期命令という語は，マルチプロセッサ構成のコンピュータシステムにおいて，プロセッサ間の相互干渉から発生する問題の解決を目的とする命令全般を指す。同期命令には様々な実装があり，キャッシュメモリの不整合を解消する「書き側の同期命令」の他に，「読み側の同期命令」を提供するプロセッサもある。
【０００７】
読み側の同期命令とは，命令のアウトオブオーダ実行から発生する問題の回避を目的としたものである。アウトオブオーダ実行とは，命令列に並ぶ命令を，並び順とは異なる順序で実行することを意味する。たとえば，命令列ｍ１，ｍ２をアウトオブオーダ実行すると，先にｍ２を実行して，あとからｍ１を実行することがある。アウトオブオーダ実行から発生する問題について，図１のプログラムを用いて説明する。図１のプログラムはプロセッサ間の通信を目的としたもので，変数ｄａｔａに通信内容にあたるデータを書く側と，読む側に分かれている。データを書く側のプログラムでは，変数ｄａｔａにデータを書き込んだら，書き側の同期命令ｓｙｎｃを実行して，読む側のプロセッサに書き込んだデータを伝え，続いて変数ｆｌａｇをたて，データの読み込みを許可する。一方，読む側のプログラムは，変数ｆｌａｇを参照して，変数ｆｌａｇがたつまで待ち，たったら変数ｄａｔａに書いてあるデータを読み取る。
【０００８】
図１のプログラムを，アウトオブオーダ実行をおこなう機能をもっているプロセッサで実行すると，書く側が書き込んだデータが，書き込んだ順番通りに読む側に伝わらないことがある。その原因は，アウトオブオーダ実行の結果，読む側において，変数ｆｌａｇを参照するより前に変数ｄａｔａを参照しうることにある。具体的には，メモリの参照順序が図２の通りであるとき，読む側は，書く側がデータを書き込む前の変数ｄａｔａの内容を参照してしまい，書く側が書き込んだデータは読む側に伝わらない。
【０００９】
図１のプログラムにおいて，書く側が変数ｄａｔａに書いた内容を確実に読む側に伝える方法はプロセッサによって異なる。読む側の同期命令を提供するプロセッサ（非特許文献１）向けの問題解決方法は，図１の読み側のプログラムについて，変数ｆｌａｇの読込みと変数ｄａｔａの読込みの間に，読む側の同期命令を挿入することである。読む側の同期命令には命令のアウトオブオーダ実行を抑止する効果があり，変数ｆｌａｇの読込みと変数ｄａｔａの読込みの間に挿入すれば，変数ｄａｔａの読込みの実行が先になることを保証し，これにより書く側が変数ｄａｔａに書いた内容を，読む側に確実に伝えることができる。
【００１０】
一方，読む側の同期命令を提供しないプロセッサ（非特許文献２）では，図１のプログラムに何の改変を加えなくても，書く側が変数ｄａｔａに書いた内容は，読む側に確実に伝わる。これは読む側の同期命令を提供しないプロセッサでは，書く側の同期命令に，読む側のアウトオブオーダ実行をキャンセルする効果があるからである。
【００１１】
プロセッサごとに同期命令の実現が異なることは，異なるプロセッサ向けにソフトウェアを移植する際に障害となる。具体的には，書く側の同期命令だけを提供するプロセッサ向けに開発したソフトウェアを，読む側と書く側（両側）の同期命令を提供するプロセッサ向けに移植する際に，読み側に同期命令を挿入し忘れることがある。たとえば，書く側の同期命令だけを提供するプロセッサ向けに開発した図１のプログラムを移植する際に，フラグの読込みとデータの読込みの間に読む側の同期命令を挿入し忘れる。この挿入し忘れの発生は、読む側の同期命令を挿入すべきプログラム中の位置を自動的に検出して挿入するといった自動処理が困難で、膨大な行数のプログラムに対して人手で挿入箇所を決めていることに起因する。同期命令を挿入し忘れても，ソフトウェアは一見正常に動作することが多い。なぜなら同期命令の挿入忘れから障害が発生するか否かは，タイミングによるところが大きいからである。たとえば図１のプログラムから問題が発生するためには，図２のタイミングでメモリ参照が起きる必要がある。
【００１２】
同期命令を挿入し忘れたソフトウェアが，一見正常に動作した結果，ソフトウェアを移植した企業の品質検査をパスして販売され，該ソフトウェアを購入した企業が，該ソフトウェアを長期間運用して初めて問題が露見するケースがままある。運用を開始したソフトウェアに欠陥が見つかると，修正までの期間，運用を停止することから，膨大な経済的損失が発生しうる。このため，同期命令の挿入忘れのように，運用が始まるまで見つかりにくい問題については，問題が露見した場合に，迅速に対処するための対策が重要になる。
【００１３】
【非特許文献１】IBM Microelectronics, MOTOROLA: "PowerPC Microprocessor Family: The Programming Environments," 1996
【非特許文献２】Gerry Kane: "PA-RISC 2.0 ARCHITECTURE," Prentice-Hall, 1996
【発明の開示】
【発明が解決しようとする課題】
【００１４】
本発明の目的は読み側の同期命令を挿入し忘れたソフトウェアを正常に実行できるプロセッサを提供することにある。
【課題を解決するための手段】
【００１５】
両側の同期命令を提供するプロセッサにおいて，書き側の同期命令の挙動を可変にし，書き側の同期命令の挙動を変更することにより，書き側にだけ同期命令があれば，読み側の同期命令が欠落していても，ソフトウェアを正常に実行可能にする（読み側の同期命令が欠落していない場合と同様に動作するようにする）。具体的には，書き側の同期命令に２つの動作モードを設け，その一方（通常の動作モード）では読み書き双方に同期命令がある場合にのみソフトウェアを正常に実行でき，もう一方（緊急動作モード）では書き側にだけ同期命令があればソフトウェアを正常に実行できるようにする。ソフトウェアに，読み側の同期命令が欠落している欠陥が見つかった場合には，ユーザの指定によりプロセッサの動作モードを緊急動作モードに切り替える。書き側の同期命令の挙動を可変にするために，プロセッサ内部に書き側の同期命令の挙動を指定する記憶領域を設ける。プロセッサは書き側の同期命令を実行する際に，該記憶領域を参照し，記憶領域の値が緊急動作モードであった場合には，書き側の同期命令の実行を完了するまでの遅延を延長する。
ここで、書き側の同期命令の実行を完了するまでの遅延とは、書き側の同期命令に関して，その実行を開始してから，実行が完了するまでに経過する時間（何クロック経過するか）を指し、その長さが動作モードによって変わる。本発明では、「緊急動作モード」に設定されている場合の遅延は、「通常の動作モード」に設定されている場合の遅延よりも長く設定される。
【００１６】
遅延の延長により，キャッシュメモリがスヌープ機構を備えていれば，書き込んだ値が他プロセッサのキャッシュメモリに伝わるまでの時間を確保し，キャッシュメモリの整合性を保つことが可能になる。また，遅延の延長により，他のプロセッサがアウトオブオーダ実行している読込み命令の実行完了を待つことが可能になる。この結果，読み側の同期命令が欠落したソフトウェアを実行した際にも，読み側の同期命令がある場合と同じ実行結果を取得可能になる。
【発明の効果】
【００１７】
同期命令を挿入し忘れたソフトウェアを正常に実行可能になる。
【発明を実施するための最良の形態】
【００１８】
プロセッサにおいて、同期命令を挿入し忘れたソフトウェアを正常に実行可能にするため、書き側の同期命令の挙動を可変とする。
【実施例１】
【００１９】
図３に本発明のプロセッサ３０１を含むコンピュータの例を示す。図３のコンピュータでは，バス３０２上にプロセッサ３０１と主記憶３０３，ＤＶＤ−ＲＯＭ読取装置３０４など外部記憶装置が接続されており，ＤＶＤ−ＲＯＭ３０５など外部記憶に記録してあるプログラムを，バス３０２を経由して主記憶３０３に読みこみ，プロセッサ３０１で実行する。
【００２０】
プロセッサ３０１の中にはメモリインタフェース３０６や命令解釈部３０７，レジスタ群３０８，命令実行部３０９がある。プロセッサはこれらの要素を使い，次の手順でプログラムの実行を進める。まず，命令解釈部３０７は次に実行すべき命令のアドレスを保持するレジスタＰＣ３１０が格納する値を,配線３１１を経由して取得し，取得したアドレスにある命令をメモリインタフェース３０６経由で取得する。そして取得した命令の内容を解釈し，その内容に応じて，命令実行部３０９にある論理回路に命令を実行するよう指示して，命令の実行完了報告を待つ。たとえば命令が，同期命令の動作を指定する記憶領域に，値を記録する命令であれば，命令実行部３０９の中にある，同期モード指定命令実行回路３１２に命令の実行を命じる。同期モード指定命令実行回路３１２は，レジスタに値を読み込む命令を実行する既存の論理回路と同様の論理回路で実現できる。同期モード指定命令実行回路３１２は，配線３１３経由で同期モード指定レジスタ３１４，つまり前述の記憶領域に値を設定する。本実施例では、書き側の同期命令に２つの動作モード（通常の動作モード、緊急動作モード）を設ける構成とするため、同期モード指定レジスタ３１４は、１ビット情報が格納できる記憶領域であればよい。
【００２１】
命令解釈部３０７は，取得した命令が，書き側の同期命令ｓｙｎｃであれば命令実行部３０９の中にある，書き側の同期命令実行回路３１５に命令の実行を命じる。書き側の同期命令実行回路３１５は，配線３１３経由で，本発明の同期モード指定レジスタ３１４の値を参照してその動作を変更する。
【００２２】
図４、図５を用いて、本実施例の書き側の同期命令実行回路３１５の実現方法を、それぞれ説明する。
【００２３】
まず，書き側の同期命令実行回路３１５の動作内容（同期命令の実行を完了するまでの遅延を変更する機能の動作内容）を，図４に示す。図４において，書き側の同期命令実行回路３１５は，まず，同期モード指定レジスタ３１４の値に依存しない処理４０１を実行し，次に，同期モード指定レジスタ３１４の値に依存する，本発明の処理４０２を実行する。依存しない処理４０１の動作内容は，既存の両側の同期命令を提供するプロセッサにおける，書き側の同期命令を実行する際の処理内容と同一である。同期モード指定レジスタ３１４の値に依存する，本発明の処理４０２では，まず，判断４０３で同期モード指定レジスタ３１４の値を参照し，値が通常か否か判定し，通常であれば動作を終了し，通常でなければ遅延処理４０４を実行する。同期モード指定レジスタ３１４の値を設定するには，同期モード指定レジスタ３１４を含むプロセッサの内部状態を設定する命令を実行する。遅延処理４０４では，まず処理４０５で遅延カウンタｃの値を遅延クロック数に初期化する。遅延クロック数はプロセッサに固有な値で，プロセッサがメモリへの書込み命令を実施してから，該書込みが他プロセッサに伝わり，他プロセッサが次に読込命令を実施する際に，書込み前の古い値を読み込まないと保証できるまでにかかる最悪クロック数として与えられる。次に判断４０６でカウンタｃの値が０より大きいか調べ，大きければ処理４０７に進み，大きくなければ遅延処理４０４を終了する。処理４０７ではカウンタｃの値を１減じ，続く処理４０８でクロック線３１６を参照して次のクロックを待ってから，判断４０６に戻る。なお，本発明の処理４０２は単純な順序回路で実現できる。
【００２４】
図４の動作をおこなう同期命令実行回路３１５を持つ本発明のプロセッサ１０１では，同期モード指定レジスタ３１４の値を緊急動作モードにした状態ならば，図１のプログラムにおいて，書く側が変数ｄａｔａに書込んだデータを読む側に確実に伝えることができる。なぜなら，図１のプログラムにおいて，書く側が変数ｄａｔａに書込んだデータが読む側に伝わらない条件は，図２の順番で読み書きが発生することだが，緊急動作モードでは図２の順番で読み書きが発生しないからである。図２では，まず読む側がアウトオブオーダ実行により，変数ｄａｔａの中身を読み（処理２０１），次に書く側が２つの書込みを実施するが（処理２０２、処理２０３），２つの書込みの間には，書く側の同期命令ｓｙｎｃがある。緊急動作モードであれば，ｓｙｎｃの終了までに長い時間がかかるので，ｓｙｎｃが終了する前に，必ず読む側が変数ｆｌａｇの読込みを完了する。この緊急動作モードの場合におけるメモリ参照の順序を図８に示す。まず読む側が、アウトオブオーダ実行により変数ｄａｔａからデータを読み込み（処理８０１）、書く側が、変数ｄａｔａに書込みを実行する（処理８０２）。その後、書く側の同期命令ｓｙｎｃが実行されるが、この同期命令はプロセッサ毎に設定された遅延カウンタｃだけ遅延され、この間に読む側の変数ｆｌａｇの読込みは必ず完了される（処理８０４）。このとき読む側が読み込んだ変数ｆｌａｇの値はｆａｌｓｅである。図１のプログラムから判るように，読み込んだ変数ｆｌａｇの値がｆａｌｓｅであるということは、読む側がまだ変数ｄａｔａの値を読むことを許可されていないことを意味する。そこで読む側のプログラムは再び変数ｆｌａｇを参照しにゆく。さて、図８に戻り、書く側のプログラムは遅延カウンタｃに基づく所定の時間経過後に、書く側は変数ｆｌａｇに真値を書き込む（処理８０３）。そのあとで読む側のプログラムがアウトオブオーダ実行されている場合は、読む側が変数ｄａｔａの値を読み込み（処理８０５）、読む側は変数ｆｌａｇの値を読み込む（処理８０６）。読む側が変数ｆｌａｇの値を読み込むと（処理８０６）、その値が真値になっているが、このとき読む側が処理８０５で読み込んだ変数ｄａｔａの値は、確かに書き側が処理８０２で書き込んだ値になっている。アウトオブオーダ実行により、処理８０５の命令が処理８０３の命令より前に実行された場合でも、読む側が処理８０５で読み込む変数ｄａｔａの値は、書き側が処理８０２で書き込んだ値となり、正しく動作する。
【００２５】
この結果として，図２のタイミングで読み書きが発生することはなくなり，書く側が変数ｄａｔａに書込んだデータを読む側に確実に伝わる。
【００２６】
なお，図４の処理４０４では，定数（遅延クロック数）回のクロック分だけ遅延を発生するが，遅延の長さはプロセッサ間で調停して決めることもできる。たとえば，ｓｙｎｃを実行するプロセッサが，バス３０２を経由して他のプロセッサに，アウトオブオーダ実行中の読込み命令が終了したら返信してくれるよう依頼し，返信を受けた段階でｓｙｎｃの実行を完了することもできる。
【００２７】
次に，書き側の同期命令実行回路３１５の動作内容（ハードウェアトラップを発生する機能の動作内容）を，図５に示す。
【００２８】
図５は，図４の遅延処理４０４を，トラップ発生処理５０４に変えたものである。トラップ発生処理５０４の実現は，トラップを発生する命令の既存の実現に準じる。図５の動作をおこなう書き側の同期命令実行回路３１５は，同期モード指定レジスタ３１４の値が通常でなければトラップを発生する。トラップを発生した際に，オペレーティングシステムがトラップを捕捉し，遅延を発生させるなどしたあとで，トラップを発生したｓｙｎｃの次の命令から実行を再開すれば，図５の動作による同期命令実行回路３１５の実現でも，読み側の同期命令の不足から問題が発生することはなくなる。
【００２９】
次に、同期命令の動作を指定する記憶領域に，値を記録するソフトウェアの実施例を図６に示す。図６のソフトウェアは初期化処理６０１と残りの処理６０２からなり，初期化処理６０１の内部にコマンドラインオプション解析処理６０３がある。コマンドラインオプション解析処理６０３の内部にある同期モード指定処理６０４において，同期命令の動作を指定する記憶領域に動作モードを示す値を記録させる命令（同期モード指定命令）を実行する。同期モード指定処理６０４の実施例を図７に示す。図７の処理では，まず判断７０１で，ユーザがアプリケーションの起動時にコマンドラインオプション-Emergencyを指定したか検査し，指定していたら処理７０２に進んで同期モード指定命令を使って同期モード指定レジスタの値を「緊急」にセットし，指定していなかったら処理７０３に進んで，同期モード指定命令を使って同期モード指定レジスタの値を「通常」にセットする。図７の処理を実行した結果，ユーザがアプリケーションの起動時にコマンドラインオプション-Emergencyを指定していたならば，図６の処理６０２の内部に読み側の同期命令を挿入し忘れている箇所があったとしても，図６のソフトウェアは読み側の同期命令がきちんと挿入してある場合と同様の動作をおこなうことが可能になる。
【産業上の利用可能性】
【００３０】
サーバにおいて，本発明を利用することで，ソフトウエアの欠陥を修復可能になる。
【図面の簡単な説明】
【００３１】
【図１】プロセッサ間の通信プログラム
【図２】問題が発生するメモリ参照順序
【図３】本発明を利用するコンピュータ
【図４】書込み側の同期命令の挙動
【図５】書込み側の同期命令の挙動
【図６】同期モードを指定する機能を有するアプリケーションソフトウェア
【図７】同期モード指定処理
【図８】遅延処理によるメモリ参照順序
【符号の説明】
【００３２】
３０１  プロセッサ
３０２  バス
３０３  主記憶
３０４  ＤＶＤ−ＲＯＭ読取装置
３０５  ＤＶＤ−ＲＯＭ
３０６  メモリインタフェース
３０７  命令解釈部
３０８  レジスタ群
３０９  命令実行部
３１０  プログラムカウンタＰＣ
３１１  配線
３１２  同期命令実行回路
３１３  配線
３１４  同期モード指定レジスタ
３１５  クロック信号線
【図１】
2005258607.tif 000003
【図２】
2005258607.tif 000004
【図３】
2005258607.tif 000005
【図４】
2005258607.tif 000006
【図５】
2005258607.tif 000007
【図６】
2005258607.tif 000008
【図７】
2005258607.tif 000009
【図８】
2005258607.tif 000010