(57)【特許請求の範囲】
【請求項１】
演算処理装置において、
プロセッサコア数および該プロセッサコア数のプロセッサコアを用いた場合の主記憶装置に対する前記演算処理装置のアクセス速度であるメモリアクセス速度の組を保持するテーブルと、
前記演算処理装置に備えられた複数のプロセッサコアに計算処理および前記計算処理に関する他の計算ノードとのネットワークインターフェースカードを介した通信処理を実行させる処理管理部と、
前記ネットワークインターフェースカードによる前記通信処理に要する通信時間と、前記プロセッサコアによる前記計算処理に要する計算時間とを測定し、前記通信時間が前記計算時間よりも長いか否かを判定し、前記通信時間が前記計算時間よりも長いと判定した場合に、前記プロセッサコアの数が増えるにつれて大きい値となる前記プロセッサコアによる前記計算処理に関する前記主記憶装置への第１のアクセス速度と、前記ネットワークインターフェースカードによる前記通信処理に関する前記主記憶装置への第２のアクセス速度とを測定し、前記第１のアクセス速度および前記第２のアクセス速度の合計が所定閾値以下となる前記第１のアクセス速度を与える前記プロセッサコアの数であるｘであって、前記プロセッサコアによる前記計算処理の実行開始後かつ前記計算処理の終了以前に前記通信処理を実行開始する並行実行をおこなうときの、前記演算処理装置が有する最大プロセッサコア数のプロセッサコアを用いた場合の前記計算時間および前記通信時間を測定し、前記測定した計算時間および前記測定した通信時間と、前記テーブルに保持されたプロセッサコア数およびメモリアクセス速度の組とから算出される、前記最大プロセッサコア数のプロセッサコアから前記主記憶装置への最大アクセス速度を、前記ｘ個のプロセッサコアから前記主記憶装置への最大アクセス速度で除算した除算値が、前記測定した通信時間を前記測定した計算時間で除算した値以下となる最大の前記ｘを算出する条件判定部と、
前記条件判定部により算出された前記ｘ個へ、前記計算処理を実行するプロセッサコアの数を制御するコア数制御部と
を備えたことを特徴とする演算処理装置。
【請求項２】
前記演算処理装置において、
前記条件判定部は、前記並行実行をおこなわないとき、前記プロセッサコアの数が制御された場合の、前記計算処理における前記主記憶装置へのアクセス総量と、前記プロセッサコアから前記主記憶装置への最大アクセス速度とを測定し、前記アクセス総量を前記最大アクセス速度で除算して求まる計算時間が、前記並行実行をおこなうとき、前記他の計算ノードとの通信データ総量と、前記他の計算ノードとの最大通信速度とを測定し、前記通信データ総量を前記最大通信速度で除算して求まる通信時間以下である場合に、前記プロセッサコアの数が制御された後に前記並列実行をおこなって測定した前記計算時間および前記通信時間の合計時間が前記プロセッサコアの数が制御される前に前記並行実行をおこなって測定した前記計算時間および前記通信時間の合計時間よりも小さいかを判定する
ことを特徴とする請求項１記載の演算処理装置。
【請求項３】
前記演算処理装置において、
前記条件判定部は、前記並行実行をおこなうときの、前記演算処理装置が有する最大プロセッサコア数のプロセッサコアを用いた場合の前記計算時間および前記通信時間を測定し、前記測定した計算時間および前記測定した通信時間と、前記テーブルに保持されたプロセッサコア数およびメモリアクセス速度の組から算出される、前記最大プロセッサコア数のプロセッサコアから前記主記憶装置への最大アクセス速度を、ｘ個へ前記プロセッサコアの数が制御されたプロセッサコアから前記主記憶装置への最大アクセス速度で除算した除算値が、前記測定した通信時間を前記測定した計算時間で除算した値以下となる最大の前記ｘを、前記並行実行をおこなう場合に用いる前記演算処理装置のプロセッサコアの数として算出する
ことを特徴とする請求項２記載の演算処理装置。
【請求項４】
前記演算処理装置において、
前記条件判定部は、前記演算処理装置が有する最大プロセッサコア数のプロセッサコアを用いて前記並列実行をおこなう場合に前記計算処理の実行開始から前記計算処理の実行終了および前記通信処理の実行終了までに要する第１の時間と、前記ｘ個のプロセッサコアを用いて前記並列実行をおこなう場合に前記計算処理の実行開始から前記計算処理の実行終了および前記通信処理の実行終了までに要する第２の時間とを測定し、前記第１の時間が前記第２の時間よりも小さい場合には、前記並列実行をおこなう場合に用いる前記プロセッサコアの数を前記最大プロセッサコア数とし、前記第１の時間が前記第２の時間以上である場合には、前記並列実行をおこなう場合に用いる前記プロセッサコアの数を前記ｘ個とする
ことを特徴とする請求項３記載の演算処理装置。
【請求項５】
前記演算処理装置はさらに、前記演算処理装置が実行したメモリアクセス数を計測する計測部を有し、
前記条件判定部は、前記演算処理装置が有する最大プロセッサコア数のプロセッサコアにより前記並列実行をおこなう際、前記計測部が計測したメモリアクセス数が所定値以上である場合に、前記プロセッサコアによる、前記計算処理に関する主記憶装置へのアクセスと、前記通信処理に関する前記主記憶装置へのアクセスとが競合していると判定し、
前記コア数制御部は、前記条件判定部により前記主記憶装置へのアクセスが競合していると判定された場合に、前記並列実行をおこなうプロセッサコアの数を、前記アクセスの競合により、前記演算処理装置における前記主記憶装置へのアクセス性能が低下しない、前記最大プロセッサコア数より小である数に制御する
ことを特徴とする請求項２〜４のいずれか１項に記載の演算処理装置。
【請求項６】
並列計算機システムが備える計算ノードにおいて、
プロセッサコア数および該プロセッサコア数のプロセッサコアを用いた場合の主記憶装置に対する演算処理装置のアクセス速度であるメモリアクセス速度の組を保持するテーブルと、
前記演算処理装置に備えられた複数のプロセッサコアに計算処理および前記計算処理に関する他の計算ノードとのネットワークインターフェースカードを介した通信処理を実行させる処理管理部と、
前記ネットワークインターフェースカードによる前記通信処理に要する通信時間と、前記プロセッサコアによる前記計算処理に要する計算時間とを測定し、前記通信時間が前記計算時間よりも長いか否かを判定し、前記通信時間が前記計算時間よりも長いと判定した場合に、前記プロセッサコアの数が増えるにつれて大きい値となる前記プロセッサコアによる前記計算処理に関する前記主記憶装置への第１のアクセス速度と、前記ネットワークインターフェースカードによる前記通信処理に関する前記主記憶装置への第２のアクセス速度とを測定し、前記第１のアクセス速度および前記第２のアクセス速度の合計が所定閾値以下となる前記第１のアクセス速度を与える前記プロセッサコアの数であるｘであって、前記プロセッサコアによる前記計算処理の実行開始後かつ前記計算処理の終了以前に前記通信処理を実行開始する並行実行をおこなうときの、前記演算処理装置が有する最大プロセッサコア数のプロセッサコアを用いた場合の前記計算時間および前記通信時間を測定し、前記測定した計算時間および前記測定した通信時間と、前記テーブルに保持されたプロセッサコア数およびメモリアクセス速度の組とから算出される、前記最大プロセッサコア数のプロセッサコアから前記主記憶装置への最大アクセス速度を、前記ｘ個のプロセッサコアから前記主記憶装置への最大アクセス速度で除算した除算値が、前記測定した通信時間を前記測定した計算時間で除算した値以下となる最大の前記ｘを算出する条件判定部と、
前記条件判定部により算出された前記ｘ個へ、前記計算処理を実行するプロセッサコアの数を制御するコア数制御部とを備えた複数の前記演算処理装置と、
前記複数の演算処理装置に接続され、前記計算ノードの計算処理による計算結果を記憶する前記主記憶装置を有することを特徴とする計算ノード。
【請求項７】
互いに接続された一の計算ノードと他の計算ノードを有する並列計算機システムにおいて、
前記一の計算ノードは、
プロセッサコア数および該プロセッサコア数のプロセッサコアを用いた場合の第１の主記憶装置に対する第１の演算処理装置のアクセス速度であるメモリアクセス速度の組を保持するテーブルと、
前記一の計算ノードが有する前記第１の演算処理装置に備えられた複数の第１のプロセッサコアに計算処理を実行させる第１の処理管理部と、
前記第１のプロセッサコアの前記第１の計算処理による第１の計算結果に関して前記他の計算ノードとの第１の通信処理を実行する第１の通信部と、
前記第１の通信部による第１の通信時間と、前記第１の計算処理に要する第１の計算時間とを測定し、前記第１の通信時間が前記第１の計算時間よりも長いか否かを判定し、前記第１の通信時間が前記第１の計算時間よりも長いと判定した場合に、前記第１のプロセッサコアの数が増えるにつれて大きい値となる前記第１のプロセッサコアによる前記第１の計算処理に関する前記第１の主記憶装置への第１のアクセス速度と、前記第１の通信部による前記第１の通信処理に関する前記第１の主記憶装置への第２のアクセス速度とを測定し、前記第１のアクセス速度および前記第２のアクセス速度の合計が所定閾値以下となる前記第１のアクセス速度を与える前記第１のプロセッサコアの数であるｘであって、前記第１のプロセッサコアによる前記第１の計算処理の実行開始後かつ前記第１の計算処理の終了以前に前記第１の通信処理を実行開始する並行実行をおこなうときの、前記第１の演算処理装置が有する最大プロセッサコア数のプロセッサコアを用いた場合の前記第１の計算時間および前記第１の通信時間を測定し、前記測定した第１の計算時間および前記測定した第１の通信時間と、前記テーブルに保持されたプロセッサコア数およびメモリアクセス速度の組とから算出される、前記最大プロセッサコア数の前記第１のプロセッサコアから前記第１の主記憶装置への最大アクセス速度を、前記ｘ個のプロセッサコアから前記第１の主記憶装置への最大アクセス速度で除算した除算値が、前記測定した第１の通信時間を前記測定した第１の計算時間で除算した値以下となる最大の前記ｘを算出する条件判定部と、
前記条件判定部により算出された前記ｘ個へ、前記第１の計算処理を実行する第１のプロセッサコアの数を制御するコア数制御部とを備えた複数の演算処理装置と、
前記複数の演算処理装置に接続され、前記一の計算ノードの計算処理による計算結果を記憶する前記第１の主記憶装置を有し、
前記他の計算ノードは、
前記他の計算ノードが有する第２の演算処理装置に備えられた複数の第２のプロセッサコアに第２の計算処理を実行させる第２の処理管理部と、
前記第２のプロセッサコアの前記第２の計算処理による第２の計算結果に関して前記一の計算ノードと通信する第２の通信部を有することを特徴とする並列計算機システム。
【請求項８】
並列計算機システムが備える計算ノードの各々に用いられる演算処理装置の演算処理方法において、
前記演算処理装置は、プロセッサコア数および該プロセッサコア数のプロセッサコアを用いた場合の主記憶装置に対する前記演算処理装置のアクセス速度であるメモリアクセス速度の組を保持するテーブルを有し、
前記演算処理装置が有する計算処理管理部が、複数のプロセッサコアに計算処理および前記計算処理に関する他の計算ノードとのネットワークインターフェースカードを介した通信処理を実行させるステップと、
前記演算処理装置が有する条件判定部が、前記ネットワークインターフェースカードによる前記通信処理に要する通信時間と、前記プロセッサコアによる前記計算処理に要する計算時間とを測定し、前記通信時間が前記計算時間よりも長いか否かを判定し、前記通信時間が前記計算時間よりも長いと判定した場合に、前記プロセッサコアの数が増えるにつれて大きい値となる前記プロセッサコアによる前記計算処理に関する前記主記憶装置への第１のアクセス速度と、前記ネットワークインターフェースカードによる前記通信処理に関する前記主記憶装置への第２のアクセス速度とを測定し、前記第１のアクセス速度および前記第２のアクセス速度の合計が所定閾値以下となる前記第１のアクセス速度を与える前記プロセッサコア数であるｘであって、前記プロセッサコアによる前記計算処理の実行開始後かつ前記計算処理の終了以前に前記通信処理を実行開始する並行実行をおこなうときの、前記演算処理装置が有する最大プロセッサコア数のプロセッサコアを用いた場合の前記計算時間および前記通信時間を測定し、前記測定した計算時間および前記測定した通信時間と、前記テーブルに保持されたプロセッサコア数およびメモリアクセス速度の組とから算出される、前記最大プロセッサコア数のプロセッサコアから前記主記憶装置への最大アクセス速度を、前記ｘ個のプロセッサコアから前記主記憶装置への最大アクセス速度で除算した除算値が、前記測定した通信時間を前記測定した計算時間で除算した値以下となる最大の前記ｘを算出するステップと、
前記演算処理装置が有するコア数制御部が、前記算出された前記ｘ個へ、前記計算処理を実行するプロセッサコアの数を制御するステップを有することを特徴とする演算処理装置の演算処理方法。
【請求項９】
並列計算機システムが備える複数の計算ノードの各々に用いられる演算処理装置の演算処理プログラムにおいて、
前記演算処理装置は、プロセッサコア数および該プロセッサコア数のプロセッサコアを用いた場合の主記憶装置に対する前記演算処理装置のアクセス速度であるメモリアクセス速度の組を保持するテーブルを有し、
前記演算処理装置に、
複数のプロセッサコアに計算処理および前記計算処理に関する他の計算ノードとのネットワークインターフェースカードを介した通信処理を実行させるステップと、
前記ネットワークインターフェースカードによる前記通信処理に要する通信時間と、前記プロセッサコアによる前記計算処理に要する計算時間とを測定し、前記通信時間が前記計算時間よりも長いか否かを判定し、前記通信時間が前記計算時間よりも長いと判定した場合に、前記プロセッサコアの数が増えるにつれて大きい値となる前記プロセッサコアによる前記計算処理に関する前記主記憶装置への第１のアクセス速度と、前記ネットワークインターフェースカードによる前記通信処理に関する前記主記憶装置への第２のアクセス速度とを測定し、前記第１のアクセス速度および前記第２のアクセス速度の合計が所定閾値以下となる前記第１のアクセス速度を与える前記プロセッサコア数であるｘであって、前記プロセッサコアによる前記計算処理の実行開始後かつ前記計算処理の終了以前に前記通信処理を実行開始する並行実行をおこなうときの、前記演算処理装置が有する最大プロセッサコア数のプロセッサコアを用いた場合の前記計算時間および前記通信時間を測定し、前記測定した計算時間および前記測定した通信時間と、前記テーブルに保持されたプロセッサコア数およびメモリアクセス速度の組とから算出される、前記最大プロセッサコア数のプロセッサコアから前記主記憶装置への最大アクセス速度を、前記ｘ個のプロセッサコアから前記主記憶装置への最大アクセス速度で除算した除算値が、前記測定した通信時間を前記測定した計算時間で除算した値以下となる最大の前記ｘを算出するステップと、
前記算出するステップにより算出された前記ｘ個へ、前記計算処理を実行するプロセッサコアの数を制御するステップを実行させることを特徴とする演算処理装置の演算処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置、計算ノード、並列計算機システム、演算処理方法および演算処理プログラムに関する。
【背景技術】
【０００２】
従来、計算処理を複数の計算ノードや複数のプロセッサコアに分散して並列に実行する並列計算機システムが用いられてきた。
【０００３】
かかる並列計算において、並列する計算の数や効率を評価する技術が知られている。一例として、複数のプロセッサからなるメッセージ通信を基本とした並列計算機において、ユーザプログラムを実行した結果（トレース）をもとにシミュレータを実行し、計算時間、通信時間などを求め、プロセッサ台数を評価する技術がある。また、プロセッサエミュレーションにより命令サイクル単位で処理を実行すると共に、ハードレベルの実行状態、通信路ごとのアクセス状態の時間を計測し、システム効率を評価する技術がある。また、プロセッサについて処理速度に関する情報を取得することも行なわれている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平６−５９９３９号公報
【特許文献２】特開平５−８８９１２号公報
【特許文献３】特開２００６−５３８３５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
並列計算機では、計算と通信を並行して実行する、すなわち計算と通信をオーバーラップさせることで高速化を図るものがある。このように計算と通信をオーバーラップさせる場合、計算と通信によるメモリアクセスが処理速度のボトルネックになる場合がある。すなわち、計算と通信の同時実行による競合のため、性能が劣化するという問題点があった。
【０００６】
開示の技術は、上述した従来技術にかかる問題点を解消するものであり、計算と通信の同時実行による競合に起因する性能劣化を抑えることを目的とする。
【課題を解決するための手段】
【０００７】
開示の演算処理装置、計算ノード、並列計算機システム、演算処理方法および演算処理プログラムは、演算処理装置に備えられた複数のプロセッサコアに計算処理を実行させ、プロセッサコアの計算処理による計算結果の他の計算ノードとの通信時間が、計算処理に要する計算時間よりも長いか否かを判定し、通信時間が計算時間よりも長いと判定した場合に、計算処理を実行するプロセッサコアの数を制限する。
【発明の効果】
【０００８】
開示の技術によれば、計算と通信の同時実行による競合に起因する性能劣化を抑えることができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、本実施例にかかる情報処理装置である計算ノードの機能ブロック図である。
【図２】図２は、並列計算機システムの説明図である。
【図３】図３は、計算ノードのハードウェア構成図である。
【図４】図４は、計算と通信の同時実行による高速化の説明図である。
【図５】図５は、マルチコア上で計算と通信の同時実行（オーバーラップ実行）を行う際のプログラムの説明図である。
【図６】図６は、通信がない場合（Ｖｎ＝０）のＶ，Ｖｅ，Ｖｃの関係の説明図である。
【図７】図７は、Ｖｍ，Ｖｃ，Ｖ，Ｖｅ，Ｖｎ，Ｖｎｅが計算ノードにおけるどの部分の速度を表すかについての説明図である。
【図８】図８は、メモリアクセスの説明図である。
【図９】図９は、Ｖ＋Ｖｎ＞Ｖｍの場合のメモリアクセス速度の説明図である。
【図１０】図１０は、スレッド数を調整しながら、計算と通信をオーバーラップ実行するコードの説明図である。
【図１１】図１１は、１ノード内での各コアの動作の説明図である。
【図１２】図１２は、上述したコア数とメモリアクセス速度の関係をもつＣＰＵを用いた場合の説明図である。
【図１３】図１３は、並列計算コードの説明図である。
【図１４】図１４は、本実施例にかかる演算処理方法のフローチャートである。（その１）
【図１５】図１５は、最適なコアｘの算出の詳細を説明するフローチャートである。
【図１６】図１６は、本実施例にかかる演算処理方法のフローチャートである。（その２）
【図１７】図１７は、計算と通信の同時実行に要する時間の、計算に使用するスレッド数を変更した場合の測定結果の説明図である。
【発明を実施するための形態】
【００１０】
以下に添付図面を参照して、本発明にかかる演算処理装置、計算ノード、並列計算機システム、演算処理方法および演算処理プログラムの実施の形態を詳細に説明する。
【実施例】
【００１１】
図１は、本実施例にかかる情報処理装置である計算ノード１の主要なハードウェアの構成要素と、ソフトウェアの構成要素との関係を示した機能プロック図である。図１に示した計算ノード１は、演算処理装置であるＣＰＵ（Central  Processing  Unit）１００、メモリ２１０、ネットワークインタフェースカード（ＮＩＣ）２３０が、メモリコントローラを有するチップセット２２０に接続した構成を有する。
【００１２】
ＣＰＵ１００は、コア１０，コア２０を含む複数のプロセッサコアを有する。コア１０は、ＣＰＵ１００のマスターとなるプロセッサコアであり、このコア１０内に実現された処理管理部１１、条件判定部１２、コア数制御部１３、計算処理部１４および通信処理部１５は以下の処理を実行する。処理管理部１１は、計算処理を分割して自コアと他のコアに分散して実行させる。条件判定部１２は、複数のプロセッサコアが計算結果の通信に要する通信時間が、計算処理に要する計算時間よりも長いかを判定する。また、条件判定部１２は、最適なプロセッサコア数をプログラム実行初期に算出する判定、最大プロセッサコア数での計算と通信の並列実行に要する時間とプロセッサコア数を制限した場合の計算と通信の並列実行に要する時間とを比較して使用するプロセッサコア数を求める判定、最大プロセッサコア数での計算と通信の並列実行時にハードウェアカウンタによって計測されたメモリアクセスがメモリ性能の所定比率以上であるかの判定などを行うこともできる。コア数制御部１３は、判定の結果、複数のプロセッサコアが計算結果の通信に要する通信時間が、計算処理に要する計算時間よりも長い場合値、計算処理を分散するプロセッサコアの数を制限する。
【００１３】
計算処理部１４は、処理管理部１１が自コア（コア１０）用に割り当てた計算処理を実行する処理部であり、通信処理部１５は、他の計算ノードと通信し、計算に必要なデータや計算処理結果を送受信する処理部である。
【００１４】
コア２０は、コア１０から計算処理の割り当てをうけるスレーブとなるプロセッサコアであり、処理管理部１１および計算処理部１４は、このコア２０を使って、マスターであるコア１０の処理管理部１１が自コアであるコア２０用に割り当てた計算処理を、他のコアであるコア１０および別のスレーブのコアの計算処理と同期をとることにより、整合的に実行する。コア２０の処理管理部１１は、自コア２０と他コア１０の計算処理が整合的に実行されるよう同期制御等を実行する処理部である。コア２０の計算処理部１４は、マスターであるコア１０の処理管理部１１から自コア２０用に割り当てられた計算処理を実行する処理部である。コア２０の処理管理部１１は、自コア２０用に割り当てられた計算処理が、他のコア１０および別のスレーブのコアの計算処理と同期をとって整合的に実行されるよう制御する。ここでは、スレーブのコアとしてコア２０を例示したが、スレーブのコアは任意の数を設けることができる。
【００１５】
図２に示したように、計算ノード１〜４は、スイッチ等を介し高速のネットワーク５で接続されて並列計算機システムを構成する。計算ノード２〜４は、計算ノード１と同様の構成を有する。
【００１６】
図３は、マルチコアプロセッサであるＣＰＵ１００の詳細内部構成を含む、計算ノードのハードウェア構成図である。ＣＰＵ１００は、４つのプロセッサコア、すなわちコア１０，２０，３０，４０を有する。加えて、プロセッサ部１００は、Ｌ２（Level2）キャッシュコントローラ５０，Ｌ２キャッシュＲＡＭ（Random  Access  Memory）６０を有する。
【００１７】
ＣＰＵ１００は、チップセット２２０を介して、メモリ２１０およびシステムバス１９０と接続する。システムバス１９０は、さらに、ＮＩＣ２３０、ドライブ装置１５０、補助記憶装置１４０、直接アクセス記憶１７０、操作入力１８０等と接続する。なお、本実施例では、ＮＩＣ２３０は、システムバスを介して、チップセット２２０と接続する構成としたが、システムバスを介することは本質ではなく、ＮＩＣ２３０をチップセット２２０に直結する構成であってもよい。
【００１８】
図１の計算ノードは、通信処理部１５がメッセージパッシングインターフェース（ＭＰＩ：Message  Passing  Interface）等を用いて計算プロセスを割り当てることでプロセス並列計算を行う。そして、図３のＣＰＵ内部の各プロセッサコアには、処理管理部１１がＯｐｅｎＭＰ等（処理管理部１１）を用いて計算スレッドを割り当てることでスレッド並列計算を行う。このようにプロセス並列とスレッド並列を同時に行うことをハイブリッド並列と呼ぶことがある。
【００１９】
基本的には、スレッド並列を行う際に設定されるスレッド数は最大の性能が期待されるので、スレッドを実行するプロセッサコア数と同等の値がスレッド数として設定される。また、同時マルチスレッディング機能（Simultaneous  Multithreading；SMT）を搭載したＣＰＵの場合にはプロセッサコア数の数倍のスレッド数が割り当てられる場合もある。
【００２０】
並列計算機上において並列計算をする際に問題になるのが、計算ノード間でのデータのやりとりのための通信による遅延であり、通信遅延が支配的になると並列計算による台数効果が得られず、高速な計算実行ができなくなる。
【００２１】
一方で、近年一般的なネットワークインターフェースカード（ＮＩＣ）には、ダイレクトメモリアクセス（ＤＭＡ）転送機能が搭載されており、通信の際のＣＰＵ負荷が少なくて済む。このＤＭＡ転送機能を用いて、ＣＰＵによる計算処理とＮＩＣによる通信を同時実行することで、通信遅延を隠蔽することができる。
【００２２】
図４は、計算と通信の同時実行による高速化の説明図である。図４に示したように、計算の後に通信を行う場合に比べ、計算と通信を同時に実行すると、実行時間が少なくて済む。
【００２３】
図５の（a）は、マルチコア上で計算と通信の同時実行（オーバーラップ実行）を行う際のプログラムの説明図である。ここで、communication  startでは通信を開始し、communication  waitでは通信の終了を待つ。通信とオーバーラップさせる形で、計算calculationをOpenMPによるスレッド並列によって実行する。
【００２４】
!OMP  PARALLEL  DOはOpenMPによる並列化（パラレルリージョン：マルチスレッドで実行されるプログラム領域）の開始を意味し、!OMP  END  PARALLEL  DOはOpenMPによる並列化の終了を意味する。
【００２５】
マルチコア上で計算と通信の同時実行するプログラムでは、図４の計算と通信を同時実行するケースに示したように、計算と通信がオーバーラップ実行される。一方、図５の（b）の計算実行後に通信を実行するプログラムでは、図４の計算の後に通信をするケースのように計算と通信をオーバーラップ実行されない。
【００２６】
計算と通信の同時実行による通信遅延の隠蔽に関しては、ＦＦＴ（Fast  Fourier  Transform：高速フーリエ変換）の計算と通信の同時実行による高速化手法などがある。
【００２７】
ここで、Ｖｍ，Ｖ，Ｖｅ，Ｖｎ，Ｖｎｅを以下のように定義する。なお、マルチコアＣＰＵ上の計算実行においては全てのコアを使用していることを前提とする。
【００２８】
Ｖｍ[Byte/s]：ＮＩＣもしくはＣＰＵまたはその双方からメモリへの最大アクセス速度であり、計算機システムのスペックに依存して決まるもの。
Ｖｃ[Byte/s]：ＣＰＵからメモリへの最大アクセス速度であり、計算機システムのスペックとＣＰＵ中の使用コア数に依存して決まるもの。常に、Ｖｃ≦Ｖｍを満たす。
Ｖ[Byte/s]：ＣＰＵ内の処理が必要とする、ＣＰＵからメモリへのアクセス速度。
Ｖｅ[Byte/s]：ＣＰＵからメモリへの実際のアクセス速度。Ｖ≧Ｖｃの場合には、計算機システムのスペック性能に律速され、ＣＰＵ内の処理に依存せず、同時に行っている通信がない場合には、Ｖｅ＝Ｖｃで飽和する。Ｖｅ≦Ｖｃを常に満たす。
Ｖｎ[Byte/s]：異なる２つの計算ノードのＮＩＣ間での通信速度の最大値で計算機システムのスペックに依存して決まるもの。ＮＩＣはＶｎの速度で別のノードのＮＩＣにデータを送信するために、メモリにもＶｎの速度でアクセスすることになる。Ｖｎ≦Ｖｍを常に満たす。
Ｖｎｅ[Byte/s]：異なる２つの計算ノードのＮＩＣ間での実際の通信速度。Ｖｎｅ≦Ｖｎを常に満たす。
【００２９】
図６は、通信がない場合（Ｖｎ＝０）のＶ，Ｖｅ，Ｖｃの関係の説明図である。図６に示したように、Ｖ，Ｖｅ，Ｖｃは以下を満たす。
Ｖｅ＝Ｖ      （Ｖ≦Ｖｃ）
Ｖｅ＝Ｖｃ    （Ｖ＞Ｖｃ）
【００３０】
図７は、Ｖｍ，Ｖｃ，Ｖ，Ｖｅ，Ｖｎ，Ｖｎｅが計算ノードにおけるどの部分の速度を表すかについての説明図である。
【００３１】
計算と通信の同時実行時には、計算においても通信においても、メモリへのアクセスが必要となる。その際、メモリコントローラを含むチップセットとメモリ間のアクセスバスを共有する。すなわち、計算と通信の同時実行時のメモリへのアクセス速度はＶｅ＋Ｖｎ（≦Ｖｍ）となる。
【００３２】
ここで、Ｖが十分に小さく、Ｖ＋Ｖｎ≦Ｖｍを満たしている場合には、計算によるメモリアクセスと通信によるメモリアクセスはほとんど干渉することなく、Ｖｅ＝Ｖ，Ｖｎｅ＝Ｖｎの速度で、同時実行される。
【００３３】
図８は、メモリアクセスの説明図である。図８では、Ｖ＋Ｖｎ≦Ｖｍの状況で、計算のみを行った場合と通信のみを行った場合と、計算と通信を同時実行した場合のメモリアクセス速度の例を示している。
【００３４】
Ｖが大きく、Ｖ＋Ｖｎ＞Ｖｍの場合には、資源不足のためＶ及びＶｎはそれぞれ、Ｖｅ＜Ｖ，Ｖｎｅ＜Ｖｎに減少する。その上、同時実行の競合による性能劣化が起き、全体としての転送速度も減少し、Ｖｅ＋Ｖｎｅ＜Ｖｍとなることがある。
【００３５】
Ｖ＋Ｖｎ＞Ｖｍの場合のメモリアクセス速度を図９に示す。図中ではＶｍ＝１０としている。この性能劣化によって、計算と通信の同時実行による高速化効果は目減りすることになる。
【００３６】
例えば、各ノードのＮＩＣ間での通信でＳｎ[Byte]のデータを通信し、計算においてＳ[Byte]のメモリアクセスをする時に、Ｖ＋Ｖｎ≦Ｖｍの場合の経過時間Ｔ[s]は、計算のためのメモリアクセス時間Ｓ／Ｖ[s]と通信のためのメモリアクセス時間Ｓｎ／Ｖｎ[s]のどちらか長い方と同等になる。つまり以下の式が成り立つ。
Ｔ＝ＭＡＸ（Ｓ／Ｖ，Ｓｎ／Ｖｎ）  ・・・（１）
【００３７】
しかしながら、Ｖ＋Ｖｎ＞Ｖｍの場合には、まず計算と通信の同時実行が、ＭＩＮ（Ｓ／Ｖｅ，Ｓｎ／Ｖｎｅ）で完了する。その後、同時実行時間内に送りきれなかった残りのデータＳ−ＶｅＳｎ／Ｖｎｅ[Byte]またはＳｎ−ＶｎｅＳ／Ｖｅ[Byte]を送信する。したがってトータルの経過時間Ｔは、
Ｔ＝Ｓｎ／Ｖｎｅ＋（Ｓ−ＶｅＳｎ／Ｖｎｅ）／Ｖ
＝Ｓｎ／Ｖｎｅ＋Ｓ／Ｖ−（Ｖｅ／Ｖ）Ｓｎ／Ｖｎｅ
＝Ｓ／Ｖ＋（１−Ｖｅ／Ｖ）Ｓｎ／Ｖｎｅ（Ｓ／Ｖｅ＞Ｓｎ／Ｖｎｅ）・・・（３）
Ｔ＝Ｓ／Ｖｅ＋（Ｓｎ−ＶｎｅＳ／Ｖｅ）／Ｖｎ
＝Ｓ／Ｖｅ＋Ｓｎ／Ｖｎ−（Ｖｎｅ／Ｖｎ）Ｓ／Ｖｅ
＝Ｓｎ／Ｖｎ＋（１−Ｖｎｅ／Ｖｎ）Ｓ／Ｖｅ（Ｓ／Ｖｅ＜Ｓｎ／Ｖｎｅ）・・・（４）
となり、全体の経過時間が式（１）に比べ、Ｖｅ，Ｖｎｅに応じて、（１−Ｖｅ／Ｖ）Ｓｎ／Ｖｎｅ[s]，または、（１−Ｖｎｅ／Ｖｎ）Ｓ／Ｖｅ[s]遅くなることになる。
【００３８】
転送性能が劣化するＶ＋Ｖｎ＞Ｖｍの状況にある場合に、計算に用いるメモリアクセスＶｅ（≦Ｖｃ（ｘ））を、使用コア数ｘを意図的に減少させ、転送性能が劣化しないＶｅ＋Ｖｎ≦Ｖｍの状況に持ち込むことで、メモリアクセスの競合による性能劣化を回避することができる。
【００３９】
ここで、Ｖｎｅの制御は通常は容易ではないため、Ｖｅの制御を使用コア数ｘを変えＶｅの最大値であるＶｃ（ｘ）（≧Ｖｅ）を変化させることで行うことを考える。その際、Ｓ／Ｖｅ＞Ｓｎ／Ｖｎｅ（通信時間よりも計算時間が長い）の場合にＶｅを減少させると全体の処理時間が延びてしまうことになる。そこでＳ／Ｖｅ＜Ｓｎ／Ｖｎｅ（通信時間のほうが計算時間よりも長い）の場合を対象にする。
【００４０】
システムの計算に用いるメモリアクセス速度の最大値Ｖｃ（ｘ）を測定するためのベンチマークは、任意のものを用いることができる。ベンチマークの一例として、ＳＴＲＥＡＭがある。１ＣＰＵあたり４コアのＣＰＵを２つ搭載したサーバ（１サーバあたり８コア搭載）の使用コア数ｘとメモリアクセス速度との関係Ｖｃ（ｘ）を測定すると、次のようになる。
使用コア数ｘ    メモリアクセス  Ｖｃ（ｘ）（ＭＢｙｔｅ／ｓ）
１              〜３７００
２              〜５５００
４              〜６２００
８              〜６２００
【００４１】
例示のシステムに関わらず、一般的には使用コア数が小さい場合には、メモリアクセス速度は小さく、Ｖｃ（ｘ）≦Ｖｃ（ｘ＋１）（１≦ｘ≦Ｎ＿ｃｏｒｅ）が成り立つ。ここで、Ｖｃ（Ｎ＿ｃｏｒｅ）（例示のシステムの場合、Ｎ＿ｃｏｒｅ＝８）はシステムのメモリバスを全て使っており、かつ、通信も行っていないため、Ｖｍと等しくなる。
【００４２】
また、通信のためのメモリアクセス速度（＝通信速度）Ｖｎを所定のベンチマークによって測定したところ、約１２００ＭＢ／ｓの値であった。
【００４３】
上述したコア数とメモリアクセス速度の性質を利用すれば、計算に使用するプロセッサコアの数ｘを減少させることで、計算に用いるメモリアクセス速度Ｖｅ（≦Ｖｃ（ｘ））を調整することができる。
【００４４】
ただし、コア数を減少させすぎると、通信時間よりも計算時間が長くなり、結果として全体の処理時間がむしろ遅くなる可能性があるので注意が必要である。
【００４５】
すなわち、Ｖｃ（Ｎ＿ｃｏｒｅ）を適切なＶｃ（ｘ）に変更することにより、メモリアクセスの競合を起こさないための以下の条件式（５）を満たし、且つ、処理時間が元々の処理時間よりも短いという以下の条件式（６）を満たせばよい。ここで、（５）が満たされるときには、Ｖ（ｘ）＞Ｖｃ（ｘ）の場合にはＶｅ＝Ｖｃ（ｘ）となる。Ｖ（ｘ）＜Ｖｃ（ｘ）の場合にはＶｅ＝Ｖ（ｘ）となる。
【００４６】
Ｖｃ（ｘ）＋Ｖｎ≦Ｖｍ・・・（５）
ＭＡＸ（Ｓ／Ｖｃ（ｘ），Ｓｎ／Ｖｎ）≦Ｓｎ／Ｖｎ＋（１−Ｖｎｅ／Ｖｎ）Ｓ／Ｖｅ・・・（６）
【００４７】
本発明は、以上の考えに基づき、条件判定部１２によって、メモリアクセの競合により転送性能が劣化するＶ＋Ｖｎ＞Ｖｍの状況にあるかを判定し、Ｖ＋Ｖｎ＞Ｖｍの状況にあると判定された場合に、コア数制御部１３によって、計算処理を分散するコア数を制限することで、性能劣化を回避することを特徴とする。さらに、本実施例では、上記の式（５）、（６）に基づいて、そのような状況を回避する上で最適なコア数ｘを、条件判定部１２で決定する。そして、ｘ個のコアに計算処理を分散するように、コア数制御部１３が制御する。なお、使用コア数の変更は、各コアに割り当てるスレッド数の調整によって行う。スレッド数の調整には、例えば、ＯｐｅｎＭＰに準じた処理管理部１１を用いる場合は、ｏｍｐ＿ｓｅｔ＿ｎｕｍ＿ｔｈｒｅａｄｓ  関数をプログラム中で用いる等の方法がある。
【００４８】
スレッド数を調整しながら、計算と通信をオーバーラップ実行するコードの例が図１０である。ここで、ｘは、ｏｍｐ＿ｓｅｔ＿ｎｕｍ＿ｔｈｒｅａｄｓによって適切な値を指定する。
【００４９】
図１０のコードを実行している際の各ＣＰＵの動作を図１１に示す。通信の命令ｃｏｍｍｕｎｉｃａｔｉｏｎ＿ｓｔａｒｔとｃｏｍｍｕｎｉｃａｔｉｏｎ＿ｗａｉｔは、通信処理部１５の呼び出しに、ｏｍｐ＿ｓｅｔ＿ｎｕｍ＿ｔｈｒｅａｄｓ（ｘ）は、コア数制御部１３の呼び出しに相当し、マスタースレッドが割り当てられているコア０（例えばコア１０）が行う。その後、パラレルリージョン（!OMP  PARALLEL  DO〜!OMP  PARALLEL）の計算処理を、処理管理部１１が、ｏｍｐ＿ｓｅｔ＿ｎｕｍ＿ｔｈｒｅａｄｓによって指定されたｘ個のコア０からコアｘ−１に振り分け、各コアの計算処理部１４が、計算を並列に実行する。
【００５０】
図１１は１ノード内での各コアの動作を示すが、複数ノード上でＭＰＩ等を用いてプロセス並列実行を行う際には、各ノード内で図１１と同様に各コアが動作する。
【００５１】
条件判定部１２が、上述の式（５）、（６）を満たす使用コア数ｘを見つけるために３通りの方法が考えられる。
【００５２】
＜方法０＞
実行可能なスレッド数１〜Ｎ＿ｃｏｒｅ（ＳＭＴの場合はＮ＿ｃｏｒｅの数倍）に関して、一旦全てに関して、該当するオーバーラップ部分を実行し経過時間Ｔ＿ｏｖｅｒ（ｘ）を測定して、最速のものを採用する。
【００５３】
しかしながら、この方法は最適なスレッド数の検索のための、最適でないスレッド数での実行によるオーバーヘッドが大きくなるために望ましくない。特に１６コアや３２コアなどのメニーコアＣＰＵ上ではオーバーヘッドが大きくなる。
【００５４】
そこで、無駄な検索を回避し、最適なコア数を簡単な測定と基準に基づいて決定する方法が方法１と方法２である。
【００５５】
＜方法１＞
次式（７）が満たされれば式（６）は成り立つ。
Ｓ／Ｖｃ（ｘ）≦Ｓｎ／Ｖｎ・・・（７）
なぜならば、
（７）⇔ＭＡＸ（Ｓ／Ｖｃ（ｘ），Ｓｎ／Ｖｎ）＝Ｓｎ／Ｖｎ
より、
（６）⇔Ｓｎ／Ｖｎ≦Ｓｎ／Ｖｎ＋（１−Ｖｎｅ／Ｖｎ）Ｓ／Ｖｅ
⇔  ０≦（１−Ｖｎｅ／Ｖｎ）Ｓ／Ｖｅ⇔Ｖｎｅ≦Ｖｎ
となるからである。
【００５６】
そこで、（６）の代わりに、両辺が容易に測定可能な式（７）を満たすｘを見つける。実際には、（７）を満たさず、Ｓｎ／Ｖｎ＜Ｓ／Ｖｃ（ｘ）であっても、次式を満たせば、（６）は満たされる。
（Ｓｎ／Ｖｎ＜）Ｓ／Ｖｃ（ｘ）≦Ｓｎ／Ｖｎ＋（１−Ｖｎｅ／Ｖｎ）Ｓ／Ｖｅ
【００５７】
しかしながら、ここでは、条件を限定することになるが、単純な測定で判定可能なため、式（７）を式（６）の代わりに判定条件として用いる。つまり、コア数の最適化後のコードが最適化前のコードよりも高速であるという条件を、計算と通信をオーバーラップしないときのコア数を減少させた計算時間が、計算と通信をオーバーラップしない時の通信時間以下であるという条件に置き換えることになる。
【００５８】
ここで、以下を定義する。
Ｔ＿ｃｏｍｍ＝Ｓｎ／Ｖｎ
Ｔ＿ｃａｌｃ＝Ｓ／Ｖｃ（Ｎ＿ｃｏｒｅ）
Ｔ＿ｃｏｍｍ，Ｔ＿ｃａｌｃはどちらも測定可能である。
次に、以下を定義する。
Ｒｃ（ｘ）＝Ｖｃ（Ｎ＿ｃｏｒｅ）／Ｖｃ（ｘ）
【００５９】
これらを用いて、（７）は以下のように書き換えられる。
（７）⇔Ｓ／Ｖｃ（ｘ）≦Ｓｎ／Ｖｎ
⇔Ｒｃ（ｘ）Ｔ＿ｃａｌｃ≦Ｔ＿ｃｏｍｍ
⇔Ｒｃ（ｘ）≦Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃ・・・（８）
【００６０】
つぎに、（５）を満たすためには、Ｖｃ（Ｎ＿ｃｏｒｅ）≦Ｖｍであるため、
（５）  Ｖｃ（ｘ）＋Ｖｎ≦Ｖｃ（Ｎ＿ｃｏｒｅ）
⇔Ｖｃ（ｘ）≦Ｖｃ（Ｎ＿ｃｏｒｅ）−Ｖｎ  ・・・（９）
より、（９）を満たせば、（５）は満たされる。
【００６１】
以上より、まず、
(I)  上述したコア数とメモリアクセス速度の関係を事前に測定し、テーブルＶｃ（ｘ），Ｒｃ（ｘ）を準備し、次に、
(II)  図５に示した計算実行後に通信を行なうコードよりＮ＿ｃｏｒｅを用いてオーバーラップしない際の計算と通信に要するそれぞれの時間Ｔ＿ｃａｌｃ，Ｔ＿ｃｏｍｍを測定し、Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃを算出する。その後、
(III)  式（８）Ｒｃ（ｘ）≦Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃを成り立たせ、かつ、式（９）Ｖｃ（ｘ）≦Ｖｃ（Ｎ＿ｃｏｒｅ）−Ｖｎを満たす最大のｘを算出し、その値を採用する。つまり、（８）を満たし、且つ、通信分のメモリ使用量を計算側で減少させることのできる最大のｘを採用することになる。
【００６２】
ここで、式（８）、式（９）を満たすｘの中で最大のものを選択する理由は、コア数を減少させすぎることで、ＣＰＵの処理速度が遅くなりすぎ、メモリアクセス速度ではなく、ＣＰＵの処理速度がボトルネックとなり計算が遅くなる可能性が考えられるためである。
【００６３】
例えば、上述したコア数とメモリアクセス速度の関係をもつＣＰＵを用いた場合の例について図１２に示した。Ｔ＿ｃｏｍｍ＝３[s]、Ｔ＿ｃａｌｃ＝２[s]の時、Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃ＝１．５となり、計算速度が１．５倍遅くなっても、通信よりも早く計算が終了することになる。一方で、上述したコア数とメモリアクセス速度の関係を参照すると、８コアから４コアにコア数を減少させることで、計算時間は１倍（Ｒｃ（４）＝１）に、８コアから２コアにコア数を減少させることで、計算時間は６２００／５５００＝１．１２倍（Ｒｃ（２）＝１．１２）に、８コアから１コアにコア数を減少させることで、計算時間は１．６７倍（Ｒｃ（１）＝１．６７）に遅くなることがわかる。
【００６４】
この場合、Ｒｃ（ｘ）≦１．５を満たす最大のｘはＲｃ（２）＝１．１２である２コアということになる。したがって、２コアを用いて計算を行えば、計算に用いるメモリバンド幅を節約した上で、通信が終了する以前に計算が終了することが期待される。
【００６５】
多くの並列計算コードは、基本的に同様の処理を繰り返し行う。たとえば、時間発展問題などがそれにあたる。図１３にコードの例を示した。ｔが繰り返し処理の各ステップをあらわす変数で、ｔ＝１からｔ＝Ｎｔまで同じ処理を繰り返す。したがって、計算開始前に(I)を行い、ｔ＝１の際に(II)を行い、ｔ＝２，…，Ｎｔに(III)を行えば、プログラムはその環境上で自己最適化を行うことになる。
【００６６】
ここで、上記の計算については、メモリアクセスがボトルネックとなり、メモリアクセス速度のみで性能が決まる場合を対象にしていることに注意が必要である。メモリアクセスがボトルネックでない計算に対して、同様の方法でコア数を決定しようとすると逆に遅くなる可能性がある。なぜならば、使用コア数を減少させると、メモリアクセスがボトルネックとなるような計算の場合以上に計算速度が遅くなってしまう場合があるためである。たとえば、上述したコア数とメモリアクセス速度の関係表に示したＣＰＵ上で、メモリアクセスがボトルネックとなるような計算では８コアでの実行時に比べ、１コアでの実行は１．６７倍しか遅くならないが、メモリアクセスがボトルネックでない計算では理想的には８倍遅くなることが想定される。
【００６７】
しかしながら、上記の計算については、メモリアクセスがボトルネックかどうかを判断することができないため、ｘ＝Ｎ＿ｃａｌｃで計算した場合と、上記方法で決定したｘで計算した場合とを比較し、性能がより高くなるケースを採用する必要がある。
【００６８】
以上の点を考慮した、方法１のフローチャートを図１４に示す。まず、マスターコアは、Ｖｃ（ｘ）、Ｒｃ（ｘ）、Ｖｎを取得し、ｔ＝１とする（Ｓ１０１）。つぎにオーバーラップ以外の部分を計算し（Ｓ１０２）、Ｔ＿ｃａｌｃの測定（Ｓ１０３）とＴ＿ｃｏｍｍの測定（Ｓ１０４）を行なう。さらにオーバーラップ以外の部分を計算し（Ｓ１０５）、Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃが１より大きいかを判定する（Ｓ１０６）。
【００６９】
Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃが１より大きければ（Ｓ１０６，Ｙｅｓ）、マスターコアは、最適なコア数ｘを算出し（Ｓ１０７）、ｔ＝２とする（Ｓ１０８）。そして、オーバーラップ以外の部分を計算し（Ｓ１０９）、計算にｘコアを用いてオーバーラップ実行し、経過時間Ｔ＿ｏｖｅｒ（ｘ）を測定する（Ｓ１１０）。
【００７０】
その後、オーバーラップ以外の部分を計算し（Ｓ１１１）、ｔ＝３として（Ｓ１１２）、さらにオーバーラップ以外の部分を計算する（Ｓ１１３）。その後、計算にＮ＿ｃｏｒｅを用いてオーバーラップ実行し、経過時間Ｔ＿ｏｖｅｒ（Ｎ＿ｃｏｒｅ）を測定する（Ｓ１１４）。その後、オーバーラップ以外の部分を計算し（Ｓ１１５）、Ｔ＿ｏｖｅｒ（ｘ）がＴ＿ｏｖｅｒ（Ｎ＿ｃｏｒｅ）より小さいかを判定する（Ｓ１１６）。
【００７１】
Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃが１以下である場合（Ｓ１０６，Ｎｏ）およびＴ＿ｏｖｅｒ（ｘ）がＴ＿ｏｖｅｒ（Ｎ＿ｃｏｒｅ）以上である場合（Ｓ１１６，Ｎｏ）、ｘ＝Ｎ＿ｃｏｒｅとする（Ｓ１１７）。
【００７２】
Ｔ＿ｏｖｅｒ（ｘ）がＴ＿ｏｖｅｒ（Ｎ＿ｃｏｒｅ）より小さい場合（Ｓ１１６，Ｙｅｓ）、またはステップＳ１１７の後、マスターコアは、ｔ＝ｔ＋１とし（Ｓ１１８）、オーバーラップ以外の部分を計算する（Ｓ１１９）。その後、計算にｘコアを用いてオーバーラップ実行し（Ｓ１２０）、オーバーラップ以外の部分を計算する（Ｓ１２１）。
【００７３】
その後、マスターコアは、ｔ＝Ｎｔであるかを判定し（Ｓ１２２）、ｔ＝Ｎｔでなければ（Ｓ１２２，Ｎｏ）ステップＳ１１８に戻り、ｔ＝Ｎｔとなった場合（Ｓ１２２，Ｙｅｓ）に処理を終了する。
【００７４】
図１５は、図１４に示した最適なコアｘの算出（Ｓ１０７）の詳細を説明するフローチャートである。マスターコアは、ｙ＝Ｎ＿ｃｏｒｅ−１，ｘ＝Ｎ＿ｃｏｒｅとおき（Ｓ２０１）、Ｒｃ（ｙ）≦Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃであるかを判定する（Ｓ２０２）。
【００７５】
Ｒｃ（ｙ）≦Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃであると判定された場合（Ｓ２０２，Ｙｅｓ）、マスターコアは、ｙ＝ｙ−１，ｘ＝ｙとし（Ｓ２０３）、Ｖｃ（ｘ）≦Ｖｃ（Ｎ＿ｃｏｒｅ）−Ｖｎであるかを判定する（Ｓ２０４）。Ｖｃ（ｘ）≦Ｖｃ（Ｎ＿ｃｏｒｅ）−Ｖｎでなければ（Ｓ２０４，Ｎｏ）、ステップ２０２に戻る。そして、Ｖｃ（ｘ）≦Ｖｃ（Ｎ＿ｃｏｒｅ）−Ｖｎであると判定された場合（Ｓ２０４，Ｙｅｓ）またはＲｃ（ｙ）≦Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃでない場合（Ｓ２０２，Ｎｏ）に、処理を終了する。
【００７６】
＜方法２＞「ハードウェアカウンタ値が取得可能な場合」
方法１では実際にはメモリアクセスの競合による性能劣化が発生していない場合に関しても最適な使用コア数を検索することになり無駄が発生する場合がある。そこで方法２では、ＣＰＵのハードウェアカウンタ値の値を取得できる環境を用意し、キャッシュミスの回数を表すカウンタ値から、計算と通信の同時実行時のメモリアクセスを測定し、その値がＶｍ付近（性能劣化や測定誤差を考慮し、例えばＶｍの１０％の範囲）の場合のみ、方法１を行う。
【００７７】
図１６は、方法２のフローチャートである。マスターコアは、Ｖｃ（ｘ）、Ｒｃ（ｘ）、Ｖｎを取得し、ｔ＝１とする（Ｓ３０１）。つぎにオーバーラップ以外の部分を計算し（Ｓ３０２）、計算にＮ＿ｃｏｒｅを用いてオーバーラップ実行し、経過時間Ｔ＿ｏｖｅｒ（Ｎ＿ｃｏｒｅ）を測定するとともに、ハードウェアカウンタからオーバーラップ時のメモリ使用量を測定する（Ｓ３０３）。その後、オーバーラップ以外の部分を計算し（Ｓ３０４）、メモリ使用量が０．９Ｖｍ以上であるならば（Ｓ３０５，Ｙｅｓ）、ｔ＝２とおく（Ｓ３０６）。その後、オーバーラップ以外の部分を計算し（Ｓ３０７）、Ｔ＿ｃａｌｃの測定（Ｓ３０８）とＴ＿ｃｏｍｍの測定（Ｓ３０９）を行なう。さらにオーバーラップ以外の部分を計算し（Ｓ３１０）、Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃが１より大きいかを判定する（Ｓ３１１）。
【００７８】
Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃが１より大きければ（Ｓ３１１，Ｙｅｓ）、マスターコアは、最適なコア数ｘを算出し（Ｓ３１２）、ｔ＝３とする（Ｓ３１３）。そして、オーバーラップ以外の部分を計算し（Ｓ３１４）、計算にｘコアを用いてオーバーラップ実行し、経過時間Ｔ＿ｏｖｅｒ（ｘ）を測定する（Ｓ３１５）。
【００７９】
その後、オーバーラップ以外の部分を計算し（Ｓ３１６）、Ｔ＿ｏｖｅｒ（ｘ）がＴ＿ｏｖｅｒ（Ｎ＿ｃｏｒｅ）より小さいかを判定する（Ｓ３１７）。
【００８０】
メモリ使用量が０．９Ｖｍ未満である場合（Ｓ３０５，Ｎｏ）、Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃが１以下である場合（Ｓ３１１，Ｎｏ）およびＴ＿ｏｖｅｒ（ｘ）がＴ＿ｏｖｅｒ（Ｎ＿ｃｏｒｅ）以上である場合（Ｓ３１７，Ｎｏ）、ｘ＝Ｎ＿ｃｏｒｅとする（Ｓぬ８）。
【００８１】
Ｔ＿ｏｖｅｒ（ｘ）がＴ＿ｏｖｅｒ（Ｎ＿ｃｏｒｅ）より小さい場合（Ｓ３１７，Ｙｅｓ）、またはステップＳ３１８の後、マスターコアは、ｔ＝ｔ＋１とし（Ｓ３１９）、オーバーラップ以外の部分を計算する（Ｓ３２０）。その後、計算にｘコアを用いてオーバーラップ実行し（Ｓ３２１）、オーバーラップ以外の部分を計算する（Ｓ３２２）。
【００８２】
その後、マスターコアは、ｔ＝Ｎｔであるかを判定し（Ｓ３２３）、ｔ＝Ｎｔでなければ（Ｓ３２３，Ｎｏ）ステップＳ３１９に戻り、ｔ＝Ｎｔとなった場合（Ｓ３２３，Ｙｅｓ）に処理を終了する。
【００８３】
以上の方法１，２によって、計算と通信の同時実行時に問題となっていた、計算のためのメモリアクセスと通信のためのメモリアクセスとの競合による性能劣化を、使用コア数を適切に制限し計算のためのメモリアクセスを減らすことで、回避できるようになった。これによりアプリケーションの高速化が可能となる。
【００８４】
図１７は、サーバにおける、計算と通信の同時実行に要する時間の、計算に使用するスレッド数（＝コア数）を変更した場合の測定結果の一例である。同じケースをオーバーラップせずに測定した、計算時間と通信時間はそれぞれ、Ｔ＿ｃａｌｃ＝０．２１、Ｔ＿ｃｏｍｍ＝０．８６となった。したがって、Ｔ＿ｃｏｍｍ／Ｔ＿ｃａｌｃ＝４．１３となる。この場合最適なコア数を決めるとｘ＝１となる。このケースでは、１スレッドで実行したケースが８スレッドで実行したケースに比べ、０．０６秒速く、最速である。
【００８５】
また、方法２によれば、本発明の効果が見込める、計算と通信によるメモリアクセスが、システムによるメモリ性能の限界近くまで使用されているケースにおいてのみ、方法１を適用すればよいので、無駄な検証作業を回避できる。
【００８６】
以上説明してきたように、演算処理装置、計算ノード、並列計算機システム、演算処理方法および演算処理プログラムは、処理管理部１１が複数のプロセッサコアに計算処理を分散して実行させる。そして、複数のプロセッサコアが計算結果の通信に要する通信時間が、計算処理に要する計算時間よりも長いかを条件判定部１２が判定する。判定の結果、複数のプロセッサコアが計算結果の通信に要する通信時間が、計算処理に要する計算時間よりも長い場合、最適なプロセッサコア数を条件判定部１２が算出し、計算処理を分散するプロセッサコアの数をコア数制御部１３が制限する。
【００８７】
このため、開示の技術では、計算と通信の同時実行による競合に起因する性能劣化を抑えることができる。
【符号の説明】
【００８８】
１〜４  計算ノード
５  ネットワーク
１０，２０，３０，４０  コア
１１  処理管理部
１２  条件判定部
１３  コア数制御部
１４  計算処理部
１５  通信処理部
５０  Ｌ２キャッシュコントローラ
６０  Ｌ２キャッシュＲＡＭ
１００  ＣＰＵ
１２０  記憶部
１３０  通信部
１４０  補助記憶装置
１５０  ドライブ装置
１６０  メモリアクセス制御部
１９０  システムバス
２１０  メモリ
２２０  チップセット
２３０  ＮＩＣ
【図１】
0005708003.tif 000002
【図２】
0005708003.tif 000003
【図３】
0005708003.tif 000004
【図４】
0005708003.tif 000005
【図５】
0005708003.tif 000006
【図６】
0005708003.tif 000007
【図７】
0005708003.tif 000008
【図８】
0005708003.tif 000009
【図９】
0005708003.tif 000010
【図１０】
0005708003.tif 000011
【図１１】
0005708003.tif 000012
【図１２】
0005708003.tif 000013
【図１３】
0005708003.tif 000014
【図１４】
0005708003.tif 000015
【図１５】
0005708003.tif 000016
【図１６】
0005708003.tif 000017
【図１７】
0005708003.tif 000018