JP4448784B2 - 並列計算機の同期方法及びプログラム - Google Patents

並列計算機の同期方法及びプログラム Download PDF

Info

Publication number
JP4448784B2
JP4448784B2 JP2005072633A JP2005072633A JP4448784B2 JP 4448784 B2 JP4448784 B2 JP 4448784B2 JP 2005072633 A JP2005072633 A JP 2005072633A JP 2005072633 A JP2005072633 A JP 2005072633A JP 4448784 B2 JP4448784 B2 JP 4448784B2
Authority
JP
Japan
Prior art keywords
synchronization
thread
threads
group
barrier synchronization
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2005072633A
Other languages
English (en)
Other versions
JP2006259821A (ja
Inventor
恒一 高山
秀貴 青木
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2005072633A priority Critical patent/JP4448784B2/ja
Priority to US11/312,345 priority patent/US7908604B2/en
Publication of JP2006259821A publication Critical patent/JP2006259821A/ja
Application granted granted Critical
Publication of JP4448784B2 publication Critical patent/JP4448784B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/522Barrier synchronisation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multi Processors (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Description

本発明は、並列計算機おけるバリア同期処理に関し、特に多重のバリア同期を実現する計算機に関する。
複数のプロセッサにそれぞれスレッド(またはプロセス)を割り当てて、各プロセッサがそれぞれ演算を行う並列計算機では、各スレッドに予め設定されたバリア同期ポイントにてプロセッサ間の同期を取るバリア同期処理を行っている。
例えば、複数のプロセッサが共有メモリを相互に参照可能なSMP(Symmetric Multiple Processors)形式の並列計算機では、各プロセッサ上のスレッドは、それぞれ他のスレッドのデータにアクセスでき、演算結果をスレッド間で交換する。このため、各スレッド間では予め設定した演算処理が完了する度に同期を取って、各スレッドが次の演算を開始するためには、各スレッドの演算が予め設定した同期ポイントまで終了したことを確認するための同期処理が必要となる。プログラムで予め設定された同期ポイントに全てのプロセッサが到達しない限り、どのプロセッサも同期ポイントを超えて実行させないことで、プロセッサ間の同期を行っている。このようなプロセッサ間の同期処理を高速に行う技術として、ハードウェアによるバリア同期機構が知られている(例えば、特許文献1)。
また近年、ひとつのLSIパッケージに複数のプロセッサコアを実装するマルチコア・マイクロプロセッサが採用されつつあり、物理的なプロセッサコアを複数用意することで、並列処理の処理速度を向上しようというものである。さらに、アプリケーションやOSでは、一つのタスクを複数のスレッド(またはプロセス)に分割して並列処理を円滑に追考する高速化することが可能となっている。
特開平11−312418号
上記従来例では、ハードウェアバリア同期機構が一つのプロセッサ(チップ)に一つの信号線を提供しており、各プロセッサ間では一つのスレッドについて同期を取ることができるが、複数のスレッドを同期させることはできない。このため、一つのチップに複数のプロセッサコアを実装したマルチコア・マイクロプロセッサを採用し、マルチスレッドで並列処理を行おうとすると、プロセッサ側では複数のスレッドを並列的に処理することが可能であっても、同期処理はひとつのスレッドについてのみしか行えないため、並列処理を効率よく行うことができない、という問題が生じていた。
ハードウェアバリア同期機構が、複数の同期を取れるように各プロセッサコアに対して信号線を設けることも可能ではあるが、ハードウェアの構成が複雑になって並列計算機の価格が極めて高価になるという問題があり、さらに、ひとつのプロセッサコアに対して複数のスレッドを割り当てた場合には、ハードウェアバリア同期機構ではいずれかひとつのスレッドしか同期を取ることができず、複数のスレッドをひとつのプロセッサコアに割り当てるマルチスレッドによる並列処理を効率よく行うことができない、という問題があった。
そこで本発明は、上記問題点に鑑みてなされたもので、計算機の価格の上昇を抑制しながら、ひとつのプロセッサに複数のスレッドを割り当てる並列処理でスレッド間の同期を行うことを目的とする。
本発明は、それぞれが複数のプロセッサコアを有する複数のプロセッサと、前記複数のプロセッサコアがアクセスする主記憶とを有し、前記プロセッサコアと前記主記憶との間に前記複数のプロセッサコアで実行される複数のスレッド間または前記複数のプロセッサコア間あるいは前記複数のプロセッサ間で共有可能な共有記憶域を階層的に備えた計算機システムにおいて、前記複数のスレッドを並列的に実行するためのバリア同期を行う同期方法であって、記プロセッサコアのそれぞれに複数のスレッドを割り当てて実行させる処理と、前記複数のスレッドを階層構造のグループに設定する処理と、前記グループ毎にバリア同期を取る処理と、を含み、前記複数のスレッドを階層構造のグループに設定する処理は、前記共有記憶域の階層毎にバリア同期を行うグループを設定し、前記グループ毎にバリア同期を取る処理は、前記グループ内でバリア同期を取る処理と、前記グループ間でバリア同期を取る処理と、を含む。
したがって、本発明は、バリア同期を取るスレッドを階層構造のグループにまとめ、これら同期グループ毎にバリア同期処理を行うようにしたので、マルチコア・マイクロプロセッサを用いてひとつのプロセッサコアでマルチスレッド処理により並列処理を行う場合であっても、多数のスレッドの同期を確実に取ることができる。
以下、本発明の実施形態を添付図面に基づいて説明する。
図1は、第1の実施形態を示し、本発明を適用するマルチコア・マイクロプロセッサを用いた共有メモリ型のマルチプロセッサシステムで並列計算機を構成する例を示す。
<ハードウェア構成>
図1において、並列計算機は複数のプロセッサモジュール(プロセッサ)P0〜P7からなるマルチプロセッサを有し、各プロセッサモジュールP0〜P7は、ひとつのモジュールに複数のプロセッサコア(図中cpu0〜15)を実装しており、ひとつのプロセッサモジュールP0には、2つのプロセッサコアが実装されている。例えば、プロセッサモジュールP0は、プロセッサコアcpu0とcpu1を備え、2つのCPUが並列して動作可能となっている。
そして、プロセッサコアcpu0、cpu1はそれぞれ独立した1次キャッシュメモリ(以下、1次キャッシュという)L1−0、L1−1を有する。さらに、2つのプロセッサコアcpu0、1の1次キャッシュL1−0、1は、プロセッサモジュールP0に設けたひとつの2次キャッシュメモリ(以下、2次キャッシュという)L2−0に接続されている。そして、1次キャッシュL1−0、L1−1は各プロセッサコアcpu0、1上で実行される複数のスレッド間で共有される共有記憶域(共有記憶部)として機能する。なお、本実施形態では各プロセッサコア上で実行されるスレッドは、プログラムを構成する単位(プロセスなど)であっても良いし、プログラムそのものであっても良い。また、各スレッドは同一の処理手順で構成されて異なるデータを処理し、バリア同期により並列処理を行うものであっても良いし、あるいは、各スレッドが異なる処理手順で構成されて、データを受け渡しするためにバリア同期により並列処理を行うものであっても良い。
2次キャッシュL2−0は2つのプロセッサコアcpu0、cpu1に接続されて、これらのプロセッサコアcpu0、1で共有する共有記憶域として機能する。
他の各プロセッサモジュールP1〜P7も上記プロセッサモジュールP0と同様に構成され、それぞれひとつのモジュールに2つのプロセッサコアcpuと2つの1次キャッシュL1−1〜7と、ひとつの2次キャッシュL2−1〜7を備えている。
各プロセッサモジュールP0〜P7は、3次キャッシュメモリ(以下、3次キャッシュという)L3に接続されており、この3次キャッシュL3は各プロセッサモジュールP0〜P7間で共有する共有記憶域として機能する。なお、図1においては、プロセッサモジュールP0〜P3(cpu0〜7)でひとつの3次キャッシュL3を共有し、プロセッサモジュールP4〜P7(cpu8〜15)で異なる3次キャッシュL3を共有する例を示したが、ひとつの3次キャッシュL3をプロセッサモジュールP0〜P7で共有しても良い。また、3次キャッシュL3は、各プロセッサモジュールP0〜P7のフロントサイドバスに相当する位置に設けたが、図示はしないがバックサイドバスに設けても良い。
さらに、プロセッサモジュールP0〜P7間で共有される3次キャッシュL3は主記憶MMに接続され、主記憶MMはプロセッサモジュールP0〜P7(cpu0〜15)で共有される。なお、主記憶MMは図示しないコントローラ(例えば、ノースブリッジ等のチップセットやスイッチ)を介して各プロセッサモジュールP0〜P7に接続され、また、各プロセッサモジュールP0〜P7は上記コントローラを介して外部記憶装置(例えば、HDD)やネットワークインターフェースに接続される。
上記共有記憶域は、プロセッサコアcpu0〜15側から主記憶MMに向けて順に1次キャッシュL1(第1の共有記憶域)、2次キャッシュL2(第2の共有記憶域)、3次キャッシュL3(第3の共有記憶域)の順で階層的に配置され、プロセッサコアから離れる(主記憶MM側)につれて共有する範囲が同一のプロセッサコア上のスレッド間から、プロセッサコア間、プロセッサモジュール間と、上位の階層になるほど広くなる階層構造となっている。
そして、各プロセッサコアcpu0〜15には、プロセッサコア間で並列処理のバリア同期を行うためのハードウェアバリア同期機構100が接続される。
<ハードウェアバリア同期機構>
ハードウェアバリア同期機構100は、図3で示すように、各プロセッサコアcpu0〜15に接続されており、バリア同期処理を行うcpu0〜15の範囲またはグループを設定するバリア同期範囲設定部101と、プロセッサコアcpu0〜15毎にバリア同期ポイント(バリア同期の位置情報)に到達したプロセッサコアの情報を保持する同期ポイント到達情報保持部102を備えている。
ハードウェアバリア同期機構100は、バリア同期範囲設定部101で設定されたグループのプロセッサコアが所定のバリア同期ポイントに到達すると、同期ポイント到達情報保持部102にバリア同期ポイントに到達したことを記録し、当該グループの全てのプロセッサコアがバリア同期ポイントに到達すると、このグループの全てのプロセッサコアに同期完了を通知する。なお、この通知は、前記従来例の特開平11−312418号と同様に割り込みを用いても良いし、図3のように、プロセッサコアの1次キャッシュメモリL1等の所定の記憶域に同期完了を示す情報(例えば、終了フラグ等)を書き込むようにしても良い。
<ソフトウェア構成>
次に、図2は各プロセッサコアcpu0〜15で実行される処理の一例を示し、各cpu0〜15にそれぞれ2つのスレッドTh0〜31を割り当てて、合計32のスレッドを並列的に実行する例を示す。すなわち、ひとつのプロセッサモジュールには4つのスレッドが割り当てられ、モジュール上の2つのプロセッサコアにはそれぞれ2つのスレッドが均等に割り当てられる。
図2において、バリア同期処理を行うプロセッサモジュール(またはプロセッサコア)を同期グループGrとし、この同期グループの一例としてプロセッサモジュールP0、P1のプロセッサコアcpu0〜3のスレッドTh0〜7の8つのスレッドでバリア同期処理を行う例について以下に説明する。
<バリア同期グループ>
図4は、上記図2に示した同期グループGrの詳細を示す。
2つのプロセッサコアを備えたプロセッサモジュールP0、P1に8つのスレッドを割り当ててバリア同期処理を行う際には、まず、バリア同期処理を行う同期グループを、ひとつのプロセッサコア上でスレッド間のバリア同期を行う最下位階層(第1階層)のグループと、同一のプロセッサモジュール内のプロセッサコア間でバリア同期を行う第2階層(上位階層)のグループと、プロセッサモジュール間でバリア同期を行う第3階層(最上位階層)に分ける。
ここで、同期グループの各階層は、各階層で共有可能な記憶域(共有記憶域)を有し、最下位階層(第1階層)は、同一のプロセッサコア上のスレッドのバリア同期を行う第1の同期グループとする。そして、同一のプロセッサコア上のスレッドが共有可能な1次キャッシュL1を共有記憶域とし、各スレッドは1次キャッシュL1に同期情報を書き込んで、同期をとる。
次に、上位階層となる第2階層は同一のプロセッサモジュール内のプロセッサコア間でスレッドのバリア同期を行う第2の同期グループとする。このため、同一のプロセッサモジュール内のプロセッサコア間で共有可能な2次キャッシュL2を共有記憶域とし、各プロセッサコアのスレッドのうち、一つのスレッドを親スレッドとして、各プロセッサコアの親スレッドが2次キャッシュL2に同期情報を書き込んで、親スレッド間で同期をとる。
次に、第3階層(最上位階層)はプロセッサモジュール間でスレッドのバリア同期を行う第3の同期グループとする。同一のプロセッサモジュール上の複数の親スレッドの内の一つをプロセッサモジュールの親スレッドとし、各プロセッサモジュールは親スレッド同士で同期を取る。本実施形態では、プロセッサモジュールは親スレッドはハードウェアバリア同期機構100を用いて同期を取る。
つまり、同期グループの各階層は、共有記憶域または共有するバリア同期機構の階層毎に設定される。
そして、同期グループを構成するスレッドに同期グループGr内で一意の識別子としてのスレッド番号(スレッドの識別子)を割り当て、上記各階層内で最も小さいスレッド番号をもつスレッドを親スレッドとし、その他を子スレッドとする。
最下位階層(第1同期グループ)は、同一プロセッサコア上で複数のスレッドのバリア同期をとる階層であり、図4において、プロセッサモジュールP0のプロセッサコアcpu0には、スレッドTh0、Th1が割り当てられ、これらスレッドTh0、1はプロセッサコアcpu0上でバリア同期をとる最下位階層の同期グループを構成する。
そして、最下位階層の同期グループは、プロセッサコアcpu0の1次キャッシュL1を共有記憶域とし、図5で示すように、プロセッサコアcpu0の1次キャッシュL1−0で予め設定したキャッシュライン上に、スレッドTh0の同期情報を記憶する記憶域L100と、スレッドTh1の同期情報を記憶する記憶域L101を設定する。複数のスレッドが1つのキャッシュラインに書込みを行うことによるキャッシュラインの競合が発生しないようにするため、書き込むキャッシュラインはスレッド毎にずらして設定する。なお、同期情報としては、後述するようにバリア同期ポイントのID(同期ID番号)の他、フラグなどを用いることができる。
各スレッドTh0、Th1は同期情報の記憶域L100とL101の内容が一致したときに、最下位階層のバリア同期が完了したと判定する。
プロセッサコアcpu1〜3上の各スレッドTh2〜Th7もプロセッサコアcpu0と同様に設定され、各プロセッサコアcpu1〜3の1次キャッシュL1−1〜3を共有記憶域として、同一プロセッサコア上のスレッドの同期情報を格納する記憶域L110、L111、L120、L121、L130、L131を各プロセッサコアの1次キャッシュL1−1〜3に設定する。
そして、各プロセッサコアcpu0〜3では、スレッド番号の小さいものをそれぞれプロセッサコアの親スレッドとし、プロセッサコアcpu0の親スレッドはスレッドTh0となり、プロセッサコアcpu1の親スレッドはTh2で、同様に、プロセッサコアcpu2、3の親スレッドはスレッドTh4、Th6となる。
第2階層(上位階層)は、同一のプロセッサモジュール内のプロセッサコア間でバリア同期を取る階層であり、図4において、プロセッサモジュールP0のプロセッサコアcpu0の親スレッドTh0と、プロセッサコアcpu1の親スレッドTh2が共有記憶域である2次キャッシュL2−0のキャッシュラインを用いて親スレッド同士の同期をとる第2の同期グループである。1次キャッシュL1−0のキャッシュと同じように複数のスレッドが同じキャッシュラインに書込みをすることにより発生するキャッシュライン競合を避けるため、スレッド毎にキャッシュラインをずらして同期の書込みを行う。
例えば、プロセッサモジュールP0では、第2階層の同期グループが、プロセッサコアcpu0、1で共有する2次キャッシュL2を共有記憶域とし、図5で示すように、プロセッサコアcpu0、1で共有する2次キャッシュL2−0の予め設定したキャッシュライン上に、プロセッサコアcpu0の親スレッドTh0の同期情報を記憶する記憶域L200と、プロセッサコアcpu1の親スレッドTh2の同期情報を記憶する記憶域L201を設定する。
各親スレッドTh0、Th2は同期情報の共有記憶域L200とL201の内容が一致したときに、プロセッサモジュールP0の第2階層のバリア同期が完了したと判定する。
プロセッサコアcpu2、3上の各スレッドTh4〜Th7もプロセッサモジュールP0と同様に設定され、各プロセッサコアcpu2、3の2次キャッシュL2−1を共有記憶域として、同一プロセッサモジュール内の各プロセッサコアの親スレッドTh4、Th6の同期情報を格納する記憶域L210、L211をこの2次キャッシュL2−1に設定し、共有記憶域L210とL211の内容が一致したときに、プロセッサモジュールP1の第2階層のバリア同期が完了したと判定する。
第3階層(最上位階層)は、プロセッサモジュール間のバリア同期を取る階層であり、図4において、プロセッサモジュールP0のプロセッサコアcpu0の親スレッドTh0と、プロセッサモジュールP1のプロセッサコアcpu2の親スレッドTh4が同期をとる第3階層の同期グループを構成する。
そして、第3階層の同期グループは、ハードウェアバリア同期機構100でプロセッサモジュールの親スレッド同士のバリア同期を行うため、図3に示したバリア同期範囲設定部101に同期グループを構成するプロセッサモジュールP0、P1の親スレッドTh0、Th4が実行されるプロセッサコアcpu0、2を同期対象として設定する。
上記同期グループの1次キャッシュL1、2次キャッシュL2及びハードウェアバリア同期機構100の設定は、後述するように、スレッドTh0〜Th7で構成されるプログラム(ロードモジュール)により実行される。
<ソフトウェアの詳細>
図6は、プロセッサモジュールP0、P1の同期グループで実行されるプログラム(ロードモジュール)の概要を示す。
同期グループで実行されるプログラムPGは、使用するプロセッサコアの数など並列計算機で使用するリソースに応じてスレッドを起動し、各スレッドをプロセッサコアに割り付け、バリア同期処理の設定を行う初期設定処理PG1と、各スレッドで所定の演算を行って予め設定されたバリア同期ポイントでバリア同期を行う演算処理PG2から構成される。
上記初期設定処理PG1では、使用するリソースに応じたスレッドを起動し、指示または予め設定されたプロセッサコアにそれぞれスレッドを割り付ける。その後、上記図4で示したように、スレッドの親子関係を設定し、同期グループ内でバリア同期の階層化を行いバリア同期処理の初期化を行う。
このように設定された同期グループで、各プロセッサコアに割り付けられた各スレッドでは演算処理を行い、所定のバリア同期ポイントでバリア同期を実行するのである。
なお、プログラムPGは、並列計算機上で実行される図示しないOSやミドルウェア上で実行されるものとする。
<初期設定>
図7、図8は、上記図6に示したプログラム(ロードモジュール)PGのうち初期設定処理PG1の詳細を示すフローチャートで、図9、図10は上記図6に示したプログラムPGの演算処理PG2のうちバリア同期処理の詳細を示すフローチャートである。
図7において、初期設定処理PG1は、並列計算機の任意のプロセッサモジュールで実行され、まず、S1では、使用するプロセッサコア(CPU)の数Nと、起動するスレッドの数Mを入力する(ただし、M、Nは自然数)。この入力は、例えば図示しないネットワークを介して管理コンソールなどから管理者などが入力し、初期設定処理PG1は演算処理PG2を実行するプロセッサコアの数Nとスレッドの数Mを設定する。そして、プロセッサコア数Nとスレッド数Mを主記憶MMの所定の記憶域に格納しておく。
そしてS2で、初期設定処理PG1は、プロセッサコア数Nに対応するプロセッサコアの番号(図中CPUID=プロセッサコアの識別子)を図示しないOSやミドルウェアなどから取得する。例えば、上記図4の例では、プロセッサコア数N=4、スレッド数M=8となり、プロセッサモジュールP0、P1を使用する場合には、プロセッサコア番号は0〜3となる。
次に、S3では、設定されたスレッドの数Mがプロセッサコアの数Nより大きいか否かを判定する。換言すれば、マルチスレッド処理かシングルスレッド処理かを判定する。
ひとつのプロセッサコアに複数のスレッドを割り当てるマルチスレッド処理の場合にはS4に進み、ひとつのプロセッサコアにひとつのスレッド割り当てるシングルスレッド処理であればS11に進む。このシングルスレッド処理を行うS11〜S13は前記従来例と同様であり、上記S1、S2で取得したプロセッサコア番号にそれぞれ1つずつスレッドを割り当て、プロセッサコア番号毎に割り当てたスレッドを起動する(S11)。
そして、プロセッサコア番号の小さい順にスレッド番号Th(x)を割り当て(S12)、ハードウェアバリア同期機構100に、同期するスレッドを実行するプロセッサコア番号を通知し、演算処理PG2でハードウェアバリア同期機構100のみを使用してバリア同期処理を行うように設定する(S13)。
一方、マルチスレッド処理の場合には、S4に進んで、上記S1で設定されたプロセッサコア数N(プロセッサコア番号)とスレッドの数Mから、1つのプロセッサコアにM/Nのスレッド数を割り当てる。ここでは、プロセッサコア番号=i〜i+(N−1)に、M/Nの商に対応する数のスレッド数を割り当て、さらにM/Nの結果に余りがあればプロセッサコア番号の小さい順に余りのスレッド数を一つずつ割り当てる。そしてS5で、各スレッドを起動する。
次に、S6では、プロセッサコア番号=i〜i+(N−1)に割り当てた各スレッドにそれぞれスレッド番号Th(x)を割り当てる。この割り当ては、プロセッサコア番号の小さい順に、0番から(N−1)番を割り当てる。なお、このプロセッサコア番号とスレッド番号の割り当ての結果は、主記憶MMなどの所定の記憶域に格納しておく。
例えば、上記図4の例では、N=4、i=0であるので、プロセッサコア番号=0〜3に、スレッド数=2を割り当て、プロセッサコア番号=0(cpu0)のスレッドにスレッド番号(スレッドID)Th0、Th1を割り当て、プロセッサコア番号=1(cpu1)のスレッドにスレッド番号Th2、Th3を割り当て、プロセッサコア番号=2、3には同様にTh4〜7を割り当てる。これにより、各プロセッサコアで実行されるスレッド番号とプロセッサコア番号の対応関係が決まり、どのプロセッサコアでどのスレッド番号が実行されるかが決定される。
次に、S7では同期グループGrの階層構造を決定するため、使用するプロセッサコア数Nから、次式によりプロセッサモジュール数Kを求める。
K=N/CORE ………(1)
ただし、COREは一つのプロセッサモジュールが有するプロセッサコアの数を示し、本実施形態の例では、CORE=2である。なお、汎用性を持たせる場合には、このS7でひとつのプロセッサモジュールが有するプロセッサコアの数Nを入力するようにしてもよい。
そして、S8では、上記S7で求めた使用プロセッサモジュール数Kから次式により、図4に示したバリア同期グループGrの階層数Fを決定する。
F=K+1 ………(2)
例えば、図4の例では、使用プロセッサモジュール数K=4/2=2であるからバリア同期グループGrは階層数F=3となり、1次キャッシュL1で同一プロセッサコアのスレッドの同期を取る第1の同期グループと、2次キャッシュL2で同一プロセッサモジュールの親スレッド同士のバリア同期を取る第2のバリアループと、ハードウェアバリア同期機構100によりプロセッサモジュールP0、P1の親スレッド同士の同期を取る第3の同期グループの3階層となる。
なお、上記(2)式は2つのプロセッサコアcpu0、1で一つの2次キャッシュL2−0を共有する場合のものであり、プロセッサコアやプロセッサモジュールが2次キャッシュL2、3次キャッシュL3を共有する形態に応じて上記(2)式を適宜変更すればよい。また、階層数Fを自動的に計算できない場合や、計算された階層数Fを変更したい場合には、管理コンソールなどから階層数Fを入力するようにしても良い。
S9では、上記同期グループGrの階層数Fに基づいて、第1階層(第1同期グループ)から第2階層(第2同期グループ)までのバリア同期の設定を行う。つまり、各階層毎にバリア同期を行う共有記憶域(キャッシュなど)に同期情報を格納する領域を設定する。この処理は、図8のフローチャートに基づいて行われ、本実施形態では、第3階層をハードウェアバリア同期機構100で行うため、S9の各階層のバリア同期の設定は、第1階層と第2階層のみとしている。
図8において、S20ではスレッド番号Th(j)を参照する変数jを0に初期化し、S21では第i階層を参照する変数iを1に初期化する。
S22では、現在のjの値に応じてスレッド番号Th(j)の情報を取得する。S23では、現在の変数iの値に応じて第i階層で同期するスレッドの情報(同一階層で同期するスレッド番号など)を取得する。
S24では、変数i=1であるか、すなわち、第1階層であるか否かを判定して、第1階層であればS26に進む一方、第1階層よりも上位の階層であればS25に進む。
S25では、現在参照しているスレッド(Th(j))が、一つ下位の階層(i−1階層)で親スレッドであるか否かを判定する。参照しているスレッドTh(j)が一つ下位の階層で親スレッドであればS26に進み、そうでなければS30に進んで次のループに進む。
S26では、現在参照している第i階層を構成するスレッドの中で、参照しているスレッドのスレッド番号Th(j)が最も小さいか否かを判定する。スレッド番号Th(j)が同一階層内で最も小さければこのスレッド番号Th(j)のスレッドを第i階層の親スレッドとし(S27)、そうでなければ第i階層の子スレッドとする(S28)。
上記S27、S28で同一階層内でスレッドの親子関係を設定すると、S29で第i階層に対応する共有記憶域に、親スレッドの同期情報を格納する領域と、子スレッドの同期情報を格納する領域を設定する。
現在参照している階層に関する処理が完了すると、S30に進んで次の階層を参照するため、変数iに1を加算する。そして、S31では、加算後の変数iで参照する階層が最上位階層(本実施形態では第3階層)に達したか否かを判定する。最上位階層に達した場合には次のスレッドを参照するためにS32へ進み、最上位階層に達していない場合には次の階層について共有記憶域を用いたバリア同期を設定するため、S23に戻る。
同期グループGrの階層が最上位階層に達したS32では、次のスレッドについて同期グループの設定を行うため、参照するスレッド番号Th(j)の変数jに1を加算して、次のスレッド番号を参照するように設定する。
そして、S33では加算後の変数jが最後のスレッド番号Th(M−1)を超えたか否かを判定し、最後のスレッド番号Th(M−1)を超えていなければ次のスレッドを参照するためにS22へ戻る。一方、最後のスレッド番号Th(M−1)を超えていればS20〜S33のサブルーチンを終了して図7のS10に進む。
図7のS10では、プロセッサモジュール間でスレッドのバリア同期を取る第3階層(第3同期グループ)の設定を行う。本実施形態では、第3階層を最上位階層として、第3階層のバリア同期をハードウェアバリア同期機構100で行うため、同期グループGrのプロセッサモジュールで実行されるスレッドのうち、各プロセッサモジュールでスレッド番号が最も小さいものをそれぞれ選択する。そして、選択したスレッドを実行するプロセッサコアをバリア同期範囲設定部101に設定し、第3階層のバリア同期を設定する。
上記図7、図8のフローチャートによるバリア同期の初期設定を、図4の例で行った場合を以下に示す。
図4の例では、使用プロセッサコア数N=4、スレッドの数M=8であるのでマルチスレッド処理となり、一つのプロセッサコアに2つずつスレッドを割り当てる。4つのプロセッサコアをプロセッサモジュールP0、P1に割り当て、使用するプロセッサコア番号はcpu0〜cpu3となる(S1〜S3)。
各プロセッサコアcpu0〜cpu3に割り当てたスレッドに、プロセッサコア番号の小さいものから順にスレッド番号Thを割り当てる。この結果、図4で示すように、スレッドTh0〜Th7が設定される(S4〜S6)。
次に、同期グループGrの階層は、プロセッサモジュールのプロセッサコア数COREが2であるので、使用プロセッサモジュール数は2となり階層数F=3となり、バリア同期グループは3階層のバリア同期グループで構成される(S8)。
次に、図8のバリア同期設定のサブルーチンにて、各スレッド毎に各階層の設定を行う。
まず、i=1、j=0であるから(S20、S21)、スレッドTh0について第1階層の設定を行う。スレッドTh0はプロセッサコアcpu0で実行され、第1階層となる同一プロセッサコアcpu0で同期させるスレッドはTh1がある(S22、S23)。
現在参照しているスレッドTh0のスレッド番号0と第1階層の他のスレッド番号1を比較し、自スレッドのスレッド番号方が小さいため、このスレッドTh0は第1階層の親スレッドとなる(S26、S27)。
そして、第1階層に対応する共有記憶域として1次キャッシュL1−0の所定のキャッシュラインの先頭に同期情報を格納する記憶域L100を設定し(S29)、第1階層の設定を終了する。
次に図8のS23に戻り、i=2として第2階層についてスレッドTh0の設定を行う。第2階層は同一プロセッサモジュール内のプロセッサコア間のバリア同期であり、同期するスレッドは、図4で示すように、cpu1のスレッドTh2、Th3となる(S23)。
次に、現在参照しているスレッドTh0は、一つ下の階層で親スレッドであるので、プロセッサコアcpu1のスレッドTh2、Th3とスレッド番号を比較する。この結果スレッドTh0のスレッド番号0が最小であるので、第2階層の親スレッドに設定される(S26、S27)。
そして、第2階層に対応する共有記憶域として2次キャッシュL2−0の所定のキャッシュラインの先頭に、同期情報を格納する記憶域L200を設定し(S29)、第2階層の設定を終了する。この後、変数iをインクリメントするとi=3となるので、次の参照スレッドをTh1としてS22へ戻る。
上記と同様に同一階層内の情報取得し、第1階層から順にバリア同期の設定を行う。このスレッドTh1は第1階層ではスレッド番号1が最小ではないので、第1階層の子スレッドに設定され、第1階層に対応する1次キャッシュL1−0の所定のキャッシュラインの2番目の記憶域L101に同期情報を格納するよう設定する(S29)。
第2階層においては、一つ下位の階層(第1階層)では親スレッドではないので、第2階層の同期スレッドには設定されずに設定を終了する。
他のスレッドTh2〜Th7も上記と同様に各階層でバリア同期の設定が行われ、最後に各プロセッサモジュールP0、P1の親スレッドであるTh0とTh4をハードウェアバリア同期機構100に同期グループとして設定し、最上位階層の第3階層の設定を終了する。なお、ハードウェアバリア同期機構100が行う第3階層の同期完了の条件は、同一階層内のスレッドTh0とスレッドTh4のバリア同期が完了したときが同期完了の条件である。
<バリア同期処理>
上記図7、図8の初期設定によりスレッドを割り当てられたプロセッサモジュールで行われる演算処理のうち、バリア同期処理について図9、図10のフローチャートを参照しながら説明する。図9は最下位階層(第1階層)で行われる処理で、図10は上位階層(第2階層)で行われる処理を示し、各処理は所定の周期で実行される。なお、最上位階層となる第3階層はハードウェアバリア同期機構100を用いるため、フローチャートは省略した。
図9において、第1階層の同期グループの処理は、まず、S41で演算処理が所定の同期ポイントに到達していればS42以降のバリア同期処理へ進み、同期ポイントに達していなければ演算処理を継続する。
同期ポイントに到達したS42では、第1階層の共有記憶域である1次キャッシュL1の所定の記憶域に同期ポイントのID(同期位置の識別子=同期情報)を書き込む。
S43では、自スレッドが親スレッドであるか否かを判定し、親スレッドの場合はS44以降の処理へ進み、子スレッドの場合にはS52に進んで、同一の第1階層の親スレッドから同期ポイントに達した通知(同期完了通知)を待ち、通知を受けると同期処理を終了して次の演算処理に進む。なお、この同期完了の通知は、上述のように前記記憶域に同期完了を示す情報を書き込むことで行われる。
親スレッドの場合のS44では、1次キャッシュL1の所定のキャッシュラインから、同一の第1階層の子スレッドの同期ポイントIDを読み込み、S45で親スレッドの同期ポイントIDと全ての子スレッドの同期ポイントIDが一致した場合にはバリア同期が完了したと判定してS46に進む。なお、一致しない場合には全ての子スレッドの同期ポイントIDが親スレッドの同期ポイントIDと一致するのを待つ。
S46では、上記初期設定のS8で求めた同期グループの階層数Fが1より大きい、換言すれば上位階層があるか否かを判定し、上位階層があればS47に進み、第1階層のみであればS50に進む。
S47では、上位階層(第2階層)へ第1階層のバリア同期が完了したことを通知する。次いで、S48では図10に示す上位階層(第2階層)のバリア同期処理を行う。
S49では、上位階層(第2階層)のバリア同期処理から同期完了の通知を待ち、上位階層から同期完了の通知を受けるとS50に進んで、全ての子スレッドにバリア同期の完了を通知する。
そして、S51で各子スレッドへの完了通知を順次行って、全ての子スレッドへの通知が完了するとバリア同期処理を終了し、次の演算処理を開始する。
すなわち、図4において、スレッドTh0の場合、第1階層の親スレッドであるので、自スレッドが同期を完了すると、図5の1次キャッシュL1−0の記憶域L100に同期ポイントIDを書き込んで、子スレッドであるスレッドTh1の記憶域L101を監視する。
そして、子スレッドTh1の記憶域L101に同一の同期ポイントIDが書き込まれると、同期グループの階層数Fが2以上であるかを判定してから後述する図10に示す第2階層のバリア同期処理を行う。
図10の処理を終了すると、第1階層の上位階層である第2階層からの同期完了の通知を待つ。第2階層からの同期完了通知を受けると、全ての子スレッド(この場合ではTh1)に同期完了を通知し、子スレッドが同期完了を受信したのを確認するとバリア同期処理を完了し、次の演算処理を開始する。各スレッドは上記処理をバリア同期ポイントに到達する度に実行することで同期を取る。
次に、図10の上位階層(第2階層)のバリア同期処理について説明する。
図10の処理は、下位階層のバリア同期が完了してから実行されるもので、S61では自スレッドが同期ポイントに達しているので、第2階層に対応する共有記憶域である2次キャッシュL2の所定の記憶域に同期ポイントIDを書き込む。
そして、S62でスレッドの親子関係を判定し、親スレッドであれば、同期すべき子スレッドの2次キャッシュL2の記憶域を監視し、全ての子スレッドの同期ポイントIDが一致したら第2階層及び下位階層の同期が完了したと判定し上位階層のバリア同期処理(ここではハードウェアバリア同期機構100)に同期完了を通知する(S63〜S65)。この通知は、2次キャッシュL2に同期完了を示す情報を書き込むことで行われる。
次に、S66では、上位階層(第3階層)のバリア同期処理(ハードウェアバリア同期機構100)から同期完了の通知を待ち、第3階層から同期完了の通知を受けると、S67で全ての子スレッドにバリア同期完了を通知し、S68で全子スレッドが同期完了を受信すると上位階層のバリア同期処理を完了し、図9の処理に戻る。
上記バリア同期処理を、図4に示した例で行った場合は、次のようになる。まず、図9の処理で、第1階層及び第2階層の親スレッドであるスレッドTh0がバリア同期ポイントに到達すると、図5の1次キャッシュL1−0の記憶域L100に同期ポイントIDを書き込み(S42)、子スレッドTh1の記憶域L101を監視して同期ポイントIDが一致するのを待つ(S45)。記憶域L100、L101の同期ポイントIDが一致すると第1階層の同期完了を第2階層へ通知する。これにより、同一プロセッサコアcpu0内のスレッドTh0、1の同期が完了する。
その後、図10の処理に移り第2階層のバリア同期処理を行う。スレッドTh0は、同期ポイントに到達したので第2階層バリア同期処理に対応する2次キャッシュL2−0の記憶域L200に同期ポイントIDを書き込み(S62)、子スレッドTh2の記憶域L201を監視して同期ポイントIDが一致するのを待つ(S65)。記憶域L200、L201の同期ポイントIDが一致すると第2階層のバリア同期が完了する。そして、第2階層の同期完了を第3階層(ハードウェアバリア同期機構100)へ通知する。
この後、第2階層のバリア同期処理は、ハードウェアバリア同期機構100からの同期完了通知を待ち(S68)、ハードウェアバリア同期機構100が第3階層のスレッドTh0とスレッドTh4の同期完了を検知すると、第2階層のスレッドTh0、4に同期完了を通知する。この同期完了通知に基づいて第2階層のスレッドTh0は、第2階層の子スレッドTh2に同期完了の通知を行い、全ての子スレッドに同期完了通知を送ると第2階層のバリア同期処理を完了する(S69、S70)。
その後、図9の第1階層のバリア同期処理に戻り、第1階層のバリア同期処理は、第2階層のバリア同期処理から同期完了の通知を受けたので(S48)、第1階層の子スレッドTh1に同期完了を通知し、全ての子スレッドに通知を行うと、バリア同期処理を完了する。
以上のように、プロセッサコア内とプロセッサモジュール内で、プロセッサコアに近い共有記憶域から主記憶MM側に階層化した同期グループを複数設定し、これら同期グループ毎にバリア同期処理を行い、最上位層のみハードウェアバリア同期機構100を用いることで、マルチコア・マイクロプロセッサを用いてひとつのプロセッサコアでマルチスレッド処理により並列処理を行う場合であっても、多数のスレッドの同期を確実に取ることができる。
したがって、既存のハードウェアバリア同期機構100を用いながらマルチコア・マイクロプロセッサを用いたマルチスレッドの並列処理においてバリア同期を行うことが可能となるので、並列計算機の価格が上昇するのを防ぎながら、多数のスレッド間のバリア同期を実現できるのである。
そして、同一プロセッサコアのスレッドの同期には、プロセッサコア内の1次キャッシュL1を用い、同一プロセッサモジュール内のスレッドの同期には、プロセッサモジュール内の2次キャッシュL2を用いることで、各親スレッドから最も遅延の少ない共有記憶域にアクセスすることで、処理の高速化を図ることができ、並列処理の高速化を図ることができるのである。
また、バリア同期処理に用いる共有記憶域を、階層毎に異なる記憶装置(キャッシュまたは主記憶)に配置することで、異なる同期グループで記憶域が競合するのを確実に回避でき、バリア同期処理を正確に行うことが可能となるのである。
さらに、プロセッサコア上あるいはプロセッサコア間でバリア同期を行う場合は、1次キャッシュL1や2次キャッシュL2などプロセッサコアからのアクセスに関するレイテンシイが少ない共有記憶域を用いたソフトウェアでバリア同期を行い、プロセッサモジュール間のバリア同期などプロセッサコアから遠くアクセスに関するレイテンシイが大きくなるバリア同期にハードウェアバリア同期機構100を用いることで、最下位階層から最上位階層までのバリア同期を高速に行うことが可能となる。
図11は、階層数Fが2の場合を示し、4つのスレッドTh0〜3を2つのプロセッサコアcpu0、1に割り当てて、一つのプロセッサモジュールP0内で同期グループが形成される例を示す。
プロセッサコアcpu0には2つのスレッドTh0、1が割り当てられ、プロセッサコアcpu1には2つのスレッドTh2、3が割り当てられて、同一プロセッサコア上のスレッドが第1階層の同期グループを構成する。
そして、プロセッサコアcpu0のスレッドTh0とプロセッサコアcpu1のスレッドThがそれぞれ各プロセッサコアの親スレッドとなり、第2階層はハードウェアバリア同期機構100を用いてバリア同期を行う。この例では、プロセッサコア間のバリア同期に2次キャッシュL2を用いずに、第2階層を最上位階層として扱い、バリア同期機構100を用いる点が上記図7〜図10と異なっている。
図12は、上記図11のように、第2階層でハードウェアバリア同期機構100を用いる場合のバリア同期処理の一例を示すフローチャートで、上記図9に代わって実行するものである。
S41〜S45までは上記図9と同様であり、自スレッドがバリア同期ポイントに到達したら第1階層の共有記憶域に対応する1次キャッシュL1の所定の記憶域に同期ポイントIDを書き込んで、自スレッド親スレッドであれば子スレッドがバリア同期ポイントに到達するのを待つ。
同期が完了すると、親スレッドはS46Aでハードウェアバリア同期機構100に同期完了の通知を行う。
そして、S48ではハードウェアバリア同期機構100からの同期完了の通知を待ち、ハードウェアバリア同期機構100が第2階層のバリア同期が完了した通知が到着するとS49で全ての子スレッドにバリア同期の完了を通知する。
つまり、図11の例では、プロセッサコアcpu0の親スレッドTh0と子スレッドTh1の同期を1次キャッシュL1−0で行い、プロセッサコアcpu1の親スレッドTh2と子スレッドTh3の同期を1次キャッシュL1−1で行う。
そして、プロセッサコアcpu0、1の親スレッドTh0、2のバリア同期をハードウェアバリア同期機構100で行うのである。
これにより、ハードウェアバリア同期機構100で制御できないプロセッサコア内の複数のスレッドのバリア同期を1次キャッシュL1で行い、プロセッサコア間のバリア同期を高速なハードウェアバリア同期機構100で行い、マルチスレッドの並列処理でバリア同期を実現できるのである。
図13は、上記図11の同期グループに同期すべきスレッドを1つ加えて、一つのプロセッサモジュールP0で5つのスレッドのバリア同期を行う例である。
上記図7の初期設定において、プロセッサコア数M/スレッド数Nの結果に余りがあればプロセッサコア番号の小さい順に余りのスレッド数を一つずつ割り当てるため、M=2、N=5の場合では、図13のようにプロセッサコア番号の小さいプロセッサコアcpu0に3つのスレッドTh0〜2が割り当てられ、プロセッサコア番号の大きいプロセッサコアcpu1に2つのスレッドTh3〜4が割り当てられる。
この場合、プロセッサコアcpu0の第1階層の同期グループは、スレッドTh0〜2の3つで構成され、スレッドTh0が親スレッドとなり、スレッドTh1〜2が子スレッドとなる。この場合、プロセッサコアcpu0の1次キャッシュL1−0には、バリア同期を行う記憶域は、図14で示すようにスレッドTh0の同期情報を記憶する記憶域L100と、スレッドTh1の同期情報を記憶する記憶域L101にスレッドTh2の同期情報を記憶する記憶域L102が設定される。
そして、バリア同期処理は図12と同様に行われ、親スレッドTh0がバリア同期ポイントに到達すると、1次キャッシュL1−0の記憶域L101、L102を監視して、子スレッドTh1、2の同期ポイントIDが親スレッドTh0に一致するのを待つ。記憶域L100〜L102の同期ポイントIDが一致すると、プロセッサコアcpu0の第1階層の同期グループでバリア同期が完了し、親スレッドTh0がハードウェアバリア同期機構100に同期の完了を通知する。そして、ハードウェアバリア同期機構100はプロセッサコアcpu0、1の各親スレッドTh0、3のバリア同期完了を検知すると、各親スレッドTh0、3に通知を行い、全ての階層のバリア同期が完了する。
このように、プロセッサコアに割り当てられたスレッド数が異なる場合でも、1次キャッシュL1の記憶域L100〜L102でバリア同期を行うことにより、任意のスレッド数のバリア同期を実現することができる。
なお、上記第1実施形態において、プロセッサモジュールと主記憶MMはコントローラを介して接続する例を示したが、図示はしないがプロセッサコアまたはプロセッサモジュールにメモリコントローラを設け、このメモリコントローラと主記憶MMを接続する構成であっても良い。
<第2実施形態>
図15〜図20は、第2の実施形態を示し、前記第1実施形態に示したハードウェアバリア同期機構100を用いずに、ソフトウェアのみでバリア同期を行う例を示す。
図15は、本第2実施形態の並列計算機のハードウェア構成を示し、前記第1実施形態の図1に示した並列計算機からハードウェアバリア同期機構100を削除したもので、その他の構成は前記第1実施形態と同一である。
図16は、同期グループGrの一例を示し、前記第1実施形態の図4と同様に、4つのプロセッサコアcpu0〜3に8つのスレッドTh0〜7を割り当てて、バリア同期を行う場合の同期グループGrの詳細を示す。
同期グループGrの最下位階層となる第1階層は、同一のプロセッサコア上のスレッドのバリア同期を行う第1の同期グループとする。そして、同一のプロセッサコア上のスレッドが共有可能な1次キャッシュL1を共有記憶域とし、各スレッドは1次キャッシュL1に同期情報を書き込んで、同期をとる。
次に、上位階層となる第2階層は同一のプロセッサモジュール内のプロセッサコア間でスレッドのバリア同期を行う第2の同期グループとする。このため、同一のプロセッサモジュール内のプロセッサコア間で共有可能な2次キャッシュL2を共有記憶域とし、各プロセッサコアのスレッドのうち、一つのスレッドを親スレッドとして、各プロセッサコアの親スレッドが2次キャッシュL2に同期情報を書き込んで、親スレッド間で同期をとる。
次に、第3階層(最上位階層)はプロセッサモジュール間でスレッドのバリア同期を行う第3の同期グループとする。同一のプロセッサモジュール上の複数の親スレッドの内の一つをプロセッサモジュールの親スレッドとし、各プロセッサモジュールは親スレッド同士で同期を取る。このため、プロセッサモジュール間で共有可能な3次キャッシュL3を共有記憶域とし、各プロセッサモジュール上の親スレッドのうち、一つのスレッドを親スレッドとして、各プロセッサモジュールを代表する親スレッドが3次キャッシュL3に同期情報を書き込んで、親スレッド間で同期をとる。
つまり、第1階層と第2階層は前記第1実施形態と同様であり、第3階層で3次キャッシュL3を用いてプロセッサモジュールを代表する親スレッド間でバリア同期を行う点が前記第1実施形態と異なる。
そして、同期グループを構成するスレッドに同期グループGr内で一意の識別子としてのスレッド番号を割り当て、上記各階層内で最も小さいスレッド番号をもつスレッドを親スレッドとし、その他を子スレッドとする。
第1階層及び第2階層では、前記第1実施形態と同様に、プロセッサコアcpu0〜3のスレッドTh0、Th2、Th4、Th6がそれぞれ親スレッドとなり、第3階層ではプロセッサモジュールP0でスレッド番号の最も小さいスレッドTh0が親スレッドとなり、プロセッサモジュールP1では同じくスレッド番号の最も小さいスレッドTh4が親スレッドとなる。
そして、第1階層では、図17で示すように1次キャッシュL1を用いて前記第1実施形態と同様に第1階層の同期スレッドが同期情報を書き込む記憶域L100〜L131を設定し、第2階層では前記第1実施形態と同様に、2次キャッシュL2に第2階層の親スレッドが同期情報を書き込む記憶域L200〜L211を設定する。
第3階層では、プロセッサモジュールP0、P1を代表する親スレッドTh0、Th4の同期を取るため、図17で示すようにプロセッサモジュールP0、P1で共有可能な共有記憶域として3次キャッシュL3を用い、親スレッドTh0の同期情報を格納する記憶域L300と親スレッドTh4の同期情報を格納する記憶域L301を設定する。
なお、多数のプロセッサモジュールでバリア同期を行う場合には、3次キャッシュL3に各プロセッサモジュールを代表する親スレッドの記憶域を設けて上述したようにバリア同期をとっても良い。あるいは、主記憶MMをプロセッサモジュール間で共有する共有記憶域として第4階層の同期グループを設けてもよく、この場合は、主記憶MM上に親スレッドの同期情報を格納する記憶域を設定すればよい。
次に、プロセッサモジュールP0、P1の同期グループGrで実行されるプログラム(ロードモジュール)のフローチャートを図18〜図21に示す。
図18、図19は前記第1実施形態の図6に示した初期設定処理PG1を示し、図20、図21は同じく図6に示したプログラムPGの演算処理PG2のうちのバリア同期処理を示す。
図18は、初期設定処理PG1の最下位階層(第1階層)の初期設定を示し、S1〜S8及びS11、S12は前記第1実施形態の図7と同様であり、入力されたプロセッサコア(CPU)の数Nと、起動するスレッドの数Mに基づいて、プロセッサコアの番号の小さい順にスレッドを割り当て、スレッド番号を設定して各スレッドを起動する。そして、マルチスレッドの並列処理の場合には、使用するプロセッサモジュールのプロセッサコア数COREと使用スレッド数Nから同期グループの階層数Fを求め、S9Aで図19に示す第1階層から第F階層までのバリア同期設定を行う。
S3でシングルスレッド処理と判定された場合には、S11、S12で前記第1実施形態と同様に一つのプロセッサコアに一つのスレッドを割り当てる。そして、S13Aで使用するプロセッサコア数に応じてバリア同期を行うための共有記憶域を設定する。例えば、一つのプロセッサモジュール内でバリア同期を行う場合には、2次キャッシュL2に同期情報を格納する記憶域を設定し、プロセッサモジュール間でバリア同期を行う場合には、3次キャッシュL3に記憶域を設定してバリア同期を行う。
図19は、第1階層から第F階層のバリア同期を設定するループを階層の数だけ行うもので、S31Aを除いて前記第1実施形態の図8と同様であり、S31Aでは変数iが最上位階層(第F階層)を超えると次のスレッドの設定を行うようにしたものである。
前記第1実施形態では最上位階層のバリア同期をハードウェアバリア同期機構100で処理していたのに対し、本第2実施形態では上述のように3次キャッシュL3あるいは主記憶MMに各プロセッサモジュールを代表する親スレッドの記憶域を設定し、プロセッサモジュール間でバリア同期処理を行う。
次に、図20、図21のバリア同期処理について説明する。
図20は、前記第1実施形態の図9と同様に、第1階層の同期グループの処理を示しており、S41で演算処理が所定の同期ポイントに到達していればS42以降のバリア同期処理へ進み、同期ポイントに達していなければ演算処理を継続する。
同期ポイントに到達していればS42で、第1階層の共有記憶域である1次キャッシュL1の所定の記憶域に同期ポイントのIDを書き込む。
S43では、自スレッドが親スレッドであるか否かを判定し、親スレッドの場合はS44の処理へ進み、子スレッドの場合にはS52に進んで、親スレッドからバリア同期の完了通知を待ち、この通知を受けると同期処理を終了して次の演算処理に進む。
親スレッドの場合のS44では、1次キャッシュL1の所定のキャッシュラインから、同一の第1階層の子スレッドの同期ポイントIDを読み込み、S45で親スレッドの同期ポイントIDと全ての子スレッドの同期ポイントIDが一致した場合にはバリア同期が完了したと判定してS46に進む。なお、一致しない場合には全ての子スレッドの同期ポイントIDが親スレッドの同期ポイントIDと一致するのを待つ。
S46では、上記図18のS8で求めた同期グループの階層数Fが1より大きい、換言すれば上位階層の有無を判定し、上位階層があればS48に進んで図21に示す上位階層のバリア同期処理を行い、第1階層のみであればS481に進む。
なお、S48の上位階層のバリア同期処理では、全ての階層の同期グループのバリア同期が完了すると、図21のサブルーチンを終了してS481の処理に進む。
S481では、全ての階層でバリア同期が完了しているので、自スレッドが何れかの階層の親スレッドであるか否かを判定し、親スレッドであればS50に進んで、全ての子スレッドに同期完了を順次通知し、S51で全ての子スレッドへの通知が完了していればバリア同期処理を完了して次の演算処理を開始する。S481の判定で、子スレッドとなった場合は、図21の上位階層のバリア同期処理で親スレッドからの同期完了の通知を受けているので、バリア同期処理を完了して次の演算処理を開始する。
次に、図21の上位階層(第2階層〜第F階層)のバリア同期処理について説明する。
図21の処理は、第1階層のバリア同期が完了してから実行されるもので、まず、S60では階層を示す変数iに2を設定して、次のバリア同期処理を行う階層を第2階層とする。
S61Aでは自スレッドが同期ポイントに達しているので、第i階層に対応する共有記憶域である2次キャッシュL2の所定の記憶域に同期ポイントIDを書き込む。
そして、S62でスレッドの親子関係を判定し、親スレッドであればS63Aに進んで現在の同期グループの階層(第i階層)のバリア同期を行う。一方、この判定で第i階層の子スレッドと判定された場合には、S69に進んで親スレッドからの同期完了の通知を待つ。
親スレッドと判定されたS63Aでは、現在の同期グループの階層(第i階層)に対応する共有記憶域を参照する。現在の階層の共有記憶域から同期すべき子スレッドの記憶域に格納された同期ポイントIDを監視し、全ての子スレッドの同期ポイントIDが一致したら第i階層の同期が完了したと判定する(S63A〜S64)。
次に、S70では、次の上位階層のバリア同期処理を行うため、階層を示す変数iに1を加算し、S71で最上位階層までバリア同期処理が完了したか否かを判定する。最上位階層の判定は、インクリメント後の変数iが図18のS8で求めた階層数Fを超えていれば、上記S60〜S64の処理で最上位階層までバリア同期を完了したと判定する。そして、最上位階層に達していなければ、S61Aに戻って上述のようにさらに上位階層(i+1階層)のバリア同期処理を行う。
S71で変数iが階層数Fを超えると、全ての階層の同期処理が完了したので、図20の処理に戻り、上述のようにS481へ進んで何れかの階層の親スレッドであれば全子スレッドにバリア同期処理の完了を通知する。
以上の処理を図16の例で行った場合について説明する。
図16において、プロセッサコアcpu0のスレッドTh0について上記バリア同期処理を行った例では、まず図18、図19の初期設定で、スレッドTh0は同一プロセッサコアcpu0上で最もスレッド番号が小さいので第1階層の親スレッドとなる。
同様にプロセッサコアcpu1〜3ではそれぞれスレッドTh2、Th4、Th6が第1階層の親スレッドとなる。
次に同一のプロセッサモジュールP0の他のプロセッサコアcpu1のスレッドTh2、3とスレッド番号の大小を比較し、スレッドTh0が最もスレッド番号が小さいので、このスレッドTh0が第2階層の親スレッドとなりプロセッサコアcpu1のスレッドTh2は、第2階層の子スレッドとなる。同様に、プロセッサモジュールP1では、第2階層の親スレッドはスレッドTh4、子スレッドがスレッドTh6となる。
次に、スレッドTh0のスレッド番号と、他のプロセッサモジュールP1のスレッドTh4〜Th7とスレッド番号の大小を比較し、スレッドTh0が最もスレッド番号が小さいので、このスレッドTh0が第3階層の親スレッドとなり、プロセッサモジュールP1のスレッドTh4が子スレッドとなる。
図20のバリア同期処理では、スレッドTh0が同期ポイントに到達すると図17の1次キャッシュL1−0の記憶域L100に同期ポイントIDを書き込んで、第1階層の子スレッドTh1が同じ同期ポイントに到達するのを待つ。子スレッドTh1は同期ポイントに到達すると、図20のS52で全ての階層のバリア同期が完了するまで待機する。
一方、親スレッドTh0は第1階層のバリア同期処理が完了したのでS48へ進み、この同期グループの階層がF=3であることからS48で図21の上位階層のバリア同期処理に進む。図21の上位階層では変数i=2として第2階層のバリア同期処理を開始する。
第2階層では、スレッドTh0は図17の2次キャッシュL2−0の記憶域L200に同期ポイントIDを書き込んでから、第2階層の親スレッドであるので子スレッドTh2が同期ポイントに到達するのを待つ。子スレッドTh2は同期ポイントに到達すると、図21のS69で全ての階層のバリア同期が完了するまで待機する。
一方、親スレッドTh0は第2階層のバリア同期処理が完了したのでS70へ進み、変数iをインクリメントし、最上位階層に達していなければS61Aに戻って第3階層のバリア同期処理を開始する。
第3階層では、スレッドTh0は図17の3次キャッシュL3の記憶域L300に同期ポイントIDを書き込んでから、第3階層の親スレッドであるので子スレッドTh4が同期ポイントに到達するのを待つ。子スレッドTh4は同期ポイントに到達すると、図21のS69で全ての階層のバリア同期が完了するまで待機する。
一方、親スレッドTh0は第3階層のバリア同期処理が完了したのでS70へ進み、変数iをインクリメントし、変数i>Fとなったので、最上位階層のバリア同期処理が完了したので、図20のS481に進む。
スレッドTh0は各階層の親スレッドであるので担当する子スレッドTh4、Th2、Th1の順に同期完了の通知を行う。
親スレッドTh0から同期完了通知を受けた第1階層の子スレッドTh1は、S52の待機を終了し、次の演算処理を再開する。
第2階層のS69で待機していた第2階層の子スレッドTh2は、親スレッドTh0から同期完了通知を受けると、図20のS481の判定でこのスレッドTh2はプロセッサコアcpu1の第1階層の親スレッドであるので、S50で子スレッドTh3に同期完了の通知を行ってから、次の演算処理を再開する。
第3階層のS69で待機していた第3階層の子スレッドTh4は、親スレッドTh0から同期完了通知を受けると、図20のS481の判定でこのスレッドTh4はプロセッサモジュールP1の第3階層の親スレッドであるので、S50で子スレッドTh6、Th5の順に同期完了の通知を行ってから、次の演算処理を再開する。
なお、プロセッサコアcpu1の第1階層の親スレッドTh2は上記と同様にS481、S50で第1階層の子スレッドTh3に同期完了を通知し、同様にプロセッサモジュールP1の親スレッドTh4は、第2階層、第1階層の子スレッドTh6、Th5の順に同期完了を通知し、さらに第1階層の親スレッドTh6は子スレッドTh7に同期完了を通知し、各階層の親スレッドが各子スレッドに同期完了を通知することで、全ての階層のスレッドがバリア同期処理を完了する。
このように、ハードウェアバリア同期機構100を用いない場合では、同一プロセッサコア上の複数のスレッドのバリア同期を、プロセッサコアに最も近い共有記憶域(1次キャッシュL1)で行い、同一プロセッサモジュールのプロセッサコア間のバリア同期を、次にプロセッサコアに近い共有記憶域(2次キャッシュL2)で行う。そして、各プロセッサモジュール間のバリア同期を、次にプロセッサコアに近い共有記憶域(3次キャッシュL3)で行う。
以上のように、プロセッサコア内とプロセッサモジュール内及びプロセッサモジュール間で、プロセッサコアに近い共有記憶域から主記憶MM側に階層化した同期グループを複数設定し、これら同期グループ毎にバリア同期処理を行うことで、マルチコア・マイクロプロセッサを用いてひとつのプロセッサコアに複数のスレッドを割り当てるマルチスレッド処理により並列処理を行う際に、多数のスレッドの同期を確実に取ることができる。そして、本第2実施形態ではハードウェアバリア同期機構を必要としないので、並列計算機を安価に構成することができ、また、マルチコア・マイクロプロセッサを用いた計算機であれば並列処理を行うことが可能となる。
<第3実施形態>
図22、図23は、第3の実施形態を示し、前記第1実施形態に示したバリア同期処理を専用のスレッドで行うようにし、他のスレッドを並列演算処理専用としたもので、その他の構成は前記第1実施形態と同様である。
各プロセッサコアcpu0〜3には演算処理のみを行い子スレッドとして機能するスレッドTh0〜Th7と、各階層の親スレッドと機能して、バリア同期処理のみを行う同期スレッドSTh0〜Sth3が割り当てられて実行する。つまり、同期スレッドSTh0〜3は、図6のプログラムPGのうち、演算処理PG2のバリア同期処理のみを実行し、スレッド(以下演算スレッドとする)Th0〜Th7は、プログラムPGのうち演算処理(並列演算処理)を実行し、バリア同期処理の一部のみを行う。
演算スレッドTh0〜Th7は、バリア同期処理においては全て子スレッドとして機能し、自スレッドが同期ポイントに到達すると、第1階層の共有記憶域(1次キャッシュL1)に同期ポイントIDを書き込む処理のみを行う。そして、各演算スレッドは共有記憶域に同期ポイントIDを書き込んだ後に、図9のS52で同期スレッドSTh0〜STh3からの同期完了の通知を待つ。
一方、同期スレッドSTh0〜STh3は、同期グループの各階層の親スレッドとして機能し、演算処理(並列演算処理)は行わず、各演算スレッドのバリア同期のみをとる。各プロセッサコアcpu0〜3にはそれぞれ同期スレッドSTh0〜STh3が割り当てられ、プロセッサコアcpu0の同期スレッドSTh0は、演算スレッドTh0〜1のバリア同期を行う第1階層の同期グループを構成する。
そしてプロセッサコアcpu0、1の同期スレッドSTh0、STh1はプロセッサコア間のバリア同期を行う第2階層の同期グループを構成する。そしてプロセッサモジュールP0、P1間のバリア同期はハードウェアバリア同期機構100を用いて、同期スレッドSTh0とSTh2の同期を取ることで行われる。
同様に、同期スレッドSTh1〜STh3も各プロセッサコアcpu1〜3で第1階層と第2階層の同期グループをそれぞれ構成する。
ここで、同期スレッドSTh0〜STh3と演算スレッドTh0〜Th7の共有記憶域の関係は、図23で示すとおりとなる。
各プロセッサコアcpu0〜3の1次キャッシュL1−0〜3のキャッシュラインは、前記第1実施形態と同様であり、同期スレッドSTh0〜Th7の同期ポイントIDが格納される。
プロセッサモジュールP0、P1の2次キャッシュL2には、前記第1実施形態の親スレッドに代わって、同期スレッドSTh0〜STh3の同期情報を格納する記憶域L200〜L211が設定される。
例えば、プロセッサコアcpu0では、演算スレッドTh0、1の同期ポイントIDが記憶域L100、L101に書き込まれ、2つの同期ポイントIDが一致すると同期スレッドSTh0は2次キャッシュL2の記憶域L200に記憶域L100の同期ポイントIDを格納する。同様に、プロセッサコアcpu1の同期スレッドSTh1は、演算スレッドTh2、3のバリア同期が完了すると記憶域L110の同期ポイントIDを2次キャッシュL2の記憶域L201に書き込む。
同期スレッドSTh0は、2次キャッシュL2の記憶域L200、L201の内容が一致すると第2階層のバリア同期が完了したと判定してハードウェアバリア同期機構100に同期完了を通知する。
なお、同期スレッドSTh0〜STh3は、前記第1実施形態の図9に示した親スレッドの処理と、図10の処理を実行する。これに対して、演算スレッドTh0〜Th7は、図9のS41〜S43とS52のみを実行する。
このように、前記第1実施形態のスレッドを、主に演算処理を行う演算スレッドと、バリア同期処理のみを行う同期スレッドに分割することで、演算スレッド及び同期スレッドには親子関係は不要になり、前記第1実施形態のようなスレッド間で親子関係を判定する処理が不要になってバリア同期に要する演算負荷を低減することができる。
<第4実施形態>
図24、図25は、第4の実施形態を示し、前記第1実施形態に示したバリア同期処理にデッドロックなどの障害を検知する機能を加えたもので、その他の構成は前記第1実施形態と同様である。
従来の並列演算処理のプログラムPGの開発過程では、ひとつのスレッドがバリア同期待ちとなったままになると、正常に動作している他のスレッドもバリア同期が取れずに停止するデッドロックが起きる場合がある。このデッドロックが生じると、使用中のプロセッサコアがどの同期ポイントIDで停止しているか検知できないため、従来では、ソースコード中にブレークポイントなどを設けて、デバッグを行っていたため生産性が低下していた。
本第4実施形態では、障害発生時に現在の同期ポイントIDを通知することで、デバッグ作業を効率よく行うものである。
図24は、前記第1実施形態の図9に示した最下位層のバリア同期処理を行うフローチャートに、障害検知処理S100を付加したもので、その他の構成は前記第1実施形態と同様である。
図24において、S45で親スレッドが行う第1階層のバリア同期の確認処理では、S44で読み込んだ子スレッドの同期ポイントIDが一致するまでループを行い、このループの途中に障害を検知する障害検知処理S100を設ける。同様に、子スレッドが行う第1階層のバリア同期の確認処理では、S52で親スレッドからの同期完了通知があるまでループを行い、このループの途中に障害を検知する障害検知処理S110を設ける。
図25は、上記障害検知処理S100の詳細を示すサブルーチンである。同期完了のループが開始されると、S101で経過時間のカウントが行われ、確認処理が開始されてから所定時間を経過したか否かを判定する。所定時間を経過した場合には、デッドロックなどの障害が発生したと判定して、S102に進む。
S102では、同期すべきスレッドの同期ポイントIDを共有記憶域(この例では1次キャッシュL1)から読み込む。
そして、S103では取得した同期ポイントIDとスレッド番号を、他の同期グループまたは上位の同期グループの記憶域である3次キャッシュL3または主記憶MMの所定の記憶域に格納する。
なお、S110の処理内容も上記図25と同様である。
例えば、図4において、スレッドTh0がデッドロックを起こした場合、第1階層で同期を行うスレッドTh1は、上記図24のS110で確認処理S52を開始してから所定時間が経過すると、図5に示した1次キャッシュL1−0の所定のキャッシュライン上の記憶域L100から同期ポイントIDを読み込む。そして、この記憶域L100を使用するスレッド番号と読み込んだ同期ポイントIDを、3次キャッシュL3の所定の記憶域に書き込む。なお、スレッド番号と読み込んだ同期ポイントIDの書き込みは、他の同期グループのプロセッサコアから読み込み可能であれば良く、例えば、2次キャッシュL2や主記憶MMなどを所定の記憶域としても良い。また、同期ポイントIDのみを書き込むようにしても良く、同期ポイントIDに基づいてスレッド(プログラム)をデバッグすることができる。
デッドロックを起こしていない他の同期グループのプロセッサコアcpu2、3等から3次キャッシュL3の所定の記憶域を読み込むことで、いずれの同期ポイントIDでいずれのスレッド番号が停止したのかを取得することができる。
このように、障害発生時には、異なるグループのプロセッサコア間あるいはプロセッサモジュール間で共有する2次キャッシュL2や3次キャッシュL3等の共有記憶域に設定した所定の記憶域に、障害が発生したスレッドの同期ポイントID及びスレッド番号を格納するようにしたので、正常に作動している他のプロセッサコアから上記共有記憶域を読み込むことで、障害が生じた同期ポイントIDとスレッド番号を確認することが可能となる。
これにより、プログラムPGの開発者は、極めて容易に障害生じた同期ポイントやスレッドなどを知ることができ、上述のようなブレークポイントなどを設けることなく並列演算処理のデバッグを実現することができ、ソフトウェア開発の生産性を大幅に向上させることができる。
<第5実施形態>
図26は、第5の実施形態を示し、前記第1実施形態の図6に示したプログラム(ロードモジュール)PGのうち演算処理PG2をロードモジュールとして生成する手順を示す。
前記第1実施形態では、初期設定処理PG1でプロセッサコアの数や同期グループの階層などを入力する必要があったが、本第5実施形態では、演算処理PG2を生成する段階で使用するプロセッサコアの数やマルチコア・マイクロプロセッサの構成や共有記憶域の構造等を予め設定し、実行の際にはロードモジュール(演算処理PG2)を主記憶MMにロードして実行するだけにしたものである。
まず、図26のS200では、並列演算処理のソースコードを生成する。そしてS201ではコンパイラによりソースコードをコンパイルする。このコンパイルの際に、演算処理PG2を実行する並列計算機の共有記憶域の階層(図中メモリ階層)や同期ポイントID及びプロセッサモジュール当たりのプロセッサコアの数などをコンパイルオプションとして入力し、コンパイルを実行する。なお、このコンパイルは図示しない計算機で行われる。
コンパイラは、複数のプロセッサコアで処理を行うデータ間に依存関係が生じたときに、バリア同期を行うための同期ポイントを設定し、この同期ポイントには一意の識別子として同期ポイントIDを設定する。そして、この同期ポイントでは、プロセッサコア数と共有記憶域の階層数に応じてバリア同期の階層を設定する。そして、コンパイラは各階層毎に同期グループを階層構造で設定する。この同期グループは、前記第1実施形態または第2実施形態で示したように、プロセッサコア側を下位の同期グループとし、プロセッサコアから離れるにつれて順次上位階層の同期グループとして設定する。
このコンパイルの結果、S202では特定の並列計算機の構成に最適化された複数のオブジェクトが生成される。
そして、S203ではリンケージエディタを用いて、上記複数のオブジェクトを結合し実行ファイルとしてのロードモジュール(演算処理PG2)を生成する。このリンケージエディタでは、スレッド間の親子関係の設定や、バリア同期の実行方法(ハードウェアバリア同期機構の有無等)を設定する。
上記の処理により、特定の計算機に最適化された演算処理PG2を生成し、図1あるいは図16に示した並列計算機で実行すれば、前記第1実施形態のような初期設定処理を行うことなくバリア同期を行う並列演算処理を実行することができる。
以上のように、本発明によればマルチコア・マイクロプロセッサを用いてマルチスレッドによる並列演算処理を実現できるので、マルチコア・マイクロプロセッサを備えた並列計算機や、マルチコア・マイクロプロセッサでマルチスレッドの並列演算処理を行うプログラム及びこのプログラムを生成するコンパイラに適用することができる。
本発明の第1の実施形態を示し、バリア同期処理を行う並列計算機の構成図を示す。 同じく、並列計算機の各プロセッサコアで実行されるソフトウェアの構成図で、バリア同期処理を行う同期グループの一例を示す。 ハードウェアバリア同期機構の構成図。 4つのプロセッサコアでバリア同期処理を行う同期グループの階層構造を示す説明図。 プロセッサモジュール毎の共有記憶域の設定の一例を示す説明図。 並列処理を行うプログラムの一例を示す構成図。 バリア同期処理の初期設定を行うフローチャート。 同じく、第1階層から第2階層のバリア同期処理の初期設定を行うフローチャート。 バリア同期処理を行うフローチャートでメインルーチンの処理を示す。 同じく、上位層のバリア同期処理のフローチャート。 ひとつのプロセッサモジュールでバリア同期処理を行う同期グループの階層構造を示す説明図。 同じくひとつのプロセッサモジュールでバリア同期処理を行う場合のバリア同期のフローチャート。 プロセッサコア間でスレッド数が異なる場合の同期グループの階層構造を示す説明図。 同じく、プロセッサコア間でスレッド数が異なる場合の共有記憶域の設定の一例を示す説明図。 本発明の第2の実施形態を示し、ソフトウェアのみでバリア同期処理を行う並列計算機の構成図を示す。 第2の実施形態を示し、4つのプロセッサコアでバリア同期処理を行う同期グループの階層構造を示す説明図。 第2の実施形態を示し、プロセッサモジュール毎の共有記憶域と3次キャッシュメモリの設定の一例を示す説明図。 同じく、第2の実施形態を示し、バリア同期処理の初期設定を行うフローチャート。 同じく、第2の実施形態を示し、第1階層から第F階層のバリア同期処理の初期設定を行うフローチャート。 同じく、第2の実施形態を示し、バリア同期処理を行うフローチャートでメインルーチンの処理を示す。 同じく、第2の実施形態を示し、上位階層におけるバリア同期処理のフローチャート。 本発明の第3の実施形態を示し、同期スレッドを用いて4つのプロセッサコアでバリア同期処理を行う同期グループの階層構造を示す説明図。 同じく、第3の実施形態を示し、演算スレッドと同期スレッドの共有記憶域の設定の一例を示す説明図。 本発明の第4の実施形態を示し、障害検知処理を行う場合のバリア同期処理で最下位層のフローチャート。 同じく、本発明の第4の実施形態を示し、障害検知処理を行う場合のバリア同期処理で上位層のフローチャート。 本発明の第5の実施形態を示し、プログラムを生成するコンパイラの説明図。
符号の説明
P0〜P7 プロセッサモジュール
cpu0〜15 プロセッサコア
L1−0〜15 1次キャッシュ
L2−0〜7 2次キャッシュ
L3 3次キャッシュ
MM 主記憶
Th0〜Th15 スレッド
100 ハードウェアバリア同期機構

Claims (11)

  1. それぞれが複数のプロセッサコアを有する複数のプロセッサと、前記複数のプロセッサコアがアクセスする主記憶とを有し、前記プロセッサコアと前記主記憶との間に前記複数のプロセッサコアで実行される複数のスレッド間または前記複数のプロセッサコア間あるいは前記複数のプロセッサ間で共有可能な共有記憶域を階層的に備えた計算機システムにおいて、前記複数のスレッドを並列的に実行するためのバリア同期を行う同期方法であって、
    記プロセッサコアのそれぞれに複数のスレッドを割り当てて実行させる処理と、
    前記複数のスレッドを階層構造のグループに設定する処理と、
    前記グループ毎にバリア同期を取る処理と、
    を含み、
    前記複数のスレッドを階層構造のグループに設定する処理は、
    前記共有記憶域の階層毎にバリア同期を行うグループを設定し、
    前記グループ毎にバリア同期を取る処理は、
    前記グループ内でバリア同期を取る処理と、
    前記グループ間でバリア同期を取る処理と、
    を含むことを特徴とする並列計算機の同期方法。
  2. 前記グループ毎にバリア同期を取る処理は、
    前記スレッドが予め設定したバリア同期ポイントに達したときに、当該スレッドが属するグループの共有記憶域に同期情報を書き込む処理と、
    当該スレッドが属するグループの共有記憶域に格納された他のスレッドの同期情報を読み込む処理と、
    当該スレッドの同期情報と他のスレッドの同期情報が一致したときに当該グループのバリア同期が完了したことを判定する処理と、
    を含むことを特徴とする請求項1に記載の並列計算機の同期方法。
  3. 前記グループ毎にバリア同期を取る処理は、
    前記プロセッサコア側の共有記憶域を用いるグループを下位グループとし、主記憶側の共有記憶域を用いるグループを上位グループとして、下位グループのバリア同期が完了した後に、順次上位グループのバリア同期をとることを特徴とする請求項1に記載の並列計算機の同期方法。
  4. 前記グループ毎にバリア同期を取る処理は、
    前記プロセッサコア側の共有記憶域を用いるグループを下位グループとし、主記憶側の共有記憶域を用いるグループを上位グループとして、最上位のグループのバリア同期をハードウェアバリア同期機構により行うことを特徴とする請求項1に記載の並列計算機の同期方法。
  5. 前記複数のスレッドを階層構造のグループに設定する処理は、
    前記グループの階層毎に異なる共有記憶域を用いることを特徴する請求項1に記載の並列計算機の同期方法。
  6. 前記複数のスレッドを割り当てて実行させる処理は、
    前記プロセッサコアのうち使用するプロセッサコアの数を設定する処理と、
    前記使用するプロセッサコアで実行させるスレッドの数を設定する処理と、
    前記プロセッサコアの数とスレッドの数に基づいて使用するプロセッサコアにそれぞれスレッドを割り当てる処理と、
    を含むことを特徴とする請求項1に記載の並列計算機の同期方法。
  7. 前記複数のスレッドを割り当てて実行させる処理は、
    前記使用するプロセッサコアに割り当てたスレッドに、固有の識別子を付与する処理と、
    前記識別子の大小関係に応じて、同一グループ内のスレッドのひとつを親スレッドとし、他のスレッドを子スレッドとして設定する処理と、
    をさらに含み、
    前記グループ毎にバリア同期を取る処理は、
    前記グループ間でバリア同期を行う際に、前記親スレッド同士でバリア同期を行うことを特徴とする請求項6に記載の並列計算機の同期方法。
  8. 前記複数のスレッドを割り当てて実行させる処理は、
    前記使用するプロセッサコアに前記スレッドのバリア同期を行う同期スレッドを割り当てる処理を含み、
    前記グループ毎にバリア同期を取る処理は、
    前記グループ間でバリア同期を行う際に、前記同期スレッド同士でバリア同期を行うことを特徴とする請求項6に記載の並列計算機の同期方法。
  9. 前記グループ毎にバリア同期を取る処理は、
    前記スレッドが予め設定したバリア同期ポイントに達したときに、当該スレッドが属するグループの共有記憶域に同期情報を書き込む処理と、
    当該スレッドが属するグループの共有記憶域に格納された他のスレッドの同期情報を読み込む処理と、
    当該スレッドの同期情報と他のスレッドの同期情報が所定時間を超えて一致しない場合には、前記他のスレッドに障害が発生したと判定する処理と、
    前記障害の発生時には、前記他のスレッドの同期情報を異なるグループの共有記憶域に書き込む処理と、
    を含むことを特徴とする請求項1に記載の並列計算機の同期方法。
  10. 複数のプロセッサコアを有するプロセッサを複数備えた並列計算機で、複数のプロセッサで複数のスレッドを並列的に実行してバリア同期を行うプログラムであって、
    前記プロセッサコアのそれぞれに複数のスレッドを割り当てて実行させる手順と、
    前記複数のスレッドを階層構造のグループに設定する手順と、
    前記グループ毎にバリア同期を取る手順と、を含み、
    前記複数のスレッドを階層構造のグループに設定する手順は、
    前記プロセッサコアから主記憶との間に配置されて、前記スレッド間または前記複数のプロセッサコア間あるいは前記複数のプロセッサ間で共有可能な共有記憶域の階層を設定する手順と、
    前記共有記憶域の階層毎にバリア同期を行うグループを設定する手順と、を含み、
    前記グループ毎にバリア同期を取る手順は、
    前記グループ内でバリア同期を取る手順と、
    前記グループ間でバリア同期を取る手順と、
    を並列計算機に機能させることを特徴とするプログラム。
  11. 前記プロセッサコアのそれぞれに複数のスレッドを割り当てて実行させる手順は、
    予め設定された並列計算機で使用するプロセッサコアの数と予め設定したスレッドの数に基づいて使用するプロセッサコアにそれぞれスレッドを割り当てる手順と、
    を含み、
    前記複数のスレッドを階層構造のグループに設定する手順は、
    予め設定された並列計算機の共有記憶域の階層毎にバリア同期を行うグループを設定する手順と、
    を含むことを特徴とする請求項10に記載のプログラム。
JP2005072633A 2005-03-15 2005-03-15 並列計算機の同期方法及びプログラム Expired - Fee Related JP4448784B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2005072633A JP4448784B2 (ja) 2005-03-15 2005-03-15 並列計算機の同期方法及びプログラム
US11/312,345 US7908604B2 (en) 2005-03-15 2005-12-21 Synchronization method and program for a parallel computer

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2005072633A JP4448784B2 (ja) 2005-03-15 2005-03-15 並列計算機の同期方法及びプログラム

Publications (2)

Publication Number Publication Date
JP2006259821A JP2006259821A (ja) 2006-09-28
JP4448784B2 true JP4448784B2 (ja) 2010-04-14

Family

ID=37011844

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005072633A Expired - Fee Related JP4448784B2 (ja) 2005-03-15 2005-03-15 並列計算機の同期方法及びプログラム

Country Status (2)

Country Link
US (1) US7908604B2 (ja)
JP (1) JP4448784B2 (ja)

Families Citing this family (74)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080005357A1 (en) * 2006-06-30 2008-01-03 Microsoft Corporation Synchronizing dataflow computations, particularly in multi-processor setting
GB0613289D0 (en) * 2006-07-04 2006-08-16 Imagination Tech Ltd Synchronisation of execution threads on a multi-threaded processor
US8056087B2 (en) * 2006-09-25 2011-11-08 International Business Machines Corporation Effective use of a hardware barrier synchronization register for protocol synchronization
WO2008136045A1 (ja) * 2007-04-19 2008-11-13 Fujitsu Limited 共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法
WO2008136047A1 (ja) * 2007-04-19 2008-11-13 Fujitsu Limited Smpノードからなるメモリ分散型並列計算機システム向けlu分解の並列処理方法
JP2008287562A (ja) * 2007-05-18 2008-11-27 Sony Corp 処理装置及びデバイス制御ユニット
WO2008155806A1 (ja) 2007-06-20 2008-12-24 Fujitsu Limited バリア同期方法、装置、及びマルチコアプロセッサ
US8473948B1 (en) * 2007-08-08 2013-06-25 Nvidia Corporation Method for synchronizing independent cooperative thread arrays running on a graphics processing unit
US8370845B1 (en) 2007-08-08 2013-02-05 Nvidia Corporation Method for synchronizing independent cooperative thread arrays running on a graphics processing unit
WO2009028231A1 (ja) * 2007-08-24 2009-03-05 Nec Corporation 通信方法
US8930680B2 (en) 2007-12-21 2015-01-06 International Business Machines Corporation Sync-ID for multiple concurrent sync dependencies in an out-of-order store queue
US9170962B2 (en) * 2007-12-21 2015-10-27 International Business Machines Corporation Dynamic designation of retirement order in out-of-order store queue
KR101400286B1 (ko) * 2008-01-22 2014-05-26 삼성전자주식회사 다중 프로세서 시스템에서 작업을 이동시키는 방법 및 장치
JP2009176116A (ja) 2008-01-25 2009-08-06 Univ Waseda マルチプロセッサシステムおよびマルチプロセッサシステムの同期方法
WO2009118731A2 (en) 2008-03-27 2009-10-01 Rocketick Technologies Ltd Design simulation using parallel processors
EP2297647A4 (en) * 2008-07-10 2012-12-12 Rocketick Technologies Ltd EFFICIENT PARALLEL CALCULATION OF DEPENDENCE PROBLEMS
US9032377B2 (en) 2008-07-10 2015-05-12 Rocketick Technologies Ltd. Efficient parallel computation of dependency problems
US8412889B2 (en) * 2008-10-16 2013-04-02 Microsoft Corporation Low-level conditional synchronization support
TWI381315B (zh) * 2008-10-24 2013-01-01 Nat Univ Chung Cheng Synchronization elements for multi-core embedded systems
US20100115236A1 (en) * 2008-10-31 2010-05-06 Cray Inc. Hierarchical shared semaphore registers
JP4576452B2 (ja) * 2008-11-06 2010-11-10 イーソル株式会社 オペレーティングシステムおよび情報処理装置
JP5304194B2 (ja) 2008-11-19 2013-10-02 富士通株式会社 バリア同期装置、バリア同期システム及びバリア同期装置の制御方法
FR2939922B1 (fr) * 2008-12-16 2011-03-04 Bull Sas Gestionnaire physique de barriere de synchronisation entre processus multiples
WO2010109761A1 (ja) * 2009-03-25 2010-09-30 日本電気株式会社 並列処理システム、並列処理方法、ネットワークスイッチ装置、及び並列処理プログラムの記録媒体
US8352633B2 (en) * 2009-06-22 2013-01-08 Citrix Systems, Inc. Systems and methods of state migration in a multi-core system
US9354944B2 (en) * 2009-07-27 2016-05-31 Advanced Micro Devices, Inc. Mapping processing logic having data-parallel threads across processors
JP5447807B2 (ja) * 2009-08-07 2014-03-19 株式会社日立製作所 バリア同期方法及び計算機
US8832712B2 (en) * 2009-09-09 2014-09-09 Ati Technologies Ulc System and method for synchronizing threads using shared memory having different buffer portions for local and remote cores in a multi-processor system
FR2950714B1 (fr) * 2009-09-25 2011-11-18 Bull Sas Systeme et procede de gestion de l'execution entrelacee de fils d'instructions
US9164969B1 (en) * 2009-09-29 2015-10-20 Cadence Design Systems, Inc. Method and system for implementing a stream reader for EDA tools
CN103168291A (zh) * 2010-10-20 2013-06-19 富士通株式会社 信息处理系统、存储装置、信息处理装置以及信息处理系统的控制方法
US8949835B2 (en) * 2010-11-30 2015-02-03 Red Hat, Inc. Yielding input/output scheduler to increase overall system throughput
WO2012124078A1 (ja) * 2011-03-16 2012-09-20 富士通株式会社 同期方法、マルチコアプロセッサシステム、および同期システム
JPWO2012127534A1 (ja) * 2011-03-23 2014-07-24 富士通株式会社 バリア同期方法、バリア同期装置及び演算処理装置
US9128748B2 (en) 2011-04-12 2015-09-08 Rocketick Technologies Ltd. Parallel simulation using multiple co-simulators
EP2711839A4 (en) * 2011-05-19 2014-12-03 Nec Corp PARALLEL PROCESSING DEVICE, PARALLEL PROCESSING METHOD, OPTIMIZATION DEVICE, OPTIMIZATION METHOD AND COMPUTER PROGRAM
US8621473B2 (en) 2011-08-01 2013-12-31 Honeywell International Inc. Constrained rate monotonic analysis and scheduling
US8875146B2 (en) 2011-08-01 2014-10-28 Honeywell International Inc. Systems and methods for bounding processing times on multiple processing units
DE102011084569B4 (de) * 2011-10-14 2019-02-21 Continental Automotive Gmbh Verfahren zum Betreiben eines informationstechnischen Systems und informationstechnisches System
US8607247B2 (en) * 2011-11-03 2013-12-10 Advanced Micro Devices, Inc. Method and system for workitem synchronization
US9092272B2 (en) * 2011-12-08 2015-07-28 International Business Machines Corporation Preparing parallel tasks to use a synchronization register
US9207977B2 (en) 2012-02-06 2015-12-08 Honeywell International Inc. Systems and methods for task grouping on multi-processors
US9513975B2 (en) * 2012-05-02 2016-12-06 Nvidia Corporation Technique for computational nested parallelism
JP5974703B2 (ja) 2012-07-20 2016-08-23 富士通株式会社 情報処理装置およびバリア同期方法
US9612868B2 (en) 2012-10-31 2017-04-04 Honeywell International Inc. Systems and methods generating inter-group and intra-group execution schedules for instruction entity allocation and scheduling on multi-processors
US8839216B2 (en) 2012-11-07 2014-09-16 International Business Machines Corporation Compiler optimization based on collectivity analysis
JP5994601B2 (ja) * 2012-11-27 2016-09-21 富士通株式会社 並列計算機、並列計算機の制御プログラム及び並列計算機の制御方法
JP6221498B2 (ja) * 2013-08-15 2017-11-01 富士通株式会社 情報処理システム及び情報処理システムの制御方法
WO2015027403A1 (en) * 2013-08-28 2015-03-05 Hewlett-Packard Development Company, L.P. Testing multi-threaded applications
JP6176166B2 (ja) * 2014-03-25 2017-08-09 株式会社デンソー データ処理装置
JP6330569B2 (ja) * 2014-08-14 2018-05-30 富士通株式会社 演算処理装置および演算処理装置の制御方法
JP6442947B2 (ja) * 2014-09-19 2018-12-26 日本電気株式会社 情報処理装置、情報処理方法及びそのプログラム
CN105745912B (zh) * 2014-10-21 2018-05-18 株式会社东京机械制作所 图像处理装置
US9760410B2 (en) * 2014-12-12 2017-09-12 Intel Corporation Technologies for fast synchronization barriers for many-core processing
US10101786B2 (en) 2014-12-22 2018-10-16 Intel Corporation Holistic global performance and power management
US9477533B2 (en) 2014-12-26 2016-10-25 Intel Corporation Progress meters in parallel computing
JP2015127982A (ja) * 2015-04-06 2015-07-09 学校法人早稲田大学 マルチプロセッサシステム
US10402234B2 (en) * 2016-04-15 2019-09-03 Nec Corporation Fine-grain synchronization in data-parallel jobs
US10402235B2 (en) * 2016-04-15 2019-09-03 Nec Corporation Fine-grain synchronization in data-parallel jobs for distributed machine learning
US11353868B2 (en) 2017-04-24 2022-06-07 Intel Corporation Barriers and synchronization for machine learning at autonomous machines
GB2575294B8 (en) * 2018-07-04 2022-07-20 Graphcore Ltd Host Proxy On Gateway
JP7338354B2 (ja) * 2019-09-20 2023-09-05 富士通株式会社 情報処理装置,情報処理システム及び通信管理プログラム
US11409579B2 (en) * 2020-02-24 2022-08-09 Intel Corporation Multiple independent synchonization named barrier within a thread group
JP7476638B2 (ja) * 2020-04-15 2024-05-01 株式会社デンソー マルチプロセッサシステム
US20210382717A1 (en) * 2020-06-03 2021-12-09 Intel Corporation Hierarchical thread scheduling
US11977895B2 (en) 2020-06-03 2024-05-07 Intel Corporation Hierarchical thread scheduling based on multiple barriers
CN112306646B (zh) * 2020-06-29 2024-11-22 北京京东拓先科技有限公司 用于处理事务的方法、装置、设备及可读存储介质
GB202010806D0 (en) * 2020-07-14 2020-08-26 Graphcore Ltd Extended sync network
US11720360B2 (en) * 2020-09-11 2023-08-08 Apple Inc. DSB operation with excluded region
GB202110148D0 (en) * 2021-07-14 2021-08-25 Graphcore Ltd Synchronisation for a multi-tile processing unit
CN114237878B (zh) * 2021-12-06 2025-10-31 海光信息技术股份有限公司 指令控制方法、电路、装置及相关设备
EP4206995A1 (en) 2021-12-30 2023-07-05 Rebellions Inc. Neural processing device and method for synchronization thereof
US20230289242A1 (en) * 2022-03-10 2023-09-14 Nvidia Corporation Hardware accelerated synchronization with asynchronous transaction support
KR102623397B1 (ko) * 2023-04-07 2024-01-10 메티스엑스 주식회사 매니코어 시스템

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05151174A (ja) 1991-11-28 1993-06-18 Fujitsu Ltd マルチプロセツサの同期方式
JPH11312148A (ja) 1998-04-28 1999-11-09 Hitachi Ltd バリア同期方法及び装置
US6862027B2 (en) * 2003-06-30 2005-03-01 Microsoft Corp. System and method for parallel execution of data generation tasks
US7512950B1 (en) * 2003-08-14 2009-03-31 Sun Microsystems, Inc. Barrier synchronization object for multi-threaded applications

Also Published As

Publication number Publication date
US20060212868A1 (en) 2006-09-21
US7908604B2 (en) 2011-03-15
JP2006259821A (ja) 2006-09-28

Similar Documents

Publication Publication Date Title
JP4448784B2 (ja) 並列計算機の同期方法及びプログラム
KR100578437B1 (ko) 다수의 스레드의 병행 실행을 지원하는 컴퓨터 시스템에서의 인터럽트 처리 메커니즘
CN101833475B (zh) 用于执行指令原子块的方法和装置
US8640140B2 (en) Adaptive queuing methodology for system task management
US8739163B2 (en) Critical path deterministic execution of multithreaded applications in a transactional memory system
TWI537831B (zh) 多核心處理器、用於執行處理程序切換之方法、用於保全一記憶體區塊之方法、用於致能使用一多核心裝置之異動處理之設備、以及用於執行記憶體異動處理之方法
US20110119452A1 (en) Hybrid Transactional Memory System (HybridTM) and Method
CN101563674A (zh) 对来自多处理器系统上的多线程程序的存储器访问进行管理的方法和系统
CN114930292B (zh) 协作式工作窃取调度器
US9378069B2 (en) Lock spin wait operation for multi-threaded applications in a multi-core computing environment
CN103140828A (zh) 基于硬件限制利用可调事务尺寸来动态优化代码的装置、方法和系统
US10922137B2 (en) Dynamic thread mapping
CN107729267B (zh) 资源的分散分配以及用于支持由多个引擎执行指令序列的互连结构
EP3588313B1 (en) Non-volatile memory aware caching policies
US11656967B2 (en) Method and apparatus for supporting persistence and computing device
Ceze et al. Colorama: Architectural support for data-centric synchronization
JP6135392B2 (ja) キャッシュメモリ制御プログラム,キャッシュメモリを内蔵するプロセッサ及びキャッシュメモリ制御方法
Orosa et al. Flexsig: Implementing flexible hardware signatures
Duan et al. Asymmetric memory fences: Optimizing both performance and implementability
Duan et al. BulkCompactor: Optimized deterministic execution via conflict-aware commit of atomic blocks
He et al. NUMA-Aware Contention Scheduling on Multicore Systems
JP5847313B2 (ja) 情報処理装置
Reif et al. Migration-Based Synchronization
Zhu et al. SymS: a symmetrical scheduler to improve multi‐threaded program performance on NUMA systems
CN117331669A (zh) 基于锁语义实现应用透明的动态处理器缓存分区调度方法和系统

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20080225

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20090911

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20090929

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20091130

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20100105

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20100125

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130129

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees