(57)【特許請求の範囲】
【請求項１】
各々識別情報が割り当てられた複数のプロセッサと、
同期のための待ち合わせ処理を実行中のプロセッサの数を示すカウンタ値を格納するメモリと、
を有し、
前記複数のプロセッサの各々は、
前記待ち合わせ処理を開始した場合、前記メモリから読み出した前記カウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有する場合、前記メモリにおける前記カウンタ値を更新し、
前記メモリから読み出した前記カウンタ値が前記複数のプロセッサの数と一致する場合、前記待ち合わせ処理を終了する
情報処理装置。
【請求項２】
前記複数のプロセッサの各々はキャッシュメモリを有し、
前記メモリから読み出した前記カウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有するか判定する処理において、
前記メモリから読み出した前記カウンタ値を前記キャッシュメモリに格納する処理を実行し、
前記キャッシュメモリに格納された前記カウンタ値と前記プロセッサに割り当てられた識別情報とが前記所定の関係するか判定し、
前記キャッシュメモリに格納された前記カウンタ値と前記プロセッサに割り当てられた識別情報とが前記所定の関係を有さないと判定した場合、前記キャッシュメモリに格納された前記カウンタ値が無効化されるまで、前記キャッシュメモリに格納された前記カウンタ値と前記プロセッサに割り当てられた識別情報とが前記所定の関係するかの判定を繰り返し、
前記キャッシュメモリに格納された前記カウンタ値が無効化された場合、前記メモリから読み出した前記カウンタ値を前記キャッシュメモリに格納する処理に戻る、
請求項１記載の情報処理装置。
【請求項３】
前記メモリから読み出した前記カウンタ値が前記複数のプロセッサの数と一致するか判定する処理において
前記メモリから読み出した前記カウンタ値を前記キャッシュメモリに格納する処理を実行し、
前記キャッシュメモリに格納された前記カウンタ値が前記複数のプロセッサの数と一致するか判定し、
前記キャッシュメモリに格納された前記カウンタ値が前記複数のプロセッサの数と一致しないと判定した場合、前記キャッシュメモリに格納された前記カウンタ値が無効化されるまで、前記キャッシュメモリに格納された前記カウンタ値が前記複数のプロセッサの数と一致するかの判定を繰り返し、
前記キャッシュメモリに格納された前記カウンタ値が無効化された場合、前記メモリから読み出した前記カウンタ値を前記キャッシュメモリに格納する処理に戻る、
請求項２記載の情報処理装置。
【請求項４】
各々識別情報が割り当てられた複数のプロセッサと、同期のための待ち合わせ処理を実行中のプロセッサの数を示すカウンタ値を格納するメモリとを有するコンピュータにおいて実行される制御方法であって、
前記複数のプロセッサの各々が、
前記待ち合わせ処理を開始した場合、前記メモリから読み出した前記カウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有する場合、前記メモリにおける前記カウンタ値を更新し、
前記メモリから読み出した前記カウンタ値が前記複数のプロセッサの数と一致する場合、前記待ち合わせ処理を終了する、
処理を実行する制御方法。
【請求項５】
複数のプロセッサのうち第１のプロセッサに、
同期のための待ち合わせ処理を開始した場合、メモリから読み出した、前記待ち合わせ処理を実行中のプロセッサの数を示すカウンタ値と前記第１のプロセッサに割り当てられた識別情報とが所定の関係を有する場合、前記メモリにおける前記カウンタ値を更新し、
前記メモリから読み出した前記カウンタ値が前記複数のプロセッサの数と一致する場合、前記待ち合わせ処理を終了する
処理を実行させるための制御プログラム。
【請求項６】
各々識別情報が割り当てられた複数の情報処理装置と、
同期のための待ち合わせ処理を実行中の情報処理装置の数を示すカウンタ値を格納し且つ前記複数の情報処理装置がアクセス可能な記憶装置と、
を有し、
前記複数の情報処理装置の各々は、
前記待ち合わせ処理を開始した場合、前記記憶装置から読み出した前記カウンタ値と当該情報処理装置に割り当てられた識別情報とが所定の関係を有する場合、前記記憶装置における前記カウンタ値を更新し、
前記記憶装置から読み出した前記カウンタ値が前記複数の情報処理装置の数と一致する場合、前記待ち合わせ処理を終了する、
情報処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、待ち合わせ処理方法、待ち合わせ処理プログラム、情報処理装置及びシステムに関する。
【背景技術】
【０００２】
複数のＣＰＵ（Central Processing Unit）による並列処理においては、各ＣＰＵが次の処理を開始するタイミングを揃えるため、一部のＣＰＵが他のＣＰＵによる処理が終了するまで待つ処理が行われる。この処理は、待ち合わせ処理或いはバリア同期などと呼ばれる。
【０００３】
或る文献は、待ち合わせ処理に関して以下のような技術を開示する。具体的には、各プロセッサは、自プロセッサに対応する同期フラグをセットしたのち、全同期フラグがセットされるのを待つ。全同期フラグがセットされると、自プロセッサに対応するチェックフラグをセットしたのち、全チェックフラグがセットされるのを待つ。そして、全チェックフラグがセットされると、自プロセッサに対応する同期フラグをクリアしたのち全同期フラグがクリアされるのを待ち、クリアされると自プロセッサに対応するチェックフラグをクリアする。これにより同期処理が完了する。
【０００４】
この技術においては、待ち合わせ処理に参加するプロセッサの数が増えると、フラグ用のメモリ領域がそれに比例して大きくなる。そこで、或る文献は以下のような技術を開示する。具体的には、排他制御された複数のＣＰＵが１つのカウンタ値をそれぞれ１回インクリメントすることで、待ち合わせ処理に参加したＣＰＵの数を計数する。そして、このカウンタ値と、待ち合わせ処理の対象であるＣＰＵの数とが一致した時点で、待ち合わせ処理が完了したとみなされる。
【０００５】
但し、この技術は、待ち合わせ処理に要する時間を短縮することには着目していない。待ち合わせ処理に要する時間を短縮することができれば、並列処理の性能を向上させることができる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０００−３０５９１９号公報
【特許文献２】特開２０１３−２１０８５３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
従って、本発明の目的は、１つの側面では、待ち合わせ処理に要する時間を短縮するための技術を提供することである。
【課題を解決するための手段】
【０００８】
本発明に係る情報処理装置は、各々識別情報が割り当てられた複数のプロセッサと、複数のプロセッサの各々が次の処理を開始できるようになるまで待つ処理である待ち合わせ処理の状態を示すカウンタ値を格納するメモリとを有する。そして、複数のプロセッサの各々は、メモリから読み出したカウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有する場合、メモリにおけるカウンタ値を更新し、メモリから読み出したカウンタ値が複数のプロセッサの数と一致する場合、待ち合わせ処理を終了する。
【発明の効果】
【０００９】
１つの側面では、待ち合わせ処理に要する時間を短縮できるようになる。
【図面の簡単な説明】
【００１０】
【図１】図１は、情報処理装置のハードウエア構成図である。
【図２】図２は、各ＣＰＵが実行する処理の処理フローを示す図である。
【図３】図３は、全体としての動作について説明するための図である。
【図４】図４は、全体としての動作について説明するための図である。
【図５】図５は、全体としての動作について説明するための図である。
【図６】図６は、全体としての動作について説明するための図である。
【図７】図７は、キャッシュメモリとメモリとの間におけるデータ移動について説明するための図である。
【図８】図８は、キャッシュメモリとメモリとの間におけるデータ移動について説明するための図である。
【図９】図９は、本実施の形態の方法を使用しない場合におけるデータ移動について説明するための図である。
【図１０】図１０は、不可分命令について説明するための図である。
【図１１】図１１は、書き込み命令について説明するための図である。
【図１２】図１２は、読み込み命令について説明するための図である。
【図１３】図１３は、本実施の形態の方法を使用しない場合におけるデータ移動について説明するための図である。
【発明を実施するための形態】
【００１１】
図１に、本実施の形態における情報処理装置１のハードウエア構成図を示す。情報処理装置１は、並列計算を実行するＣＰＵ１０乃至１Ｎ（Ｎは自然数）と、共有メモリ１０００とを有する。図１においてはＣＰＵの数は４であるが、数に限定は無い。
【００１２】
ＣＰＵ１０は、レジスタ１０１とキャッシュメモリ１０２とを有する。ＣＰＵ１１は、レジスタ１１１とキャッシュメモリ１１２とを有する。ＣＰＵ１２は、レジスタ１２１とキャッシュメモリ１２２とを有する。ＣＰＵ１Ｎは、レジスタ１１Ｎとキャッシュメモリ１２Ｎとを有する。各ＣＰＵのレジスタには、ＣＰＵに割り当てられたＣＰＵ番号及び命令の結果等が格納される。
【００１３】
各ＣＰＵには、０を開始とする通番がＣＰＵ番号として割り当てられる。図１においては、ＣＰＵ１０にはＣＰＵ番号「０」が割り当てられ、ＣＰＵ１１にはＣＰＵ番号「１」が割り当てられ、ＣＰＵ１２にはＣＰＵ番号「２」が割り当てられ、ＣＰＵ１ＮにはＣＰＵ番号「Ｎ」が割り当てられる。以下では、ＣＰＵ番号「Ｍ」（Ｍは０以上の整数）が割り当てられたＣＰＵを「ＣＰＵ＃Ｍ」と呼ぶ。
【００１４】
共有メモリ１０００は、本実施の形態における待ち合わせ処理プログラムを格納する領域１００１と、カウンタ領域１００２と、カウンタ領域１００３と、フラグ領域１００４と、ＣＰＵ数を格納する領域１００５とを有する。カウンタ領域１００２及び１００３に格納されるカウンタ値は、待ち合わせ処理を実行中のＣＰＵの数を表す。フラグ領域１００４は、２つのカウンタのうち有効であるカウンタを表すデータを格納する。ＣＰＵ数を格納する領域１００５は、待ち合わせ処理を実行すべきＣＰＵの数、すなわち、バリア同期の対象であるＣＰＵの数を表すデータを格納する。以下では、カウンタ領域１００２のカウンタをカウンタ＃０とし、カウンタ領域１００３のカウンタをカウンタ＃１とする。
【００１５】
ＣＰＵ数を格納する領域１００５のサイズはＣＰＵ数に依存し、ＣＰＵ数が多くなるほどサイズは大きくなる。カウンタ領域１００２及びカウンタ領域１００３のサイズは、ＣＰＵ数を格納する領域１００５のサイズと同じである。フラグ領域１００４のサイズは、ソフトウエアによるアクセスの便宜（例えば排他制御など）を鑑み１バイトとする。例えば待ち合わせ処理を実行すべきＣＰＵの数が４，２９４，９６７，２９５（０ｘＦＦＦＦ＿ＦＦＦＦ）以下であるとすると、ＣＰＵ数を格納する領域１００５のサイズは４バイトであり、カウンタ領域１００２のサイズとカウンタ領域１００３のサイズの合計は４＊２＝８バイトであり、フラグ領域１００４のサイズは１バイトであるから、合計で１３バイトのメモリが使用される。
【００１６】
初期状態においては、ＣＰＵ数を格納する領域１００５にはＣＰＵ数を表す情報が格納され、カウンタ領域１００２のカウンタ値及びカウンタ領域１００３のカウンタ値はそれぞれ０に設定され、フラグ領域１００４のフラグは０又は１に設定される。
【００１７】
本実施の形態においては、図１に示した複数のＣＰＵのそれぞれが待ち合わせ処理プログラムを実行することでバリア同期を実現する。以下では、個々のＣＰＵが実行する処理、全体としての動作、及びＣＰＵとメモリとの間におけるデータの移動について説明する。
【００１８】
まず、図２を用いて、各ＣＰＵが実行する処理について説明する。ここでは、ＣＰＵ＃０（ＣＰＵ１０）が実行する処理を例にして説明するが、他のＣＰＵが実行する処理も同様である。
【００１９】
ＣＰＵ＃０は、共有メモリ１０００におけるフラグ領域１００４に格納されたフラグを読み出し、読み出したフラグに基づき、本処理時点において有効であるカウンタを特定する（図２：ステップＳ１）。例えば、フラグが「０」である場合は有効なカウンタはカウンタ＃０であり、フラグが「１」である場合は有効なカウンタはカウンタ＃１である。
【００２０】
ＣＰＵ＃０は、有効であるカウンタの値を、共有メモリ１０００における、有効であるカウンタの値が格納されたカウンタ領域（カウンタ領域１００２又はカウンタ領域１００３）から読み出し（ステップＳ３）、キャッシュメモリ１０２に格納する。但し、後述するように、一旦読み出した後は、無効化されるまでキャッシュメモリ１０２上のキャッシュデータ（カウンタ値）が読み出される。
【００２１】
ＣＰＵ＃０は、ステップＳ３において読み出したカウンタ値が、自ＣＰＵ番号（ここでは「０」）と一致するか判断する（ステップＳ５）。カウンタ値が自ＣＰＵ番号と一致しない場合（ステップＳ５：Ｎｏルート）、ステップＳ３の処理に戻る。一方、カウンタ値が自ＣＰＵ番号と一致する場合（ステップＳ５：Ｙｅｓルート）、ＣＰＵ＃０は、有効なカウンタの値に１を加算した値が、共有メモリ１０００におけるＣＰＵ数を格納する領域１００５に格納されたＣＰＵ数（すなわち、同期対象のＣＰＵの数）と一致するか判断する（ステップＳ７）。
【００２２】
有効なカウンタの値に１を加算した値がＣＰＵ数と一致しない場合（ステップＳ７：Ｎｏルート）、ＣＰＵ＃０は、有効なカウンタの値に１を加算し、加算後の値を、共有メモリ１０００における、有効であるカウンタの値が格納されたカウンタ領域（カウンタ領域１００２又はカウンタ領域１００３）に書き込む（ステップＳ９）。
【００２３】
ＣＰＵ＃０は、共有メモリ１０００における、有効であるカウンタの値が格納されたカウンタ領域（カウンタ領域１００２又はカウンタ領域１００３）からカウンタの値を読み出し（ステップＳ１０）、キャッシュメモリ１０２に格納する。
【００２４】
ＣＰＵ＃０は、ステップＳ１０において読み出した値が、共有メモリ１０００におけるＣＰＵ数を格納する領域１００５に格納されたＣＰＵ数（すなわち、同期対象のＣＰＵの数）と一致するか判断する（ステップＳ１１）。但し、後述するように、一旦読み出した後は、無効化されるまでキャッシュメモリ１０２上のキャッシュデータ（カウンタ値）が読み出される。
【００２５】
ステップＳ１０において読み出した値がＣＰＵ数と一致しない場合（ステップＳ１１：Ｎｏルート）、ステップＳ１０の処理に戻る。一方、ステップＳ１０において読み出した値がＣＰＵ数と一致する場合（ステップＳ１１：Ｙｅｓルート）、処理は終了する。
【００２６】
一方、ステップＳ７において、有効なカウンタの値に１を加算した値がＣＰＵ数と一致する場合（ステップＳ７：Ｙｅｓルート）、ＣＰＵ＃０は、無効なカウンタの値を０に設定する（ステップＳ１３）。無効なカウンタとは、ステップＳ１において特定されたカウンタではない方のカウンタである。
【００２７】
ＣＰＵ＃０は、共有メモリ１０００におけるフラグ領域１００４のフラグを反転する（ステップＳ１５）。ステップＳ１５の処理によって、無効であったカウンタが有効なカウンタになり、有効であったカウンタは無効なカウンタになる。
【００２８】
ＣＰＵ＃０は、共有メモリ１０００における、ステップＳ１５の処理の前には有効であったカウンタの値に１を加算する（ステップＳ１７）。そして処理は終了する。
【００２９】
次に、図３乃至図６を用いて、全体としての動作について説明する。ここでは、特にプログラムから見たデータのフローに着目する。ＣＰＵ数は３であるとし、ＣＰＵ＃０、ＣＰＵ＃１及びＣＰＵ＃２が待ち合わせ処理を実行するものとして説明する。また、初期状態において、カウンタ＃０及び＃１は０に設定され、フラグは０に設定されているものとする。
【００３０】
まず、ＣＰＵ＃０は一度目の待ち合わせ処理を開始し（図３：ステップＳ２１）、ＣＰＵ＃１は一度目の待ち合わせ処理を開始し（ステップＳ２３）、ＣＰＵ＃２は一度目の待ち合わせ処理を開始する（ステップＳ２５）。
【００３１】
ＣＰＵ＃０は共有メモリ１０００におけるフラグ領域１００４のフラグを読み出し（ステップＳ２７）、有効なカウンタを特定する。ＣＰＵ＃１は共有メモリ１０００におけるフラグ領域１００４のフラグを読み出し（ステップＳ２９）、有効なカウンタを特定する。ＣＰＵ＃２は共有メモリ１０００におけるフラグ領域１００４のフラグを読み出し（ステップＳ３１）、有効なカウンタを特定する。ここでは、有効なカウンタはカウンタ＃０であるとする。
【００３２】
ＣＰＵ＃０は、有効なカウンタであるカウンタ＃０の値を共有メモリ１０００から読み出し、キャッシュメモリ１０２に格納する（ステップＳ３３）。ＣＰＵ＃１は、有効なカウンタであるカウンタ＃０の値を共有メモリ１０００から読み出し、キャッシュメモリ１１２に格納する（ステップＳ３５）。ＣＰＵ＃２は、有効なカウンタであるカウンタ＃０の値を共有メモリ１０００から読み出し、キャッシュメモリ１２２に格納する（ステップＳ３７）。なお、一旦共有メモリ１０００からカウンタ値を読み出した後は、無効化されるまでキャッシュメモリ上のキャッシュデータ（カウンタ値）が読み出される。これにより、共有メモリ１０００からキャッシュメモリへデータを移動する回数を減らせるので、待ち合わせ処理にかかる時間が短くなる。
【００３３】
ＣＰＵ＃０は、読み出したカウンタ＃０の値が自ＣＰＵ番号（＝０）と一致するか判定する（ステップＳ３９）。読み出したカウンタ＃０の値が自ＣＰＵ番号（＝０）と一致しない場合（ステップＳ３９：Ｎｏルート）、ステップＳ３３の処理に戻る。一方、読み出したカウンタ＃０の値が自ＣＰＵ番号（＝０）と一致する場合（ステップＳ３９：Ｙｅｓルート）、ステップＳ４５の処理に移行する。
【００３４】
ＣＰＵ＃１は、読み出したカウンタ＃０の値が自ＣＰＵ番号（＝１）と一致するか判定する（ステップＳ４１）。読み出したカウンタ＃０の値が自ＣＰＵ番号（＝１）と一致しない場合（ステップＳ４１：Ｎｏルート）、ステップＳ３５の処理に戻る。一方、読み出したカウンタ＃０の値が自ＣＰＵ番号（＝１）と一致する場合（ステップＳ４１：Ｙｅｓルート）、処理は端子Ｂを介して図４のステップＳ４９に移行する。
【００３５】
ＣＰＵ＃２は、読み出したカウンタ＃０の値が自ＣＰＵ番号（＝２）と一致するか判定する（ステップＳ４３）。読み出したカウンタ＃０の値が自ＣＰＵ番号（＝２）と一致しない場合（ステップＳ４３：Ｎｏルート）、ステップＳ３７の処理に戻る。一方、読み出したカウンタ＃０の値が自ＣＰＵ番号（＝２）と一致する場合（ステップＳ４３：Ｙｅｓルート）、処理は端子Ｃを介して図４のステップＳ５３に移行する。
【００３６】
カウンタ＃０の初期値は０であるので、まずＣＰＵ＃０について、カウンタ＃０の値がＣＰＵ番号と一致すると判定される。ＣＰＵ＃０は、カウンタ＃０の値に１を加算した値がＣＰＵ数（＝３）と一致するか判定する（ステップＳ４５）。ここでは、カウンタ＃０の値に１を加算した値は１である。カウンタ＃０の値に１を加算した値がＣＰＵ数と一致する場合（ステップＳ４５：Ｙｅｓルート）、ステップＳ４５の処理に戻る。カウンタ＃０の値に１を加算した値がＣＰＵ数と一致しない場合（ステップＳ４５：Ｎｏルート）、ＣＰＵ＃０は、共有メモリ１０００におけるカウンタ＃０の値に１を加算する（ステップＳ４７）。これにより、カウンタ＃０の値は「１」になる。処理は端子Ａを介して図４のステップＳ５５に移行する。カウンタ＃０、カウンタ＃１及びフラグについても、図４の説明に移行する。
【００３７】
カウンタ＃０の値がＣＰＵ＃０によって１インクリメントされ「１」になると、ステップＳ４１において「Ｙｅｓ」であると判定される。すると、ＣＰＵ＃１は、カウンタ＃０の値に１を加算した値がＣＰＵ数（＝３）と一致するか判定する（図４：ステップＳ４９）。ここでは、カウンタ＃０の値に１を加算した値は「２」である。カウンタ＃０の値に１を加算した値がＣＰＵ数と一致する場合（ステップＳ４９：Ｙｅｓルート）、ステップＳ４９の処理に戻る。カウンタ＃０の値に１を加算した値がＣＰＵ数と一致しない場合（ステップＳ４９：Ｎｏルート）、ＣＰＵ＃１は、共有メモリ１０００におけるカウンタ＃０の値に１を加算する（ステップＳ５１）。これにより、カウンタ＃０の値は「２」になる。
【００３８】
カウンタ＃０の値がＣＰＵ＃１によって１インクリメントされ「２」になると、ステップＳ４３において「Ｙｅｓ」であると判定される。すると、ＣＰＵ＃２は、カウンタ＃０の値に１を加算した値がＣＰＵ数（＝３）と一致するか判定する（ステップＳ５３）。ここでは、カウンタ＃０の値に１を加算した値は「３」である。カウンタ＃０の値に１を加算した値がＣＰＵ数と一致しない場合（ステップＳ５３：Ｎｏルート）、ステップＳ５３の処理に戻る。カウンタ＃０の値に１を加算した値がＣＰＵ数と一致する場合（ステップＳ５３：Ｙｅｓルート）、ＣＰＵ＃２は、共有メモリ１０００におけるカウンタ＃１の値を０に設定する（ステップＳ５９）。
【００３９】
ＣＰＵ＃２は、共有メモリ１０００におけるフラグを「１」に設定する（ステップＳ６５）。これにより、有効なカウンタはカウンタ＃０からカウンタ＃１に切り替わる。
【００４０】
ＣＰＵ＃２は、共有メモリ１０００におけるカウンタ＃０の値に１を加算する（ステップＳ６７）。これにより、カウンタ＃０の値は「３」になる。そしてＣＰＵ＃２は待ち合わせ処理を終了する。
【００４１】
一方、ＣＰＵ＃０は、カウンタ＃０の値を共有メモリ１０００から読み出し、キャッシュメモリ１０２に格納する（ステップＳ５５）。ＣＰＵ＃１は、カウンタ＃０の値を共有メモリ１０００から読み出し、キャッシュメモリ１１２に格納する（ステップＳ５７）。なお、一旦共有メモリ１０００からカウンタ値を読み出した後は、無効化されるまでキャッシュメモリ上のキャッシュデータ（カウンタ値）が読み出される。これにより、共有メモリ１０００からキャッシュメモリへデータを移動する回数を減らせるので、待ち合わせ処理にかかる時間が短くなる。
【００４２】
ＣＰＵ＃０は、読み出したカウンタ＃０の値がＣＰＵ数（＝３）と一致するか判定する（ステップＳ６１）。読み出したカウンタ＃０の値がＣＰＵ数と一致しない場合（ステップＳ６１：Ｎｏルート）、ステップＳ５５の処理に戻る。一方、読み出したカウンタ＃０の値がＣＰＵ数と一致する場合（ステップＳ６１：Ｙｅｓルート）、ＣＰＵ＃０は待ち合わせ処理を終了する。
【００４３】
ＣＰＵ＃１は、読み出したカウンタ＃０の値がＣＰＵ数（＝３）と一致するか判定する（ステップＳ６３）。読み出したカウンタ＃０の値がＣＰＵ数と一致しない場合（ステップＳ６３：Ｎｏルート）、ステップＳ５７の処理に戻る。一方、読み出したカウンタ＃０の値がＣＰＵ数と一致する場合（ステップＳ６３：Ｙｅｓルート）、ＣＰＵ＃１は待ち合わせ処理を終了する。これにより同期が成立する。
【００４４】
同期が成立すると、各ＣＰＵは次のステップの処理を実行する。そして、次のステップの処理が終了すると、ＣＰＵ＃０は２度目の待ち合わせ処理を開始し（図５：ステップＳ７１）、ＣＰＵ＃１は２度目の待ち合わせ処理を開始し（ステップＳ７３）、ＣＰＵ＃２は２度目の待ち合わせ処理を開始する（ステップＳ７５）。２度目の待ち合わせ処理の開始時点においては、カウンタ＃０の値は３であり、カウンタ＃１の値は０であり、フラグは１に設定されている。
【００４５】
ＣＰＵ＃０は共有メモリ１０００におけるフラグ領域１００４のフラグを読み出し（ステップＳ７７）、有効なカウンタを特定する。ＣＰＵ＃１は共有メモリ１０００におけるフラグ領域１００４のフラグを読み出し（ステップＳ７９）、有効なカウンタを特定する。ＣＰＵ＃２は共有メモリ１０００におけるフラグ領域１００４のフラグを読み出し（ステップＳ８１）、有効なカウンタを特定する。ここでは、有効なカウンタはカウンタ＃１であるとする。
【００４６】
ＣＰＵ＃０は、有効なカウンタであるカウンタ＃１の値を共有メモリ１０００から読み出し、キャッシュメモリ１０２に格納する（ステップＳ８３）。ＣＰＵ＃１は、有効なカウンタであるカウンタ＃１の値を共有メモリ１０００から読み出し、キャッシュメモリ１１２に格納する（ステップＳ８５）。ＣＰＵ＃２は、有効なカウンタであるカウンタ＃１の値を共有メモリ１０００から読み出し、キャッシュメモリ１２２に格納する（ステップＳ８７）。なお、一旦共有メモリ１０００からカウンタ値を読み出した後は、無効化されるまでキャッシュメモリ上のキャッシュデータ（カウンタ値）が読み出される。これにより、共有メモリ１０００からキャッシュメモリへデータを移動する回数を減らせるので、待ち合わせ処理にかかる時間が短くなる。
【００４７】
ＣＰＵ＃０は、読み出したカウンタ＃１の値が自ＣＰＵ番号（＝０）と一致するか判定する（ステップＳ８９）。読み出したカウンタ＃１の値が自ＣＰＵ番号（＝０）と一致しない場合（ステップＳ８９：Ｎｏルート）、ステップＳ８３の処理に戻る。一方、読み出したカウンタ＃１の値が自ＣＰＵ番号（＝０）と一致する場合（ステップＳ８９：Ｙｅｓルート）、ステップＳ９５の処理に移行する。
【００４８】
ＣＰＵ＃１は、読み出したカウンタ＃１の値が自ＣＰＵ番号（＝１）と一致するか判定する（ステップＳ９１）。読み出したカウンタ＃１の値が自ＣＰＵ番号（＝１）と一致しない場合（ステップＳ９１：Ｎｏルート）、ステップＳ８５の処理に戻る。一方、読み出したカウンタ＃１の値が自ＣＰＵ番号（＝１）と一致する場合（ステップＳ９１：Ｙｅｓルート）、処理は端子Ｈを介して図６のステップＳ９９に移行する。
【００４９】
ＣＰＵ＃２は、読み出したカウンタ＃１の値が自ＣＰＵ番号（＝２）と一致するか判定する（ステップＳ９３）。読み出したカウンタ＃１の値が自ＣＰＵ番号（＝２）と一致しない場合（ステップＳ９３：Ｎｏルート）、ステップＳ８７の処理に戻る。一方、読み出したカウンタ＃１の値が自ＣＰＵ番号（＝２）と一致する場合（ステップＳ９３：Ｙｅｓルート）、処理は端子Ｉを介して図６のステップＳ１０３に移行する。
【００５０】
カウンタ＃１の初期値は０であるので、まずＣＰＵ＃０について、カウンタ＃１の値がＣＰＵ番号と一致すると判定される。ＣＰＵ＃０は、カウンタ＃１の値に１を加算した値がＣＰＵ数（＝３）と一致するか判定する（ステップＳ９５）。ここでは、カウンタ＃１の値に１を加算した値は１である。カウンタ＃１の値に１を加算した値がＣＰＵ数と一致する場合（ステップＳ９５：Ｙｅｓルート）、ステップＳ９５の処理に戻る。カウンタ＃１の値に１を加算した値がＣＰＵ数と一致しない場合（ステップＳ９５：Ｎｏルート）、ＣＰＵ＃０は、共有メモリ１０００におけるカウンタ＃１の値に１を加算する（ステップＳ９７）。これにより、カウンタ＃１の値は「１」になる。処理は端子Ｇを介して図６のステップＳ１０５に移行する。カウンタ＃０、カウンタ＃１及びフラグについても、図６の説明に移行する。
【００５１】
カウンタ＃１の値がＣＰＵ＃０によって１インクリメントされ「１」になると、ステップＳ９１において「Ｙｅｓ」であると判定される。すると、ＣＰＵ＃１は、カウンタ＃１の値に１を加算した値がＣＰＵ数（＝３）と一致するか判定する（図６：ステップＳ９９）。ここでは、カウンタ＃１の値に１を加算した値は「２」である。カウンタ＃１の値に１を加算した値がＣＰＵ数と一致する場合（ステップＳ９９：Ｙｅｓルート）、ステップＳ９９の処理に戻る。カウンタ＃１の値に１を加算した値がＣＰＵ数と一致しない場合（ステップＳ９９：Ｎｏルート）、ＣＰＵ＃１は、共有メモリ１０００におけるカウンタ＃１の値に１を加算する（ステップＳ１０１）。これにより、カウンタ＃１の値は「２」になる。
【００５２】
カウンタ＃１の値がＣＰＵ＃１によって１インクリメントされ「２」になると、ステップＳ９３において「Ｙｅｓ」であると判定される。すると、ＣＰＵ＃２は、カウンタ＃１の値に１を加算した値がＣＰＵ数（＝３）と一致するか判定する（ステップＳ１０３）。ここでは、カウンタ＃１の値に１を加算した値は「３」である。カウンタ＃１の値に１を加算した値がＣＰＵ数と一致しない場合（ステップＳ１０３：Ｎｏルート）、ステップＳ１０３の処理に戻る。カウンタ＃１の値に１を加算した値がＣＰＵ数と一致する場合（ステップＳ１０３：Ｙｅｓルート）、ＣＰＵ＃２は、共有メモリ１０００におけるカウンタ＃０の値を０に設定する（ステップＳ１０９）。
【００５３】
ＣＰＵ＃２は、共有メモリ１０００におけるフラグを「０」に設定する（ステップＳ１１５）。これにより、有効なカウンタはカウンタ＃１からカウンタ＃０に切り替わる。
【００５４】
ＣＰＵ＃２は、共有メモリ１０００におけるカウンタ＃１の値に１を加算する（ステップＳ１１７）。これにより、カウンタ＃１の値は「３」になる。そしてＣＰＵ＃２は待ち合わせ処理を終了する。
【００５５】
一方、ＣＰＵ＃０は、カウンタ＃１の値を共有メモリ１０００から読み出し、キャッシュメモリ１０２に格納する（ステップＳ１０５）。ＣＰＵ＃１は、カウンタ＃１の値を共有メモリ１０００から読み出し、キャッシュメモリ１１２に格納する（ステップＳ１０７）。なお、一旦共有メモリ１０００からカウンタ値を読み出した後は、無効化されるまでキャッシュメモリ上のキャッシュデータ（カウンタ値）が読み出される。これにより、共有メモリ１０００からキャッシュメモリへデータを移動する回数を減らせるので、待ち合わせ処理にかかる時間が短くなる。
【００５６】
ＣＰＵ＃０は、読み出したカウンタ＃１の値がＣＰＵ数（＝３）と一致するか判定する（ステップＳ１１１）。読み出したカウンタ＃１の値がＣＰＵ数と一致しない場合（ステップＳ１１１：Ｎｏルート）、ステップＳ１０５の処理に戻る。一方、読み出したカウンタ＃１の値がＣＰＵ数と一致する場合（ステップＳ１１１：Ｙｅｓルート）、ＣＰＵ＃０は待ち合わせ処理を終了する。
【００５７】
ＣＰＵ＃１は、読み出したカウンタ＃１の値がＣＰＵ数（＝３）と一致するか判定する（ステップＳ１１３）。読み出したカウンタ＃１の値がＣＰＵ数と一致しない場合（ステップＳ１１３：Ｎｏルート）、ステップＳ１０７の処理に戻る。一方、読み出したカウンタ＃１の値がＣＰＵ数と一致する場合（ステップＳ１１３：Ｙｅｓルート）、ＣＰＵ＃１は待ち合わせ処理を終了する。これにより同期が成立する。
【００５８】
これ以降の処理は、図５及び図６を用いて説明した処理と同様であるので、説明を省略する。
【００５９】
次に、図７乃至図１３を用いて、各ＣＰＵのキャッシュメモリと共有メモリ１０００との間におけるデータの移動に着目して本実施の形態を説明する。ＣＰＵ数は３であるとし、ＣＰＵ＃０、ＣＰＵ＃１及びＣＰＵ＃２が待ち合わせ処理を実行するものとして説明する。また、初期状態において、有効なカウンタであるカウンタ＃０の値は０に設定されているものとする。
【００６０】
なお、図７乃至図９及び図１３はデータ移動の一例を示すものであり、同期のタイミングやハードウエアの実装によってはここで示すものには該当しない場合がある。ここでは、ＭＥＳＩプロトコルを使用したと仮定してデータ移動について説明する。図７乃至図９及び図１３における太線は、ハードウエアによるデータ制御を示しており、ソフトウエアによる処理を表すものではない。
【００６１】
本実施の形態においては、ＭＥＳＩプロトコルに従い、キャッシュメモリに格納されるキャッシュデータのステータスを以下のように定義する。まず、メモリ上のデータのコピーがキャッシュメモリ上に無い場合のステータスをＩｎｖａｌｉｄとする。メモリ上のデータのコピーを或るＣＰＵだけが持っている場合のステータスをＥｘｃｌｕｓｉｖｅとする。メモリ上のデータのコピーを複数のＣＰＵが持っている場合のステータスをＳｈａｒｅｄとする。メモリ上のデータのコピーをキャッシュメモリ上で書き換えた場合のステータスをＭｏｄｉｆｉｅｄとする。
【００６２】
まず、ＣＰＵ＃０は、カウンタ＃０の値を共有メモリ１０００からキャッシュメモリ１０２に読み出す（図７：ステップＳ１２１）。ＣＰＵ＃１は、カウンタ＃０の値を共有メモリ１０００からキャッシュメモリ１１２に読み出す（ステップＳ１２３）。ＣＰＵ＃２は、カウンタ＃０の値を共有メモリ１０００からキャッシュメモリ１２２に読み出す（ステップＳ１２５）。このとき、各ＣＰＵのキャッシュデータのステータスはＥｘｃｌｕｓｉｖｅ又はＳｈａｒｅｄになる。
【００６３】
ＣＰＵ＃０は、キャッシュメモリ１０２上のキャッシュデータ（すなわち、読み出されたカウンタ値）が自ＣＰＵ番号（＝０）と一致するか判定する（ステップＳ１２７）。ＣＰＵ＃１は、キャッシュメモリ１１２上のキャッシュデータが自ＣＰＵ番号（＝１）と一致するか判定する（ステップＳ１２９）。ＣＰＵ＃２は、キャッシュメモリ１２２上のキャッシュデータが自ＣＰＵ番号（＝２）と一致するか判定する（ステップＳ１３１）。
【００６４】
カウンタ＃０の初期値は「０」であるので、ＣＰＵ＃０はステップＳ１２７の処理を完了し、ステップＳ１３５の処理に移行する。一方、ＣＰＵ＃１及び＃２については、キャッシュメモリ上のキャッシュデータが自ＣＰＵ番号と一致しないので、ステップＳ１２９の処理及びステップＳ１３１の処理が繰り返される。ステップＳ１２９の処理及びステップＳ１３１の処理は、キャッシュデータが自ＣＰＵ番号と一致するか又はキャッシュデータが無効化されるまで繰り返される。
【００６５】
ＣＰＵ＃０は、キャッシュデータに１を加算し（ステップＳ１３５）、キャッシュデータの無効化をＣＰＵ＃１及びＣＰＵ＃２に要求する。これにより、ＣＰＵ＃１のキャッシュデータ及びＣＰＵ＃２のキャッシュデータは無効化（例えば、ステータスがＩｎｖａｌｉｄに変更）される。ＣＰＵ＃０のキャッシュデータが更新されると、ステータスはＭｏｄｉｆｉｅｄに変更される。
【００６６】
キャッシュデータが無効化されると、ＣＰＵ＃１は、共有メモリ１０００のメモリコントローラにカウンタ＃０の値の読み出し要求を発行する（ステップＳ１３７）。同様に、ＣＰＵ＃２は、共有メモリ１０００のメモリコントローラにカウンタ＃０の値の読み出し要求を発行する（ステップＳ１３９）。メモリコントローラは、カウンタ＃０の値のキャッシュデータのステータスがＭｏｄｉｆｉｅｄであることを知っているので、ＣＰＵ＃１及びＣＰＵ＃２のうち読み出し要求を早く発行した方のＣＰＵに、ＣＰＵ＃０のキャッシュデータのステータスがＭｏｄｉｆｉｅｄであることを通知する。これに応じ、ＣＰＵ（ここでは、ＣＰＵ＃１とする）は、ＣＰＵ＃０にキャッシュデータの書き戻しを要求する。そして端子Ｍ乃至Ｐを介して図８の説明に移行する。
【００６７】
図８の説明に移行し、ＣＰＵ＃０は、ＣＰＵ＃１からキャッシュデータの書き戻しを要求された場合、キャッシュデータ（ここでは「１」）を共有メモリ１０００におけるカウンタ＃０に書き戻す。この時、キャッシュデータのステータスはＭｏｄｉｆｉｅｄからＳｈａｒｅｄに変わる。
【００６８】
ＣＰＵ＃１は、共有メモリ１０００に書き戻されたカウンタ＃０の値を読み出し、キャッシュメモリ１１２に格納する。同様に、ＣＰＵ＃２は、共有メモリ１０００に書き戻されたカウンタ＃０の値を読み出し、キャッシュメモリ１２２に格納する。この時、ＣＰＵ＃１及び＃２のキャッシュデータのステータスはＳｈａｒｅｄである。
【００６９】
ＣＰＵ＃１は、キャッシュメモリ１１２上のキャッシュデータが自ＣＰＵ番号（＝１）と一致するか判定する（ステップＳ１４３）。ＣＰＵ＃２は、キャッシュメモリ１２２上のキャッシュデータが自ＣＰＵ番号（＝２）と一致するか判定する（ステップＳ１４５）。
【００７０】
ステップＳ１４３においては、ＣＰＵ＃１について、キャッシュデータがＣＰＵ番号と一致すると判定されるので、ＣＰＵ＃１は、ＣＰＵ＃０のステップＳ１３５以降の処理と同様の処理を以降実行する。一方、ＣＰＵ＃２については、キャッシュメモリ上のキャッシュデータが自ＣＰＵ番号と一致しないので、ステップＳ１４５の処理が繰り返される。ステップＳ１４５の処理は、キャッシュデータが自ＣＰＵ番号と一致するか又はキャッシュデータが無効化されるまで繰り返される。
【００７１】
ＣＰＵ＃０は、キャッシュデータがＣＰＵ数（＝３）と一致するか判定する（ステップＳ１４１）。ＣＰＵ＃２によってカウンタ＃０の値が更新されるまでは、ステップＳ１４１において「Ｙｅｓ」であるとは判定されない。
【００７２】
以上のような処理を実行すれば、ステップＳ１２７乃至Ｓ１３１の処理によって、キャッシュメモリとメモリとの間におけるデータの移動回数を減らすことができるので、待ち合わせ処理に要する時間を短縮することができるようになる。本実施の形態においては、キャッシュデータがメモリに書き戻される回数及び再度キャッシュメモリにデータを読み出す回数が、ＣＰＵ数と同じ数になる。従って、ＣＰＵの数が増えてシステムが大規模になった場合にも待ち合わせ処理にかかる時間が極端に長くなることを抑制できるようになる。
【００７３】
参考までに、図９乃至図１３を用いて、特開２０１３−２１０８５３号公報に開示された方法によって待ち合わせ処理を実行した場合におけるデータの移動について説明する。ＣＰＵ数は３であるとし、ＣＰＵ＃０、ＣＰＵ＃１及びＣＰＵ＃２が待ち合わせ処理を実行するものとして説明する。また、排他制御におけるフラグは初期状態において０ｘ０に設定されており、カウンタは０ｘ０に設定されているものとする。
【００７４】
まず、ＣＰＵ＃０は、不可分命令によってメモリにおけるフラグにアクセスする（図９：ステップＳ１４７）。不可分命令とは、不可分操作の命令のことである。不可分操作とは、分割できない処理のことであり、特開２０１３−２１０８５３号公報においては排他制御に不可分命令を使用している。図１０を用いて、不可分操作について説明する。図１０においては、メモリにおけるフラグ領域のデータについて、不可分命令によって読み出し及び書き換えが実行される。まず、メモリにおけるデータ０ｘ００は、ＣＰＵにおけるキャッシュメモリにムーブインされ、キャッシュメモリ上で０ｘｆｆに書き換えられる。このとき、キャッシュデータのステータスはＭｏｄｉｆｉｅｄになる。ＣＰＵのレジスタには、読み出された０ｘ００が格納される。最終的には、メモリ上のデータが０ｘｆｆに書き換えられる。
【００７５】
参考までに、書き込み命令及び読み出し命令についても説明する。まず、図１１を用いて、書き込み命令について説明する。図１１においては、メモリにおけるフラグ領域のデータについて、書き込み命令によって書き換えが行われる。まず、メモリにおけるデータ０ｘ００は、ＣＰＵにおけるキャッシュメモリにムーブインされ、キャッシュメモリ上で０ｘｆｆに書き換えられる。このとき、キャッシュデータのステータスはＭｏｄｉｆｉｅｄになる。最終的には、メモリ上のデータが０ｘｆｆに書き換えられる。図１２を用いて、読み出し命令について説明する。図１２においては、メモリにおけるフラグ領域のデータについて、読み出し命令によって読み出しが行われる。まず、メモリにおけるデータ０ｘ００は、ＣＰＵにおけるキャッシュメモリにムーブインされる。この際、キャッシュデータのステータスはＥｘｃｌｕｓｉｖｅ又はＳｈａｒｅｄである。キャッシュメモリに読み出されたデータ０ｘ００は、レジスタに格納される。
【００７６】
図９の説明に戻り、不可分命令によってキャッシュメモリに読み出されたデータ０ｘ００はレジスタに格納されると共に、キャッシュメモリ上で０ｘｆｆに書き換えられる。この際、ＣＰＵ＃０のキャッシュデータのステータスがＭｏｄｉｆｉｅｄになる。
【００７７】
一方、ＣＰＵ＃２は、不可分命令によってメモリにおけるフラグにアクセスする（ステップＳ１４９）。しかし、ＣＰＵ＃０のキャッシュデータのステータスがＭｏｄｉｆｉｅｄであるため、ＣＰＵ＃２はＣＰＵ＃０にキャッシュデータの書き戻しを要求する。これに応じ、ＣＰＵ＃０は、データ０ｘｆｆをメモリに書き戻す。これにより、ＣＰＵ＃０のキャッシュデータのステータスはＳｈａｒｅｄになる。
【００７８】
すると、ＣＰＵ＃２は、不可分命令によって再度メモリにおけるフラグにアクセスする（ステップＳ１４９）。不可分命令によってキャッシュメモリに読み出されたデータ０ｘｆｆはレジスタに格納されると共に、キャッシュメモリ上で書き換えられる（ここでは０ｘｆｆのままである）。この際、ＣＰＵ＃２のキャッシュデータのステータスがＭｏｄｉｆｉｅｄになり、ＣＰＵ＃０のキャッシュデータは無効化される。
【００７９】
ＣＰＵ＃２は、レジスタに格納された値が０ｘ００であるか判定する（ステップＳ１５１）。レジスタに格納された値が０ｘ００ではない場合（ステップＳ１５１：Ｎｏルート）、ステップＳ１４９の処理に戻る。レジスタに格納された値が０ｘ００である場合（ステップＳ１５１：Ｙｅｓルート）、処理は端子Ｓを介して図１３の処理に移行する。図９の例では、少なくともＣＰＵ＃０によってフラグが０ｘ００に戻されるまでステップＳ１５１において「Ｙｅｓ」であると判定されることはない。
【００８０】
一方、ＣＰＵ＃１は、不可分命令によってメモリにおけるフラグにアクセスする（ステップＳ１５３）。しかし、ＣＰＵ＃２のキャッシュデータのステータスがＭｏｄｉｆｉｅｄであるため、ＣＰＵ＃１はＣＰＵ＃２にキャッシュデータの書き戻しを要求する。これに応じ、ＣＰＵ＃２は、データ０ｘｆｆをメモリに書き戻す。これにより、ＣＰＵ＃２のキャッシュデータのステータスはＳｈａｒｅｄになる。
【００８１】
すると、ＣＰＵ＃１は、不可分命令によって再度メモリにおけるフラグにアクセスする（ステップＳ１５３）。不可分命令によってキャッシュメモリに読み出されたデータ０ｘｆｆはレジスタに格納されると共に、キャッシュメモリ上で書き換えられる（ここでは０ｘｆｆのままである）。この際、ＣＰＵ＃１のキャッシュデータのステータスはＭｏｄｉｆｉｅｄになり、ＣＰＵ＃２のキャッシュデータは無効化される。
【００８２】
ＣＰＵ＃１は、レジスタに格納された値が０ｘ００であるか判定する（ステップＳ１５５）。レジスタに格納された値が０ｘ００ではない場合（ステップＳ１５５：Ｎｏルート）、ステップＳ１５３の処理に戻る。レジスタに格納された値が０ｘ００である場合（ステップＳ１５５：Ｙｅｓルート）、処理は端子Ｒを介して図１３の処理に移行する。図９の例では、少なくともＣＰＵ＃０によってフラグが０ｘ００に戻されるまでステップＳ１５５において「Ｙｅｓ」であると判定されることはない。なお、ＣＰＵ＃０、フラグ、及びカウンタ＃０についても、端子Ｑ、Ｔ、及びＵを介して図１３の説明に移行する。
【００８３】
図１３の説明に移行し、ＣＰＵ＃０は、カウンタ＃０の値をメモリからキャッシュメモリに読み出し、１インクリメントする（図１３：ステップＳ１５７）。これにより、キャッシュデータは０ｘ１になる。キャッシュデータのステータスはＭｏｄｉｆｉｅｄである。最終的に、キャッシュデータ０ｘ１はメモリに書き戻される。
【００８４】
ＣＰＵ＃０は、通常の書き込み命令によって、メモリにおけるフラグをキャッシュメモリに読み出して０ｘ００に更新（すなわち、排他制御のロックを解除）し（ステップＳ１５９）、ＣＰＵ＃１にキャッシュデータを無効化することを要求する。最終的に、キャッシュデータ上のフラグ０ｘ００はメモリに書き戻される。以降の処理は、ここまで説明した処理と同様であるので、説明を省略する。
【００８５】
以上のように、特開２０１３−２１０８５３号公報に開示された方法では不可分命令を使用しているため、図９の破線で囲われた部分の処理において、キャッシュデータのステータスがＭｏｄｉｆｉｅｄに遷移し、メモリとキャッシュメモリとの間におけるデータ移動やＣＰＵ間でのキャッシュの要求が繰り返される。そのため、ソフトウエアからは見えないハードウエア遅延によって、待ち合わせ処理が完了するまでの時間が長くなる。
【００８６】
一方、本実施の形態においては、不可分命令を使用せず、カウンタの値とＣＰＵ番号との比較によってフラグによる排他制御と同等の機能を実現している。この方法においては、ステップＳ１２１乃至Ｓ１２５において読み出し命令を使用しているため、キャッシュデータのステータスはＭｏｄｉｆｉｅｄに遷移しない。キャッシュデータのステータスがＭｏｄｉｆｉｅｄに遷移するのは、主に共有メモリ１０００上のカウンタを更新するときであり、その回数はＣＰＵ数と同じ数である。
【００８７】
また、本実施の形態において使用する命令は書き込み命令及び読み出し命令であるため、不可分命令を実装した装置でなくても実現することができ、また待ち合わせ処理に使用する共有メモリ１０００がキャッシャブルであってもノンキャッシャブルであっても実現可能である。そのため、キャッシャブル領域にエラーを印加するＲＡＳ（Reliability Availability Serviceability）試験など、キャッシャブル領域を使用できない環境においても待ち合わせ処理を実現することができるようになる。
【００８８】
また、上で述べた方法では、同期が成立しなかった時点における有効なカウンタの値は、同期に参加できなかったＣＰＵの番号を示している。よって、障害の調査が従来に比べて容易になる。
【００８９】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置１のハードウエア構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【００９０】
また、複数の情報処理装置（例えばサーバなど）とその複数の情報処理装置がアクセス可能な記憶装置とを有する情報処理システムに対して本実施の形態を適用することも可能である。
【００９１】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【００９２】
本実施の形態の第１の態様に係る情報処理装置は、（Ａ）各々識別情報が割り当てられた複数のプロセッサと、（Ｂ）複数のプロセッサの各々が次の処理を開始できるようになるまで待つ処理である待ち合わせ処理の状態を示すカウンタ値を格納するメモリとを有する。そして、複数のプロセッサの各々は、（ａ１）メモリから読み出したカウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有する場合、メモリにおけるカウンタ値を更新し、（ａ２）メモリから読み出したカウンタ値が複数のプロセッサの数と一致する場合、待ち合わせ処理を終了する。
【００９３】
このようにすれば、排他制御に不可分操作の命令を使用しなくてもよいので、待合せ処理に要する時間を短縮できるようになる。
【００９４】
また、（ａ３）複数のプロセッサの各々はキャッシュメモリを有してもよい。そして、カウンタ値を更新する処理において、（ａ２１）メモリから読み出したカウンタ値をキャッシュメモリに格納し、（ａ２２）キャッシュメモリに格納されたカウンタ値とプロセッサに割り当てられた識別情報とが所定の関係を有するか判定する第１判定処理を実行し、（ａ２３）キャッシュメモリに格納されたカウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有さないと判定した場合、第１判定処理を、キャッシュメモリに格納されたカウンタ値が無効化されるまで繰り返し、（ａ２４）キャッシュメモリに格納されたカウンタ値が無効化された場合、メモリから読み出したカウンタ値をキャッシュメモリに格納し、第１判定処理を実行してもよい。このようにすれば、メモリとキャッシュメモリとの間でデータを移動する処理の回数を減らすことができるようになる。
【００９５】
また、待ち合わせ処理を終了する処理において、（ａ３１）メモリから読み出したカウンタ値をキャッシュメモリに格納し、（ａ３２）キャッシュメモリに格納されたカウンタ値が複数のプロセッサの数と一致するか判定する第２判定処理を実行し、（ａ３３）キャッシュメモリに格納されたカウンタ値が複数のプロセッサの数と一致しないと判定した場合、第２判定処理を、キャッシュメモリに格納されたカウンタ値が無効化されるまで繰り返し、（ａ３４）キャッシュメモリに格納されたカウンタ値が無効化された場合、メモリから読み出したカウンタ値をキャッシュメモリに格納し、第２判定処理を実行してもよい。このようにすれば、メモリとキャッシュメモリとの間でデータを移動する処理の回数を減らすことができるようになる。
【００９６】
また、上で述べた識別情報は識別番号であってもよい。そして、カウンタ値を更新する処理において、（ａ２５）メモリにおけるカウンタ値に１を加算してもよい。
【００９７】
また、上で述べた所定の関係は、メモリから読み出したカウンタ値とプロセッサに割り当てられた識別情報との差が所定値であるという関係であってもよい。
【００９８】
本実施の形態の第２の態様に係る待ち合わせ処理方法は、各々識別情報が割り当てられた複数のプロセッサと、複数のプロセッサの各々が次の処理を開始できるようになるまで待つ処理である待ち合わせ処理の状態を示すカウンタ値を格納するメモリとを有するコンピュータにおいて実行される。そして、複数のプロセッサの各々が、（Ｃ）メモリから読み出したカウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有する場合、メモリにおけるカウンタ値を更新し、（Ｄ）メモリから読み出したカウンタ値が複数のプロセッサの数と一致する場合、待ち合わせ処理を終了する処理を含む。
【００９９】
なお、上記方法による処理をプロセッサに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【０１００】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１０１】
（付記１）
各々識別情報が割り当てられた複数のプロセッサと、
前記複数のプロセッサの各々が次の処理を開始できるようになるまで待つ処理である待ち合わせ処理の状態を示すカウンタ値を格納するメモリと、
を有し、
前記複数のプロセッサの各々は、
前記メモリから読み出した前記カウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有する場合、前記メモリにおける前記カウンタ値を更新し、
前記メモリから読み出した前記カウンタ値が前記複数のプロセッサの数と一致する場合、前記待ち合わせ処理を終了する、
情報処理装置。
【０１０２】
（付記２）
前記複数のプロセッサの各々はキャッシュメモリを有し、
前記カウンタ値を更新する処理において、
前記メモリから読み出した前記カウンタ値を前記キャッシュメモリに格納し、
前記キャッシュメモリに格納された前記カウンタ値と前記プロセッサに割り当てられた識別情報とが前記所定の関係を有するか判定する第１判定処理を実行し、
前記キャッシュメモリに格納された前記カウンタ値と前記プロセッサに割り当てられた識別情報とが前記所定の関係を有さないと判定した場合、前記第１判定処理を、前記キャッシュメモリに格納された前記カウンタ値が無効化されるまで繰り返し、
前記キャッシュメモリに格納された前記カウンタ値が無効化された場合、前記メモリから読み出した前記カウンタ値を前記キャッシュメモリに格納し、前記第１判定処理を実行する、
付記１記載の情報処理装置。
【０１０３】
（付記３）
前記待ち合わせ処理を終了する処理において、
前記メモリから読み出した前記カウンタ値を前記キャッシュメモリに格納し、
前記キャッシュメモリに格納された前記カウンタ値が前記複数のプロセッサの数と一致するか判定する第２判定処理を実行し、
前記キャッシュメモリに格納された前記カウンタ値が前記複数のプロセッサの数と一致しないと判定した場合、前記第２判定処理を、前記キャッシュメモリに格納された前記カウンタ値が無効化されるまで繰り返し、
前記キャッシュメモリに格納された前記カウンタ値が無効化された場合、前記メモリから読み出した前記カウンタ値を前記キャッシュメモリに格納し、前記第２判定処理を実行する、
付記２記載の情報処理装置。
【０１０４】
（付記４）
前記識別情報は識別番号であり、
前記カウンタ値を更新する処理において、
前記メモリにおける前記カウンタ値に１を加算する、
付記１乃至３のいずれか１つ記載の情報処理装置。
【０１０５】
（付記５）
前記所定の関係は、
前記メモリから読み出した前記カウンタ値と前記プロセッサに割り当てられた識別情報との差が所定値であるという関係である
付記１乃至４のいずれか１つ記載の情報処理装置。
【０１０６】
（付記６）
各々識別情報が割り当てられた複数のプロセッサと、前記複数のプロセッサの各々が次の処理を開始できるようになるまで待つ処理である待ち合わせ処理の状態を示すカウンタ値を格納するメモリとを有するコンピュータにおいて実行される待ち合わせ処理方法であって、
前記複数のプロセッサの各々が、
前記メモリから読み出した前記カウンタ値と当該プロセッサに割り当てられた識別情報とが所定の関係を有する場合、前記メモリにおける前記カウンタ値を更新し、
前記メモリから読み出した前記カウンタ値が前記複数のプロセッサの数と一致する場合、前記待ち合わせ処理を終了する、
処理を実行する待ち合わせ処理方法。
【０１０７】
（付記７）
複数のプロセッサのうち第１のプロセッサに、
メモリから読み出した、前記複数のプロセッサの各々が次の処理を開始できるようになるまで待つ処理である待ち合わせ処理の状態を示すカウンタ値と前記第１のプロセッサに割り当てられた識別情報とが所定の関係を有する場合、前記メモリにおける前記カウンタ値を更新し、
前記メモリから読み出した前記カウンタ値が前記複数のプロセッサの数と一致する場合、前記待ち合わせ処理を終了する、
処理を実行させるための待ち合わせ処理プログラム。
【０１０８】
（付記８）
各々識別情報が割り当てられた複数の情報処理装置と、
前記複数の情報処理装置の各々が次の処理を開始できるようになるまで待つ処理である待ち合わせ処理の状態を示すカウンタ値を格納し且つ前記複数の情報処理装置がアクセス可能な記憶装置と、
を有し、
前記複数の情報処理装置の各々は、
前記記憶装置から読み出した前記カウンタ値と当該情報処理装置に割り当てられた識別情報とが所定の関係を有する場合、前記記憶装置における前記カウンタ値を更新し、
前記記憶装置から読み出した前記カウンタ値が前記複数の情報処理装置の数と一致する場合、前記待ち合わせ処理を終了する、
情報処理システム。
【符号の説明】
【０１０９】
１  情報処理装置    １０，１１，１２，１Ｎ  ＣＰＵ
１０１，１１１，１２１，１１Ｎ  レジスタ
１０２，１１２，１２２，１２Ｎ  キャッシュメモリ
１０００  共有メモリ    １００１  待ち合わせ処理プログラムを格納する領域
１００２，１００３  カウンタ領域    １００４  フラグ領域
１００５  ＣＰＵ数を格納する領域
【図１】
0006500596.tif 000002
【図２】
0006500596.tif 000003
【図３】
0006500596.tif 000004
【図４】
0006500596.tif 000005
【図５】
0006500596.tif 000006
【図６】
0006500596.tif 000007
【図７】
0006500596.tif 000008
【図８】
0006500596.tif 000009
【図９】
0006500596.tif 000010
【図１０】
0006500596.tif 000011
【図１１】
0006500596.tif 000012
【図１２】
0006500596.tif 000013
【図１３】
0006500596.tif 000014