(57)【特許請求の範囲】
【請求項１】
各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み、前記各々のノードの間のプロセッサ同士を接続する第１信号線と、前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する第２信号線と、を有する並列演算システム内の第１処理を実行する第１プロセッサと、前記第１処理と同期する第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記第１信号線を用いた第１同期処理を実行することを決定し、前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、前記第１プロセッサと前記第２プロセッサとが属するノードに含まれるメモリを用いた第２同期処理を行う際に確保するメモリのサイズに応じた、前記第２信号線を用いた第３同期処理の処理性能と前記第２同期処理の処理性能との比較結果を参照して、前記第２同期処理を行う際に確保するメモリのサイズに基づいて、前記第３同期処理または前記第２同期処理のうちのいずれか一方を実行することを決定する、
制御部を有することを特徴とする並列演算装置。
【請求項２】
各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み、前記各々のノードの間のプロセッサ同士を接続する第１信号線と、前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する第２信号線と、を有する並列演算システムであって、
前記並列演算システム内のいずれかのプロセッサは、
前記並列演算システム内の第１処理を実行する第１プロセッサと、前記第１処理と同期する第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記第１信号線を用いた第１同期処理を実行することを決定し、前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、前記第１プロセッサと前記第２プロセッサとが属するノードに含まれるメモリを用いた第２同期処理を行う際に確保するメモリのサイズに応じた、前記第２信号線を用いた第３同期処理の処理性能と前記第２同期処理の処理性能との比較結果を参照して、前記第２同期処理を行う際に確保するメモリのサイズに基づいて、前記第３同期処理または前記第２同期処理のうちのいずれか一方を実行することを決定する、
ことを特徴とする並列演算システム。
【請求項３】
コンピュータに、
各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み、前記各々のノードの間のプロセッサ同士を接続する第１信号線と、前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する第２信号線と、を有する並列演算システム内の第１処理を実行する第１プロセッサと、前記第１処理と同期する第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記第１信号線を用いた第１同期処理を実行することを決定し、前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、前記第１プロセッサと前記第２プロセッサとが属するノードに含まれるメモリを用いた第２同期処理を行う際に確保するメモリのサイズに応じた、前記第２信号線を用いた第３同期処理の処理性能と前記第２同期処理の処理性能との比較結果を参照して、前記第２同期処理を行う際に確保するメモリのサイズに基づいて、前記第３同期処理または前記第２同期処理のうちのいずれか一方を実行することを決定する、
処理を実行させることを特徴とする並列演算プログラム。
【請求項４】
各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み、前記各々のノードの間のプロセッサ同士を接続する第１信号線と、前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する第２信号線と、を有する並列演算システム内の所定の処理を繰り返す第１処理を実行する第１プロセッサと、前記第１処理と同期し前記所定の処理を繰り返す第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記第１信号線を用いた第１同期処理を実行することを決定し、前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、いずれかの処理を繰り返す回数に応じた、前記第２信号線を用いた第３同期処理の処理性能と、前記第１プロセッサと前記第２プロセッサとが属するノードに含まれるメモリを用いた第２同期処理の処理性能と、の比較結果を参照して、前記第１処理と前記第２処理とが前記所定の処理を繰り返す回数に基づいて、前記第３同期処理または前記第２同期処理のうちのいずれか一方を実行することを決定する、
制御部を有することを特徴とする並列演算装置。
【請求項５】
各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み、前記各々のノードの間のプロセッサ同士を接続する第１信号線と、前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する第２信号線と、を有する並列演算システムであって、
前記並列演算システム内のいずれかのプロセッサは、
前記並列演算システム内の所定の処理を繰り返す第１処理を実行する第１プロセッサと、前記第１処理と同期し前記所定の処理を繰り返す第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記第１信号線を用いた第１同期処理を実行することを決定し、前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、いずれかの処理を繰り返す回数に応じた、前記第２信号線を用いた第３同期処理の処理性能と、前記第１プロセッサと前記第２プロセッサとが属するノードに含まれるメモリを用いた第２同期処理の処理性能と、の比較結果を参照して、前記第１処理と前記第２処理とが前記所定の処理を繰り返す回数に基づいて、前記第３同期処理または前記第２同期処理のうちのいずれか一方を実行することを決定する、
ことを特徴とする並列演算システム。
【請求項６】
コンピュータに、
各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み、前記各々のノードの間のプロセッサ同士を接続する第１信号線と、前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する第２信号線と、を有する並列演算システム内の所定の処理を繰り返す第１処理を実行する第１プロセッサと、前記第１処理と同期し前記所定の処理を繰り返す第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記第１信号線を用いた第１同期処理を実行することを決定し、前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、いずれかの処理を繰り返す回数に応じた、前記第２信号線を用いた第３同期処理の処理性能と、前記第１プロセッサと前記第２プロセッサとが属するノードに含まれるメモリを用いた第２同期処理の処理性能と、の比較結果を参照して、前記第１処理と前記第２処理とが前記所定の処理を繰り返す回数に基づいて、前記第３同期処理または前記第２同期処理のうちのいずれか一方を実行することを決定する、
処理を実行させることを特徴とする並列演算プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列演算装置、並列演算システム、および並列演算プログラムに関する。
【背景技術】
【０００２】
従来、各々のノードがプロセッサとメモリとを有し、メモリをノード間で共用する複数のノードを含むシステムを構築する、いわゆるＮＵＭＡ（Ｎｏｎ−Ｕｎｉｆｏｒｍ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）と呼ばれる技術がある。
【０００３】
関連する先行技術として、例えば、マルチプロセッサシステムにおいて、コンパイラにより処理対象となる入力プログラムから自動的に並列性を持つタスクを抽出し、各プロセッサユニットの特性に合わせて当該タスクを配置するものがある。また、参照先行のデータ依存がある配列をワーク変数に設定し、ループを生成し、該ループの後に、データ依存のある配列を前記ワーク変数に置換したループの実行文を計算する技術がある。また、先行命令のトランザクションを全て出力した後に同期用のトランザクションを、トランザクションでメモリアクセスをシリアライズする主記憶と、トランザクションでキャッシュコヒーレンス制御の完了保証を行うコヒーレンス部とに出力する技術がある。また、共有メモリ上に各プロセッサの同期フラグ領域を割り当て、ソフトウェアにより同期フラグ領域を実行状態に応じて更新し、各プロセッサはバリア同期に参加する他のプロセッサの同期フラグ領域同士を比較することでバリア同期処理を行う技術がある。また、スレッド間同期オーバーヘッド情報ファイルとマシンサイクル数取得ライブラリを使用して、スレッドを並列処理の単位として共有メモリ型計算機上で実行可能なオブジェクトコードを生成する技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００６−２９３７６８号公報
【特許文献２】特開２０１０−１９１５０６号公報
【特許文献３】特開２０００−１９４６８０号公報
【特許文献４】特開２００５−０７１１０９号公報
【特許文献５】特開２００７−１０８８３８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術によれば、ＮＵＭＡを適用したシステム上で、異なるノードに属するプロセッサが実行する処理同士が同期する場合、同一のノードに属するプロセッサが実行する処理同士が同期する場合に比べると、システムの処理性能が劣化する。
【０００６】
１つの側面では、本発明は、システムに含まれる複数のプロセッサが実行する処理同士が同期する場合のシステムの処理性能の向上を図ることができる並列演算装置、並列演算システム、および並列演算プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一側面によれば、各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み各々のノードの間のプロセッサ同士を接続する信号線を有する並列演算システム内の第１処理を実行する第１プロセッサと、第１処理と同期する第２処理を実行する第２プロセッサとが異なるノードに属する場合、第１プロセッサと第２プロセッサとが信号線を用いた第１同期処理を実行することを決定する並列演算装置、並列演算システム、および並列演算プログラムが提案される。
【発明の効果】
【０００８】
本発明の一態様によれば、システムに含まれる複数のプロセッサが実行する処理同士が同期する場合のシステムの処理性能の向上を図ることができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、本実施の形態にかかる並列演算システム１００の動作例を示す説明図である。
【図２】図２は、サーバシステム２００の構成例を示す説明図である。
【図３】図３は、サーバ２０１のハードウェア構成例を示す説明図である。
【図４】図４は、ＣＰＵ同期処理とメモリ同期処理との一例を示す説明図である。
【図５】図５は、サーバ２０１の機能構成例を示すブロック図である。
【図６】図６は、性能測定用プログラム６０１の一例を示す説明図である。
【図７】図７は、性能測定用プログラム６０１内のパラメータパターンの一例を示す説明図である。
【図８】図８は、同期手法別性能情報５１０の一例を示す説明図である。
【図９】図９は、依存性ループを含むプログラム９０１の一例を示す説明図である。
【図１０】図１０は、同期手法の決定結果の一例を示す説明図である。
【図１１】図１１は、同期手法の決定結果に従った依存性ループを含む処理の流れの一例を示す説明図である。
【図１２】図１２は、依存性ループ検出時処理手順の一例を示すフローチャートである。
【図１３】図１３は、同期手法決定処理手順の一例を示すフローチャートである。
【図１４】図１４は、依存性ループ実行処理手順の一例を示すフローチャート（その１）である。
【図１５】図１５は、依存性ループ実行処理手順の一例を示すフローチャート（その２）である。
【図１６】図１６は、依存性ループ実行処理手順の一例を示すフローチャート（その３）である。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、開示の並列演算装置、並列演算システム、および並列演算プログラムの実施の形態を詳細に説明する。
【００１１】
図１は、本実施の形態にかかる並列演算システム１００の動作例を示す説明図である。並列演算システム１００は、ＮＵＭＡを適用したシステムである。具体的には、図１に示す並列演算システム１００は、２つのノードを有する。以下、並列演算システム１００に含まれるノードを、「ＮＵＭＡノード」と呼称する。また、２つのノードを、「ＮＵＭＡ−０ノード」と、「ＮＵＭＡ−１ノード」と呼称する。
【００１２】
また、ＮＵＭＡノードは、複数のプロセッサとメモリとを有する。ここで、複数のプロセッサは、１つのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）に複数のプロセッサコアを有するマルチコアプロセッサでもよいし、シングルプロセッサが複数あるものでもよい。以下、プロセッサを、単に「コア」と称する。ＮＵＭＡ−０ノードは、コアｃ０、ｃ１、メモリｍ０を有する。また、ＮＵＭＡ−１ノードは、コアｃ２、ｃ３、メモリｍ１を有する。また、ＮＵＭＡノードに含まれるコアの個数は、２以上でもよく、ＮＵＭＡノードの間で個数が異なってもよい。また、ＮＵＭＡノードに含まれるメモリは複数でもよく、ＮＵＭＡノードの間で個数が異なってもよい。
【００１３】
ここで、並列演算システム１００に含まれる複数のコアが実行する処理同士が同期する場合がある。処理同士が同期する場合とは、複数の処理の各々の処理の実行される順序を担保しなければならない場合である。処理同士が同期する場合としては、具体的には、例えば、スレッド並列における依存性ループがある。また、例えば、処理同士が排他制御を行う場合である。以下の例では、スレッド並列における依存性ループを用いて説明を行う。
【００１４】
スレッド並列における依存性ループは、ループの一回当たりの処理同士の間に依存関係があるものである。ここで、ループの一回当たりの処理を、「イテレーション」と呼称する。また、１つ以上のイテレーションを一つのスレッドとして、並列演算システム１００に含まれる複数のコアに実行させる。依存関係がある例として、先行するイテレーションを行った結果を、次のイテレーションの入力として用いる場合である。依存関係がある場合、先行するイテレーションと次のイテレーションとを並列に実行することはできず、先行するイテレーションが完了した後に、次のイテレーションを実行することになる。例えば、ＯｐｅｎＭＰのループ構文では、ｏｒｄｅｒｅｄ構文を用いると、依存性ループを生成することができる。
【００１５】
また、スレッド並列における依存性ループは、同期処理として、ｐｏｓｔ処理と、ｗａｉｔ処理とによって実現される。先行するスレッドを実行するコアは、実行するスレッドが担当するイテレーションが終了した場合、先行するスレッドの後に実行するスレッドを実行するコアに、ｐｏｓｔ処理を行う。先行するスレッドの後に実行するスレッドを実行するコアは、ｗａｉｔ処理により待機状態となっており、ｐｏｓｔ処理による通知を受けると、待機状態を解除する。
【００１６】
同期処理となるｐｏｓｔ処理と、ｗａｉｔ処理とについて、さらに説明する。ｐｏｓｔ処理と、ｗａｉｔ処理とは、ＮＵＭＡノードに含まれるメモリを用いたものがある。以下の記載では、メモリを用いたｐｏｓｔ処理と、ｗａｉｔ処理とを、まとめて、「メモリ同期処理」と呼称する。そして、メモリを用いたｐｏｓｔ処理を、「メモリ同期によるｐｏｓｔ処理」と呼称し、メモリを用いたｗａｉｔ処理を、「メモリ同期によるｗａｉｔ処理」と呼称する。
【００１７】
例えば、先行するスレッドを実行するコアは、スレッド間で共有される変数ｃｏｕｎｔｅｒを、１イテレーション実行ごとにインクリメントする。ここで、変数ｃｏｕｎｔｅｒは、ＮＵＭＡノードに含まれるメモリ内に確保されたチャンクに格納される。そして、インクリメントする度に、先行するスレッドを実行するコアは、変数ｃｏｕｎｔｅｒの値を更新する。先行するスレッドを実行するコアは、変数ｃｏｕｎｔｅｒがイテレーション終了値ｅｎｄより大きくなった場合、実行を終了する。最後の変数ｃｏｕｎｔｅｒの更新が、メモリ同期によるｐｏｓｔ処理となる。
【００１８】
一方、先行するスレッドの後に実行するスレッドは、変数ｃｏｕｎｔｅｒの値を参照し、変数ｃｏｕｎｔｅｒの値が自スレッドのイテレーション開始値ｓｔａｒｔよりも小さい場合待機し、ｓｔａｒｔ以上の場合待機を解除し自スレッドのイテレーションを実行する。ｓｔａｒｔよりも小さい場合待機して、ｓｔａｒｔ以上の場合には待機を解除することが、メモリ同期によるｗａｉｔ処理となる。
【００１９】
ここで、異なるＮＵＭＡノードに属するコアが実行する処理がメモリ同期処理を実行する場合、同一のＮＵＭＡノードに属するコアが実行する処理がメモリ同期処理する場合に比べると、システムの処理性能が劣化する。特に、メモリ同期処理に用いるチャンクサイズが小さくなるにつれて、先行するスレッドを実行するコアと、次のスレッドを実行するコアとで、待ち時間が多くなる恐れがある。
【００２０】
例えば、チャンクサイズが、変数ｃｏｕｎｔｅｒの値を１つ分しか記憶できないサイズであったとする。この場合、先行するスレッドを実行するコアは、一旦変数ｃｏｕｎｔｅｒの値を書き込んだ後、次のスレッドを実行するコアが変数ｃｏｕｎｔｅｒの値を参照した後でないと、再び書き込むことはできない。このように、変数ｃｏｕｎｔｅｒの値を１つ分しか記憶できないサイズであると、先行するスレッドを実行するコアは、変数ｃｏｕｎｔｅｒの値を連続して書き込むことができなくなり、待ち時間が多くなる。
【００２１】
そこで、並列演算システム１００は、異なるノード内のコアが実行する処理が同期を行う場合、異なるノード内のコア同士を接続する専用の信号線を用いた第１同期処理を行う。これにより、並列演算システム１００は、メモリを用いた第２同期処理、すなわち、前述したメモリ同期処理を行うよりもシステム性能が向上する。信号線を用いた同期処理については後述する。図１の例では、スレッドｔ０、ｔ１がメモリ同期処理を行うと、図１の破線が示すようにデータの移動が行われるため、第１同期処理を行う場合に比べて、遅延が発生することになる。
【００２２】
図１を用いて、具体的な並列演算システム１００の動作を説明する。並列演算システム１００は、各々のＮＵＭＡノードの間のプロセッサ同士を接続する信号線を有する。図１の例では、並列演算システム１００は、コアｃ１とコアｃ２とを接続する信号線ｈを有する。そして、図１の例では、第１プロセッサとしてコアｃ１と、第２プロセッサとしてコアｃ２とがスレッド並列における依存性ループを実行するものとする。コアｃ１は、第１処理としてスレッドｔ０を実行し、コアｃ２は、第２処理としてスレッドｔ１を実行するものとする。そして、スレッドｔ０が、スレッドｔ１に先行するスレッドであるとする。
【００２３】
このように、コアｃ１とコアｃ２とは異なるＮＵＭＡノードに属するため、並列演算装置は、信号線ｈを用いた同期処理を実行することを決定する。ここで、決定する主体となる並列演算装置とは、コアｃ１とメモリｍ０とをコンピュータシステムと見做したものでもよいし、メモリｍ１とコアｃ２とをコンピュータシステムと見做したものでもよいし、並列演算システム１００の外にあるコンピュータでもよい。
【００２４】
また、異なるノード内のコア同士を接続する信号線を用いた第１同期処理も、ｐｏｓｔ処理と、ｗａｉｔ処理とを有する。また、並列演算システム１００は、各々のノードに含まれる複数のコアの各々のコア同士を接続する信号線を有してもよく、この場合、各々のノードに含まれる複数のコアの各々のコア同士を接続する信号線を用いた第３同期処理を実行してもよい。さらに、第３同期処理も、ｐｏｓｔ処理と、ｗａｉｔ処理とを有する。以下の記載では、第１同期処理と第３同期処理とをまとめて、「ＣＰＵ同期処理」と呼称する。そして、信号線を用いたｐｏｓｔ処理を、「ＣＰＵ同期によるｐｏｓｔ処理」と呼称し、信号線を用いたｗａｉｔ処理を、「ＣＰＵ同期によるｗａｉｔ処理」と呼称する。ＣＰＵ同期処理とメモリ同期処理との例については、図４に説明する。また、以下の説明では、ＣＰＵ同期処理とメモリ同期処理とをまとめて、「同期手法」と呼称する。
【００２５】
以下に、ＣＰＵ同期処理の具体的な動作例を示す。ＣＰＵ同期処理では、スレッド間で共有される変数を持たずに、それぞれのスレッドがローカル変数ｌｏｃａｌ＿ｃｏｕｎｔｅｒを有する。そして、先行するスレッドｔ０を実行するコアｃ１は、ローカル変数ｌｏｃａｌ＿ｃｏｕｎｔｅｒの値を更新する。コアｃ１は、ローカル変数ｌｏｃａｌ＿ｃｏｕｎｔｅｒがイテレーション終了値ｅｎｄより大きくなった場合、信号線ｈを介して、自スレッドの担当するイテレーションが終了したことを示すフラグを通知する。信号線ｈを介してフラグを通知することが、ＣＰＵ同期によるｐｏｓｔ処理となる。
【００２６】
一方、スレッドｔ０の後に実行するスレッドｔ１を実行するコアｃ２は、フラグの通知を受けるまで待機して、フラグの通知を受けた場合には、待機を解除し自スレッドのイテレーションを実行する。フラグの通知を受けるまで待機して、フラグの通知を受けた場合に待機を解除することが、ＣＰＵ同期によるｗａｉｔ処理となる。
【００２７】
次に、並列演算システム１００をサーバシステムに適用した例を、図２を用いて説明する。
【００２８】
図２は、サーバシステム２００の構成例を示す説明図である。サーバシステム２００は、サーバ２０１と、ログインノード２０２とを有する。サーバ２０１は、並列演算システム１００を有する。
【００２９】
並列演算システム１００は、ＮＵＭＡ−０ノード、ＮＵＭＡ−１ノードを有する。ここで、ハードウェア同期線は、図１に示した信号線ｈに相当する。ＮＵＭＡ−０ノードが有するハードウェアとＮＵＭＡ−１ノードが有するハードウェアとは同一であるため、以下の説明では、ＮＵＭＡ−０ノードが有するハードウェアに限って説明する。
【００３０】
ＮＵＭＡ−０ノードは、コアｃ０、ｃ１、Ｌ１キャッシュメモリｌ１０、ｌ１１、Ｌ２キャッシュメモリｌ２０、メモリｍ０、ハードウェア同期線ｈ０を有する。Ｌ１キャッシュメモリｌ１０は、コアｃ０が用いる１次キャッシュメモリである。また、Ｌ１キャッシュメモリｌ１１は、コアｃ１が用いる１次キャッシュメモリである。Ｌ２キャッシュメモリｌ２０は、コアｃ０、ｃ１が用いる２次キャッシュメモリである。
【００３１】
ハードウェア同期線ｈ０、ｈ１は、並列演算システム１００内の全てのコア同士を接続する信号線であってもよいし、並列演算システム１００内の一部のコア同士を接続する信号線であってもよい。一部のコア同士を接続する例として、並列演算システム１００は、コアｃ０、ｃ１の信号線と、コアｃ１、ｃ２の信号線と、コアｃ２、ｃ３の信号線と、コアｃ３、ｃ０の信号線というように、リングを形成するように信号線を有してもよい。
【００３２】
ログインノード２０２は、並列演算システム１００を利用する利用者が操作するコンピュータである。具体的には、ログインノード２０２は、利用者の操作により、科学技術計算を行うジョブを並列演算システム１００に送信する。
【００３３】
図３は、サーバ２０１のハードウェア構成例を示す説明図である。図３において、サーバ２０１は、並列演算システム１００と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０１と、ディスクドライブ３０２と、ディスク３０３と、通信インターフェース３０４と、を含む。また、並列演算システム１００と、ＲＯＭ３０１と、ディスクドライブ３０２と、通信インターフェース３０４とは、バス３０５によってそれぞれ接続される。
【００３４】
並列演算システム１００は、サーバ２０１の全体の制御を司る演算処理装置群である。ＲＯＭ３０１は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。
【００３５】
ディスクドライブ３０２は、並列演算システム１００の制御に従ってディスク３０３に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ３０２には、例えば、磁気ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク３０３は、ディスクドライブ３０２の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ３０２が磁気ディスクドライブである場合、ディスク３０３には、磁気ディスクを採用することができる。また、ディスクドライブ３０２がソリッドステートドライブである場合、ディスク３０３には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００３６】
通信インターフェース３０４は、ネットワークとなるＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどと、内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的には、通信インターフェース３０４は、ネットワークを介してログインノード２０２等に接続される。通信インターフェース３０４には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００３７】
また、サーバシステム２００の運用者が、サーバ２０１を直接操作する場合、サーバ２０１は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。
【００３８】
また、ログインノード２０２のハードウェアは特に図示しないが、ＣＰＵと、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、ＲＯＭと、ディスクドライブと、ディスクと、通信インターフェースと、ディスプレイ、キーボード、マウスとを有する。
【００３９】
図４は、ＣＰＵ同期処理とメモリ同期処理との一例を示す説明図である。図４の例では、ＮＵＭＡノードに閉じたＣＰＵ同期処理と、ＮＵＭＡノードにまたがるＣＰＵ同期処理と、ＮＵＭＡノードにまたがるメモリ同期処理との一例を示す。
【００４０】
図４では、ＮＵＭＡノードに閉じたＣＰＵ同期処理の通知例を、一点鎖線の矢印で示す。また、ＮＵＭＡノードにまたがるＣＰＵ同期処理の通知例を、実線の矢印で示す。また、ＮＵＭＡノードにまたがるメモリ同期処理の通知例を、破線の矢印で示す。
【００４１】
ＮＵＭＡノードにまたがるＣＰＵ同期処理と、ＮＵＭＡノードにまたがるメモリ同期処理とでは、メモリを経由する分、ＮＵＭＡノードにまたがるＣＰＵ同期処理の方が高速となる。しかし、ＮＵＭＡノードに閉じたＣＰＵ同期処理と、ＮＵＭＡノードに閉じたメモリ同期処理とでは、以下の条件のいずれかを満たす場合、メモリ同期処理の方が高速になる可能性がある。１つ目の条件は、ＮＵＭＡ−０ノードであれば、Ｌ１キャッシュメモリｌ１０、ｌ１１と、Ｌ２キャッシュメモリｌ２０との通信速度が高速である場合である。２つ目の条件は、ＮＵＭＡ−０ノードであれば、Ｌ１キャッシュメモリｌ１０、ｌ１１の間で、直接データ転送が行える場合である。３つ目の条件は、チャンクサイズが大きい場合である。
【００４２】
そこで、サーバ２０１は、チャンクサイズ等のパラメータやメモリの特性等に応じて、ＣＰＵ同期処理とメモリ同期処理とのうち高速となる同期手法を決定する。具体的な方法について、図５を用いて説明する。
【００４３】
（サーバ２０１の機能構成例）
図５は、サーバ２０１の機能構成例を示すブロック図である。サーバ２０１は、制御部５００を有する。制御部５００は、決定部５０１と、実行部５０２とを含む。制御部５００は、記憶装置に記憶されたプログラムを並列演算システム１００内のいずれかのコアが実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図１に示した並列演算システム１００内のメモリ、図３に示したＲＯＭ３０１、ディスク３０３などである。また、各部の処理結果は、並列演算システム１００内のいずれかのコアのレジスタや、並列演算システム１００内のキャッシュメモリ等に格納される。
【００４４】
また、サーバ２０１は、同期手法別性能情報５１０にアクセス可能である。同期手法別性能情報５１０は、メモリ同期処理を行う際に確保するチャンクサイズに応じたＣＰＵ同期処理の処理性能とメモリ同期処理の処理性能との比較結果を記憶する。また、同期手法別性能情報５１０は、いずれかの処理を繰り返す回数に応じたＣＰＵ同期処理の処理性能とメモリ同期処理の処理性能との比較結果を記憶してもよい。ここで、いずれかの処理は、依存性ループの一回分の処理であれば、どのような処理でもよく、または何も行わない処理であってもよい。いずれかの処理の具体的な例としては、図６で示す。また、いずれかの処理を繰り返す回数は、依存性ループに含まれるイテレーションの個数でもよいし、依存性ループをスレッドに分割した際の一個当たりのイテレーションの個数でもよい。また、同期手法別性能情報５１０は、依存性ループをスレッドに分割した際のスレッド数に応じたＣＰＵ同期処理の処理性能とメモリ同期処理の処理性能との比較結果を記憶してもよい。
【００４５】
同期手法別性能情報５１０は、並列演算システム１００内のメモリ、ディスク３０３といった記憶装置に格納される。同期手法別性能情報５１０の記憶内容の一例は、図８で説明する。
【００４６】
決定部５０１は、第１コアと、第１スレッドと同期する第２スレッドを実行する第２コアとが異なるＮＵＭＡノードに属する場合、ＣＰＵ同期処理を実行することを決定する。
【００４７】
また、決定部５０１は、第１コアと第２コアとが同一のノードに属する場合、第１コアと第２コアとが属するＮＵＭＡノードに含まれるメモリを用いたメモリ同期処理を実行することを決定してもよい。
【００４８】
また、第１コアと第２コアとが同一のノードに属するものとする。この場合、決定部５０１は、同期手法別性能情報５１０を参照して、メモリ同期処理を行う際に確保するチャンクサイズに基づいて、ＣＰＵ同期処理またはメモリ同期処理のうちのいずれか一方を実行することを決定してもよい。
【００４９】
例えば、メモリ同期処理を行う際に確保するチャンクサイズと同一のサイズに対応する比較結果が同期手法別性能情報５１０に格納されていたとする。この場合、決定部５０１は、これから確保するチャンクサイズと同一のサイズに対応する比較結果を取得して、比較結果がより高速であると示した同期手法を実行することを決定する。また、例えば、メモリ同期処理を行う際に確保するチャンクサイズと同一のサイズに対応する比較結果が同期手法別性能情報５１０に格納されていなかったとする。この場合、決定部５０１は、例えば、これから確保するチャンクサイズと最も近いサイズに対応する比較結果を取得して、比較結果がより高速であると示した同期手法を実行することを決定する。
【００５０】
また、第１コアと第２コアとが同一のノードに属するものとする。この場合、決定部５０１は、同期手法別性能情報５１０を参照して、第１スレッドと第２スレッドとが所定の処理を繰り返す回数に基づいて、ＣＰＵ同期処理またはメモリ同期処理のうちのいずれか一方を実行することを決定する。ここで、所定の処理は、ログインノード２０２から送信されたジョブから生成されたものの一部であって、一回のイテレーションに相当する。所定の処理の具体例は、図９で示す。また、第１スレッドと第２スレッドとは、所定の処理を同数回繰り返すものでもよいし、異なる回数回繰り返すものでもよい。第１スレッドと第２スレッドとが所定の処理を繰り返す回数は、第１スレッドと第２スレッドとが所定の処理を繰り返す回数の合計でもよいし、平均でもよい。
【００５１】
実行部５０２は、決定部５０１が決定した同期処理を実行する。例えば、決定部５０１がＣＰＵ同期処理を実行することを決定しており、実行部５０２を有するコアが、ｐｏｓｔ処理を実行するものとする。この場合、実行部５０２は、ＣＰＵ同期によるｐｏｓｔ処理を実行する。
【００５２】
図６は、性能測定用プログラム６０１の一例を示す説明図である。図６に示す性能測定用プログラム６０１は、同期手法別性能情報５１０を生成する際に用いるプログラムである。図６の例で、依存性ループは、「＃ｐｒａｇｍａ  ｏｍｐ  ｏｒｄｅｒｅｄ」で指定された次の中括弧で指定される部分となる。
【００５３】
性能測定用プログラム６０１において、「ｌｏｏｐ」と、「ｃｈｕｎｋ」と、「ｔｈｒｅａｄｓ」は、それぞれ、総ループ数、チャンクサイズ、スレッド数を示し、性能測定用プログラム６０１に対するパラメータである。「ｌｏｏｐ」と、「ｃｈｕｎｋ」と、「ｔｈｒｅａｄｓ」が取り得る値については、図７で説明する。
【００５４】
図７は、性能測定用プログラム６０１内のパラメータパターンの一例を示す説明図である。図７で示すように、パラメータ「ｃｈｕｎｋ」が取り得る値は、「ｌｏｏｐ」に依存しており、「ｌｏｏｐ／２」、「ｌｏｏｐ／４」、「ｌｏｏｐ／８」、…、１である。そして、パラメータ「ｃｈｕｎｋ」が取り得る値の個数は、ｆｌｏｏｒ（ｌｏｇ2ｌｏｏｐ）である。ここで、ｆｌｏｏｒ（ｘ）は、ｘ以下の最大の整数を示す。
【００５５】
ここで、説明の簡略化のため、本実施の形態におけるｃｈｕｎｋ＝１となるデータサイズは、１回のループで２つのスレッド間でデータをやりとりする際に用いるデータサイズとする。例えば、２つのスレッドでカウンタの値をやりとりするならば、ｃｈｕｎｋ＝１は、１回のループでカウンタの値を記憶可能なデータサイズである。同様に、ｃｈｕｎｋ＝ｘであれば、１回のループでカウンタの値を記憶可能なデータサイズのｘ倍となる。また、ｎ番目のｃｈｕｎｋは、（１／２）n×ｌｏｏｐとなる。ただし、（１／２）n×ｌｏｏｐ≧１となる。
【００５６】
また、パラメータ「ｌｏｏｐ」が取り得る値は、１００、１，０００、１０，０００、５０，０００、１００，０００である。そして、パラメータ「ｃｈｕｎｋ」が取り得る値の個数は、５である。
【００５７】
また、パラメータ「ｔｈｒｅａｄｓ」が取り得る値は、２、３、４、…、ＮＵＭＡノード内のコア数である。そして、パラメータ「ｔｈｒｅａｄｓ」が取り得る値の個数は、ＮＵＭＡノード内のコア数−１である。
【００５８】
従って、性能測定用プログラム６０１により実行される回数は、ｆｌｏｏｒ（ｌｏｇ2ｌｏｏｐ）×５×（ＮＵＭＡノードのコア数−１）となる。
【００５９】
図８は、同期手法別性能情報５１０の一例を示す説明図である。同期手法別性能情報５１０は、図７で示した各パラメータを軸として、ＣＰＵ同期処理とメモリ同期処理とのうち、どちらが高速であるかを示した情報である。図８に示す同期手法別性能情報５１０は、あるｔｈｅａｄｓ数における、ｃｈｕｎｋとｌｏｏｐとの組み合わせに応じて、ＣＰＵ同期処理とメモリ同期処理とのうち高速な手法を示したものである。ここで、説明の簡略化のため、図８中で示す「Ｃ」は、ＣＰＵ同期処理の方が高速であることを示すものとし、図８中で示す「Ｍ」は、メモリ同期処理の方が高速であることを示すものとする。
【００６０】
図８に示す同期手法別性能情報５１０は、レコード８０１−１〜５を有する。例えば、レコード８０１−１は「ｌｏｏｐ」＝１００である際のｃｈｕｎｋ＝１、２、４、８、…における、ＣＰＵ同期処理とメモリ同期処理とのうち高速な手法を示す。
【００６１】
次に、図９〜図１１を用いて、依存性ループを実行する際の同期手法の決定結果と、決定結果に従って依存性ループを実行する例を示す。
【００６２】
図９は、依存性ループを含むプログラム９０１の一例を示す説明図である。プログラム９０１は、「ｃｈｕｎｋ」＝２５、「ｌｏｏｐ」＝２００、「ｔｈｒｅａｄｓ」＝４とする依存性ループの例を示す。プログラム９０１内で、所定の処理は、「＃ｐｒａｇｍａ  ｏｍｐ  ｏｒｄｅｒｅｄ」で指定された次の中括弧で指定される部分「ｐｒｉｎｔｆ（“ｉ＝％ｄ￥ｎ”，ｉ）；」となる。
【００６３】
また、プログラム９０１を実行するＮＵＭＡノードは２つであり、ＮＵＭＡ−０ノードのコアｃ０、ｃ１と、ＮＵＭＡ−１ノードのコアｃ２、ｃ３とが、それぞれ、スレッドｔ０〜ｔ３を実行するものとする。また、スレッドを実行するコアは、図２で示した右隣のコアと通信を行うものとする。さらに、最終スレッドを実行するコアの右隣は、コアｃ０であるとする。例えば、スレッドｔ０を実行するコアｃ０は、スレッドｔ１を実行するコアｃ１と通信する。また、スレッドｔ３を実行するコアｃ３は、スレッドｔ０を実行するコアｃ０と通信する。
【００６４】
そして、スレッドｔ０は、依存性ループの０〜２４回目を実行した後、ｐｏｓｔ処理でスレッドｔ１に通知した後、ｗａｉｔ処理を行ってｗａｉｔ状態になり、スレッドｔ３から通知を受けて１００〜１２４回目を実行するものとする。スレッドｔ１は、スレッドｔ０から通知を受けて依存性ループの２５〜４９回目を実行した後、ｐｏｓｔ処理でスレッドｔ２に通知した後、ｗａｉｔ処理を行ってｗａｉｔ状態になり、スレッドｔ０から通知を受けて１２５〜１４９回目を実行するものとする。
【００６５】
スレッドｔ２は、スレッドｔ１から通知を受けて依存性ループの５０〜７４回目を実行した後、ｐｏｓｔ処理でスレッドｔ３に通知した後、ｗａｉｔ処理を行ってｗａｉｔ状態になり、スレッドｔ１から通知を受けて１５０〜１７４回目を実行するものとする。スレッドｔ３は、スレッドｔ２から通知を受けて依存性ループの７５〜９９回目を実行した後、ｐｏｓｔ処理でスレッドｔ０に通知した後、ｗａｉｔ処理を行ってｗａｉｔ状態になり、スレッドｔ２から通知を受けて１７５〜１９９回目を実行するものとする。
【００６６】
以降の説明において、スレッドが依存性ループを行うイテレーションの塊を、「イテレーショングループ」と呼称する場合がある。
【００６７】
図１０は、同期手法の決定結果の一例を示す説明図である。コアｃ０〜ｃ３は、それぞれ、ｐｏｓｔ処理で行う同期手法と、ｗａｉｔ処理で行う同期手法とを決定する。図１０の例では、コアｃ０〜ｃ３は、それぞれ、通信を行うコア同士が同一のＮＵＭＡノードに属するものであればＣＰＵ同期処理を実行すると決定し、通信を行うコア同士が異なるＮＵＭＡノードに属するものであればメモリ同期処理を実行するものとする。
【００６８】
図１０で示すように、例えば、コアｃ０は、コアｃ０がｐｏｓｔ処理を行ってコアｃ１がｗａｉｔ処理を行う場合には、コアｃ０とコアｃ１は同一のＮＵＭＡノードに属するため、同期手法としてメモリ同期処理を実行すると決定する。また、コアｃ０は、コアｃ３がｐｏｓｔ処理を行ってコアｃ０がｗａｉｔ処理を行う場合には、コアｃ３とコアｃ０は異なるＮＵＭＡノードに属するため、同期手法としてＣＰＵ同期処理を実行すると決定する。
【００６９】
このように、各コアが実行するスレッドの中では、同期手法が異なる場合があるが、ｐｏｓｔ処理とｗａｉｔ処理とで通信するコア同士では、判断材料が同一であるため、同期手法が一致する。
【００７０】
図１１は、同期手法の決定結果に従った依存性ループを含む処理の流れの一例を示す説明図である。図１１において、点線は、ｐｏｓｔ処理による通知を示し、一点鎖線は、ｗａｉｔ処理による待機状態を示す。
【００７１】
図１１で示すように、スレッドｔ０を実行するコアｃ０は、依存性ループの０〜２４回目を実行し、メモリ同期によるｐｏｓｔ処理でスレッドｔ１を実行するコアｃ１に通知し、ＣＰＵ同期によるｗａｉｔ処理を行ってｗａｉｔ状態になる。そして、コアｃ０は、スレッドｔ３を実行するコアｃ３からＣＰＵ同期によるｐｏｓｔ処理による通知を受けて１００〜１２４回目を実行する。また、スレッドｔ１を実行するコアｃ１は、まず、メモリ同期によるｗａｉｔ処理を行ってｗａｉｔ状態になる。そして、コアｃ１は、コアｃ０からメモリ同期によるｐｏｓｔ処理による通知を受けて依存性ループの２５〜４９回目を実行し、ＣＰＵ同期によるｐｏｓｔ処理でスレッドｔ２を実行するコアｃ２に通知し、メモリ同期によるｗａｉｔ処理を行いｗａｉｔ状態になる。
【００７２】
また、スレッドｔ２を実行するコアｃ２は、まず、ＣＰＵ同期によるｗａｉｔ処理を行ってｗａｉｔ状態になる。そして、コアｃ２は、コアｃ１からＣＰＵ同期によるｐｏｓｔ処理による通知を受けて依存性ループの５０〜７４回目を実行し、メモリ同期によるｐｏｓｔ処理でスレッドｔ３を実行するコアｃ３に通知し、ＣＰＵ同期によるｗａｉｔ処理を行いｗａｉｔ状態になる。また、スレッドｔ３を実行するコアｃ３は、まず、メモリ同期によるｗａｉｔ処理を行ってｗａｉｔ状態になる。そして、コアｃ３は、コアｃ２からメモリ同期によるｐｏｓｔ処理による通知を受けて依存性ループの７５〜９９回目を実行し、ＣＰＵ同期によるｐｏｓｔ処理でスレッドｔ０を実行するコアｃ０に通知し、メモリ同期によるｗａｉｔ処理を行いｗａｉｔ状態になる。
【００７３】
図１１で示すように、ｐｏｓｔ処理とｗａｉｔ処理とで通信するコア同士では、同期手法が一致しており、依存性ループを正しく実行できることがわかる。次に、図１２〜図１６を用いて、サーバシステム２００が行う処理をフローチャートとして示す。
【００７４】
図１２は、依存性ループ検出時処理手順の一例を示すフローチャートである。依存性ループ検出時処理は、依存性ループを検出した際に実行する処理である。また、依存性ループ検出時処理は、依存性ループを検出した各コアが実行する。図１２〜図１６では、コアｃ０が実行する例を用いて説明を行う。
【００７５】
コアｃ０は、スレッド内で、依存性ループを検出する（ステップＳ１２０１）。次に、コアｃ０は、スレッド内のｐｏｓｔ処理またはｗａｉｔ処理について、同期手法決定処理を実行する（ステップＳ１２０２）。同期手法決定処理は、図１３で説明する。
【００７６】
そして、コアｃ０は、決定結果を用いて、依存性ループ実行処理を実行する（ステップＳ１２０３）。依存性ループ実行処理は、図１４〜図１６で説明する。ステップＳ１２０３の処理終了後、コアｃ０は、依存性ループ検出時処理を終了する。依存性ループ検出時処理を実行することにより、サーバシステム２００は、依存性ループをより高速に実行することができる。
【００７７】
図１３は、同期手法決定処理手順の一例を示すフローチャートである。同期手法決定処理は、ｐｏｓｔ処理またはｗａｉｔ処理を実行する際の同期手法を決定する処理である。ここで、ｐｏｓｔ処理を実行する際には、コアｃ０は、通知を送るコアのＩＤがわかっているものとする。同様に、ｗａｉｔ処理を実行する際には、コアｃ０は、通知を受けるコアのＩＤがわかっているものとする。また、同期手法決定処理は、ライブラリで提供されるプログラムが呼び出されることにより実行される。また、前述のライブラリは、同期手法決定処理を実行する際に、総ループ数と、スレッド数と、チャンクサイズとを決定する。
【００７８】
コアｃ０は、ｐｏｓｔ処理を実行する際であれば通知を送るコア、または、ｗａｉｔ処理を実行する際であれば通知を受けるコア、とのハードウェア同期線が存在するか否かを判断する（ステップＳ１３０１）。ステップＳ１３０１において、具体的には、ライブラリで提供されるプログラムには、ハードウェア同期線が存在するか否かをＯＳに問い合わせるＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）が記述されている。コアｃ０は、前述のＡＰＩを呼び出すことにより、ハードウェア同期線が存在するか否かを判断する。
【００７９】
ハードウェア同期線が存在する場合（ステップＳ１３０１：Ｙｅｓ）、コアｃ０は、次に、ｐｏｓｔ処理を実行するのか、またはｗａｉｔ処理を実行するのかを判断する（ステップＳ１３０２）。ｐｏｓｔ処理を実行する場合（ステップＳ１３０２：ｐｏｓｔ処理）、コアｃ０は、ＮＵＭＡノードにまたがるｐｏｓｔ処理か否かを判断する（ステップＳ１３０３）。ｗａｉｔ処理を実行する場合（ステップＳ１３０２：ｗａｉｔ処理）、コアｃ０は、ＮＵＭＡノードにまたがるｗａｉｔ処理か否かを判断する（ステップＳ１３０４）。
【００８０】
ＮＵＭＡノードにまたがるｐｏｓｔ処理でない場合（ステップＳ１３０３：Ｎｏ）、または、ＮＵＭＡノードにまたがるｗａｉｔ処理でない場合（ステップＳ１３０４：Ｎｏ）、コアｃ０は、ＣＰＵ同期処理とメモリ同期処理とのうち高速な手法を判断する（ステップＳ１３０５）。具体的には、例えば、コアｃ０は、同期手法別性能情報５１０を参照して、前述のライブラリが決定した総ループ数と、スレッド数と、チャンクサイズとに基づいて、ＣＰＵ同期処理とメモリ同期処理とのうち高速な手法を判断する。
【００８１】
ＮＵＭＡノードにまたがるｐｏｓｔ処理である場合（ステップＳ１３０３：Ｙｅｓ）、または、ＮＵＭＡノードにまたがるｗａｉｔ処理である場合（ステップＳ１３０４：Ｙｅｓ）、または、ＣＰＵ同期処理が高速である場合（ステップＳ１３０５：ＣＰＵ同期処理）、コアｃ０は、ＣＰＵ同期処理を同期手法として決定する（ステップＳ１３０６）。具体的には、コアｃ０は、ｐｏｓｔ処理を実行する場合には、ＣＰＵ同期処理を、ｐｏｓｔ処理の同期手法として決定し、ｗａｉｔ処理を実行する場合には、ＣＰＵ同期処理を、ｗａｉｔ処理の同期手法として決定する。
【００８２】
一方、メモリ同期処理が高速である場合（ステップＳ１３０５：メモリ同期処理）、または、ハードウェア同期線が存在しない場合（ステップＳ１３０１：Ｎｏ）、コアｃ０は、メモリ同期処理を同期手法として決定する（ステップＳ１３０７）。具体的には、コアｃ０は、ｐｏｓｔ処理を実行する場合には、メモリ同期処理を、ｐｏｓｔ処理の同期手法として決定し、ｗａｉｔ処理を実行する場合には、メモリ同期処理を、ｗａｉｔ処理の同期手法として決定する。
【００８３】
ステップＳ１３０６、またはステップＳ１３０７の処理終了後、コアｃ０は、同期手法決定処理を終了する。同期手法決定処理を実行することにより、コアｃ０は、ｐｏｓｔ処理またはｗａｉｔ処理を実行する際の同期手法として、ＣＰＵ同期処理とメモリ同期処理とのうち高速な同期手法を選ぶことができる。
【００８４】
図１４は、依存性ループ実行処理手順の一例を示すフローチャート（その１）である。また、図１５は、依存性ループ実行処理手順の一例を示すフローチャート（その２）である。また、図１６は、依存性ループ実行処理手順の一例を示すフローチャート（その３）である。依存性ループ実行処理は、依存性ループを実行する処理である。また、図１４〜図１６では、図９〜図１１で示した依存性ループを実行する際の処理であるとする。
【００８５】
ここで、依存性ループ実行処理で用いる変数の説明を行う。ｃｏｕｎｔｅｒは、スレッド間の共有変数であり、メモリ同期処理で使用される共有変数のカウンタである。以下の変数は、スレッド内でローカルな変数である。ｌｏｃａｌ＿ｃｏｕｎｔｅｒは、ＣＰＵ同期処理で使用されるスレッドローカルのカウンタである。ｓｔａｒｔ、ｅｎｄは、それぞれ、スレッドが担当するイテレーションの開始値、終了値である。ｃｈｕｎｋは、スレッドが担当するチャンクサイズである。ｒｏｌｅには、ｐｏｓｔを示す識別子またはｗａｉｔを示す識別子が格納される。
【００８６】
コアｃ０は、ｃｏｕｎｔｅｒを０に設定する（ステップＳ１４０１）。次に、コアｃ０は、ｒｏｌｅをｐｏｓｔかｗａｉｔのどちらかに設定する（ステップＳ１４０２）。ステップＳ１４０２において、具体的には、先頭のスレッドであるスレッドｔ０を実行するコアは、ｒｏｌｅをｐｏｓｔに設定し、他のコアは、ｒｏｌｅをｗａｉｔに設定する。従って、コアｃ０は、スレッドｔ０を実行するため、ｒｏｌｅをｐｏｓｔに設定する。また、コアｃ１〜ｃ３は、ｒｏｌｅをｗａｉｔに設定する。
【００８７】
ステップＳ１４０２の処理終了後、または、ステップＳ１５０９の処理終了後、コアｃ０は、自スレッドが担当するイテレーショングループが残っているか否かを判断する（ステップＳ１４０３）。自スレッドが担当するイテレーショングループが残っていない場合（ステップＳ１４０３：Ｎｏ）、コアｃ０は、依存性ループ実行処理を終了する。
【００８８】
一方、自スレッドが担当するイテレーショングループが残っている場合（ステップＳ１４０３：Ｙｅｓ）、コアｃ０は、担当するイテレーショングループのｓｔａｒｔ、ｅｎｄ、ｃｈｕｎｋを受け取る（ステップＳ１４０４）。ここで、ｓｔａｒｔ、ｅｎｄ、ｃｈｕｎｋは、同期手法決定処理が提供されるライブラリによって決定される値である。次に、コアｃ０は、ｌｏｃａｌ＿ｃｏｕｎｔｅｒを０に設定する（ステップＳ１４０５）。
【００８９】
ステップＳ１４０５の処理終了後、または、ステップＳ１６０５の処理終了後、コアｃ０は、ｒｏｌｅが次に示す識別子のいずれに一致するかを判断する（ステップＳ１４０６）。次に示す識別子は、ｐｏｓｔを示す識別子と、ｗａｉｔを示す識別子とである。ｒｏｌｅがｐｏｓｔを示す識別子である場合（ステップＳ１４０６：ｐｏｓｔ）、コアｃ０は、ｐｏｓｔ処理の同期手法がメモリ同期処理かＣＰＵ同期処理かを判断する（ステップＳ１５０１）。ここで、ｐｏｓｔ処理の同期手法は、ステップＳ１３０６、またはステップＳ１３０７のいずれかで決定されたものである。
【００９０】
ｐｏｓｔ処理の同期手法がメモリ同期処理である場合（ステップＳ１５０１：メモリ同期処理）、コアｃ０は、ｃｏｕｎｔｅｒがｅｎｄより大きいか否かを判断する（ステップＳ１５０２）。ｃｏｕｎｔｅｒがｅｎｄ以下である場合（ステップＳ１５０２：Ｎｏ）、コアｃ０は、１イテレーション実行する（ステップＳ１５０３）。そして、コアｃ０は、ｃｏｕｎｔｅｒをｃｏｕｎｔｅｒ＋１に設定する（ステップＳ１５０４）。ステップＳ１５０４の処理終了後、コアｃ０は、ステップＳ１５０２の処理に移行する。
【００９１】
一方、ｐｏｓｔ処理の同期手法がＣＰＵ同期処理である場合（ステップＳ１５０１：ＣＰＵ同期処理）、コアｃ０は、ｌｏｃａｌ＿ｃｏｕｎｔｅｒがｃｈｕｎｋ以上か否かを判断する（ステップＳ１５０５）。ｌｏｃａｌ＿ｃｏｕｎｔｅｒがｃｈｕｎｋ未満である場合（ステップＳ１５０５：Ｎｏ）、コアｃ０は、１イテレーション実行する（ステップＳ１５０６）。次に、コアｃ０は、ｌｏｃａｌ＿ｃｏｕｎｔｅｒをｌｏｃａｌ＿ｃｏｕｎｔｅｒ＋１に設定する（ステップＳ１５０７）。ステップＳ１５０７の処理終了後、コアｃ０は、ステップＳ１５０５の処理に移行する。
【００９２】
一方、ｌｏｃａｌ＿ｃｏｕｎｔｅｒがｃｈｕｎｋ以上である場合（ステップＳ１５０５：Ｙｅｓ）、コアｃ０は、ＣＰＵ  ｐｏｓｔ送信する（ステップＳ１５０８）。ステップＳ１５０８の処理終了後、または、ｃｏｕｎｔｅｒがｅｎｄより大きい場合（ステップＳ１５０２：Ｙｅｓ）、コアｃ０は、ｒｏｌｅをｗａｉｔを示す識別子に設定する（ステップＳ１５０９）。ステップＳ１５０９の処理終了後、コアｃ０は、ステップＳ１４０３の処理に移行する。
【００９３】
ｒｏｌｅがｗａｉｔを示す識別子である場合（ステップＳ１４０６：ｗａｉｔ）、コアｃ０は、ｗａｉｔ処理の同期手法がメモリ同期処理かＣＰＵ同期処理かを判断する（ステップＳ１６０１）。ここで、ｗａｉｔ処理の同期手法は、ステップＳ１３０６、またはステップＳ１３０７のいずれかで決定されたものである。
【００９４】
ｗａｉｔ処理の同期手法がメモリ同期処理である場合（ステップＳ１６０１：メモリ同期処理）、コアｃ０は、ｃｏｕｎｔｅｒがｓｔａｒｔより小さいか否かを判断する（ステップＳ１６０２）。ｃｏｕｎｔｅｒがｓｔａｒｔより小さい場合（ステップＳ１６０２：Ｙｅｓ）、コアｃ０は、再び、ステップＳ１６０２の処理を実行する。
【００９５】
ｗａｉｔ処理の同期手法がＣＰＵ同期処理である場合（ステップＳ１６０１：ＣＰＵ同期処理）、コアｃ０は、ＣＰＵ  ｗａｉｔする（ステップＳ１６０３）。ステップＳ１６０３の処理を行うことにより、コアｃ０は、ハードウェア同期線ｈを介した通知を受けるまで待機することになる。そして、ｐｏｓｔからの通知を受けた後、コアｃ０は、ｃｏｕｎｔｅｒをｓｔａｒｔに設定する（ステップＳ１６０４）。
【００９６】
ステップＳ１６０４の処理終了後、または、ｃｏｕｎｔｅｒがｓｔａｒｔ以上である場合（ステップＳ１６０２：Ｎｏ）、コアｃ０は、ｒｏｌｅをｐｏｓｔを示す識別子に設定する（ステップＳ１６０５）。ステップＳ１６０５の処理終了後、コアｃ０は、ステップＳ１４０６の処理に移行する。依存性ループ実行処理を実行することにより、コアｃ０は、ＣＰＵ同期処理とメモリ同期処理とのうち高速な同期手法を用いて、依存性ループを実行することができる。
【００９７】
以上説明したように、並列演算システム１００によれば、異なるＮＵＭＡノード内のコアが実行する処理が同期を実行する場合、ＣＰＵ同期処理を実行する。これにより、並列演算システム１００は、異なるＮＵＭＡノード内のコアが実行する処理が同期を実行する場合、メモリ同期処理を行う場合に比べて並列演算システム１００の処理性能を向上させることができる。
【００９８】
また、並列演算システム１００によれば、同一のＮＵＭＡノード内のコアが実行する処理が同期を実行する場合、メモリ同期処理を実行する。これにより、並列演算システム１００は、同一のＮＵＭＡノード内のコアが実行する処理が同期を実行する場合、ほとんどのケースにおいてＣＰＵ同期処理を行う場合に比べて並列演算システム１００の処理性能を向上させることができる。
【００９９】
また、並列演算システム１００によれば、同期手法別性能情報５１０を参照して、チャンクサイズに応じて、ＣＰＵ同期処理またはメモリ同期処理のうちのいずれか一方を実行することを決定してもよい。これにより、並列演算システム１００は、チャンクサイズが大きい場合にはメモリ同期処理を実行することを決定するとともに、チャンクサイズが小さい場合にはＣＰＵ同期処理を実行することを決定することができる。
【０１００】
また、並列演算システム１００によれば、同期手法別性能情報５１０を参照して、イテレーションの回数に基づいて、ＣＰＵ同期処理またはメモリ同期処理のうちのいずれか一方を実行することを決定してもよい。これにより、並列演算システム１００は、イテレーションの回数が少ない場合にはＣＰＵ同期処理を実行することを決定するとともに、イテレーションの回数が多い場合にはメモリ同期処理を実行することを決定することができる。
【０１０１】
また、並列演算システム１００に含まれる第１コアと第２コアとが依存性ループを実行するとする。そして、第１コアまたは第２コアのいずれか一方のコアが、上述した決定基準、例えば、第１コアと第２コアとが同一のＮＵＭＡノードに属しており、ＣＰＵ同期処理を実行することを決定したとする。このとき、第１コアまたは第２コアのうちの他方のコアは、第１コアと第２コアとが同一のＮＵＭＡノードに属するため、ＣＰＵ同期処理を実行することを決定してもよい。これにより、決定結果を他方のコアに送信しなくてよくなる。
【０１０２】
なお、本実施の形態で説明した並列演算方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本並列演算プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本並列演算プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１０３】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１０４】
（付記１）各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み前記各々のノードの間のプロセッサ同士を接続する信号線を有する並列演算システム内の第１処理を実行する第１プロセッサと、前記第１処理と同期する第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記信号線を用いた第１同期処理を実行することを決定する、
制御部を有することを特徴とする並列演算装置。
【０１０５】
（付記２）前記制御部は、
前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、前記第１プロセッサと前記第２プロセッサとが属するノードに含まれるメモリを用いた第２同期処理を実行することを決定することを特徴とする付記１に記載の並列演算装置。
【０１０６】
（付記３）前記並列演算システムは、さらに、前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する信号線を有し、
前記制御部は、
前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、前記第２同期処理を行う際に確保するメモリのサイズに応じた前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する信号線を用いた第３同期処理の処理性能と前記第２同期処理の処理性能との比較結果を参照して、前記第２同期処理を行う際に確保するメモリのサイズに基づいて、前記第３同期処理または前記第２同期処理のうちのいずれか一方を実行することを決定することを特徴とする付記２に記載の並列演算装置。
【０１０７】
（付記４）前記並列演算システムは、さらに、前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する信号線を有し、
前記第１処理と前記第２処理とは、所定の処理を繰り返す処理であって、
前記制御部は、
前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合、いずれかの処理を繰り返す回数に応じた前記各々のノードに含まれる複数のプロセッサの各々のプロセッサ同士を接続する信号線を用いた第３同期処理の処理性能と前記第２同期処理の処理性能との比較結果を参照して、前記第１処理と前記第２処理とが前記所定の処理を繰り返す回数に基づいて、前記第３同期処理または前記第２同期処理のうちのいずれか一方を実行することを決定することを特徴とする付記２または３に記載の並列演算装置。
【０１０８】
（付記５）前記並列演算装置は、前記第１プロセッサまたは前記第２プロセッサのうちのいずれか一方のプロセッサを含み、
前記第１プロセッサまたは前記第２プロセッサのうちの他方のプロセッサは、前記第１同期処理、または前記第１プロセッサと前記第２プロセッサとが同一のノードに属する場合に前記第１プロセッサと前記第２プロセッサとが属するノードに含まれるメモリを用いた第２同期処理を実行することを決定した他の並列演算装置に含まれることを決定することを特徴とする付記１〜４のいずれか一つに記載の並列演算装置。
【０１０９】
（付記６）各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み前記各々のノードの間のプロセッサ同士を接続する信号線を有する並列演算システムであって、
前記並列演算システム内のいずれかのプロセッサは、
前記並列演算システム内の第１処理を実行する第１プロセッサと、前記第１処理と同期する第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記信号線を用いた第１同期処理を実行することを決定する、
ことを特徴とする並列演算システム。
【０１１０】
（付記７）コンピュータに、
各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み前記各々のノードの間のプロセッサ同士を接続する信号線を有する並列演算システム内の第１処理を実行する第１プロセッサと、前記第１処理と同期する第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記信号線を用いた第１同期処理を実行することを決定する、
処理を実行させることを特徴とする並列演算プログラム。
【０１１１】
（付記８）コンピュータが、
各々のノードが複数のプロセッサとメモリとを有する複数のノードを含み前記各々のノードの間のプロセッサ同士を接続する信号線を有する並列演算システム内の第１処理を実行する第１プロセッサと、前記第１処理と同期する第２処理を実行する第２プロセッサとが異なるノードに属する場合、前記第１プロセッサと前記第２プロセッサとが前記信号線を用いた第１同期処理を実行することを決定する、
処理を実行することを特徴とする並列演算方法。
【符号の説明】
【０１１２】
ｃ０〜ｃ３  コア
ｈ  信号線
ｍ０、ｍ１  メモリ
１００  並列演算システム
５００  制御部
５０１  決定部
５０２  実行部
５１０  同期手法別性能情報
【図１】
0006372331.tif 000002
【図２】
0006372331.tif 000003
【図３】
0006372331.tif 000004
【図４】
0006372331.tif 000005
【図５】
0006372331.tif 000006
【図６】
0006372331.tif 000007
【図７】
0006372331.tif 000008
【図８】
0006372331.tif 000009
【図９】
0006372331.tif 000010
【図１０】
0006372331.tif 000011
【図１１】
0006372331.tif 000012
【図１２】
0006372331.tif 000013
【図１３】
0006372331.tif 000014
【図１４】
0006372331.tif 000015
【図１５】
0006372331.tif 000016
【図１６】
0006372331.tif 000017