(57)【特許請求の範囲】
【請求項１】
キャッシュを有する複数のプロセッサと、
前記複数のプロセッサにより共有される主記憶と、
前記複数のプロセッサのキャッシュに保持するデータのアドレス情報を管理してプロセッサ間のキャッシュコヒーレンス制御を行うコヒーレンス制御部とを具備し、
前記プロセッサはプロセッサ間の同期を目的とする命令を実行した時に同期用トランザクションを発生するマルチプロセッサシステムにおいて、
前記複数のプロセッサのいずれかから同期用トランザクションを受けると、該トランザクションの発生元のプロセッサからの主記憶アクセスを停止し、前記複数のプロセッサの全てより前記同期用トランザクションが出力されると前記主記憶アクセスを再開する主記憶アクセス順序保証機構と、
前記コヒーレンス制御部から前記複数のプロセッサの各々に対し、前記複数のプロセッサが前記同期を目的とする命令よりも前に実行した命令に起因するキャッシュコヒーレンス制御要求が全て出力されたとき、当該プロセッサにキャッシュコヒーレンス制御を完了したことを通知するコヒーレンス完了保証機構とを備え、
かつ前記複数のプロセッサの各々は、前記同期を目的とする命令を実行してから前記コヒーレンス完了保証機構からの前記通知を受けるまでの期間中は後続の命令の実行を停止すること特徴とするマルチプロセッサシステム。
【請求項２】
前記複数のプロセッサから前記同期用トランザクションを受けるとこれを保持し、前記複数のプロセッサの全てが前記同期を目的とする命令を実行すると主記憶と前記コヒーレンス制御部に該同期用トランザクションを出力する同期用トランザクション保持機構をさらに有する請求項１記載のマルチプロセッサシステム。
【請求項３】
前記コヒーレンス完了保証機構は、前記複数のプロセッサの１つから同期用トランザクションを受けるとこれを記憶し、前記複数のプロセッサの全てから該同期用トランザクションを受けるとこれを解除するとともに、最後に受けた該同期用トランザクションよりも前のトランザクションに対するコヒーレンス制御が終わったことをもって同期前のキャッシュコヒーレンス制御が完了したことを検出することを特徴とする請求項１記載のマルチプロセッサシステム。
【請求項４】
キャッシュを有する複数のプロセッサと、
前記複数のプロセッサにより共有される主記憶と、
前記複数のプロセッサのキャッシュに保持するデータのアドレス情報を管理してプロセッサ間のキャッシュコヒーレンス制御を行うコヒーレンス制御部を具備し、
前記複数のプロセッサの間の同期について参加不参加を表すマスク情報を各プロセッサ毎に持ち、
前記複数のプロセッサの各々は、該複数のプロセッサのうちの同期に参加するプロセッサ間の同期を目的とする命令を実行した時に同期用トランザクションを発生するマルチプロセッサシステムにおいて、
前記同期に参加するプロセッサのいずれかから同期用トランザクションを受けると該同期用トランザクションの発元のプロセッサからの主記憶に対するアクセス処理を停止し、前記複数のプロセッサの内同期に参加するプロセッサの全てより同期用トランザクションが出力されると該主記憶に対するアクセス処理を再開する主記憶アクセス順序保証機構と、
前記コヒーレンス制御部から前記同期に参加するプロセッサの各々に対し、前記同期に参加するプロセッサが前記同期を目的とする命令よりも前に実行した命令に起因するキャッシュコヒーレンス制御要求が全て出力されたとき、当該プロセッサにキャッシュコヒーレンス制御を完了したことを通知するコヒーレンス完了保証機構とを備え、
かつ前記同期に参加するプロセッサの各々は、前記同期を目的とする命令を実行してから前記コヒーレンス完了保証機構からの前記通知を受けるまでの期間中は後続の命令の実行を停止すること特徴とするマルチプロセッサシステム。
【請求項５】
前記同期に参加するプロセッサの１つから前記同期用トランザクションを受けるとこれを保持し、前記同期に参加するプロセッサの全てが前記同期を目的とする命令を実行すると主記憶と前記コヒーレンス制御部に該同期用トランザクションを出力する同期用トランザクション保持機構をさらに有する請求項４記載のマルチプロセッサシステム。
【請求項６】
前記コヒーレンス制御部は、前記同期に参加するプロセッサの１つから同期用トランザクションを受けるとこれを記憶し、前記同期に参加するプロセッサの全てから該同期用トランザクションを受けるとこれを解除するとともに、最後に受けた該同期用トランザクションよりも前のトランザクションに対するコヒーレンス制御が終わったことをもって同期前のキャッシュコヒーレンス制御が完了したことを検出するコヒーレンス完了保証機構を持つ請求項４記載のマルチプロセッサシステム。
【請求項７】
キャッシュを有する複数のプロセッサと、複数の該プロセッサにより共有される主記憶と、全ての該プロセッサの該キャッシュに保持するデータのアドレス情報を管理してプロセッサ間のキャッシュコヒーレンス制御を行うコヒーレンス制御部を具備し、
前記複数のプロセッサは、プロセッサ間の同期を目的とする命令を実行した時に同期用トランザクションを発生するマルチプロセッサシステムにおいて、
前記コヒーレンス制御部から前記複数のプロセッサの各々に対し、前記複数のプロセッサが前記同期を目的とする命令よりも前に実行した命令に起因するキャッシュコヒーレンス制御要求が全て出力されたとき、当該プロセッサにキャッシュコヒーレンス完了を通知するコヒーレンス完了保証機構を備え、
前記複数のプロセッサの各々は、前記同期を目的とする命令を実行してから前記コヒーレンス完了保証機構からの前記通知を受けるまでの期間中は、後続の命令の実行を停止し、かつ前記後続の命令の時呼応を停止する待ち時間が規定時間を超えると実行停止を解除することを特徴とするマルチプロセッサシステム。
【請求項８】
キャッシュを有する複数のプロセッサと、前記複数のプロセッサにより共有される主記憶と、前記複数のプロセッサのキャッシュに保持するデータのアドレス情報を管理してプロセッサ間のキャッシュコヒーレンス制御を行うコヒーレンス制御部を具備し、
プロセッサ間の同期について参加不参加を表すマスク情報を各プロセッサ毎に持ち、
前記複数のプロセッサの各々は、該複数のプロセッサのうちの同期に参加するプロセッサ間の同期を目的とする命令を実行した時に同期用トランザクションを発生するマルチプロセッサシステムにおいて、
前記コヒーレンス制御部から前記同期に参加するプロセッサの各々に対し、前記同期に参加するプロセッサが前記同期を目的とする命令よりも前に実行した命令に起因するキャッシュコヒーレンス制御要求が全て出力されたとき、当該プロセッサにキャッシュコヒーレンス完了を通知するコヒーレンス完了保証機構を備え、
前記同期に参加するプロセッサの各々は、前記同期を目的とする命令を実行してから前記コヒーレンス完了保証機構からの前記通知を受けるまでの期間中は、後続の命令の実行を停止し、かつ前記後続の命令の時呼応を停止する待ち時間が規定時間を超えると実行停止を解除することを特徴とするマルチプロセッサシステム。
【請求項９】
キャッシュを有する複数のプロセッサと、前記複数のプロセッサにより共有される主記憶と、前記複数のプロセッサのキャッシュに保持するデータのアドレス情報を管理してプロセッサ間のキャッシュコヒーレンス制御を行うコヒーレンス制御部を具備し、
前記複数のプロセッサの各々はプロセッサ間の同期を目的とする命令を実行した時に同期用トランザクションを発生するマルチプロセッサシステムにおいて、
前記複数のプロセッサの各々に対応して設けられたプロセッサ間の通信のための通信レジスタと、
前記複数のプロセッサのいずれかから前記同期用トランザクションを受けると、前記同期用トランザクションの発生元のプロセッサからの主記憶アクセスを停止し、前記複数のプロセッサ全てより該同期用トランザクションが出力されると該主記憶アクセスを再開する主記憶アクセス順序保証機構と、
前記コヒーレンス制御部から前記複数のプロセッサの各々に対し、前記複数のプロセッサが前記同期を目的とする命令よりも前に実行した命令に起因するキャッシュコヒーレンス制御要求が全て出力され、かつ前記複数のプロセッサの同期用トランザクションより前の前記通信レジスタに対するアクセスの全てが完了したことを当該プロセッサに通知するコヒーレンス完了保証機構とを備え、
前記複数プロセッサの各々は、前記同期を目的とする命令を実行してから前記ヒーレンス完了保証機構からの通知を受けるまでの期間は後続の命令の実行を停止することを特徴とするマルチプロセッサシステム。
【請求項１０】
前記同期を目的とする命令で、同期による保証範囲が前記通信レジスタの値のみか、前記主記憶に対するアクセス順序保証および前記コヒーレンス制御部によるキャッシュコヒーレンス制御完了保証までかを選択できることを特徴とする請求項９に記載のマルチプロセッサシステム。
【請求項１１】
キャッシュを有する複数のプロセッサと、複数の該プロセッサにより共有される主記憶と、全ての該プロセッサの該キャッシュに保持するデータのアドレス情報を管理してプロセッサ間のキャッシュコヒーレンス制御を行うコヒーレンス制御部を具備し、
プロセッサ間の同期について参加不参加を表すマスク情報を各プロセッサ毎に持ち、
前記複数のプロセッサの各々は、同期に参加するプロセッサ間の同期を目的とする命令を実行した時に同期用トランザクションを発生するマルチプロセッサシステムにおいて、
前記複数のプロセッサの各々に対応して設けられたプロセッサ間の通信のための通信レジスタと、
前記複数のプロセッサのいずれかから前記同期用トランザクションを受けると該同期用トランザクションの発行元のプロセッサからの主記憶アクセスを停止し、前記複数のプロセッサのうちの同期に参加するプロセッサの全てから同期用トランザクションが出力されると該主記憶アクセスを再開する主記憶アクセス順序保証機構と、
前記コヒーレンス制御部から前記複数のプロセッサのうちの同期に参加するプロセッサの各々に対し、前記同期に参加するプロセッサが前記同期を目的とする命令よりも前に実行した命令に起因するキャッシュコヒーレンス制御要求が全て出され、かつ前記同期に参加するプロセッサの同期用トランザクションより前の前記通信レジスタに対するアクセスの全てが完了したことを当該プロセッサに通知するコヒーレンス完了保証機構と、
前記複数プロセッサの各々は、前記同期を目的とする命令を実行してから前記ヒーレンス完了保証機構からの通知を受けるまでの期間は後続の命令の実行を停止することを特徴とするマルチプロセッサシステム。
【請求項１２】
前記同期を目的とする命令で、同期による保証範囲が前記通信レジスタの値のみか、前記主記憶に対するアクセス順序保証および前記コヒーレンス制御部によるキャッシュコヒーレンス制御完了保証までかを選択できることを特徴とする請求項１１に記載のマルチプロセッサシステム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、スイッチ構成の主記憶共有型マルチプロセッサシステムに関する。特に、各プロセッサ内のキャッシュのコヒーレンス制御を含むプロセッサ間のメモリアクセス順序制御を行うのに適したマルチプロセッサシステムに関する。
【０００２】
【従来の技術】
計算機の性能を向上する手段として、複数のプロセッサを同時に使用するマルチプロセッサシステムが広く使われている。マルチプロセッサシステムには、主記憶をそれぞれのプロセッサに用意する分散記憶型と、主記憶をプロセッサ間で共有する主記憶共有型とがある。この内、主記憶共有型は、プロセッサ間で共有するデータの管理が容易であることから、分散記憶型に比べてプログラミングがしやすく、普及が進んでいる。
【０００３】
マルチプロセッサシステムでは、各プロセッサが独立に動作するだけでなく、必要に応じてプロセッサ間でデータ交換を行いながら動作する。主記憶共有型のマルチプロセッサでは、あるプロセッサが主記憶に書き込んだ値を別なプロセッサが読み出すことでデータ交換を行う。このようなプロセッサ間のデータ交換では、プロセッサ間のメモリアクセス順序保証が必要である。具体的には、あるプロセッサが書き込むデータを別なプロセッサが読み出す場合、この読み出しがデータの書き込み前ではなく、書き込んだ後になることを保証する手段が要る。
【０００４】
ここで主記憶共有型マルチプロセッサの代表的な構成概要を図１２、図１３を用いて説明する。図１２はバス構成のマルチプロセッサを示す。ＣＰＵ５１００〜５１３０はメモリバス５１５０で結合されており、主記憶５１４０へのアクセスはこのメモリバス５１５０を通して行う。メモリバス５１５０によりアクセスをシリアライズできるので、データ交換のための書き込みと読み出しの順序保証を制御しやすい。反面、ＣＰＵ５１００〜５１３０から主記憶５１４０へのアクセス量は、メモリバス５１５０ネックにより制限される。
【０００５】
これに対して図１３に示すスイッチ構成のマルチプロセッサでは、ＣＰＵ５２００〜５２３０が独立に主記憶５２４０と接続される。スイッチ型の特徴は、各ＣＰＵの主記憶アクセスの干渉が少ないという点にある。例えばＣＰＵ５２００からの線５２５０を通した主記憶５２４０へのアクセスは、他のＣＰＵ５２１０〜５２３０からの主記憶アクセスのパス５２６０〜５２８０に影響を与えない。実際の構成ではＣＰＵ５２００〜５２３０と主記憶５２４０との間に多段のスイッチを用意することが多く、この場合は干渉は全く無い訳ではない。しかし、バス構成のように主記憶アクセスを完全にシリアライズする要素はないので影響の程度は小さく、高いアクセス性能を実現できる。反面、各プロセッサがバラバラに動作するので、プロセッサ間のメモリアクセス順序保証は難しい。
【０００６】
特開平１０−１８７６３４公報は、スイッチ構成の主記憶共有型マルチプロセッサシステムで、プロセッサ間のメモリアクセス順序保証を高速に行う技術を開示する。具体的には、同期用の命令をプロセッサに用意し、この命令により出力されるトランザクションを利用してメモリアクセスのシリアライズを行う。これにより、プロセッサ間の書き込みと読み出しの順序制御を行う。
【０００７】
【発明が解決しようとする課題】
プロセッサの高速化技術としてキャッシュが広く使われている。このキャッシュをプロセッサ毎に持つケースでは、プロセッサ間のデータ交換のためにキャッシュの一致制御（コヒーレンス制御）が必要になる。コヒーレンス制御とは、あるプロセッサのキャッシュに登録されているデータと同じメモリアドレスを持つデータを別なプロセッサが更新した場合、キャッシュ上の古いデータを更新するか、もしくは抹消する制御である。データ交換で正しいデータを読み出せることを保証するには、所望のデータについてのコヒーレンス制御を実行する必要がある。
【０００８】
したがって、本発明の目的はプロセッサ間同期用の命令を用意したマルチプロセッサシステムにおいて、キャッシュコヒーレンスを保証を可能にすることである。
【０００９】
更に言えば、本発明の目的はメモリアクセス順序制御とコヒーレンス制御との２つを独立して行うのではなく、同時にまとめて実行して効率の良いプロセッサ間のデータ交換を実現することにある。
【００１０】
【課題を解決するための手段】
同期用の命令を各プロセッサに用意し、この命令により各プロセッサから出力されるトランザクションを用いて、主記憶アクセスのシリアライズを行うとともにコヒーレンス制御の完了保証も行う。具体的には、次の４つを実現する。
【００１１】
（１）各プロセッサは、同期命令よりも前に実行した命令のトランザクションを全て主記憶側へ出力した後で、同期命令によるトランザクションを出力する。このトランザクションを主記憶とコヒーレンス管理部との両方に出力する。
【００１２】
（２）主記憶は、同期用のトランザクションを受けると、そのソースとなるプロセッサからの主記憶アクセスを止める機構を持つ。全プロセッサより同期用のトランザクションを受けると主記憶アクセスを再開する。これにより、主記憶アクセスのシリアライズを行う。
【００１３】
（３）コヒーレンス管理部は、全プロセッサから同期用のトランザクションを受けると、同期用トランザクションよりも前のトランザクションについてコヒーレンス制御を完了させ、その後に各プロセッサに対してコヒーレンス制御の完了を通知する。
【００１４】
（４）各プロセッサが、コヒーレンス管理部からの完了通知を待つ手段を用意する。これにより、コヒーレンス制御の完了が保証される。
【００１５】
【発明の実施の形態】
以下、本発明の１実施例を示す。最初に本実施例で採用する「コヒーレンス制御を伴うメモリアクセス順序保証方法」であるバリア同期の概念について説明し、その後で本実施例の概要、および詳細を記述する。
【００１６】
＜１．バリア同期の概念＞
本実施例の内容を理解する上で、コヒーレンス制御とメモリアクセス順序制御とを同時に行う手段として本実施例が採用する「バリア同期」について説明する。
【００１７】
１．１  バリア同期の意味
本実施例では、バリア同期という言葉を、次の３項目を満たす意味で使用する。
【００１８】
（キャッシュが有効な場合にも下記３項目を満たす。つまり、下記のload／storeはキャッシュヒットでもミスヒットでも良い。）
（１）２プロセッサ以上任意の数のプロセッサが参加でき、バリア同期に参加した全プロセッサの間で（２）（３）に記述するコヒーレンス制御、およびメモリアクセス順序制御を行う。（以下、（２）（３）の項目は、バリア同期に参加しているプロセッサ間での保証事項として記述する。）
（２）バリア同期の前に各プロセッサが行ったメモリアクセスは、バリア同期の後に各プロセッサが実行するメモリアクセスに反映される。別な記述をすれば、いずれのプロセッサがバリア同期の前に行った主記憶へのstoreも、バリア同期の後に実行する任意のプロセッサの同一アドレスに対するloadに反映される。
【００１９】
（３）バリア同期の後に各プロセッサが行ったメモリアクセスは、バリア同期の前に各プロセッサが実行したメモリアクセスに影響を及ぼさない。別な記述をすれば、いずれのプロセッサがバリア同期の後に行う主記憶へのstoreも、バリア同期の前に行った任意のプロセッサによる同一アドレスに対するloadに反映されることはない。
【００２０】
１．２  バリア同期の使用方法
バリア同期の使用方法を図１１を用いて説明する。
【００２１】
技術計算に多い巨大なループ演算をマルチプロセッサで実行する場合は、ループの中身を分割し、各プロセッサに実行させる手段が用いられる。図１１では、並列実行するプログラムを５０００に、このプログラムを４ＣＰＵで実行する様子を５０１０〜５０６０に示す。なお、ハッチングされている部分が、本プログラムの処理を各ＣＰＵが実行している時間を示す。
【００２２】
ループ部分以外はマルチプロセッサで実行することによるメリットが小さいことから、シングルプロセッサで処理をすることが一般的である。図では、ループ演算以外の部分を全てＣＰＵ０が実行する。（図中５０１０、５０６０）これに対し、ループ部分は処理量が多いので、全ＣＰＵで分担して実行する。（図中５０２０〜５０５０）
図１１に示すようなプログラムでは、ほとんどの場合、ＣＰＵ０がループ前の処理５０１０でstoreした結果をＣＰＵ１〜３がループ演算５０３０〜５０５０中で使用することになる。また、ループ演算５０３０〜５０５０でのＣＰＵ１〜３の計算結果を、ＣＰＵ０がループ以降の処理５０６０で使用することも多い。よって、ループの前後でアクセス順序保証を行う必要がある。
【００２３】
ここで図中の同期Ａ、Ｂのポイントで前節で示したバリア同期を使用すれば、必要なアクセス順序保証が実現できる。つまり、同期Ａにバリア同期を使用することで、ＣＰＵ０が５０１０でstoreした結果を、ＣＰＵ１〜３は５０３０〜５０５０で正しくloadできることを保証される。また、同期Ｂにバリア同期を使用することで、ＣＰＵ１〜３が５０３０〜５０５０でstoreした結果を、ＣＰＵ０は５０６０で正しくloadできることが保証される。この場合、同期ＡでもＢでもＣＰＵ０，１，２，３ともにバリア同期に参加することが必要である。
【００２４】
以下、本実施例では、スイッチ構成の主記憶共有型マルチプロセッサシステムにおける、バリア同期の実装方法およびその動作を説明する。
【００２５】
＜２．本実施例の概要＞
２．１  本実施例の全体構成
本節では、本実施例の構成概要を図１を用いて説明する。
【００２６】
図１は、ＣＰＵ１０，１０１０，２０１０，３０１０の４つが主記憶制御部５０を共有する、スイッチ構成の主記憶共有マルチプロセッサシステムを示す。コヒーレンス管理については、コヒーレンス管理部８０を用いたＦＡＡ方式を採用する。
【００２７】
ＣＰＵ１０，１０１０，２０１０，３０１０は完全に同一であり、図１ではＣＰＵ１０のみ内部を記述している。内部には、バリア同期の要求を保持する要求レジスタ１２０とバリア同期の結果を記録する結果レジスタ１３０とを持つ。また内部のキャッシュに登録しているデータのアドレス情報をタグ１６０に記憶する。
【００２８】
バリア同期の制御論理として、各ＣＰＵ毎に同期制御部３００，１３００，２３００，３３００を用意する。同期制御部は、次の４つの制御を行う。
【００２９】
（１）and回路２００，２１０，２２０を使ったＣＰＵ間の同期情報の管理。
【００３０】
（２）通信レジスタ３７０，１３７０，２３７０，３３７０を使ったＣＰＵ間での高速データ転送の制御。
【００３１】
（３）マスク３５０，１３５０，２３５０，３３５０を使った各ＣＰＵのバリアへの参加不参加制御。
【００３２】
（４）状態レジスタ３６０，１３６０，２３６０，３３６０を使ったバリア同期状態の保持。
【００３３】
本実施例では、同期制御部３００，１３００，２３００，３３００をＣＰＵ１０，１０１０，２０１０，３０１０とは独立して持つが、もちろんＣＰＵ内部に同期制御部を取り込むことも可能である。
【００３４】
主記憶制御部５０は、各ＣＰＵ１０，１０１０，２０１０，３０１０からのメモリアクセスに応じて動作する。内部にバリア検出部７００，１７００，２７００，３７００を持ち、バリア同期のトランザクションによる主記憶アクセスのシリアライズを行う。
【００３５】
コヒーレンス管理部８０は、ＣＰＵ１０，１０１０，２０１０，３０１０のキャッシュのコヒーレンス管理を行う。概要は、各ＣＰＵのタグ情報を内部に保持し、storeを受けるとこれに従い他ＣＰＵのタグ情報をチェックし、キャッシュに登録されているデータへのstoreだと検出すると、その登録データを抹消するkillトランザクションをＣＰＵに通知する。コヒーレンス制御の詳細は後述する。コヒーレンス管理部８０は、内部にバリア検出部８００，１８００，２８００，３８００を持ち、バリア同期によるコヒーレンス管理のシリアライズを行う。
【００３６】
２．２  本実施例の動作概要
本節では、図１を用いて本実施例の動作の概要を説明する。まず、前提となるＣＰＵの動作／命令を挙げ、次にメモリアクセス方法、通常のコヒーレンス制御方法の概要を記述し、最後にバリア同期の動作概要を説明する。
【００３７】
２．２．１  ＣＰＵの動作／命令
本実施例では、次のＣＰＵの動作／命令について、以下の５つを前提として説明する。
【００３８】
（１）各ＣＰＵ１０，１０１０，２０１０，３０１０はストアスルー制御のキャッシュメモリを持つ。
【００３９】
（２）各ＣＰＵ１０，１０１０，２０１０，３０１０はキャッシュヒット時はキャッシュからloadする通常の「load命令」の他に、キャッシュがヒットした場合も必ず主記憶（もしくは後述する通信レジスタ）からデータをloadする「dload命令」（direct load命令）を持つ。本dload命令は、いくつかのＲＩＳＣプロセッサでは、「キャッシュ禁止ページへのload」という形で実現できる。
【００４０】
（３）各ＣＰＵ１０，１０１０，２０１０，３０１０はバリア同期専用の命令である「barrier命令」を持つ。このbarrier命令により生成されるbarrierトランザクションは、barrier命令に先行するトランザクションよりも後に、同期制御部３００，１３００，２３００，３３００、主記憶制御部５０、コヒーレンス制御部８０へと出力される。
【００４１】
（４）各ＣＰＵ１０，１０１０，２０１０，３０１０はbarrier命令を実行すると、バリア同期が規定の状態になるまで後続の命令の実行を止める。
【００４２】
（５）各ＣＰＵ１０，１０１０，２０１０，３０１０は、基本的に命令の実行順序は命令列上の順序と一致しなくてよい。（out-of-oder実行）
（２）については、dload命令が無い場合には一部の最適化が不可能になるだけで、本実施例の基本的な動作は変わらない。（３）（４）については、バリア同期専用命令である必要は必ずしも無いが、barrierトランザクションについては、同期制御部３００，１３００，２３００，３３００、主記憶制御部５０、コヒーレンス制御部８０が他のトランザクションと区別して「同期のためのトランザクション」であることを認識できる必要がある。（５）については、barrier命令では後述２．２．３節の条件を満たすことが必要になる。
【００４３】
２．２．２  メモリアクセス方法／通常のコヒーレンス制御
メモリアクセス方法／通常のコヒーレンス制御（バリア同期時以外でのコヒーレンス制御）について説明する。以下、load動作／direct load動作／store動作について、ＣＰＵ１０の動作で説明する。
【００４４】
・load動作：
ＣＰＵ１０がload命令を実行すると、タグ１６０を見て、loadのターゲットアドレスのデータがキャッシュに存在するかどうかをチェックする。キャッシュがヒットすればキャッシュからloadする。ミスした場合は、線ｐ１５０、同期制御部３００、線ｐ３００を通じて、主記憶制御部５０、コヒーレンス管理部８０までloadトランザクションを出力する。
【００４５】
主記憶制御部５０にloadトランザクションが届くと、主記憶制御部５０は要求loadアドレスに従いメモリを読み出した値を、線ｐ３１０、同期制御部３００、線ｐ１６０を通してＣＰＵ１０に戻す。データが戻ると、ＣＰＵ１０は、リプライデータをレジスタに格納し使用するとともに、キャッシュにもリプライデータを、タグ１６０にリプライデータのアドレス情報を登録しておき、後でまだ同じデータに対してloadが発生した時にはキャッシュ上のデータを使えるようにする。
【００４６】
コヒーレンス管理部８０にloadトランザクションが届くと、コヒーレンス管理部８０は要求loadアドレスの情報がＣＰＵ１０のキャッシュに登録されることをＦＡＡに記憶しておく。
【００４７】
・direct load動作：
ＣＰＵ１０がdirect load命令を実行すると、タグ１６０のチェックを行わず、線ｐ１５０、同期制御部３００、線ｐ３００を通じて、主記憶制御部５０コヒーレンス管理部８０までdirect loadトランザクションを出力する。
【００４８】
主記憶制御部５０にdirect loadトランザクションが届くと、主記憶制御部５０は要求loadアドレスに従いメモリを読み出した値を、線ｐ３３０、同期制御部３００、線ｐ１６０を通してＣＰＵ１０に戻す。データが戻ると、ＣＰＵ１０は、リプライデータをレジスタに格納し使用することは行うが、キャッシュにはリプライデータを登録しない。
【００４９】
コヒーレンス管理部８０にdirect loadトランザクションが届いた場合は、このトランザクションを無視してＦＡＡには登録しない。もちろん、direct loadトランザクション自身がコヒーレンス管理部８０に到達する前に消される制御にしてもよい。
【００５０】
・store動作：
ＣＰＵ１０がstore命令を実行すると、タグ１６０を見て、storeのターゲットアドレスのデータがキャッシュに存在するかどうかをチェックし、キャッシュがヒットすればキャッシュの値を更新する。また、キャッシュのヒット／ミスに関わらず、線ｐ１５０、同期制御部３００、線ｐ３００を通じて、主記憶制御部５０、コヒーレンス管理部８０までstoreトランザクション（storeデータ込み）を出力する。
【００５１】
主記憶制御部５０にstoreトランザクションが届くと、主記憶制御部５０はターゲットアドレスについてstoreデータで更新する。
【００５２】
コヒーレンス管理部８０にstoreトランザクションが届くと、コヒーレンス管理部８０ではstoreのターゲットアドレスのデータが、store元のＣＰＵ１０以外のＣＰＵ１０１０，２０１０，３０１０のキャッシュに登録されているかどうか、ＦＡＡをチェックする。登録されているＣＰＵがあれば、そのＣＰＵに対して当該データのkillトランザクションを出力する。ここではＣＰＵ間の動作パタンを変えて、「ＣＰＵ１０１０からのstoreによりＣＰＵ１０にkillトランザクションを出力する」ケースについて、killトランザクションの動きを説明する。線ｐ３３０、同期制御部３００、線ｐ１７０を通して、タグ１６０にkillトランザクションが届く。タグ１６０では、killトランザクションに示されるデータがキャッシュ上に存在する時は、これを抹消する。
【００５３】
上記のコヒーレンス制御により、ＣＰＵ１０，１０１０，２０１０，３０１０のキャッシュにデータを登録する時にはコヒーレンス管理部８０にも登録される。また、あるＣＰＵのキャッシュに登録されるデータに対して別なＣＰＵがstoreを実行した場合に、キャッシュに登録されるデータを抹消する動作が行える。よって、あるＣＰＵがstoreしたにも関わらず、別なプロセッサのキャッシュにstore前のデータが残りつづけるということはなく、基本的なコヒーレンス制御は達成できている。ただし、storeが主記憶制御部５０に影響を及ぼす時点と、killトランザクションにより各ＣＰＵのタグ上からデータが消える時点との間には、当然時間差がある。
【００５４】
２．２．３  バリア同期の動作概要
次にバリア同期での基本的な動作を説明する。バリア同期では前記の通り、「バリア同期前のメモリアクセスの影響は、バリア同期の後のメモリアクセスには完全に反映されている」、「バリア同期後のメモリアクセスは、バリア同期の前のメモリアクセスには影響を及ぼさない」、の２点を守る必要がある。（ここでのメモリアクセスとは、キャッシュがヒットして実際には主記憶制御部５０へのトランザクションが発生しないケースを含む）  これを実現するため、図１に示すハードウェアでは、バリア同期で基本的に次の動作を行う。
【００５５】
（Ａ）各ＣＰＵ１０，１０１０，２０１０，３０１０は、barrier命令よりも前の各メモリアクセス命令について、以下の３条件が成立するまで待ってからbarrierトランザクションをＣＰＵより出力する。
【００５６】
（Ａ−１）barrier命令の前の全load命令について、キャッシュヒットであればキャッシュより読み出し終わっていること。キャッシュミスであれば、少なくともload要求トランザクションがＣＰＵ１０，１０１０，２０１０，３０１０より出力されたこと。
【００５７】
（Ａ−２）barrier命令の前の全dload命令については、少なくともdload要求トランザクションがＣＰＵ１０，１０１０，２０１０，３０１０より出力されたこと。
【００５８】
（Ａ−３）barrier命令の前の全store命令については、少なくともstore要求トランザクションがＣＰＵ１０，１０１０，２０１０，３０１０より出力されたこと。
【００５９】
（Ｂ）主記憶制御部５０は、内部のバリア検出部７００，１７００，２７００，３７００でbarrierトランザクションを検出する。検出すると、そのパスからのリクエスト（例えばバリア検出部７００が検出した時は、線ｐ３００を通してのリクエスト）を止める。全バリア検出部７００，１７００，２７００，３７００ともに検出すると、リクエストを止める動作を終了し、主記憶アクセスを再開させる。
【００６０】
（Ｃ）コヒーレンス制御部８０は、内部のバリア検出部８００，１８００，２８００，３８００でbarrierトランザクションを検出する。バリア検出部８００，１８００，２８００，３８００の全てがバリアを検出すると、最後のbarrierトランザクションの前にコヒーレンス管理部８０に到達している全てのリクエストに起因するkillトランザクションの後ろにackトランザクションを生成し、各同期制御部３００，１３００，２３００，３３００を通してＣＰＵ１０，１０１０，２０１０，３０１０に送出する。
【００６１】
（Ｄ）各ＣＰＵ１０，１０１０，２０１０，３０１０は、コヒーレンス管理部８０からのackトランザクションが到着し、更にackトランザクションに先行するkillトランザクションの処理が全て完了するまでbarrier命令で待つ。barrier命令より後の命令は、barrier命令が終わるまで実行しない。
【００６２】
以上の（Ａ）〜（Ｄ）により、次のことが保証できる。
【００６３】
（１）barrier命令の前の命令に起因する主記憶制御部５０へのトランザクションは、（Ａ）によりbarrierトランザクションより前に主記憶制御部５０に到着する。barrier命令の後の命令に起因する主記憶制御部５０へのトランザクションは、（Ｄ）によりbarrier成立後にＣＰＵより出力される。ここでbarrier成立時点では（Ｃ）により全ＣＰＵよりbarrierトランザクションが出力されたことが保証される。このことから、barrier命令の後の命令に起因するトランザクションが、barrierトランザクションよりも前に主記憶制御部５０に到着することはない。（注：構成によっては、barrier成立時点で、主記憶制御部５０でもbarrierトランザクションが揃っているという保証は無い。これは、barrier成立はあくまでコヒーレンス管理部８０でbarrierトランザクションが揃ったことを意味し、主記憶制御部５０のＢｕｓｙの状態によっては主記憶制御部５０の方ではまだbarrierトランザクションが揃っていない場合も有り得る。但し、既にbarrierトランザクションが主記憶制御部５０の方向に出力された後であることは保証される。）  よって、（Ｂ）の制御により、主記憶制御部５０へのトランザクションについては、任意のＣＰＵがbarrier命令よりも前に実行する命令に起因する主記憶制御部５０へのトランザクションは、任意のＣＰＵがbarrier命令よりも後に実行する命令に起因する主記憶制御部５０へのトランザクションに反映される。また逆に、任意のＣＰＵがbarrier命令よりも前に実行する命令に起因する主記憶制御部５０へのトランザクションは、、任意のＣＰＵがbarrier命令よりも後に実行する命令に起因する主記憶制御部５０へのトランザクションの影響を受けない。
【００６４】
（２）barrier命令の前に存在するstore命令によるstoreトランザクションについては、（Ａ）によりbarrierトランザクションより前にコヒーレンス制御部８０に到着する。（Ｃ）により、各ＣＰＵがbarrierのackを受ける前に、全ＣＰＵのbarrier命令の前のstore命令に起因するkillトランザクションを受け取ることになる。（Ｄ）により、barrier命令の後続が動作を始める時点では、コヒーレンス制御部８０より受け取ったkillトランザクションは処理することになる。つまり、barrier命令の前に存在するstore命令によるコヒーレンス制御が完了してから、各ＣＰＵはbarrier命令の後続を実行することになる。
【００６５】
以上の（１）（２）により、任意のＣＰＵがbarrier命令より前に実行したstore命令の結果を任意のＣＰＵはbarrier命令の後に実行するload命令（キャッシュヒット/ミスヒット両方のケースを含む）およびdload命令で参照することができる。また、任意のＣＰＵがbarrier命令の後に実行するstore命令の影響を任意のＣＰＵが実行するbarrier命令の前のload/dloadは影響を受けない。よって、バリア同期の定義として記述した１．１節の（２）（３）の条件を満たすことになる。
【００６６】
＜３．本実施例の詳細＞
以下、本実施例の詳細を、図１〜図１０を使用して、本実施例の各構成要素の動作を説明する。最後に、本実施例の機能を用いた命令列について図１４〜１６を用いて説明する。
【００６７】
３．１  ＣＰＵ
図１に示されるＣＰＵ１０，１０１０，２０１０，３０１０は全て同一の構成である。本節では、図２を用いてＣＰＵ１０内部の構成、および動作を説明する。
【００６８】
ＣＰＵ１０は、内部にキャッシュ１５０、キャッシュに登録されるデータのアドレス情報を記憶するタグ１６０、主記憶制御部５０へのload/dloadトランザクションのバッファであるフェッチバッファ１７０、storeトランザクションのバッファであるストアバッファ１８０を持つ。更に、各種レジスタを含むＣＰＵコア１１０内部にbarrierの要求状態を保持する要求レジスタ１２０、barrierの結果が入る結果レジスタ１３０、barrier命令での待ち時間を監視するタイマ１４０を持つ。
【００６９】
以下、最初にload/dload/store命令でのＣＰＵ１０の動作を説明する。
【００７０】
load命令をＣＰＵコア１１０が実行すると、線ｐ１００を通してキャッシュへとload要求を出力する。キャッシュ１５０は、load要求のアドレスとタグ１６０に登録されるアドレスとを比較し、キャッシュヒットの場合は線ｐ１１０を通してＣＰＵコア１１０に結果を返答する。キャッシュミスの場合は、線ｐ１２０を通してフェッチバッファ１７０にloadリクエストが格納される。dload命令では、load命令と異なりキャッシュヒットのケースでも線ｐ１２０を通してフェッチバッファ１７０にdloadリクエストを格納する。store命令をＣＰＵコア１１０が実行すると、線１００を通してキャッシュへとstore要求を出力する。キャッシュ１５０は、store要求のアドレスとタグ１６０に登録されるアドレスとを比較し、キャッシュヒットの場合はキャッシュ上のデータを更新する。また、キャッシュヒット／ミスに関らず、線ｐ１４０を通してストアバッファ１８０にstoreトランザクションを格納する。なお、ＣＰＵ１０はout-of-oder実行を基本としているので、命令列上の順番とフェッチバッファ１７０、ストアバッファ１８０に格納される順序は同一で無くて良い。但し、フェッチバッファ１７０、ストアバッファ１８０自身はＦＩＦＯ制御を行う。
【００７１】
プライオリティ回路１９０は、フェッチバッファ１７０、ストアバッファ１８０に格納されるトランザクションを、線ｐ１５０を通して同期制御部３００へと出力する。フェッチバッファ１７０とストアバッファ１８０のプライオリティの付け方は任意である。load/dloadリクエストの場合は、最終的に線ｐ１６０を通してリプライデータが戻るが、このデータはフェッチバッファ１７０、線ｐ１３０を経由して、キャッシュ１５０に記憶し、そのアドレス情報はタグ１６０に記憶する。
【００７２】
次に、コヒーレンス制御のためのkillトランザクションについて説明する。
【００７３】
killトランザクションは同期制御部３００より線ｐ１７０を経由してタグ１６０に伝わる。タグ１７０では、killトランザクションのアドレスにヒットするエントリがあれば、それを抹消する。
【００７４】
次に、barrier命令を実行した場合の動作を説明する。
【００７５】
ＣＰＵコア１１０がbarrier命令を実行すると、最初に要求レジスタ１２０をセットする。要求レジスタ１２０の構成を図３に示す。要求レジスタ１２０はＲビット１２２、Ｃビット１２４の２ビットを持つ。ここで、Ｒビットはbarrier要求、Ｃビットはコヒーレンス制御完了待ち有り（Ｃ＝０）／無し（Ｃ＝１）を示す。barrier命令で指定される即値が０であればＲ＝１，Ｃ＝０に、barrier命令で指定される即値が１であればＲ＝１，Ｃ＝１になる。コヒーレンス制御待ち有り／無しについて、およびbarrier命令の即値については後述する。なお、この要求レジスタにセットされた値は、線ｐ２１０よりバリアの開始が通知されるとリセットされる。なお、Ｒビットの値は線ｐ１９０より、Ｃビットの値は線ｐ２００より同期制御部３００へ伝えられる。
【００７６】
ＣＰＵコア１１０は、barrier命令によるbarrierトランザクションを、barrier命令に先行する全てのload/dload/store命令の後に線ｐ１００に出力する。ＣＰＵコア１１０からキャッシュ１５０に出力されたbarrierに先行するloadリクエストの内、キャッシュヒットのloadリクエストに対するリプライが線ｐ１８０を通してＣＰＵコア１１０に返答されたことが保証された、およびＣＰＵコア１１０からキャッシュ１５０に投げられたbarrierに先行するload/dload/storeリクエストによるトランザクションを全てフェッチバッファ１７０、ストアバッファ１８０に積まれたことが保証された時点で、キャッシュ１５０はbarrierトランザクションをフェッチバッファ１７０、ストアバッファ１８０に積む。
【００７７】
プライオリティ回路１９０は、フェッチバッファ１７０、ストアバッファ１８０の両方からbarrierトランザクションを受けると、線ｐ１５０を通して同期制御部３００にbarrierトランザクションを出力する。
【００７８】
ＣＰＵコア１１０は、更にbarrier命令を実行すると、結果レジスタ１３０にbarrierの完了が記録されるまで後続命令の実行を止める。結果レジスタの構成を図４に示す。結果レジスタはＥビット１３２の１ビットを持つ。同期制御部３００より、barrierのackが線ｐ１７０を通してタグ１６０に伝わると、先行killトランザクションのタグ１６０への反映が終わった後で線ｐ１８０を通して結果レジスタにbarrierのackが伝えられる。これによりＥビットが立つ。このＥビットは、barrier命令でＣＰＵコアがackを待つ動作を終えた時点でリセットされる。
【００７９】
barrier命令でＣＰＵコアが待っている時間は、タイマ１４０で監視する。規定時間を超えてbarrier命令で待ち続けた場合は、ＣＰＵコアはbarrier命令で待ち続ける動作を止め、例外動作に入る。但し、この場合もbarrierトランザクションの出力および要求レジスタへの設定は通常通り行い、待つ動作のみ中止する。例えばＣＰＵ１０はbarrier命令を実行して待ち状態に入っているのに、別なＣＰＵ１０１０がプログラムバグでbarrier命令に到達しないケースも有り得るので、タイマによるbarrier同期完了待ち中止は必要な機能である。なお、タイマでタイムアウトした時にプロセスをkillするためにも、要求レジスタ１２０、結果レジスタ１３０の退避回復ができる必要がある。
【００８０】
３．２  同期制御部
図１に示される同期制御部３００，１３００，２３００，３３００は全て同一の構成である。本節では、図５を用いて同期制御部３００の構成概要、および動作を説明する。
【００８１】
同期制御部３００の主構成要素は、マスク３５０、状態レジスタ３６０、通信レジスタ３７０である。マスク３５０は、図６に示すとおりＭビット３５５の１ビットにより構成されるレジスタで、その同期制御部３００に接続されるＣＰＵ１０がバリア同期に参加するかしないかを表す。
【００８２】
状態レジスタ３６０は、図７に示す通りＢビット３６５の１ビットにより構成されるレジスタで、接続されるＣＰＵ１０よりbarrierトランザクションが来るとＢ＝１にセットし、主記憶制御部５０、コヒーレンス制御部８０までbarrierトランザクションを出力すると、（もしくはコヒーレンス制御完了待ち無しのバリア同期となり、barrierトランザクションを出力する必要が無くなると（後述））Ｂ＝０にリセットされる。
【００８３】
状態レジスタ３６０の意味について述べる。ＣＰＵ１０がbarrier命令を実行し、このbarrierトランザクションが同期制御部３００に来ただけで主記憶制御部５０にbarrierトランザクションを出力してしまうと、以降主記憶制御部５０のバリア検出部７００で後続リクエストをストップする動作に入る。よって、これ以降にＣＰＵ１０がbarrierタイムアウトを検出したとしても、主記憶をアクセスできない。これを防ぐために、後述するようにＣＰＵ１０，１０１０，２０１０，３０１０の内、マスクされていないＣＰＵ全てがbarrier命令を実行し、必ずbarrierトランザクションが主記憶制御部５０で揃うことが保証されるまで、同期制御部３６０はbarrierトランザクションを状態レジスタ３６０に記憶しておき、主記憶制御部５０へは出力しない。なお、ＣＰＵ１０でタイムアウトを検出した時のプロセスkill作業の為にも、状態レジスタ３６０は退避回復ができることが必須である。
【００８４】
通信レジスタ３７０は、主記憶経由より高速なＣＰＵ間データ転送の為に用意するメモリマップドレジスタである。構成は図８のようなフルビットのレジスタである。図１に示すとおり、通信レジスタ３７０，１３７０，２３７０，３３７０はそれぞれ線ｐ３２０のバスで結合されており、全てがミラーリングされている。すなわち、例えばＣＰＵ１０が通信レジスタ３７０に設定した値は、速やかに通信レジスタ１３７０，２３７０，３３７０にも伝達される。
【００８５】
なお、マスク３５０、状態レジスタ３６０、通信レジスタ３７０はメモリマップドレジスタであるが、これらはコヒーレンス管理部８０によるコヒーレンス制御が不可能なので、読み出しにはload命令ではなくdload命令を使用する必要がある。（設定はstore命令で良い）
ＣＰＵ１０よりload/dload/storeトランザクションを受けた時の同期制御部３００の動作を説明する。同期制御部３００は線ｐ１５０よりこれらのトランザクションを受けると、デコーダ制御部３３０、線ｐ４００、バリア生成部３４０、線ｐ３００を通して、主記憶制御部５０、コヒーレンス制御部８０へ出力する。主記憶制御部５０からのリプライデータは、線ｐ３１０、デコーダ制御部３３０、線ｐ１６０を経由して、ＣＰＵ１０へと戻る。
【００８６】
このように主記憶に対するload/dload/storeでは、デコーダ制御部３３０は何も機能しないが、dload/storeトランザクションのアドレスから、マスク３５０、状態レジスタ３６０、通信レジスタ３７０へのアクセスと判定した場合は、それぞれのレジスタを線ｐ４１０，ｐ４３０，ｐ４６０を通じてアクセスする。dloadであればリプライ値を線ｐ４２０，ｐ４４０，ｐ４７０経由で集め、線ｐ１６０を通してＣＰＵ１０に返答する。
【００８７】
load/dload/storeトランザクションにより、コヒーレンス制御部８０からＣＰＵ１０へのkillトランザクションが発生した場合は、線ｐ３３０、ack検出部５１０、線ｐ６６０、ack生成部５００、線ｐ１７０を通して、ＣＰＵ１０までkillトランザクションを上げる。
【００８８】
次に、barrierでの同期制御部３００の動作を説明する。barrier命令により、ＣＰＵ１０内の要求レジスタ１２０に値がセットされると、要求レジスタの設定値は同期制御部まで線ｐ１９０、線２００を通じて伝えられる。線ｐ１９０、ｐ２００経由の情報は、線ｐ３４０，ｐ３５０経由でand回路２００，２１０へと出力される。ここで、ＣＰＵ１０がマスクされていた場合は、同期制御部３００内のor回路３１０，３２０によりand回路２００、２１０への出力が常に１になる。
【００８９】
また、barrierトランザクションがＣＰＵ１０より線ｐ１５０を通して同期制御部３００に出力されると、デコーダ制御部３３０はbarrierトランザクションであることを識別し、状態レジスタ３６０をセットする。更に、barrierトランザクションは通信レジスタ３７０にも線ｐ４６０経由で伝えられる。通信レジスタ３７０については、barrierトランザクションよりも前のstoreを反映し終わり、これが他の通信レジスタ１３７０、２３７０、３３７０へと線ｐ３２０を経由して伝達されたことが保証できる時に、同期制御部内の線ｐ５１０を１にする。この信号は線ｐ３６０経由でand回路２２０へ出力されるが、この信号もやはり同期制御部３００内のor回路３８０により、マスクされている場合は常に１になる。
【００９０】
and回路２００，２１０，２２０により、同期制御部３００，１３００，２３００，３３００からの出力が全て１になると、その結果が線ｐ３７０，ｐ３８０，ｐ３９０を経由して同期制御部３００内のラッチ４６０，４７０，４８０に伝わる。
【００９１】
この構成により、マスクされていない全てのＣＰＵの要求レジスタ１２０のＲビットが１になったときに線ｐ３７０は１になる。ラッチ４６０は線ｐ３７０が１になると１にセットされる。ラッチ４６０がセットされると、すなわちいずれ必ず各同期制御部３００，１３００，２３００，３３００より主記憶制御部５０にbarrierトランザクションが出力されるので、主記憶制御部５０へbarrierトランザクションを出力しても良いことになる。
【００９２】
マスクされていない全てのＣＰＵの要求レジスタ１２０のＣビットが１になったときに線ｐ３８０は１になる。ラッチ４７０は線ｐ３７０が１になったことをトリガに線ｐ３８０の情報を記憶する。これはすなわちマスクされていないすべてのＣＰＵがbarrier命令の即値で１を指定したことを意味する。１ＣＰＵでも０を指定した場合には、ラッチ４７０が記憶する値は０になる。
【００９３】
マスクされていない全ての同期制御部の通信レジスタより１が上がると線ｐ３９０は１になる。これはすなわちbarrier命令の前のstoreトランザクションを全通信レジスタ３７０，１３７０，２３７０，３３７０に反映し終わったことを表す。
【００９４】
ラッチ４６０に１が設定されたことで、同期制御部３００でバリア同期動作が引き起こされる。以下、（１）マスクされていない同期制御部３００で、ラッチ４６０が１になり、４７０が０だった場合（コヒーレンス制御完了待ち有り）、（２）マスクされていない同期制御部３００で、ラッチ４６０が１になり、４７０が１だった場合（コヒーレンス制御完了待ち無し）、（３）マスクされている同期制御部３００で、ラッチ４６０が１になり、４７０が０だった場合（コヒーレンス制御完了待ち有り）、（４）マスクされている同期制御部３００で、ラッチ４６０が１になり、４７０が１だった場合（コヒーレンス制御完了待ち無し）、の４パタンについて説明する。
【００９５】
（１）マスクされていない同期制御部３００で、ラッチ４６０が１になり、４７０が０だった場合（コヒーレンス制御完了待ち有り）
ラッチ４６０がセットされたことで線ｐ５６０が１になり、かつbarrierトランザクションが状態レジスタ３６０にセットされたことでor回路３９０の出力線５４０が１になると、線５５０も１になる。この時、ラッチ４７０の出力線ｐ５８０は０でなので、and回路４２０の出力も１になり、線ｐ５３０を通じてバリア生成部３４０を起動する。バリア生成部３４０は起動されると、barrierトランザクションを生成し、線ｐ３００を通じて主記憶制御部５０、コヒーレンス管理部８０に出力する。また、and回路４００の出力も１になることから、線ｐ５００を通じて状態レジスタ３６０をリセットし、また線ｐ２１０を通じて、ＣＰＵ１０の要求レジスタ１２０のリセットも行う。
【００９６】
この動作は、すなわち、マスクされていないＣＰＵ全てがbarrier命令を実行してbarrier動作が開始された時点で、コヒーレンス制御完了待ち有りが指定されている（少なくとも１ＣＰＵはbarrier命令の即値で０を指定した）時には、マスクされていない同期制御部３００は、ＣＰＵ１０からのbarrierトランザクションの到着を一旦状態レジスタに格納し確認したら、主記憶制御部５０およびコヒーレンス制御部８０へbarrierトランザクションを出力するということを表す。同時に、状態レジスタ３６０をクリアし、ＣＰＵ１０の要求レジスタもクリアする。
【００９７】
バリア生成部３４０から出力したbarrierトランザクションに従い、コヒーレンス管理部８０は必要なkillトランザクションを線ｐ３３０に出力した後、ackトランザクションをack検出部５１０まで出力して来る。ack検出部５１０はackトランザクションを検出すると、線ｐ６１０を使い、ラッチ４９０をセットする。これにより、線ｐ６００が１になり、更にor回路４３０により線ｐ６４０が１になる。ここで、ラッチ４６０は既に１なので線ｐ５７０も１になっていることから、ラッチ４８０も１になれば線ｐ６５０は１になる。ack生成部５００は線ｐ６５０が１になるとackトランザクションを生成し、線ｐ１７０を経由してＣＰＵ１０に出力する。これはすなわち、コヒーレンス管理部８０からackトランザクションを受けると、通信レジスタの更新も終わっていればＣＰＵ１０にackトランザクションを出力することになる。ack生成部５００は、ackトランザクションをＣＰＵ１０に出力すると、線ｐ６２０を通じて、ラッチ４６０，４７０，４８０をリセットする。
【００９８】
（２）マスクされていない同期制御部３００で、ラッチ４６０が１になり、４７０が１だった場合（コヒーレンス制御完了待ち無し）
ラッチ４６０がセットされたことで線ｐ５６０が１になり、かつbarrierトランザクションが状態レジスタ３６０にセットされたことでor回路３９０の出力線５４０が１になると、線５５０も１になる。この時、ラッチ４７０の出力線ｐ５８０は１でなので、and回路４２０の出力は０のままであり、バリア生成部３４０は起動されない。and回路４００の出力は１になることから、線ｐ５００を通じて状態レジスタ３６０をリセットし、また線ｐ２１０を通じて、ＣＰＵ１０の要求レジスタ１２０のリセットも行う。
【００９９】
この動作は、すなわち、マスクされていないＣＰＵ全てがbarrier命令を実行してbarrier動作が開始された時点で、コヒーレンス制御完了待ち無しが指定されている（全ＣＰＵがbarrier命令の即値で１を指定した）時には、マスクされていない同期制御部３００は、ＣＰＵ１０からのbarrierトランザクションの到着を一旦状態レジスタに格納し確認した後、主記憶制御部５０、コヒーレンス制御部８０へ出力することなく、抹消することを表す。状態レジスタ３６０とＣＰＵ１０の要求レジスタについては、コヒーレンス制御完了待ち無しの場合と同様にクリアする。
【０１００】
コヒーレンス管理部８０からのackトランザクションは無いので、ラッチ４９０は１にはならないが、ラッチ４６０，４７０は１なので、or回路４３０の出力は１になり、よって、ラッチ４８０も１になれば線ｐ６５０は１になる。ack生成部５００は線ｐ６５０が１になるとackトランザクションを生成し、線ｐ１７０を経由してＣＰＵ１０に出力する。これはすなわち、コヒーレンス管理部８０からackトランザクションを受けなくても、通信レジスタの更新が終わっていればＣＰＵ１０にackトランザクションを出力することになる。ack生成部５００は、ackトランザクションをＣＰＵ１０に出力すると、線ｐ６２０を通じて、ラッチ４６０，４７０，４８０をリセットする。
【０１０１】
上記の動作を行うため、コヒーレンス制御完了待ち無しは、通信レジスタ３７０の値保証だけを高速に行うために使える。実際の例は後述する。
【０１０２】
（３）マスクされている同期制御部３００で、ラッチ４６０が１になり、４７０が０だった場合（コヒーレンス制御完了待ち有り）
マスクされている場合は、barrierトランザクションが状態レジスタ３６０にセットされなくても、or回路３９０の出力が１になるので、ラッチ４６０がセットされたことだけで（ラッチ４７０の出力線ｐ５８０は０でなので）、線ｐ５３０を通じてバリア生成部３４０が起動されることになる。バリア生成部３４０は起動されると、barrierトランザクションを生成し、線ｐ３００を通じて主記憶制御部５０、コヒーレンス管理部８０に出力する。ただし、and回路４００の出力は１にならないことから、状態レジスタ３６０、ＣＰＵ１０の要求レジスタ１２０のリセットは行われない。
【０１０３】
この動作は、すなわち、マスクされていないＣＰＵ全てがbarrier命令を実行してbarrier動作が開始された時点で、コヒーレンス制御完了待ち有りが指定されている（少なくとも１ＣＰＵはbarrier命令の即値で０を指定した）時には、マスクされている同期制御部３００は、無条件に主記憶制御部５０およびコヒーレンス制御部８０へbarrierトランザクションを出力するということを表す。
【０１０４】
バリア生成部３４０から出力したbarrierトランザクションに従い、コヒーレンス管理部８０は必要なkillトランザクションを線ｐ３３０に出力した後、ackトランザクションをack検出部５１０まで出力して来る。ack検出部５１０はackトランザクションを検出すると、線ｐ６１０を使い、ラッチ４９０をセットする。これにより、線ｐ６００が１になり、更にor回路４３０により線ｐ６４０が１になる。ここで、ラッチ４６０は既に１なので線ｐ５７０も１になっていることから、ラッチ４８０も１になれば線ｐ６５０は１になる。ack生成部５００は線ｐ６５０が１になっても、マスクされていることで線ｐ６７０が１であると、ackトランザクションは生成せず、線ｐ６２０を通じてラッチ４６０，４７０，４８０のリセットのみ行う。これはすなわち、コヒーレンス管理部８０からackトランザクションを受けても、ＣＰＵ１０へはackトランザクションは返さず、ラッチ４６０，４７０，４８０の状態のみリセットすることを意味する。
【０１０５】
（４）マスクされている同期制御部３００で、ラッチ４６０が１になり、４７０が１だった場合（コヒーレンス制御完了待ち無し）
マスクされている場合は、barrierトランザクションが状態レジスタ３６０にセットされなくても、or回路３９０の出力が１になるが、ラッチ４７０も１であり、and回路４００，４２０とも１にはならない。よって、バリア生成部３４０は起動されず、状態レジスタ３６０、要求レジスタ１２０のリセットも行われない。
【０１０６】
この動作は、すなわち、マスクされていないＣＰＵ全てがbarrier命令を実行してbarrier動作が開始された時点で、コヒーレンス制御完了待ち無しが指定されている（全ＣＰＵがbarrier命令の即値で１を指定した）時には、マスクされている同期制御部３００は、特に動作が無いことを意味する。
【０１０７】
コヒーレンス管理部８０からのackトランザクションは無いので、ラッチ４９０は１にはならないが、ラッチ４６０，４７０は１なので、or回路４３０の出力は１になり、よって、ラッチ４８０も１になれば線ｐ６５０は１になる。ack生成部５００は線ｐ６５０が１になっても、マスクされていることで線ｐ６７０が１であると、ackトランザクションは生成せず、線ｐ６２０を通じてラッチ４６０，４７０，４８０のリセットのみ行う。これはすなわち、コヒーレンス管理部８０からackトランザクションを受けても、ＣＰＵ１０へはackトランザクションは返さず、ラッチ４６０，４７０，４８０の状態のみリセットすることを意味する。
【０１０８】
同期制御部の内いくつかがマスクされているケースで、コヒーレンス制御完了待ち有りとなった場合は、各同期制御部で（１）（３）の動作が混じるが、いずれも主記憶制御部５０，コヒーレンス管理部８０へbarrierトランザクションを出力する。逆に、コヒーレンス制御完了待ち無しとなった場合は、各同期制御部で（２）（４）の動作が混じるが、いずれも主記憶制御部５０，コヒーレンス管理部８０へbarrierトランザクションを出力しない。
【０１０９】
３．３  主記憶制御部
本節では、図９を用いて主記憶制御部５０の構成、および動作を説明する。
【０１１０】
主記憶制御部５０は、内部にバリア検出部７００，１７００，２７００，３７００と、主記憶６０とを持つ。barrierトランザクションが検出されなければ、線ｐ３００，ｐ１３００，ｐ２３００，ｐ３３００を通して同期制御部３００，１３００，２３００，３３００より来たload/dload/storeトランザクションは、バリア検出部７００，１７００，２７００，３７００を通過して、線ｐ７２０，１７２０，２７２０，３７２０経由で主記憶６０にアクセスする。storeトランザクションについてはstoreデータを主記憶６０に反映し、load/dloadトランザクションについては、リプライ値を線ｐ３１０，ｐ１３１０，ｐ２３１０，ｐ３３１０を経由して同期制御部３００，１３００，２３００，３３００に返答する。
【０１１１】
バリア検出部７００がbarrierトランザクションを検出すると、線ｐ３００からの主記憶６０へのアクセスをバリア検出部７００で停止し、また線ｐ７００よりand回路７１０へ１を出力する。同様に、バリア検出部１７００，２７００，３７００全てでbarrierトランザクションを検出すると、and回路７１０の出力線ｐ７１０が１になり、各バリア検出部７００，１７００，２７００，３７００をリセットする。
【０１１２】
よって、barrierトランザクションの前のトランザクション全てが主記憶６０に出力された後で、barrierトランザクションの後のトランザクションが主記憶６０へ出力される動作になり、barrierトランザクションによる主記憶アクセスのシリアライズが実現する。
【０１１３】
３．４  コヒーレンス管理部
本節では、図１０を用いてコヒーレンス管理部８０の構成、および動作を説明する。
【０１１４】
コヒーレンス制御部８０は、内部にバリア検出部８００，１８００，２８００，３８００と、ＦＡＡ９０とを持つ。barrierトランザクションが検出されなければ、線ｐ３００，ｐ１３００，ｐ２３００，ｐ３３００を通して同期制御部３００，１３００，２３００，３３００より来たload/storeトランザクションは、バリア検出部８００，１８００，２８００，３８００を通過して、線ｐ８２０，ｐ１８２０，ｐ２８２０，ｐ３８２０経由でＦＡＡ９０に到達する。loadであればＦＡＡ登録、storeであればＦＡＡチェックおよびチェックに引っ掛かった場合はkillトランザクションを生成し、線ｐ３３０，ｐ１３３０，ｐ２３３０，ｐ３３３０を経由して同期制御部３００，１３００，２３００，３３００に出力する。
【０１１５】
バリア検出部８００がbarrierトランザクションを検出すると、線ｐ８００を１にする。この時、線ｐ３００からＦＡＡへのトランザクションの流れを止めるかどうかについては、止めても止めなくてもどちらでもよい。これは、ＣＰＵ１０，１０１０，２０１０，３０１０がbarrier命令から抜けるには、コヒーレンス管理部８０よりackを出力する必要があることから、barrierトランザクションの後ろに別のトランザクションが来ることがないことと、仮にbarrier命令よりも後のstoreトランザクションが来てしまい、不当にkillトランザクションが生成されたとしても、主記憶側でシリアライズしているので、結局、barrier命令よりも前のlload命令はbarrier命令より後のstore命令よりも先に主記憶アクセスすることになり、問題が発生し得ないことによる。（これに対し、主記憶制御部５０の方は、barrierトランザクションが揃うまでＣＰＵ１０，１０１０，２０１０，３０１０を必ず待たせることができる保証がないので、シリアライズが必要である。）同様に、バリア検出部１８００，２８００，３８００全てでbarrierトランザクションを検出すると、and回路８１０の出力線ｐ８１０が１になり、各バリア検出部８００，１８００，２８００，３８００をリセットするとともに、ack生成部８２０を起動して、ackトランザクションを線ｐ３３０，ｐ１３３０，ｐ２３３０，ｐ３３３０を経由して同期制御部３００，１３００，２３００，３３００に出力する。
【０１１６】
よって、barrierトランザクションの前のトランザクション全てについてのＦＡＡ９０への操作が終わり、それに伴うkillトランザクションを同期制御部３００，１３００，２３００，３３００に出力した後で、ackトランザクションを出力する制御が実現する。
【０１１７】
３．５  命令列例
図１４、図１５、図１６に、本実施例のbarrier命令を用いた命令列例を示す。
【０１１８】
図１４は、図１１における同期Ａのパタンについて、ＣＰＵ１０、ＣＰＵ１０１０の間での命令列例を示す。ＣＰＵ１０がbarrier命令（即値０）の前に実行した、主記憶６０、通信レジスタ３７０へのstore（６０１０、６０２０）の値は、ＣＰＵ１０１０がbarrier命令（即値０）の後に実行する通信レジスタ３７０へのdload命令（６１２０）、主記憶６０へのload命令（６１３０）に必ず反映されることが保証できる。なお、ここでは命令６０２０，６１２０のdloadで通信レジスタ３７０をアクセスしたが、これは主記憶６０に対するアクセスでも問題ない。また、barrier命令の即値はＣＰＵ１０、ＣＰＵ１０１０とも０としたが、これはどちらかが１であっても変わらない。
【０１１９】
図１５は、図１１における同期Ｂのパタンについて、ＣＰＵ１０、ＣＰＵ１０１０の間での命令列例を示す。ＣＰＵ１０１０がbarrier命令（即値０）の前に実行した、主記憶６０、通信レジスタ３７０へのstore（６３１０、６３２０）の値は、ＣＰＵ１０がbarrier命令（即値０）の後に実行する通信レジスタ３７０へのdload命令（６２２０）、主記憶６０へのload命令（６２３０）に必ず反映されることが保証できる。なお、ここではdloadで通信レジスタ３７０をアクセスしたが、これは主記憶６０に対するアクセスでも問題ない。また、barrier命令の即値はＣＰＵ１０、ＣＰＵ１０１０とも０としたが、これはどちらかが１であっても変わらない。
【０１２０】
図１６はコヒーレンス制御完了待ち無しの例として示す。ＣＰＵ１０、ＣＰＵ１０１０ともbarrier命令の即値が１なので、コヒーレンス制御完了待ち無しのバリア同期が機能する。この場合、ＣＰＵ１０がbarrier命令の前で実行した通信レジスタ３７０へのstore（６４１０）は、ＣＰＵ１０１０がbarrier命令の後で実行するdload命令（６５２０）に必ず反映される。但し、この場合は通信レジスタ３７０の代りに主記憶６０を指定すると、store結果の反映が保証できない。load命令を使った場合も同様である。
【０１２１】
【発明の効果】
スイッチ構成の主記憶共有型マルチプロセッサにおいて、メモリアクセス順序保証とコヒーレンス保証とを同時に高速に実行でき、プロセッサ間のデータ交換の性能が高まる。
【図面の簡単な説明】
【図１】本発明の同期機構を持つマルチプロセッサシステムを表す図である。
【図２】本発明のマルチプロセッサシステム中のＣＰＵを表す図である。
【図３】本発明のマルチプロセッサシステム中の要求レジスタを表す図である。
【図４】本発明のマルチプロセッサシステム中の結果レジスタを表す図である。
【図５】本発明のマルチプロセッサシステム中の同期制御部を表す図である。
【図６】本発明のマルチプロセッサシステム中のマスクを表す図である。
【図７】本発明のマルチプロセッサシステム中の状態レジスタを表す図である。
【図８】本発明のマルチプロセッサシステム中の通信レジスタを表す図である。
【図９】本発明のマルチプロセッサシステム中の主記憶制御部を表す図である。
【図１０】本発明のマルチプロセッサシステム中のコヒーレンス管理部を表す図である。
【図１１】本発明の同期の適用例を表す図である。
【図１２】バス構成の主記憶共有型マルチプロセッサを表す図である。
【図１３】スイッチ構成の主記憶共有型マルチプロセッサを表す図である。
【図１４】本発明の同期を用いた命令列例を表す図である。
【図１５】本発明の同期を用いた命令列例を表す図である。
【図１６】本発明の同期を用いた命令列例を表す図である。
【符号の説明】
１９０…プライオリティ回路
２００，２１０，２２０，４００，４１０，４２０，４４０，４５０，７１０，８１０…and回路
３１０，３２０，３８０，３９０，４３０…or回路
７００，８００，１７００，１８００，２７００，２８００，３７００，３８００…バリア検出部。
【図１】
0003858492.tif 000002
【図２】
0003858492.tif 000003
【図３】
0003858492.tif 000004
【図４】
0003858492.tif 000005
【図５】
0003858492.tif 000006
【図６】
0003858492.tif 000007
【図７】
0003858492.tif 000008
【図８】
0003858492.tif 000009
【図９】
0003858492.tif 000010
【図１０】
0003858492.tif 000011
【図１１】
0003858492.tif 000012
【図１２】
0003858492.tif 000013
【図１３】
0003858492.tif 000014
【図１４】
0003858492.tif 000015
【図１５】
0003858492.tif 000016
【図１６】
0003858492.tif 000017