(57)【特許請求の範囲】
【請求項１】
並列プログラムにおける複数のプロセスの間で実行される、データ転送処理を少なくとも含むプロセス間通信を制御可能なプロセス間通信部と、
前記並列プログラムの実行過程で生成された複数のスレッドのうち、第１のスレッドにおいて同期処理が実行されてから、その前記第１のスレッドと、複数の前記スレッドのうち、他の前記スレッドである１以上の第２のスレッドとが同期されるまでに、前記第１のスレッドにより前記プロセス間通信を進行するマルチスレッド制御部と、を備える
並列処理装置。
【請求項２】
前記マルチスレッド制御部は、
前記第１のスレッドにおいて同期処理が実行されることにより、その前記第１のスレッドが同期待ち状態になった場合、１以上の前記第２のスレッドのそれぞれについて同期待ち状態であるか否かを判定し、いずれか１以上の前記第２のスレッドが同期待ち状態でない場合に、前記第１のスレッドにより、前記プロセス間通信部が提供する機能を用いて、前記プロセス間通信に関する処理を実行する
請求項１に記載の並列処理装置。
【請求項３】
前記第１のスレッドは、複数生成された前記スレッドのうち、最初に同期待ち状態になったスレッドであり、
前記マルチスレッド制御部は、前記第１のスレッドが同期待ち状態になってから、全ての前記第２のスレッドが同期待ち状態になるまでの間に、前記第１のスレッドにより、前記プロセス間通信部が提供する機能を用いて、前記プロセス間通信を進行する処理を実行する
請求項２に記載の並列処理装置。
【請求項４】
前記プロセス間通信は、順序関係を有する１以上の段階の前記データ転送処理を含み、
前記プロセス間通信部は、前記順序関係に従って前記データ転送処理の段階を進めることにより、前記プロセス間通信の進行を制御可能であり、
前記マルチスレッド制御部は、前記第１のスレッドにより、前記プロセス間通信部が提供する機能を用いて、前記プロセス間通信を進行する処理を実行する
請求項２又は請求項３に記載の並列処理装置。
【請求項５】
前記プロセス間通信には、前記プロセス間通信の各段階毎に、一つ前の段階のデータ転送を完了する完了処理と、各段階におけるデータ転送を実行する処理と、の少なくとも一方が含まれ、
前記プロセス間通信部は、前記完了処理において、一つ前の段階の前記データ転送処理が完了したか否かを確認し、
一つ前の段階の前記データ転送処理が完了した場合には、当該段階における前記データ転送処理を実行するとともに前記プロセス間通信の段階を次の段階に設定し、
一つ前の段階の前記データ転送処理が完了していない場合には、当該一つ前の段階における前記データ転送処理の完了を待たずに前記完了処理を中断するとともに、前記データ転送処理が完了していない前記プロセス間通信の段階を表す情報を提供する
請求項４に記載の並列処理装置。
【請求項６】
前記プロセス間通信部は、
前記プロセス間通信を特定可能な情報と、前記プロセス間通信の段階を表す情報とを関連付けて保持する通信処理記録部を有し、
前記データ転送の完了を待たずに前記完了処理を中断する場合、前記データ転送処理が完了していない前記プロセス間通信の段階を表す情報を前記通信処理記録部に設定し、
前記第１のスレッドにより前記プロセス間通信に関する処理が実行された際、前記通信処理記録部に設定された前記プロセス間通信の段階を表す情報を用いて、その情報により表される段階から、前記プロセス間通信を進行する処理を実行する
請求項５に記載の並列処理装置。
【請求項７】
前記マルチスレッド制御部は、前記第１のスレッドが同期待ち状態になってから、全ての前記第２のスレッドが同期待ち状態になるまでの間に、前記第１のスレッドが同期待ち状態になってから経過した時間が基準時間を超えない範囲で、前記第１のスレッドにより、前記プロセス間通信部が提供する機能を用いて、前記プロセス間通信を進行する処理を実行する
請求項２又は請求項３に記載の並列処理装置。
【請求項８】
１以上の演算ユニットを含む１以上の回路要素と、
前記回路要素から参照可能な記憶領域を提供する記憶装置と、を備え、
前記回路要素は、
並列プログラムにおける複数のプロセスの間で実行される、データ転送処理を少なくとも含むプロセス間通信を制御する機能と、
前記並列プログラムの実行過程で生成された複数のスレッドのうち、第１のスレッドにおいて同期処理が実行されてから、その前記第１のスレッドと、複数の前記スレッドのうち、他の前記スレッドである１以上の第２のスレッドとが同期されるまでに、前記プロセス間通信に関する処理を実行する機能と、を実行可能な構成を有する
並列処理装置。
【請求項９】
並列プログラムの実行に応じて、前記並列プログラムにおける複数のプロセスの間で実行される、データ転送処理を少なくとも含むプロセス間通信を制御し、
前記並列プログラムの実行過程で生成された複数のスレッドうち、第１のスレッドにおいて同期処理が実行されてから、その前記第１のスレッドと、複数の前記スレッドのうち、他の前記スレッドである１以上の第２のスレッドとが同期されるまでに、前記第１のスレッドにより前記プロセス間通信を進行する
並列処理方法。
【請求項１０】
複数スレッドを並列に処理可能な演算処理装置を備えるコンピュータに、
並列プログラムの実行に応じて、前記並列プログラムにおける複数のプロセスの間で実行される、データ転送処理を少なくとも含むプロセス間通信を制御する処理と、
前記並列プログラムの実行過程で生成された複数のスレッドうち、第１のスレッドにおいて同期処理が実行されてから、その前記第１のスレッドと、複数の前記スレッドのうち、他の前記スレッドである１以上の第２のスレッドとが同期されるまでに、前記第１のスレッドにより前記プロセス間通信を進行する処理と、を実行させる
コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のプロセスの間で実行されるプロセス間通信と、その他の演算処理とを並列に実行する並列処理装置等に関する。
【背景技術】
【０００２】
ＨＰＣ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ）の分野では、複数のコンピューティング・ノード（演算処理装置等）を用いて並列処理を実行する、並列プログラムが用いられている。係る並列プログラムは、例えば、複数のコンピューティング・ノード（以下、「計算ノード」と記載する場合がある）に対して個別にプロセスを割り当てることにより、複数のプロセスを並列に実行する。各プロセスは、相互にデータを送受信することで、実装された処理を実行する。また、各計算ノードが複数のスレッドを並列に処理可能な演算装置（例えば、マルチコアＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）等）を含む場合、各プロセスは、複数のスレッドを用いることで、並列処理を実行することができる。
【０００３】
複数のスレッドを用いた並列処理に関する技術が、以下の各特許文献に開示されている。特許文献１は、マルチスレッド・プロセッサにおいて、スレッドの切り替え処理を高速に実行することを目的とした技術を開示する。特許文献１に開示された装置は、休止状態にあるスレッド用の命令を予め準備しておくことで、スレッドの切り替えに要する時間（特には、命令の取出しに要する時間）を短縮する。特許文献２は、プロセッサの稼働率を向上することを目的としたバリア同期方法に関する技術を開示する。特許文献２に開示された方法は、所定の個数のプロセッサがバリア同期ポイントに到達したした際、それらのプロセッサに、全プロセッサがバリア同期ポイントに到達するまで、バリア同期処理を行ったジョブとは別のジョブを実行させる。
【０００４】
また、複数のスレッドの同期処理に関する技術が以下の各特許文献に開示されている。特許文献３は、処理の絶対量が確定している処理を並列化する場合と、処理の絶対量が確定していない処理を並列化する場合とに共通して適用可能な同期処理方法に関する技術を開示する。特許文献４は、複数のプロセッサにおいて並列に処理される複数のスレッドに対して、階層構造のグループを設定し、当該グループ毎にバリア同期処理を実行する技術を開示する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１０−２８３２０３号公報
【特許文献２】特開平１１−３１２１４８号公報
【特許文献３】特開２０１１−１３４１４５号公報
【特許文献４】特開２００６−２５９８２１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
並列プログラムにおいて、プロセス間通信の進行を管理する方式として、「通信スレッド方式」と、「計算スレッド方式」とが知られている。通信スレッド方式は、計算スレッドとは独立した通信スレッドが、専らプロセス間通信の進行を管理する方式である。また、計算スレッド方式は、演算処理ユニット（演算装置等）において実行される計算スレッド自身が、プロセス間通信の進行を管理する方式である。通信スレッド方式の場合、通信スレッドが独立していることから、計算処理と通信処理の進行とを並行して実行可能である。一方、通信スレッド方式には以下のような問題点がある。即ち、通信スレッド方式の場合、通信スレッドの分、計算スレッドで利用できる演算資源（演算処理ユニットの処理能力）が減少する。また、通信スレッドと計算スレッドとが演算処理ユニットを共用する場合、スレッドの切り替え（スイッチ）が生じることから、コンテキストスイッチなどのオーバーヘッドが生じる。ＨＰＣでは、多くの場合、可能な限り計算処理に演算資源を割り当てること望ましく、計算スレッド方式が用いられることが多い。計算スレッド方式は、通信スレッドを利用しないことから、通信スレッド方式で問題となる、演算資源の減少及び通信スレッドと計算スレッドとのコンテキストスイッチが発生しない。
【０００７】
しかしながら、計算スレッド方式では、並列プログラムにおける計算処理の途中でプロセス間通信に関する処理が記述されていない場合、プロセス間のデータ転送に関する処理が実行されない。この場合、プロセス間のデータ転送処理が実行されるタイミングが遅延してしまう場合がある。これにより、データ転送処理と、複数のプロセスにおける計算処理とが並列に実行されない場合がある、という問題を生じる。
【０００８】
これに対して、上記特許文献１に開示された技術は、スレッドの切り替えの高速化を目的とした技術であり、特許文献２に開示された技術は、スレッドを切り替えることで演算装置の稼働率を改善することを目的とした技術である。即ち、これらの技術はいずれもスレッドの切り替えを前提としていることから、コンテキストスイッチ等のオーバーヘッド自体を完全に排除することはできない。また、これらの技術は、いずれも、計算スレッド方式に関する上記課題を解決可能な技術ではない。上記特許文献３及び特許文献４に開示された技術は、いずれも複数スレッド間の同期処理そのものを実装する技術であり、計算スレッド方式に関する上記課題を解決可能な技術ではない。
【０００９】
本発明は、上記のような事情を鑑みてなされたものである。即ち、本発明は、並列プログラムにおける計算処理の過程で消費される演算資源を用いて、プロセス間通信処理と、計算処理とを並列に実行可能な並列処理装置等を提供することを、主たる目的の一つとする。
【課題を解決するための手段】
【００１０】
上記の目的を達成すべく、本発明の一態様に係る並列処理装置は、並列プログラムにおける複数のプロセスの間で実行される、データ転送処理を少なくとも含むプロセス間通信を制御可能なプロセス間通信部と、上記並列プログラムの実行過程で生成された複数のスレッドのうち、第１のスレッドにおいて同期処理が実行されてから、その上記第１のスレッドと、複数の上記スレッドのうち、他の上記スレッドである１以上の第２のスレッドとが同期されるまでに、上記第１のスレッドにより上記プロセス間通信を進行するマルチスレッド制御部と、を備える。
【００１１】
また、本発明の一態様に係る並列処理方法は、並列プログラムの実行に応じて、上記並列プログラムにおける複数のプロセスの間で実行される、データ転送処理を少なくとも含むプロセス間通信を制御し、上記並列プログラムの実行過程で生成された複数のスレッドうち、第１のスレッドにおいて同期処理が実行されてから、その上記第１のスレッドと、複数の上記スレッドのうち、他の上記スレッドである１以上の第２のスレッドとが同期されるまでに、上記第１のスレッドにより上記プロセス間通信を進行する。
【００１２】
また、同目的は、上記構成を有する並列処理装置、並列処理方法をコンピュータによって実現するコンピュータ・プログラム、及び、そのコンピュータ・プログラムが格納されているコンピュータ読み取り可能な記録媒体等によっても達成される。
【発明の効果】
【００１３】
本発明によれば、並列プログラムにおける計算処理の過程で消費される演算資源を用いて、プロセス間通信処理と、計算処理とを並列に実行可能である。
【図面の簡単な説明】
【００１４】
【図１】図１は、バタフライ方式によるプロセス間通信処理の過程を例示する説明図である。
【図２】図２は、並列処理プログラムの具体例を示す説明図である。
【図３】図３は、図２に例示する並列処理プログラムを実行した場合のタイムラインチャートの一例を示す説明図である。
【図４Ａ】図４Ａは、本発明の第１の実施形態における並列処理装置の機能的な構成を例示するブロック図である。
【図４Ｂ】図４Ｂは、本発明の第２の実施形態における並列処理装置の機能的な構成を例示するブロック図である。
【図５Ａ】図５Ａは、本発明の第２の実施形態における並列処理装置において実行されるプロセス間通信のアルゴリズムを例示する説明図（疑似コード）である。
【図５Ｂ】図５Ｂは、本発明の第２の実施形態における並列処理装置において実行されるプロセス間通信のアルゴリズムの処理内容を例示するフローチャートである。
【図６Ａ】図６Ａは、本発明の第２の実施形態における通信処理記録部に記録されるデータの一例を示す説明図である。
【図６Ｂ】図６Ｂは、本発明の第２の実施形態における同期待ちスレッド記録部に記録されるデータの一例を示す説明図である。
【図７】図７は、本発明の第２の実施形態における通信開始処理部の動作を例示するフローチャートである。
【図８Ａ】図８Ａは、本発明の第２の実施形態における通信処理管理部の動作の一例を例示するフローチャートである。
【図８Ｂ】図８Ｂは、本発明の第２の実施形態における通信処理管理部の動作の別例を例示するフローチャートである。
【図９Ａ】図９Ａは、本発明の第２の実施形態におけるバリア同期処理部の動作の一例を例示するフローチャートである。
【図９Ｂ】図９Ｂは、本発明の第２の実施形態におけるバリア同期処理部の動作の別例を例示するフローチャートである。
【図１０】図１０は、本発明の第２の実施形態における通信完了処理部の動作を例示するフローチャートである。
【図１１】図１１は、本発明の第２の実施形態における並列処理装置において、並列処理プログラムを実行した場合のタイムラインチャートの一例を示す説明図である。
【図１２】図１２は、本発明の各実施形態における並列処理装置の構成要素を実現可能なハードウェア装置の構成を例示する図面である。
【発明を実施するための形態】
【００１５】
本発明の実施形態に関する説明に先立って、本発明に関する技術的な検討事項等についてより詳細に説明する。
【００１６】
ＨＰＣ分野のプログラミングにおいては、並列プログラムのプロセス間通信に、例えば、ＭＰＩ（Ｍｅｓｓａｇｅ  Ｐａｓｓｉｎｇ  Ｉｎｔｅｒｆａｃｅ）等のプロセス間通信技術が用いられる。なお、以下の説明においては、具体例として、プロセス間通信がＭＰＩを用いて実行されることを想定するが、本実施形態はこれに限定されるものではない。なお、以下において、ＭＰＩを用いたプロセス間通信を「ＭＰＩ通信」と記載する場合がある。
【００１７】
ＭＰＩの通信処理は、データ転送要求の発行処理、データ転送処理、データ転送の完了処理から構成される。データ転送要求の発行処理は、ＣＰＵコアがＩＯ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）デバイスに通信の開始を要求する処理である。データ転送処理は、ＩＯデバイスがデータを転送する処理である。データ転送の完了処理は、ＣＰＵコアが、ＩＯデバイスのデータ転送の完了を確認又は待ち合せる処理である。ここで、ＣＰＵコアは、例えば、１以上のスレッドに関する処理を実行可能な演算処理ユニットである。例えば、１つのＣＰＵには１以上のＣＰＵコアが含まれてもよい。１つのＣＰＵは、例えば、ＣＰＵコア数又はそれ以上のスレッドを並列に処理可能であってもよい。
【００１８】
ＭＰＩの通信方式は、ブロッキング通信と非ブロッキング通信とに分類することができる。ブロッキング通信の場合、ＣＰＵコアは、例えば、データ転送要求の発行処理を実行した後、続けてデータ転送の完了処理を行い、ＩＯデバイスによるデータ転送処理が完了するのを待ち合せる。その後、ＣＰＵコアは、プロセス間通信以外の演算処理を実行する。
【００１９】
非ブロッキング通信の場合、ＣＰＵコアは、データ転送要求の発行処理を実行した後、データ転送の完了処理を実行せずに計算処理を実行する。その後、ＣＰＵコアは適切なタイミングでデータ転送の完了処理を実行する。非ブロッキング通信の場合、ＣＰＵコアによる計算処理と、ＩＯデバイスによるデータ転送処理とが並列に実行されることから、プログラム全体の実行時間が短縮される。
【００２０】
また、ＭＰＩの通信方式は、通信対象の数の観点から、一対一通信と集団通信とに分類することができる。一対一通信は、二つのプロセス間でデータを送信又は受信するＭＰＩ通信である。集団通信は二つ以上のプロセス集団（複数のプロセスから構成される集合）において、データの収集、配布、交換、リダクション演算などを行うＭＰＩ通信である。集団通信は、例えば、一対一通信を組合せることで実現されてもよい。
【００２１】
ＭＰＩにおいては、例えば、ＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ関数という非ブロッキングの集団通信関数が提供されている。この関数は、あるプロセス集団にリダクション演算を実行させ、その結果を全プロセスに返却する関数である。なお、リダクション演算は、ある特定数の要素からなるデータ集合に対して特定の演算を施すことで、特定数よりも少数の要素からなる演算結果集合を求める演算である。具体的には、リダクション演算は、例えば、複数の入力データから１つの出力データを求める演算である。具体例を用いて説明する。並列プログラムが８個プロセスを用いて実行され、各プロセスが”０”から”７”の値を一つずつ持ち合っている場合を想定する。係る並列プログラムにおいて、ＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ関数を用いて総和を計算するリダクション演算が実行されると、８個のプロセス全てに２３（”０”から”７”の総和の結果）が返却される。ＭＰＩ＿Ｉａｌｌｒｅｕｃｅ関数を実現可能な単純な通信アルゴリズムとしては、各プロセスが他の全プロセスとデータを送受信した後でリダクション演算を行う方法が考えられる。この場合の通信回数は、”Ｏ（Ｎ＾２）（Ｎ：プロセス数）”のオーダになる。即ち、通信回数がプロセス数の２乗に比例して増大することから、プロセスの数が増加すると、プロセス間通信に要する処理負荷が増大する。
【００２２】
一般的に、プロセス間通信を高速化するために、より効率的な通信アルゴリズムが用いられる。そのようなアルゴリズムの一つに、バタフライ方式がある。バタフライ方式は、通信を段階（ラウンド）に分ける。換言すると、バタフライ方式においては、複数の段階（ラウンド）の通信処理が実行される。各ラウンドにおいては、各プロセスは、前のラウンドまでに演算した途中結果を、他の所定のプロセスとの間で送受信する。
【００２３】
図１は、バタフライ方式を採用した場合に、プロセス「０」が保持する値の遷移を示している。プロセス「０」は最初に値”０”を持っている。ラウンド１では、プロセス「０」は、プロセス「４」から値”４”を受信する。プロセス「０」は受信した値を、自身が保持する値”０”と演算（この場合は加算）し、値”４”を得る。ラウンド２では、プロセス「０」は、プロセス「２」から値”８”を受信し、自身が保持する値”４”と演算して値”１２”を得る。ここで、プロセス「２」から受信する値”８”は、プロセス２がラウンド１までに演算した途中結果である。最後に、プロセス「０」は、ラウンド３で、プロセス「１」から値”１１”を受信し、自身が保持する値”１２”と演算することで、値”２３”を得る。値”１１”は、プロセス「１」がラウンド２までに演算した途中結果である。最終的に得られた値”２３”がＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ関数の結果である。
【００２４】
バタフライ方式の場合、各プロセスが演算の途中結果を送受信することにより、通信回数がＯ（Ｎ×ｌｏｇ（Ｎ））（Ｎ：プロセス数）のオーダにまで削減される。しかしながら、バラフライ方式は、演算の途中結果を送受信することから、前のラウンドが完了していないと、その次のラウンドを開始することができない。即ち、バタフライ方式のような通信アルゴリズムは、演算処理の途中結果を送受信することで通信回数を削減するが、これにより、通信に順序関係が発生する。このため、各プロセスは、係る順序関係に従って通信処理を順番に繰り返す必要がある。以下、順序関係に従った通信処理の実行を、「通信処理の進行」（又は「プロセス間通信処理の進行」）と記載する場合がある。通信処理の進行は、例えば、通信スレッド方式と計算スレッド方式とのいずれかを用いて行われる。
【００２５】
以下、通信スレッド方式を採用した場合の通信処理の進行について概要を説明する。通信スレッド方式を採用した場合、各プロセスは、計算スレッドとは独立した通信スレッドを用いて通信処理の進行を実行する。計算スレッドは、並列プログラムに記述されたＭＰＩライブラリ関数の一つであるＭＰＩ通信開始関数を実行し、通信スレッドに通信処理を依頼する。そして、計算スレッドは、通信処理以外の計算処理を開始する。係る計算スレッドにおける計算処理と並行して、通信スレッド及びＩＯデバイスは、データ転送要求の発行処理、データ転送処理、データ転送の完了処理、次のデータ転送要求の発行処理等、通信処理を繰り返し実行する。計算スレッドは、計算処理を実行した後、並列プログラムに記述されたＭＰＩ通信完了関数を実行し、通信スレッドによるデータ転送の完了処理の終了を待ち合せる。
【００２６】
通信スレッド方式は、通信スレッドが計算スレッドとは独立していることから、計算処理と、通信処理の進行とが並行して実行される。一方、通信スレッド方式の場合、通信スレッドの分、計算スレッドが利用可能なＣＰＵコアの演算能力が減少する、という問題がある。また、通信スレッドと計算スレッドとがＣＰＵコアを共用する場合、スレッドを切り替える際に、コンテキストスイッチなどのオーバーヘッドが生じる、という問題がある。例えば、スレッド切り替えを高速化することにより、通信スレッド本方式に関する上記問題を緩和することが考えられるが、コンテキストスイッチ自体はなくならないことから、その効果は限定的である。
【００２７】
ＨＰＣでは、計算処理に対してＣＰＵコアの処理能力を可能な限り多く割り当てることが望ましく、計算スレッド方式が多く用いられる。以下、計算スレッド方式の概要について説明する。計算スレッド方式は、ＣＰＵコアで実行される計算スレッド自身が通信処理を進行する方式である。計算スレッドは、並列プログラムに記述されたＭＰＩ通信開始関数を実行する。そして、計算スレッドは、データ転送要求の発行処理を実行し、計算処理を開始する。要求を受け取ったＩＯデバイスは、計算スレッドの計算処理と並行して、データ転送処理を実行する。計算スレッドは、例えば、計算処理の途中で、並列プログラムに記述されたＭＰＩ関数（ＭＰＩにおいて定義されたＡＰＩ）を実行し、その過程において、先に要求したデータ転送の完了処理と、次のデータ転送要求の発行処理とを実行する。計算スレッドは、計算処理の後、並列プログラムに記述されたＭＰＩ通信完了関数を実行し、データ転送の完了処理が終了するのを待ち合せる。
【００２８】
計算スレッド方式は、通信スレッドを利用しないことから、通信スレッド方式を採用した場合に発生する問題を解消可能である。即ち、計算スレッド方式を採用した場合、計算スレッドが利用可能なＣＰＵコアの演算能力が、通信スレッドの分、減少するという問題は発生しない。また、計算スレッドと、通信スレッドとの切り替えが不要であることから、スレッドの切り替えに伴うコンテキストスイッチが発生しない。
【００２９】
しかしながら、計算スレッド方式では、計算処理の途中にＭＰＩ関数の実行が記述されていない場合、ＭＰＩ関数が実行されない。即ち、開発者等が並列プログラムを作成する際に、計算処理の途中にＭＰＩ関数を記述していない場合、計算処理の途中ではＭＰＩ関数が実行されない。この場合、計算処理の途中では、データ転送の完了処理と後続のデータ転送要求の発行処理とが実行されない。これにより、データ転送の完了処理と後続のデータ転送要求の発行処理とが、例えば、ＭＰＩ通信完了関数が実行されるまで遅延してしまい、これに続く後続のデータ転送処理と計算処理とが並列に実行されない可能性がある。
【００３０】
上記のような現象を図２、図３に示す具体例を参照して説明する。図２は、並列プログラムのプログラムコードの一例である。”ｐａｒａ１（）”、”ｐａｒａ２（）”における計算処理は計算ノードにおける１以上のＣＰＵコアを用いて、マルチスレッドで実行される。即ち、係る並列プログラムは、マルチスレッドプログラムであることを想定する。”ｐａｒａ１（）”完了時、”ｐａｒａ２（）”完了時に、スレッド間でバリア同期が実行される。
【００３１】
”ｐａｒａ１（）”、”ｐａｒａ２（）”における計算処理が実行される前でＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ関数によりプロセス間通信を開始し、計算処理が実行された後でＭＰＩ＿Ｗａｉｔ関数によりプロセス通信の完了を待ち合せる。係るプロセス間通信は、異なる計算ノードで実行されるプロセスの間で実行される。即ち、係る並列プログラムは、複数の計算ノードにおいて並列にプロセスが実行される、マルチプロセスプログラムであることを想定する。
【００３２】
ここで、”ｐａｒａ１（）”、”ｐａｒａ２（）”の実装コードの途中には、ＭＰＩ関数の呼び出しが実装されていないことを想定する。即ち、”ｐａｒａ１（）”、”ｐａｒａ２（）”の途中には、ＭＰＩ関数の呼び出しが記述されていないことから、ＭＰＩ関数が実行されない。
【００３３】
図３は、図２のプログラムコードを、４個のＣＰＵコア（図３における”Ｃｏｒｅ  ０”乃至”Ｃｏｒｅ  ３”）を用いて実行した場合のタイムラインチャートである。”ｐａｒａ１（）”、”ｐａｒａ２（）”は、ＣＰＵコア４個を使用して、４スレッドで実行される。仮に、ＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ関数が３ラウンドで構成されていることを想定する。この場合、ＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ関数が実行されると、ラウンド１のデータ転送要求の発行処理が実行される。その後、”ｐａｒａ１（）”、”ｐａｒａ２（）”の計算処理が開始される。ラウンド１のデータ転送処理は、”ｐａｒａ１（）”、”ｐａｒａ２（）”の計算処理と並列に実行される。一方、”ｐａｒａ１（）”、”ｐａｒａ２（）”の計算処理の途中でＭＰＩ関数が実行されないことから、ＭＰＩ＿Ｗａｉｔ関数が実行されるまで、ラウンド１のデータ転送の完了処理が実行されない。これにより、ラウンド２のデータ転送要求の発行処理が実行されない。その結果、ラウンド２、ラウンド３のデータ転送処理が、”ｐａｒａ１（）”、”ｐａｒａ２（）”の計算処理の後まで遅延してしまい、計算処理と並列に実行されない。
【００３４】
これに対して、本発明に係る以下の各実施形態における並列処理装置は、上記のような問題を解決可能な技術を提供する。以下の各実施形態における並列処理装置は、一例として、並列プログラムにおいてスレッドの同期処理が実行される際に、プロセス間通信を進行させることが可能である。スレッドの同期待ち時間にＣＰＵコアの演算資源を利用することで、通信処理と計算処理とを並列に実行し、プログラム全体の実行時間を短縮することが可能である。
【００３５】
＜第１の実施形態＞
以下、本発明の基本的な実施形態である第１の実施形態について図面を参照して説明する。
【００３６】
図４Ａに例示するように、本実施形態における並列処理装置１００は、プロセス間通信部１０１と、マルチスレッド制御部１０２と、を含む。並列処理装置１００を構成するこれらの構成要素の間は、適切な通信方法を用いて通信可能に接続されている。
【００３７】
本実施形態における並列処理装置１００は、並列プログラムを実行可能な情報処理装置（計算ノード）であってもよい。並列処理装置１００は、例えば、複数のスレッドを並列処理可能な演算処理装置（例えば、マルチコアＣＰＵ等）と、メモリと、を少なくとも備える。並列処理装置１００は、複数の演算処理ユニットを備えてもよい。係る演算処理装置は、例えば、演算処理を実行可能な演算処理ユニット（例えば、ＣＰＵコア）を複数備えてもよい。係る演算処理ユニットは、例えば、１以上のスレッドを並列に実行可能であってもよい。なお、メモリには、並列プログラム及び当該並列プログラムの実行に必要なデータが保持されてもよい。
【００３８】
並列プログラムは、１以上のスレッドにより並列に実行可能な処理を含むプロセスを１以上含んでもよい。具体的には、並列プログラムが実行された際、１以上のプロセスが生成される。プロセスが複数生成された場合、各プロセスは、例えば、演算処理装置のうちのいずれかに割り当てられてもよい。なお、並列プログラムの実行過程において生成されたプロセスは、一つの並列処理装置１００に含まれる複数の演算処理装置に割り当てられてもよく、複数の並列処理装置１００に割り当てられてもよい。それぞれのプロセスは、割り当てられた演算処理装置を用いて、並列プログラムに実装された処理を実行してもよい。
【００３９】
並列プログラムは、その実行過程において（具体的には、各プロセスの実行過程において）、１以上のスレッドを生成してもよい。複数のスレッドが生成された場合、それらは、演算処理装置において並列に実行可能である。
【００４０】
プロセス間通信部１０１は、並列プログラムにおける複数のプロセスの間で実行される、データの転送処理を少なくとも含むプロセス間通信を制御する。具体的には、プロセス間通信部１０１は、例えば、ある演算処理装置（第１の演算処理装置と記載する）において実行されるプロセスと、他の演算処理装置（第２の演算処理装置と記載する）において実行されるプロセスとの間のデータの送受信等に関するプロセス間通信の進行を制御可能である。この場合、第１の演算処理装置と、第２の演算処理装置とは、同じ計算ノードに存在してもよく、異なる計算ノードに存在してもよい。
【００４１】
プロセス間通信部１０１は、例えば、複数のプロセスの間における、データ転送要求の発行処理（データ転送の開始処理）、データ転送処理、データ転送の完了処理等を処理してもよい。プロセス間通信部１０１は、例えば、ある順序関係に従って、上記したようなプロセス間通信におけるデータ転送処理を進行させてもよい。
【００４２】
上記説明したプロセス間通信部１０１は、ＭＰＩを用いてプロセス間通信処理を実行してもよい。また、係るプロセス間通信部１０１は、例えば、ＭＰＩを拡張することにより実現されてもよい。係るプロセス間通信部１０１は、ＭＰＩに限定されず、他の適切なプロセス間通信技術を使用あるいは拡張することで実現されてもよい。
【００４３】
マルチスレッド制御部１０２は、並列処理装置１００において並列プログラムが実行された際、当該並列プログラムにより生成されるスレッドによるプロセス間通信に関する処理を制御する。例えば、マルチスレッド制御部１０２は、あるスレッド（第１のスレッドと記載する）において同期処理が実行されてから、当該第１のスレッドと、他のスレッド（第２のスレッドと記載する）とが同期されるまでに、当該第１のスレッドにより、プロセス間通信を進行する。マルチスレッド制御部１０２は、例えば、上記第１のスレッドにより、プロセス間通信部１０１を用いて（プロセス間通信部１０１が提供する機能を使用して）、プロセス間通信に関する処理を実行してもよい。
【００４４】
マルチスレッド制御部１０２は、例えば、第１のスレッドにおいて同期処理（例えば、バリア同期処理）が実行された際、他に実行されている全ての第２のスレッドが同期処理を実行済みか否か（同期待ち状態か否か）を確認してもよい。そして、他に同期処理を実行していない第２のスレッドが存在する場合、当該第２のスレッドが同期処理を実行するまで、第１のスレッドが、プロセス間通信部１０１の機能を用いてプロセス間通信処理を実行するよう、第１のスレッドを制御してもよい。
【００４５】
上記説明したマルチスレッド制御部１０２は、例えば、ＯｐｅｎＭＰを用いてスレッド間の並列処理を実行してもよい。また、係るマルチスレッド制御部１０２は、例えば、ＯｐｅｎＭＰを拡張することにより実現されてもよい。係るマルチスレッド制御部１０２は、ＯｐｅｎＭＰに限定されず、他の適切な並列処理技術を使用あるいは拡張することで実現されてもよい。
【００４６】
上記のように構成された並列処理装置１００は、第１のスレッドが、並列に実行される第２のスレッドの同期を待つ間に、演算処理装置の演算資源を用いてプロセス間通信を進行することが可能である。これにより、並列プログラムの実行時間が短縮される。
【００４７】
また、並列処理装置１００は、第１のスレッドが実行する計算処理の途中に、プロセス願通信処理が明示的には実装されていない場合であっても計算処理の途中でプロセス間通信処理を進行することができる。なぜならば、第１のスレッドが同期処理を実行した際に、当該第１のスレッドがプロセス間通信処理を実行するよう制御するからである。これにより、並列処理装置１００は、並列処理プログラムの計算処理の途中に明示的にプロセス間通信処理を記載することなく、プロセス間通信処理と、計算処理とを並列に実行可能である。並列処理装置１００は、プロセス間通信用の、独立した通信スレッドを生成することなく、プロセス間通信処理と、計算処理とを並列に実行可能である。以上より、本実施形態における並列処理装置１００によれば、並列プログラムにおける計算処理の過程で消費される演算資源を用いて、プロセス間通信処理と、計算処理とを並列に実行可能である。
【００４８】
＜第２の実施形態＞
上記第１の実施形態を基礎とする、本発明の第２の実施形態について図面を参照して詳細に説明する。
【００４９】
［構成］
図４Ｂは本実施形態における並列処理装置４００の機能的な構成を例示するブロック図である。
【００５０】
本発明は、大別して、プロセス間通信部２００と、マルチスレッド制御部３００とから構成される。
【００５１】
プロセス間通信部２００は、通信開始処理部２０１と、通信完了処理部２０２と通信処理管理部２０３と、通信処理記録部２０４とを含む。
【００５２】
プロセス間通信部２００は、複数のプロセスの間のプロセス間通信に関する処理を実行する。通信開始処理部２０１は、プロセス間通信処理を開始する機能を提供する。通信完了処理部２０２は、プロセス間通信を終了する機能を提供する。通信処理管理部２０３は、プロセス間通信におけるデータ転送処理を制御する機能を提供する。通信処理記録部２０４は、プロセス間通信に関する情報を保持する。
【００５３】
マルチスレッド制御部３００はバリア同期処理部３０１と、同期待ちスレッド記録部３０２とを含む。バリア同期処理部３０１は、複数のスレッドの間の同期（バリア同期）処理を実行する機能を提供する。同期待ちスレッド記録部３０２は、同期待ち状態にあるスレッドに関する情報を保持する。同期待ちスレッド記録部３０２は、同期待ち状態にあるスレッドの数（あるいは、同期待ち状態にないスレッドの数）を表す情報を保持してもよい。
【００５４】
図５Ａは、通信処理管理部２０３が実行する通信処理を実現可能な通信アルゴリズムを表すプログラム（疑似コード）の一例である。以下、図５Ａに例示するプログラムにより表される通信アルゴリズムを、単に「通信アルゴリズム」と記載する。図５Ｂは、通信処理管理部２０３が実行する通信処理を表すフローチャートであり、通信アルゴリズムの処理を表す。
【００５５】
通信アルゴリズムにおいては、データ転送要求の発行処理とデータ転送の完了処理とが必要なラウンド数分繰り返される。図５Ａに示す具体例の場合、ラウンド数は”Ｎ”（Ｎは１以上の自然数）である。図５Ａに示す通信アルゴリズムにおいては、「ｓｔｅｐ １」乃至「ｓｔｅｐ Ｎ」のラウンドにおいて、データ転送要求の発行処理及びデータ転送の完了処理の少なくとも一方の処理が実行される。
【００５６】
データ転送の完了処理は、データ転送処理が完了したか否かの完了確認を実行し、データ転送が未完了の場合、完了を待ち合せずに完了処理を中断してよい。この場合、図５Ａにおけるｓｔｅｐ（「ｓｔｅｐ１」乃至「ｓｔｅｐＮ」）は、例えば、処理を再開する位置（ラウンド）を示す。通信アルゴリズムは、処理を中断した場合、処理を再開する際のｓｔｅｐ（ラウンド）を通信アルゴリズムの実行元（通信アルゴリズムの呼び出し元）に返却（提供）してもよい。通信アルゴリズムは、処理を完了した場合、データ転送処理が完了したことを表す情報を、通信アルゴリズムの実行元に返却（提供）してもよい。図５Ａに示す具体例ではデータ転送処理が完了したことを表す情報として「アルゴリズム完了」を表す情報が用いられる。通信アルゴリズムは、データ転送処理の完了を待ち合せないので、短い時間で実行可能である。
【００５７】
図５Ｂに例示するフローチャートを参照して、通信アルゴリズムの同債について概要を説明する。以下の説明においては、一例として、通信処理管理部２０３が、通信アルゴリズムを実行することを想定する。
【００５８】
通信処理管理部２０３が通信アルゴリズムを実行する際、データ転送処理のラウンド数を指定する。データ転送処理が開始される場合、例えば、ラウンド数として「１」が設定されてもよい。
【００５９】
データ転送処理のラウンド数を確認した結果（ステップＳ５０１）、ラウンド数が「１」の場合、通信アルゴリズムは、１番目のラウンド（最初のラウンド）におけるデータ転送要求の発行処理を実行する（ステップＳ５０２）。ラウンド数に「２」が設定される（ステップＳ５０３）。通信アルゴリズムは、通信アルゴリズムの実行元に処理を再開する際のｓｔｅｐ（ラウンド数）を返却（提供）する（ステップＳ５１３）。
【００６０】
データ転送処理のラウンド数を確認した結果（ステップＳ５０１）、ラウンド数が「ｉ」（ｉは２以上Ｎ未満の整数）の場合、通信アルゴリズムは、「ｉ−１」番目のラウンドにおけるデータ転送の完了処理を実行する（ステップＳ５０４）。
【００６１】
「ｉ−１」番目のラウンドのデータ転送が完了していない場合（ステップＳ５０５においてＮＯ）、通信アルゴリズムは、処理を再開する際のｓｔｅｐ（ラウンド）を「ｉ」に設定する（ステップＳ５０６）。即ち、再度「ｉ」番目のラウンドから処理が再開されるよう、処理を再開する際のｓｔｅｐが設定される。この場合、通信アルゴリズムは、「ｉ−１」番目のラウンドのデータ転送の完了を待ち合せず、ステップＳ５１３に処理を進める。
【００６２】
「ｉ−１」番目のラウンドのデータ転送が完了した場合（ステップＳ５０５においてＹＥＳ）、通信アルゴリズムは、「ｉ」番目のラウンドのデータ転送要求を発行する（ステップＳ５０７）。通信アルゴリズムは、処理を再開する際のｓｔｅｐ（ラウンド）を「ｉ＋１」に設定する（ステップＳ５０８）。即ち、「ｉ＋１」番目のラウンド（次のラウンド）から処理が再開されるよう、処理を再開する際のｓｔｅｐが設定される。
【００６３】
ステップＳ５０６又はステップＳ５０８の処理を実行した後、通信アルゴリズムは、通信アルゴリズムの実行元に処理を再開する際のｓｔｅｐ（ラウンド数）を返却（提供）する（ステップＳ５１３）。
【００６４】
データ転送処理のラウンド数を確認した結果（ステップＳ５０１）、ラウンド数が「Ｎ」（最後のラウンド）の場合、通信アルゴリズムは、「Ｍ」番目のラウンドにおけるデータの転送の完了処理を実行する（ステップＳ５０９）。「Ｍ」番目のラウンドは、例えば、「Ｎ」番目のラウンドの、一つ前のラウンドを表す。
【００６５】
「Ｍ」番目のラウンドのデータ転送が完了していない場合（ステップＳ５１０においてＮＯ）、通信アルゴリズムは、処理を再開する際のｓｔｅｐ（ラウンド）を「Ｎ」に設定する（ステップＳ５１１）。この場合、通信アルゴリズムは、「Ｍ」番目のラウンドのデータ転送の完了を待ち合せず、ステップＳ５１３に処理を進める。
【００６６】
「Ｍ」番目のラウンドのデータ転送が完了した場合（ステップＳ５１０においてＹＥＳ）、通信アルゴリズムは、通信アルゴリズムの実行元に、データン転送処理の完了を表す情報（例えば、図５Ａにおける「アルゴリズム完了」）を提供する（ステップＳ５１２）。
【００６７】
図６Ａは、通信処理記録部２０４に記録されるデータの一例を示す説明図である。
【００６８】
通信ＩＤ６０１は、プロセス間通信を識別可能な識別子（ＩＤ：Ｉｄｅｎｔｉｆｉｅｒ）を示す。通信ＩＤ６０１には、例えば、プロセス間通信を特定可能な識別子を表すデータが設定されてもよい。
【００６９】
通信アルゴリズム６０２は、プロセス間通信に適用される通信アルゴリズムを示す。プロセス間通信に適用される通信アルゴリズムとしては、１以上のラウンド（段階）で通信処理が実行される通信アルゴリズムが適宜選択されてよい。例えば、係る通信アルゴリズムは、バタフライ方式であってもよい。また、係る通信アルゴリズムは、各プロセスが他の全プロセスとデータを送受信する方式であってもよい。係る通信アルゴリズムは、例えば、ＭＰＩにおける集団通信関数ごとに、適切に選択されてもよい。通信アルゴリズム６０２には、例えば、通信アルゴリズムを特定可能なデータが設定されてもよい。通信アルゴリズム６０２には、プロセス間通信に適用される種々のアルゴリズムが設定され得る。
【００７０】
再開位置６０３は、通信アルゴリズムを再開する際のｓｔｅｐ（ラウンド数）、又は、通信アルゴリズムの完了を示す。再開位置６０３には、例えば、ｓｔｅｐ（ラウンド数）を表すデータ、又は、通信アルゴリズムの完了を表すデータが設定されてもよい。再開位置６０３の初期値は、例えば、「ｓｔｅｐ１」に設定されてもよい。係る初期値の設定は、例えば、図５Ａに示す通信アルゴリズムにおいて、最初のデータ転送要求の発行処理を実行することを表す。再開位置６０３に、「アルゴリズム完了」が設定されている場合、例えば、通信アルゴリズムが完了（データ転送処理が完了）していることを表す。以下、通信処理記録部２０４に記録される通信ＩＤ６０１と、通信アルゴリズム６０２と、再開位置６０３との組合せを、単に「エントリ」と記載する場合がある。
【００７１】
図６Ｂは、同期待ちスレッド記録部３０２に記録されるデータの一例を示す説明図である。同期待ちスレッド記録部３０２には、ある並列処理を実行する１以上のスレッドの内、同期待ち状態にないスレッドの数を表すカウンタ６０４を保持する。例えば、１以上のスレッドにより並列処理が実行される際、当該並列処理を実行するスレッドの総数がカウンタ６０４に設定される。一つの具体例として、ＯＭＰを用いてスレッドの並列処理が実装される場合、”＃ｐｒａｇｍａ  ｏｍｐ  ｐａｒａｌｌｅｌ”等、並列処理が開始されるタイミングで、カウンタ６０４に、当該並列処理を実行するスレッドの総数が設定されてもよい。
【００７２】
各スレッドは、同期処理を実行した際（即ち、当該スレッドが同期待ち状態になった際）、カウンタ６０４の値を漸減（デクリメント）させる。一つの具体例として、ＯＭＰを用いて並列処理が実装される場合、”＃ｐｒａｇｍａ  ｏｍｐ  ｂａｒｉｉｅｒ”等のバリア同期処理の実行開始時に、各スレッドはカウンタ６０４をデクリメントする。
【００７３】
各スレッドは、カウンタ６０４が”０”になるまで、同期待ち状態となる。各スレッドは、例えば、カウンタ６０４が”０”になるまでループ処理で待ち続けてもよい。この場合、各スレッドはか、カウンタ６０４が”０”になった際にループを抜け、カウンタ６０４の値を、再度並列処理を実行する総スレッド数で初期化してもよい。
【００７４】
上記のように構成された並列処理装置４００は、上記第１の実施形態における並列処理装置１００と同様の処理を実現可能であってもよい。本実施形態におけるプロセス間通信部２００は、第１の実施形態におけるプロセス間通信部１０１と同様の処理を実現可能であってもよい。本実施形態におけるマルチスレッド制御部３００は、第１の実施形態におけるマルチスレッド制御部１０２と同様の処理を実現可能であってもよい。
【００７５】
［動作］
以下、本実施形態における並列処理装置４００の動作について説明する。図７は、通信開始処理部２０１の動作の一例を表したフローチャートである。図８Ａは、通信処理管理部２０３の動作の一例を表したフローチャートである。図９Ａは、バリア同期処理部３０１の動作の一例を表したフローチャートである。図１０は、通信完了処理部２０２の動作の一例を表したフローチャートである。
【００７６】
本実施形態における並列処理装置４００は、上記第１の実施形態と同様、並列プログラムを実行する。係る並列プログラムは、１以上のスレッドにより並列に実行可能な処理を含むプロセスを１以上含んでもよい。即ち、並列処理装置４００において実行される並列処理プログラムは、マルチプロセス・マルチスレッド処理が実装されたプログラムであってもよい。
【００７７】
係る並列プログラムが実行された場合、例えば、複数のプロセスが生成され、それらが並行して実行されてもよい。この場合各プロセスは、同一の並列処理装置４００において実行されてもよく、複数の並列処理装置４００において並行して実行されてもよい。複数のプロセスは、必要に応じてプロセス間通信を実行することにより、並列プログラムとして実装された処理を実行する。この際、あるプロセスを実行する過程において、複数のスレッドが生成され、当該複数のスレッドが並列に実行されてもよい。複数のスレッドによる並列処理が開始する際、当該並列処理を実行するスレッドの総数が、同期待ちスレッド記録部３０２のカウンタ６０４に設定されてもよい。
【００７８】
以下、並列プログラムがプロセス間通信を開始した場合の動作について説明する。以下の説明においては、並列処理プログラムが、通信開始処理部２０１、通信完了処理部２０２及び通信処理管理部２０３等が提供する機能を用いて、各種処理を実行することを想定する。例えば、通信開始処理部２０１、通信完了処理部２０２及び通信処理管理部２０３がコンピュータ・プログラムとして実現される場合、並列処理プログラムは、係るコンピュータ・プログラム（例えば、ライブラリや実行ファイル等）を呼び出す（実行する）ことが可能である。
【００７９】
通信開始処理部２０１は、例えば、プロセス間通信に関する情報を、通信処理記録部２０４に記録する機能を提供してもよい。具体的には、通信開始処理部２０１は、例えば、あるプロセス間通信について、通信処理記録部２０４における通信ＩＤ６０１、通信アルゴリズム６０２及び再開位置６０３にそれぞれ適切な情報を設定してもよい。通信開始処理部２０１は、例えば、通信処理管理部２０３に、通信処理を実行するよう通知することで、プロセス間通信を開始する機能を提供してもよい。
【００８０】
並列プログラムがプロセス間通信を開始した際、通信開始処理部２０１は、当該プロセス間通信に関する情報を、通信処理記録部２０４に記録する（ステップＳ７０１）。この場合、例えば、並列プログラムにおいて生成されたスレッドが、通信開始処理部２０１を用いて、プロセス間通信に関する情報を通信処理記録部２０４に記録してもよい。係る処理は、スレッド間で排他的に実行され得る。この場合、通信開始処理部２０１は、上記再開位置を表す情報として、初期値「ｓｔｅｐ１」を再開位置６０３に設定してもよい。
【００８１】
通信開始処理部２０１は、通信処理を開始する（ステップＳ７０２）。例えば、通信開始処理部２０１は、通信処理管理部２０３がプロセス間通信に関する処理（プロセス間通信処理）を開始するよう制御してもよい。
【００８２】
一つの具体例として、図２に示すような疑似コードの場合、並列プログラムは、例えば、ＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ関数を実行した際に、上記したプロセス間通信を開始する処理を実行してもよい。また、”＃ｐｒａｇｍａ  ｏｍｐ  ｐａｒａｌｌｅｌ”（複数スレッドによる並列処理の開始処理）が実行された際、並列処理を実行するスレッドの総数が、同期待ちスレッド記録部３０２のカウンタ６０４に設定される。
【００８３】
以下、プロセス間通信処理について具体的に説明する。並列処理プログラム（特には、並列プログラムで生成されたスレッド）は、以下に説明する通信処理管理部２０３が提供する機能を用いて、プロセス間通信処理を実行してもよい。以下説明するステップＳ８０１乃至ステップＳ８０５の処理は、スレッド間で排他的に実行され得る。
【００８４】
通信処理管理部２０３は、未処理の通信処理の有無を判定する（ステップＳ８０１）。具体的には、通信処理管理部２０３は、通信処理記録部２０４を参照し、通信処理記録部２０４にプロセス間通信に関する情報（エントリ）が登録されている場合、未処理のプロセス間通信があると判定してもよい。
【００８５】
ステップＳ８０１における判定の結果、未処理のプロセス間通信が存在しない場合（ステップＳ８０１においてＮＯ）、通信処理管理部２０３は、処理を終了してもよい。
【００８６】
ステップＳ８０１における判定の結果、未処理のプロセス間通信が存在する場合（ステップＳ８０１においてＹＥＳ）、通信処理管理部２０３は、通信処理記録部２０４に設定されたエントリ（通信ＩＤ６０１、通信アルゴリズム６０２及び再開位置６０３）を取得する（ステップＳ８０２）。
【００８７】
通信処理管理部２０３は、ステップＳ８０２において取得した通信ＩＤ６０１に関する再開位置６０３を確認する。再開位置６０３に「アルゴリズム完了」を表すデータが設定されている場合（ステップＳ８０３においてＮＯ）、通信処理管理部２０３は、ステップＳ８０１から処理を続行する。
【００８８】
再開位置６０３に「アルゴリズム完了」以外のデータが設定されている場合（ステップＳ８０３においてＹＥＳ）、通信処理管理部２０３は、当該通信ＩＤ６０１により識別されるプロセス間通信に関する通信アルゴリズムを実行する（ステップＳ８０４）。具体的には、通信処理管理部２０３は、通信処理記録部２０４に設定された各通信ＩＤ６０１について、再開位置６０３に設定されたデータ確認する。そして、再開位置６０３に設定されたデータが「アルゴリズム完了」ではない場合、通信処理管理部２０３は、通信ＩＤ６０１に設定されたデータにより識別されるプロセス間通信に関して、通信アルゴリズムを実行する。通信処理管理部２０３は、この際、通信アルゴリズムに対して、再開位置６０３に設定されたデータ（ｓｔｅｐを表す）を提供する。
【００８９】
通信処理管理部２０３は、通信アルゴリズムから返却（提供）されたデータを用いて、再開位置６０３を更新する（ステップＳ８０５）。上記したように、通信アルゴリズムからは、プロセス間通信のｓｔｅｐ（ラウンド数）を表すデータが提供されてもよい。通信アルゴリズムからは、プロセス間通信が完了したことを表すデータ（例えば、「アルゴリズム完了」を表すデータ）が提供されてもよい。
【００９０】
以下、並列プログラムが、スレッドのバリア同期処理を実行した場合の処理について説明する。並列処理プログラム（具体的には、並列プログラムにおいて生成されたスレッド）は、以下において説明するバリア同期処理部３０１の機能を用いて、スレッドのバリア同期処理を実行してもよい。例えば、バリア同期処理部３０１がコンピュータ・プログラムとして実現される場合、並列処理プログラムにおいて生成されてスレッドは、係るコンピュータ・プログラムを呼び出す（実行する）ことが可能である。
【００９１】
バリア同期処理部３０１は、例えば、スレッドの状態を取得する機能、スレッドの状態を設定する機能、及び、スレッド状態を消去する機能を提供してもよい。バリア同期処理部３０１は、例えば、スレッドを同期する機能（スレッドの同期を待ち合わせる機能）を提供してもよい。バリア同期処理部３０１は、例えば、通信処理管理部２０３に、通信処理を実行させる機能を提供してもよい。
【００９２】
並列プログラムが、スレッドのバリア同期処理を実行した場合、バリア同期処理部３０１は、当該スレッドが同期待ち状態になったことを、同期待ちスレッド記録部３０２に記録する（ステップＳ９０１）。例えば、あるスレッドはバリア同期処理部３０１を用いて、同期待ちスレッド記録部３０２に記録されたカウンタ６０４の値をデクリメント（”１”漸減）してもよい。一つの具体例として、ＯＭＰを用いて、スレッドの並列処理が実装される場合、スレッドのバリア同期処理は、例えば、”＃ｐｒａｇｍａ  ｏｍｐ  ｂａｒｒｉｅｒ”等のコードが実行された際に、実行されてもよい。
【００９３】
同期待ち状態になったスレッドは、他のスレッドの状態を取得する（ステップＳ９０２）。係るスレッドは、バリア同期処理部３０１を用いて、他のスレッドの状態を取得してもよい。例えば、係るスレッドは、同期待ちスレッド記録部３０２に記録された６０４の値を参照し、その値に基づいて他のスレッドの状態を判定してもよい。係る参照処理は、例えば、排他的に実行され得る。以下、同期待ち状態になったスレッドを、「同期待ちスレッド」（第１のスレッドに相当）と記載する場合がある。
【００９４】
ステップＳ９０２において取得した他のスレッドの状態から、ある並列処理に関する同期に参加するスレッドのうち、同期待ち状態ではないスレッドが存在すると判定された場合（ステップＳ９０３においてＮＯの場合）について以下に説明する。同期待ちスレッドは、例えば、同期待ちスレッド記録部３０２に記録された６０４の値が”０”ではない場合、ある並列処理に関して、同期待ち状態では無いスレッドが残っていると判定してもよい。
【００９５】
ここで、同期に参加するスレッドは、例えば、ある並列処理において、自スレッドにおける処理が完了した後、他のスレッドによる処理の完了を待ち合わせるスレッドであってよい。例えば、１以上のスレッドが同期に参加する場合、それらのスレッドは、ある同期点（タイミング）において、他のスレッドによる処理の実行を待ち合せてよい。
【００９６】
ステップＳ９０３においてＮＯの場合、同期待ちスレッドは、自スレッドが最初に同期待ち状態になったスレッドであるか否かを確認する（ステップＳ９０４）。係るスレッドは、例えば、スレッド記録部３０２に記録された６０４の値に基づいて、自スレッドが最初に同期待ちになったスレッドか否かを判定してもよい。一例として、同期待ちスレッドは、スレッド記録部３０２に記録された６０４の値が他のスレッドによりデクリメントされていなければ、自スレッドが最初に同期待ちになったスレッドであると判定してもよい。
【００９７】
同期待ちスレッドが、最初に同期待ち状態になったスレッドである場合（ステップＳ９０４においてＹＥＳ）について以下に説明する。係る同期待ちスレッドは、他のスレッドが同期待ち状態になるまで、通信処理管理部２０３による通信処理（例えば、上記ステップＳ８０１乃至ステップＳ８０５）を繰り返し実行する（ステップＳ９０５）。係る同期待ちスレッドは、バリア同期処理部３０１を用いて、通信処理管理部２０３が上記通信処理を実行するよう制御してもよい。係る同期待ちスレッドは、通信処理管理部２０３による通信処理を、適宜設定可能な時間間隔毎に、繰り返して実行してもよい。
【００９８】
同期待ちスレッドが、最初に同期待ち状態になったスレッドではない場合（ステップＳ９０４においてＮＯ）、同期待ちスレッドは、ステップＳ９０２から処理を続行し、他のスレッドが同期待ち状態になるまで待ち合せる。
【００９９】
同期待ちスレッドが、ある並列処理に関して、同期待ち状態ではない他のスレッドが存在しないことを確認した場合（ステップＳ９０３においてＹＥＳ）について説明する。この場合、係る同期待ちスレッドは、ある並列処理に関する同期待ち処理を終了する。そして係る同期待ちスレッドは、他のスレッドが、ある並列処理に関する同期待ち処理を終了することを待ち合せる（ステップＳ９０６）。
【０１００】
ステップＳ９０６における同期処理は、ある並列処理を実行する各スレッドが、他のスレッドが同期待ち状態になったことを確認するまで待ち合せる処理である。これにより、例えば、あるスレッドが同期待ち状態になる前に他のスレッドが処理を続行してしまい、同期待ちスレッド記録部３０２に記録されたカウンタ６０４を変更してしまうことを防止可能である。
【０１０１】
あるスレッドが最初に同期待ち状態になったスレッドである場合（ステップＳ９０７においてＹＥＳ）、係るスレッドは、同期待ちスレッド記録部３０２に記録された、同期に参加した全てのスレッドに関する状態を初期化する（ステップＳ９０８）。係るスレッドは、例えば、バリア同期処理部３０１を用いて、同期待ちスレッド記録部３０２に記録されたカウンタを、並列処理を実行する総スレッド数により再度初期化する処理を実行してもよい。
【０１０２】
なお、図９Ａは、説明の便宜上、最初に同期待ち状態になったスレッドがステップＳ９０８を実行する態様を示しているが、本実施形態はこれには限定されない。ステップＳ９０８は、最初に同期待ち状態になったスレッド以外のいずれかのスレッドにより実行されてもよい。
【０１０３】
ステップＳ９０７においてにおいてＮＯの場合、又は、ステップＳ９０８における処理が実行された場合、同期待ちスレッドは、再度他のスレッドを待ち合せてもよい（ステップＳ９０９）。これにより、例えば、同期待ちスレッド記録部３０２に記録されたカウンタ６０４が初期化される前に、あるスレッドが処理を続行してしまうことを防止可能である。
【０１０４】
以下、並列プログラムがプロセス間通信を完了する場合の動作について説明する。以下の説明においては、並列処理プログラムが、通信完了処理部２０２等が提供する機能を用いて、各種処理を実行することを想定する。例えば、通信完了処理部２０２がコンピュータ・プログラム（例えば、ライブラリや実行ファイル等）として実現される場合、並列処理プログラムは、係るコンピュータ・プログラムを呼び出す（実行する）ことが可能である。
【０１０５】
並列プログラムがプロセス間通信を完了する際、通信完了処理部２０２は、通信処理記録部２０４を参照し、当該並列プログラムに関するプロセス間通信の再開位置を表すデータ（図６Ａにおける再開位置６０３）を取得する（ステップＳ１００１）。
【０１０６】
通信完了処理部２０２は、プロセス間通信の再開位置を表すデータを用いて、プロセス間通信が完了したか否かを判定する。具体的には、通信完了処理部２０２は、プロセス間通信の再開位置を表すデータに「アルゴリズム完了」が設定されているか否かを判定する。（ステップＳ１００２）。
【０１０７】
上記したように、プロセス間通信（データ転送処理）が完了している場合、プロセス間通信の再開位置（例えば、図６の６０３）に「アルゴリズム完了」が設定される。プロセス間通信（データ転送処理）が完了していない場合、プロセス間通信の再開位置には、例えば、ｓｔｅｐ数（ラウンド数）が設定される。
【０１０８】
プロセス間通信の再開位置が「アルゴリズム完了」ではない場合（ステップＳ１００２においてＮＯ）、並列プログラムに関するプロセス間通信が完了していない。この場合、通信完了処理部２０２は、通信処理管理部２０３によるプロセス間通信処理を実行し（ステップＳ１００３）、ステップＳ１００１から処理を続行する。即ち、通信完了処理部２０２は、プロセス間通信の再開位置に「アルゴリズム完了」が設定されるまで、通信処理管理部２０３によるプロセス間通信処理を繰り返し実行する。通信完了処理部２０２、例えば、通信処理管理部２０３がプロセス間通信処理を実行するよう制御してもよい。
【０１０９】
プロセス間通信の再開位置が「アルゴリズム完了」である場合（ステップＳ１００２においてＹＥＳ）、並列プログラムに関するプロセス間通信が完了している。この場合、通信完了処理部２０２は、通信処理管理部２０３に記録された当該プロセス間通信に関するエントリを削除する（ステップＳ１００４）。ステップＳ１００４における処理は、スレッド間で排他的に実行され得る。
【０１１０】
一つの具体例として、並列プログラムは、ＭＰＩ＿Ｗａｉｔ関数を実行した際に、上記したプロセス間通信を開始する処理を実行してもよい。
【０１１１】
［効果］
例えば、並列プログラムにおいて生成されたスレッドが単純に同期処理のみを実行する場合、当該スレッドは、他のスレッドの同期を待つ同期待ち状態になることがある。この場合、ＣＰＵコアにおいては、当該同期待ち状態になったスレッドに関する演算処理は実行されない。即ち、スレッドが同期待ち状態になることにより、ＣＰＵコアの演算資源が有効に活用されることなく消費される。
【０１１２】
これに対して、上記のように構成された並列処理装置４００おいては、並列プログラムのスレッドは、同期処理を実行してから他のスレッドの同期を待つ間に、プロセス間通信を実行可能である（例えば、上記ステップＳ９０２乃至Ｓ９０５）。
【０１１３】
即ち、並列処理装置４００は、スレッドの同期待ちで消費されていたＣＰＵコアの演算資源を使用して、プロセス間通信処理を進行することが可能である。これにより、計算処理に割り当てられるＣＰＵコアの演算資源を減らすことなく、プロセス間通信処理を進行することが可能である。
【０１１４】
上記のように構成された並列処理装置４００においては、独立した通信スレッドを生成する必要がない。また、並列処理装置４００においては、ユーザが、例えば、並列プログラムにおける計算処理の途中に、プロセス間通信処理に関する処理を明示的に記載せずともよい。なぜならば、スレッドが同期待ち状態になった際に、プロセス間通信部２００及びマルチスレッド制御部３００によって、プロセス間通信を進行する処理が実行されるからである。これにより、プロセス間通信におけるデータ転送処理と、計算処理とを並列に実行することが可能になる。
【０１１５】
上記のような効果について、説明図を参照して説明する。図１１は、例えば、図２に例示したプログラムを、本実施形態の並列処理装置４００において実行した場合の効果を説明する説明図である。
【０１１６】
図３に例示するチャートと比較すると、図１１のチャートにおいては、”ｐａｒａ１（）”と、”ｐａｒａ２（）”との計算処理の後で実行されるスレッドのバリア同期処理の際、プロセス間通信処理が実行される。これにより、並列処理装置４００は、スレッドが同期待ち状態にある（スレッドの同期を待ち合せている）ＣＰＵコアの演算資源を利用して、以下のプロセス間通信処理を順次進行することができる。即ち、並列処理装置４００は、具体的には、ラウンド１のテータ転送の完了処理（Ｓ１１０１）、ラウンド２のデータ転送要求の発行処理（Ｓ１１０２）、ラウンド２のデータ転送の完了処理（Ｓ１１０３）、ラウンド３のデータ転送要求の発行処理（Ｓ１１０４）を順に実行可能である。これにより、ラウンド２及びラウンド３のデータ転送処理が、計算処理と並行して実行されることから、並列プログラム全体の実行時間が短縮される。
【０１１７】
以上より、本実施形態によれば、並列プログラムにおける計算処理の過程で消費される演算資源を用いて、プロセス間通信処理と、計算処理とを並列に実行可能である。
【０１１８】
以下、上記各実施形態に関する変形例等について説明する。
【０１１９】
上記説明した実施形態においては、ステップＳ９０４乃至ステップＳ９０５における処理は、最初に同期待ち状態になったスレッドにより実行される。これにより、同期待ち状態のスレッドが発生してからなるべく早いタイミングで、プロセス間通信の処理を進行させることができる。
【０１２０】
本実施形態の一つの変形例として、図９ＡのステップＳ９０５における通信処理（図８ＡのステップＳ８０１乃至Ｓ８０５を含む）は、最初に同期待ち状態になったスレッド以外の適切なスレッドにより実行されてもよい。例えば、並列処理装置４００が、通信処理を実行しているスレッドの有無を表すデータ（フラグ）等を保持してもよい。この場合、例えば、あるスレッドが同期待ち状態になった際、当該スレッドは、上記フラグを確認する。通信処理を実行している他のスレッドが存在しない場合、当該スレッド自身が通信処理を実行してもよい。係る変形例は、具体的には、以下のように実現され得る。以下、図８Ｂ，図９Ｂを参照して説明する。
【０１２１】
本変形例においては、例えば、通信処理記録部２０４に、各通信ＩＤ（図６Ａの６０１）に関連付けて、当該通信ＩＤに関する通信処理が実行中であるか否かを表す情報が設定される。以下、係る情報を「処理中フラグ」と記載する。係る処理中フラグは、例えば、各スレッドがから排他的にアクセスされることを想定する。即ち、ある時点では１つのスレッドのみが、係る処理中フラグを参照、更新、削除することができることを想定する。
【０１２２】
図７のステップＳ７０１において、通信開始処理部２０１は、あるプロセス間通信に関する処理中フラグを初期化する。具体的には、通信開始処理部２０１は、通信処理が実行されていないことを表す情報（例えば、「ＯＦＦ」等）を、処理中フラグに設定してよい。
【０１２３】
あるスレッドが、同期処理を実行した場合、当該スレッドは、例えば、バリア同期処理部３０１をもいて、図９ＢのステップＳ９０１乃至ステップＳ９０５を実行する。この際、当該スレッドは、自スレッドが最初に同期待ち状態になったスレッドであるか否か（図９ＡのステップＳ９０４）を実行せずともよい。
【０１２４】
当該スレッドは、例えば、通信処理管理部２０３を用いて、図８ＢのステップＳ８０１を実行する。
【０１２５】
係るスレッドは、未処理のプロセス間通信処理が存在する場合（ステップＳ８０１においてＹＥＳ）、当該プロセス間通信処理に関する処理中フラグを確認する（図８ＢのステップＳ８０６）。具体的には、係るスレッドは、通信処理記録部２０４において、未処理のプロセス間通信に関する通信ＩＤに関連付けされた、処理中フラグを確認する。
【０１２６】
係る処理中フラグがＯＦＦの場合、当該通信処理を実行している他のスレッドが存在しない。この場合（ステップＳ８０６においてＹＥＳ）、係るスレッドは、係る処理中フラグに、通信処理が実行されていることを表す情報（例えば「ＯＮ」等）を設定する（図８ＢのステップＳ８０７）。ここで、ステップＳ８０６における処理中フラグの確認及び更新は、排他的に（アトミックに）実行され得る。
【０１２７】
ステップＳ８０７の後、係るスレッドは、ステップＳ８０２から処理を続行する。ステップＳ８０２乃至ステップＳ８０５の処理は上記説明した実施形態と同様としてよい。
【０１２８】
ステップＳ８０３においてＮＯ（即ち、通信アルゴリズムが完了している場合）、又は、ステップＳ８０５のおける処理が実行された後、係るスレッドは、処理中フラグに「ＯＦＦ」を設定する（ステップＳ８０８）。
【０１２９】
また、ステップＳ８０６において、処理中フラグがＯＦＦではない場合（ＯＮの場合）、他のスレッドが、当該通信処理を実行している可能性がある。この場合、係るスレッドは、ステップＳ８０１から処理を続行する。
【０１３０】
上記のような処理により、図８Ｂに例示する通信処理は、ある特定のスレッド（例えば、最初に同期待ち状態になったスレッド）に限定されず、複数のスレッドのうちいずれかのスレッドにより実行され得る。
【０１３１】
上記実施形態においては、同期が成立するまで（例えば、同期に参加する全てのスレッドが同期待ち状態になるまで）バリア同期処理部３０１が通信処理管理部２０３を用いてプロセス間通信に関する処理を実行する。これにより、バリア同期処理部３０１がプロセス間通信に関する処理を実行しない場合に比べて、バリア同期に多少多くの時間を要する場合がある。バリア同期の実行時間を優先する場合、同期が成立するまでの基準時間を適切に定め、バリア同期処理部３０１が、係る基準時間を超えない範囲でプロセス間通信処理を進行してもよい。係る基準時間は、例えば、あるスレッドにより初の同期処理が実行されてから経過した時間であってもよい。係る基準時間は、例えば、以前の同期成立までに要した時間と、通信処理の進行に要した時間とを記録することで、同期成立に要した時間を超えないように定められてもよい。あるいは、係る基準時間は、例えば、並列プログラムのテスト等の際に実験的に定められてもよい。係る基準時間を定める方法は、上記に限定されず、他の適切な方法を採用してもよい。
【０１３２】
上記実施形態の説明においては、バリア同期処理部３０１が、スレッドがバリア同期処理を実行した際に、プロセス間通信処理を進行する。上記に限定されず、上記実施形態は、バリア同期以外のスレッドの待ち合わせが発生する機能（例えば、ロック取得機能など）にも適用することができる。
【０１３３】
上記各実施形態においては、本発明を並列処理装置（１００、４００）に適用した例として説明した。上記各実施形態では、例えば、並列処理装置（１００、４００）を動作させることによって、並列処理方法を実施することができる。並列処理方法を実施する方法は上記に限定されず、並列処理装置（１００、４００）と同様の動作あるいは処理を実行可能な、他の装置（例えば、コンピュータ等の情報処理装置）によって実施することも可能である。
【０１３４】
＜ハードウェア及びソフトウェア・プログラム（コンピュータ・プログラム）の構成＞
以下、上記説明した各実施形態を実現可能なハードウェア構成について説明する。
【０１３５】
以下の説明においては、上記各実施形態において説明した並列処理装置（１００、４００）をまとめて、単に「並列処理装置」と記載する。また、これら並列処理装置の各構成要素を、単に「並列処理装置の構成要素」と記載する場合がある。
【０１３６】
上記各実施形態において説明した並列処理装置は、１つ又は複数の専用のハードウェア装置により構成されてもよい。その場合、上記各図（図４Ａ、図４Ｂ）に示した各構成要素は、その一部又は全部を統合したハードウェア（処理ロジックを実装した集積回路あるいは記憶デバイス等）を用いて実現されてもよい。
【０１３７】
並列処理装置が専用のハードウェアにより実現される場合、係る並列処理装置の構成要素は、例えば、それぞれの機能を提供可能な回路構成（ｃｉｒｃｕｉｔｒｙ）により実現されてもよい。係る回路構成は、例えば、ＳｏＣ（Ｓｙｓｔｅｍ  ｏｎ  ａ  Ｃｈｉｐ）等の集積回路や、当該集積回路を用いて実現されたチップセット等を含む。この場合、並列処理装置の構成要素が保持するデータは、例えば、ＳｏＣとして統合されたＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）領域やフラッシュメモリ領域、あるいは、当該ＳｏＣに接続された記憶デバイス（半導体記憶装置等）に記憶されてもよい。また、この場合、並列処理装置の各構成要素を接続する通信回線としては、周知の通信ネットワークを採用してもよい。また、各構成要素を接続する通信回線は、それぞれの構成要素間をピアツーピアで接続してもよい。
【０１３８】
また、上述した並列処理装置は、図１２に例示するような汎用のハードウェアと、係るハードウェアによって実行される各種ソフトウェア・プログラム（コンピュータ・プログラム）とによって構成されてもよい。この場合、並列処理装置は、適切な数の汎用のハードウェア装置１２００と、ソフトウェア・プログラムとの組合せにより構成されてもよい。
【０１３９】
図１２における演算装置１２０１は、汎用のＣＰＵ（中央処理装置：Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）やマイクロプロセッサ等の演算処理装置である。演算装置１２０１は、例えば後述する不揮発性記憶装置１２０３に記憶された各種ソフトウェア・プログラムを記憶装置１２０２に読み出し、係るソフトウェア・プログラムに従って処理を実行してもよい。例えば、上記各実施形態における並列処理装置の構成要素の機能は、演算装置１２０１により実行されるソフトウェア・プログラムを用いて実現されてもよい。
【０１４０】
演算装置１２０１は、例えば、複数のＣＰＵコアを備えたマルチコアＣＰＵであってもよい。また演算装置１２０１は、１つのＣＰＵコアが複数のスレッドを実行可能な、マルチスレッドＣＰＵであってもよい。ハードウェア装置１２００は、複数の演算装置１２０１を備えてもよい。
【０１４１】
上記各実施形態において説明した並列プログラムは、複数の演算装置１２０１を用いて、並列にプロセスを実行することができる。この場合、並列プログラムは、１台のハードウェア装置１２００に含まれる複数の演算装置１２０１により実行されもよい。並列プログラムは、複数のハードウェア装置１２００に含まれる１以上の演算装置１２０１により実行されもよい。並列プログラムが生成するスレッドは、例えば、演算装置１２０１におけるＣＰＵコアを用いて並列に実行される。
【０１４２】
記憶装置１２０２は、演算装置１２０１から参照可能な、ＲＡＭ等のメモリ装置であり、ソフトウェア・プログラムや各種データ等を記憶する。なお、記憶装置１２０２は、揮発性のメモリ装置であってもよい。
【０１４３】
不揮発性記憶装置１２０３は、例えば磁気ディスクドライブや、フラッシュメモリによる半導体記憶装置等の、不揮発性の記憶装置である。不揮発性記憶装置１２０３は、各種ソフトウェア・プログラムやデータ等を記憶可能である。例えば、並列プログラムは、不揮発性記憶装置１２０３に記憶されてもよい。
【０１４４】
ドライブ装置１２０４は、例えば、後述する記録媒体１２０５に対するデータの読み込みや書き込みを処理する装置である。
【０１４５】
記録媒体１２０５は、例えば光ディスク、光磁気ディスク、半導体フラッシュメモリ等、データを記録可能な任意の記録媒体である。並列プログラムは、記録媒体１２０５に記録されていてもよい。
【０１４６】
入出力インタフェース１２０６は、外部装置との間の入出力を制御する装置である。
【０１４７】
上述した各実施形態を例に説明した本発明における並列処理装置、あるいはその構成要素は、例えば、図１２に例示するハードウェア装置１２００に対して、上記各実施形態において説明した機能を実現可能なソフトウェア・プログラムを供給することにより、実現されてもよい。
【０１４８】
より具体的には、例えば、係るハードウェア装置１２００に対して供給したソフトウェア・プログラムを、演算装置１２０１が実行することによって、本発明が実現されてもよい。この場合、係るハードウェア装置１２００で稼働しているオペレーティングシステムや、データベース管理ソフト、ネットワークソフト、仮想環境基盤等のミドルウェアなどが各処理の一部を実行してもよい。
【０１４９】
上述した各実施形態において、上記各図に示した各部は、上述したハードウェアにより実行されるソフトウェア・プログラムの機能（処理）単位である、ソフトウェアモジュールとして実現することができる。ただし、これらの図面に示した各ソフトウェアモジュールの区分けは、説明の便宜上の構成であり、実装に際しては、様々な構成が想定され得る。
【０１５０】
図４Ａ、図４Ｂに例示した並列処理装置の各構成要素をソフトウェアモジュールとして実現する場合、例えば、これらのソフトウェアモジュールが不揮発性記憶装置１２０３に記憶されてもよい。そして、演算装置１２０１がそれぞれの処理を実行する際に、これらのソフトウェアモジュールを記憶装置１２０２に読み出してもよい。
【０１５１】
また、これらのソフトウェアモジュールは、共有メモリやプロセス間通信等の適宜の方法により、相互に各種データを伝達できるように構成されてもよい。このような構成により、これらのソフトウェアモジュールは、相互に通信可能に接続される。
【０１５２】
更に、上記ソフトウェア・プログラムは記録媒体１２０５に記録されてもよい。この場合、上記ソフトウェア・プログラムは、上記並列処理装置の出荷段階、あるいは運用段階等において、適宜ドライブ装置１２０４を通じて不揮発性記憶装置１２０３に格納されるよう構成されてもよい。
【０１５３】
なお、上記の場合において、上記ハードウェア装置１２００への各種ソフトウェア・プログラムの供給方法は、出荷前の製造段階、あるいは出荷後のメンテナンス段階等において、適当な治具を利用して当該装置内にインストールする方法を採用してもよい。また、各種ソフトウェア・プログラムの供給方法は、インターネット等の通信回線を介して外部からダウンロードする方法等のように、現在では一般的な手順を採用してもよい。
【０１５４】
そして、このような場合において、本発明は、係るソフトウェア・プログラムを構成するコード、あるいは係るコードが記録されたところの、コンピュータ読み取り可能な記録媒体によって構成されると捉えることができる。この場合、係る記録媒体は、ハードウェア装置１２００と独立した媒体に限らず、ＬＡＮやインターネットなどにより伝送されたソフトウェア・プログラムをダウンロードして記憶又は一時記憶した記録媒体を含む。
【０１５５】
また、上述した並列処理装置の構成要素は、図１２に例示するハードウェア装置１２００を仮想化した仮想化環境と、当該仮想化環境において実行される各種ソフトウェア・プログラム（コンピュータ・プログラム）とによって構成されてもよい。この場合、図１２に例示するハードウェア装置１２００の構成要素は、当該仮想化環境における仮想デバイスとして提供される。なお、この場合も、図１２に例示するハードウェア装置１２００を物理的な装置として構成した場合と同様の構成にて、本発明を実現可能である。
【０１５６】
以上、本発明を、上述した模範的な実施形態に適用した例として説明した。しかしながら、本発明の技術的範囲は、上述した各実施形態に記載した範囲には限定されない。当業者には、係る実施形態に対して多様な変更又は改良を加えることが可能であることは明らかである。そのような場合、係る変更又は改良を加えた新たな実施形態も、本発明の技術的範囲に含まれ得る。上述した各実施形態を組合せた実施形態も本発明の技術的範囲に含まれる。更に、上述した各実施形態と、上述した各実施形態に変更又は改良を加えた新たな実施形態とを組合せた実施形態も、本発明の技術的範囲に含まれ得る。そしてこのことは、特許請求の範囲に記載した事項から明らかである。
【符号の説明】
【０１５７】
１００    並列処理装置
１０１    プロセス間通信部
１０２    マルチスレッド制御部
２００    プロセス間通信部
２０１    通信開始処理部
２０２    通信完了処理部
２０３    通信処理管理部
２０４    通信処理記録部
３００    マルチスレッド制御部
３０１    バリア同期処理部
３０２    同期待ちスレッド記録部
１２０１    演算装置
１２０２    記憶装置
１２０３    不揮発性記憶装置
１２０４    ドライブ装置
１２０５    記録媒体
１２０６    入出力インタフェース
【図１】
0006658123.tif 000002
【図２】
0006658123.tif 000003
【図３】
0006658123.tif 000004
【図４Ａ】
0006658123.tif 000005
【図４Ｂ】
0006658123.tif 000006
【図５Ａ】
0006658123.tif 000007
【図５Ｂ】
0006658123.tif 000008
【図６Ａ】
0006658123.tif 000009
【図６Ｂ】
0006658123.tif 000010
【図７】
0006658123.tif 000011
【図８Ａ】
0006658123.tif 000012
【図８Ｂ】
0006658123.tif 000013
【図９Ａ】
0006658123.tif 000014
【図９Ｂ】
0006658123.tif 000015
【図１０】
0006658123.tif 000016
【図１１】
0006658123.tif 000017
【図１２】
0006658123.tif 000018