(57)【要約】【課題】特別なハードウェア機構の追加をせずに並列処理のオーバーヘッドを削減し、高速にマルチプロセッサ間でのバリア同期を行う。【解決手段】複数のプロセッサモジュールで複数のスレッドを並列的に実行するためのバリア同期を行う並列計算機の同期方法であって、前記並列計算機は、複数のプロセッサコアｃｐｕ０〜３を有するプロセッサモジュールＰ０、Ｐ１を複数備え、前記プロセッサコアのそれぞれに複数のスレッドＴｈ０〜Ｔｈ７を割り当ててマルチスレッド処理を実行させ、前記複数のスレッドＴｈ０〜Ｔｈ７を階層構造のグループＧｒに設定し、前記グループ毎にバリア同期を取る。【選択図】図４
2006259821.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサで複数のスレッドを並列的に実行するためのバリア同期を行う並列計算機の同期方法であって、
前記並列計算機は、複数のプロセッサコアを有するプロセッサを複数備え、前記プロセッサコアのそれぞれに複数のスレッドを割り当てて実行させる処理と、
前記複数のスレッドを階層構造のグループに設定する処理と、
前記グループ毎にバリア同期を取る処理と、
を含むことを特徴とする並列計算機の同期方法。
【請求項２】
前記グループ毎にバリア同期を取る処理は、
前記グループ内でバリア同期を取る処理と、
前記グループ間でバリア同期を取る処理と、
を含むことを特徴とする請求項１に記載の並列計算機の同期方法。
【請求項３】
前記並列計算機は、前記プロセッサコアがアクセスする主記憶との間に、前記スレッド間または前記複数のプロセッサコア間あるいは前記複数のプロセッサ間で共有可能な共有記憶域を階層的に備え、
前記複数のスレッドを階層構造のグループに設定する処理は、
前記共有記憶域の階層毎にバリア同期を行うグループを設定することを特徴とする請求項１または請求項２に記載の並列計算機の同期方法。
【請求項４】
前記グループ毎にバリア同期を取る処理は、
前記スレッドが予め設定したバリア同期ポイントに達したときに、当該スレッドが属するグループの共有記憶域に同期情報を書き込む処理と、
当該スレッドが属するグループの共有記憶域に格納された他のスレッドの同期情報を読み込む処理と、
当該スレッドの同期情報と他のスレッドの同期情報が一致したときに当該グループのバリア同期が完了したことを判定する処理と、
を含むことを特徴とする請求項３に記載の並列計算機の同期方法。
【請求項５】
前記グループ毎にバリア同期を取る処理は、
前記プロセッサコア側の共有記憶域を用いるグループを下位グループとし、主記憶側の共有記憶域を用いるグループを上位グループとして、下位グループのバリア同期が完了した後に、順次上位グループのバリア同期をとることを特徴とする請求項３に記載の並列計算機の同期方法。
【請求項６】
前記グループ毎にバリア同期を取る処理は、
前記プロセッサコア側の共有記憶域を用いるグループを下位グループとし、主記憶側の共有記憶域を用いるグループを上位グループとして、最上位のグループのバリア同期をハードウェアバリア同期機構により行うことを特徴とする請求項３に記載の並列計算機の同期方法。
【請求項７】
前記複数のスレッドを階層構造のグループに設定する処理は、
前記グループの階層毎に異なる共有記憶域を用いることを特徴する請求項３に記載の並列計算機の同期方法。
【請求項８】
前記複数のスレッドを割り当てて実行させる処理は、
前記プロセッサコアのうち使用するプロセッサコアの数を設定する処理と、
前記使用するプロセッサコアで実行させるスレッドの数を設定する処理と、
前記プロセッサコアの数とスレッドの数に基づいて使用するプロセッサコアにそれぞれスレッドを割り当てる処理と、
を含むことを特徴とする請求項１に記載の並列計算機の同期方法。
【請求項９】
前記複数のスレッドを割り当てて実行させる処理は、
前記使用するプロセッサコアに割り当てたスレッドに、固有の識別子を付与する処理と、
前記識別子の大小関係に応じて、同一グループ内のスレッドのひつとを親スレッドとし、他のスレッドを子スレッドとして設定する処理と、
をさらに含み、
前記グループ毎にバリア同期を取る処理は、
前記グループ間でバリア同期を行う際に、前記親スレッド同士でバリア同期を行うことを特徴とする請求項８に記載の並列計算機の同期方法。
【請求項１０】
前記複数のスレッドを割り当てて実行させる処理は、
前記使用するプロセッサコアに前記スレッドのバリア同期を行う同期スレッドを割り当てる処理を含み、
前記グループ毎にバリア同期を取る処理は、
前記グループ間でバリア同期を行う際に、前記同期スレッド同士でバリア同期を行うことを特徴とする請求項８に記載の並列計算機の同期方法。
【請求項１１】
前記グループ毎にバリア同期を取る処理は、
前記スレッドが予め設定したバリア同期ポイントに達したときに、当該スレッドが属するグループの共有記憶域に同期情報を書き込む処理と、
当該スレッドが属するグループの共有記憶域に格納された他のスレッドの同期情報を読み込む処理と、
当該スレッドの同期情報と他のスレッドの同期情報が所定時間を超えて一致しない場合には、前記他のスレッドに障害が発生したと判定する処理と、
前記障害の発生時には、前記他のスレッドの同期情報を異なるグループの共有記憶域に書き込む処理と、
を含むことを特徴とする請求項３に記載の並列計算機の同期方法。
【請求項１２】
複数のプロセッサコアを有するプロセッサを複数備えた並列計算機で、複数のプロセッサで複数のスレッドを並列的に実行してバリア同期を行うプログラムであって、
前記プロセッサコアのそれぞれに複数のスレッドを割り当てて実行させる手順と、
前記複数のスレッドを階層構造のグループに設定する手順と、
前記グループ毎にバリア同期を取る手順と、
を並列計算機に機能させることを特徴とするプログラム。
【請求項１３】
前記プロセッサコアのそれぞれに複数のスレッドを割り当てて実行させる手順は、
前記プロセッサコアのうち使用するプロセッサコアの数を設定する手順と、
前記使用するプロセッサコアで実行させるスレッドの数を設定する手順と、
前記プロセッサコアの数とスレッドの数に基づいて使用するプロセッサコアにそれぞれスレッドを割り当てる手順と、
を含み、
前記複数のスレッドを階層構造のグループに設定する手順は、
前記プロセッサコアから主記憶との間に配置されて、前記スレッド間または前記複数のプロセッサコア間あるいは前記複数のプロセッサ間で共有可能な共有記憶域の階層を設定する手順と、
前記共有記憶域の階層毎にバリア同期を行うグループを設定する手順と、
を含むことを特徴とする請求項１２に記載のプログラム。
【請求項１４】
前記プロセッサコアのそれぞれに複数のスレッドを割り当てて実行させる手順は、
予め設定された並列計算機で使用するプロセッサコアの数と予め設定したスレッドの数に基づいて使用するプロセッサコアにそれぞれスレッドを割り当てる手順と、
を含み、
前記複数のスレッドを階層構造のグループに設定する手順は、
予め設定された並列計算機の共有記憶域の階層毎にバリア同期を行うグループを設定する手順と、
を含むことを特徴とする請求項１２に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列計算機おけるバリア同期処理に関し、特に多重のバリア同期を実現する計算機に関する。
【背景技術】
【０００２】
複数のプロセッサにそれぞれスレッド（またはプロセス）を割り当てて、各プロセッサがそれぞれ演算を行う並列計算機では、各スレッドに予め設定されたバリア同期ポイントにてプロセッサ間の同期を取るバリア同期処理を行っている。
【０００３】
例えば、複数のプロセッサが共有メモリを相互に参照可能なＳＭＰ（Symmetric Multiple Processors）形式の並列計算機では、各プロセッサ上のスレッドは、それぞれ他のスレッドのデータにアクセスでき、演算結果をスレッド間で交換する。このため、各スレッド間では予め設定した演算処理が完了する度に同期を取って、各スレッドが次の演算を開始するためには、各スレッドの演算が予め設定した同期ポイントまで終了したことを確認するための同期処理が必要となる。プログラムで予め設定された同期ポイントに全てのプロセッサが到達しない限り、どのプロセッサも同期ポイントを超えて実行させないことで、プロセッサ間の同期を行っている。このようなプロセッサ間の同期処理を高速に行う技術として、ハードウェアによるバリア同期機構が知られている（例えば、特許文献１）。
【０００４】
また近年、ひとつのLSIパッケージに複数のプロセッサコアを実装するマルチコア・マイクロプロセッサが採用されつつあり、物理的なプロセッサコアを複数用意することで、並列処理の処理速度を向上しようというものである。さらに、アプリケーションやＯＳでは、一つのタスクを複数のスレッド（またはプロセス）に分割して並列処理を円滑に追考する高速化することが可能となっている。
【特許文献１】特開平１１−３１２４１８号
【発明の開示】
【発明が解決しようとする課題】
【０００５】
上記従来例では、ハードウェアバリア同期機構が一つのプロセッサ（チップ）に一つの信号線を提供しており、各プロセッサ間では一つのスレッドについて同期を取ることができるが、複数のスレッドを同期させることはできない。このため、一つのチップに複数のプロセッサコアを実装したマルチコア・マイクロプロセッサを採用し、マルチスレッドで並列処理を行おうとすると、プロセッサ側では複数のスレッドを並列的に処理することが可能であっても、同期処理はひとつのスレッドについてのみしか行えないため、並列処理を効率よく行うことができない、という問題が生じていた。
【０００６】
ハードウェアバリア同期機構が、複数の同期を取れるように各プロセッサコアに対して信号線を設けることも可能ではあるが、ハードウェアの構成が複雑になって並列計算機の価格が極めて高価になるという問題があり、さらに、ひとつのプロセッサコアに対して複数のスレッドを割り当てた場合には、ハードウェアバリア同期機構ではいずれかひとつのスレッドしか同期を取ることができず、複数のスレッドをひとつのプロセッサコアに割り当てるマルチスレッドによる並列処理を効率よく行うことができない、という問題があった。
【０００７】
そこで本発明は、上記問題点に鑑みてなされたもので、計算機の価格の上昇を抑制しながら、ひとつのプロセッサに複数のスレッドを割り当てる並列処理でスレッド間の同期を行うことを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、複数のプロセッサで複数のスレッドを並列的に実行するためのバリア同期を行う並列計算機の同期方法であって、前記並列計算機は、複数のプロセッサコアを有するプロセッサを複数備え、前記プロセッサコアのそれぞれに複数のスレッドを割り当ててマルチスレッド処理を実行させ、前記複数のスレッドを階層構造のグループに設定し、前記グループ毎にバリア同期を取る。
【０００９】
そしてグループ毎にバリア同期を取る処理は、グループ内でバリア同期を取る処理と、グループ間でバリア同期を取る処理と、を含んでいる。
【発明の効果】
【００１０】
したがって、本発明は、バリア同期を取るスレッドを階層構造のグループにまとめ、これら同期グループ毎にバリア同期処理を行うようにしたので、マルチコア・マイクロプロセッサを用いてひとつのプロセッサコアでマルチスレッド処理により並列処理を行う場合であっても、多数のスレッドの同期を確実に取ることができる。
【発明を実施するための最良の形態】
【００１１】
以下、本発明の実施形態を添付図面に基づいて説明する。
【００１２】
図１は、第１の実施形態を示し、本発明を適用するマルチコア・マイクロプロセッサを用いた共有メモリ型のマルチプロセッサシステムで並列計算機を構成する例を示す。
【００１３】
＜ハードウェア構成＞
図１において、並列計算機は複数のプロセッサモジュール（プロセッサ）Ｐ０〜Ｐ７からなるマルチプロセッサを有し、各プロセッサモジュールＰ０〜Ｐ７は、ひとつのモジュールに複数のプロセッサコア（図中ｃｐｕ０〜１５）を実装しており、ひとつのプロセッサモジュールＰ０には、２つのプロセッサコアが実装されている。例えば、プロセッサモジュールＰ０は、プロセッサコアｃｐｕ０とｃｐｕ１を備え、２つのＣＰＵが並列して動作可能となっている。
【００１４】
そして、プロセッサコアｃｐｕ０、ｃｐｕ１はそれぞれ独立した１次キャッシュメモリ（以下、１次キャッシュという）Ｌ１−０、Ｌ１−１を有する。さらに、２つのプロセッサコアｃｐｕ０、１の１次キャッシュＬ１−０、１は、プロセッサモジュールＰ０に設けたひとつの２次キャッシュメモリ（以下、２次キャッシュという）Ｌ２−０に接続されている。そして、１次キャッシュＬ１−０、Ｌ１−１は各プロセッサコアｃｐｕ０、１上で実行される複数のスレッド間で共有される共有記憶域（共有記憶部）として機能する。なお、本実施形態では各プロセッサコア上で実行されるスレッドは、プログラムを構成する単位（プロセスなど）であっても良いし、プログラムそのものであっても良い。また、各スレッドは同一の処理手順で構成されて異なるデータを処理し、バリア同期により並列処理を行うものであっても良いし、あるいは、各スレッドが異なる処理手順で構成されて、データを受け渡しするためにバリア同期により並列処理を行うものであっても良い。
【００１５】
２次キャッシュＬ２−０は２つのプロセッサコアｃｐｕ０、ｃｐｕ１に接続されて、これらのプロセッサコアｃｐｕ０、１で共有する共有記憶域として機能する。
【００１６】
他の各プロセッサモジュールＰ１〜Ｐ７も上記プロセッサモジュールＰ０と同様に構成され、それぞれひとつのモジュールに２つのプロセッサコアｃｐｕと２つの１次キャッシュＬ１−１〜７と、ひとつの２次キャッシュＬ２−１〜７を備えている。
【００１７】
各プロセッサモジュールＰ０〜Ｐ７は、３次キャッシュメモリ（以下、３次キャッシュという）Ｌ３に接続されており、この３次キャッシュＬ３は各プロセッサモジュールＰ０〜Ｐ７間で共有する共有記憶域として機能する。なお、図１においては、プロセッサモジュールＰ０〜Ｐ３（ｃｐｕ０〜７）でひとつの３次キャッシュＬ３を共有し、プロセッサモジュールＰ４〜Ｐ７（ｃｐｕ８〜１５）で異なる３次キャッシュＬ３を共有する例を示したが、ひとつの３次キャッシュＬ３をプロセッサモジュールＰ０〜Ｐ７で共有しても良い。また、３次キャッシュＬ３は、各プロセッサモジュールＰ０〜Ｐ７のフロントサイドバスに相当する位置に設けたが、図示はしないがバックサイドバスに設けても良い。
【００１８】
さらに、プロセッサモジュールＰ０〜Ｐ７間で共有される３次キャッシュＬ３は主記憶ＭＭに接続され、主記憶ＭＭはプロセッサモジュールＰ０〜Ｐ７（ｃｐｕ０〜１５）で共有される。なお、主記憶ＭＭは図示しないコントローラ（例えば、ノースブリッジ等のチップセットやスイッチ）を介して各プロセッサモジュールＰ０〜Ｐ７に接続され、また、各プロセッサモジュールＰ０〜Ｐ７は上記コントローラを介して外部記憶装置（例えば、ＨＤＤ）やネットワークインターフェースに接続される。
【００１９】
上記共有記憶域は、プロセッサコアｃｐｕ０〜１５側から主記憶ＭＭに向けて順に１次キャッシュＬ１（第１の共有記憶域）、２次キャッシュＬ２（第２の共有記憶域）、３次キャッシュＬ３（第３の共有記憶域）の順で階層的に配置され、プロセッサコアから離れる（主記憶ＭＭ側）につれて共有する範囲が同一のプロセッサコア上のスレッド間から、プロセッサコア間、プロセッサモジュール間と、上位の階層になるほど広くなる階層構造となっている。
【００２０】
そして、各プロセッサコアｃｐｕ０〜１５には、プロセッサコア間で並列処理のバリア同期を行うためのハードウェアバリア同期機構１００が接続される。
【００２１】
＜ハードウェアバリア同期機構＞
ハードウェアバリア同期機構１００は、図３で示すように、各プロセッサコアｃｐｕ０〜１５に接続されており、バリア同期処理を行うｃｐｕ０〜１５の範囲またはグループを設定するバリア同期範囲設定部１０１と、プロセッサコアｃｐｕ０〜１５毎にバリア同期ポイント（バリア同期の位置情報）に到達したプロセッサコアの情報を保持する同期ポイント到達情報保持部１０２を備えている。
【００２２】
ハードウェアバリア同期機構１００は、バリア同期範囲設定部１０１で設定されたグループのプロセッサコアが所定のバリア同期ポイントに到達すると、同期ポイント到達情報保持部１０２にバリア同期ポイントに到達したことを記録し、当該グループの全てのプロセッサコアがバリア同期ポイントに到達すると、このグループの全てのプロセッサコアに同期完了を通知する。なお、この通知は、前記従来例の特開平１１−３１２４１８号と同様に割り込みを用いても良いし、図３のように、プロセッサコアの１次キャッシュメモリＬ１等の所定の記憶域に同期完了を示す情報（例えば、終了フラグ等）を書き込むようにしても良い。
【００２３】
＜ソフトウェア構成＞
次に、図２は各プロセッサコアｃｐｕ０〜１５で実行される処理の一例を示し、各ｃｐｕ０〜１５にそれぞれ２つのスレッドＴｈ０〜３１を割り当てて、合計３２のスレッドを並列的に実行する例を示す。すなわち、ひとつのプロセッサモジュールには４つのスレッドが割り当てられ、モジュール上の２つのプロセッサコアにはそれぞれ２つのスレッドが均等に割り当てられる。
【００２４】
図２において、バリア同期処理を行うプロセッサモジュール（またはプロセッサコア）を同期グループＧｒとし、この同期グループの一例としてプロセッサモジュールＰ０、Ｐ１のプロセッサコアｃｐｕ０〜３のスレッドＴｈ０〜７の８つのスレッドでバリア同期処理を行う例について以下に説明する。
【００２５】
＜バリア同期グループ＞
図４は、上記図２に示した同期グループＧｒの詳細を示す。
【００２６】
２つのプロセッサコアを備えたプロセッサモジュールＰ０、Ｐ１に８つのスレッドを割り当ててバリア同期処理を行う際には、まず、バリア同期処理を行う同期グループを、ひとつのプロセッサコア上でスレッド間のバリア同期を行う最下位階層（第１階層）のグループと、同一のプロセッサモジュール内のプロセッサコア間でバリア同期を行う第２階層（上位階層）のグループと、プロセッサモジュール間でバリア同期を行う第３階層（最上位階層）に分ける。
【００２７】
ここで、同期グループの各階層は、各階層で共有可能な記憶域（共有記憶域）を有し、最下位階層（第１階層）は、同一のプロセッサコア上のスレッドのバリア同期を行う第１の同期グループとする。そして、同一のプロセッサコア上のスレッドが共有可能な１次キャッシュＬ１を共有記憶域とし、各スレッドは１次キャッシュＬ１に同期情報を書き込んで、同期をとる。
【００２８】
次に、上位階層となる第２階層は同一のプロセッサモジュール内のプロセッサコア間でスレッドのバリア同期を行う第２の同期グループとする。このため、同一のプロセッサモジュール内のプロセッサコア間で共有可能な２次キャッシュＬ２を共有記憶域とし、各プロセッサコアのスレッドのうち、一つのスレッドを親スレッドとして、各プロセッサコアの親スレッドが２次キャッシュＬ２に同期情報を書き込んで、親スレッド間で同期をとる。
【００２９】
次に、第３階層（最上位階層）はプロセッサモジュール間でスレッドのバリア同期を行う第３の同期グループとする。同一のプロセッサモジュール上の複数の親スレッドの内の一つをプロセッサモジュールの親スレッドとし、各プロセッサモジュールは親スレッド同士で同期を取る。本実施形態では、プロセッサモジュールは親スレッドはハードウェアバリア同期機構１００を用いて同期を取る。
【００３０】
つまり、同期グループの各階層は、共有記憶域または共有するバリア同期機構の階層毎に設定される。
【００３１】
そして、同期グループを構成するスレッドに同期グループＧｒ内で一意の識別子としてのスレッド番号（スレッドの識別子）を割り当て、上記各階層内で最も小さいスレッド番号をもつスレッドを親スレッドとし、その他を子スレッドとする。
【００３２】
最下位階層（第１同期グループ）は、同一プロセッサコア上で複数のスレッドのバリア同期をとる階層であり、図４において、プロセッサモジュールＰ０のプロセッサコアｃｐｕ０には、スレッドＴｈ０、Ｔｈ１が割り当てられ、これらスレッドＴｈ０、１はプロセッサコアｃｐｕ０上でバリア同期をとる最下位階層の同期グループを構成する。
【００３３】
そして、最下位階層の同期グループは、プロセッサコアｃｐｕ０の１次キャッシュＬ１を共有記憶域とし、図５で示すように、プロセッサコアｃｐｕ０の１次キャッシュＬ１−０で予め設定したキャッシュライン上に、スレッドＴｈ０の同期情報を記憶する記憶域Ｌ１００と、スレッドＴｈ１の同期情報を記憶する記憶域Ｌ１０１を設定する。複数のスレッドが１つのキャッシュラインに書込みを行うことによるキャッシュラインの競合が発生しないようにするため、書き込むキャッシュラインはスレッド毎にずらして設定する。なお、同期情報としては、後述するようにバリア同期ポイントのＩＤ（同期ＩＤ番号）の他、フラグなどを用いることができる。
【００３４】
各スレッドＴｈ０、Ｔｈ１は同期情報の記憶域Ｌ１００とＬ１０１の内容が一致したときに、最下位階層のバリア同期が完了したと判定する。
【００３５】
プロセッサコアｃｐｕ１〜３上の各スレッドＴｈ２〜Ｔｈ７もプロセッサコアｃｐｕ０と同様に設定され、各プロセッサコアｃｐｕ１〜３の１次キャッシュＬ１−１〜３を共有記憶域として、同一プロセッサコア上のスレッドの同期情報を格納する記憶域Ｌ１１０、Ｌ１１１、Ｌ１２０、Ｌ１２１、Ｌ１３０、Ｌ１３１を各プロセッサコアの１次キャッシュＬ１−１〜３に設定する。
【００３６】
そして、各プロセッサコアｃｐｕ０〜３では、スレッド番号の小さいものをそれぞれプロセッサコアの親スレッドとし、プロセッサコアｃｐｕ０の親スレッドはスレッドＴｈ０となり、プロセッサコアｃｐｕ１の親スレッドはＴｈ２で、同様に、プロセッサコアｃｐｕ２、３の親スレッドはスレッドＴｈ４、Ｔｈ６となる。
【００３７】
第２階層（上位階層）は、同一のプロセッサモジュール内のプロセッサコア間でバリア同期を取る階層であり、図４において、プロセッサモジュールＰ０のプロセッサコアｃｐｕ０の親スレッドＴｈ０と、プロセッサコアｃｐｕ１の親スレッドＴｈ２が共有記憶域である２次キャッシュＬ２−０のキャッシュラインを用いて親スレッド同士の同期をとる第２の同期グループである。１次キャッシュＬ１−０のキャッシュと同じように複数のスレッドが同じキャッシュラインに書込みをすることにより発生するキャッシュライン競合を避けるため、スレッド毎にキャッシュラインをずらして同期の書込みを行う。
【００３８】
例えば、プロセッサモジュールＰ０では、第２階層の同期グループが、プロセッサコアｃｐｕ０、１で共有する２次キャッシュＬ２を共有記憶域とし、図５で示すように、プロセッサコアｃｐｕ０、１で共有する２次キャッシュＬ２−０の予め設定したキャッシュライン上に、プロセッサコアｃｐｕ０の親スレッドＴｈ０の同期情報を記憶する記憶域Ｌ２００と、プロセッサコアｃｐｕ１の親スレッドＴｈ２の同期情報を記憶する記憶域Ｌ２０１を設定する。
【００３９】
各親スレッドＴｈ０、Ｔｈ２は同期情報の共有記憶域Ｌ２００とＬ２０１の内容が一致したときに、プロセッサモジュールＰ０の第２階層のバリア同期が完了したと判定する。
【００４０】
プロセッサコアｃｐｕ２、３上の各スレッドＴｈ４〜Ｔｈ７もプロセッサモジュールＰ０と同様に設定され、各プロセッサコアｃｐｕ２、３の２次キャッシュＬ２−１を共有記憶域として、同一プロセッサモジュール内の各プロセッサコアの親スレッドＴｈ４、Ｔｈ６の同期情報を格納する記憶域Ｌ２１０、Ｌ２１１をこの２次キャッシュＬ２−１に設定し、共有記憶域Ｌ２１０とＬ２１１の内容が一致したときに、プロセッサモジュールＰ１の第２階層のバリア同期が完了したと判定する。
【００４１】
第３階層（最上位階層）は、プロセッサモジュール間のバリア同期を取る階層であり、図４において、プロセッサモジュールＰ０のプロセッサコアｃｐｕ０の親スレッドＴｈ０と、プロセッサモジュールＰ１のプロセッサコアｃｐｕ２の親スレッドＴｈ４が同期をとる第３階層の同期グループを構成する。
【００４２】
そして、第３階層の同期グループは、ハードウェアバリア同期機構１００でプロセッサモジュールの親スレッド同士のバリア同期を行うため、図３に示したバリア同期範囲設定部１０１に同期グループを構成するプロセッサモジュールＰ０、Ｐ１の親スレッドＴｈ０、Ｔｈ４が実行されるプロセッサコアｃｐｕ０、２を同期対象として設定する。
【００４３】
上記同期グループの１次キャッシュＬ１、２次キャッシュＬ２及びハードウェアバリア同期機構１００の設定は、後述するように、スレッドＴｈ０〜Ｔｈ７で構成されるプログラム（ロードモジュール）により実行される。
【００４４】
＜ソフトウェアの詳細＞
図６は、プロセッサモジュールＰ０、Ｐ１の同期グループで実行されるプログラム（ロードモジュール）の概要を示す。
【００４５】
同期グループで実行されるプログラムＰＧは、使用するプロセッサコアの数など並列計算機で使用するリソースに応じてスレッドを起動し、各スレッドをプロセッサコアに割り付け、バリア同期処理の設定を行う初期設定処理ＰＧ１と、各スレッドで所定の演算を行って予め設定されたバリア同期ポイントでバリア同期を行う演算処理ＰＧ２から構成される。
【００４６】
上記初期設定処理ＰＧ１では、使用するリソースに応じたスレッドを起動し、指示または予め設定されたプロセッサコアにそれぞれスレッドを割り付ける。その後、上記図４で示したように、スレッドの親子関係を設定し、同期グループ内でバリア同期の階層化を行いバリア同期処理の初期化を行う。
【００４７】
このように設定された同期グループで、各プロセッサコアに割り付けられた各スレッドでは演算処理を行い、所定のバリア同期ポイントでバリア同期を実行するのである。
【００４８】
なお、プログラムＰＧは、並列計算機上で実行される図示しないＯＳやミドルウェア上で実行されるものとする。
【００４９】
＜初期設定＞
図７、図８は、上記図６に示したプログラム（ロードモジュール）ＰＧのうち初期設定処理ＰＧ１の詳細を示すフローチャートで、図９、図１０は上記図６に示したプログラムＰＧの演算処理ＰＧ２のうちバリア同期処理の詳細を示すフローチャートである。
【００５０】
図７において、初期設定処理ＰＧ１は、並列計算機の任意のプロセッサモジュールで実行され、まず、Ｓ１では、使用するプロセッサコア（ＣＰＵ）の数Ｎと、起動するスレッドの数Ｍを入力する（ただし、Ｍ、Ｎは自然数）。この入力は、例えば図示しないネットワークを介して管理コンソールなどから管理者などが入力し、初期設定処理ＰＧ１は演算処理ＰＧ２を実行するプロセッサコアの数Ｎとスレッドの数Ｍを設定する。そして、プロセッサコア数Ｎとスレッド数Ｍを主記憶ＭＭの所定の記憶域に格納しておく。
【００５１】
そしてＳ２で、初期設定処理ＰＧ１は、プロセッサコア数Ｎに対応するプロセッサコアの番号（図中ＣＰＵＩＤ＝プロセッサコアの識別子）を図示しないＯＳやミドルウェアなどから取得する。例えば、上記図４の例では、プロセッサコア数Ｎ＝４、スレッド数Ｍ＝８となり、プロセッサモジュールＰ０、Ｐ１を使用する場合には、プロセッサコア番号は０〜３となる。
【００５２】
次に、Ｓ３では、設定されたスレッドの数Ｍがプロセッサコアの数Ｎより大きいか否かを判定する。換言すれば、マルチスレッド処理かシングルスレッド処理かを判定する。
【００５３】
ひとつのプロセッサコアに複数のスレッドを割り当てるマルチスレッド処理の場合にはＳ４に進み、ひとつのプロセッサコアにひとつのスレッド割り当てるシングルスレッド処理であればＳ１１に進む。このシングルスレッド処理を行うＳ１１〜Ｓ１３は前記従来例と同様であり、上記Ｓ１、Ｓ２で取得したプロセッサコア番号にそれぞれ１つずつスレッドを割り当て、プロセッサコア番号毎に割り当てたスレッドを起動する（Ｓ１１）。
【００５４】
そして、プロセッサコア番号の小さい順にスレッド番号Ｔｈ（ｘ）を割り当て（Ｓ１２）、ハードウェアバリア同期機構１００に、同期するスレッドを実行するプロセッサコア番号を通知し、演算処理ＰＧ２でハードウェアバリア同期機構１００のみを使用してバリア同期処理を行うように設定する（Ｓ１３）。
【００５５】
一方、マルチスレッド処理の場合には、Ｓ４に進んで、上記Ｓ１で設定されたプロセッサコア数Ｎ（プロセッサコア番号）とスレッドの数Ｍから、１つのプロセッサコアにＭ／Ｎのスレッド数を割り当てる。ここでは、プロセッサコア番号＝ｉ〜ｉ＋（Ｎ−１）に、Ｍ／Ｎの商に対応する数のスレッド数を割り当て、さらにＭ／Ｎの結果に余りがあればプロセッサコア番号の小さい順に余りのスレッド数を一つずつ割り当てる。そしてＳ５で、各スレッドを起動する。
【００５６】
次に、Ｓ６では、プロセッサコア番号＝ｉ〜ｉ＋（Ｎ−１）に割り当てた各スレッドにそれぞれスレッド番号Ｔｈ（ｘ）を割り当てる。この割り当ては、プロセッサコア番号の小さい順に、０番から（Ｎ−１）番を割り当てる。なお、このプロセッサコア番号とスレッド番号の割り当ての結果は、主記憶ＭＭなどの所定の記憶域に格納しておく。
【００５７】
例えば、上記図４の例では、Ｎ＝４、ｉ＝０であるので、プロセッサコア番号＝０〜３に、スレッド数＝２を割り当て、プロセッサコア番号＝０（ｃｐｕ０）のスレッドにスレッド番号（スレッドＩＤ）Ｔｈ０、Ｔｈ１を割り当て、プロセッサコア番号＝１（ｃｐｕ１）のスレッドにスレッド番号Ｔｈ２、Ｔｈ３を割り当て、プロセッサコア番号＝２、３には同様にＴｈ４〜７を割り当てる。これにより、各プロセッサコアで実行されるスレッド番号とプロセッサコア番号の対応関係が決まり、どのプロセッサコアでどのスレッド番号が実行されるかが決定される。
【００５８】
次に、Ｓ７では同期グループＧｒの階層構造を決定するため、使用するプロセッサコア数Ｎから、次式によりプロセッサモジュール数Ｋを求める。
【００５９】
Ｋ＝Ｎ／ＣＯＲＥ  ………（１）
ただし、ＣＯＲＥは一つのプロセッサモジュールが有するプロセッサコアの数を示し、本実施形態の例では、ＣＯＲＥ＝２である。なお、汎用性を持たせる場合には、このＳ７でひとつのプロセッサモジュールが有するプロセッサコアの数Ｎを入力するようにしてもよい。
【００６０】
そして、Ｓ８では、上記Ｓ７で求めた使用プロセッサモジュール数Ｋから次式により、図４に示したバリア同期グループＧｒの階層数Ｆを決定する。
【００６１】
Ｆ＝Ｋ＋１  ………（２）
例えば、図４の例では、使用プロセッサモジュール数Ｋ＝４／２＝２であるからバリア同期グループＧｒは階層数Ｆ＝３となり、１次キャッシュＬ１で同一プロセッサコアのスレッドの同期を取る第１の同期グループと、２次キャッシュＬ２で同一プロセッサモジュールの親スレッド同士のバリア同期を取る第２のバリアループと、ハードウェアバリア同期機構１００によりプロセッサモジュールＰ０、Ｐ１の親スレッド同士の同期を取る第３の同期グループの３階層となる。
【００６２】
なお、上記（２）式は２つのプロセッサコアｃｐｕ０、１で一つの２次キャッシュＬ２−０を共有する場合のものであり、プロセッサコアやプロセッサモジュールが２次キャッシュＬ２、３次キャッシュＬ３を共有する形態に応じて上記（２）式を適宜変更すればよい。また、階層数Ｆを自動的に計算できない場合や、計算された階層数Ｆを変更したい場合には、管理コンソールなどから階層数Ｆを入力するようにしても良い。
【００６３】
Ｓ９では、上記同期グループＧｒの階層数Ｆに基づいて、第１階層（第１同期グループ）から第２階層（第２同期グループ）までのバリア同期の設定を行う。つまり、各階層毎にバリア同期を行う共有記憶域（キャッシュなど）に同期情報を格納する領域を設定する。この処理は、図８のフローチャートに基づいて行われ、本実施形態では、第３階層をハードウェアバリア同期機構１００で行うため、Ｓ９の各階層のバリア同期の設定は、第１階層と第２階層のみとしている。
【００６４】
図８において、Ｓ２０ではスレッド番号Ｔｈ（ｊ）を参照する変数ｊを０に初期化し、Ｓ２１では第ｉ階層を参照する変数ｉを１に初期化する。
【００６５】
Ｓ２２では、現在のｊの値に応じてスレッド番号Ｔｈ（ｊ）の情報を取得する。Ｓ２３では、現在の変数ｉの値に応じて第ｉ階層で同期するスレッドの情報（同一階層で同期するスレッド番号など）を取得する。
【００６６】
Ｓ２４では、変数ｉ＝１であるか、すなわち、第１階層であるか否かを判定して、第１階層であればＳ２６に進む一方、第１階層よりも上位の階層であればＳ２５に進む。
【００６７】
Ｓ２５では、現在参照しているスレッド（Ｔｈ（ｊ））が、一つ下位の階層（ｉ−１階層）で親スレッドであるか否かを判定する。参照しているスレッドＴｈ（ｊ）が一つ下位の階層で親スレッドであればＳ２６に進み、そうでなければＳ３０に進んで次のループに進む。
【００６８】
Ｓ２６では、現在参照している第ｉ階層を構成するスレッドの中で、参照しているスレッドのスレッド番号Ｔｈ（ｊ）が最も小さいか否かを判定する。スレッド番号Ｔｈ（ｊ）が同一階層内で最も小さければこのスレッド番号Ｔｈ（ｊ）のスレッドを第ｉ階層の親スレッドとし（Ｓ２７）、そうでなければ第ｉ階層の子スレッドとする（Ｓ２８）。
【００６９】
上記Ｓ２７、Ｓ２８で同一階層内でスレッドの親子関係を設定すると、Ｓ２９で第ｉ階層に対応する共有記憶域に、親スレッドの同期情報を格納する領域と、子スレッドの同期情報を格納する領域を設定する。
【００７０】
現在参照している階層に関する処理が完了すると、Ｓ３０に進んで次の階層を参照するため、変数ｉに１を加算する。そして、Ｓ３１では、加算後の変数ｉで参照する階層が最上位階層（本実施形態では第３階層）に達したか否かを判定する。最上位階層に達した場合には次のスレッドを参照するためにＳ３２へ進み、最上位階層に達していない場合には次の階層について共有記憶域を用いたバリア同期を設定するため、Ｓ２３に戻る。
【００７１】
同期グループＧｒの階層が最上位階層に達したＳ３２では、次のスレッドについて同期グループの設定を行うため、参照するスレッド番号Ｔｈ（ｊ）の変数ｊに１を加算して、次のスレッド番号を参照するように設定する。
【００７２】
そして、Ｓ３３では加算後の変数ｊが最後のスレッド番号Ｔｈ（Ｍ−１）を超えたか否かを判定し、最後のスレッド番号Ｔｈ（Ｍ−１）を超えていなければ次のスレッドを参照するためにＳ２２へ戻る。一方、最後のスレッド番号Ｔｈ（Ｍ−１）を超えていればＳ２０〜Ｓ３３のサブルーチンを終了して図７のＳ１０に進む。
【００７３】
図７のＳ１０では、プロセッサモジュール間でスレッドのバリア同期を取る第３階層（第３同期グループ）の設定を行う。本実施形態では、第３階層を最上位階層として、第３階層のバリア同期をハードウェアバリア同期機構１００で行うため、同期グループＧｒのプロセッサモジュールで実行されるスレッドのうち、各プロセッサモジュールでスレッド番号が最も小さいものをそれぞれ選択する。そして、選択したスレッドを実行するプロセッサコアをバリア同期範囲設定部１０１に設定し、第３階層のバリア同期を設定する。
【００７４】
上記図７、図８のフローチャートによるバリア同期の初期設定を、図４の例で行った場合を以下に示す。
【００７５】
図４の例では、使用プロセッサコア数Ｎ＝４、スレッドの数Ｍ＝８であるのでマルチスレッド処理となり、一つのプロセッサコアに２つずつスレッドを割り当てる。４つのプロセッサコアをプロセッサモジュールＰ０、Ｐ１に割り当て、使用するプロセッサコア番号はｃｐｕ０〜ｃｐｕ３となる（Ｓ１〜Ｓ３）。
【００７６】
各プロセッサコアｃｐｕ０〜ｃｐｕ３に割り当てたスレッドに、プロセッサコア番号の小さいものから順にスレッド番号Ｔｈを割り当てる。この結果、図４で示すように、スレッドＴｈ０〜Ｔｈ７が設定される（Ｓ４〜Ｓ６）。
【００７７】
次に、同期グループＧｒの階層は、プロセッサモジュールのプロセッサコア数ＣＯＲＥが２であるので、使用プロセッサモジュール数は２となり階層数Ｆ＝３となり、バリア同期グループは３階層のバリア同期グループで構成される（Ｓ８）。
【００７８】
次に、図８のバリア同期設定のサブルーチンにて、各スレッド毎に各階層の設定を行う。
【００７９】
まず、ｉ＝１、ｊ＝０であるから（Ｓ２０、Ｓ２１）、スレッドＴｈ０について第１階層の設定を行う。スレッドＴｈ０はプロセッサコアｃｐｕ０で実行され、第１階層となる同一プロセッサコアｃｐｕ０で同期させるスレッドはＴｈ１がある（Ｓ２２、Ｓ２３）。
【００８０】
現在参照しているスレッドＴｈ０のスレッド番号０と第１階層の他のスレッド番号１を比較し、自スレッドのスレッド番号方が小さいため、このスレッドＴｈ０は第１階層の親スレッドとなる（Ｓ２６、Ｓ２７）。
【００８１】
そして、第１階層に対応する共有記憶域として１次キャッシュＬ１−０の所定のキャッシュラインの先頭に同期情報を格納する記憶域Ｌ１００を設定し（Ｓ２９）、第１階層の設定を終了する。
【００８２】
次に図８のＳ２３に戻り、ｉ＝２として第２階層についてスレッドＴｈ０の設定を行う。第２階層は同一プロセッサモジュール内のプロセッサコア間のバリア同期であり、同期するスレッドは、図４で示すように、ｃｐｕ１のスレッドＴｈ２、Ｔｈ３となる（Ｓ２３）。
【００８３】
次に、現在参照しているスレッドＴｈ０は、一つ下の階層で親スレッドであるので、プロセッサコアｃｐｕ１のスレッドＴｈ２、Ｔｈ３とスレッド番号を比較する。この結果スレッドＴｈ０のスレッド番号０が最小であるので、第２階層の親スレッドに設定される（Ｓ２６、Ｓ２７）。
【００８４】
そして、第２階層に対応する共有記憶域として２次キャッシュＬ２−０の所定のキャッシュラインの先頭に、同期情報を格納する記憶域Ｌ２００を設定し（Ｓ２９）、第２階層の設定を終了する。この後、変数ｉをインクリメントするとｉ＝３となるので、次の参照スレッドをＴｈ１としてＳ２２へ戻る。
【００８５】
上記と同様に同一階層内の情報取得し、第１階層から順にバリア同期の設定を行う。このスレッドＴｈ１は第１階層ではスレッド番号１が最小ではないので、第１階層の子スレッドに設定され、第１階層に対応する１次キャッシュＬ１−０の所定のキャッシュラインの２番目の記憶域Ｌ１０１に同期情報を格納するよう設定する（Ｓ２９）。
【００８６】
第２階層においては、一つ下位の階層（第１階層）では親スレッドではないので、第２階層の同期スレッドには設定されずに設定を終了する。
【００８７】
他のスレッドＴｈ２〜Ｔｈ７も上記と同様に各階層でバリア同期の設定が行われ、最後に各プロセッサモジュールＰ０、Ｐ１の親スレッドであるＴｈ０とＴｈ４をハードウェアバリア同期機構１００に同期グループとして設定し、最上位階層の第３階層の設定を終了する。なお、ハードウェアバリア同期機構１００が行う第３階層の同期完了の条件は、同一階層内のスレッドＴｈ０とスレッドＴｈ４のバリア同期が完了したときが同期完了の条件である。
【００８８】
＜バリア同期処理＞
上記図７、図８の初期設定によりスレッドを割り当てられたプロセッサモジュールで行われる演算処理のうち、バリア同期処理について図９、図１０のフローチャートを参照しながら説明する。図９は最下位階層（第１階層）で行われる処理で、図１０は上位階層（第２階層）で行われる処理を示し、各処理は所定の周期で実行される。なお、最上位階層となる第３階層はハードウェアバリア同期機構１００を用いるため、フローチャートは省略した。
【００８９】
図９において、第１階層の同期グループの処理は、まず、Ｓ４１で演算処理が所定の同期ポイントに到達していればＳ４２以降のバリア同期処理へ進み、同期ポイントに達していなければ演算処理を継続する。
【００９０】
同期ポイントに到達したＳ４２では、第１階層の共有記憶域である１次キャッシュＬ１の所定の記憶域に同期ポイントのＩＤ（同期位置の識別子＝同期情報）を書き込む。
【００９１】
Ｓ４３では、自スレッドが親スレッドであるか否かを判定し、親スレッドの場合はＳ４４以降の処理へ進み、子スレッドの場合にはＳ５２に進んで、同一の第１階層の親スレッドから同期ポイントに達した通知（同期完了通知）を待ち、通知を受けると同期処理を終了して次の演算処理に進む。なお、この同期完了の通知は、上述のように前記記憶域に同期完了を示す情報を書き込むことで行われる。
【００９２】
親スレッドの場合のＳ４４では、１次キャッシュＬ１の所定のキャッシュラインから、同一の第１階層の子スレッドの同期ポイントＩＤを読み込み、Ｓ４５で親スレッドの同期ポイントＩＤと全ての子スレッドの同期ポイントＩＤが一致した場合にはバリア同期が完了したと判定してＳ４６に進む。なお、一致しない場合には全ての子スレッドの同期ポイントＩＤが親スレッドの同期ポイントＩＤと一致するのを待つ。
【００９３】
Ｓ４６では、上記初期設定のＳ８で求めた同期グループの階層数Ｆが１より大きい、換言すれば上位階層があるか否かを判定し、上位階層があればＳ４７に進み、第１階層のみであればＳ５０に進む。
【００９４】
Ｓ４７では、上位階層（第２階層）へ第１階層のバリア同期が完了したことを通知する。次いで、Ｓ４８では図１０に示す上位階層（第２階層）のバリア同期処理を行う。
【００９５】
Ｓ４９では、上位階層（第２階層）のバリア同期処理から同期完了の通知を待ち、上位階層から同期完了の通知を受けるとＳ５０に進んで、全ての子スレッドにバリア同期の完了を通知する。
【００９６】
そして、Ｓ５１で各子スレッドへの完了通知を順次行って、全ての子スレッドへの通知が完了するとバリア同期処理を終了し、次の演算処理を開始する。
【００９７】
すなわち、図４において、スレッドＴｈ０の場合、第１階層の親スレッドであるので、自スレッドが同期を完了すると、図５の１次キャッシュＬ１−０の記憶域Ｌ１００に同期ポイントＩＤを書き込んで、子スレッドであるスレッドＴｈ１の記憶域Ｌ１０１を監視する。
【００９８】
そして、子スレッドＴｈ１の記憶域Ｌ１０１に同一の同期ポイントＩＤが書き込まれると、同期グループの階層数Ｆが２以上であるかを判定してから後述する図１０に示す第２階層のバリア同期処理を行う。
【００９９】
図１０の処理を終了すると、第１階層の上位階層である第２階層からの同期完了の通知を待つ。第２階層からの同期完了通知を受けると、全ての子スレッド（この場合ではＴｈ１）に同期完了を通知し、子スレッドが同期完了を受信したのを確認するとバリア同期処理を完了し、次の演算処理を開始する。各スレッドは上記処理をバリア同期ポイントに到達する度に実行することで同期を取る。
【０１００】
次に、図１０の上位階層（第２階層）のバリア同期処理について説明する。
【０１０１】
図１０の処理は、下位階層のバリア同期が完了してから実行されるもので、Ｓ６１では自スレッドが同期ポイントに達しているので、第２階層に対応する共有記憶域である２次キャッシュＬ２の所定の記憶域に同期ポイントＩＤを書き込む。
【０１０２】
そして、Ｓ６２でスレッドの親子関係を判定し、親スレッドであれば、同期すべき子スレッドの２次キャッシュＬ２の記憶域を監視し、全ての子スレッドの同期ポイントＩＤが一致したら第２階層及び下位階層の同期が完了したと判定し上位階層のバリア同期処理（ここではハードウェアバリア同期機構１００）に同期完了を通知する（Ｓ６３〜Ｓ６５）。この通知は、２次キャッシュＬ２に同期完了を示す情報を書き込むことで行われる。
【０１０３】
次に、Ｓ６６では、上位階層（第３階層）のバリア同期処理（ハードウェアバリア同期機構１００）から同期完了の通知を待ち、第３階層から同期完了の通知を受けると、Ｓ６７で全ての子スレッドにバリア同期完了を通知し、Ｓ６８で全子スレッドが同期完了を受信すると上位階層のバリア同期処理を完了し、図９の処理に戻る。
【０１０４】
上記バリア同期処理を、図４に示した例で行った場合は、次のようになる。まず、図９の処理で、第１階層及び第２階層の親スレッドであるスレッドＴｈ０がバリア同期ポイントに到達すると、図５の１次キャッシュＬ１−０の記憶域Ｌ１００に同期ポイントＩＤを書き込み（Ｓ４２）、子スレッドＴｈ１の記憶域Ｌ１０１を監視して同期ポイントＩＤが一致するのを待つ（Ｓ４５）。記憶域Ｌ１００、Ｌ１０１の同期ポイントＩＤが一致すると第１階層の同期完了を第２階層へ通知する。これにより、同一プロセッサコアｃｐｕ０内のスレッドＴｈ０、１の同期が完了する。
【０１０５】
その後、図１０の処理に移り第２階層のバリア同期処理を行う。スレッドＴｈ０は、同期ポイントに到達したので第２階層バリア同期処理に対応する２次キャッシュＬ２−０の記憶域Ｌ２００に同期ポイントＩＤを書き込み（Ｓ６２）、子スレッドＴｈ２の記憶域Ｌ２０１を監視して同期ポイントＩＤが一致するのを待つ（Ｓ６５）。記憶域Ｌ２００、Ｌ２０１の同期ポイントＩＤが一致すると第２階層のバリア同期が完了する。そして、第２階層の同期完了を第３階層（ハードウェアバリア同期機構１００）へ通知する。
【０１０６】
この後、第２階層のバリア同期処理は、ハードウェアバリア同期機構１００からの同期完了通知を待ち（Ｓ６８）、ハードウェアバリア同期機構１００が第３階層のスレッドＴｈ０とスレッドＴｈ４の同期完了を検知すると、第２階層のスレッドＴｈ０、４に同期完了を通知する。この同期完了通知に基づいて第２階層のスレッドＴｈ０は、第２階層の子スレッドＴｈ２に同期完了の通知を行い、全ての子スレッドに同期完了通知を送ると第２階層のバリア同期処理を完了する（Ｓ６９、Ｓ７０）。
【０１０７】
その後、図９の第１階層のバリア同期処理に戻り、第１階層のバリア同期処理は、第２階層のバリア同期処理から同期完了の通知を受けたので（Ｓ４８）、第１階層の子スレッドＴｈ１に同期完了を通知し、全ての子スレッドに通知を行うと、バリア同期処理を完了する。
【０１０８】
以上のように、プロセッサコア内とプロセッサモジュール内で、プロセッサコアに近い共有記憶域から主記憶ＭＭ側に階層化した同期グループを複数設定し、これら同期グループ毎にバリア同期処理を行い、最上位層のみハードウェアバリア同期機構１００を用いることで、マルチコア・マイクロプロセッサを用いてひとつのプロセッサコアでマルチスレッド処理により並列処理を行う場合であっても、多数のスレッドの同期を確実に取ることができる。
【０１０９】
したがって、既存のハードウェアバリア同期機構１００を用いながらマルチコア・マイクロプロセッサを用いたマルチスレッドの並列処理においてバリア同期を行うことが可能となるので、並列計算機の価格が上昇するのを防ぎながら、多数のスレッド間のバリア同期を実現できるのである。
【０１１０】
そして、同一プロセッサコアのスレッドの同期には、プロセッサコア内の１次キャッシュＬ１を用い、同一プロセッサモジュール内のスレッドの同期には、プロセッサモジュール内の２次キャッシュＬ２を用いることで、各親スレッドから最も遅延の少ない共有記憶域にアクセスすることで、処理の高速化を図ることができ、並列処理の高速化を図ることができるのである。
【０１１１】
また、バリア同期処理に用いる共有記憶域を、階層毎に異なる記憶装置（キャッシュまたは主記憶）に配置することで、異なる同期グループで記憶域が競合するのを確実に回避でき、バリア同期処理を正確に行うことが可能となるのである。
【０１１２】
さらに、プロセッサコア上あるいはプロセッサコア間でバリア同期を行う場合は、１次キャッシュＬ１や２次キャッシュＬ２などプロセッサコアからのアクセスに関するレイテンシイが少ない共有記憶域を用いたソフトウェアでバリア同期を行い、プロセッサモジュール間のバリア同期などプロセッサコアから遠くアクセスに関するレイテンシイが大きくなるバリア同期にハードウェアバリア同期機構１００を用いることで、最下位階層から最上位階層までのバリア同期を高速に行うことが可能となる。
【０１１３】
図１１は、階層数Ｆが２の場合を示し、４つのスレッドＴｈ０〜３を２つのプロセッサコアｃｐｕ０、１に割り当てて、一つのプロセッサモジュールＰ０内で同期グループが形成される例を示す。
【０１１４】
プロセッサコアｃｐｕ０には２つのスレッドＴｈ０、１が割り当てられ、プロセッサコアｃｐｕ１には２つのスレッドＴｈ２、３が割り当てられて、同一プロセッサコア上のスレッドが第１階層の同期グループを構成する。
【０１１５】
そして、プロセッサコアｃｐｕ０のスレッドＴｈ０とプロセッサコアｃｐｕ１のスレッドＴｈがそれぞれ各プロセッサコアの親スレッドとなり、第２階層はハードウェアバリア同期機構１００を用いてバリア同期を行う。この例では、プロセッサコア間のバリア同期に２次キャッシュＬ２を用いずに、第２階層を最上位階層として扱い、バリア同期機構１００を用いる点が上記図７〜図１０と異なっている。
【０１１６】
図１２は、上記図１１のように、第２階層でハードウェアバリア同期機構１００を用いる場合のバリア同期処理の一例を示すフローチャートで、上記図９に代わって実行するものである。
【０１１７】
Ｓ４１〜Ｓ４５までは上記図９と同様であり、自スレッドがバリア同期ポイントに到達したら第１階層の共有記憶域に対応する１次キャッシュＬ１の所定の記憶域に同期ポイントＩＤを書き込んで、自スレッド親スレッドであれば子スレッドがバリア同期ポイントに到達するのを待つ。
【０１１８】
同期が完了すると、親スレッドはＳ４６Ａでハードウェアバリア同期機構１００に同期完了の通知を行う。
【０１１９】
そして、Ｓ４８ではハードウェアバリア同期機構１００からの同期完了の通知を待ち、ハードウェアバリア同期機構１００が第２階層のバリア同期が完了した通知が到着するとＳ４９で全ての子スレッドにバリア同期の完了を通知する。
【０１２０】
つまり、図１１の例では、プロセッサコアｃｐｕ０の親スレッドＴｈ０と子スレッドＴｈ１の同期を１次キャッシュＬ１−０で行い、プロセッサコアｃｐｕ１の親スレッドＴｈ２と子スレッドＴｈ３の同期を１次キャッシュＬ１−１で行う。
【０１２１】
そして、プロセッサコアｃｐｕ０、１の親スレッドＴｈ０、２のバリア同期をハードウェアバリア同期機構１００で行うのである。
【０１２２】
これにより、ハードウェアバリア同期機構１００で制御できないプロセッサコア内の複数のスレッドのバリア同期を１次キャッシュＬ１で行い、プロセッサコア間のバリア同期を高速なハードウェアバリア同期機構１００で行い、マルチスレッドの並列処理でバリア同期を実現できるのである。
【０１２３】
図１３は、上記図１１の同期グループに同期すべきスレッドを１つ加えて、一つのプロセッサモジュールＰ０で５つのスレッドのバリア同期を行う例である。
【０１２４】
上記図７の初期設定において、プロセッサコア数Ｍ／スレッド数Ｎの結果に余りがあればプロセッサコア番号の小さい順に余りのスレッド数を一つずつ割り当てるため、Ｍ＝２、Ｎ＝５の場合では、図１３のようにプロセッサコア番号の小さいプロセッサコアｃｐｕ０に３つのスレッドＴｈ０〜２が割り当てられ、プロセッサコア番号の大きいプロセッサコアｃｐｕ１に２つのスレッドＴｈ３〜４が割り当てられる。
【０１２５】
この場合、プロセッサコアｃｐｕ０の第１階層の同期グループは、スレッドＴｈ０〜２の３つで構成され、スレッドＴｈ０が親スレッドとなり、スレッドＴｈ１〜２が子スレッドとなる。この場合、プロセッサコアｃｐｕ０の１次キャッシュＬ１−０には、バリア同期を行う記憶域は、図１４で示すようにスレッドＴｈ０の同期情報を記憶する記憶域Ｌ１００と、スレッドＴｈ１の同期情報を記憶する記憶域Ｌ１０１にスレッドＴｈ２の同期情報を記憶する記憶域Ｌ１０２が設定される。
【０１２６】
そして、バリア同期処理は図１２と同様に行われ、親スレッドＴｈ０がバリア同期ポイントに到達すると、１次キャッシュＬ１−０の記憶域Ｌ１０１、Ｌ１０２を監視して、子スレッドＴｈ１、２の同期ポイントＩＤが親スレッドＴｈ０に一致するのを待つ。記憶域Ｌ１００〜Ｌ１０２の同期ポイントＩＤが一致すると、プロセッサコアｃｐｕ０の第１階層の同期グループでバリア同期が完了し、親スレッドＴｈ０がハードウェアバリア同期機構１００に同期の完了を通知する。そして、ハードウェアバリア同期機構１００はプロセッサコアｃｐｕ０、１の各親スレッドＴｈ０、３のバリア同期完了を検知すると、各親スレッドＴｈ０、３に通知を行い、全ての階層のバリア同期が完了する。
【０１２７】
このように、プロセッサコアに割り当てられたスレッド数が異なる場合でも、１次キャッシュＬ１の記憶域Ｌ１００〜Ｌ１０２でバリア同期を行うことにより、任意のスレッド数のバリア同期を実現することができる。
【０１２８】
なお、上記第１実施形態において、プロセッサモジュールと主記憶ＭＭはコントローラを介して接続する例を示したが、図示はしないがプロセッサコアまたはプロセッサモジュールにメモリコントローラを設け、このメモリコントローラと主記憶ＭＭを接続する構成であっても良い。
【０１２９】
＜第２実施形態＞
図１５〜図２０は、第２の実施形態を示し、前記第１実施形態に示したハードウェアバリア同期機構１００を用いずに、ソフトウェアのみでバリア同期を行う例を示す。
【０１３０】
図１５は、本第２実施形態の並列計算機のハードウェア構成を示し、前記第１実施形態の図１に示した並列計算機からハードウェアバリア同期機構１００を削除したもので、その他の構成は前記第１実施形態と同一である。
【０１３１】
図１６は、同期グループＧｒの一例を示し、前記第１実施形態の図４と同様に、４つのプロセッサコアｃｐｕ０〜３に８つのスレッドＴｈ０〜７を割り当てて、バリア同期を行う場合の同期グループＧｒの詳細を示す。
【０１３２】
同期グループＧｒの最下位階層となる第１階層は、同一のプロセッサコア上のスレッドのバリア同期を行う第１の同期グループとする。そして、同一のプロセッサコア上のスレッドが共有可能な１次キャッシュＬ１を共有記憶域とし、各スレッドは１次キャッシュＬ１に同期情報を書き込んで、同期をとる。
【０１３３】
次に、上位階層となる第２階層は同一のプロセッサモジュール内のプロセッサコア間でスレッドのバリア同期を行う第２の同期グループとする。このため、同一のプロセッサモジュール内のプロセッサコア間で共有可能な２次キャッシュＬ２を共有記憶域とし、各プロセッサコアのスレッドのうち、一つのスレッドを親スレッドとして、各プロセッサコアの親スレッドが２次キャッシュＬ２に同期情報を書き込んで、親スレッド間で同期をとる。
【０１３４】
次に、第３階層（最上位階層）はプロセッサモジュール間でスレッドのバリア同期を行う第３の同期グループとする。同一のプロセッサモジュール上の複数の親スレッドの内の一つをプロセッサモジュールの親スレッドとし、各プロセッサモジュールは親スレッド同士で同期を取る。このため、プロセッサモジュール間で共有可能な３次キャッシュＬ３を共有記憶域とし、各プロセッサモジュール上の親スレッドのうち、一つのスレッドを親スレッドとして、各プロセッサモジュールを代表する親スレッドが３次キャッシュＬ３に同期情報を書き込んで、親スレッド間で同期をとる。
【０１３５】
つまり、第１階層と第２階層は前記第１実施形態と同様であり、第３階層で３次キャッシュＬ３を用いてプロセッサモジュールを代表する親スレッド間でバリア同期を行う点が前記第１実施形態と異なる。
【０１３６】
そして、同期グループを構成するスレッドに同期グループＧｒ内で一意の識別子としてのスレッド番号を割り当て、上記各階層内で最も小さいスレッド番号をもつスレッドを親スレッドとし、その他を子スレッドとする。
【０１３７】
第１階層及び第２階層では、前記第１実施形態と同様に、プロセッサコアｃｐｕ０〜３のスレッドＴｈ０、Ｔｈ２、Ｔｈ４、Ｔｈ６がそれぞれ親スレッドとなり、第３階層ではプロセッサモジュールＰ０でスレッド番号の最も小さいスレッドＴｈ０が親スレッドとなり、プロセッサモジュールＰ１では同じくスレッド番号の最も小さいスレッドＴｈ４が親スレッドとなる。
【０１３８】
そして、第１階層では、図１７で示すように１次キャッシュＬ１を用いて前記第１実施形態と同様に第１階層の同期スレッドが同期情報を書き込む記憶域Ｌ１００〜Ｌ１３１を設定し、第２階層では前記第１実施形態と同様に、２次キャッシュＬ２に第２階層の親スレッドが同期情報を書き込む記憶域Ｌ２００〜Ｌ２１１を設定する。
【０１３９】
第３階層では、プロセッサモジュールＰ０、Ｐ１を代表する親スレッドＴｈ０、Ｔｈ４の同期を取るため、図１７で示すようにプロセッサモジュールＰ０、Ｐ１で共有可能な共有記憶域として３次キャッシュＬ３を用い、親スレッドＴｈ０の同期情報を格納する記憶域Ｌ３００と親スレッドＴｈ４の同期情報を格納する記憶域Ｌ３０１を設定する。
【０１４０】
なお、多数のプロセッサモジュールでバリア同期を行う場合には、３次キャッシュＬ３に各プロセッサモジュールを代表する親スレッドの記憶域を設けて上述したようにバリア同期をとっても良い。あるいは、主記憶ＭＭをプロセッサモジュール間で共有する共有記憶域として第４階層の同期グループを設けてもよく、この場合は、主記憶ＭＭ上に親スレッドの同期情報を格納する記憶域を設定すればよい。
【０１４１】
次に、プロセッサモジュールＰ０、Ｐ１の同期グループＧｒで実行されるプログラム（ロードモジュール）のフローチャートを図１８〜図２１に示す。
【０１４２】
図１８、図１９は前記第１実施形態の図６に示した初期設定処理ＰＧ１を示し、図２０、図２１は同じく図６に示したプログラムＰＧの演算処理ＰＧ２のうちのバリア同期処理を示す。
【０１４３】
図１８は、初期設定処理ＰＧ１の最下位階層（第１階層）の初期設定を示し、Ｓ１〜Ｓ８及びＳ１１、Ｓ１２は前記第１実施形態の図７と同様であり、入力されたプロセッサコア（ＣＰＵ）の数Ｎと、起動するスレッドの数Ｍに基づいて、プロセッサコアの番号の小さい順にスレッドを割り当て、スレッド番号を設定して各スレッドを起動する。そして、マルチスレッドの並列処理の場合には、使用するプロセッサモジュールのプロセッサコア数ＣＯＲＥと使用スレッド数Ｎから同期グループの階層数Ｆを求め、Ｓ９Ａで図１９に示す第１階層から第Ｆ階層までのバリア同期設定を行う。
【０１４４】
Ｓ３でシングルスレッド処理と判定された場合には、Ｓ１１、Ｓ１２で前記第１実施形態と同様に一つのプロセッサコアに一つのスレッドを割り当てる。そして、Ｓ１３Ａで使用するプロセッサコア数に応じてバリア同期を行うための共有記憶域を設定する。例えば、一つのプロセッサモジュール内でバリア同期を行う場合には、２次キャッシュＬ２に同期情報を格納する記憶域を設定し、プロセッサモジュール間でバリア同期を行う場合には、３次キャッシュＬ３に記憶域を設定してバリア同期を行う。
【０１４５】
図１９は、第１階層から第Ｆ階層のバリア同期を設定するループを階層の数だけ行うもので、Ｓ３１Ａを除いて前記第１実施形態の図８と同様であり、Ｓ３１Ａでは変数ｉが最上位階層（第Ｆ階層）を超えると次のスレッドの設定を行うようにしたものである。
【０１４６】
前記第１実施形態では最上位階層のバリア同期をハードウェアバリア同期機構１００で処理していたのに対し、本第２実施形態では上述のように３次キャッシュＬ３あるいは主記憶ＭＭに各プロセッサモジュールを代表する親スレッドの記憶域を設定し、プロセッサモジュール間でバリア同期処理を行う。
【０１４７】
次に、図２０、図２１のバリア同期処理について説明する。
【０１４８】
図２０は、前記第１実施形態の図９と同様に、第１階層の同期グループの処理を示しており、Ｓ４１で演算処理が所定の同期ポイントに到達していればＳ４２以降のバリア同期処理へ進み、同期ポイントに達していなければ演算処理を継続する。
【０１４９】
同期ポイントに到達していればＳ４２で、第１階層の共有記憶域である１次キャッシュＬ１の所定の記憶域に同期ポイントのＩＤを書き込む。
【０１５０】
Ｓ４３では、自スレッドが親スレッドであるか否かを判定し、親スレッドの場合はＳ４４の処理へ進み、子スレッドの場合にはＳ５２に進んで、親スレッドからバリア同期の完了通知を待ち、この通知を受けると同期処理を終了して次の演算処理に進む。
【０１５１】
親スレッドの場合のＳ４４では、１次キャッシュＬ１の所定のキャッシュラインから、同一の第１階層の子スレッドの同期ポイントＩＤを読み込み、Ｓ４５で親スレッドの同期ポイントＩＤと全ての子スレッドの同期ポイントＩＤが一致した場合にはバリア同期が完了したと判定してＳ４６に進む。なお、一致しない場合には全ての子スレッドの同期ポイントＩＤが親スレッドの同期ポイントＩＤと一致するのを待つ。
【０１５２】
Ｓ４６では、上記図１８のＳ８で求めた同期グループの階層数Ｆが１より大きい、換言すれば上位階層の有無を判定し、上位階層があればＳ４８に進んで図２１に示す上位階層のバリア同期処理を行い、第１階層のみであればＳ４８１に進む。
【０１５３】
なお、Ｓ４８の上位階層のバリア同期処理では、全ての階層の同期グループのバリア同期が完了すると、図２１のサブルーチンを終了してＳ４８１の処理に進む。
【０１５４】
Ｓ４８１では、全ての階層でバリア同期が完了しているので、自スレッドが何れかの階層の親スレッドであるか否かを判定し、親スレッドであればＳ５０に進んで、全ての子スレッドに同期完了を順次通知し、Ｓ５１で全ての子スレッドへの通知が完了していればバリア同期処理を完了して次の演算処理を開始する。Ｓ４８１の判定で、子スレッドとなった場合は、図２１の上位階層のバリア同期処理で親スレッドからの同期完了の通知を受けているので、バリア同期処理を完了して次の演算処理を開始する。
【０１５５】
次に、図２１の上位階層（第２階層〜第Ｆ階層）のバリア同期処理について説明する。
【０１５６】
図２１の処理は、第１階層のバリア同期が完了してから実行されるもので、まず、Ｓ６０では階層を示す変数ｉに２を設定して、次のバリア同期処理を行う階層を第２階層とする。
【０１５７】
Ｓ６１Ａでは自スレッドが同期ポイントに達しているので、第ｉ階層に対応する共有記憶域である２次キャッシュＬ２の所定の記憶域に同期ポイントＩＤを書き込む。
【０１５８】
そして、Ｓ６２でスレッドの親子関係を判定し、親スレッドであればＳ６３Ａに進んで現在の同期グループの階層（第ｉ階層）のバリア同期を行う。一方、この判定で第ｉ階層の子スレッドと判定された場合には、Ｓ６９に進んで親スレッドからの同期完了の通知を待つ。
【０１５９】
親スレッドと判定されたＳ６３Ａでは、現在の同期グループの階層（第ｉ階層）に対応する共有記憶域を参照する。現在の階層の共有記憶域から同期すべき子スレッドの記憶域に格納された同期ポイントＩＤを監視し、全ての子スレッドの同期ポイントＩＤが一致したら第ｉ階層の同期が完了したと判定する（Ｓ６３Ａ〜Ｓ６４）。
【０１６０】
次に、Ｓ７０では、次の上位階層のバリア同期処理を行うため、階層を示す変数ｉに１を加算し、Ｓ７１で最上位階層までバリア同期処理が完了したか否かを判定する。最上位階層の判定は、インクリメント後の変数ｉが図１８のＳ８で求めた階層数Ｆを超えていれば、上記Ｓ６０〜Ｓ６４の処理で最上位階層までバリア同期を完了したと判定する。そして、最上位階層に達していなければ、Ｓ６１Ａに戻って上述のようにさらに上位階層（ｉ＋１階層）のバリア同期処理を行う。
【０１６１】
Ｓ７１で変数ｉが階層数Ｆを超えると、全ての階層の同期処理が完了したので、図２０の処理に戻り、上述のようにＳ４８１へ進んで何れかの階層の親スレッドであれば全子スレッドにバリア同期処理の完了を通知する。
【０１６２】
以上の処理を図１６の例で行った場合について説明する。
【０１６３】
図１６において、プロセッサコアｃｐｕ０のスレッドＴｈ０について上記バリア同期処理を行った例では、まず図１８、図１９の初期設定で、スレッドＴｈ０は同一プロセッサコアｃｐｕ０上で最もスレッド番号が小さいので第１階層の親スレッドとなる。
【０１６４】
同様にプロセッサコアｃｐｕ１〜３ではそれぞれスレッドＴｈ２、Ｔｈ４、Ｔｈ６が第１階層の親スレッドとなる。
【０１６５】
次に同一のプロセッサモジュールＰ０の他のプロセッサコアｃｐｕ１のスレッドＴｈ２、３とスレッド番号の大小を比較し、スレッドＴｈ０が最もスレッド番号が小さいので、このスレッドＴｈ０が第２階層の親スレッドとなりプロセッサコアｃｐｕ１のスレッドＴｈ２は、第２階層の子スレッドとなる。同様に、プロセッサモジュールＰ１では、第２階層の親スレッドはスレッドＴｈ４、子スレッドがスレッドＴｈ６となる。
【０１６６】
次に、スレッドＴｈ０のスレッド番号と、他のプロセッサモジュールＰ１のスレッドＴｈ４〜Ｔｈ７とスレッド番号の大小を比較し、スレッドＴｈ０が最もスレッド番号が小さいので、このスレッドＴｈ０が第３階層の親スレッドとなり、プロセッサモジュールＰ１のスレッドＴｈ４が子スレッドとなる。
【０１６７】
図２０のバリア同期処理では、スレッドＴｈ０が同期ポイントに到達すると図１７の１次キャッシュＬ１−０の記憶域Ｌ１００に同期ポイントＩＤを書き込んで、第１階層の子スレッドＴｈ１が同じ同期ポイントに到達するのを待つ。子スレッドＴｈ１は同期ポイントに到達すると、図２０のＳ５２で全ての階層のバリア同期が完了するまで待機する。
【０１６８】
一方、親スレッドＴｈ０は第１階層のバリア同期処理が完了したのでＳ４８へ進み、この同期グループの階層がＦ＝３であることからＳ４８で図２１の上位階層のバリア同期処理に進む。図２１の上位階層では変数ｉ＝２として第２階層のバリア同期処理を開始する。
【０１６９】
第２階層では、スレッドＴｈ０は図１７の２次キャッシュＬ２−０の記憶域Ｌ２００に同期ポイントＩＤを書き込んでから、第２階層の親スレッドであるので子スレッドＴｈ２が同期ポイントに到達するのを待つ。子スレッドＴｈ２は同期ポイントに到達すると、図２１のＳ６９で全ての階層のバリア同期が完了するまで待機する。
【０１７０】
一方、親スレッドＴｈ０は第２階層のバリア同期処理が完了したのでＳ７０へ進み、変数ｉをインクリメントし、最上位階層に達していなければＳ６１Ａに戻って第３階層のバリア同期処理を開始する。
【０１７１】
第３階層では、スレッドＴｈ０は図１７の３次キャッシュＬ３の記憶域Ｌ３００に同期ポイントＩＤを書き込んでから、第３階層の親スレッドであるので子スレッドＴｈ４が同期ポイントに到達するのを待つ。子スレッドＴｈ４は同期ポイントに到達すると、図２１のＳ６９で全ての階層のバリア同期が完了するまで待機する。
【０１７２】
一方、親スレッドＴｈ０は第３階層のバリア同期処理が完了したのでＳ７０へ進み、変数ｉをインクリメントし、変数ｉ＞Ｆとなったので、最上位階層のバリア同期処理が完了したので、図２０のＳ４８１に進む。
【０１７３】
スレッドＴｈ０は各階層の親スレッドであるので担当する子スレッドＴｈ４、Ｔｈ２、Ｔｈ１の順に同期完了の通知を行う。
【０１７４】
親スレッドＴｈ０から同期完了通知を受けた第１階層の子スレッドＴｈ１は、Ｓ５２の待機を終了し、次の演算処理を再開する。
【０１７５】
第２階層のＳ６９で待機していた第２階層の子スレッドＴｈ２は、親スレッドＴｈ０から同期完了通知を受けると、図２０のＳ４８１の判定でこのスレッドＴｈ２はプロセッサコアｃｐｕ１の第１階層の親スレッドであるので、Ｓ５０で子スレッドＴｈ３に同期完了の通知を行ってから、次の演算処理を再開する。
【０１７６】
第３階層のＳ６９で待機していた第３階層の子スレッドＴｈ４は、親スレッドＴｈ０から同期完了通知を受けると、図２０のＳ４８１の判定でこのスレッドＴｈ４はプロセッサモジュールＰ１の第３階層の親スレッドであるので、Ｓ５０で子スレッドＴｈ６、Ｔｈ５の順に同期完了の通知を行ってから、次の演算処理を再開する。
【０１７７】
なお、プロセッサコアｃｐｕ１の第１階層の親スレッドＴｈ２は上記と同様にＳ４８１、Ｓ５０で第１階層の子スレッドＴｈ３に同期完了を通知し、同様にプロセッサモジュールＰ１の親スレッドＴｈ４は、第２階層、第１階層の子スレッドＴｈ６、Ｔｈ５の順に同期完了を通知し、さらに第１階層の親スレッドＴｈ６は子スレッドＴｈ７に同期完了を通知し、各階層の親スレッドが各子スレッドに同期完了を通知することで、全ての階層のスレッドがバリア同期処理を完了する。
【０１７８】
このように、ハードウェアバリア同期機構１００を用いない場合では、同一プロセッサコア上の複数のスレッドのバリア同期を、プロセッサコアに最も近い共有記憶域（１次キャッシュＬ１）で行い、同一プロセッサモジュールのプロセッサコア間のバリア同期を、次にプロセッサコアに近い共有記憶域（２次キャッシュＬ２）で行う。そして、各プロセッサモジュール間のバリア同期を、次にプロセッサコアに近い共有記憶域（３次キャッシュＬ３）で行う。
【０１７９】
以上のように、プロセッサコア内とプロセッサモジュール内及びプロセッサモジュール間で、プロセッサコアに近い共有記憶域から主記憶ＭＭ側に階層化した同期グループを複数設定し、これら同期グループ毎にバリア同期処理を行うことで、マルチコア・マイクロプロセッサを用いてひとつのプロセッサコアに複数のスレッドを割り当てるマルチスレッド処理により並列処理を行う際に、多数のスレッドの同期を確実に取ることができる。そして、本第２実施形態ではハードウェアバリア同期機構を必要としないので、並列計算機を安価に構成することができ、また、マルチコア・マイクロプロセッサを用いた計算機であれば並列処理を行うことが可能となる。
【０１８０】
＜第３実施形態＞
図２２、図２３は、第３の実施形態を示し、前記第１実施形態に示したバリア同期処理を専用のスレッドで行うようにし、他のスレッドを並列演算処理専用としたもので、その他の構成は前記第１実施形態と同様である。
【０１８１】
各プロセッサコアｃｐｕ０〜３には演算処理のみを行い子スレッドとして機能するスレッドＴｈ０〜Ｔｈ７と、各階層の親スレッドと機能して、バリア同期処理のみを行う同期スレッドＳＴｈ０〜Ｓｔｈ３が割り当てられて実行する。つまり、同期スレッドＳＴｈ０〜３は、図６のプログラムＰＧのうち、演算処理ＰＧ２のバリア同期処理のみを実行し、スレッド（以下演算スレッドとする）Ｔｈ０〜Ｔｈ７は、プログラムＰＧのうち演算処理（並列演算処理）を実行し、バリア同期処理の一部のみを行う。
【０１８２】
演算スレッドＴｈ０〜Ｔｈ７は、バリア同期処理においては全て子スレッドとして機能し、自スレッドが同期ポイントに到達すると、第１階層の共有記憶域（１次キャッシュＬ１）に同期ポイントＩＤを書き込む処理のみを行う。そして、各演算スレッドは共有記憶域に同期ポイントＩＤを書き込んだ後に、図９のＳ５２で同期スレッドＳＴｈ０〜ＳＴｈ３からの同期完了の通知を待つ。
【０１８３】
一方、同期スレッドＳＴｈ０〜ＳＴｈ３は、同期グループの各階層の親スレッドとして機能し、演算処理（並列演算処理）は行わず、各演算スレッドのバリア同期のみをとる。各プロセッサコアｃｐｕ０〜３にはそれぞれ同期スレッドＳＴｈ０〜ＳＴｈ３が割り当てられ、プロセッサコアｃｐｕ０の同期スレッドＳＴｈ０は、演算スレッドＴｈ０〜１のバリア同期を行う第１階層の同期グループを構成する。
【０１８４】
そしてプロセッサコアｃｐｕ０、１の同期スレッドＳＴｈ０、ＳＴｈ１はプロセッサコア間のバリア同期を行う第２階層の同期グループを構成する。そしてプロセッサモジュールＰ０、Ｐ１間のバリア同期はハードウェアバリア同期機構１００を用いて、同期スレッドＳＴｈ０とＳＴｈ２の同期を取ることで行われる。
【０１８５】
同様に、同期スレッドＳＴｈ１〜ＳＴｈ３も各プロセッサコアｃｐｕ１〜３で第１階層と第２階層の同期グループをそれぞれ構成する。
【０１８６】
ここで、同期スレッドＳＴｈ０〜ＳＴｈ３と演算スレッドＴｈ０〜Ｔｈ７の共有記憶域の関係は、図２３で示すとおりとなる。
【０１８７】
各プロセッサコアｃｐｕ０〜３の１次キャッシュＬ１−０〜３のキャッシュラインは、前記第１実施形態と同様であり、同期スレッドＳＴｈ０〜Ｔｈ７の同期ポイントＩＤが格納される。
【０１８８】
プロセッサモジュールＰ０、Ｐ１の２次キャッシュＬ２には、前記第１実施形態の親スレッドに代わって、同期スレッドＳＴｈ０〜ＳＴｈ３の同期情報を格納する記憶域Ｌ２００〜Ｌ２１１が設定される。
【０１８９】
例えば、プロセッサコアｃｐｕ０では、演算スレッドＴｈ０、１の同期ポイントＩＤが記憶域Ｌ１００、Ｌ１０１に書き込まれ、２つの同期ポイントＩＤが一致すると同期スレッドＳＴｈ０は２次キャッシュＬ２の記憶域Ｌ２００に記憶域Ｌ１００の同期ポイントＩＤを格納する。同様に、プロセッサコアｃｐｕ１の同期スレッドＳＴｈ１は、演算スレッドＴｈ２、３のバリア同期が完了すると記憶域Ｌ１１０の同期ポイントＩＤを２次キャッシュＬ２の記憶域Ｌ２０１に書き込む。
【０１９０】
同期スレッドＳＴｈ０は、２次キャッシュＬ２の記憶域Ｌ２００、Ｌ２０１の内容が一致すると第２階層のバリア同期が完了したと判定してハードウェアバリア同期機構１００に同期完了を通知する。
【０１９１】
なお、同期スレッドＳＴｈ０〜ＳＴｈ３は、前記第１実施形態の図９に示した親スレッドの処理と、図１０の処理を実行する。これに対して、演算スレッドＴｈ０〜Ｔｈ７は、図９のＳ４１〜Ｓ４３とＳ５２のみを実行する。
【０１９２】
このように、前記第１実施形態のスレッドを、主に演算処理を行う演算スレッドと、バリア同期処理のみを行う同期スレッドに分割することで、演算スレッド及び同期スレッドには親子関係は不要になり、前記第１実施形態のようなスレッド間で親子関係を判定する処理が不要になってバリア同期に要する演算負荷を低減することができる。
【０１９３】
＜第４実施形態＞
図２４、図２５は、第４の実施形態を示し、前記第１実施形態に示したバリア同期処理にデッドロックなどの障害を検知する機能を加えたもので、その他の構成は前記第１実施形態と同様である。
【０１９４】
従来の並列演算処理のプログラムＰＧの開発過程では、ひとつのスレッドがバリア同期待ちとなったままになると、正常に動作している他のスレッドもバリア同期が取れずに停止するデッドロックが起きる場合がある。このデッドロックが生じると、使用中のプロセッサコアがどの同期ポイントＩＤで停止しているか検知できないため、従来では、ソースコード中にブレークポイントなどを設けて、デバッグを行っていたため生産性が低下していた。
【０１９５】
本第４実施形態では、障害発生時に現在の同期ポイントＩＤを通知することで、デバッグ作業を効率よく行うものである。
【０１９６】
図２４は、前記第１実施形態の図９に示した最下位層のバリア同期処理を行うフローチャートに、障害検知処理Ｓ１００を付加したもので、その他の構成は前記第１実施形態と同様である。
【０１９７】
図２４において、Ｓ４５で親スレッドが行う第１階層のバリア同期の確認処理では、Ｓ４４で読み込んだ子スレッドの同期ポイントＩＤが一致するまでループを行い、このループの途中に障害を検知する障害検知処理Ｓ１００を設ける。同様に、子スレッドが行う第１階層のバリア同期の確認処理では、Ｓ５２で親スレッドからの同期完了通知があるまでループを行い、このループの途中に障害を検知する障害検知処理Ｓ１１０を設ける。
【０１９８】
図２５は、上記障害検知処理Ｓ１００の詳細を示すサブルーチンである。同期完了のループが開始されると、Ｓ１０１で経過時間のカウントが行われ、確認処理が開始されてから所定時間を経過したか否かを判定する。所定時間を経過した場合には、デッドロックなどの障害が発生したと判定して、Ｓ１０２に進む。
【０１９９】
Ｓ１０２では、同期すべきスレッドの同期ポイントＩＤを共有記憶域（この例では１次キャッシュＬ１）から読み込む。
【０２００】
そして、Ｓ１０３では取得した同期ポイントＩＤとスレッド番号を、他の同期グループまたは上位の同期グループの記憶域である３次キャッシュＬ３または主記憶ＭＭの所定の記憶域に格納する。
【０２０１】
なお、Ｓ１１０の処理内容も上記図２５と同様である。
【０２０２】
例えば、図４において、スレッドＴｈ０がデッドロックを起こした場合、第１階層で同期を行うスレッドＴｈ１は、上記図２４のＳ１１０で確認処理Ｓ５２を開始してから所定時間が経過すると、図５に示した１次キャッシュＬ１−０の所定のキャッシュライン上の記憶域Ｌ１００から同期ポイントＩＤを読み込む。そして、この記憶域Ｌ１００を使用するスレッド番号と読み込んだ同期ポイントＩＤを、３次キャッシュＬ３の所定の記憶域に書き込む。なお、スレッド番号と読み込んだ同期ポイントＩＤの書き込みは、他の同期グループのプロセッサコアから読み込み可能であれば良く、例えば、２次キャッシュＬ２や主記憶ＭＭなどを所定の記憶域としても良い。また、同期ポイントＩＤのみを書き込むようにしても良く、同期ポイントＩＤに基づいてスレッド（プログラム）をデバッグすることができる。
【０２０３】
デッドロックを起こしていない他の同期グループのプロセッサコアｃｐｕ２、３等から３次キャッシュＬ３の所定の記憶域を読み込むことで、いずれの同期ポイントＩＤでいずれのスレッド番号が停止したのかを取得することができる。
【０２０４】
このように、障害発生時には、異なるグループのプロセッサコア間あるいはプロセッサモジュール間で共有する２次キャッシュＬ２や３次キャッシュＬ３等の共有記憶域に設定した所定の記憶域に、障害が発生したスレッドの同期ポイントＩＤ及びスレッド番号を格納するようにしたので、正常に作動している他のプロセッサコアから上記共有記憶域を読み込むことで、障害が生じた同期ポイントＩＤとスレッド番号を確認することが可能となる。
【０２０５】
これにより、プログラムＰＧの開発者は、極めて容易に障害生じた同期ポイントやスレッドなどを知ることができ、上述のようなブレークポイントなどを設けることなく並列演算処理のデバッグを実現することができ、ソフトウェア開発の生産性を大幅に向上させることができる。
【０２０６】
＜第５実施形態＞
図２６は、第５の実施形態を示し、前記第１実施形態の図６に示したプログラム（ロードモジュール）ＰＧのうち演算処理ＰＧ２をロードモジュールとして生成する手順を示す。
【０２０７】
前記第１実施形態では、初期設定処理ＰＧ１でプロセッサコアの数や同期グループの階層などを入力する必要があったが、本第５実施形態では、演算処理ＰＧ２を生成する段階で使用するプロセッサコアの数やマルチコア・マイクロプロセッサの構成や共有記憶域の構造等を予め設定し、実行の際にはロードモジュール（演算処理ＰＧ２）を主記憶ＭＭにロードして実行するだけにしたものである。
【０２０８】
まず、図２６のＳ２００では、並列演算処理のソースコードを生成する。そしてＳ２０１ではコンパイラによりソースコードをコンパイルする。このコンパイルの際に、演算処理ＰＧ２を実行する並列計算機の共有記憶域の階層（図中メモリ階層）や同期ポイントＩＤ及びプロセッサモジュール当たりのプロセッサコアの数などをコンパイルオプションとして入力し、コンパイルを実行する。なお、このコンパイルは図示しない計算機で行われる。
【０２０９】
コンパイラは、複数のプロセッサコアで処理を行うデータ間に依存関係が生じたときに、バリア同期を行うための同期ポイントを設定し、この同期ポイントには一意の識別子として同期ポイントＩＤを設定する。そして、この同期ポイントでは、プロセッサコア数と共有記憶域の階層数に応じてバリア同期の階層を設定する。そして、コンパイラは各階層毎に同期グループを階層構造で設定する。この同期グループは、前記第１実施形態または第２実施形態で示したように、プロセッサコア側を下位の同期グループとし、プロセッサコアから離れるにつれて順次上位階層の同期グループとして設定する。
【０２１０】
このコンパイルの結果、Ｓ２０２では特定の並列計算機の構成に最適化された複数のオブジェクトが生成される。
【０２１１】
そして、Ｓ２０３ではリンケージエディタを用いて、上記複数のオブジェクトを結合し実行ファイルとしてのロードモジュール（演算処理ＰＧ２）を生成する。このリンケージエディタでは、スレッド間の親子関係の設定や、バリア同期の実行方法（ハードウェアバリア同期機構の有無等）を設定する。
【０２１２】
上記の処理により、特定の計算機に最適化された演算処理ＰＧ２を生成し、図１あるいは図１６に示した並列計算機で実行すれば、前記第１実施形態のような初期設定処理を行うことなくバリア同期を行う並列演算処理を実行することができる。
【産業上の利用可能性】
【０２１３】
以上のように、本発明によればマルチコア・マイクロプロセッサを用いてマルチスレッドによる並列演算処理を実現できるので、マルチコア・マイクロプロセッサを備えた並列計算機や、マルチコア・マイクロプロセッサでマルチスレッドの並列演算処理を行うプログラム及びこのプログラムを生成するコンパイラに適用することができる。
【図面の簡単な説明】
【０２１４】
【図１】本発明の第１の実施形態を示し、バリア同期処理を行う並列計算機の構成図を示す。
【図２】同じく、並列計算機の各プロセッサコアで実行されるソフトウェアの構成図で、バリア同期処理を行う同期グループの一例を示す。
【図３】ハードウェアバリア同期機構の構成図。
【図４】４つのプロセッサコアでバリア同期処理を行う同期グループの階層構造を示す説明図。
【図５】プロセッサモジュール毎の共有記憶域の設定の一例を示す説明図。
【図６】並列処理を行うプログラムの一例を示す構成図。
【図７】バリア同期処理の初期設定を行うフローチャート。
【図８】同じく、第１階層から第２階層のバリア同期処理の初期設定を行うフローチャート。
【図９】バリア同期処理を行うフローチャートでメインルーチンの処理を示す。
【図１０】同じく、上位層のバリア同期処理のフローチャート。
【図１１】ひとつのプロセッサモジュールでバリア同期処理を行う同期グループの階層構造を示す説明図。
【図１２】同じくひとつのプロセッサモジュールでバリア同期処理を行う場合のバリア同期のフローチャート。
【図１３】プロセッサコア間でスレッド数が異なる場合の同期グループの階層構造を示す説明図。
【図１４】同じく、プロセッサコア間でスレッド数が異なる場合の共有記憶域の設定の一例を示す説明図。
【図１５】本発明の第２の実施形態を示し、ソフトウェアのみでバリア同期処理を行う並列計算機の構成図を示す。
【図１６】第２の実施形態を示し、４つのプロセッサコアでバリア同期処理を行う同期グループの階層構造を示す説明図。
【図１７】第２の実施形態を示し、プロセッサモジュール毎の共有記憶域と３次キャッシュメモリの設定の一例を示す説明図。
【図１８】同じく、第２の実施形態を示し、バリア同期処理の初期設定を行うフローチャート。
【図１９】同じく、第２の実施形態を示し、第１階層から第Ｆ階層のバリア同期処理の初期設定を行うフローチャート。
【図２０】同じく、第２の実施形態を示し、バリア同期処理を行うフローチャートでメインルーチンの処理を示す。
【図２１】同じく、第２の実施形態を示し、上位階層におけるバリア同期処理のフローチャート。
【図２２】本発明の第３の実施形態を示し、同期スレッドを用いて４つのプロセッサコアでバリア同期処理を行う同期グループの階層構造を示す説明図。
【図２３】同じく、第３の実施形態を示し、演算スレッドと同期スレッドの共有記憶域の設定の一例を示す説明図。
【図２４】本発明の第４の実施形態を示し、障害検知処理を行う場合のバリア同期処理で最下位層のフローチャート。
【図２５】同じく、本発明の第４の実施形態を示し、障害検知処理を行う場合のバリア同期処理で上位層のフローチャート。
【図２６】本発明の第５の実施形態を示し、プログラムを生成するコンパイラの説明図。
【符号の説明】
【０２１５】
Ｐ０〜Ｐ７  プロセッサモジュール
ｃｐｕ０〜１５  プロセッサコア
Ｌ１−０〜１５  １次キャッシュ
Ｌ２−０〜７  ２次キャッシュ
Ｌ３  ３次キャッシュ
ＭＭ  主記憶
Ｔｈ０〜Ｔｈ１５  スレッド
１００  ハードウェアバリア同期機構
【図１】
2006259821.tif 000003
【図２】
2006259821.tif 000004
【図３】
2006259821.tif 000005
【図４】
2006259821.tif 000006
【図５】
2006259821.tif 000007
【図６】
2006259821.tif 000008
【図７】
2006259821.tif 000009
【図８】
2006259821.tif 000010
【図９】
2006259821.tif 000011
【図１０】
2006259821.tif 000012
【図１１】
2006259821.tif 000013
【図１２】
2006259821.tif 000014
【図１３】
2006259821.tif 000015
【図１４】
2006259821.tif 000016
【図１５】
2006259821.tif 000017
【図１６】
2006259821.tif 000018
【図１７】
2006259821.tif 000019
【図１８】
2006259821.tif 000020
【図１９】
2006259821.tif 000021
【図２０】
2006259821.tif 000022
【図２１】
2006259821.tif 000023
【図２２】
2006259821.tif 000024
【図２３】
2006259821.tif 000025
【図２４】
2006259821.tif 000026
【図２５】
2006259821.tif 000027
【図２６】
2006259821.tif 000028