(57)【要約】【課題】複数のコアをもつコンピュータ・システムにおける同期方法を提供する。【解決手段】スレッドのグループが複数のコアで並列に実行され、前記スレッドのグループは、グループ内の各スレッドが進む前にバリアにおいて他のすべてのスレッドを待つバリア同期を使って同期され；前記スレッドのグループは、第一のスレッドが前記バリアに到達するまで実行され；前記第一のスレッドがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；前記バリアに到達するその後のスレッドは前記第一のスレッドが実行されているコアに移され；他のコアは移されるスレッドの数が増すにつれてパワーダウンされ；前記第一のスレッドが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記スレッドによる使用のために利用可能となる。【選択図】図３
2015210813.tif 000002
【特許請求の範囲】
【請求項１】
複数のコアをもつコンピュータ・システムにおける同期方法であって、
スレッドのグループが複数のコアで並列に実行され、前記スレッドのグループは、グループ内の各スレッドが進む前にバリアにおいて他のすべてのスレッドを待つバリア同期を使って同期され；
前記スレッドのグループは、第一のスレッドが前記バリアに到達するまで実行され；
前記第一のスレッドがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；
前記バリアに到達するその後のスレッドは前記第一のスレッドが実行されているコアに移され；
他のコアは移されるスレッドの数が増すにつれてパワーダウンされ；
前記第一のスレッドが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記スレッドによる使用のために利用可能となる、
同期方法。
【請求項２】
前記第一のスレッドが前記解放条件を検出するとき、前記その後のスレッドは以前に実行されていたコアに戻される、
請求項１記載の同期方法。
【請求項３】
各スレッドが実行のために単一のコアに関連付けられており、コアに関連付けられた唯一のスレッドまたは各スレッドが前記バリアに到達して移される場合、そのコアはパワーダウンされる、
請求項１または２記載の同期方法。
【請求項４】
各スレッドが、一つの関連付けられたコアにピン留めされており、それにより、デフォルトでは、スレッドは最初から最後までそのコア上で実行され、前記バリアの間にのみ移されうる、
請求項１ないし３のうちいずれか一項記載の同期方法。
【請求項５】
各スレッドは単一の非一様メモリ・アーキテクチャ（NUMA）領域に関連付けられており、それにより、あるNUMA領域に関連付けられたスレッドが前記バリアに到達し、移される際、前記NUMA領域内のコアはパワーダウンされる、
請求項１または２記載の方法。
【請求項６】
前記バリアに到達する各スレッドが共有されるカウンタをインクリメントし、
その後のスレッドは、該スレッドによるインクリメント後、前記第一のスレッドが実行されているコアに移される前に、前記解放条件があるかどうかを一度チェックする、
請求項１ないし５のうちいずれか一項記載の方法。
【請求項７】
前記バリアに到達する最後のスレッドは、前記第一のスレッドが実行されているコアに移されず、スレッド実行を継続する、
請求項２ないし６のうちいずれか一項記載の同期方法。
【請求項８】
移された前記その後のスレッドが実行されていたコアにあるローカル・メモリが、前記その後のスレッドが該コアに戻されるまで不変の状態に留まる、
請求項１ないし７のうちいずれか一項記載の同期方法。
【請求項９】
ひとたび前記その後のスレッドが前記第一のスレッドが実行されているコアに移されたとき、前記その後のスレッドはスケジューリング解除され、
前記第一のスレッドが、スケジューリング解除された前記その後のスレッドを、もともと実行されていたコアに戻す前に、覚醒させる、
請求項１ないし８のうちいずれか一項記載の同期方法。
【請求項１０】
前記解放条件は、前記グループのスレッドのうち必要とされる数が前記バリアに到達したというものであり、前記必要とされる数はすべてのスレッドである、
請求項１ないし９のうちいずれか一項記載の同期方法。
【請求項１１】
前記解放条件は、前記グループのスレッドのうち必要とされる数が前記バリアに到達したというものであり、前記必要とされる数はすべてのスレッドより少なく、好ましくは最後のスレッド以外のすべてである、
請求項１ないし９のうちいずれか一項記載の同期方法。
【請求項１２】
前記バリアに到達する一つまたは複数の遅めのスレッドが前記第一のスレッドが実行されているコアに移されず、最後のスレッドが前記バリアに到達するまでポーリング状態にはいり、最後のスレッドが前記バリアに到達したあとでスレッド実行を継続し、
前記その後のスレッドは、最後のスレッドが前記バリアに到達するまで、もともと実行されていたコアに戻されない、あるいは、前記その後のスレッドは、ひとたび前記解放条件が満たされたら前記コアに戻され、最後のスレッドが前記バリアに到達するまでポーリング状態にはいる、
請求項１１記載の同期方法。
【請求項１３】
同期方法を実装するよう構成された複数のコアをもつコンピュータ・システムであって、
コアのグループが、グループ内の各スレッドが進む前にバリアにおいて他のすべてのスレッドを待つバリア同期を使って複数のスレッドの並列実行を許容するよう構成されており；
前記コアは、第一のスレッドが前記バリアに到達するまで前記スレッドの実行を許容するよう構成されており；
前記第一のスレッドが実行されているコアは、次いで、前記第一のスレッドが、前記バリアの終了を示す解放条件があるかどうかをチェックするポーリング状態にはいることを許容するよう構成されており；
さらなるコアは、その後前記バリアに到達するその後のスレッドの実行を許容し、前記その後のスレッドが前記第一のスレッドが実行されているコアに移され、移されるスレッドの数が増す際にパワーダウンされることを許容するよう構成されており；
前記第一のスレッドが実行されているコアは、前記第一のスレッドが前記解放条件を検出することを許容し、前記その後のスレッドが前記さらなるコアに戻ることを許容するよう構成されており；
前記さらなるコアは前記スレッドによる使用のためにパワーアップされるよう動作可能である、
コンピュータ・システム。
【請求項１４】
複数のコアをもつコンピュータ・システム上で実行されるときに方法を実行するコンピュータ・プログラムであって、前記方法において、
スレッドのグループが複数のコアで並列に実行され、前記スレッドのグループは、グループ内の各スレッドが進む前にバリアにおいて他のすべてのスレッドを待つバリア同期を使って同期され；
前記スレッドのグループは、第一のスレッドが前記バリアに到達するまで実行され；
前記第一のスレッドがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；
前記バリアに到達するその後のスレッドは前記第一のスレッドが実行されているコアに移され；
他のコアは移されるスレッドの数が増すにつれてパワーダウンされ；
前記第一のスレッドが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記スレッドによる使用のために利用可能となる、
コンピュータ・プログラム。
【請求項１５】
複数のコアをもつコンピュータ・システムにおける同期方法であって、
プロセスのグループが複数のコアで並列に実行され、前記プロセスのグループは、グループ内の各プロセスが進む前にバリアにおいて他のすべてのプロセスを待つバリア同期を使って同期され；
前記プロセスのグループは、第一のプロセスが前記バリアに到達するまで実行され；
前記第一のプロセスがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；
前記バリアに到達するその後のプロセスは前記第一のプロセスが実行されているコアに移され；
他のコアは移されるプロセスの数が増すにつれてパワーダウンされ；
前記第一のプロセスが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記プロセスによる使用のために利用可能となる、
方法。
【請求項１６】
同期方法を実装するよう構成された複数のコアをもつコンピュータ・システムであって、
コアのグループが、グループ内の各プロセスが進む前にバリアにおいて他のすべてのプロセスを待つバリア同期を使って複数のプロセスの並列実行を許容するよう構成されており；
前記コアは、第一のプロセスが前記バリアに到達するまで前記プロセスの実行を許容するよう構成されており；
前記第一のプロセスが実行中のコアは、次いで、前記第一のプロセスが、前記バリアの終了を示す解放条件があるかどうかをチェックするポーリング状態にはいることを許容するよう構成されており；
さらなるコアが、その後前記バリアに到達するその後のプロセスの実行を許容し、前記その後のプロセスが前記第一のプロセスが実行されているコアに移され、移されるプロセスの数が増す際にパワーダウンされることを許容するよう構成されており；
前記第一のプロセスが実行されているコアは、前記第一のプロセスが前記解放条件を検出することを許容し、前記その後のプロセスが前記さらなるコアに戻ることを許容するよう構成されており；
前記さらなるコアは前記プロセスによる使用のためにパワーアップされるよう動作可能である、
コンピュータ・システム。
【請求項１７】
複数のコアをもつコンピュータ・システム上で実行されるときに方法を実行するコンピュータ・プログラムであって、前記方法において、
プロセスのグループが複数のコアで並列に実行され、前記プロセスのグループは、グループ内の各プロセスが進む前にバリアにおいて他のすべてのプロセスを待つバリア同期を使って同期され；
前記プロセスのグループは、第一のプロセスが前記バリアに到達するまで実行され；
前記第一のプロセスがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；
前記バリアに到達するその後のプロセスは前記第一のプロセスが実行されているコアに移され；
他のコアは移されるプロセスの数が増すにつれてパワーダウンされ；
前記第一のプロセスが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記プロセスによる使用のために利用可能となる、
コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、それだけではないが特に高性能コンピューティング（HPC:  high  performance  computing）用途における、時に中央処理装置（CPU）と称される現代のプロセッサのエネルギー効率に関する。
【背景技術】
【０００２】
HPCシステムにおいては通例、計算集約的なおよび他の大規模なアプリケーションが実行される。そのようなHPCシステムはしばしば、実行可能形式の処理スレッドまたはプロセスのようなイベントの独立した諸シーケンスが並列に自律的に実行できる複数の処理ユニットまたは「コア」がある分散環境を提供する。
【０００３】
多くの異なるハードウェア構成およびプログラミング・モデルがHPCに適用可能である。現在HPCに対する一般的なアプローチは、それぞれ一つまたは複数のマルチコア・プロセッサ（または「チップ」）を有する複数のノードが高速ネットワークによって相互接続されるクラスター・システムである。各ノードは独自のメモリ領域をもつと想定され、該メモリ領域はそのノード内のすべてのコアにとってアクセス可能である。クラスター・システムは、一般的機能を実行するための既存のコード・ライブラリを利用して、ソース・コードを書く人間のプログラマーによってプログラムされることができる。次いでソース・コードはコンパイルされて、より低レベルの実行可能コード、たとえば特定の命令セットをもつプロセッサ型によって実行されることができるISA（Instruction  Set  Architecture［命令セット・アーキテクチャ］）レベルのコードに、あるいは特定のプロセッサ専用のアセンブリ言語にされる。しばしば、アセンブリ・コードをアセンブルまたは（仮想マシンの場合）インタープリットして実行可能な機械コードにする最終段がある。アプリケーションの実行可能形式（時に単に「実行可能物」と称される）は、オペレーティング・システム（OS）の監督のもとで実行される。
【０００４】
複数のコアをもつコンピュータ・システムのアプリケーションは、プログラマーが複数コアの並列処理能力を活用できるようにするためのライブラリを増補した通常のコンピュータ言語（C/C++またはフォートランのような）で書かれてもよい。この点に関し、コアで実行される「プロセス」という言い方をするのが通例である。（マルチスレッド化された）プロセスは、マルチコアCPU内のいくつかのコアにまたがって実行されてもよい。
【０００５】
各プロセスは、プログラムされた命令のシーケンスであり、一つまたは複数のスレッドを含むことがある。スレッドは、オペレーティング・システム・スケジューラによって管理できるプログラムされた命令の最も小さなシーケンスでありうる。同じプロセス内に複数のスレッドが存在でき、しばしばメモリのような資源を共有できる。一方、一般には、プロセスは資源を共有しない。
【０００６】
プログラマーによって使用される一つのライブラリは、メッセージ渡しインターフェース（MPI:  Message  Passing  Interface）であり、これは分散メモリ・モデル（各プロセスがその独自のメモリ領域をもつものと想定される）を使い、プロセス間の通信を容易にする。MPIは、プロセスのグループが定義され、区別されることを許容し、いわゆる「バリア同期（barrier  synchronisation）」のためのルーチンを含む。これは、複数のプロセスまたは処理要素が協働するために重要な特徴である。バリア同期は、すべてのプロセスがプログラム中の同じ点に到達するまでプログラムを実行する同期グループ内のすべてのプロセスをホールドアップする技法である。これは、MPI関数コールによって達成されてもよい。このMPI関数コールがグループの全構成員によって呼び出されてはじめて、実行がさらに進むことができる。
【０００７】
あるいはまた、共有メモリ並列プログラミングでは、すべてのプロセスまたはコアが同じメモリまたはメモリ領域にアクセスできる。共有メモリ・モデルでは、プロセス間のデータの通信を明示的に指定する必要はない（あるプロセスによってなされる変更は他のすべてのプロセスにとって透明なので）。MPIコードについては、スレッド並列コードにおいて、実行がさらに進む前にすべてのスレッドがプログラム中の同じ点にあることを保証するために、バリア同期がしばしば要求される。
【０００８】
エネルギー効率はHPCではますます重要な要因となりつつある。今日最も大きな諸HPCシステム（http://www.top500.org/list/2013/11/）は、最大17MWものエネルギーを引き出すことがある。エネルギーの年間コストは（米国において）MW当たり約100万ドルに達しつつあるので、HPC施設にとってのエネルギーに対する運用経費は、システム設計において決定的な因子となりつつある。将来のエクサスケール・システム（現在最速のシステムより30倍速い）のための提案されている電力予算は20MWである（電力では1.2倍未満の増加）。このように、HPCシステム内での（および他のコンピュータ・システムにおける）電力使用を最適化するための新たな技法の開発は死活的に重要である。
【０００９】
上述したように、現代のCPUはいくつかの物理的なコア（処理ユニット）からなる。たとえば、富士通SPARC64（商標）IXfx  CPUは16個のコアを含む。論理コア（すなわち、アプリケーションによって、利用可能であると感じられるコア）の数は、ハードウェア・マルチスレッド（二つ以上のスレッドを一つの物理コア上に同時にスケジューリングする）の使用によってさらに増加させられることができる。
【００１０】
CPUから最大パフォーマンスを引き出すために、アプリケーションは一般に、CPU内で実行の複数のスレッドを実行する。ここで、異なるスレッドが異なる論理コア上で実行されることができる。いくつかのアプリケーションでは、利用可能な論理コアよりも多くのスレッドがあることがあり、それらのスレッドは、オペレーティング・システム・スケジューラによってコアに動的に割り当てられる。他方、HPCアプリケーションは、各論理コアに一つのスレッドを割り当てる傾向があり、各スレッドは特定の物理コアに「ピン留めされる」ことがある（すなわち、スレッドは最初から最後までこのコア上で実行される）。これらの選択は、データをメモリ階層構造のあちこちに動かす必要を減らし（所与のメモリ・セクションとともに機能するスレッドが同じ物理的位置に留まるので）、資源競合を減らすことができる。
【００１１】
一般に、並列コードにおけるすべてのスレッドは、それらがピン留めされているコア内で、互いとは独立に実行され、共有（すべてのスレッドに可視）または（一つのスレッドに）専用でありうるメモリ内に記憶された変数に作用する。しかしながら、周期的に、それらのスレッドが互いに同期する（たとえば、あるスレッドが専用の変数の値を他のスレッドに通信するためまたは複数のスレッドが共有される変数に書き込む「レース状態」を回避するために、特定の変数の値について集団的に合意する）必要があることがある。これらの同期点は、各スレッドが同じ状態にあることを要求する。よって、最初の（そしてその後の各）スレッドが、同期が実行されるべきコード中の（バリア）点に到達するとき、そのスレッドは、他のすべてのスレッドも同じ状態に到達するまで実行を一時停止して待つ必要がある。すべてのスレッドが同じ状態になるのを待つこのプロセスは、バリア（またはバリア機構）として知られている。これは、MPIプロセスおよび他のプロセスについて上述したバリア同期と同じように機能するが、プロセス毎ではなくスレッド毎に機能する。
【００１２】
図１は、典型的なスレッド・バリア動作を示すタイムライン表現である。同じ図は、単にラベルの「スレッド」を「プロセス」に変えるだけで、プロセス・バリア動作にも当てはまる。これは他の図のすべてにもいえる。
【００１３】
六つのスレッドの場合が示されている。各スレッドは黒の菱形で示される点においてバリアに突き当たる。ひとたび最初のスレッドがバリアに到達するとき、グローバル・バリアが始まると言われ、最後のスレッドがバリアに到達するとき、グローバル・バリアが終わると言われる（その後通常の実行が続けられる）。バリアに到達したスレッドは、他のすべてのスレッドもバリアに到達したかどうかを判定するために能動的にポーリングする。この能動的なポーリング（「ビジー待機（busy  wait）」）は、スレッド0、1、3、4および5について示される斜線の領域である。スレッド2はバリアに到達する最後のスレッドであり、バリアの終了を（よってポーリングの終了を）引き起こす。能動的なポーリングは不必要にエネルギーを消費することがある。
【００１４】
スレッド・バリアを実装するためにさまざまな方法が使われているが、大半は上記で説明した「ビジー待機」（各プロセスがバリアが終了したかどうかを決定する変数の値を求めて繰り返しポーリングする）また実行継続を防ぐためにスレッドをスケジュール解除するブロッキング・アルゴリズムに依拠する。スレッドは、（たとえば）pスレッド・ライブラリ・ルーチンへの呼び出しによってスケジュール解除または再スケジュールされることができる。よって、スレッドに、別のスレッド（最後にバリアに到達するもの）がpthread_cond_broadcast()への呼び出しを行なうまで待つように告げるために、pthread_cond_wait()が使用できる。
【発明の概要】
【発明が解決しようとする課題】
【００１５】
バリア動作に関わる不要に消費されるエネルギーを減らすことが望ましい。
【課題を解決するための手段】
【００１６】
本発明の第一の側面のある実施形態によれば、複数のコアをもつコンピュータ・システムにおける同期方法が提供される。ここで、スレッドのグループが複数のコアで並列に実行され、前記スレッドのグループは、グループ内の各スレッドが進む前にバリア点において他のすべてのスレッドを待つバリア同期を使って同期され、前記スレッドのグループは、第一のスレッドが前記バリア点に到達するまで実行され；前記第一のスレッドがポーリング状態にはいって、バリア同期の終了を示す解放条件があるかどうかを繰り返しチェックし；前記バリア点に到達するその後のスレッドは前記第一のスレッドが実行されているコアに移され；他のコアは移されるスレッドの数が増すにつれてパワーダウンされ；前記第一のスレッドが解放条件を検出するとき、パワーダウンされたコアがパワーアップされる（よって再びスレッドによる使用のために利用可能となる）。
【００１７】
このように、本発明の実施形態によれば、複数のコアで並列に実行されるスレッドのグループがある。それらのコアは、単一のノード上にあってもよいし、あるいはいくつかのノードに拡散していてもよい。単一のノード上で恩恵は最大となるであろう。複数のノードにまたがるバリア同期については、スレッドはノード間で移行されないであろう。よって、スレッドのグループが複数のノード上で実行されるシナリオでは、本方法はそれらのノードのうちの一つのみで実行されて他のノード上の他のスレッドはポーリング状態にはいるかスケジュール解除されるか、あるいはまた、各ノードについてバリアに到達する最初のスレッドがポーリング状態にはいり、そのノード上のその後のスレッドはそのノードからコアに移され、それにより、前記グループのスレッドの少なくとも一つが実行している各ノードが、アクティブである一つのコアおよび、移されるスレッドの数が増すにつれてパワーダウンされる他のコアを含むことができる。
【００１８】
発明実施形態の本記述において、用語「コア」はプロセッサ内の物理的なコア、すなわちたとえばその独自の回路およびキャッシュを含む物理的な処理ユニットをいう。物理的なコアは、プロセッサ内の他のすべての物理的なコアから独立に実行することができてもよい（そして潜在的には、プロセッサの残りの部分とは独立にパワーダウンできてもよい）。
【００１９】
プログラミングのコンテキストでは、物理的なコアは、上記で説明したようにプログラムの実行中に使用できる二つ以上の「論理コア」からなっていてもよい。しかしながら、これらの論理コアはプロセッサ内の物理的な資源を共有し、互いと独立にパワーダウンされることはできない。よって、その使用は本発明の範囲外である。
【００２０】
物理的なコアにピン留めされたスレッドでは特に、バリアは各物理的なコアに、バリアの間能動的にポーリングするスレッドを実行できることを要求する。これはエネルギーを浪費する（有用な計算が実行されることなく多くの物理的なコアでエネルギーが使われるという意味で）。発明者は、よりエネルギー効率のよいバリアなら、自らにピン留めされたポーリングするスレッドを有しかつバリアにおいて待っているだけのコアをパワーダウンし、ひとたびすべてのスレッドが同期点に到達してバリアが終了したときにそれらのコアを再開〔リスタート〕することができるであろうと認識するに至った。
【００２１】
ビジー待機状態にあるコアをパワーダウンすることは、明らかに可能ではない（繰り返しポーリングすることが要求されており、実際、繰り返しメモリにアクセスすることにより通常より多くのエネルギーを使うことがありうる）。他方、ブロッキング・バリアは、待機スレッドがアクティブのままであることを要求しないので、エネルギー節約によりふさわしいと思われるであろう。しかしながら、スレッドが非アクティブである間でも、コアは、ひとたびバリアが終わったときにスレッドを再スケジュールできるために、覚醒したままであることが必要である。さらに、ブロッキング・バリアは一般に、コアが諸スレッドによって過剰に加入されている（oversubscribed）（すなわち、コア当たり一つのスレッドの典型的なHPCの場合ではない）場合に最も好適であると考えられ、ビジー待機ほどよくスケーリングせず（排他制御（ミューテックス）および条件変数およびコンテキスト切り換えのため）、よってHPCシステムで使われる可能性は低い。
【００２２】
発明実施形態は、バリアにおいてビジー待機を実行することが要求されるスレッドの数を減らすよう機能し、バリアにおいて待機しているコアの大半がエネルギー節約のためにパワーダウンされることを許容することができる。根底にある発想は、バリアに到達する最初のスレッドはバリアの終わりを求めて能動的にポーリングするが、他のスレッドはその必要がないということである。二番目およびその後のスレッドはバリアに到達し、もはやアクティブでなくなる。これらその後のスレッドは、それらが実行されていたコアから移され（あるいは「ピン留め解除され」）、最初のスレッドがビジー待機を実行しているコアに移行させられて、スリープにされてもよい（スケジューリング解除され、よって事実上、バリアにおいてブロッキング・アルゴリズムを使う）。ひとたびアクティブなスレッドがなくなったら、計算コアはパワーダウンされることができ、よってエネルギーを節約できる。ひとたび最後のコアがバリアにまたは解放条件のはたらきをする他の何らかの好適な点に到達したら、すべてのコアは再びパワーアップされることができる。
【００２３】
この側面はスレッドに焦点を当てているが、同じ原理および定義は、たとえば分散式アプリケーションにおけるMPIバリアにおけるMPIプロセスのようなプロセスにも適用できることを注意しておくべきである。
【００２４】
好ましい実施形態では、最初のスレッドが解放条件を検出するとき、（最初のスレッドよりあとにバリアに到達する）その後のスレッドは、それらのスレッドが以前に実行していたコアに戻され、バリア後のプログラム実行が続けられる。
【００２５】
各スレッドは実行のために単一のコアに関連付けられていてもよい。それにより、そのコアに関連付けられた当該スレッド（単一のスレッドがある場合）または各スレッド（複数のスレッドがある場合）がバリアに到達して移される場合、そのコアはパワーダウンされる。よって、二つ以上のスレッドが単一のコアに関連付けられているときは、そのコアがパワーダウンできるのは、それらのスレッドすべてが移されたときである。逆に、あるコアに関連付けられたスレッドが一つだけであれば、そのコアは、その単一のスレッドがバリアに到達して移されたら、パワーダウンできる。
【００２６】
スレッドは、それが関連付けられている一つのコアにピン留めされてもよく、よってデフォルトでは、そのスレッドは最初から最後までそのコア上で実行される。スレッドが関連付けられたコアにピン留めされる場合、そのスレッドがバリアの間に移されてもよいのは、その時点でそのスレッドがアクティブ／実行中でないときのみである。
【００２７】
代替として、各スレッドは単一の非一様メモリ・アーキテクチャ（NUMA:  non-uniform  memory  architecture）に関連付けられていてもよい。この場合、スレッドはソケット内のコア間で「浮動する」ことができる。各ノード内に複数のソケットがあってもよく、各ソケットが相異なるNUMA領域に関連付けられていてもよい。各NUMA領域は、そのNUMA領域内に物理的に位置されるメモリ領域への直接的なパイプをもつコアの集まりからなる。
【００２８】
同期のためのスレッドすべてがバリアに到達することに向けた進行をモニタリングするために、いかなる好適な方法が使われてもよい。ある好ましい実施形態では、バリアに到達する各スレッドは共有されるカウンタをインクリメントする。よって、その後のスレッドは、そのインクリメント後、解放条件があるかどうかを一度チェックしてもよい。それらその後のスレッドは次いで、最初のスレッドが実行中のコアに移ってもよい。
【００２９】
必ずしも最初のスレッドのあとにバリアに到達するすべてのスレッドが、実行中のコアから移されるわけではない。あとからバリアに到達するスレッドのいくつかは、実行中のコアに留まってもよい。より好ましくは、バリアに到達する最後のスレッドは、最初のスレッドが実行中のコアに移されない。バリアに到達するこの最後のスレッドは、共有されるカウンタをインクリメントして解放条件があるかどうかをチェックしたのち、単にバリア後に当該プログラムの実行を継続してもよい。
【００３０】
発明実施形態の一つの利点は、たとえその後のスレッドが最初のスレッドが実行中のコアに移されるときでも、移されたその後のスレッドが実行されていたコアのローカル・メモリは不変の状態に留まることができるということである。ひとたびその後のスレッドがこれらのコアに移し戻されたら、スレッド動作が継続できる。こうして、ローカル・メモリはその後は、スレッド実行の継続のため、更新されうる。
【００３１】
ひとたびバリアに到達するその後のスレッドが最初のスレッドが実行中のコアに移されたとき、それらその後のスレッドはスケジューリング解除されてもよく、あるいは同じようにビジー待機状態にはいって解放条件を求めてポーリングしてもよい。好ましくは、それらその後のスレッドはこの点でスケジューリング解除され、より好ましくは、最初のスレッドがスケジューリング解除されたその後のスレッドを、もともと実行されていたコアに戻す前に、覚醒させる。この代替は、エネルギー使用のより大きな削減を提供する。
【００３２】
パワーダウンされたコアの再アクティブ化（および可能性としてはその後のスレッドをもともと実行されていたコアに戻すこと）をトリガーするためには、いかなる好適な解放条件が使用されることもできる。たとえば、単純なタイマーを使うこともでき、またさらにはコアによるエネルギー使用の指標でもよい。この指標は、低下した数のスレッドがまだ実行中であることを示すことができる。
【００３３】
解放条件は、バリア機構の終了を示すが、バリア機構が終了する時より前に与えられることができる（それによりバリア終了の接近を予告し、処理がより迅速に再開できるようにする）。好ましい実施形態では、解放条件は、前記スレッドのグループのうち必要とされる数がバリアに到達したというものである。この必要とされる数は、たとえばすべてのスレッドであってもよく、あるいはスレッドのうち一つ、二つまたは三つを除いてすべてであってもよい。
【００３４】
特に好ましいある実施形態では、解放条件は最後のスレッドを除いたすべてがバリアに到達したというものである。
【００３５】
先述したように、バリアに到達する最後のスレッドは、最初のスレッドが実行中のコアに移される必要はない。また、バリアに到達する一つまたは複数の遅めのスレッドが移されず、その代わり最後のスレッドがバリアに到達するまでポーリング状態にはいることも可能である。たとえば、最後のスレッドが実行を終了する（そしてバリアが終了する）まで非常に短時間である可能性が高いため、最後から二番目のスレッドは最初のスレッドが実行中のコアに移されなくてもよい。
【００３６】
一つまたは複数の遅めのスレッドがポーリング状態にあって移動しておらず、いくつかのその後のスレッドが最初のスレッドが実行中のコアに移されている場合、前記その後のスレッドは、最後のスレッドがバリアに到達する時、もともと実行されていたコアに戻されることができる。
【００３７】
あるいはまた、前記その後のスレッドは、ひとたび前記解放条件が満たされたら戻されて、最後のスレッドがバリアに到達するまでポーリング状態にはいってもよい（解放条件が、最後のスレッドがバリアに到達する前、よってバリア機構が終了する前に生起するとして）。
【００３８】
あるさらなる側面の実施形態によれば、同期方法を実装するよう構成された複数のコアをもつコンピュータ・システムであって、コアのグループが、グループ内の各スレッドが進む前にバリアにおいて他のすべてのスレッドを待つバリア同期を使って複数のスレッドの並列実行を許容するよう構成されており；前記コアは、第一のスレッドが前記バリアに到達するまで前記スレッドの実行を許容するよう構成され；前記第一のスレッドが実行中のコアは、次いで、前記第一のスレッドが、バリアの終了を示す解放条件があるかどうかをチェックするポーリング状態にはいることを許容するよう構成されており；さらなるコアは、その後バリアに到達するその後のスレッドの実行を許容し、前記その後のスレッドが前記第一のスレッドが実行中のコアに移され、移されるスレッドの数が増す際にパワーダウンされることを許容し；前記第一のスレッドが実行されているコアは、前記第一のスレッドが解放条件を検出することを許容し、その後のスレッドが前記さらなるコアに戻ることを許容し、前記さらなるコアは前記スレッドによる使用のためにパワーアップされるよう動作可能である、コンピュータ・システムが提供される。
【００３９】
コンピュータ・システムはHPCシステムであってもよい。該システムはコアの少なくとも一つのグループを有し、それぞれが複数のコアを含む複数のノードを有していてもよい。ノードは通例、相互接続によって接続されており、少なくとも一つのマルチコア・プロセッサおよび入出力機能とともに特定のメモリ領域を含む。
【００４０】
上記で述べられた本発明の陳述は、特にスレッドに言及している。しかしながら、本発明は、コンピューティング・システムにおけるイベントの別の独立なシーケンスであるプロセスにも等しく適用可能である。よって、上記の陳述のすべては、プロセスにも等しく適用可能である。
【００４１】
たとえば、あるさらなる側面のある実施形態によれば、複数のコアをもつコンピュータ・システムにおける同期方法であって、プロセスのグループが複数のコアで並列に実行され、前記プロセスのグループは、グループ内の各プロセスが進む前にバリアにおいて他のすべてのプロセスを待つバリア同期を使って同期され、前記プロセスのグループは、第一のプロセスが前記バリアに到達するまで実行され；前記第一のプロセスがポーリング状態にはいって、バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；前記バリアに到達するその後のプロセスは前記第一のプロセスが実行されているコアに移され；他のコアは移されるプロセスの数が増すにつれてパワーダウンされ；前記第一のプロセスが解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、プロセスによる使用のために利用可能となる、方法が提供される。
【００４２】
プロセスは二つ以上のコアで実行されてもよいが、通常は単一のノード上でのみ実行されうる。各ノードは二つの以上のプロセスを実行していてもよい。
【００４３】
（プロセスのグループが複数のノード上で実行される）いくつかの実施形態では、プロセスはノード間で移動させられてもよい。これは、ノード全体がパワーダウンされることを可能にしうる（ただし、たとえばノード・メモリへの電力が失われるならばこれは不都合でありうる）。二つ以上のノードにまたがる諸プロセスの同期に関わるたいていのシナリオでは、各ノード内の諸プロセスは単一のコアに移され、次いでそのノード内の他のすべてのコアはパワーダウンされる。こうして、全部で一つのコアではなく、ノード当たり一つのコアが立ち上げられたままとなる。
【００４４】
最後の側面のある実施形態によれば、同期方法を実装するよう構成された複数のコアをもつコンピュータ・システムであって、コアのグループが、グループ内の各プロセスが進む前にバリアにおいて他のすべてのプロセスを待つバリア同期を使って複数のプロセスの並列実行を許容するよう構成されており；前記コアは、第一のプロセスが前記バリアに到達するまで前記プロセスの実行を許容するよう構成され；前記第一のプロセスが実行中のコアは、次いで、前記第一のプロセスが、バリアの終了を示す解放条件があるかどうかをチェックするポーリング状態にはいることを許容するよう構成されており；さらなるコアは、その後バリアに到達するその後のプロセスの実行を許容し、前記その後のプロセスが前記第一のプロセスが実行中のコアに移され、移されるプロセスの数が増す際にパワーダウンされることを許容し；前記第一のプロセスが実行されているコアは、前記第一のプロセスが解放条件を検出することを許容し、その後のプロセスが前記さらなるコアに戻ることを許容し、前記さらなるコアは前記プロセスによる使用のためにパワーアップされるよう動作可能である、コンピュータ・システムが提供される。
【００４５】
あるさらなる一般的なプログラム側面によれば、分散コンピュータ・システムのようなコンピューティング装置にロードされた時に該コンピューティング装置を、上記の方法定義の任意のものまたはその任意の組み合わせに基づく方法段階を実行するよう構成するプログラムが提供される。
【００４６】
本発明の種々の側面の任意のものの特徴およびサブ特徴は自由に組み合わされてもよい。たとえば、コンピュータ・システムの好ましい実施形態は、方法の一つまたは複数の好ましい特徴に対応する機能を組み込むよう構成されてもよい。
【００４７】
本発明は、コンピュータ・ハードウェア、ファームウェア、ソフトウェアまたはそれらの組み合わせにおいて実装されることができる。本発明は、一つまたは複数のハードウェア・モジュールによる実行のためにまたは一つまたは複数のハードウェア・モジュールの動作を制御するための、コンピュータ・プログラムまたはコンピュータ・プログラム・プロダクト、すなわち情報担体に、たとえばコンピュータ可読記憶デバイスまたは伝搬される信号に有体に具現されたコンピュータ・プログラムとして実装されることができる。
【００４８】
コンピュータ・プログラムは、コンピュータ・プログラム部分または二つ以上のコンピュータ・プログラムの形であることもでき、コンパイル型またはインタープリタ型を含む任意の形のプログラミング言語で書くことができ、ライブラリ、スタンドアローン・プログラムとしてまたはモジュール、コンポーネント、サブルーチンまたはデータ処理環境における使用に好適な他のユニットとしてを含め、任意の形で展開できる。
【００４９】
本発明の方法段階は、入力データに対して作用して出力を生成することによって本発明の機能を実行するようコンピュータ・プログラムを実行するプログラム可能なプロセッサによって実行されることができる。
【００５０】
本発明は個別的な実施形態を使って記述されている。他の実施形態が付属の請求項の範囲内である。たとえば、本発明の段階は、異なる順序で実行され、それでいて望ましい結果を達成することができる。
【００５１】
実行される実施形態に基づく装置は、ある種の機能を実行するよう構成される、動作可能であるまたは配置されるものとして記述される。この構成または配置は、ハードウェアまたはミドルウェアまたは他の任意の好適なシステムの使用によってであることができる。好ましい実施形態では、構成または配置はソフトウェア、好ましくはアプリケーション・ソフトウェアより低レベルのソフトウェアによる。
【００５２】
本発明についてこれから、図面に示される個別的な限定しない実施形態を参照しつつ説明する。
【図面の簡単な説明】
【００５３】
【図１】スレッドおよびバリアの動作を示す概略図である。
【図２】本発明の一般的な実施形態を描く流れ図である。
【図３】従来技術のバリア動作と発明実施形態に基づくバリア動作の比較を示す図である。
【図４】個別的な発明実施形態の動作を示すフローチャートである。
【発明を実施するための形態】
【００５４】
図２は、本発明の一般的な実施形態を流れ図の形で示している。最初、ステップS10においてスレッドが実行され、ステップS20において第一のスレッドがバリアに到達する。次いで、第一のスレッドはS30において解放条件があるかどうかをチェックする。これは、図中で横方向の破線で示される解放条件が満たされるまで繰り返し実行される。第一のスレッドによるこの動作と並列に、その後のスレッドがステップS40においてバリアに到達し、次いでステップS50において移され、それによりスレッドが存在しなくなったコアはステップS60でパワーダウンできる。ひとたび破線で示される解放条件が満たされたら、これらのコアはステップS70においてパワーアップされ、スレッドはステップS80において実行を続ける。
【００５５】
図３は、従来技術（左）の発明実施形態（右）との比較である。これらの概略図はいずれも、ノードにおけるたとえば六つのコアC0〜C5を示している。六つのコアは一緒になってCPUをなしうる（各ノードについて一つまたは複数のCPUが設けられてもよい）。各コアは、関連付けられた実行スレッドT0〜T5をもつ。従来技術では、すべてのスレッドがコアにピン留めされており、バリアの間、アクティブである。右側の概略図では、スレッドは従来技術と同じレイアウトで実行されてくるが、発明実施形態に基づく方法が実行される。
【００５６】
図３の右側に示されるバリアの例では、コアC0、C1、C4およびC5は、スレッド２がバリアの終わりに達するまでパワーダウンされることができる。（コア３上の）スレッド３が最初にバリアに到達する。このスレッドは、ビジー待機を続ける。しかしながら、スレッド０、１、４および５がバリアに達したときは、コア０、１、４および５からピン留め解除され、コア３上でスリープさせられる。コア０、１、４および５はこの時間の間、パワーダウンされることができる。その間、スレッド２はコア２上で走り続ける。スレッド２（最後のスレッド）がバリアに到達するとき、スレッド３がスレッド０、１、４および５を覚醒させ、それらのスレッドは次いで実行継続のためにコア０、１、４および５に戻される。スレッドが移行させられるとき、それらのスレッドはそれまで走っていたコア上にデータを残し、よってそれらのスレッドの移動においてまたは実行の再開においてデータ転送は関与しない。
【００５７】
図４は、発明実施形態において提案されるバリアを通じたさまざまなスレッドの進行を示すフローチャートである。従来技術（ビジー待機）では、すべてのスレッドがステップS100、S110、S120、S130およびS200を通じる左側のルートを取る。各スレッドはカウンタをインクリメントし、カウンタ値がスレッド数に達するまでポーリングする。
【００５８】
この実施形態の方法を使うと、一つのコアのみがこのエネルギー集約的な動作を実行することを要求される。バリアに到達するその後のスレッドはその代わりに、走っているコアから移され、該スレッドが走っていたコアはその後エネルギー節約のためにパワーダウンされる。バリアの終わりには、すべてのコアが再びパワーアップされ、スレッドはもとの位置に戻される。
【００５９】
最初、ノード（同じメモリを共有する一つまたは複数のCPU）内のN個のコアにピン留めされたN個のスレッドがある。これらのスレッドは、プログラム内の並列領域を実行している（すなわち、全部が独立したタスクを実行している）（S100）。該並列領域の終わりに同期点がある。この同期点はバリアを含み、バリアにおいて各スレッドは、何らかの集団的動作を実行する前に、他のすべてのスレッドが完了するのを待たなければならない。
【００６０】
一つのスレッドが最初にバリアに到達する（S110）。従来技術のバリア実装におけるように、このスレッドは共有されるカウンタ（スレッドのうち何個がこのバリアに到達したかを記録するもの）を0から1にインクリメントさせ（S120）、次いでビジー待機を開始するべきである。ビジー待機では、共有されるカウンタの値がNに達したかどうかを繰り返しチェックする（S130）。（コアn上で走る）n番目のスレッドがバリアに到達するとき（S140）、該スレッドもステップS150において共有されるカウンタを（n−1からnに）インクリメントし、カウンタ値がNに達したかどうかを一度チェックする。達していなければ、ビジー待機を実行するのではなく、このスレッドは走っているコアからピン留め解除され、ステップS160においてバリアに到達した最初のスレッドを実行しているコアに移され、ステップS170においてそこでスケジューリング解除される（すなわち、スリープ状態にはいる）。今やコアn上にスケジュールされた作業はなく、よって（コア当たり一スレッドというこのシナリオでは）このコアはエネルギー節約のためにパワーダウンされる。ここでステップS180においてバリアに到達する最後のスレッドを見ると、ステップS190におけるインクリメント後、共有カウンタの値はNに等しくなる。n＝Nであり、すべてのスレッドがバリアに到達したのである（すなわち、バリアの終了準備ができた）。この状況において、バリアに到達したこのスレッドは、そのコアからピン留め解除されることなく、ステップS200において通常の実行を続けることができる。
【００６１】
その間、バリアに到達した最初のスレッドは、ステップS130において共有カウンタの値をチェックすることを続けている。最後のスレッドがカウンタをインクリメントしてプログラムの通常実行を続けたあとまもなく、このスレッドはカウンタの値が今やNに等しいことに気づく。従来技術では、その際、このスレッドも通常実行を続ける。しかしながら、ここで詳細に説明している発明実施形態では、このスレッドはまず、並列にまたは任意の順序で、他のコアをパワーアップして他のスレッドを覚醒させ（S210）、ステップS220においてそれらのスレッドをもともと走っていた（そしてローカル・メモリがパワーダウンされる前と同じ状態のままである）コアに戻す動作をする必要がある。ひとたびこれがなされたら、すべてのスレッドはステップS200において通常実行を続けることができる。
【００６２】
図３および図４において示される実施形態のためのバリアにおいて使用される上述した厳密なアルゴリズムは、普通ならビジー待機を実行するところのコアの大半をパワーダウンするという主たる特徴を保持しつつ、やや修正することができる。可能な修正は次のようなものを含む。
【００６３】
・方法は、（最後ではなく）最後から二番目のスレッド（または以前のスレッド）がバリアに達するときにスリープ中のコアをパワーアップしてもよい（そして可能性としては、それらのコアにスレッドを戻すプロセスを開始してもよい）。これは、バリアが終了したら（最後のスレッドがバリアに到達したら）すぐにコアが先に進む準備ができているようにすることによって、時間を節約することになる。スレッドがバリアの終わりより前にコアに戻された場合、それらのスレッドはバリアの終わりを判別するためにビジー待機を実行することができることを注意しておく。
【００６４】
・ピン留め解除され移されたコアは、バリアに達した最初のスレッドを走らせているコアに移されたのち、スケジューリング解除されることを要求されなくてもよい。単にこのコア上ですべてのスレッドにビジー待機を実行させることは、一つのスレッドにそうさせるのに比べエネルギーの点でコスト高とはならないことがありうる（各スレッドは交互にポーリングすることになるので）。これは、標準的なブロッキング・バリアに見られるミューテックスおよび条件変数のコストを被らないという利点がある。しかしながら、スレッドを移す際にデータ移動が実行されないことが重要である。
【００６５】
・コアの間でスレッドを移すこととコアを再開することには（時間の面では確実に、そして可能性としてはエネルギーの点で）コストがある可能性が高い。よって、アプリケーションにおけるバリア動作の平均待機時間（および／または平均エネルギー・コスト）のようなパラメータが何らかの閾値より上である場合にのみ、この挙動をオンにすることが望ましいことがありうる。これは、プロファイルに案内された実行を介して（すなわち、システムはアプリケーションの実行中に上記の新たなバリア実装が有利であるか否かを検出する）、あるいはユーザー（システム管理者）が上記の修正されたバリアが使われるべき時を手動で指定することによって、実装されることができる。
【００６６】
・同じ方法論は、MPIプロセスのようなプロセスのためにも使用されることができる。アルゴリズム・レベルでは、プロセスに等しく適用可能にするために必要とされる変更はない。MPIライブラリ内のビジー待機を置換するために変更を実装する必要があり、何らかのメッセージ渡しが要求されることがありうるが、これはノード内でスレッドを使うときの上記アルゴリズムと完全に同様であろう。たとえば、ノード内のプロセスがスレッド・シナリオにおいてと同じであろう二レベルの階層があってもよいが、ノード間の同期の追加的なレベルがあることになる。二レベルの階層は、各ノードが二つ以上のプロセス（たとえば、二つ以上のノードにまたがるべきではないMPIプロセス）を実行していることがありうるからである。よって、各ノード内のプロセスは、スレッド方法論と同様に実装される、上記階層の一つのレベルであってもよい。一方、より高価なノード内バリアは第二のレベルである（そしてノード間のプロセスの移動を含まなくてもよい）。
【００６７】
・発明実施形態は、コア当たり二つ以上のスレッドがあるハードウェア・マルチスレッド（いくつかのインテル実装ではハイパースレッディング（hyper-threading）として知られている）とともに機能することもできる。その場合、諸スレッドは単に、バリアに達した際に単一の物理的なコアに移され、より多くのスレッドがバリアに到達するにつれて他のコアが徐々にシャットダウンする。あるいはまた、一つのコア上の諸スレッドが、所与の数のスレッドがバリアに到達するまで、ビジー待機を実行することができ、次いですべてが移されて当該コアがシャットダウンされる。これは、コア当たり一つのスレッドをもって実行するアプリケーションに比べて恩恵は小さくなることがあるが、それでも有利である。たとえばPOWERアーキテクチャにおけるインテルのハイパースレッディングまたは同時マルチスレッディング（SMT:  simultaneous  multi-threading）のようなハードウェア・マルチスレッドは、HPCアプリケーションのサブセットにおいてのみ有利である。
【００６８】
バリア自身はソフトウェアまたはハードウェアのいずれでも実装できる（おそらくソフトウェアがきわめて普通である）。しかしながら、スレッド移行はまず確実にソフトウェア実装を要求するであろう。よって、発明実施形態はおそらくは少なくとも部分的にはソフトウェア・ベースとなる必要があるであろう。
【００６９】
発明実施形態のバリアはスレッド（またはプロセス）を実行しているコード中に直接書かれることができるが、システム上でのスレッドの振る舞い方を制御するオペレーティング・システムまたはライブラリの一部である可能性がより高い。たとえば、ビジー待機を実行するためにそれらのライブラリに現在存在しているコードを直接置換するものであってもよい。
【００７０】
このように、発明実施形態の方法は、すべてのノード上で利用可能なシステム・ソフトウェア（おそらくはオペレーティング・システムまたはライブラリ）において実装される可能性が高い。バリアがアプリケーション・ソフトウェアにおいて直接的に実装されることは、可能ではあるが、可能性は低い（バリアのような単純なものをすべてのアプリケーションのためのソフトウェアにおいて実装し直さなければならないのは望ましくないであろう）。
【００７１】
発明実施形態は、次の有利な特徴をもちうる：
●関連付けられたスレッドがバリアに到達したコアをパワーダウンする
○従来技術は、バリア動作の間にコアをパワーダウンすることができず、エネルギーが無駄になる。
【００７２】
●バリア動作の間、スレッドをコアからピン留め解除する（コアがパワーダウンできるようにするために必要）。バリアの外ではスレッドはコアにピン留めされたままであることに注意
○従来技術はバリア動作の間、コアの間でスレッドを移動させない（バリアのブロッキング実装によって、ピン留めされているコア上でスケジューリング解除されることはあるが）。
【００７３】
発明実施形態の一つの主要な恩恵は、バリアの間、すべてのコアを実行させはしない（特に、潜在的に高電力なビジー待機を実行させない）結果としての、電力節約であると見ることができる。
【００７４】
好ましい実施形態においては、従来技術の場合のようにコア全部ではなく、バリアにおいてアクティブな（アイドル）コアは一つしかない。これは、待機中のスレッドを関連付けられたコアからピン留め解除し、これらのコアをその後パワーダウンすることによって達成されてもよい。
【００７５】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
（付記１）
複数のコアをもつコンピュータ・システムにおける同期方法であって、
スレッドのグループが複数のコアで並列に実行され、前記スレッドのグループは、グループ内の各スレッドが進む前にバリアにおいて他のすべてのスレッドを待つバリア同期を使って同期され；
前記スレッドのグループは、第一のスレッドが前記バリアに到達するまで実行され；
前記第一のスレッドがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；
前記バリアに到達するその後のスレッドは前記第一のスレッドが実行されているコアに移され；
他のコアは移されるスレッドの数が増すにつれてパワーダウンされ；
前記第一のスレッドが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記スレッドによる使用のために利用可能となる、
同期方法。
（付記２）
前記第一のスレッドが前記解放条件を検出するとき、前記その後のスレッドは以前に実行されていたコアに戻される、
付記１記載の同期方法。
（付記３）
各スレッドが実行のために単一のコアに関連付けられており、コアに関連付けられた唯一のスレッドまたは各スレッドが前記バリアに到達して移される場合、そのコアはパワーダウンされる、
付記１または２記載の同期方法。
（付記４）
各スレッドが、一つの関連付けられたコアにピン留めされており、それにより、デフォルトでは、スレッドは最初から最後までそのコア上で実行され、前記バリアの間にのみ移されうる、
付記１ないし３のうちいずれか一項記載の同期方法。
（付記５）
各スレッドは単一の非一様メモリ・アーキテクチャ（NUMA）領域に関連付けられており、それにより、あるNUMA領域に関連付けられたスレッドが前記バリアに到達し、移される際、前記NUMA領域内のコアはパワーダウンされる、
付記１または２記載の方法。
（付記６）
前記バリアに到達する各スレッドが共有されるカウンタをインクリメントし、
その後のスレッドは、該スレッドによるインクリメント後、前記第一のスレッドが実行されているコアに移される前に、前記解放条件があるかどうかを一度チェックする、
付記１ないし５のうちいずれか一項記載の方法。
（付記７）
前記バリアに到達する最後のスレッドは、前記第一のスレッドが実行されているコアに移されず、スレッド実行を継続する、
付記２ないし６のうちいずれか一項記載の同期方法。
（付記８）
移された前記その後のスレッドが実行されていたコアにあるローカル・メモリが、前記その後のスレッドが該コアに戻されるまで不変の状態に留まる、
付記１ないし７のうちいずれか一項記載の同期方法。
（付記９）
ひとたび前記その後のスレッドが前記第一のスレッドが実行されているコアに移されたとき、前記その後のスレッドはスケジューリング解除され、
前記第一のスレッドが、スケジューリング解除された前記その後のスレッドを、もともと実行されていたコアに戻す前に、覚醒させる、
付記１ないし８のうちいずれか一項記載の同期方法。
（付記１０）
前記解放条件は、前記グループのスレッドのうち必要とされる数が前記バリアに到達したというものであり、前記必要とされる数はすべてのスレッドである、
付記１ないし９のうちいずれか一項記載の同期方法。
（付記１１）
前記解放条件は、前記グループのスレッドのうち必要とされる数が前記バリアに到達したというものであり、前記必要とされる数はすべてのスレッドより少なく、好ましくは最後のスレッド以外のすべてである、
付記１ないし９のうちいずれか一項記載の同期方法。
（付記１２）
前記バリアに到達する一つまたは複数の遅めのスレッドが前記第一のスレッドが実行されているコアに移されず、最後のスレッドが前記バリアに到達するまでポーリング状態にはいり、最後のスレッドが前記バリアに到達したあとでスレッド実行を継続し、
前記その後のスレッドは、最後のスレッドが前記バリアに到達するまで、もともと実行されていたコアに戻されない、あるいは、前記その後のスレッドは、ひとたび前記解放条件が満たされたら前記コアに戻され、最後のスレッドが前記バリアに到達するまでポーリング状態にはいる、
付記１１記載の同期方法。
（付記１３）
同期方法を実装するよう構成された複数のコアをもつコンピュータ・システムであって、
コアのグループが、グループ内の各スレッドが進む前にバリアにおいて他のすべてのスレッドを待つバリア同期を使って複数のスレッドの並列実行を許容するよう構成されており；
前記コアは、第一のスレッドが前記バリアに到達するまで前記スレッドの実行を許容するよう構成されており；
前記第一のスレッドが実行されているコアは、次いで、前記第一のスレッドが、前記バリアの終了を示す解放条件があるかどうかをチェックするポーリング状態にはいることを許容するよう構成されており；
さらなるコアは、その後前記バリアに到達するその後のスレッドの実行を許容し、前記その後のスレッドが前記第一のスレッドが実行されているコアに移され、移されるスレッドの数が増す際にパワーダウンされることを許容するよう構成されており；
前記第一のスレッドが実行されているコアは、前記第一のスレッドが前記解放条件を検出することを許容し、前記その後のスレッドが前記さらなるコアに戻ることを許容するよう構成されており；
前記さらなるコアは前記スレッドによる使用のためにパワーアップされるよう動作可能である、
コンピュータ・システム。
（付記１４）
複数のコアをもつコンピュータ・システム上で実行されるときに方法を実行するコンピュータ・プログラムであって、前記方法において、
スレッドのグループが複数のコアで並列に実行され、前記スレッドのグループは、グループ内の各スレッドが進む前にバリアにおいて他のすべてのスレッドを待つバリア同期を使って同期され；
前記スレッドのグループは、第一のスレッドが前記バリアに到達するまで実行され；
前記第一のスレッドがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；
前記バリアに到達するその後のスレッドは前記第一のスレッドが実行されているコアに移され；
他のコアは移されるスレッドの数が増すにつれてパワーダウンされ；
前記第一のスレッドが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記スレッドによる使用のために利用可能となる、
コンピュータ・プログラム。
（付記１５）
複数のコアをもつコンピュータ・システムにおける同期方法であって、
プロセスのグループが複数のコアで並列に実行され、前記プロセスのグループは、グループ内の各プロセスが進む前にバリアにおいて他のすべてのプロセスを待つバリア同期を使って同期され；
前記プロセスのグループは、第一のプロセスが前記バリアに到達するまで実行され；
前記第一のプロセスがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；
前記バリアに到達するその後のプロセスは前記第一のプロセスが実行されているコアに移され；
他のコアは移されるプロセスの数が増すにつれてパワーダウンされ；
前記第一のプロセスが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記プロセスによる使用のために利用可能となる、
方法。
（付記１６）
同期方法を実装するよう構成された複数のコアをもつコンピュータ・システムであって、
コアのグループが、グループ内の各プロセスが進む前にバリアにおいて他のすべてのプロセスを待つバリア同期を使って複数のプロセスの並列実行を許容するよう構成されており；
前記コアは、第一のプロセスが前記バリアに到達するまで前記プロセスの実行を許容するよう構成されており；
前記第一のプロセスが実行中のコアは、次いで、前記第一のプロセスが、前記バリアの終了を示す解放条件があるかどうかをチェックするポーリング状態にはいることを許容するよう構成されており；
さらなるコアが、その後前記バリアに到達するその後のプロセスの実行を許容し、前記その後のプロセスが前記第一のプロセスが実行されているコアに移され、移されるプロセスの数が増す際にパワーダウンされることを許容するよう構成されており；
前記第一のプロセスが実行されているコアは、前記第一のプロセスが前記解放条件を検出することを許容し、前記その後のプロセスが前記さらなるコアに戻ることを許容するよう構成されており；
前記さらなるコアは前記プロセスによる使用のためにパワーアップされるよう動作可能である、
コンピュータ・システム。
（付記１７）
複数のコアをもつコンピュータ・システム上で実行されるときに方法を実行するコンピュータ・プログラムであって、前記方法において、
プロセスのグループが複数のコアで並列に実行され、前記プロセスのグループは、グループ内の各プロセスが進む前にバリアにおいて他のすべてのプロセスを待つバリア同期を使って同期され；
前記プロセスのグループは、第一のプロセスが前記バリアに到達するまで実行され；
前記第一のプロセスがポーリング状態にはいって、前記バリアの終了を示す解放条件があるかどうかを繰り返しチェックし；
前記バリアに到達するその後のプロセスは前記第一のプロセスが実行されているコアに移され；
他のコアは移されるプロセスの数が増すにつれてパワーダウンされ；
前記第一のプロセスが前記解放条件を検出するとき、パワーダウンされたコアがパワーアップされ、前記プロセスによる使用のために利用可能となる、
コンピュータ・プログラム。
【符号の説明】
【００７６】
S10  スレッドを実行
S20  第一のスレッドがバリアに到達
S30  第一のスレッドが解放条件を検査
S40  その後のスレッドがバリアに到達
S50  その後のスレッドが移される
S60  コアがパワーダウンされる
S70  コアがパワーアップされる
S80  スレッドを実行
S100  通常の実行（全スレッド）
S110  第一のスレッドがバリアに到達
S120  共有カウンタをインクリメント
S130  カウンタがスレッド数に等しいか？
S140  その後のスレッドがバリアに到達
S150  共有カウンタをインクリメント
S160  第一のスレッドを実行中のコアに移動
S170  スリープ
S180  最後のスレッドがバリアに到達
S190  共有カウンタをインクリメント
S200  通常の実行（全スレッド）
S210  スリープ中のスレッドおよびコアを覚醒
S220  もとのコアに移動
【図１】
2015210813.tif 000003
【図２】
2015210813.tif 000004
【図３】
2015210813.tif 000005
【図４】
2015210813.tif 000006