(57)【特許請求の範囲】
【請求項１】
ひとつ以上のハードウェアスレッドを有するプロセッサコアをひとつ以上含むプロセッサを備えた計算機で、並列処理を実行してバリア同期の成立を判定するバリア同期方法において、
前記プロセッサコアはユーザモードを含む複数の特権レベルを有し、
前記複数のハードウェアスレッドをひとつ以上のグループに分割し、前記ユーザモードより高い特権レベルのときに前記ハードウェアスレッドが前記グループの情報をバリアドメイン定義情報に設定するステップと、
前記グループに所属するハードウェアスレッドを前記グループ内でひとつ以上の同期グループに分割し、当該分割した同期グループの情報を前記ハードウェアスレッドが前記ユーザモードのときにバリアグループ定義情報に設定するステップと、
前記ハードウェアスレッドのそれぞれが、当該ハードウェアスレッドで実行する処理がバリアポイントに到達したときにバリアポイント到達情報を出力するステップと、
前記ハードウェアスレッドのそれぞれが出力したバリアポイント到達情報を受信し、前記バリアグループ定義情報に設定された同期グループと、前記バリアドメイン定義情報に設定された前記グループの情報から、当該ハードウェアスレッドがバリア同期の成否を判定するステップと、
を含むことを特徴とするバリア同期方法。
【請求項２】
請求項１に記載のバリア同期方法であって、
前記ハードウェアスレッドがバリア同期の成否を判定するステップは、
前記バリアドメイン定義情報に設定されたひとつ以上のグループのうち、当該ハードウェアスレッドが所属するグループと、前記バリアグループ定義情報に設定されたひとつ以上の同期グループのうち、当該ハードウェアスレッドが所属する同期グループとの積集合を求め、当該積集合に含まれるハードウェアスレッド群において、バリア同期の成否を判定することを特徴とするバリア同期方法。
【請求項３】
請求項１に記載のバリア同期方法であって、
前記ハードウェアスレッドがバリア同期の成否を判定するステップは、
前記バリアドメイン定義情報に設定されたひとつ以上のグループのうち、当該ハードウェアスレッドが所属するグループと、前記バリアグループ定義情報に設定されたひとつ以上の同期グループのうち、当該ハードウェアスレッドが所属する同期グループとの積集合を求め、当該積集合に含まれるハードウェアスレッド群に対して、前記ハードウェアスレッド群に属するすべてのハードウェアスレッドのそれぞれが出力する前記バリアポイント到達情報がバリアポイントに到達したことを表している場合に、バリア同期が成立していると判定することを特徴とするバリア同期方法。
【請求項４】
請求項１に記載のバリア同期方法であって、
前記複数の特権レベルは前記ユーザモードと特権モードからなり、
前記ハードウェアスレッドが前記グループの情報をバリアドメイン定義情報に設定するステップは、
前記特権モードのときに前記ハードウェアスレッドが前記グループの情報をバリアドメイン定義情報に設定することを特徴とするバリア同期方法。
【請求項５】
請求項１に記載のバリア同期方法であって、
前記ハードウェアスレッドがバリア同期の成否を判定するステップは、
前記ユーザモードを除く前記複数の特権レベルの一部または全部のそれぞれに対応するバリアドメイン定義情報に設定されたひとつ以上のグループのうち当該ハードウェアスレッドが所属するグループと、前記バリアグループ定義情報に設定されたひとつ以上の同期グループのうち当該ハードウェアスレッドが所属する同期グループとの積集合を求め、当該積集合に含まれるハードウェアスレッド群において、バリア同期の成否を判定することを特徴とするバリア同期方法。
【請求項６】
請求項１に記載のバリア同期方法であって、
前記ハードウェアスレッドがバリア同期の成否を判定するステップは、
前記ユーザモードを除く前記複数の特権レベルの一部または全部のそれぞれに対応するバリアドメイン定義情報に設定されたひとつ以上のグループのうち当該ハードウェアスレッドが所属するグループと、前記バリアグループ定義情報に設定されたひとつ以上の同期グループのうち当該ハードウェアスレッドが所属する同期グループとの積集合を求め、当該積集合に含まれるハードウェアスレッド群において、前記ハードウェアスレッド群に属するすべてのハードウェアスレッドのそれぞれが出力する前記バリアポイント到達情報がバリアポイントに到達したことを表している場合に、バリア同期が成立していると判定することを特徴とするバリア同期方法。
【請求項７】
請求項１に記載のバリア同期方法であって、
前記複数のハードウェアスレッドは、前記バリアグループ定義情報と、前記バリアポイント到達情報を保持するバリアポイント到達情報格納部と、バリア同期の成否を判定するバリア成否判定部と、をそれぞれ有し、
前記ハードウェアスレッドがバリア同期の成否を判定するステップは、
前記バリア成否判定部が、当該ハードウェアスレッドに対応するバリアグループ定義情報と、当該ハードウェアスレッドに対応するバリアポイント到達情報格納部と、前記バリアドメイン定義情報からバリア同期の成否を判定することを特徴とするバリア同期方法。
【請求項８】
請求項１に記載のバリア同期方法であって、
前記複数のハードウェアスレッドは、前記バリアグループ定義情報と、前記バリアポイント到達情報を受信してハードウェアスレッド毎のバリアポイント到達状況を生成するバリアポイント到達状況生成部と、をそれぞれ有し、
前記ハードウェアスレッドがバリア同期の成否を判定するステップは、
当該ハードウェアスレッドに対応する前記バリアポイント到達状況生成部が生成したバリアポイント到達状況と、前記バリアグループ定義情報と、前記バリアドメイン定義情報からバリア同期の成否を判定することを特徴とするバリア同期方法。
【請求項９】
請求項１に記載のバリア同期方法であって、
前記プロセッサと主記憶とを接続するネットワークをさらに有し、前記バリアドメイン定義情報を格納するバリアドメイン定義部が前記ネットワークに接続され、
前記ハードウェアスレッドがバリア同期の成否を判定するステップは、
前記ネットワークを介して前記バリアドメイン定義部からバリアドメイン定義情報を読み込むステップを含むことを特徴とするバリア同期方法。
【請求項１０】
請求項１に記載のバリア同期方法であって、
前記複数の特権レベルは前記ユーザモードと特権モードとハイパーバイザモードからなり、前記ハードウェアスレッドがハイパーバイザモードのときには仮想計算機を提供するハイパーバイザを実行し、
前記複数のハードウェアスレッドをひとつ以上のグループに分割し、前記ユーザモードより高い特権レベルのときに前記ハードウェアスレッドが前記グループの情報をバリアドメイン定義情報に設定するステップは、
前記ユーザモードより高い特権レベルとして特権モードの前記ハードウェアスレッドが前記グループの情報をバリアドメイン定義情報に設定する際には、当該ハードウェアスレッドをハイパーバイザモードに切り替えて前記ハイパーバイザを実行し、当該ハイパーバイザによって前記バリアドメイン定義情報の内容が正当であるか否かを判定することを特徴とするバリア同期方法。
【請求項１１】
ひとつ以上のハードウェアスレッドを有するプロセッサコアをひとつ以上含むプロセッサを備えた計算機で、並列処理を実行してバリア同期の成立を判定する計算機において、
前記プロセッサコアはユーザモードを含む複数の特権レベルを有し、
前記ハードウェアスレッドのそれぞれが、当該ハードウェアスレッドで実行する処理がバリアポイントに到達したときにバリアポイント到達情報を出力し、
前記複数のハードウェアスレッドをひとつ以上のグループに分割して、当該グループの情報をバリアドメイン定義情報として格納するバリアドメイン定義部と、
前記グループに所属するハードウェアスレッドを前記グループ内でひとつ以上の同期グループに分割し、当該分割した同期グループの情報をバリアグループ定義情報として格納するバリアグループ定義情報格納部と、
前記バリアポイント到達情報を保持するバリアポイント到達情報格納部と、
前記ハードウェアスレッドのそれぞれにおいて、前記バリアポイント到達情報格納部のバリアポイント到達情報と、前記バリアグループ定義情報に設定された同期グループと、前記バリアドメイン定義情報に設定された前記グループの情報から、当該ハードウェアスレッドのバリア同期の成否を判定する判定部と、を備え、
前記バリアドメイン定義部は、前記ハードウェアスレッドが前記ユーザモードより高い特権レベルのときに設定可能であって、前記バリアグループ定義情報格納部は、前記ハードウェアスレッドが前記ユーザモードのときに設定可能であることを特徴とする計算機。
【請求項１２】
請求項１１に記載の計算機であって、
前記判定部は、
前記バリアドメイン定義情報に設定されたひとつ以上のグループのうち当該ハードウェアスレッドが所属するグループと、前記バリアグループ定義情報に設定されたひとつ以上の同期グループのうち当該ハードウェアスレッドが所属する同期グループとの積集合を求め、当該積集合に含まれるハードウェアスレッド群において、バリア同期の成否を判定することを特徴とする計算機。
【請求項１３】
請求項１１に記載の計算機であって、
前記判定部は、
前記バリアドメイン定義情報に設定されたひとつ以上のグループのうち、当該ハードウェアスレッドが所属するグループと、前記バリアグループ定義情報に設定されたひとつ以上の同期グループのうち、当該ハードウェアスレッドが所属する同期グループとの積集合を求め、当該積集合に含まれるハードウェアスレッド群に対して、前記ハードウェアスレッド群に属するすべてのハードウェアスレッドのそれぞれが出力する前記バリアポイント到達情報がバリアポイントに到達したことを表している場合に、バリア同期が成立していると判定することを特徴とする計算機。
【請求項１４】
請求項１１に記載の計算機であって、
前記複数の特権レベルは前記ユーザモードと特権モードからなり、
前記バリアドメイン定義部は、前記ハードウェアスレッドが前記特権モードのときに設定可能であることを特徴とする計算機。
【請求項１５】
請求項１１に記載の計算機であって、
前記判定部は、
前記ユーザモードを除く前記複数の特権レベルの一部または全部のそれぞれに対応するバリアドメイン定義情報に設定されたひとつ以上のグループのうち当該ハードウェアスレッドが所属するグループと、前記バリアグループ定義情報に設定されたひとつ以上の同期グループのうち当該ハードウェアスレッドが所属する同期グループとの積集合を求め、当該積集合に含まれるハードウェアスレッド群において、バリア同期の成否を判定することを特徴とする計算機。
【請求項１６】
請求項１１に記載の計算機であって、
前記判定部は、
前記ユーザモードを除く前記複数の特権レベルの一部または全部のそれぞれに対応するバリアドメイン定義情報に設定されたひとつ以上のグループのうち当該ハードウェアスレッドが所属するグループと、前記バリアグループ定義情報に設定されたひとつ以上の同期グループのうち当該ハードウェアスレッドが所属する同期グループとの積集合を求め、当該積集合に含まれるハードウェアスレッド群において、前記ハードウェアスレッド群に属するすべてのハードウェアスレッドのそれぞれが出力する前記バリアポイント到達情報がバリアポイントに到達したことを表している場合に、バリア同期が成立していると判定することを特徴とする計算機。
【請求項１７】
請求項１１に記載の計算機であって、
前記複数のハードウェアスレッドは、前記バリアグループ定義情報と、前記バリアポイント到達情報を保持するバリアポイント到達情報格納部と、バリア同期の成否を判定するバリア成否判定部と、をそれぞれ有し、
前記バリア成否判定部は、
当該ハードウェアスレッドに対応するバリアグループ定義情報と、当該ハードウェアスレッドに対応するバリアポイント到達情報格納部と、前記バリアドメイン定義情報からバリア同期の成否を判定することを特徴とする計算機。
【請求項１８】
請求項１１に記載の計算機であって、
前記複数のハードウェアスレッドは、前記バリアグループ定義情報と、前記バリアポイント到達情報を受信してハードウェアスレッド毎のバリアポイント到達状況を生成するバリアポイント到達状況生成部と、をそれぞれ有し、
前記判定部は、
当該ハードウェアスレッドに対応する前記バリアポイント到達状況生成部が生成したバリアポイント到達状況と、前記バリアグループ定義情報と、前記バリアドメイン定義情報からバリア同期の成否を判定することを特徴とする計算機。
【請求項１９】
請求項１１に記載の計算機であって、
前記プロセッサと主記憶とを接続するネットワークをさらに有し、前記バリアドメイン定義情報を格納するバリアドメイン定義部が前記ネットワークに接続され、
前記判定部は、
前記ネットワークを介して前記バリアドメイン定義部からバリアドメイン定義情報を読み込むことを特徴とする計算機。
【請求項２０】
請求項１１に記載の計算機であって、
前記複数の特権レベルは前記ユーザモードと特権モードとハイパーバイザモードからなり、前記ハードウェアスレッドがハイパーバイザモードのときには仮想計算機を提供するハイパーバイザを実行し、
前記バリアドメイン定義部は、
前記ユーザモードより高い特権レベルとして特権モードの前記ハードウェアスレッドが前記グループの情報をバリアドメイン定義情報に設定する際には、当該ハードウェアスレッドをハイパーバイザモードに切り替えて前記ハイパーバイザを実行し、当該ハイパーバイザによって前記バリアドメイン定義情報の内容が正当であるか否かを判定することを特徴とする計算機。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のプロセッサを備えて並列処理を行う計算機システムに関し、特に、複数のバリア同期を実現する計算機システムの改良に関する。
【背景技術】
【０００２】
複数のプロセッサにそれぞれスレッド（一連の処理）を割り当てて、各プロセッサがそれぞれ並列的に演算を行う計算機システムでは、各スレッドに予め設定されたバリア同期ポイントでプロセッサ間の同期を取るバリア同期処理を行っている。
【０００３】
近年のプロセッサは、半導体製造技術の向上により、１つのソケット（または１つのダイあるいは１つのパッケージ）で複数または多数のプロセッサコアを備えるものが普及しつつある。これら複数または多数のプロセッサコアを備えたプロセッサ（マルチコアプロセッサまたはメニイコアプロセッサ）では、各プロセッサコアに１つのスレッドを割り当てて、プログラムを複数スレッドで並列的に実行するプログラム実行モデルが増加することが見込まれる。このようなプログラム実行モデルにおいて任意のプロセッサコアのグループで高速にバリア同期をおこなうため，低速な主記憶を使わないで済む様々なハードウェアバリア同期機構が提案されている。
【０００４】
さらに、近年のプロセッサでは、１つのプロセッサコアで複数のスレッドを並列して実行可能な同時マルチスレッディング（Simultaneous Multithreading）という技術を採用した製品も普及しつつあり、例えば、ハイパースレッディング・テクノロジー （Hyper-Threading Technology）などの名称で実装されたプロセッサ等が知られている。
【０００５】
上述のマルチコアプロセッサまたはメニイコアプロセッサに同時マルチスレッディングを組み合わせることで、１つのソケットに割り当てられるスレッド数を増大させることができ、並列処理を推進する環境が普及しつつある。
【０００６】
マルチコアプロセッサまたはメニイコアプロセッサを採用した計算機システムで、上述のようなプログラム実行モデルで複数のプロセス（またはタスク）を実行する場合は、ひとつのプロセスを複数のスレッドで構成し、並列処理を行うスレッドをグループ化し、各スレッドを割り当てるプロセッサコアにバリア同期の範囲（バリアグループ）を設定している。
【０００７】
そして、複数の任意のプロセッサコアで構成されたバリアグループで高速にバリア同期を行うためには、プロセッサコアの処理能力に比して低速（レイテンシの大きい）な主記憶に対する読み書きを行わないで済むようなバリア同期機構が提案されている。
【０００８】
例えば、上記バリアグループ内の全プロセッサコアがバリアポイントに到達したことをハードウェアで判定し、この判定結果を各プロセッサコアに通知するため、バリアグループを定義するテーブルをハードウェアで設けたものが知られている。例えば、各プロセッサコアが所属するバリアグループを管理するグループ定義テーブルと、各プロセッサコアのバリアポイントへの到達を検知して、バリアグループ毎にバリア同期の成立を判定する機構を備えている（例えば、特許文献１、非特許文献１、特許文献２）。これらの従来例では、グループ定義テーブルを集中して管理するもの（特許文献１、非特許文献１）や、グループ定義テーブルをプロセッサコア毎などで分散して管理するものがあり、また、バリア同期の成立を判定する機構についても、複数のプロセッサコアについて集中的に判定するもの（非特許文献１）や、プロセッサコア毎に分散して判定するものが知られている。
【０００９】
また、複数のバリアグループのバリア同期をソフトウェアで実現する手法も提案されており、例えば、特許文献３や非特許文献２が知られている。これらの従来例では、各スレッドが自己のバリアポイントへの到達を契機に他のスレッドのバリアポイントへの到達状況を取得し、バリアグループ毎にバリア同期の成否を判定するものである。他のスレッドのバリアポイントへの到達状況は、主記憶（または共有メモリ）に設定したカウンタなどに各スレッドがバリアポイントへの到達状況を書き込んでおくことで、他のスレッドのバリアポイントへの到達状況を取得する構成が知られている（特許文献３）。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開平９−６７３４号公報
【特許文献２】特開平２−２３８５５３号公報
【特許文献３】特開２００５−７１１０９号公報
【非特許文献】
【００１１】
【非特許文献１】C. J. Beckmann  他著、“Fast Barrier Synchronization Hardware”
【非特許文献２】山田海斗  他著、“階層グルーピング対応バリア同期機構の評価”、電子情報通信学会  発行、信学技報、Vol. 108、No. 28、ICD2008-20、pp. 19-24、2008年5月
【発明の概要】
【発明が解決しようとする課題】
【００１２】
上記ハードウェアによりバリア同期を行う従来例では、各プロセッサコアが何れのバリアグループに所属するか、を登録するグループ定義テーブルは１種類のみであり、このグループ定義テーブルを集中的に管理するか分散して管理していた。
【００１３】
ここで、上記プロセッサでは、ユーザプログラムを実行するユーザモードと、ＯＳ（Operating System）を実行する特権モード（またはカーネルモード）を備えている。そして、上記従来例では、プロセッサコアが所属するバリアグループを指定するためのグループ定義テーブルが一種類しかないため、グループ定義テーブルをユーザモードと特権モードのどちらで利用するかによって、以下のような問題が生じていた。
【００１４】
第１の問題は、ユーザモードではグループ定義テーブルの参照および更新を禁止し、特権モードでのみ設定させる場合では、プログラム（あるいはプロセス）の実行前にＯＳから静的にバリアグループの設定を行う必要がある。このため、バリアグループの設定を変更するにはＯＳの介在が必須となって、バリアグループ設定の柔軟性が低下してしまう。
【００１５】
また、プログラム実行中に動的にバリアグループを変更するためにはＯＳが介在することになり、ユーザモードから特権モードへ切り替えてバリアグループの設定を変更した後に、特権モードからユーザモードに切り替えてスレッドの実行を継続することになるため、処理のオーバヘッドが大きくなってしまい、演算性能が低下するという問題があった。
【００１６】
第２の問題は、ユーザモードでグループ定義テーブルの設定を許可する場合では、プログラム実行中にＯＳの介在なしで動的にバリアグループを変更することが可能となり、バリアグループを設定する際の柔軟性を高めることができる。しかしながら、複数のプログラム（プロセス）を実行する場合、他のプログラムは自己のバリアグループ以外のバリアグループについてもグループ定義テーブルにアクセスして更新することができる。このため、他のプログラムが悪意のあるプログラムである場合や、プログラムが誤動作したときなどには、当該プログラムに割り当てたバリアグループ以外のバリアグループの設定を変更してしまう恐れがあり、セキュリティレベルが低下する、という問題があった。
【００１７】
また、上記従来例の特許文献３及び非特許文献２のように、プログラムで全プロセッサコアのバリア到達情報を参照し、バリア同期の成否を判定する場合では、他のプログラムによってグループ定義テーブルを変更されることはない。しかしながら、他プログラムは、バリア到達情報を読み込むことが可能であるため、他のプログラムがバリア同期ポイントへの到達を容易に知ることができるというセキュリティ上の問題がある。
【００１８】
そこで本発明は、上記問題点に鑑みてなされたもので、複数のプログラムを並列して実行する計算機において、各プログラムのセキュリティを確保しながらも高速でバリア同期を行うことを目的とする。さらに、本発明は、各プログラムのセキュリティを確保しながら、プログラムの実行中に動的にバリアグループを変更可能なバリア同期を実現することを目的とする。
【課題を解決するための手段】
【００１９】
本発明は、ひとつ以上のハードウェアスレッドを有するプロセッサコアをひとつ以上含むプロセッサを備えた計算機で、並列処理を実行してバリア同期の成立を判定するバリア同期方法において、前記プロセッサコアはユーザモードを含む複数の特権レベルを有し、前記複数のハードウェアスレッドをひとつ以上のグループに分割し、前記ユーザモードより高い特権レベルのときに前記ハードウェアスレッドが前記グループの情報をバリアドメイン定義情報に設定するステップと、前記グループに所属するハードウェアスレッドを前記グループ内でひとつ以上の同期グループに分割し、当該分割した同期グループの情報を前記ハードウェアスレッドが前記ユーザモードのときにバリアグループ定義情報に設定するステップと、前記ハードウェアスレッドのそれぞれが、当該ハードウェアスレッドで実行する処理がバリアポイントに到達したときにバリアポイント到達情報を出力するステップと、前記ハードウェアスレッドのそれぞれが出力したバリアポイント到達情報を受信し、前記バリアグループ定義情報に設定された同期グループと、前記バリアドメイン定義情報に設定された前記グループの情報から、当該ハードウェアスレッドがバリア同期の成否を判定するステップと、を含む。
【発明の効果】
【００２０】
したがって、本発明は、複数のプログラムを同期グループで並列して実行しながら、各プログラムのセキュリティをバリアドメイン間で確保しながらも高速でバリア同期を行うことができる。さらに、本発明は、ユーザモードで設定可能なバリアグループ定義情報を備えることで各プログラムのセキュリティを確保しながら、プログラムの実行中に動的にバリアグループを変更することが可能となって、計算機資源を有効に利用することが可能となる。
【図面の簡単な説明】
【００２１】
【図１】本発明の第１の実施形態を示し、マルチコアプロセッサを用いて並列処理を行う計算機の一例を示すブロック図である。
【図２】本発明の第１の実施形態を示し、計算機で実行されるソフトウェアの構成の一例を示すブロック図である。
【図３】本発明の第１の実施形態を示し、図２のプロセスＡ、Ｂのそれぞれについて、１つずつバリアドメインを割り当てて、１つのバリアドメイン内で動的にバリアグループを変更しながらバリア同期を行う並列処理の一例を示すタイムチャートである。
【図４】本発明の第１の実施形態を示し、ＣＰＵのバリア同期部の一例を示すブロック図である。
【図５】本発明の第１の実施形態を示し、バリア成否判定部の構成を示すブロック図である。
【図６】本発明の第１の実施形態を示し、計算機で行われる全体的な処理の流れを示すフローチャートである。
【図７】本発明の第１の実施形態を示し、ハードウェアスレッドが行うバリア同期処理の一例を示すフローチャートである。
【図８】本発明の第１の実施形態を示し、スレッドバリア同期部の判定部が行うバリア同期処理の一例を示すフローチャートである。
【図９】本発明の第２の実施形態を示し、ＣＰＵのバリア同期部の一例を示すブロック図である。
【図１０】本発明の第２の実施形態を示し、バリア到達状況生成部が行うバリア到達状況生成処理の一例を示すフローチャートである。
【図１１】本発明の第２の実施形態を示し、計算機で行われる全体的な処理の流れを示すフローチャートである。
【図１２】本発明の第３の実施形態を示し、マルチコアプロセッサを用いて並列処理を行う計算機の一例を示すブロック図である。
【図１３】本発明の第４の実施形態を示し、マルチコアプロセッサを用いて並列処理を行う計算機の一例を示すブロック図である。
【図１４】本発明の第５の実施形態を示し、計算機で実行されるソフトウェアの構成の一例を示すブロック図である。
【発明を実施するための形態】
【００２２】
以下、本発明の一実施形態を添付図面に基づいて説明する。
【００２３】
図１は、本発明の第１の実施形態を示し、マルチコアプロセッサを用いて並列処理を行う計算機の一例を示すブロック図である。
【００２４】
＜ハードウェア構成＞
図１において、計算機は複数のＣＰＵコア（またはプロセッサコア）＃０〜＃２を備えたＣＰＵ１と、データやプログラムを格納する主記憶３０と、バリア同期のグループ分けを管理するバリアドメイン定義テーブル４００とを主体にして構成され、ＣＰＵ１と主記憶３０及びバリアドメイン定義部４０はシステムコネクト２０を介して接続される。システムコネクト２０は、ポイントツーポイント接続の双方向通信システムで構成することができ、例えば、ＱＰＩ（Quick Path Interconnect）やHyper Transport、あるいはクロスバー等のネットワークで構成することができる。
【００２５】
ＣＰＵ１は、複数のＣＰＵコア＃０〜＃２を有するマルチコアプロセッサであり、各ＣＰＵコア＃０〜＃２はＣＰＵ１の内部で上述のシステムコネクト２０と同様の通信システムで構成された内部ネットワーク１３によって相互に接続される。
【００２６】
各ＣＰＵコア＃０〜＃２は、上記背景技術で述べた同時マルチスレッディング技術を採用したもので、１つのＣＰＵコアで複数（本実施形態では２つ）のスレッドを並列して実行可能なハードウェアスレッドを備えている。なお、以下の説明では、上記同時マルチスレッディング技術によるスレッドの実行単位をハードウェアスレッドと記載し、１つのＣＰＵコアが複数のハードウェアスレッドを提供し、スレッド（ソフトウェアスレッド）を発行するソフトウェア（ＯＳ等）からは１つのＣＰＵコアをハードウェアスレッドの数に対応する複数のＣＰＵコア（論理ＣＰＵコア）として扱うことができるものである。
【００２７】
また、ＣＰＵ１は、ホモジニアス・マルチコアプロセッサで構成した例を示しており、ＣＰＵ１を構成するＣＰＵコア＃０〜＃２は同一の構成であるので、以下ではＣＰＵコア＃０（１０−０）のみについて説明し、ＣＰＵコア＃１（１０−１）、ＣＰＵコア＃２（１０−２）の説明は省略する。
【００２８】
ＣＰＵコア＃０（図中１０−０）は、ハードウェアスレッド＃０ａ（図中１１−０ａ）、＃０ｂ（図中１１−０ｂ）の２つのハードウェアスレッドを有し、２つのソフトウェアスレッドを並列して処理することができる。そして、ハードウェアスレッド＃０ａは、他のハードウェアスレッドとバリア同期を行うスレッドバリア同期部＃０ａ（後述）に接続される。スレッドバリア同期部＃０ａは、内部ネットワーク１３によって他のハードウェアスレッドと接続されて相互に通信を行う。ハードウェアスレッド＃０ｂは、他のハードウェアスレッドとバリア同期を行うスレッドバリア同期部＃０ｂ（後述）に接続される。スレッドバリア同期部＃０ｂは、内部ネットワーク１３によって他のハードウェアスレッドと通信を行う。
【００２９】
つまり、ＣＰＵコア＃０を構成するハードウェアスレッド＃０ａと＃０ｂは、独立したスレッドバリア同期部＃０ａ、＃０ｂ（１２−０ａ、１２−０ｂ）をそれぞれ有し、内部ネットワーク１３を介して、スレッドバリア同期部＃０ａ、＃０ｂはそれぞれ独立して他のＣＰＵコア＃１、＃２のハードウェアスレッド＃１ａ〜＃２ｂと通信を行い、またバリアドメイン定義部４０にアクセスする。なお、ハードウェアスレッド＃０ａ〜＃２ｂも内部ネットワーク１３にそれぞれ接続されて、バリアポイントに到達したときには、他のハードウェアスレッド＃０ａ〜＃２ｂのスレッドバリア同期部＃０ａ〜＃２ｂにバリアポイント到達情報をブロードキャストする。
【００３０】
一方、ＣＰＵコア＃０は、システムコネクト２０を介して主記憶３０にアクセスし、データの読み書きやプログラムの読み込みを行う。なお、システムコネクト２０には図示しないインターフェースを介してストレージ装置が接続され、ＣＰＵコア＃０は記憶媒体としてのストレージ装置に予め格納されたプログラムを主記憶３０に読み込んでから実行する。
【００３１】
各ハードウェアスレッド＃０ａ、＃０ｂ〜＃２ｂは、少なくとも特権モードとユーザモードの２つの実行モードを備える。これらの実行モードは、特権レベルに予め定義されたもので、特権モードには最も高い特権レベルが設定され、ユーザモードには最も低い特権レベルが設定される。特権モードは、ＯＳやデバイスドライバ等を実行するモードであり、主記憶３０の任意の領域にアクセス可能であり、実行する命令に制限はない。一方、ユーザモードでは、実行する命令の種類が制限される。例えば、ユーザモードではメモリ管理に関連するディスクリプタテーブル、ＣＰＵ１（ハードウェアスレッド＃０ａ、＃０ｂ）のステータスが保存されているフラグレジスタにアクセスする命令などは実行することができない。
【００３２】
以下の説明では、各ハードウェアスレッド＃０ａ〜＃２ｂは、ＯＳを特権モードで実行し、アプリケーションをユーザモードで実行する例を示す。
【００３３】
そして、バリアドメイン定義部４０は、特権モードのハードウェアスレッド＃０ａ〜＃２ｂから書き込みが可能で、ユーザモードのハードウェアスレッド＃０ａ〜＃２ｂからは書き込みを禁止し、読み込みのみに規制する。
【００３４】
また、後述するように、スレッドバリア同期部＃０ａ〜＃２ｂには、直接接続されたハードウェアスレッド＃０ａ〜＃２ｂからのみ書き込みが可能なバリアグループ定義テーブルが設けられる。スレッドバリア同期部＃０ａ〜＃２ｂに直接接続されたハードウェアスレッド＃０ａ〜＃２ｂは、ユーザモードでバリアグループ定義テーブルを書き込むことが許可されている。
【００３５】
なお、スレッドバリア同期部＃０ａ〜＃２ｂと、バリアドメイン定義部４０の詳細については、ソフトウェアの構成の後にバリア同期機構の項で説明する。
【００３６】
＜ソフトウェア構成＞
次に、計算機で実行されるソフトウェアの構成について、図２を参照しながら説明する。図２は、計算機で実行されるソフトウェアの構成の一例を示すブロック図である。ユーザモードと特権モードの２つの特権レベルを備えたＣＰＵ１では、ＯＳ１００が特権モードで実行され、このＯＳ１００上では、プロセスＡ（２００−１）とプロセスＢ（２００−２）からなるタスク２００がユーザモードで実行される。
【００３７】
ここで、ＣＰＵ１が実行するソフトウェアは、１つのタスクが、１つ以上のプロセスで構成され、１つのプロセスが１つ以上のソフトウェアスレッドで構成され、各ソフトウェアスレッドがハードウェアスレッド＃０ａ〜＃２ｂに割り当てられて実行される。なお、以下の説明では、１つのプロセス内で動的にバリアグループを変更しながらバリア同期を行う例を示す。また、プロセスＡ、Ｂは、図示のように１つのタスクを構成するものでもよいし、プロセスＡ、Ｂが異なるタスクを構成するものであっても良い。
【００３８】
図３は、図２のプロセスＡ、Ｂのそれぞれについて、１つずつバリアドメインを割り当てて、１つのバリアドメイン内（プロセス内）で動的にバリアグループを変更しながらバリア同期を行う並列処理の一例を示すタイムチャートである。
【００３９】
なお、バリアドメインは、バリア同期を行う可能性があるハードウェアスレッド（またはプロセッサコア）のグループであり、バリアグループは、バリアドメイン内で実際にバリア同期を実施するハードウェアスレッドである。すなわち、１つのバリアドメインには、１つ以上のバリアグループが定義される。また、図示の例では、１つのプロセスに１つのバリアドメインを割り当てた例を示す。なお、１つのプロセスに複数のバリアドメインを割り当ててもよい。また、本実施形態では、１つのＣＰＵ１の例を示したが、マルチコアプロセッサのＣＰＵを複数（マルチソケット）備えた計算機では、バリアドメイン内に複数のＣＰＵのハードウェアスレッドを含めることができる。
【００４０】
図３の例では、プロセスＡが最大４つのハードウェアスレッド＃０ａ〜１ｂに割り当てられ、プロセスＢが最大２つのハードウェアスレッド＃２ａ、２ｂに割り当てられる例を示している。プロセスＡ、Ｂのハードウェアスレッド＃０ａ〜＃２ｂへの割り当てによって、バリア同期を行うハードウェアスレッドの範囲が設定され、この範囲をバリアドメインと称する。図３の例では、ハードウェアスレッド＃０ａ〜＃１ｂが第１のバリアドメインとしてプロセスＡに割り当てられ、ハードウェアスレッド＃２ａ、＃２ｂが第２のバリアドメインとしてプロセスＢに割り当てられる。なお、バリアドメインの設定はＯＳ１００により後述するように行われる。バリアドメイン内では、少なくとも１つのバリア同期が行われ、バリアポイントに到達すると次の処理が開始される。
【００４１】
図３に示すプロセスＡのバリア同期は、次の通りである。
【００４２】
まず、処理（ソフトウェアスレッド）Ａ−１をハードウェアスレッド＃０ａで実行し、第１のバリアドメイン＃０のハードウェアスレッド＃０ｂ〜＃１ｂは同期待ちとなる。ハードウェアスレッド＃０ａが処理Ａ−１のバリアポイントに到達すると、ハードウェアスレッド＃０ａ、＃０ｂのバリアグループが処理Ａ−２−１を実行し、ハードウェアスレッド＃１ａ、＃１ｂのバリアグループが処理Ａ−２−２を実行する。処理Ａ−２−１と処理Ａ−２−２はひとつのドメイン内で２つのバリアグループによる並列処理が行われる。
【００４３】
処理Ａ−２−１がバリアポイントに到達すると、ハードウェアスレッド＃０ａに処理Ａ−３−１を割り当てて実行させ、ハードウェアスレッド＃０ｂはハードウェアスレッド＃０ａのバリアポイント到達を待つ。
【００４４】
一方、処理Ａ−２−２を実行するハードウェアスレッド＃１ａ、＃１ｂがバリアポイントに到達すると、ハードウェアスレッド＃１ｂに処理Ａ−３−２を割り当てて実行し、ハードウェアスレッド＃１ａはハードウェアスレッド＃０ａの処理待ちに変更される。つまり、ハードウェアスレッド＃０ｂとともにハードウェアスレッド＃０ａのバリアポイント到達を待機する。
【００４５】
そして、ハードウェアスレッド＃０ａの処理Ａ−３−１がバリアポイントに到達すると、３つのハードウェアスレッド＃０ａ、＃０ｂ及び＃１ｂのバリアグループに変更されて、処理Ａ−３−３が実行される。
【００４６】
処理Ａ−３−３と処理Ａ−３−２がバリアポイントに到達すると、バリアグループはひとつのハードウェアスレッド＃０ａと３つのハードウェアスレッド＃０ｂ、＃１ａ、＃１ｂのバリアグループに変更される。ハードウェアスレッド＃０ａは処理Ａ−４−１を実行し、ハードウェアスレッド＃０ｂ、＃１ａ、＃１ｂの同期グループは処理Ａ−４−２を実行する。ハードウェアスレッド＃０ｂ、＃１ａ、＃１ｂのバリアグループはバリアポイントに到達すると、次の処理Ａ−４−３を実行する。
【００４７】
そして、処理Ａ−４−１と処理Ａ−４−３がバリアポイントに到達すると、ハードウェアスレッド＃０ａにのみ処理Ａ−５が割り当てられて実行し、プロセスＡに割り当てられたバリアドメインのうち、ハードウェアスレッド＃０ｂ、＃１ａ、＃１ｂはハードウェアスレッド＃０ａがバリアポイントに到達するまで待機する。
【００４８】
なお、プロセスＢのバリアドメイン内でも上記プロセスＡのバリアドメイン内と同様であり、少なくとも１つのバリアグループにより処理が実行され、バリアグループが動的に変更されて並列処理が実行される。
【００４９】
なお、バリアドメイン内のバリアグループの変更については、上記非特許文献２のコンパイラなどを用いるようにしても良い。
【００５０】
＜バリア同期機構＞
図４はＣＰＵ１のバリア同期機構の一例を示すブロック図である。図１で示したように、計算機は、バリアドメインに所属するハードウェアスレッド＃０ａ〜＃２ｂを設定するためのバリアドメイン定義部４０と、同一バリアドメイン内でバリア同期を実施するためのスレッドバリア同期部＃０ａ〜＃２ｂ（１２−０ａ〜１２−２ｂ）を備える。なお、バリアドメイン定義部４０は計算機内に少なくとも１つあればよい。複数のＣＰＵソケットを備える計算機の場合では、システムコネクト２０でバリアドメイン定義部４０と複数のＣＰＵを接続すればよい。
【００５１】
バリアドメイン定義部４０は、特権モードのハードウェアスレッド＃０ａ〜＃２ｂから書き込み可能、かつ、ユーザモードのハードウェアスレッド＃０ａ〜＃２ｂからは読み出しのみが可能なバリアドメイン定義テーブル４００を有する。
【００５２】
バリアドメイン定義テーブル４００は、図４で示すように、予め設定したバリアドメインの数に応じたエントリ４１１毎に、ＣＰＵ１のハードウェアスレッドの識別子４１３（＃０ａ〜＃２ｂ）毎のフィールド４１２が設定される。
【００５３】
バリアドメイン定義テーブル４００は、特権モードのハードウェアスレッド＃０ａ〜＃２ｂがシステムコネクト２０を介して書き込みを行い、全てのハードウェアスレッド＃０ａ〜＃２ｂ及びスレッドバリア同期部＃０ａ〜＃２ｂがシステムコネクト２０または内部ネットワーク１３を介して読み込むことができる。すなわち、各ＣＰＵコア＃０〜＃３は、各ハードウェアスレッド＃０ａ〜＃２ｂがユーザモードのときにバリアドメイン定義テーブル４００への書き込み命令を実行すると、所定のエラー（例えば、例外など）を返すように予め定義される。
【００５４】
バリアドメイン定義テーブル４００のフィールド４１２のうち、「１」が設定されたハードウェアスレッドが当該エントリ４１１のバリアドメインに所属し、ハードウェアスレッド＃０ａ〜＃２ｂは何れかひとつのバリアドメインに所属することができる。バリアドメイン定義テーブル４００は、複数のハードウェアスレッド＃０ａ〜＃２ｂを１以上のグループ（バリアドメイン）に分割する。図示のバリアドメイン定義テーブル４００の例では、４つのバリアドメイン＃０〜＃３が設定可能であり、バリアドメイン＃０には、フィールド４１２が「１」となっているハードウェアスレッド＃０ａ〜１ｂが所属し、バリアドメイン＃１にはハードウェアスレッド＃２ａ、２ｂが所属しており、バリアドメイン＃２、＃３には所属するハードウェアスレッドが存在しない。
【００５５】
バリアドメイン＃０〜＃３へのハードウェアスレッドの割当は、特権モードで実行されるＯＳ１００により後述するように処理される。
【００５６】
次に、ハードウェアスレッド＃０ａ〜＃２ｂ毎にそれぞれ設けられたスレッドバリア同期部＃０ａ〜＃２ｂは、全て同一の構成であるため、以下ではスレッドバリア同期部＃０ａのみについて説明し、他の説明を省略する。
【００５７】
スレッドバリア同期部＃０ａは、ユーザモードのハードウェアスレッド＃０ａが書き込みを行うバリアグループ定義テーブル１２０と、バリア同期が成立したか否かを判定し、バリア同期の成立時にはハードウェアスレッド＃０ａにバリア同期の成立を通知するバリア成否判定部１３０を主体に構成される。
【００５８】
バリアグループ定義テーブル１２０は、ＣＰＵ１の全てのハードウェアスレッドの識別子（＃０ａ〜＃２ｂ）１２１と、これらの識別子に対応するフィールド１２２をそれぞれ備え、当該スレッドバリア同期部＃０ａのハードウェアスレッド＃０ａ（以下、自ハードウェアスレッドとする）とバリア同期を行うハードウェアスレッド＃０ａ〜＃２ｂのフィールド１２２には「１」が設定され、バリア同期を行わないフィールド１２２には「０」が設定される。すなわち、バリアグループ定義テーブルは、１つのバリアドメインの内部を１つ以上のバリアグループ（同期グループ）に分割する。バリアグループ定義テーブル１２０で当該ハードウェアスレッド＃０ａのフィールド１２２の値が「１」のとき、他のハードウェアスレッドのフィールド１２２で「１」のものが自ハードウェアスレッド＃０ａと同一のバリアグループとなる。なお、自ハードウェアスレッド＃０ａがバリア同期を行わない場合には、バリアグループ定義テーブル１２０の当該ハードウェアスレッド＃０ａのフィールド１２２は「０」に設定される。バリアグループ定義テーブル１２０は、自ハードウェアスレッド＃０ａがユーザモードでも書き込み可能となっており、他のハードウェアスレッドから自ハードウェアスレッド＃０ａのバリアグループ定義テーブル１２０に書き込むことはできない。
【００５９】
バリア成否判定部１３０は、図５で示すように構成される。この図５は、バリア成否判定部１３０の構成を示すブロック図である。バリア成否判定部１３０は、ＣＰＵ１の各ハードウェアスレッド＃０ａ〜＃２ｂからのバリアポイント到達情報を格納するバリアポイント到達情報テーブル１３１と、バリアドメイン定義テーブル４００とバリアグループ定義テーブル１２０とバリアポイント到達情報テーブル１３１の情報から、自ハードウェアスレッド＃０ａが所属するバリアグループのバリア同期が成立したか否かを判定し、バリア同期が成立したときにはバリア成否信号によりハードウェアスレッド＃０ａに同期が成立したことを通知する判定部１３２とを備える。バリア成否信号は、エッジトリガまたはレベルトリガなど周知の手法を採用することができる。本実施形態ではバリア成否信号が「０」から「１」へ変化したときのアップエッジでバリア同期の成立を示す。
【００６０】
バリアポイント到達情報テーブル１３１は、ＣＰＵ１内の全てのハードウェアスレッドの識別子（＃０ａ〜＃２ｂ）１３１１と、これらの識別子に対応するフィールド１３１２を備え、各ハードウェアスレッド＃０ａ〜＃２ｂがバリアポイントに到達する度に内部ネットワーク１３を介してブロードキャストするバリアポイント到達情報を格納する。バリアポイント到達情報テーブル１３１の各フィールド１３１２には、バリアポイントに到達したハードウェアスレッドには「１」が設定され、バリアポイントに到達していないハードウェアスレッドには「０」が設定される。
【００６１】
各ハードウェアスレッド＃０ａ〜＃２ｂは、バリアポイントに到達するとバリアポイント到達情報を「１」にセットして内部ネットワーク１３にブロードキャストする。そして、各ハードウェアスレッド＃０ａ〜＃２ｂは、バリア同期が成立すると（バリア成否信号が「１」）、バリアポイント到達情報を「０」にして内部ネットワーク１３へブロードキャストすることで新たなバリア同期の開始に備える。バリア成否判定部１３０は、内部ネットワーク１３からバリアポイント到達情報を受信すると、該当するハードウェアスレッド＃０ａ〜＃２ｂのフィールド１３１２を更新する。
【００６２】
ここで、各ハードウェアスレッド＃０ａ〜＃２ｂ間のバリアポイント到達情報の伝達は、図４で示すように、内部ネットワーク１３として各ハードウェアスレッド＃０ａ〜＃２ｂ毎にバリアポイント到達情報を伝達するそれぞれ信号線を設けることで、バリア成否判定部１３０はブロードキャストされたバリアポイント到達情報の送信元のハードウェアスレッド＃０ａ〜＃２ｂを特定することができる。なお、各ハードウェアスレッド＃０ａ〜＃２ｂ間のバリアポイント到達情報の伝達をシリアル伝送によって行う場合には、ハードウェアスレッド＃０ａ〜＃２ｂの識別子を付加したバリアポイント到達情報をブロードキャストすればよい。
【００６３】
判定部１３２は、バリアドメイン定義テーブル４００を読み込んで、自ハードウェアスレッド＃０ａとバリア同期を行う可能性のある同一ドメインのハードウェアスレッドを特定する。そして、判定部１３２は、自己のスレッドバリア同期部＃０ａ内のバリアグループ定義テーブル１２０を参照して、自ハードウェアスレッド＃０ａとバリア同期を行うハードウェアスレッドをバリアグループとして特定する。そして、判定部１３２は自ハードウェアスレッド＃０ａと同一のバリアグループのハードウェアスレッドについてバリアポイント到達情報テーブル１３１を監視し、同一のバリアグループのハードウェアスレッドのバリアポイント到達情報が全て「１」になるとバリア同期の成立を判定して、バリア成否信号を「１」に設定してハードウェアスレッド＃０ａにバリア同期の成立を通知する。なお、判定部１３２が行う処理の詳細については、後述する。
【００６４】
また、判定部１３２がバリアポイント到達情報テーブル１３１を監視するタイミングは、例えば、バリアポイント到達情報テーブル１３１が更新されたときであり、内部ネットワーク１３から任意のハードウェアスレッドがバリアポイント到達情報をブロードキャストしたときである。あるいは、判定部１３２が所定の周期でバリアポイント到達情報テーブル１３１を監視することもできる。
【００６５】
また、ハードウェアスレッド＃０ａは、バリア同期が成立した後に、バリアグループ定義テーブル１２０を更新することで、図３で示したように、バリア同期を行うハードウェアスレッドの増減を行うことができる。
【００６６】
＜処理の概要＞
図６は計算機で行われる全体的な処理の流れを示すフローチャートである。この処理は、計算機を起動すると開始される。
【００６７】
まず、ステップＳ１では、計算機が起動するとＣＰＵ１の各ＣＰＵコア＃０〜＃２はハードウェアスレッド＃０ａ〜＃２ｂを設定してから、バリアドメイン定義テーブル４００の全てのフィールド４１２の値を「０」でリセットし、各ハードウェアスレッド＃０ａ〜＃２ｂは自ハードウェアスレッドに結合されたスレッドバリア同期部＃０ａ〜＃２ｂのバリアグループ定義テーブル１２０とバリアポイント到達情報テーブル１３１をそれぞれ「０」でリセットする。なお、バリアドメイン定義テーブル４００のリセットは、ハードウェアスレッド＃０ａ〜＃２ｂのいずれかひとつで行えばよい。
【００６８】
ステップＳ２では、ＣＰＵ１がＯＳ１００を起動する。ＣＰＵ１は、システムコネクト２０を介して図示しないストレージ装置からＯＳ１００（またはＯＳイメージ）を読み込んで、主記憶３０にロードして特権モードでＯＳ１００の実行を開始する。
【００６９】
ＯＳ１００の起動が完了すると、ＣＰＵ１はシステムコネクト２０を介して図示しないストレージ装置からアプリケーションプログラムとしてのタスク２００を読み込んで、主記憶３０にロードしてユーザモードでタスク２００の実行を開始する。なお、図示しないストレージ装置は、ＯＳ１００やタスク２００等のプログラムを格納する記憶媒体として機能する。
【００７０】
ＯＳ１００は、タスク２００を起動すると、図３で示したようにプロセスＡ（２００−１）とプロセスＢ（２００−２）を生成する。
【００７１】
ステップＳ３では、ＯＳ１００は生成したプロセスＡ、Ｂの処理についてハードウェアスレッド＃０ａ〜＃２ｂに割り当てるソフトウェアスレッドを生成する。そして、ＯＳ１００は、生成したソフトウェアスレッドをハードウェアスレッド＃０ａ〜＃２ｂに割り当てる。さらに、特権モードでＣＰＵ１に実行されるＯＳ１００は、ソフトウェアスレッドを実行するハードウェアスレッド＃０ａ〜＃２ｂのバリアドメインを決定して、ドメイン定義テーブル４００を設定する。
【００７２】
ここでＯＳ１００がプロセスＡ、Ｂを生成する手法や、プロセスＡ、Ｂからデータや処理の依存関係に基づいて並列性を考慮してソフトウェアスレッドを生成する手法及びソフトウェアスレッドをハードウェアスレッド＃０ａ〜＃２ｂに割り当てる手法は、周知または公知の技術を用いればよいので、ここでは詳述しない。
【００７３】
また、ＯＳ１００がバリアドメイン決定する手法は、例えば、上述したようにひとつのプロセスにひとつのバリアドメインを付与する。また、バリアドメインを構成するハードウェアスレッド＃０ａ〜＃２ｂの割り当ては、周知または公知の技術を用いればよく、並列処理を行うソフトウェアスレッドの数などから決定しても良いし、プロセスＡ、Ｂを生成するコンパイラで予め指定しても良い。本実施形態では、図３で示したように、プロセスＡに４つのハードウェアスレッド＃０ａ〜１ｂを割り当て、プロセスＢに２つのハードウェアスレッド＃２ａ、２ｂを割り当てた例を示す。
【００７４】
そして、ＣＰＵ１の特権モードで実行されるＯＳ１００が、上記決定したバリアドメインとハードウェアスレッドの割り当てをバリアドメイン定義テーブル４００に書き込む。このバリアドメイン定義テーブル４００への書き込みは、特権モードでＯＳ１００を実行する複数のハードウェアスレッド＃０ａ〜＃２ｂの何れかひととつが、バリアドメイン定義テーブル４００への書き込めばよい。
【００７５】
バリアドメイン定義テーブル４００への書き込み処理は、次のように行われる。ＯＳ１００は、バリアドメイン定義テーブル４００のエントリのうち、全てのフィールド４１２の値が「０」のエントリ（空きエントリ）を検索する。空きエントリが存在する場合、ＯＳ１００は、上記決定したプロセスＡに割り当てるハードウェアスレッド＃０ａ〜＃１ｂに対応するフィールド４１２に「１」を設定し、他のハードウェアスレッド＃２ａ、＃２ｂに「０」を設定して第１のバリアドメインを定義する。さらに、空きエントリを検索して、空きエントリが存在すれば、上記決定したプロセスＢに割り当てるハードウェアスレッド＃２ａ、＃２ｂに対応するフィールド４１２に「１」を設定し、他のハードウェアスレッド＃０ａ〜＃１ｂに「０」を設定して第２のバリアドメインを定義する。本実施形態では図４で示したように、プロセスＡがバリアドメイン＃０に割り当てられ、プロセスＢはバリアドメイン＃１に割り当てられる。
【００７６】
次に、ステップＳ４では、ユーザモードでプロセスＡ、Ｂの各ソフトウェアスレッドをユーザモードで実行するハードウェアスレッド＃０ａ〜＃２ｂが、バリアグループ定義テーブル１２０を設定する。このバリアグループ定義テーブル１２０の設定は、各プロセスＡ、Ｂが割り当てられたバリアドメイン内で、各プロセスＡ、Ｂは生成したソフトウェアスレッドの並列性に応じてバリアグループを設定し、各ソフトウェアスレッドを実行するハードウェアスレッドに自ハードウェアスレッドのスレッドバリア同期部のバリアグループ定義テーブル１２０にバリアグループとなるハードウェアスレッド＃０ａ〜＃２ｂに「１」を設定する。
【００７７】
例えば、図３において、プロセスＡは、処理Ａ−２−１と処理Ａ−２−２をそれぞれ２つのソフトウェアスレッドとして生成し、これらの処理Ａ−２−１、Ａ−２−２は並列性があるので、処理Ａ−２−１をハードウェアスレッド＃０ａ、＃０ｂに割り当て、処理Ａ−２−２をハードウェアスレッド＃１ａ、＃１ｂに割り当てる。
【００７８】
ユーザモードのハードウェアスレッド＃０ａ、＃０ｂはスレッドバリア同期部０ａ、０ｂのバリアグループ定義テーブル１２０に「１１００００」をそれぞれ書き込んで、ハードウェアスレッド＃０ａとハードウェアスレッド＃０ｂをバリアグループとして、処理Ａ−２−１を並列して実行する。一方、ユーザモードのハードウェアスレッド＃１ａ、＃１ｂはスレッドバリア同期部１ａ、１ｂのバリアグループ定義テーブル１２０に「００１１００」をそれぞれ書き込んで、ハードウェアスレッド＃０ａとハードウェアスレッド＃１ｂをバリアグループとして処理Ａ−２−２を並列して実行する。
【００７９】
次に、ステップＳ５、Ｓ６では、後述するように、各ハードウェアスレッド＃０ａ〜＃２ｂのスレッドバリア同期部＃０ａ〜＃２ｂが、自ハードウェアスレッドに割り当てられたソフトウェアスレッドを実行し、当該ソフトウェアスレッドがバリアポイントに到達するとバリアポイント到達情報を他のハードウェアスレッドにブロードキャストし、バリアグループ定義テーブル１２０に設定されたバリアグループ内でバリア同期の成立を監視する。なお、バリアグループ定義テーブル１２０の自ハードウェアスレッド＃０ａの値が「０」の場合は、バリア同期を行わないので、ステップＳ６の処理は省略する。また、バリア同期を行う並列処理については公知または周知の手法を適用することができ、例えば、上記特許文献３の手法を利用することができる。
【００８０】
ステップＳ７では、バリア同期が成立すると、プロセスＡ、Ｂはそれぞれ全てのソフトウェアスレッドが終了したか否かを判定し、全てのソフトウェアスレッドが終了した場合にはステップＳ８に進み、そうでない場合にはステップＳ９へ進む。なお、バリアグループ定義テーブル１２０の自ハードウェアスレッド＃０ａの値が「０」の場合は、バリア同期を行わないので、ステップＳ７で全プロセスが完了した場合にはステップＳ８へ進む。
【００８１】
まだ実行していないソフトウェアスレッドまたはプロセスが残存するステップＳ９では、プロセスＡまたはプロセスＢが現在のバリアグループを変更するか否かを判定する。バリアグループを変更する場合は、ステップＳ１０でプロセスＡまたはプロセスＢが同一バリアドメイン内でバリアグループのメンバーとなるハードウェアスレッド＃０ａ〜＃２ｂを変更し、変更したハードウェアスレッド＃０ａ〜＃２ｂに自スレッドバリア同期部のバリアグループ定義テーブル１２０を更新させる。そして、ステップＳ５のバリア同期処理を繰り返す。
【００８２】
全てのソフトウェアスレッドが終了した場合には、ステップＳ８に進み、ＣＰＵ１の特権モードで実行されるＯＳ１００はプロセスＡ、Ｂからなるタスク２００を終了し、プロセスＡ、Ｂへ割り当てていたハードウェアスレッドに、自スレッドバリア同期部のバリアグループ定義テーブル１２０とバリアポイント到達情報テーブル１３１をリセットさせ、プロセスＡ及びプロセスＢに割り当てていたバリアドメイン定義テーブル４００を、現在当該ＯＳ１００を特権モードで実行しているハードウェアスレッドでリセットしてタスク２００の全プロセスＡ、Ｂを終了する。
【００８３】
＜バリア同期処理におけるハードウェアスレッドの動作＞
次に、上記図６に示したステップＳ５、Ｓ６で、ハードウェアスレッド＃０ａ〜＃２ｂがそれぞれ行うバリア同期処理の一例について図７を参照しながら説明する。図７は、ハードウェアスレッド＃０ａ〜＃２ｂが行うバリア同期処理の一例を示すフローチャートである。以下の説明では、ハードウェアスレッド＃０ａの処理について述べ、他のハードウェアスレッド＃０ｂ〜＃２ｂについても同様である。
【００８４】
ハードウェアスレッド＃０ａ〜＃２ｂは、割り当てられたソフトウェアスレッドを実行してソフトウェアスレッドに予め設定されたバリアポイントに到達すると、図７の処理を開始する。
【００８５】
ステップＳ１１で、ハードウェアスレッド＃０ａ〜＃２ｂの処理がバリアポイントに到達すると、ステップＳ１２でハードウェアスレッド＃０ａ〜＃２ｂはバリアポイント到達情報を「１」に設定して内部ネットワーク１３にブロードキャストする。図４で示したように、内部ネットワーク１３にブロードキャストされたバリアポイント到達情報は、全てのハードウェアスレッド＃０ａ〜＃２ｂのバリア成否判定部１３０に通知されて、各ハードウェアスレッド＃０ａ〜＃２ｂのスレッドバリア同期部０ａ〜＃２ｂによってバリアポイント到達情報テーブル１３１が更新される。
【００８６】
次に、ステップＳ１３では、自スレッドバリア同期部＃０ａ〜＃２ｂからのバリア成否信号が「１」になるまで待機する。そして、自スレッドバリア同期部＃０ａ〜＃２ｂからのバリア成否信号が「１」になると、ステップＳ１４に進んでハードウェアスレッド＃０ａ〜＃２ｂはバリア同期の成立を判定する。
【００８７】
上記ステップＳ１１〜Ｓ１４の処理は、各ソフトウェアスレッドに予め組み込まれたプログラムである。
【００８８】
＜バリア同期処理におけるバリア成否判定部の動作＞
次に、上記図６に示したステップＳ５、Ｓ６で、ハードウェアスレッド＃０ａ〜＃２ｂに接続されたスレッドバリア同期部０ａ〜＃２ｂの判定部１３２で行われるバリア同期処理の一例について図８を参照しながら説明する。図８は、スレッドバリア同期部＃０ａ〜＃２ｂの判定部１３２が行うバリア同期処理の一例を示すフローチャートである。以下の説明では、スレッドバリア同期部＃０ａの判定部１３２の処理について述べ、他のスレッドバリア同期部＃０ｂ〜＃２ｂの判定部１３２についても同様である。図８の処理は、ハードウェアスレッド＃０ａがバリア同期を開始する度に実行される。
【００８９】
まず、ステップＳ２１では、判定部１３２がバリア成否信号を「０」にセットする。次に、ステップＳ２２では、判定部１３２がバリアドメイン定義テーブル４００を読み込んで、自ハードウェアスレッドのフィールド４１２に「１」が設定されているエントリを読み込む。図４の例ではエントリ４１１がバリアドメイン＃０のフィールド４１２のうち、ハードウェアスレッド＃０ａ、＃０ｂ、＃１ａ、＃１ｂの値が「１」に設定され、エントリ４１１がバリアドメイン＃１のフィールド４１２のうち、ハードウェアスレッド＃２ａ、＃２ｂの値が「１」に設定されて図３で示すように、２つのバリアドメインを設定した例を示す。
【００９０】
ステップＳ２３では、判定部１３２は、バリアドメイン定義テーブル４００の自ハードウェアスレッド＃０ａのフィールド４１２が「１」のエントリから、フィールド４１２が「１」に設定されているハードウェアスレッドの識別子４１３を読み込む。そして、判定部１３２は読み込んだ識別子４１３を変数ｂｄに格納する。図４の例では、「＃０ａ」〜｛＃１ｂ｝の４つの識別子が格納される。
【００９１】
ステップＳ２４では、判定部１３２は変数ｂｄが空集合であるか否かを判定する。空集合でなければステップＳ２５に進んでバリア同期の成立を判定する。一方、変数ｂｄが空集合の場合はバリア同期が成立した状態であるのでステップＳ２９の処理に進む。
【００９２】
ステップＳ２５では、判定部１３２が変数ｂｄに格納された識別子のうちの１つを変数ｔｈへ代入する。
【００９３】
ステップＳ２６では、自スレッドバリア同期部＃０ａのバリアグループ定義テーブル１２０のハードウェアスレッドの識別子１２１と変数ｔｈの識別子を比較して、変数ｔｈに対応する識別子１２１のフィールド１２２の値が「１」であるか否かを判定する。つまり、識別子１２１のフィールド１２２の値が「１」であれば自ハードウェアスレッド＃０ａと同一のバリアグループであるか否かを判定し、「０」であればバリア同期を行わないハードウェアスレッドであると判定する。自ハードウェアスレッド＃０ａと同一のバリアグループであると判定した場合には、ステップＳ２７に進み、そうでない場合にはステップＳ２８へ進む。
【００９４】
ステップＳ２７では、同一のバリアグループでバリア同期の監視対象であるハードウェアスレッドの識別子を変数ｔｈを取得して、バリアポイント到達情報テーブル１３１の当該識別子のフィールド１３１２の値が「１」となってバリアポイントに到達するまで待機する。変数ｔｈの識別子に対応するハードウェアスレッドがバリアポイントに到達すると、ステップＳ２８へ進む。
【００９５】
ステップＳ２８では、バリアポイントに到達した変数ｔｈの識別子を変数ｂｄから削除して、次の識別子についてバリアポイントへの到達を監視するためにステップＳ２４へ戻り、上記処理を繰り返す。
【００９６】
ステップＳ２４では、変数ｂｄが空集合になっていれば自ハードウェアスレッド＃０ａとバリア同期を行うバリアグループに所属する全てのハードウェアスレッドがバリアポイントに到達したことを示し、判定部１３２はバリア同期が成立したことを判定する。
【００９７】
バリア同期が成立すると、ステップＳ２９で判定部１３２は、バリアポイント到達情報テーブル１３１を「０」でリセットして次回のバリア同期に備え、バリア成否信号を「１」に設定して自ハードウェアスレッド＃０ａにバリア同期が成立したことを通知する。
【００９８】
そして、ステップＳ３０では、上記ステップＳ２９の処理により自ハードウェアスレッド＃０ａのバリアポイント到達情報テーブル１３１が「０」になったか否かを判定し、「０」になっていればステップＳ２１に戻ってバリア成否信号を「０」にもどす。これにより、「０」から「１」のエッジトリガにより自ハードウェアスレッド＃０ａにバリア同期の成立を通知した後に、バリア成否信号を「０」に戻して次回のバリア同期に備えることができる。
【００９９】
上記処理により、判定部１３２は、バリアドメイン定義テーブル４００のエントリ４１１から自ハードウェアスレッド＃０ａと同一のバリアドメインに設定されたハードウェアスレッドの識別子４１３を取得し、さらに、取得した識別子４１３のうちバリアグループ定義テーブル１２０で同一のバリアグループに設定されたハードウェアスレッドの識別子１２１についてのみバリアポイントに到達したか否かを判定する。同一のバリアグループのすべてのハードウェアスレッドがバリアポイントに到達すると、判定部１３２はバリアポイント到達情報テーブル１３１をクリアしてから、バリア成否信号を「１」に設定して自ハードウェアスレッド＃０ａにバリア同期の成立を通知する。
【０１００】
以上のように、本発明によれば、複数のプログラム（ソフトウェアスレッド）を並列して実行しながら、バリアグループ定義テーブル１２０とバリアポイント到達情報テーブル１３１で同一のバリアグループのみについてバリアポイント到達を監視するので、各プログラムのセキュリティを確保しながらも高速でバリア同期を行うことができる。さらに、本発明では、特権モードで動作するＯＳ１００のみがバリアドメイン定義テーブル４００を更新することができ、ユーザモードのアプリケーションプログラムがバリアドメインを操作するのを禁止したので、各プログラムのセキュリティを確保しながら、ユーザモードで変更可能なバリアグループ定義テーブル１２０を操作することで、プログラムの実行中にバリアドメイン内で動的にバリアグループを変更することが可能となって、計算機資源を有効に利用することが可能となる。
【０１０１】
なお、上記図８では判定部１３２をソフトウェアの処理による例を示したが、がハードウェアで構成するようにしてもよい。
【０１０２】
すなわち、判定部１３２はバリアドメイン定義テーブル４００のエントリ４１１のうち自ハードウェアスレッド＃０ａが所属するバリアドメインのエントリを読み込む。次に、判定部１３２は自ハードウェアスレッド＃０ａのバリアグループ定義テーブル１２０の各フィールド１２２の値を読み込んで、バリアドメイン定義テーブル４００から読み込んだフィールド４１２の値と論理積を求める。この論理積により、判定部１３２は、自ハードウェアスレッド＃０ａとバリア同期を行うハードウェアスレッドをバリアグループとして特定する。
【０１０３】
例えば、図５で示すように、自ハードウェアスレッド＃０ａが属するバリアドメイン＃０に所属するハードウェアスレッドの識別子が＃０ａ〜１ｂのとき、バリアドメイン定義テーブル４００の各フィールド４１２の値は「１１１１００」であり、自ハードウェアスレッド＃０ａのバリアグループ定義テーブル１２０のフィールド１２２の値が「１１００００」のとき、２つのフィールドの値の論理積は「１１００００」となり、判定回路３１２は、論理積の値が「１」となっているハードウェアスレッド＃０ｂが自ハードウェアスレッド＃０ａとバリア同期を行うバリアグループであることを判定する。つまり、バリアドメイン定義テーブル４００で自ハードウェアスレッド＃０ａが所属するエントリの各フィールド４１２の値を、バリアグループ定義テーブル１２０のフィールド１２２の値でマスクした結果をバリアグループとして扱う。なお、上記フィールドの値は、最上位ビットが図４の各テーブルのハードウェアスレッド＃０ａに対応し、最下位ビットはハードウェアスレッド＃２ｂに対応する。
【０１０４】
次に判定部１３２は、バリアドメイン定義テーブル４００とバリアグループ定義テーブル１２０の論理積から求めた値（１１００００）を、監視対象のバリアグループの比較値とし、バリアポイント到達情報テーブル１３１を監視する。判定部１３２による、バリアグループのバリア同期の監視は、上記論理積より求めた比較値のうち「１」となっているハードウェアスレッド（この場合、＃０ａ、＃０ｂ）の値が、バリアポイント到達情報テーブル１３１で全て「１」となったときにバリア同期が成立したと判定する。
【０１０５】
つまり、判定部１３２は、比較値とバリアポイント到達情報テーブル１３１の各フィールド１３１２の値の論理積を求め、この論理積が比較値に一致したときにバリア同期の成立を判定する。図５の例では、バリアドメイン定義テーブル４００とバリアグループ定義テーブル１２０から求めた比較値が「１１００００」で、バリアポイント到達情報テーブル１３１の各フィールド１３１２の値は「１１１００１」となっているとき、比較値とバリアポイント到達情報テーブル１３１の値の論理積は、「１１００００」となって比較値と一致するので、判定部１３２はハードウェアスレッド＃０ａ、＃０ｂのバリア同期の成立を判定する。
【０１０６】
判定部１３２は、バリア同期の成立を判定すると、バリア成否信号により自ハードウェアスレッド＃０ａにバリア同期の成立を通知する。
【０１０７】
このように、バリアドメイン定義テーブル４００とバリアグループ定義テーブル１２０から求めた比較値によってバリアポイント到達情報テーブル１３１をマスクすることができるため、ハードウェアスレッド＃０ａ〜＃２ｂは、同一のバリアグループ以外のバリアポイント到達情報を参照することはできず、バリアグループ間でセキュリティを確保することが可能となる。
【０１０８】
さらに、バリアドメイン定義テーブル４００は、特権モードで動作するＯＳ１００などから設定可能であるが、ユーザモードのタスク２００（またはプロセスＡ、Ｂ）からはバリアドメイン定義テーブル４００を操作することができないので、ソフトウェアスレッドがバリアドメイン定義テーブル４００を変更するのを禁止して、バリアドメイン間のセキュリティを確保することができる。
【０１０９】
以上のように、本発明によれば、複数のプログラムを並列して実行する計算機において、各プログラムのセキュリティを確保しながらも高速でバリア同期を行うことが可能となる。さらに、バリアグループ定義テーブル１２０はユーザモードのソフトウェアスレッドから操作可能としたので、バリアドメイン間のセキュリティを確保しながら、プログラムの実行中に動的にバリアグループを変更することが可能となる。
【０１１０】
＜第２実施形態＞
図９は、第２の実施形態を示し、前記第１実施形態のバリアグループ定義テーブル１２０と判定部１３２をソフトウェアにより実装し、スレッドバリア同期部＃０ａ〜＃２ｂのバリア成否判定部１３０をバリア到達状況生成部１３００に置き換えて、バリア同期の成立の判定（判定部１３２）はハードウェアスレッド＃０ａ〜２ｂの各ソフトウェアスレッドで行うようにしたもので、その他の構成は前記第１実施形態と同様である。
【０１１１】
各ＣＰＵコア＃０〜＃２のスレッドバリア同期部＃０ａ〜＃２ｂは、ハードウェアスレッド＃０ａ〜＃２ｂに他のハードウェアスレッドのバリア到達状況を通知するバリア到達状況生成部１３００のみを備える。
【０１１２】
ハードウェアスレッド＃０ａに設定されるバリアグループ定義テーブル１１２０は、前記第１実施形態の図２、図３に示したプロセスＡ，Ｂのソフトウェアスレッド（処理Ａ−１〜Ｂ−３）によってハードウェアスレッド＃０ａ〜＃２ｂの汎用レジスタ（図示省略）等に設定される。なお、図９においては、ハードウェアスレッド＃０ａ（１１−０ａ）のみについてバリアグループ定義テーブル１１２０及びバリア到達状況生成部１３００を示すが、前記第１実施形態と同様に他のハードウェアスレッド＃０ｂ〜＃２ｂのスレッドバリア同期部＃０ｂ〜＃２ｂも同様の構成であるので図示は省略した。なお、図９ではハードウェアスレッド＃０ａにバリアグループ定義テーブル１１２０を設定する例を示したが、主記憶３０等のＣＰＵ１の外部の記憶装置や、ＣＰＵ１の内部に設けたＤＲＡＭ等に当該バリアグループ定義テーブル１１２００を設定してもよい。
【０１１３】
バリアグループ定義テーブル１１２０は、ＣＰＵ１の全てのハードウェアスレッドの識別子（＃０ａ〜＃２ｂ）１１２１と、これらの識別子に対応するフィールド１１２２をそれぞれ備える。ソフトウェアスレッド（図３の処理Ａ−１〜Ｂ−３）は、当該スレッドバリア同期部＃０ａのハードウェアスレッド＃０ａ（自ハードウェアスレッド）とバリア同期を行うハードウェアスレッド＃０ａ〜＃２ｂのフィールド１１２２には「１」を設定し、バリア同期を行わないフィールド１１２２には「０」を設定する。バリアグループ定義テーブル１１２０は自ハードウェアスレッド＃０ａのフィールド１１２２の値が「１」で、他のハードウェアスレッドのフィールド１１２２で「１」のものが自ハードウェアスレッド＃０ａと同一のバリアグループとなる。
【０１１４】
なお、自ハードウェアスレッド＃０ａがバリア同期を行わない場合には、バリアグループ定義テーブル１１２０の当該ハードウェアスレッド＃０ａのフィールド１１２２は「０」に設定される。
【０１１５】
バリアグループ定義テーブル１１２０は、自ハードウェアスレッド＃０ａがユーザモードでも書き込み可能となっており、他のハードウェアスレッドから自ハードウェアスレッド＃０ａのバリアグループ定義テーブル１１２０に書き込むことはできない。
【０１１６】
スレッドバリア同期部＃０ａのバリア到達状況生成部１３００は、前記第１実施形態の図４のバリア成否判定部１３０と同様に、内部ネットワーク１３から受信した他のハードウェアスレッドのバリア到達情報を格納するバリアポイント到達情報テーブル１３１０を備える。
【０１１７】
バリアポイント到達情報テーブル１３１０は、前記第１実施形態の図４と同様の構成であり、ＣＰＵ１内の全てのハードウェアスレッドの識別子（＃０ａ〜＃２ｂ）１３１１と、これらの識別子に対応するフィールド１３１２を備え、各ハードウェアスレッド＃０ａ〜＃２ｂがバリアポイントに到達する度に内部ネットワーク１３を介してブロードキャストするバリアポイント到達情報を格納する。バリアポイント到達情報テーブル１３１０の各フィールド１３１２には、バリアポイントに到達したハードウェアスレッドには「１」が設定され、バリアポイントに到達していないハードウェアスレッドには「０」が設定される。
【０１１８】
バリア到達状況生成部１３００は、バリアドメイン定義テーブル４００とバリアポイント到達情報テーブル１３１０を監視して、同一のバリアドメイン内のバリア到達状況を自ハードウェアスレッド＃０ａにのみ通知する。
【０１１９】
図１０は、スレッドバリア同期部＃０ａのバリア到達状況生成部１３００で行われる処理の一例を示すフローチャートである。なお、以下の説明ではスレッドバリア同期部＃０ａ及びハードウェアスレッド＃０ａのみについて説明するが、他のスレッドバリア同期部＃０ｂ〜＃２ｂ及びハードウェアスレッド＃０ｂ〜＃２ｂも同様の処理を行う。
【０１２０】
バリア到達状況生成部１３００は、ステップＳ４０で、バリアドメイン定義テーブル４００を読み込んで、自ハードウェアスレッド＃０ａのエントリ４１１のうち、自ハードウェアスレッド＃０ａのフィールド４１２が「１」となっているエントリ４１１の全フィールド４１２を、自ハードウェアスレッド＃０ａが所属するバリアドメインのエントリとして読み込む。
【０１２１】
次に、ステップＳ４１で、バリア到達状況生成部１３００は、ステップＳ４０で読み込んだフィールド４１２の値と、バリアポイント到達情報テーブル１３１０の論理積を求める。そして、バリア到達状況生成部１３００は、この論理積を同一のバリアドメインのバリア到達状況として自ハードウェアスレッド＃０ａに通知する。
【０１２２】
図９の例では、バリアドメイン定義テーブル４００のバリアドメイン＃０のエントリ４１１の各フィールド４１の値が「１１１１００」で、バリアポイント到達情報テーブル１３１０の値が「１０１００１」であるので、これらの論理積は「１０１０００」となり、バリア到達状況生成部１３００は、自ハードウェアスレッド＃０ａとハードウェアスレッド＃１ａがバリアポイントに到達したことを示すバリア到達状況を自ハードウェアスレッド＃０ａに通知する。
【０１２３】
上記の処理により、バリア到達状況生成部１３００は、他のバリアドメインのバリアポイント到達情報をマスクして、自バリアドメイン内のバリアポイント到達情報のみを自ハードウェアスレッド＃０ａに通知することで、バリアドメイン間のセキュリティを確保することができる。
【０１２４】
図１１は第２の実施形態の計算機で行われる全体的な処理の流れを示すフローチャートである。この処理は、計算機を起動すると開始される。
【０１２５】
まず、ステップＳ５１では、計算機が起動するとＣＰＵ１の各ＣＰＵコア＃０〜＃２はハードウェアスレッド＃０ａ〜＃２ｂを設定してから、バリアドメイン定義テーブル４００の全てのフィールド４１２の値を「０」でリセットし、各ハードウェアスレッド＃０ａ〜＃２ｂは自ハードウェアスレッドに結合されたスレッドバリア同期部＃０ａ〜＃２ｂのバリアポイント到達情報テーブル１３１０をそれぞれ「０」でリセットする。なお、バリアドメイン定義テーブル４００のリセットは、ハードウェアスレッド＃０ａ〜＃２ｂのいずれかひとつで行えばよい。
【０１２６】
ステップＳ５２では、ＣＰＵ１が前記第１実施形態の図３に示したＯＳ１００を起動する。ＣＰＵ１は、システムコネクト２０を介して図示しないストレージ装置からＯＳ１００（またはＯＳイメージ）を読み込んで、主記憶３０にロードして特権モードでＯＳ１００の実行を開始する。
【０１２７】
ＯＳ１００の起動が完了すると、ＣＰＵ１は前記第１実施形態と同様にしてシステムコネクト２０を介して図示しないストレージ装置からアプリケーションプログラムとしてのタスク２００を読み込んで、主記憶３０にロードしてユーザモードでタスク２００の実行を開始する。
【０１２８】
ＯＳ１００は、タスク２００を起動すると、図３で示したようにプロセスＡ（２００−１）とプロセスＢ（２００−２）を生成する。
【０１２９】
ステップＳ５３では、ＯＳ１００は生成したプロセスＡ、Ｂの処理についてハードウェアスレッド＃０ａ〜＃２ｂに割り当てるソフトウェアスレッドを生成する。そして、ＯＳ１００は、生成したソフトウェアスレッドをハードウェアスレッド＃０ａ〜＃２ｂに割り当てる。さらに、特権モードでＣＰＵ１に実行されるＯＳ１００は、前記第１実施形態と同様にして、ソフトウェアスレッドを実行するハードウェアスレッド＃０ａ〜＃２ｂのバリアドメインを決定して、ドメイン定義テーブル４００を設定する。
【０１３０】
ここで、ＯＳ１００がバリアドメイン決定する手法は、例えば、上述したようにひとつのプロセスにひとつのバリアドメインを付与する。また、バリアドメインを構成するハードウェアスレッド＃０ａ〜＃２ｂの割り当ては、周知または公知の技術を用いればよく、並列処理を行うソフトウェアスレッドの数などから決定しても良いし、プロセスＡ、Ｂを生成するコンパイラで予め指定しても良い。本実施形態では前記第１実施形態の図３で示したように、プロセスＡに４つのハードウェアスレッド＃０ａ〜１ｂを割り当て、プロセスＢに２つのハードウェアスレッド＃２ａ、２ｂを割り当てた例を示す。
【０１３１】
そして、ＣＰＵ１の特権モードで実行されるＯＳ１００が、上記決定したバリアドメインとハードウェアスレッドの割り当てをバリアドメイン定義テーブル４００に書き込む。このバリアドメイン定義テーブル４００への書き込みは、特権モードでＯＳ１００を実行する複数のハードウェアスレッド＃０ａ〜＃２ｂの何れかひととつが、バリアドメイン定義テーブル４００への書き込めばよい。バリアドメイン定義テーブル４００への書き込み処理は、前記第１実施形態と同様である。
【０１３２】
次に、ステップＳ５４では、ユーザモードでプロセスＡ、Ｂの各ソフトウェアスレッドをユーザモードで実行するハードウェアスレッド＃０ａ〜＃２ｂが、バリアグループ定義テーブル１１２０を設定する。このバリアグループ定義テーブル１１２０の設定は、各プロセスＡ、Ｂが割り当てられたバリアドメイン内で、各プロセスＡ、Ｂは生成したソフトウェアスレッドの並列性に応じてバリアグループを設定し、各ソフトウェアスレッドを実行するハードウェアスレッドに自ハードウェアスレッドのスレッドバリア同期部のバリアグループ定義テーブル１１２０にバリアグループとなるハードウェアスレッド＃０ａ〜＃２ｂに「１」を設定する。
【０１３３】
ハードウェアスレッド＃０ａ〜＃２ｂによるバリアグループ定義テーブル１１２０の設定は、自ハードウェアスレッド＃０ａ〜＃２ｂの汎用レジスタ等に設定する。なお、設定する内容は、前記第１実施形態の図４に示したバリアグループ定義テーブル１２０と同様である。
【０１３４】
次に、ステップＳ５５、Ｓ５６では、各ハードウェアスレッド＃０ａ〜＃２ｂが、自ハードウェアスレッドに割り当てられたソフトウェアスレッドを実行し、当該ソフトウェアスレッドがバリアポイントに到達するとバリアポイント到達情報を他のハードウェアスレッドにブロードキャストし、バリアグループ定義テーブル１１２０に設定されたバリアグループ内でバリア同期の成立を監視する。なお、バリアグループ定義テーブル１１２０の自ハードウェアスレッド＃０ａの値が「０」の場合は、バリア同期を行わないので、ステップＳ６の処理は省略する。また、バリア同期を行う並列処理については公知または周知の手法を適用することができ、例えば、上記特許文献３の手法を利用することができる。
【０１３５】
ステップＳ５７では、バリア同期が成立すると、プロセスＡ、Ｂはそれぞれ全てのソフトウェアスレッドが終了したか否かを判定し、全てのソフトウェアスレッドが終了した場合にはステップＳ５８に進み、そうでない場合にはステップＳ５９へ進む。なお、バリアグループ定義テーブル１１２０の自ハードウェアスレッド＃０ａの値が「０」の場合は、バリア同期を行わないので、ステップＳ７で全プロセスが完了した場合にはステップＳ８へ進む。
【０１３６】
まだ実行していないソフトウェアスレッドまたはプロセスが残存するステップＳ５９では、プロセスＡまたはプロセスＢが現在のバリアグループを変更するか否かを判定する。バリアグループを変更する場合は、ステップＳ６０でプロセスＡまたはプロセスＢが同一バリアドメイン内でバリアグループのメンバーとなるハードウェアスレッド＃０ａ〜＃２ｂを変更し、変更したハードウェアスレッド＃０ａ〜＃２ｂに自スレッドバリア同期部のバリアグループ定義テーブル１１２０を更新させる。そして、ステップＳ５５、Ｓ５６のバリア同期処理を繰り返す。
【０１３７】
全てのソフトウェアスレッドが終了した場合には、ステップＳ５８に進み、ＣＰＵ１の特権モードで実行されるＯＳ１００はプロセスＡ、Ｂからなるタスク２００を終了し、プロセスＡ、Ｂへ割り当てていたハードウェアスレッドに、自スレッドバリア同期部のバリアポイント到達情報テーブル１３１０をリセットさせ、プロセスＡ及びプロセスＢに割り当てていたバリアドメイン定義テーブル４００を、現在当該ＯＳ１００を特権モードで実行しているハードウェアスレッドでリセットしてタスク２００の全プロセスＡ、Ｂを終了する。なお、バリアグループ定義テーブル１１２０は、プロセスが終了する際にハードウェアスレッド＃０ａがクリア（またはレジスタの開放）する。
【０１３８】
以上のように、本第２実施形態においても、複数のプログラムを並列して実行する計算機において、各プログラムのセキュリティを確保しながらも高速でバリア同期を行うことが可能となる。さらに、バリアグループ定義テーブル１１２０は自ハードウェアスレッドのソフトウェアスレッドから操作可能とし、バリア到達状況生成部１３００は同一のバリアドメインのバリアポイント到達情報のみを自ハードウェアスレッドに通知するようにしたので、バリアドメイン間のセキュリティを確保しながら、プログラムの実行中に動的にバリアグループを変更することが可能となる。
【０１３９】
＜第３実施形態＞
図１２は、第３の実施形態を示し、前記第１実施形態のＣＰＵコア＃０〜＃２の内部に設けていたスレッドバリア同期部＃０ａ〜＃２ｂを、ＣＰＵコア＃０〜＃２の外部に設けたもので、その他の構成は前記第１実施形態と同様である。
【０１４０】
スレッドバリア同期部＃０ａ〜＃２ｂは、ＣＰＵコア＃０〜＃２ｂから独立したスレッドバリア同期部１２の内部に設けられる。スレッドバリア同期部１２は、内部ネットワーク１３５０でバリアドメイン定義部４０に接続され、各スレッドバリア同期部＃０ａ〜＃２ｂはそれぞれバリアドメイン定義部４０にアクセスすることができる。
【０１４１】
また、スレッドバリア同期部１２は、内部ネットワーク１３６０を介して各ＣＰＵコア＃０〜＃２ｂのハードウェアスレッド＃０ａ〜＃２ｂに接続され、各ハードウェアスレッド＃０ａ〜＃２ｂと各スレッドバリア同期部＃０ａ〜＃２ｂは、それぞれ直接接続される。なお、各ＣＰＵコア＃０〜＃２は、システムコネクト２０から内部ネットワーク１３７０を介してバリアドメイン定義部４０にアクセスすることができ、特権モードで動作するハードウェアスレッド＃０ａ〜＃２ｂがバリアドメイン定義テーブル４００に書き込むことができる。
【０１４２】
スレッドバリア同期部１２は、ＣＰＵ１の外部に配置しても良く、あるいはＣＰＵ１の内部に配置してもよい。スレッドバリア同期部１２をＣＰＵ１の外部に配置した場合は、既存のＣＰＵ１にスレッドバリア同期部１２を付加することが可能となり、汎用のＣＰＵを用いて並列処理に適した計算機を構築することができる。
【０１４３】
＜第４実施形態＞
図１３は、第４の実施形態を示し、前記第１実施形態のバリアドメイン定義部４０を各ＣＰＵコア＃０〜＃２に分散配置したもので、その他の構成は前記第１実施形態と同様である。
【０１４４】
各ＣＰＵコア＃０〜＃２には、前記第１実施形態の図４に示したバリアドメイン定義テーブル４００を備えたバリアドメイン定義部４０−０〜４０−２がそれぞれ配置される。各バリアドメイン定義部４０−０〜４０−２は、システムコネクト２０を介して相互に通信可能であり、各バリアドメイン定義テーブル４００は、前記第１実施形態と同様に特権モードで動作するハードウェアスレッド＃０ａ〜＃２ｂが書き込むことができ、同一のＣＰＵコア＃０〜＃２のスレッドバリア同期部から参照することができる。また、各バリアドメイン定義部４０−０〜４０−２は、同一のＣＰＵコア＃０〜＃２内のハードウェアスレッドのうち、特権モードで動作するハードウェアスレッドから書き込むことができる。
【０１４５】
各バリアドメイン定義部４０−０〜４０−２は、所定のタイミングで各バリアドメイン定義テーブル４００の同期を取る。なお、所定のタイミングは、バリアドメイン定義部４０−０〜４０−２のいずれかにバリアドメイン定義テーブル４００の更新があったときや、所定の周期毎などである。
【０１４６】
バリアドメイン定義部４０−０〜４０−２を各ＣＰＵコア＃０〜＃２に分散配置することで、スレッドバリア同期部＃０ａ〜＃２ｂがバリアドメイン定義テーブル４００にアクセするレイテンシを低減でき、バリア同期に関する処理をより高速に行って計算機の処理能力を向上させることができる。
【０１４７】
＜第５実施形態＞
図１４は、第５の実施形態を示し、計算機で実行されるソフトウェアの構成の一例を示すブロック図である。
【０１４８】
前記第１〜第４実施形態では、ＣＰＵ１の動作モードが、特権モードとユーザモードを備える例を示したが、本第５実施形態の図１４に示すＣＰＵ１ａは、各ＣＰＵコア＃０〜＃２の動作モード（特権レベル）として、ユーザモードと特権モードに加え、より特権レベルの高いハイパーバイザモード（あるいはＶＭＸ  rootモードやＳＶＭ  hostモード）を有する例を示す。
【０１４９】
ユーザモードと特権モードとハイパーバイザモードの３つの特権レベルを備えたＣＰＵ１ａでは、物理計算機上に複数の論理区画を提供するハイパーバイザ（仮想化機構）５０がハイパーバイザモードで実行され、２つの論理区画上で２つのゲストＯＳ１００−０と１００−１を特権モードで実行する例を示す。図１４の例では、ハイパーバイザ５０がハードウェアスレッド＃０ａ〜＃１ｂを第１の論理区画に割り当て、ハードウェアスレッド＃２ａ、＃２ｂを第２の論理区画に割り当てて、第１の論理区画でゲストＯＳ１００−０を実行し、第２の論理区画でゲストＯＳ１００−１を実行する。そして、ゲストＯＳ１００−０上ではタスク２００−Ａがユーザモードで実行され、ゲストＯＳ１００−１上ではタスク２００−Ｂがユーザモードで実行される。なお、図示はしないが、ハイパーバイザ５０は、前記第１実施形態の主記憶３０にも第１及び第２の論理区画を割り当てる。その他構成は、前記第１実施形態と同様である。
【０１５０】
ハイパーバイザモードを備えたＣＰＵ１ａでは、ユーザモードで設定するバリアグループ定義テーブル１２０と、特権モードで設定するバリアドメイン定義テーブル４００に加え、ハイパーバイザモードで設定するバリアグループ管理テーブル（図示省略）により、バリアドメイン及びバリアグループの管理を行う。
【０１５１】
ハイパーバイザモードで設定するバリアグループ管理テーブルの一例としては、ひとつの論理区画（またはひとつのゲストＯＳ）が使用するハードウェアスレッドの識別子を管理する。つまり、論理区画（またはゲストＯＳ）毎のハードウェアスレッド＃０ａ〜＃２ｂの割り当て状態を管理する。あるいは、論理区画毎に割り当てるハードウェアスレッド＃０ａ〜＃２ｂの範囲をバリアグループ管理テーブルで管理する。
【０１５２】
さらに、ユーザモードの他に、より特権レベルの高いモードがひとつ以上ある場合（特権モード、ハイパーバイザモードなど）には、特権レベルの高いモードの全部または一部に対応するバリアグループの分割情報を用意し、ユーザモードでの設定を含むすべてのバリアグループの分割情報の論理積により、バリア同期を行うバリアグループを定義するようにしてもよい。
【０１５３】
さらに、ユーザモードと特権モードに加えてハイパーバイザモードを備えるＣＰＵ１ａでは、バリアドメイン定義テーブル４００へのアクセスを監視し、特権モードのハードウェアスレッドがバリアドメイン定義テーブル４００を設定する際に、ハイパーバイザモードで動作するハイパーバイザに処理を移し、バリアドメイン定義テーブル４００の設定の妥当性をチェックする。そして、バリアドメイン定義テーブル４００に対する不正または不適切な設定に対しては、適正な設定になるようにハイパーバイザ５０が設定を書き換えるか、あるいはエラーとして処理する。
【０１５４】
例えば，バリアドメイン定義テーブル４００で設定するバリアドメインがシステム分割（論理区画）の範囲（ひとつのＯＳが稼動する範囲）を超えないという制約を設ける場合には、仮に特権モードで当該制約に合致しない設定をしようとした場合には、特権モードからハイパーバイザに制御を移して、バリアドメインがシステム分割の範囲を超えないようにバリアドメイン定義テーブル４００への設定を書き換えるか、あるいはエラーを返してその設定を中止することができる。
【０１５５】
＜補足＞
なお、上記各実施形態では、ＣＰＵ１をホモジニアス・マルチコアプロセッサに本発明を適用した例を示したが、図示はしないが、ヘテロジニアス・マルチコアプロセッサに本発明を適用することができる。
【０１５６】
また、上記各実施形態では、ひとつのＣＰＵ１によるマルチプロセッサシステムの例を示したが、マルチコアプロセッサを複数備えたマルチソケットで計算機を構成した場合には、各ソケットのＣＰＵ同士をシステムコネクト２０で接続し、各ＣＰＵの内部ネットワーク１３とシステムコネクト２０とを結合することで、複数のソケット間でバリア同期を行うことができる。
【０１５７】
また、上記各実施形態では、同時マルチスレッディング技術によるハードウェアスレッドを備えたマルチコアプロセッサをＣＰＵ１として採用した例を示したが、ひとつのＣＰＵコアがひとつのスレッドを処理するマルチコアプロセッサをＣＰＵ１として採用しても良い。
【０１５８】
また、上記各実施形態では、バリアポイント到達情報を「０」または「１」の２値で構成した例を示したが、バリア同期が成立したと誤判定（バリア同期のすり抜け）することを防止するために、バリアポイント到達情報を多値で構成しても良い。あるいは、特開２００９−７５９４８号公報などに開示されるように、バリア同期が成立したと誤判定するのを防止するハードウェアを設けるようにしてもよく、公知または周知の技術を適宜採用すればよい。
【産業上の利用可能性】
【０１５９】
以上のように、本発明はバリア同期により並列処理を行う計算機または計算機システムに適用することができる。
【符号の説明】
【０１６０】
１  ＣＰＵ
１０−０〜１０−２  ＣＰＵコア
１１−０ａ〜１１−２ｂ  ハードウェアスレッド
１２−０ａ〜１２−２ｂ  スレッドバリア同期部
２０  システムコネクト
４０  バリアドメイン定義部
１２０  バリアグループ定義テーブル
１３０  バリア成否判定部
１３１  バリアポイント到達情報テーブル
４００  バリアドメイン定義テーブル
【図１】
0005447807.tif 000002
【図２】
0005447807.tif 000003
【図４】
0005447807.tif 000004
【図５】
0005447807.tif 000005
【図６】
0005447807.tif 000006
【図７】
0005447807.tif 000007
【図８】
0005447807.tif 000008
【図９】
0005447807.tif 000009
【図１０】
0005447807.tif 000010
【図１１】
0005447807.tif 000011
【図１２】
0005447807.tif 000012
【図１３】
0005447807.tif 000013
【図１４】
0005447807.tif 000014
【図３】
0005447807.tif 000015