(57)【要約】      （修正有）【課題】拡張バスで接続された複数のプロセッサ間で同期処理を行う際に、性能を低下させることなく、同期処理に用いるメモリに対するメモリアクセスの順序を保証する技術を提供する。【解決手段】同期処理ユニット２２は、メモリ２３にアクセスするメモリアクセス命令を受信すると、同期処理用の命令であるか否かを判定する命令判定部２２１と、メモリ２３に対して発行されたメモリアクセス命令が完了しているか否かを判定する完了判定部２２２と、同期処理用でないメモリアクセス命令をメモリ２３に対して発行し、同期処理用のメモリアクセス命令の発行を、先行のメモリアクセス命令が完了したことが完了判定部２２２により判定されるまで保留してから発行する発行部２２３と、同期処理用のメモリアクセス命令が保留されてから、発行後に完了するまでの間、後続のメモリアクセス命令を受信しないよう制御する後続制御部３２４と、を備える。【選択図】図１
2017182533.tif 000002
【特許請求の範囲】
【請求項１】
自装置を含むデバイスとの間を拡張バスで接続された外部装置または前記デバイス内のプロセッサから、前記デバイス内のメモリにアクセスするメモリアクセス命令を受信すると、前記メモリアクセス命令が同期処理を指示するための同期処理用の命令であるか否かを判定する命令判定部と、
前記メモリに対して発行されたメモリアクセス命令が完了しているか否かを判定する完了判定部と、
前記同期処理用でないと判定されたメモリアクセス命令を前記メモリに対して発行するとともに、前記同期処理用であると判定されたメモリアクセス命令の発行を、該同期処理用のメモリアクセス命令より前に受信された先行のメモリアクセス命令が完了したことが前記完了判定部により判定されるまで保留してから発行する発行部と、
前記同期処理用のメモリアクセス命令が保留されてから、発行後に完了するまでの間、後続のメモリアクセス命令を、前記外部装置および前記デバイス内のプロセッサから受信しないよう制御する後続制御部と、
を備えた同期処理ユニット。
【請求項２】
前記命令判定部は、前記メモリにおける前記同期処理用の領域を表す情報を記憶しておき、受信したメモリアクセス命令の対象となるメモリ上の領域が、前記同期処理用の領域に含まれるか否かに基づいて、前記メモリアクセス命令が前記同期処理用の命令であるか否かを判定することを特徴とする請求項１に記載の同期処理ユニット。
【請求項３】
前記完了判定部は、前記メモリに対して前記メモリアクセス命令が発行されるとインクリメントし前記メモリアクセス命令の完了が通知されるとデクリメントするカウンタを有し、前記カウンタの値に基づいて、前記メモリに対して発行されたメモリアクセス命令が完了しているか否かを判定することを特徴とする請求項１または請求項２に記載の同期処理ユニット。
【請求項４】
請求項１から請求項３のいずれか１項に記載の同期処理ユニットと、
前記メモリと、
前記プロセッサと、
を備えたデバイス。
【請求項５】
請求項４に記載のデバイスと、
前記外部装置としてのホスト装置と、
を備えたシステム。
【請求項６】
前記外部装置として、前記拡張バスで接続された他のデバイスをさらに備えたことを特徴とする請求項５に記載のシステム。
【請求項７】
同期処理ユニットが、
自装置を含むデバイスとの間を拡張バスで接続された外部装置または前記デバイス内のプロセッサから、前記デバイス内のメモリにアクセスするメモリアクセス命令を受信すると、
前記メモリアクセス命令が同期処理を指示するための同期処理用の命令であるか否かを判定し、
前記同期処理用でないと判定されたメモリアクセス命令を前記メモリに対して発行し、
前記同期処理用であると判定されたメモリアクセス命令の発行を、該同期処理用のメモリアクセス命令より前に受信された先行のメモリアクセス命令が完了したと判定されるまで保留してから発行し、
前記同期処理用のメモリアクセス命令が保留されてから、発行後に完了するまでの間、後続のメモリアクセス命令を、前記外部装置および前記デバイス内のプロセッサから受信しないよう制御する方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、拡張バスで接続された複数のプロセッサ間で同期処理を行う技術に関する。
【背景技術】
【０００２】
近年、ＰＣＩｅ（Peripheral Component Interconnect Express）等に代表される拡張バスにおける拡張側のデバイスとして、プロセッサを接続するシステムが増えている。このような場合、ホスト側のプロセッサおよび拡張側のプロセッサ間、または、複数の拡張側のプロセッサ間における同期処理の仕組みが要求されることが多い。そこで、一般的に、ホスト側のメモリを用いて同期処理を行う方法が知られている。例えば、ＰＣＩｅでは、ＰＣＩｅ接続の階層の根幹となる要素であるルート・コンプレックス側のメモリを用いて、同期処理が行われる。ＰＣＩｅで定義されるアトミック処理や、トラフィッククラスを用いたホスト側のメモリに対するフラッシュ処理などは、ホスト側のメモリを用いて同期処理を行うのに適した仕組みである。
【０００３】
このような複数のプロセッサ間における同期処理に関連する技術の一例が、特許文献１に記載されている。特許文献１に記載された関連技術は、共有メモリを用いて、プロセッサ内部における複数の論理プロセッサ間で同期処理を行う。
【０００４】
また、複数のプロセッサ間における同期処理に関連する技術の他の一例が、特許文献２に記載されている。特許文献２に記載された関連技術は、共有メモリを用いて、ホスト装置およびグラフィックス処理装置間で同期処理を行う。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１４−１８２７９５号公報
【特許文献２】特表２０１３−５４６０３５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、拡張バスで接続された複数のプロセッサ間で同期処理を行うには、上述した一般的な方法および関連技術には、以下の課題がある。
【０００７】
課題を説明するため、例えば、同期処理として、ｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルを想定する。ｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルは、同期処理の中では比較的オーバーヘッドが小さく、多くの計算システムで使用されている。
【０００８】
ｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルは、処理を渡すＲｅｌｅａｓｅプロセスと、処理を引き継ぐＡｃｑｕｉｒｅプロセスとの２種類のプロセスにより構成される。Ｒｅｌｅａｓｅプロセスは、引き渡すデータをメモリに書いた後に、そのデータの引き渡しを通知するためのフラグをメモリに書く。Ａｃｑｕｉｒｅプロセスは、データの引き渡しのフラグをポーリングし、フラグが成立した場合に、引き渡されたデータをメモリから読み出す。
【０００９】
ここで、ホスト側のプロセッサから拡張側のプロセッサに、処理を引き渡すことを考える。この場合、ホスト側のプロセッサがＲｅｌｅａｓｅプロセスを実行し、拡張側のプロセッサがＡｃｑｕｉｒｅプロセスを実行する。このとき、拡張側によるＡｃｑｕｉｒｅプロセスにおけるポーリング処理により、性能上の問題が生じる。具体的には、拡張側によるＡｃｑｕｉｒｅプロセスは、ポーリング処理のため、ホスト側のメモリに対するメモリリードを、一定時間毎に発行することになる。このメモリリードは、拡張側およびホスト側を接続する拡張バスを往復する必要があるため、ターンアラウンドタイムが大きい。また、ポーリング処理は、ホスト側のメモリ上のフラグが成立するまで繰り返される。このため、拡張側によるＡｃｑｕｉｒｅプロセスが、拡張バス上の他のトランザクションに繰り返し影響を与えるという問題がある。
【００１０】
そこで、拡張側のメモリを用いて同期処理を行うことが考えられる。この場合、拡張側のＡｃｑｕｉｒｅプロセスは、拡張側のメモリに対してポーリング処理を行えばよい。したがって、上述のポーリング処理が拡張バスを繰り返し往復することによる性能上の問題は発生しない。しかしながら、ＰＣＩｅ等の拡張バスの仕様だけでは、拡張側のリード・ライトトランザクションのオーダリングの問題が生じる。
【００１１】
この問題を、上述のｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルを用いて、ホスト側のプロセッサから拡張側のプロセッサに処理を引き渡すケースで説明する。この場合、ホスト側によるＲｅｌｅａｓｅプロセスは、拡張側のメモリに対して、引き渡すデータのメモリライトを発行し、その後、データの引き渡しを通知するためのフラグのメモリライトを発行する。同期処理のためには、これらのメモリライトが拡張側のメモリに反映される順序は、その発行順序通りでなければならない。
【００１２】
しかしながら、拡張バスのオーダリングの仕様だけでは、この順序保障をすることは難しい。なぜならば、拡張側のデバイス内でのメモリネットワークなどは、拡張バスの規格に準拠しないと考えられるからである。例えば、一般的には、アクセス対象のアドレスが同一でない場合には、メモリアクセス間での順序関係は、性能向上を理由として保障されないからである。
【００１３】
この問題を、図１４を用いて模式的に説明する。図１４において、ホスト側の拡張バスインタフェースから、拡張側のデバイスの拡張バスインタフェースに到達するまでは、メモリアクセスの発行された順序が、拡張バスの仕様により保証される。ところが、拡張側デバイスの拡張バスインタフェースからメモリまでの間で、メモリアクセス間の順序入れ替えが起こり得る。したがって、図１４のように、これらのメモリアクセスは、ホスト側の拡張バスインタフェースを出た順序とは異なる順序で、拡張側のメモリに反映される場合がある。
【００１４】
このように、拡張側のメモリを用いて同期処理を行う場合、ホスト側から拡張側のメモリに対するメモリアクセスの順序が保証されないという問題が生じる。
【００１５】
また、特許文献１または特許文献２に記載された関連技術を、拡張バスで接続されたプロセッサ間の同期処理に適用することを考える。もし、これらの関連技術における共有メモリとして、拡張側のデバイスの外部のメモリを適用した場合、上述したように、拡張側のポーリング処理による性能低下の問題が生じる。一方、この関連技術の共有メモリとして、拡張側のメモリを適用する場合、上述したように、拡張側のメモリに対するメモリアクセスの順序が保証されないという問題が生じる。
【００１６】
本発明は、上述の課題を解決するためになされたものである。すなわち、本発明は、拡張バスで接続された複数のプロセッサ間で同期処理を行う際に、性能を低下させることなく、同期処理に用いるメモリに対するメモリアクセスの順序を保証する技術を提供することを目的とする。
【課題を解決するための手段】
【００１７】
本発明の同期処理ユニットは、自装置を含むデバイスとの間を拡張バスで接続された外部装置または前記デバイス内のプロセッサから、前記デバイス内のメモリにアクセスするメモリアクセス命令を受信すると、前記メモリアクセス命令が同期処理を指示するための同期処理用の命令であるか否かを判定する命令判定部と、前記メモリに対して発行されたメモリアクセス命令が完了しているか否かを判定する完了判定部と、前記同期処理用でないと判定されたメモリアクセス命令を前記メモリに対して発行するとともに、前記同期処理用であると判定されたメモリアクセス命令の発行を、該同期処理用のメモリアクセス命令より前に受信された先行のメモリアクセス命令が完了したことが前記完了判定部により判定されるまで保留してから発行する発行部と、前記同期処理用のメモリアクセス命令が保留されてから、発行後に完了するまでの間、後続のメモリアクセス命令を、前記外部装置および前記デバイス内のプロセッサから受信しないよう制御する後続制御部と、を備える。
【００１８】
また、本発明のデバイスは、上述の同期処理ユニットと、前記メモリと、前記プロセッサと、を備える。
【００１９】
また、本発明のシステムは、上述のデバイスと、前記外部装置としてのホスト装置と、を備える。
【００２０】
また、本発明の方法は、同期処理ユニットが、自装置を含むデバイスとの間を拡張バスで接続された外部装置または前記デバイス内のプロセッサから、前記デバイス内のメモリにアクセスするメモリアクセス命令を受信すると、前記メモリアクセス命令が同期処理を指示するための同期処理用の命令であるか否かを判定し、前記同期処理用でないと判定されたメモリアクセス命令を前記メモリに対して発行し、前記同期処理用であると判定されたメモリアクセス命令の発行を、該同期処理用のメモリアクセス命令より前に受信された先行のメモリアクセス命令が完了したと判定されるまで保留してから発行し、前記同期処理用のメモリアクセス命令が保留されてから、発行後に完了するまでの間、後続のメモリアクセス命令を、前記外部装置および前記デバイス内のプロセッサから受信しないよう制御する。
【発明の効果】
【００２１】
本発明は、拡張バスで接続された複数のプロセッサ間で同期処理を行う際に、性能を低下させることなく、同期処理に用いるメモリに対するメモリアクセスの順序を保証する技術を提供することができる。
【図面の簡単な説明】
【００２２】
【図１】本発明の第１の実施の形態としてのシステムの構成を示すブロック図である。
【図２】本発明の第１の実施の形態における同期処理ユニットの動作を説明するフローチャートである。
【図３】本発明の第２の実施の形態としてのシステムの構成を示すブロック図である。
【図４】本発明の第２の実施の形態における同期処理ユニットの動作を説明するフローチャートである。
【図５】本発明の第２の実施の形態としてのシステムの具体例の構成および第１の動作を説明する図である。
【図６】本発明の第２の実施の形態としてのシステムの具体例が第１の動作において実行するメモリアクセス命令の順序を模式的に説明する図である。
【図７】本発明の第２の実施の形態としてのシステムの具体例の構成および第２の動作を説明する図である。
【図８】本発明の第２の実施の形態としてのシステムの具体例が第２の動作において実行するメモリアクセス命令の順序を模式的に説明する図である。
【図９】本発明の第２の実施の形態としてのシステムの具体例の構成および第３の動作を説明する図である。
【図１０】本発明の第２の実施の形態としてのシステムの具体例が第３の動作において実行するメモリアクセス命令の順序を模式的に説明する図である。
【図１１】本発明の第２の実施の形態としてのシステムの具体例の構成および第４の動作を説明する図である。
【図１２】本発明の第２の実施の形態としてのシステムの具体例が第４の動作において実行するメモリアクセス命令の順序を模式的に説明する図である。
【図１３】本発明の第２の実施の形態の他の態様の構成を示す図である。
【図１４】関連技術の問題を説明する模式図である。
【発明を実施するための形態】
【００２３】
以下、本発明の実施の形態について、図面を参照して詳細に説明する。
【００２４】
（第１の実施の形態）
本発明の第１の実施の形態としてのシステム１の構成を図１に示す。図１において、システム１は、ホスト装置１０と、デバイス２０とを備える。ホスト装置１０およびデバイス２０間は、拡張バスインタフェース９１および９２間を結ぶ拡張バス９０により接続される。ホスト装置１０は、ＣＰＵ（Central Processing Unit）１１と、メモリ１３とを含む。ホスト装置１０は、本発明における外部装置の実施形態の一例を構成する。デバイス２０は、プロセッサ２１と、同期処理ユニット２２と、メモリ２３とを含む。同期処理ユニット２２は、命令判定部２２１と、完了判定部２２２と、発行部２２３と、後続制御部２２４とを有する。
【００２５】
ホスト装置１０のメモリ１３には、デバイス２０との間での同期処理を行うためのプログラムおよび各種データが少なくとも記憶されている。ＣＰＵ１１は、メモリ１３からプログラムおよび各種データを読みこんで実行することにより、デバイス２０との同期処理を行う。同期処理において、ＣＰＵ１１は、デバイス２０に対して、デバイス２０内のメモリ２３にアクセスするメモリアクセス命令を発行する。
【００２６】
デバイス２０のメモリ２３には、ホスト装置１０との間での同期処理を行うためのプログラムおよび各種データが少なくとも記憶されている。プロセッサ２１は、メモリ２３からプログラムおよび各種データを読みこんで実行することにより、ホスト装置１０との同期処理を実現する。同期処理において、プロセッサ２１は、メモリ２３にアクセスするメモリアクセス命令を発行する。
【００２７】
次に、同期処理ユニット２２の各機能ブロックについて説明する。
【００２８】
命令判定部２２１は、ホスト装置１０またはプロセッサ２１から、メモリ２３にアクセスするメモリアクセス命令を受信すると、受信したメモリアクセス命令が、同期処理を指示するための同期処理用の命令であるか否かを判定する。
【００２９】
完了判定部２２２は、メモリ２３に対して発行されたメモリアクセス命令が完了しているか否かを判定する。
【００３０】
発行部２２３は、同期処理用でないと判定されたメモリアクセス命令を、メモリ２３に対して発行する。また、発行部２２３は、同期処理用であると判定されたメモリアクセス命令を、先行のメモリアクセス命令が完了したと完了判定部２２２によって判定されるまで保留してからメモリ２３に対して発行する。先行のメモリアクセス命令とは、同期処理用であると判定されたメモリアクセス命令より前に受信され、メモリ２３に対して発行されたメモリアクセス命令である。
【００３１】
後続制御部２２４は、同期処理用のメモリアクセス命令が保留されてから、発行後に完了するまでの間、後続のメモリアクセス命令を受信しないよう制御する。具体的には、後続制御部２２４は、該当する期間、拡張バス９０およびプロセッサ２１に向けて、ビジーを示す制御情報を継続して送出することにより、後続のメモリアクセス命令を受信しないようにする。
【００３２】
以上のように構成されたシステム１の動作について、図２を参照して説明する。
【００３３】
まず、同期処理ユニット２２は、メモリ２３に対するメモリアクセス命令を受信する（ステップＳ１）。メモリアクセス命令は、ホスト装置１０またはプロセッサ２１から受信される。
【００３４】
次に、デバイス２０の同期処理ユニット２２において、命令判定部２２１は、受信したメモリアクセス命令が、同期処理用の命令であるか否かを判定する(ステップＳ２)。
【００３５】
命令判定部２２１において同期処理用でないと判定された場合、発行部２２３は、このメモリアクセス命令を、メモリ２３に対して発行する（ステップＳ３）。この場合、同期処理ユニット２２のこのメモリアクセス命令に関する動作は終了する。
【００３６】
また、命令判定部２２１において同期処理用であると判定された場合、完了判定部２２２は、同期処理用のメモリアクセス命令より前に受信された先行のメモリアクセス命令が完了しているか否かを判定する（ステップＳ４）。
【００３７】
完了判定部２２２において完了していると判定された場合、発行部２２３は、同期処理用のメモリアクセス命令を保留せずに発行する（ステップＳ３）。この場合、同期処理ユニット２２のこのメモリアクセス命令に関する動作は終了する。
【００３８】
一方、完了判定部２２２において完了していないと判定された場合、発行部２２３は、同期処理用のメモリアクセス命令の発行を保留する（ステップＳ５）。
【００３９】
また、後続制御部２２４は、後続のメモリアクセス命令を受信しないよう、拡張バス９０およびプロセッサ２１に向けて、制御情報を送出する（ステップＳ６）。
【００４０】
そして、完了判定部２２２は、先行のメモリアクセス命令が完了しているか否かの判定を行う（ステップＳ７）。先行のメモリアクセス命令が完了していなければ、完了判定部２２２は、このステップを繰り返す。
【００４１】
完了判定部２２２において完了していると判定された場合（ステップＳ７でＹｅｓ）、発行部２２３は、保留していた同期処理用のメモリアクセス命令を発行する（ステップＳ８）。
【００４２】
次に、後続制御部２２４は、ステップＳ８で発行した同期処理用のメモリアクセス命令が完了したか否かを判定する（ステップＳ９）。同期処理用のメモリアクセス命令が完了していなければ、後続制御部２２４は、このステップを繰り返す。
【００４３】
そして、同期処理用のメモリアクセス命令が完了すると（ステップＳ９でＹｅｓ）、後続制御部２２４は、後続のメモリアクセス命令を受信するよう、制御情報の送出を停止する（ステップＳ１０）。
【００４４】
以上で、システム１の動作の説明を終了する。
【００４５】
次に、本発明の第１の実施の形態の効果について述べる。
【００４６】
本発明の第１の実施の形態としてのシステムは、拡張バスで接続された複数のプロセッサ間で同期処理を行う際に、性能を低下させることなく、同期処理に用いるメモリに対するメモリアクセスの順序を保証することができる。
【００４７】
その理由について説明する。本実施の形態では、拡張バスで接続されたホスト装置およびデバイス間の同期処理を、デバイス内のメモリを用いて行う際に、デバイス内の同期処理ユニットが、次のように動作するよう構成される。すなわち、ホスト装置またはデバイス内のプロセッサからデバイス内のメモリにアクセスするメモリアクセス命令を受信すると、命令判定部が、そのメモリアクセス命令が同期処理用の命令であるか否かを判定する。また、完了判定部が、同期処理用であると判定されたメモリアクセス命令より前に受信された先行のメモリアクセス命令が完了しているか否かを判定する。そして、発行部が、同期処理用でないと判定されたメモリアクセス命令をメモリに対して発行する。また、発行部が、同期処理用であると判定されたメモリアクセス命令の発行を先行のメモリアクセス命令が完了したと判定されるまで保留してから発行する。そして、後続制御部が、同期処理用のメモリアクセス命令が保留されてから、発行後に完了するまでの間、後続のメモリアクセス命令を、外部装置およびデバイス内のプロセッサから受信しないよう制御するからである。
【００４８】
このような構成により、本実施の形態において、拡張バスで接続されたホスト装置からデバイスに対して発行された同期処理用のメモリアクセス命令は、デバイス内において先行する同期処理用でないメモリアクセス命令が完了してからメモリに対して発行される。このため、本実施の形態は、デバイス内のメモリに対する同期処理用でないメモリアクセス命令と、同期処理用のメモリアクセス命令との間で、発行される順序を保証することができる。
【００４９】
例えば、前述のＲｅｌｅａｓｅプロセスにおいて、ホスト装置が、同期処理用でないメモリアクセス命令を用いて、引き渡すデータをデバイスのメモリに書き込む。その後、ホスト装置が、そのデータの引き渡しを通知するフラグを、同期処理用のメモリアクセス命令を用いて、デバイスのメモリに書き込む。また、デバイス内のプロセッサが、同期処理用のメモリアクセス命令を用いて、メモリに対してフラグのポーリング（読み込み）を定期的に行う。本実施の形態では、これらの同期処理用でない書き込み命令、同期処理用の書き込み命令、同期処理用の読み込み命令の順序が、ホスト装置からデバイスに到達した後、デバイス内においてメモリに到達するまで保証されることになる。このように、本実施の形態は、拡張バスで接続されたホスト装置およびデバイス間の同期処理を、デバイス内のメモリを用いて、メモリアクセス命令の発行順序を保証して行うことができる。
【００５０】
（第２の実施の形態）
次に、本発明の第２の実施の形態について図面を参照して詳細に説明する。なお、本実施の形態の説明において参照する各図面において、本発明の第１の実施の形態と同一の構成および同様に動作するステップには同一の符号を付して本実施の形態における詳細な説明を省略する。
【００５１】
まず、本発明の第２の実施の形態としてのシステム２の構成を図３に示す。図３において、システム２は、拡張バス９０で接続されるホスト装置１０およびデバイス３０を含む。デバイス３０は、本発明の第１の実施の形態としてのデバイス２０に対して、同期処理ユニット２２に替えて同期処理ユニット３２を含む点が異なる。また、同期処理ユニット３２は、本発明の第２の実施の形態の同期処理ユニット２２に対して、命令判定部２２１に替えて命令判定部３２１と、完了判定部２２２に替えて完了判定部３２２と、後続制御部２２４に替えて後続制御部３２４とを有する点が異なる。
【００５２】
命令判定部３２１は、記憶領域３２６を有する。記憶領域３２６は、メモリ２３における同期処理用の領域を表す情報を記憶する。同期処理用の領域とは、メモリ２３において、メモリ２３に対する同期処理を指示する情報を格納することが定められた領域である。記憶領域３２６は、ホスト装置１０から、または、デバイス３０のプロセッサ２１から書き込み可能であるものとする。
【００５３】
また、命令判定部３２１は、受信したメモリアクセス命令の対象となるメモリ２３上の領域が、記憶領域３２６が表す同期処理用の領域に含まれるか否かに基づいて、メモリアクセス命令が同期処理用であるか否かを判定する。
【００５４】
完了判定部３２２は、カウンタ３２７を有する。そして、完了判定部３２２は、メモリ２３に対してメモリアクセス命令が発行されると、カウンタ３２７の値をインクリメントする。また、完了判定部３２２は、メモリアクセス命令の完了が通知されるとカウンタ３２７の値をデクリメントする。完了の通知とは、メモリアクセス命令がメモリライトであればライト完了の通知であり、メモリリードであればリードデータの受信である。
【００５５】
また、完了判定部３２２は、カウンタ３２７の値に基づいて、メモリ２３に対して発行されたメモリアクセス命令が完了しているか否かを判定する。具体的には、完了判定部３２２は、カウンタ３２７の値が０でなければ、完了していないメモリアクセス命令があると判定する。また、完了判定部３２２は、カウンタ３２７の値が０であれば、完了していないメモリアクセス命令はないと判定する。
【００５６】
後続制御部３２４は、本発明の第２の実施の形態における後続制御部３２４と同様に構成されることに加えて、同期処理用のメモリアクセス命令が保留された後に送出している制御情報の送出停止を、完了判定部３２２におけるカウンタ３２７の値に基づいて行う。具体的には、後続制御部３２４は、制御情報を送出後、カウンタ３２７の値をサイクル毎にチェックする。そして、カウンタ３２７の値が０になると、後続制御部３２４は、制御情報の送出を停止する。
【００５７】
ここで、制御情報が送出された後、先行のメモリアクセス命令が完了してカウンタ３２７の値が０になる動作と、保留されていた同期処理用のメモリアクセス命令が発行されてカウンタ３２７の値がインクリメントされる動作とは、同じサイクルで実行される。このため、後続制御部３２４によるサイクル毎のカウンタ３２７の値のチェック処理では、同期処理用のメモリアクセス命令が保留されてから、発行後に完了するまでは、カウンタ３２７の値は０とはならない。
【００５８】
以上のように構成されたシステム２の動作について、図４を参照して説明する。
【００５９】
まず、同期処理ユニット３２は、本発明の第１の実施の形態と同様に、デバイス３０内のメモリ２３に対するメモリアクセス命令を受信する（ステップＳ１）。
【００６０】
次に、デバイス３０の同期処理ユニット３２において、命令判定部３２１は、受信したメモリアクセス命令の対象となるメモリ２３の領域が、記憶領域３２６に記憶された情報の表す同期処理用の領域に含まれるか否かを判定する(ステップＳ１０２)。
【００６１】
次に、命令判定部３２１において、メモリアクセス命令の対象となるメモリ２３の領域が同期処理用の領域に含まれないと判定された場合について説明する。この場合、発行部２２３は、このメモリアクセス命令を、メモリ２３に対して発行する（ステップＳ３）。
【００６２】
次に、完了判定部３２２は、メモリアクセス命令が発行されたので、カウンタ３２７の値をインクリメントする（ステップＳ１０３）。
【００６３】
一方、命令判定部３２１において、メモリアクセス命令の対象となるメモリ２３の領域が同期処理用の領域に含まれると判定された場合について説明する。この場合、完了判定部３２２は、カウンタ３２７の値が０であるか否かを判定する（ステップＳ１０４）。
【００６４】
なお、前述のように、カウンタ３２７は、メモリアクセス命令の発行に応じて値をインクリメントし、完了の通知に応じて値をデクリメントするよう構成されている。カウンタ３２７の値が０であれば先行のメモリアクセス命令は完了している。カウンタ３２７の値が０でなければ、先行のメモリアクセス命令は完了していない。
【００６５】
ここで、カウンタ３２７の値が０であると判定された場合について説明する。この場合、発行部２２３は、同期処理用のメモリアクセス命令を保留せずに発行する（ステップＳ３）。
【００６６】
次に、完了判定部３２２は、メモリアクセス命令が発行されたので、カウンタ３２７の値をインクリメントする（ステップＳ１０３）。
【００６７】
一方、完了判定部３２２において、カウンタ３２７の値が０でないと判定された場合について説明する。この場合、発行部２２３は、同期処理用のメモリアクセス命令の発行を保留する（ステップＳ５）。
【００６８】
また、後続制御部３２４は、後続のメモリアクセス命令を受信しないよう、拡張バス９０およびプロセッサ２１に向けて、制御情報を送出する（ステップＳ６）。この後、後続制御部３２４は、カウンタ３２７の値のチェックをサイクル毎に行う。
【００６９】
また、完了判定部３２２は、メモリアクセス命令の完了が通知されると、カウンタ３２７の値をデクリメントするとともに、その値が０になったか否かを判定する（ステップＳ１０７）。カウンタ３２７の値が０になっていない場合、完了判定部３２２は、このステップを繰り返す。
【００７０】
ここで、完了判定部３２２において、カウンタ３２７が０になったことが検出された場合について説明する（ステップＳ１０７でＹｅｓ）。
【００７１】
この場合、発行部２２３は、保留していた同期処理用のメモリアクセス命令を発行する（ステップＳ８）。
【００７２】
次に、完了判定部３２２は、同期処理用のメモリアクセス命令が発行されたので、カウンタ３２７の値をインクリメントする（ステップＳ１０８）。
【００７３】
ここでは、前述のように、先行のメモリアクセス命令の完了によりカウンタ３２７の値が０になる動作と、同期処理用のメモリアクセス命令が発行されてカウンタ３２７の値がインクリメントされる動作とが、同じサイクルで行われる。このため、後続制御部３２４によるサイクル毎のカウンタ３２７の値のチェックでは、カウンタ３２７の値は０となっていない。
【００７４】
次に、後続制御部３２４によって、カウンタ３２７の値が０になったことが検出された場合について説明する（ステップＳ１０９でＹｅｓ）。この場合、保留後に発行された同期処理用のメモリアクセス命令が完了したことになる。
【００７５】
そこで、後続制御部３２４は、制御情報の送出を停止する（ステップＳ１０）。
【００７６】
以上で、システム２の動作の説明を終了する。
【００７７】
次に、システム２の構成および動作の具体例を、図５〜図８を用いて説明する。
【００７８】
＜具体例の構成＞
まず、システム２の具体例の構成を、図５を用いて説明する。図５において、ホスト装置１０およびデバイス３０は、ＰＣＩｅ規格に基づく拡張バス９０により接続されている。この例では、デバイス３０は、ＰＣＩｅにおけるエンドポイントである。
【００７９】
具体的には、ホスト装置１０は、ＣＰＵ１１と、メモリ１３とに加えて、ＰＣＩｅのルート・コンプレックス９０１を有する。ルート・コンプレックス９０１においてＰＣＩｅの物理層の処理を行う要素であるＰＨＹ９０２は、リンク９０６を介して、ＰＨＹ９０３に接続される。ＰＨＹ９０３は、デバイス３０においてＰＣＩｅの物理層の処理を行う要素である。
【００８０】
また、デバイス３０は、プロセッサ２１と、メモリ２３と、同期処理ユニット３２とに加えて、ＰＣＩｅ規格に基づく拡張バス９０に接続するため、ＰＨＹ９０３と、ＤＬＬ９０４と、ＴＬ９０５とを有する。ＰＨＹ９０３は、前述のように、デバイス３０においてＰＣＩｅの物理層の処理を行う要素である。また、ＤＬＬ９０４は、デバイス３０においてＰＣＩｅのデータ・リンク層の処理を行う要素である。また、ＴＬ９０５は、デバイス３０においてＰＣＩｅのトランザクション層の処理を行う要素である。デバイス３０において、同期処理ユニット３２は、ＴＬ９０５、ＤＬＬ９０４、ＰＨＹ９０３を介して、リンク９０６に接続される。また、この具体例では、メモリ２３は、ＲＡＭ（Random Access Memory）やレジスタによって構成される。
【００８１】
なお、ＰＨＹ９０２の入出力から同期処理ユニット３２の入出力までのＰＣＩｅトランザクションのオーダリングは、ＰＣＩｅの仕様およびその実装に従うものとする。
【００８２】
また、図５において、同期処理ユニット３２は、記憶領域３２６として、第１記憶領域および第２記憶領域を有する。メモリ２３におけるアドレスが６４ビットで表される場合、第１記憶領域および第２記憶領域もそれぞれ６４ビットとなる。例えば、第１記憶領域には、メモリ２３において同期処理用に定められた領域の起点となるアドレスが、第１領域情報としてあらかじめ記憶される。また、第２記憶領域には、メモリアクセス命令の対象となるアドレスが第１領域情報を起点とする領域に含まれるか否かを判定するための情報が、第２領域情報としてあらかじめ記憶される。例えば、メモリ２３において同期処理用に定められた領域が連続した領域であれば、第２領域情報の上位の適切な範囲のビットに１が設定され、それ以外の下位部分に０が設定されてもよい。また、メモリ２３において同期処理用に定められた領域が規則的に離散した領域であれば、第２領域情報の下位の適切な範囲のビットに１が設定され、それ以外の上位部分に０が設定されてもよい。
【００８３】
この場合、命令判定部３２１は、次式（Ｉ）が成立するか否かに基づいて、受信したメモリアクセス命令の対象となる領域が同期処理用の領域であるか否かを判定可能である。
「対象アドレス［０：６３］＆第１領域情報［０：６３］＝＝第２領域情報［０：６３］」・・・（Ｉ）
ここで、式（Ｉ）において、“＆”は、論理積を表し、“＝＝”は、両辺が同等である場合に真となる比較演算子を表す。
【００８４】
なお、第１記憶領域および第２記憶領域は、ホスト装置１０のＣＰＵ１１、ルート・コンプレックス９０１またはデバイス３０のプロセッサ２１によってアクセス可能であるものとする。第１記憶領域および第２記憶領域には、これらのいずれかからのアクセスによって事前に第１領域情報および第２領域情報が記憶されている。
【００８５】
また、図５において、同期処理ユニット３２は、カウンタ３２７として、第１カウンタおよび第２カウンタを有する。第１カウンタは、メモリ２３に対してメモリライト命令が発行されると値がインクリメントされ、メモリライト命令の完了が通知されると値がデクリメントされる。また、第２カウンタは、メモリ２３に対してメモリリード命令が発行されると値がインクリメントされ、リードデータが返却されると値がデクリメントされる。
【００８６】
後続制御部３２４は、同期処理用アドレスへのメモリアクセス命令が保留されると、ビジー信号をＴＬ９０５およびプロセッサ２１に対してアサートする。また、後続制御部３２４は、その後、第１カウンタおよび第２カウンタの値をサイクル毎にチェックする。そして、後続制御部３２４は、第１カウンタおよび第２カウンタの値が共に０になると、ビジー信号をデアサートする。
【００８７】
発行部２２３は、命令判定部３２１で同期処理用アドレスへのメモリアクセスでないと判定されたメモリアクセス命令を、メモリ２３に対して発行する。
【００８８】
また、発行部２２３は、第１カウンタおよび第２カウンタのいずれかが０でない場合、命令判定部３２１で同期処理用であると判定されたメモリアクセス命令を発行せずに保留する。
【００８９】
また、発行部２２３は、メモリアクセス命令の完了が通知されたタイミングで第１カウンタおよび第２カウンタのいずれもが０となった場合、保留中の同期処理用のメモリアクセス命令を発行する。
【００９０】
このような構成において、動作の具体例１〜具体例４について説明する。
【００９１】
＜動作の具体例１＞
動作の具体例１を、図５を用いて説明する。図５では、ホスト装置１０からデバイス３０のメモリ２３に対して、ライト命令ｗ１、ライト命令ｗ２、同期処理用のリード命令ｓｙｎｃ＿ｒ３、ライト命令ｗ４の４つのＰＣＩｅトランザクションが発行されることを想定する。４つのＰＣＩｅトランザクションはこの順に発行され、発行された順に同期処理ユニット３２に到着するものとする。また、ライト命令ｗ１、ライト命令ｗ２およびライト命令ｗ４は、同期処理用でないアドレスへの命令であるものとする。また、同期処理用のリード命令ｓｙｎｃ＿ｒ３は、同期処理用のアドレスへの命令であるものとする。また、以下の具体例の説明では、動作の開始時には、第１カウンタおよび第２カウンタの値が０であるものとする。
【００９２】
（１）まず、同期処理ユニット３２は、ライト命令ｗ１をＴＬ９０５から受信すると、ライト命令ｗ１の対象となるアドレスを命令判定部３２１に入力して、同期処理用のアドレスであるか否かを判定する。
【００９３】
（２）ここでは、同期処理用のアドレスでないことが判定される。そこで、同期処理ユニット３２は、第１カウンタを１つインクリメントし、ライト命令ｗ１を発行部２２３からメモリ２３に対して発行する。第１カウンタの値は１となり、第２カウンタの値は０である。
【００９４】
（３）次に、同期処理ユニット３２は、ライト命令ｗ２をＴＬ９０５から受信すると、ライト命令ｗ２の対象となるアドレスを命令判定部３２１に入力して、同期処理用のアドレスであるか否かを判定する。
【００９５】
（４）ここでは、同期処理用のアドレスでないことが判定される。そこで、同期処理ユニット３２は、第１カウンタを１つインクリメントし、ライト命令ｗ２を発行部２２３からメモリ２３に対して発行する。第１カウンタの値は２となり、第２カウンタの値は０である。
【００９６】
（５）次に、同期処理ユニット３２は、メモリ２３から、ライト命令ｗ１に対応したライト完了通知ｃ１を受信する。そこで、同期処理ユニット３２は、第１カウンタを１つデクリメントする。第１カウンタの値は１となり、第２カウンタの値は０である。
【００９７】
（６）次に、同期処理ユニット３２は、同期処理用のリード命令ｓｙｎｃ＿ｒ３をＴＬ９０５から受信すると、リード命令ｓｙｎｃ＿ｒ３の対象となるアドレスを命令判定部３２１に入力して、同期処理用のアドレスであるか否かを判定する。
【００９８】
ここでは、同期処理用のアドレスであることが判定される。そこで、同期処理ユニット３２は、完了判定部３２２において第１カウンタおよび第２カウンタの値を確認する。ここでは、第１カウンタの値が１である。つまり、先行するライト命令ｗ２による書き込みが完了していない。そこで、同期処理ユニット３２は、同期処理用のリード命令ｓｙｎｃ＿ｒ３を発行部２２３に留める。
【００９９】
（７）そして、同期処理ユニット３２は、後続制御部３２４により、ビジー信号ｂｕｓｙをＴＬ９０５およびプロセッサ２１に対してアサートする。ビジー信号ｂｕｓｙのアサートによって、後続のライト命令ｗ４はＰＨＹ９０２からＴＬ９０５の間に滞留する。
【０１００】
以後、後続制御部３２４による第１カウンタおよび第２カウンタのチェックは、毎サイクル行われる。そして、第１カウンタおよび第２カウンタの少なくともいずれかが０でない間、ビジー信号ｂｕｓｙのアサートは継続する。
【０１０１】
（８）次に、同期処理ユニット３２は、ライト命令ｗ２に対応したライト完了通知ｃ２を受信すると、第１カウンタを１デクリメントする。第１カウンタの値は０となり、第２カウンタの値は０である。このように、第１カウンタのデクリメントによって、第１カウンタおよび第２カウンタの値が０となった。つまり、先行するライト命令ｗ２による書き込みが完了した。
【０１０２】
（９）そこで、同期処理ユニット３２は、発行部２２３に留めていた同期処理用のリード命令ｓｙｎｃ＿ｒ３を、発行部２２３からメモリ２３に対して発行する。また、同期処理ユニット３２は、第２カウンタを１インクリメントする。第１カウンタの値は０であり、第２カウンタの値は１となる。
【０１０３】
ここで、（８）および（９）の動作は同じサイクルで行われる。したがって、第１カウンタおよび第２カウンタのサイクル毎のチェックでは、第１カウンタおよび第２カウンタの値のいずれかが０ではない。
【０１０４】
（１０）次に、同期処理ユニット３２は、同期処理用のリード命令ｓｙｎｃ＿ｒ３に対応するリードデータｄ３を受信する。
【０１０５】
（１１）そして、同期処理ユニット３２は、リードデータｄ３をＴＬ９０５に送信する。また、同期処理ユニット３２は、第２カウンタを１デクリメントする。これにより、第１カウンタおよび第２カウンタの値は、サイクル毎のチェックにおいて、共に０になったことが検出される。つまり、同期処理用アドレスへのリード命令ｓｙｎｃ＿ｒ３が完了した。
【０１０６】
（１２）そこで、同期処理ユニット３２は、後続制御部３２４からのビジー信号ｂｕｓｙをデアサートする。ビジー信号ｂｕｓｙのデアサートによって、ＰＨＹ９０２からＴＬ９０５の間に滞留していたライト命令ｗ４が、ＴＬ９０５から同期処理ユニット３２に受信される。
【０１０７】
以上の動作により、同期処理用アドレスへのリード命令ｓｙｎｃ＿ｒ３の前に受信したライト命令ｗ１、ｗ２がメモリ２３に反映された後に、同期処理用アドレスへのリード命令ｓｙｎｃ＿ｒ３が行われる。そして、その後、ライト命令ｗ４がメモリ２３に反映されることが保証される。
【０１０８】
この動作により同期処理用でないメモリアクセス命令と、同期処理用のメモリアクセス命令との間で、発行順序が保証されることを、模式的に図６に示す。図６において、同期処理用のリード命令ｓｙｎｃ＿ｒ３に先行するライト命令ｗ１、ｗ２は、同期処理用のリード命令ｓｙｎｃ＿ｒ３が保留される期間Ｔ１が設けられることにより、同期処理用のリード命令ｓｙｎｃ＿ｒ３が発行される前に完了する。また、同期処理用のリード命令ｓｙｎｃ＿ｒ３の後続のライト命令ｗ４は、ビジー信号がアサートされる期間Ｔ２が設けられることにより、同期処理用のリード命令ｓｙｎｃ＿ｒ３が完了してから受信され、発行される。
【０１０９】
なお、この動作の具体例１では、ライト命令ｗ１、ｗ２、同期処理用アドレスへのリード命令ｓｙｎｃ＿ｒ３、ライト命令ｗ４の順序が、ＰＨＹ９０２から同期処理ユニット３２までの間で変わらないことが保証されているものとする。例えば、ライト命令ｗ１、ライト命令ｗ２が、ｐｏｓｔｅｄ  ｒｅｑｕｅｓｔであるとする。また、同期処理用アドレスへのリード命令ｓｙｎｃ＿ｒ３が、ｎｏｎ  ｐｏｓｔｅｄ  ｒｅａｄ  ｒｅｑｕｅｓｔであるとする。また、ライト命令ｗ４がｎｏｎ  ｐｏｓｔｅｄ  ｒｅｑｕｅｓｔ  ｗｉｔｈ  ｄａｔａであるとする。この場合、ＰＣＩｅの実装上の選択として、ｎｏｎ  ｐｏｓｔｅｄ  ｒｅｑｕｅｓｔ  ｗｉｔｈ  ｄａｔａがｎｏｎ  ｐｏｓｔｅｄ  ｒｅａｄ  ｒｅｑｕｅｓｔを追い越さない選択がされていることが前提である。
【０１１０】
＜動作の具体例２＞
動作の具体例２を、図７を用いて説明する。この具体例２は、上述した具体例１に対して、同期処理用のリード命令ｓｙｎｃ＿ｒ３およびライト命令ｗ４が、ホスト装置１０からではなくデバイス３０のプロセッサ２１から発行される点が異なる。
【０１１１】
図７では、ホスト装置１０からデバイス３０のメモリ２３に対して、ライト命令ｗ１、ライト命令ｗ２の２つのＰＣＩｅトランザクションが発行されることを想定する。２つのＰＣＩｅトランザクションはこの順に発行され、発行された順に同期処理ユニット３２に到着するものとする。また、デバイス３０のプロセッサ２１からデバイス３０のメモリ２３に対して、同期処理用のリード命令ｓｙｎｃ＿ｒ３と、ライト命令ｗ４とが、この順に発行されることを想定する。また、この同期処理用のリード命令ｓｙｎｃ＿ｒ３は、ホスト装置１０からのライト命令ｗ２の次に、同期処理ユニット３２に到着するものとする。また、ライト命令ｗ１、ライト命令ｗ２およびライト命令ｗ４は、同期処理用でないアドレスへの命令であるものとする。また、同期処理用のリード命令ｓｙｎｃ＿ｒ３は、同期処理用のアドレスへの命令であるものとする。また、具体例１と同様に、動作の開始時には、第１カウンタおよび第２カウンタの値が０であるものとする。
【０１１２】
この場合、同期処理ユニット３２は、上述した具体例１に対して、（６）、（７）、（１１）、（１２）の代わりに以下の（６’）、（７’）、（１１’）、（１２’）のように動作する点が異なる。
【０１１３】
（６’）ここでは、同期処理ユニット３２は、同期処理用のリード命令ｓｙｎｃ＿ｒ３を、デバイス３０のプロセッサ２１から受信する。以降の動作は、具体例１における（６）と同様である。
【０１１４】
（７’）ここでは、同期処理ユニット３２は、後続制御部３２４により、ビジー信号ｂｕｓｙをＴＬ９０５およびプロセッサ２１に対してアサートする。ビジー信号ｂｕｓｙのアサートによって、後続のライト命令ｗ４は、同期処理ユニット３２およびプロセッサ２１の間に滞留する。
【０１１５】
（１１’）ここでは、同期処理ユニット３２は、リードデータｄ３を、デバイス３０のプロセッサ２１に送信する。以降の動作は、具体例１における（１１）と同様である。
【０１１６】
（１２’）ここでは、同期処理ユニット３２は、後続制御部３２４からのビジー信号ｂｕｓｙをデアサートする。ビジー信号ｂｕｓｙのデアサートによって、同期処理ユニット３２およびプロセッサ２１の間に滞留していたライト命令ｗ４が、同期処理ユニット３２に受信される。
【０１１７】
以上の動作により、デバイス３０のプロセッサ２１から受信された同期処理用アドレスへのリード命令ｓｙｎｃ＿ｒ３は、その前にホスト装置１０から受信されたライト命令ｗ１、ｗ２がメモリ２３に反映された後に、メモリ２３に発行される。そして、その後、プロセッサ２１からのライト命令ｗ４がメモリ２３に反映されることが保証される。
【０１１８】
この動作により、ホスト装置１０およびデバイス３０のプロセッサ２１からの同期処理用でないメモリアクセス命令と、プロセッサ２１からの同期処理用のメモリアクセス命令との間で発行順序が保証されることを、模式的に図８に示す。プロセッサ２１からの同期処理用のリード命令ｓｙｎｃ＿ｒ３に先行するホスト装置１０からのライト命令ｗ１、ｗ２は、同期処理用のリード命令ｓｙｎｃ＿ｒ３の保留期間Ｔ１’が設けられることにより、リード命令ｓｙｎｃ＿ｒ３の発行前に完了する。また、プロセッサ２１からの同期処理用のリード命令ｓｙｎｃ＿ｒ３の後続のライト命令ｗ４は、ビジー信号がアサートされる期間Ｔ２’が設けられることにより、同期処理用のリード命令ｓｙｎｃ＿ｒ３が完了してから受信され、発行される。
【０１１９】
このように、デバイス３０内のメモリ２３に対するホスト装置１０およびデバイス３０のプロセッサ２１からのメモリアクセス命令の順序保障は、デバイス３０のプロセッサ２１からの同期処理用のメモリアクセス命令で実現される。
【０１２０】
例えば、ホスト装置１０から発行されるライト命令ｗ１、ライト命令ｗ２のうち、ライト命令ｗ２によって、ｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルのｒｅｌｅａｓｅプロセスによるフラグ書き込みがメモリ２３上に行われる状況を考える。この場合、デバイス３０のプロセッサ２１は、同期処理用のリード命令ｓｙｎｃ＿ｒ３によってこのフラグを繰り返し読み込み、フラグが成立するときに、ホスト装置１０からのライト命令ｗ１によりメモリ２３に書きこまれたデータを有効と判断して処理を進める。
【０１２１】
これにより、フラグ成立時のリード命令ｓｙｎｃ＿ｒ３より前に、ライト命令ｗ２が同期処理ユニット３２に到達することが保証される。さらには、同期処理用のリード命令ｓｙｎｃ＿ｒ３、ライト命令ｗ２およびｗ１の順序関係から、フラグ成立時の同期処理用のリード命令ｓｙｎｃ＿ｒ３より前に、ライト命令ｗ１が同期処理ユニット３２に到達していることが保証される。したがって、フラグ成立時のリード命令ｓｙｎｃ＿ｒ３より前に、ライト命令ｗ１によりメモリ２３にデータが書き込まれることが保証される。
【０１２２】
このように、具体例２において、ライト命令ｗ２を、ホスト装置１０によるｒｅｌｅａｓｅ側のフラグを書き込むライトとして適用する。また、同期処理用のリード命令ｓｙｎｃ＿ｒ３を、デバイス３０のプロセッサ２１によるａｃｑｕｉｒｅ側のフラグを読み込むリードとして適用する。これにより、上述したように、本実施の形態がｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルを実現できることが、具体例２により説明される。
【０１２３】
なお、具体例２の実施時には、デバイス３０のプロセッサ２１は、フラグ成立まで同期処理用のリード命令ｓｙｎｃ＿ｒ３を発行（ポーリング）し、ポーリング結果に応じて、例えばリード命令ｒ５を発行することで、ａｑｕｉｒｅ側として動作することになる。この場合、リード命令ｒ５は、少なくともリード命令ｓｙｎｃ＿ｒ３の後に発行される。
【０１２４】
＜動作の具体例３＞
動作の具体例３を、図９を用いて説明する。図９では、ホスト装置１０からデバイス３０のメモリ２３に対して、ライト命令ｗ５、ライト命令ｗ６、同期処理用のライト命令ｓｙｎｃ＿ｗ７、ライト命令ｗ８の４つのＰＣＩｅトランザクションが発行されることを想定する。４つのＰＣＩｅトランザクションはこの順に発行され、発行された順に同期処理ユニット３２に到着するものとする。また、ライト命令ｗ５、ライト命令ｗ６およびライト命令ｗ８は、同期処理用でないアドレスへの命令であるものとする。また、同期処理用のライト命令ｓｙｎｃ＿ｗ７は、同期処理用のアドレスへの命令であるものとする。また、以下の具体例の説明では、動作の開始時には、第１カウンタおよび第２カウンタの値が０であるものとする。
【０１２５】
（１３）まず、同期処理ユニット３２は、ライト命令ｗ５をＴＬ９０５から受信すると、ライト命令ｗ５の対象となるアドレスを命令判定部３２１に入力して、同期処理用アドレスか否かを判定する。
【０１２６】
（１４）ここでは、同期処理用アドレスではないことが判定される。そこで、同期処理用ユニット３２は、第１カウンタを１インクリメントし、ライト命令ｗ５を発行部２２３からメモリ２３に対して発行する。第１カウンタの値は１となり、第２カウンタの値は０である。
【０１２７】
（１５）次に、同期処理ユニット３２は、ライト命令ｗ６をＴＬ９０５から受信すると、ライト命令ｗ６の対象となるアドレスを命令判定部３２１に入力して、同期処理用アドレスか否かを判定する。
【０１２８】
（１６）ここでは、同期処理用アドレスではないことが判定される。そこで、同期処理用ユニット３２は、第１カウンタを１インクリメントし、ライト命令ｗ６を発行部２２３からメモリ２３に対して発行する。第１カウンタの値は２となり、第２カウンタの値は０である。
【０１２９】
（１７）次に、同期処理ユニット３２は、同期処理用のライト命令ｓｙｎｃ＿ｗ７をＴＬ９０５から受信すると、ライト命令ｓｙｎｃ＿ｗ７の対象となるアドレスを命令判定部３２１に入力して、同期処理用アドレスか否かを判定する。
【０１３０】
ここでは、同期処理用アドレスであることが判定される。そこで、同期処理用ユニット３２は、完了判定部３２２において第１カウンタおよび第２カウンタの値を確認する。ここでは、第１カウンタの値が２である。つまり、先行するライト命令ｗ５、ｗ６による書き込みが完了していない。そこで、同期処理ユニット３２は、同期処理用のライト命令ｓｙｎｃ＿ｗ７を発行部２２３に留める。
【０１３１】
（１８）そして、同期処理ユニット３２は、後続制御部３２４により、ビジー信号ｂｕｓｙをＴＬ９０５およびプロセッサ２１に対してアサートする。ビジー信号ｂｕｓｙのアサートによって、後続のライト命令ｗ８はＰＨＹ９０２からＴＬ９０５の間に滞留する。
【０１３２】
以後、後続制御部３２４による第１カウンタおよび第２カウンタのチェックは、毎サイクル行われる。そして、第１カウンタおよび第２カウンタの少なくともいずれかが０でない間、ビジー信号ｂｕｓｙのアサートは継続する。
【０１３３】
（１９）次に、同期処理ユニット３２は、ライト命令ｗ５に対応したライト完了通知ｃ５を受信すると、第１カウンタを１デクリメントする。第１カウンタの値は１となり、第２カウンタの値は０である。
【０１３４】
（２０）次に、同期処理ユニット３２は、ライト命令ｗ６に対応したライト完了通知ｃ６を受信すると、第１カウンタを１デクリメントする。第１カウンタの値は０となり、第２カウンタの値は０である。このように、第１カウンタのデクリメントによって、第１カウンタおよび第２カウンタの値が０となった。つまり、先行するライト命令ｗ５およびライト命令ｗ６による書き込みが完了した。
【０１３５】
（２１）そこで、同期処理ユニット３２は、発行部２２３に留めていた同期処理用のライト命令ｓｙｎｃ＿ｗ７を、発行部２２３からメモリ２３に対して発行する。また、同期処理ユニット３２は、第１カウンタを１インクリメントする。
【０１３６】
ここで、（２０）および（２１）の動作は同じサイクルで行われる。したがって、第１カウンタおよび第２カウンタのサイクル毎のチェックでは、第１カウンタの値は、デクリメントとインクリメントとで相殺され０とはならない。
【０１３７】
（２２）次に、同期処理ユニット３２は、同期処理用のライト命令ｓｙｎｃ＿ｗ７に対応するライト完了通知ｃ７を受信する。そして、同期処理ユニット３２は、第１カウンタを１つデクリメントする。これにより、第１カウンタおよび第２カウンタの値は、サイクル毎のチェックにおいて、共に０になったことが検出される。つまり、同期処理用のライト命令ｓｙｎｃ＿ｗ７による書き込みが完了した。
【０１３８】
（２３）そこで、同期処理ユニット３２は、後続制御部３２４からのビジー信号ｂｕｓｙをデアサートする。ビジー信号ｂｕｓｙのデアサートによって、ＰＨＹ９０２からＴＬ９０５の間に滞留していたライト命令ｗ８が、ＴＬ９０５から同期処理ユニット３２に受信される。
【０１３９】
以上の動作により、同期処理用アドレスへのライト命令ｓｙｎｃ＿ｗ７の前に受信したライト命令ｗ５、ｗ６がメモリ２３に反映された後に、同期処理用アドレスへのライト命令ｓｙｎｃ＿ｗ７がメモリ２３に反映される。そして、その後、ライト命令ｗ８がメモリ２３に反映されることが保証される。
【０１４０】
この動作により、同期処理用でないメモリアクセス命令と、同期処理用のメモリアクセス命令との間で発行順序が保証されることを、模式的に図１０に示す。図１０において、同期処理用のライト命令ｓｙｎｃ＿ｗ７に先行するライト命令ｗ５、ｗ６は、同期処理用のライト命令ｓｙｎｃ＿ｗ７が保留される期間Ｔ３が設けられることにより、同期処理用のライト命令ｓｙｎｃ＿ｗ７が発行される前に完了する。また、同期処理用のライト命令ｓｙｎｃ＿ｗ７の後続のライト命令ｗ８は、ビジー信号がアサートされる期間Ｔ４が設けられることにより、同期処理用のライト命令ｓｙｎｃ＿ｗ７が完了してから受信される。
【０１４１】
なお、この動作の具体例３でも、ライト命令ｗ５、ｗ６、同期処理用アドレスへのライト命令ｓｙｎｃ＿ｗ７、ライト命令ｗ８の順序が、ＰＨＹ９０２から同期処理ユニット３２までの間で変わらないことが保証されているものとする。例えば、これらのライト命令ｗ５、ｗ６、ｓｙｎｃ＿ｗ７、ｗ８がそれぞれｐｏｓｔｅｄ  ｒｅｑｕｅｓｔであるとする。この場合、ＰＣＩｅの実装上の選択として、ｐｏｓｔｅｄ  ｒｅｑｕｅｓｔがｐｏｓｔｅｄ  ｒｅｑｕｅｓｔを追い越さない選択がされていることが前提である。
【０１４２】
＜動作の具体例４＞
動作の具体例４を、図１１を用いて説明する。この具体例４では、同期処理用のライト命令が、ホスト装置１０からではなくデバイス３０のプロセッサ２１から発行される例について説明する。
【０１４３】
図１１では、ホスト装置１０からデバイス３０のメモリ２３に対して、ライト命令ｗ９、ライト命令ｗ１０の２つのＰＣＩｅトランザクションが発行されることを想定する。２つのＰＣＩｅトランザクションはこの順に発行され、発行された順に同期処理ユニット３２に到着するものとする。また、デバイス３０のプロセッサ２１からデバイス３０のメモリ２３に対して、リード命令ｒ１１と、同期処理用のライト命令ｓｙｎｃ＿ｗ１２と、リード命令ｒ１３とが、この順に発行されることを想定する。また、リード命令ｒ１１は、ホスト装置１０からのライト命令ｗ１０の次に、同期処理ユニット３２に到着するものとする。また、同期処理用のライト命令ｓｙｎｃ＿ｗ１２は、リード命令ｒ１１に対応するリードデータｄ１１が所定の値であった場合に発行されるものとする。また、ライト命令ｗ９、ライト命令ｗ１０、リード命令ｒ１１およびリード命令ｒ１３は、同期処理用でないアドレスへの命令であるものとする。また、同期処理用のライト命令ｓｙｎｃ＿ｗ１２は、同期処理用のアドレスへの命令であるものとする。また、動作の開始時には、第１カウンタおよび第２カウンタの値が０であるものとする。
【０１４４】
（２４）まず、同期処理ユニット３２は、ライト命令ｗ９をＴＬ９０５から受信すると、ライト命令ｗ９の対象となるアドレスを命令判定部３２１に入力して、同期処理用アドレスか否かを判定する。
【０１４５】
（２５）ここでは、同期処理用アドレスではないことが判定される。そこで、同期処理用ユニット３２は、第１カウンタを１インクリメントし、ライト命令ｗ９を発行部２２３からメモリ２３に対して発行する。第１カウンタの値は１となり、第２カウンタの値は０である。
【０１４６】
（２６）次に、同期処理ユニット３２は、ライト命令ｗ１０をＴＬ９０５から受信すると、ライト命令ｗ１０の対象となるアドレスを命令判定部３２１に入力して、同期処理用アドレスか否かを判定する。
【０１４７】
（２７）ここでは、同期処理用アドレスではないことが判定される。そこで、同期処理用ユニット３２は、第１カウンタを１インクリメントし、ライト命令ｗ１０を発行部２２３からメモリ２３に対して発行する。第１カウンタの値は２となり、第２カウンタの値は０である。
【０１４８】
（２８）次に、同期処理ユニット３２は、リード命令ｒ１１をデバイス３０のプロセッサ２１から受信すると、リード命令ｒ１１の対象となるアドレスを命令判定部３２１に入力して、同期処理用アドレスか否かを判定する。
【０１４９】
（２９）ここでは、同期処理用アドレスではないことが判定される。そこで、同期処理ユニット３２は、第２カウンタを１インクリメントし、リード命令ｒ１１を発行部２２３からメモリ２３に対して発行する。第１カウンタの値は２のままであり、第２カウンタの値は１となる。
【０１５０】
（３０）次に、同期処理ユニット３２は、リード命令ｒ１１に対応するリードデータｄ１１を受信する。
【０１５１】
（３１）そして、同期処理ユニット３２は、リードデータｄ１１をデバイス３０のプロセッサ２１に送信する。そして、同期処理ユニット３２は、第２カウンタを１デクリメントする。これにより、第１カウンタの値は２のままであり、第２カウンタの値は０となる。
【０１５２】
（３２）次に、プロセッサ２１は、リードデータｄ１１が所定の値であった場合に、同期処理用のライト命令ｓｙｎｃ＿ｗ１２を発行する。そして、同期処理ユニット３２は、同期処理用のライト命令ｓｙｎｃ＿ｗ１２をデバイス３０のプロセッサ２１から受信すると、その対象となるアドレスを命令判定部３２１に入力して、同期処理用アドレスか否かを判定する。
【０１５３】
ここでは、同期処理用アドレスであることが判定される。そこで、同期処理用ユニット３２は、完了判定部３２２において第１カウンタおよび第２カウンタの値を確認する。ここでは、第１カウンタの値が２であり、第２カウンタの値が０である。つまり、先行するライト命令ｗ９、ｗ１０による書き込みが完了していない。そこで、同期処理ユニット３２は、同期処理用のライト命令ｓｙｎｃ＿ｗ１２を発行部２２３に留める。
【０１５４】
（３３）そして、同期処理ユニット３２は、後続制御部３２４により、ビジー信号ｂｕｓｙをＴＬ９０５およびプロセッサ２１に対してアサートする。ビジー信号ｂｕｓｙのアサートによって、後続のリード命令ｒ１３は、同期処理ユニット３２およびプロセッサ２１の間に滞留する。
【０１５５】
以後、後続制御部３２４による第１カウンタおよび第２カウンタのチェックは、毎サイクル行われる。そして、第１カウンタおよび第２カウンタの少なくともいずれかが０でない間、ビジー信号ｂｕｓｙのアサートは継続する。
【０１５６】
（３４）次に、同期処理ユニット３２は、ライト命令ｗ１０に対応したライト完了通知ｃ１０を受信すると、第１カウンタを１デクリメントする。第１カウンタの値は１となり、第２カウンタの値は０である。
【０１５７】
（３５）次に、同期処理ユニット３２は、ライト命令ｗ９に対応したライト完了通知ｃ９を受信すると、第１カウンタを１デクリメントする。第１カウンタの値は０となり、第２カウンタの値は０である。このように、第１カウンタのデクリメントによって、第１カウンタおよび第２カウンタの値が０となった。つまり、先行するライト命令ｗ９およびライト命令ｗ１０による書き込みが完了した。
【０１５８】
（３６）そこで、同期処理ユニット３２は、発行部２２３に留めていた同期処理用のライト命令ｓｙｎｃ＿ｗ１２を、発行部２２３からメモリ２３に対して発行する。また、同期処理ユニット３２は、第１カウンタを１インクリメントする。
【０１５９】
ここで、（３５）および（３６）の動作は同じサイクルで行われる。したがって、第１カウンタおよび第２カウンタのサイクル毎のチェックでは、第１カウンタの値は、デクリメントとインクリメントとで相殺され０とはならない。
【０１６０】
（３７）次に、同期処理ユニット３２は、同期処理用のライト命令ｓｙｎｃ＿ｗ１２に対応するライト完了通知ｃ１２を受信する。そして、同期処理ユニット３２は、第１カウンタを１つデクリメントする。これにより、第１カウンタおよび第２カウンタの値は、サイクル毎のチェックにおいて、共に０になったことが検出される。つまり、同期処理用のライト命令ｓｙｎｃ＿ｗ１２による書き込みが完了した。
【０１６１】
（３８）そこで、同期処理ユニット３２は、後続制御部３２４からのビジー信号ｂｕｓｙをデアサートする。ビジー信号ｂｕｓｙのデアサートによって、同期処理ユニット３２およびプロセッサ２１の間に滞留していたリード命令ｒ１３が、同期処理ユニット３２に受信される。
【０１６２】
以上の動作により、デバイス３０のプロセッサ２１から受信された同期処理用アドレスへのライト命令ｓｙｎｃ＿ｗ１２は、その前にホスト装置１０またはプロセッサ２１から受信されたライト命令ｗ９、ｗ１０、リード命令ｒ１１の完了後に、メモリ２３に反映される。そして、その後、プロセッサ２１からのリード命令ｒ１３がメモリ２３に対して発行されることが保証される。
【０１６３】
この動作により、ホスト装置１０およびデバイス３０のプロセッサ２１からの同期処理用でないメモリアクセス命令と、デバイス３０のプロセッサ２１からの同期処理用のメモリアクセス命令との間で発行順序が保証されることを、模式的に図１２に示す。プロセッサ２１からの同期処理用のライト命令ｓｙｎｃ＿ｗ１２に先行するホスト装置１０からのライト命令ｗ９、ｗ１０は、同期処理用のライト命令ｓｙｎｃ＿ｗ１２が保留される期間Ｔ５が設けられることにより、ライト命令ｓｙｎｃ＿ｗ１２のメモリ２３への発行前に完了する。また、プロセッサ２１からの同期処理用のライト命令ｓｙｎｃ＿ｗ１２の後続のリード命令ｒ１３は、ビジー信号がアサートされる期間Ｔ６が設けられることにより、同期処理用のライト命令ｓｙｎｃ＿ｗ１２が完了してから受信される。
【０１６４】
このように、デバイス３０内のメモリ２３に対するホスト装置１０およびデバイス３０のプロセッサ２１からのメモリアクセス命令の順序保障は、デバイス３０のプロセッサ２１からの同期処理用のメモリアクセス命令で実現される。
【０１６５】
例えば、ホスト装置１０から発行されるライト命令ｗ９、ライト命令ｗ１０のうち、ライト命令ｗ１０によって、ｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルのｒｅｌｅａｓｅプロセスのフラグ書き込みがメモリ２３上に行われる状況を考える。この場合、デバイス３０のプロセッサ２１は、リード命令ｒ１１によってこのフラグを繰り返し読み込み、フラグが成立したときに、同期処理用のライト命令ｓｙｎｃ＿ｗ１２を発行する。このため、同期処理ユニット３２によって同期処理用のライト命令ｓｙｎｃ＿ｗ１２が受信される前に、リード命令ｒ１１の前に受信されたライト命令ｗ５、ｗ６が受信されていることが保証される。そして、同期処理用のライト命令ｓｙｎｃ＿ｗ１２は、ホスト装置１０からのライト命令ｗ９、ｗ１０がメモリ２３に反映されてから、メモリ２３に対して発行されることになる。つまり、フラグ成立後の同期処理用のライト命令ｓｙｎｃ＿ｗ１２がメモリ２３に反映される前に、ライト命令ｗ９、ｗ１０によるデータがメモリ２３にデータが書き込まれていることが保証される。さらに、後続のリード命令ｒ１３は、デバイス３０のプロセッサ２１からの同期処理用のライト命令ｓｙｎｃ＿ｗ１２が完了後に、メモリ２３に対して発行される。このため、後続のリード命令ｒ１３は、ライト命令ｓｙｎｃ＿ｗ１２の完了前に完了しているライト命令ｗ９によって書き込まれたデータを読み込む命令として適している。
【０１６６】
このように、具体例４において、ライト命令ｗ１０を、ホスト装置１０によるｒｅｌｅａｓｅ側のフラグを書き込むライトとして適用する。また、リード命令ｒ１１を、デバイス３０のプロセッサ２１によるａｃｑｕｉｒｅ側のフラグを読み込むリードとして適用する。また、同期処理用のライト命令ｓｙｎｃ＿ｗ１２を、デバイス３０のプロセッサ２１によりフラグ成立後に実行するライトとして適用する。これにより、上述したように、本実施の形態がｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルを実現できることが、具体例４により説明される。
【０１６７】
なお、具体例４において、（３２）でデバイス３０のプロセッサ２１から発行される同期処理用のライト命令ｓｙｎｃ＿ｗ１２は、同期処理用のリード命令ｓｙｎｃ_ｒ１２に置き換え可能である。その場合、同期処理ユニット３２は、（３７）においてリード命令ｓｙｎｃ_ｒ１２に対応するリードデータｄ１２をメモリ２３から受信した後、（３８）においてリード命令ｒ１３をプロセッサ２１から受信し、メモリ２３に対して発行することになる。これは、デバイス３０のプロセッサ２１から同期処理用のリード命令を発行することによりｒｅｌｅａｓｅ−ｃｏｎｓｉｓｔｅｎｃｙモデルを実現する具体例２とは異なる例である。
【０１６８】
また、具体例４において、（３８）でデバイス３０のプロセッサ２１から受信されるリード命令ｒ１３は、ライト命令ｗ１３であってもよい。
【０１６９】
以上で、具体例の説明を終了する。
【０１７０】
次に、本発明の第２の実施の形態の効果について述べる。
【０１７１】
本発明の第２の実施の形態としてのシステムは、拡張バスで接続された複数のプロセッサ間で同期処理を行う際に、性能を低下させることなく、同期処理に用いるメモリに対するメモリアクセスの順序を保証することができる。
【０１７２】
その理由について説明する。本実施の形態では、本発明の第１の実施の形態と同様の構成に加えて、次の構成を備える。すなわち、命令判定部が、受信したメモリアクセス命令の対象となるメモリの領域が同期処理用の領域であるか否かに基づいて、メモリアクセス命令が同期処理用であるか否かを判定する。また、完了判定部が、メモリアクセス命令が発行されるとインクリメントされメモリアクセス命令の完了が通知されるとデクリメントされるカウンタを有する。そして、完了判定部が、カウンタの値に基づいて、メモリに対して発行されたメモリアクセス命令が完了したか否かを判定するからである。
【０１７３】
このような構成により、本実施の形態において、拡張バスで接続されたホスト装置からデバイスに対して発行されたメモリアクセス命令が同期処理用であるか否かを低負荷で判定することができる。また、本実施の形態は、同期処理用のメモリアクセス命令に先行するメモリアクセス命令が完了したか否かを低負荷で判定することができる。その結果、本実施の形態は、デバイス内のメモリに対するメモリアクセス命令の発行順序を保証するための動作により性能を低下させることがない。
【０１７４】
なお、本実施の形態において、拡張バスがＰＣＩｅ規格に基づく具体例について説明した。この具体例において、メモリアクセス命令は、ＰＣＩｅのメモリリード、メモリライトに限らず、コンフィグレーションリード、コンフィグレーションライト等のその他のＰＣＩｅトランザクションであってもよい。また、上述した各実施の形態において、適用可能な拡張バスの規格は限定されない。
【０１７５】
また、本実施の形態の具体例として、同期処理のためのリード命令またはライト命令に先行する命令および後続する命令がライト命令である例について説明したが、先行および後続する命令の種類や順序、数は限定されない。
【０１７６】
また、本実施の形態の具体例において、デバイス内の同期処理ユニットが、同期処理用でないメモリアクセス命令を、ホスト装置から受信する例について説明した。これに限らず、同期処理ユニットは、ホスト装置およびデバイス内のプロセッサのそれぞれから、同期処理用および同期処理用でないメモリアクセス命令を混在して受信する場合もあり得る。そのような場合にも、本実施の形態は同様に動作して、同様の効果を奏する。
【０１７７】
次に、本発明の実施の形態の他の態様を図１３に示す。
【０１７８】
図１３に示すように、本発明の実施の形態の他の態様としてのシステム４は、ホスト装置１０と、複数のデバイス３０とを備える。ホスト装置１０および各デバイス３０間は、拡張バスインタフェース９１および９２、拡張バススイッチ９３からなる拡張バス９０により接続される。
【０１７９】
この場合、各デバイス３０のプロセッサ２１は、同期処理のためのメモリアクセス命令を他のデバイス３０内のメモリ２３に対して発行する。他のデバイス３０内では、同期処理ユニット３２が、本発明の第２の実施の形態と同様に動作する。
【０１８０】
これにより、拡張バス９０で接続された複数のデバイス３０間において、性能を低下させることなく、メモリに対する同期処理用でないメモリアクセス命令と、同期処理用のメモリアクセス命令との間で発行順序を保証することができる。なお、図１３において、デバイス３０の代わりに本発明の第１の実施の形態におけるデバイス２０を備える構成も可能である。
【０１８１】
以上で、本発明の実施の形態の他の態様の説明を終了する。
【０１８２】
なお、上述した各実施の形態において、デバイス内のメモリとして、ＲＡＭやレジスタ、その他各種の記憶媒体を適用可能である。
【０１８３】
また、上述した各実施の形態は、適宜組み合わせて実施されることが可能である。
【０１８４】
また、本発明は、上述した各実施の形態に限定されず、様々な態様で実施されることが可能である。
【符号の説明】
【０１８５】
１、２、４    システム
１０    ホスト装置
１１    ＣＰＵ
１３    メモリ
２０、３０    デバイス
２１    プロセッサ
２２、３２    同期処理ユニット
２３    メモリ
２２１、３２１    命令判定部
２２２、３２２    完了判定部
２２３    発行部
２２４、３２４    後続制御部
３２６    記憶領域
３２７    カウンタ
９０    拡張バス
９１、９２    拡張バスインタフェース
９３    拡張バススイッチ
９０１    ルート・コンプレックス
９０２、９０３    ＰＨＹ
９０４    ＤＬＬ
９０５    ＴＬ
９０６    リンク
【図１】
2017182533.tif 000003
【図２】
2017182533.tif 000004
【図３】
2017182533.tif 000005
【図４】
2017182533.tif 000006
【図５】
2017182533.tif 000007
【図６】
2017182533.tif 000008
【図７】
2017182533.tif 000009
【図８】
2017182533.tif 000010
【図９】
2017182533.tif 000011
【図１０】
2017182533.tif 000012
【図１１】
2017182533.tif 000013
【図１２】
2017182533.tif 000014
【図１３】
2017182533.tif 000015
【図１４】
2017182533.tif 000016