(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-02-20
(45)【発行日】2024-02-29
(54)【発明の名称】情報処理装置および並列演算プログラム
(51)【国際特許分類】
G06F 15/173 20060101AFI20240221BHJP
【FI】
G06F15/173 660C
G06F15/173 660B
G06F15/173 683B
(21)【出願番号】P 2019212155
(22)【出願日】2019-11-25
【審査請求日】2022-07-08
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】成林 晃
(72)【発明者】
【氏名】野瀬 貴史
【審査官】坂東 博司
(56)【参考文献】
【文献】米国特許出願公開第2011/0225226(US,A1)
【文献】特許第5056844(JP,B2)
【文献】米国特許出願公開第2010/0017420(US,A1)
【文献】米国特許第06038604(US,A)
【文献】米国特許出願公開第2009/0067334(US,A1)
【文献】特開平11-110362(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 15/173
(57)【特許請求の範囲】
【請求項1】
複数のプロセスの各々に対して固有の仮想ランク番号を記憶する記憶部と、
プロセス間の全対全通信の初期設定時に、ハードウェア情報から各プロセスに固有のノード順プロセス番号を生成し、前記ノード順プロセス番号を基に各プロセスの前記仮想ランク番号を算出して前記記憶部に格納し、前記複数のプロセスにおけるプロセス間の全対全通信処理時に、前記記憶部に記憶された前記仮想ランク番号と全対全通信のステップ数とに基づく排他的論理和演算を行うことで現ステップにおける通信先のプロセス
の前記ノード順プロセス番号を各プロセスに対して決定し、
各プロセスに対して決定した、前記通信先のプロセスの前記ノード順プロセス番号を基に各プロセスの前記通信先のプロセスの前記仮想ランク番号を算出し、各プロセスに対して決定した、前記通信先のプロセスの前記仮想ランク番号に基づいて、各プロセスから前記通信先のプロセスに対する通信を行う処理部と、
を有する情報処理装置。
【請求項2】
前記処理部は、前記複数のプロセスそれぞれによる前記通信の完了の同期を取る処理を行い、前記ステップ数をインクリメントする、請求項1記載の情報処理装置。
【請求項3】
前記ハードウェア情報は、前記複数のプロセスを実行する複数のノードそれぞれのノード番号と、各ノードに含まれる複数のコアそれぞれのコア番号とを含み、
前記処理部は、前記複数のプロセスそれぞれが割り当てられたコアの前記コア番号を取得し、前記ハードウェア情報に基づいて、前記コア番号に対応する前記ノード番号の順に、前記コアに割り当てられたプロセスの前記ノード順プロセス番号を生成する、
請求項1記載の情報処理装置。
【請求項4】
前記処理部は、
前記複数のプロセスを実行する複数のノードと、前記複数のノードが接続され、時計回りの第1通信路と反時計回りの第2通信路とを備えるリングバスと、を有し、
前記排他的論理和演算により各プロセスに対する前記通信先のプロセスを決定することで、前記第1通信路の一部の区間および前記第2通信路の一部の区間がプロセスの2以上の組の通信により共有されることを回避する、
請求項1記載の情報処理装置。
【請求項5】
前記処理部は、
前記仮想ランク番号と前記ステップ数とに基づく第1の排他的論理和演算を行うことで現ステップにおけるデータ送信先のプロセスを各プロセスに対して決定し、
前記仮想ランク番号と前記ステップ数とに基づく第2の排他的論理和演算を行うことで現ステップにおけるデータ送信元のプロセスを各プロセスに対して決定し、
各プロセスによる前記データ送信先のプロセスへのデータ送信、および、前記データ送信元のプロセスからのデータ受信を実行する、
請求項1記載の情報処理装置。
【請求項6】
前記処理部は、前記仮想ランク番号を算出した後に、前記複数のプロセスの数が減ると、残りのプロセスの前記ノード順プロセス番号および前記仮想ランク番号を更新する、請求項1記載の情報処理装置。
【請求項7】
コンピュータに、
複数のプロセスにおけるプロセス間の全対全通信の初期設定時に、ハードウェア情報から各プロセスに固有のノード順プロセス番号を生成し、前記ノード順プロセス番号を基に各プロセスの仮想ランク番号を算出して記憶部に格納し、
前記複数のプロセスにおけるプロセス間の全対全通信処理時に、前記記憶部に記憶された前記仮想ランク番号と全対全通信のステップ数とに基づく排他的論理和演算を行うことで現ステップにおける通信先のプロセス
の前記ノード順プロセス番号を各プロセスに対して決定し、
各プロセスに対して決定した、前記通信先のプロセスの前記ノード順プロセス番号を基に各プロセスの前記通信先のプロセスの前記仮想ランク番号を算出し、
各プロセスに対して決定した、前記通信先のプロセスの前記仮想ランク番号に基づいて、各プロセスから前記通信先のプロセスに対する通信を行う、
処理を実行させる並列演算プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は情報処理装置および並列演算プログラムに関する。
【背景技術】
【0002】
計算量の大きな問題を複数の小さな問題に分割し、ネットワークに接続された複数の情報処理装置を並列に動作させて計算する並列処理システムがある。並列処理システムを利用する場合、計算途中において情報処理装置間で通信が発生することがある。そこで、並列処理システム用のアプリケーションプログラムを作成する際に、MPI(Message Passing Interface)ライブラリなどの通信ライブラリが利用されることがある。通信ライブラリを利用することで、ユーザは情報処理装置間の通信手順の詳細をアプリケーションプログラム中に記述しなくてよい。
【0003】
例えば、ネットワークで結合された分散メモリ型並列計算機内要素計算機間のデータ通信方法が提案されている。この提案では、n台の要素計算機が、各通信ステップで二台ずつの要素計算機の組による相互通信を行い、かつ各通信ステップでは以前の通信ステップにおける要素計算機の組とは異なる組を形成する。これにより、n回の通信ステップで各要素計算機内のデータを全ての要素計算機間で相互に送受信する全対全通信を行う。
【0004】
また、複数のプロセスが実行されるサーバによるクラスタシステムにおけるプロセス間通信方法が提案されている。提案のプロセス間通信方法では、サーバは、全対全のプロセス間通信の同一回の送信先サーバ決定において、複数のサーバが互いに異なるサーバを送信先サーバとして決定する。サーバは、当該送信先サーバで動作しているプロセスを順番に送信先プロセスとして決定し、決定された送信先プロセスに対して送信データを送信する。
【先行技術文献】
【特許文献】
【0005】
【文献】特開平11-110362号公報
【文献】特開2011-108202号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
情報処理装置に設けられた複数のノードにより複数のプロセスを並列に実行可能にすることが考えられる。複数のプロセスにより全対全通信を行う場合に、ユーザや所定のアプリケーションなどによってプロセス毎に予め付与された識別番号に基づいて、あるプロセスに対する通信先のプロセスが決定されることがある。当該識別番号はランク番号または単にランクなどと呼ばれる。しかし、ユーザや所定のアプリケーションなどによって予め付与された当該識別番号を用いて通信先を決定すると、プロセスの複数の組が並行して通信を行う際に、情報処理装置の内部の通信路で輻輳が発生することがある。
【0007】
1つの側面では、本発明は、輻輳の発生を抑えることができる情報処理装置および並列演算プログラムを提供することを目的とする。
【課題を解決するための手段】
【0008】
1つの態様では、情報処理装置が提供される。情報処理装置は、記憶部と処理部とを有する。記憶部は、複数のプロセスの各々に対して固有の仮想ランク番号を記憶する。処理部は、プロセス間の全対全通信の初期設定時に、ハードウェア情報から各プロセスに固有のノード順プロセス番号を生成し、ノード順プロセス番号を基に各プロセスの仮想ランク番号を算出して記憶部に格納し、複数のプロセスにおけるプロセス間の全対全通信処理時に、記憶部に記憶された仮想ランク番号と全対全通信のステップ数とに基づく排他的論理和演算を行うことで現ステップにおける通信先のプロセスのノード順プロセス番号を各プロセスに対して決定し、各プロセスに対して決定した、通信先のプロセスのノード順プロセス番号を基に各プロセスの通信先のプロセスの仮想ランク番号を算出し、各プロセスに対して決定した、通信先のプロセスの仮想ランク番号に基づいて、各プロセスから通信先のプロセスに対する通信を行う。
【0009】
また、1つの態様では、並列演算プログラムが提供される。
【発明の効果】
【0010】
1つの側面では、輻輳の発生を抑えることができる。
【図面の簡単な説明】
【0011】
【
図1】第1の実施の形態の情報処理装置の例を示す図である。
【
図2】第2の実施の形態の情報処理装置のハードウェア例を示す図である。
【
図6】ノードで実行されるプロセスの例を示す図である。
【
図8】発生しないルーティングの例を示す図である。
【
図9】輻輳が発生する通信パターンの例を示す図である。
【
図10】輻輳が発生しない通信パターンの例を示す図である。
【
図11】輻輳が多発する全対全通信の例を示す図である。
【
図12】輻輳が多発する全対全通信の例を示す図である。
【
図13】情報処理装置の処理例を示すフローチャートである。
【
図17】送信先の仮想ランク番号の計算例を示す図である。
【
図18】送信元の仮想ランク番号の計算例を示す図である。
【
図19】仮想ランク番号に基づく全対全通信の例を示す図である。
【
図20】仮想ランク番号に基づく全対全通信の例を示す図である。
【
図21】仮想ランク番号に基づく全対全通信の例を示す図である。
【
図22】仮想ランク番号に基づく全対全通信の例を示す図である。
【
図23】第3の実施の形態の仮想ランク番号の決定例を示す図である。
【
図24】仮想ランク番号に基づく全対全通信の例を示す図である。
【
図25】仮想ランク番号に基づく全対全通信の例を示す図である。
【
図26】仮想ランク番号に基づく全対全通信の例を示す図である。
【
図27】第4の実施の形態の仮想ランク番号の決定例を示す図である。
【
図28】送信先の仮想ランク番号の計算例を示す図である。
【
図29】仮想ランク番号に基づく全対全通信の例を示す図である。
【
図30】仮想ランク番号に基づく全対全通信の例を示す図である。
【発明を実施するための形態】
【0012】
以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
【0013】
図1は、第1の実施の形態の情報処理装置の例を示す図である。
情報処理装置1は、記憶部1a0,1a1,1a2,1a3と処理部1bとを有する。
記憶部1a0,1a1,1a2,1a3は、処理部1bの処理に用いられるデータを記憶する主記憶装置である。記憶部1a0,1a1,1a2,1a3としては、例えば、HBM(High Bandwidth Memory)2などのRAM(Random Access Memory)が用いられる。
【0014】
処理部1bは、ジョブに属する複数のプロセスを並列に実行する。処理部1bは、例えば、CPU(Central Processing Unit)などのプロセッサである。処理部1bは、複数のプロセッサコアを含む。処理部1bは、マルチコアプロセッサと呼ばれてもよい。プロセッサコアは、CPUコアあるいは単にコアと呼ばれることがある。処理部1bにおける複数のコアは、所定数単位にグループ化される。所定数のコアが属するグループはノードと呼ばれる。1つのノードにおいて、当該ノードに属する2以上のコアを用いて、2以上のプロセスを並列に実行することができる。処理部1bにおける各ノードは、処理部1b内のバスに接続される。
【0015】
例えば、処理部1bは、ノード1b0,1b1,1b2,1b3およびリングバス1b4を有する。ノード1b0,1b1,1b2,1b3は、それぞれが2以上のコアを有する。ただし、
図1では、コアの図示を省略している。ノード1b0は、記憶部1a0に接続される。ノード1b1は、記憶部1a1に接続される。ノード1b2は、記憶部1a2に接続される。ノード1b3は、記憶部1a3に接続される。ここで、記憶部1a0,1a1,1a2,1a3を総称して「記憶部」と呼ぶことができ、当該「記憶部」に記憶部1a0,1a1,1a2,1a3が含まれると言うこともできる。
【0016】
リングバス1b4は、ノード間の通信路である。リングバス1b4には、ノード1b0,1b2,1b3,1b1が、この順に、時計回りに、接続されている。
処理部1bは、ノード1b0,1b1,1b2,1b3により並列に情報処理を実行することができる。情報処理を実行している間、ノード1b0,1b1,1b2,1b3それぞれで実行されるプロセスは、他のプロセスに対してデータを送信することがある。プロセス間のデータ通信は、例えば、MPIなどの通信ライブラリによって実装される。プロセス間のデータ通信としては、複数のプロセスが一斉にデータ送信に参加する集団通信がある。集団通信には、各プロセスが全プロセスにデータを送信する全対全通信が含まれる。全対全通信は、プロセス間の一対一通信を組み合わせて実行される。すなわち、全対全通信は、通信の各ステップにおいて、各プロセスに対する通信先のプロセスを順次変更することで行われる。
【0017】
例えば、ノード1b0は、プロセスP0,P1を実行する。ノード1b1は、プロセスP2,P3を実行する。ノード1b2は、プロセスP4,P5を実行する。ノード1b3は、プロセスP6,P7を実行する。
【0018】
互いに異なるノード上にあるプロセスのペアは、リングバス1b4を介して通信する。リングバス1b4では、時計回りの通信路と、反時計回りの通信路とが独立に存在する。したがって、時計回りの通信と反時計回りの通信とは互いに干渉しない。また、ノード間の通信路のうち、ノード1b0,1b1,1b2,1b3それぞれとリングバス1b4とを接続する接続部分で利用可能な通信帯域は、リングバス1b4内部の通信路で利用可能な通信帯域に比べて十分に大きい。このため、当該接続部分においてノード側からリングバス1b4側への通信と、リングバス1b4側からノード側への通信が同時に発生しても輻輳は発生しないと考えてよい。
【0019】
リングバス1b4におけるルーティングは、送信元ノードおよび送信先ノードの組によって決まり、動的に変更されることはない。リングバス1b4におけるルーティングのルールは次の通りである。
【0020】
第1に、時計回りと反時計回りとで経路のホップ数が異なる場合は、ホップ数が小さい方の経路が使用される。
第2に、時計回りと反時計回りとで経路のホップ数が同じ場合は、ノード1b0とノード1b3との場合に反時計回りの経路、ノード1b1とノード1b2との場合に時計回りの経路がそれぞれ使用される。
【0021】
ここで、ホップ数は、リングバス1b4上で経由するノードの数である。例えば、ノード1b0から反時計回りにノード1b1にデータ送信する場合のホップ数は1である。また、ノード1b0からノード1b3に反時計回りにデータ送信する場合のホップ数は2である。ノード1b0からノード1b2に反時計回りにデータ送信する場合のホップ数は3である。
【0022】
ノード1b0,1b1,1b2,1b3には、ノード番号が予め付与されている。ノード1b0のノード番号は「#0」である。ノード1b1のノード番号は「#1」である。ノード1b2のノード番号は「#2」である。ノード1b3のノード番号は「#3」である。各ノードのノード番号は、回転移動や対称移動を行うことで上記のような順序となるように付与される。各ノードのノード番号を含むハードウェア情報は、記憶部1a0~1a3、あるいは、処理部1bに接続された所定の記憶装置(図示を省略している)に格納されている。
【0023】
処理部1bは、プロセス間の全対全通信の初期設定時に、ハードウェア情報から各プロセスに固有のノード順プロセス番号を生成する。ノード順プロセス番号は、プロセスP0~P7に対して、ノード番号の順に付与される番号である。1つのノードで複数のプロセスが実行される場合、処理部1bは、該当のノードにおける各プロセスに対して任意の順にノード順プロセス番号を付与する。
図1では、ノード順プロセス番号を「num」と表記している。
【0024】
例えば、ノード1b0は、プロセスP0に対してノード順プロセス番号num=0を生成する。ノード1b0は、プロセスP1に対してノード順プロセス番号num=1を生成する。ノード1b1は、プロセスP2に対してノード順プロセス番号num=2を生成する。ノード1b1は、プロセスP3に対してノード順プロセス番号num=3を生成する。ノード1b2は、プロセスP4に対してノード順プロセス番号num=4を生成する。ノード1b2は、プロセスP5に対してノード順プロセス番号num=5を生成する。ノード1b3は、プロセスP6に対してノード順プロセス番号num=6を生成する。ノード1b3は、プロセスP7に対してノード順プロセス番号num=7を生成する。
【0025】
処理部1bは、ノード順プロセス番号を基に各プロセスの仮想ランク番号を算出する。処理部1bは、算出した仮想ランク番号を記憶部に格納する。仮想ランク番号は、プロセス間の全対全通信を行う際に、通信先のプロセスの決定に用いられる情報である。
図1では、仮想ランク番号を「vrank」と表記している。仮想ランク番号は、ノード順プロセス番号に対する下記の式(1)によって求められる。ここで、式(1)はC言語の表記により記述されている。
【0026】
vrank=(num%2==0?num:size-num) ・・・(1)
sizeは、処理部1bにおけるプロセスの総数である。
図1の例では、size=8である。式(1)は次の意味をもつ。第1に、ノード順プロセス番号で偶数の番号が与えられたプロセスに対し、当該ノード順プロセス番号を仮想ランク番号とする。第2に、ノード順プロセス番号で奇数の番号が与えられたプロセスに対し、sizeからノード順プロセス番号を引いた値を仮想ランク番号とする。
【0027】
例えば、ノード1b0は、プロセスP0に対して仮想ランク番号vrank=0を算出する。ノード1b0は、プロセスP1に対して仮想ランク番号vrank=7を算出する。ノード1b1は、プロセスP2に対して仮想ランク番号vrank=2を算出する。ノード1b1は、プロセスP3に対して仮想ランク番号vrank=5を算出する。ノード1b2は、プロセスP4に対して仮想ランク番号vrank=4を算出する。ノード1b2は、プロセスP5に対して仮想ランク番号vrank=3を算出する。ノード1b3は、プロセスP6に対して仮想ランク番号vrank=6を算出する。ノード1b3は、プロセスP7に対して仮想ランク番号vrank=1を算出する。ノード1b0,1b1,1b2,1b3は、それぞれ記憶部1a0,1a1,1a2,1a3に、算出した仮想ランク番号を格納する。
【0028】
処理部1bは、複数のプロセスにおけるプロセス間の全対全通信処理時に、記憶部に記憶された仮想ランク番号と全対全通信のステップ数とに基づく排他的論理和演算を行うことで現ステップにおける通信先のプロセスを各プロセスに対して決定する。
【0029】
前述のように、全対全通信は、一対一通信の組み合わせにより行われる。全対全通信のステップ数は、全対全通信において複数回行われる通信のうち、何回目の通信であるかを示す。全対全通信のステップ数は0から数えるものとする。第1の実施の形態の例では、1個のプロセス当たり、自プロセスを含めて計8個のプロセスに対してデータ送信を行うので、全ステップ数は8となる。ここで、ステップ数を「step」と記述する。stepが取る値の範囲は、sizeが2の冪であるか、そうでないかにより変化する。sizeが2の冪のとき、stepは、0からsize-1の値を取る。この場合、ステップの個数を表す変数maxstepを、maxstep=sizeとする。また、sizeが2の冪でない場合、maxstepは、sizeよりも大きい最小の2の冪の数を取る。例えば、size=5のときは、5よりも大きな最小の2の冪の数は8であるので、ステップの個数は8(step=0~7)であり、maxstep=8となる。
【0030】
処理部1bは、仮想ランク番号vrankのプロセスに対するデータ送信先のプロセスのノード順プロセス番号num_dを、式(2)によって求める。式(2)では、排他的論理和演算(XOR)の演算子を「^」と表している。
【0031】
num_d=step^vrank ・・・(2)
処理部1bは、仮想ランク番号vrankのプロセスに対するデータ送信先のプロセスの仮想ランク番号を、式(1)のnumにnum_dを代入することで算出する。
【0032】
一対一通信では、各プロセスに対してデータ受信を行うためにデータ送信元のプロセスの指定も行われることがある。例えば、処理部1bは、各プロセスに対するデータ送信元のプロセスのノード順プロセス番号num_sを、式(3)によって求める。
【0033】
num_s=(step%2==0?step:maxstep-step)^vrank ・・・(3)
式(3)は次の意味をもつ。第1に、stepが偶数のとき、stepとvrankとの排他的論理和を取る。第2に、stepが奇数のとき、(maxstep-step)の値とvrankとの排他的論理和を取る。
【0034】
処理部1bは、仮想ランク番号vrankのプロセスに対するデータ送信元のプロセスの仮想ランク番号を、式(1)のnumにnum_sを代入することで算出する。
あるプロセスに対するデータ送信先プロセスの仮想ランク番号およびデータ送信元プロセスの仮想ランク番号は、該当のプロセスを実行するノードによって決定される。
【0035】
例えばstep=0の場合、各プロセスのデータ送信先のプロセスは次のようになる。
プロセスP0のデータ送信先は、プロセスP0である。プロセスP1のデータ送信先は、プロセスP7である。プロセスP2のデータ送信先は、プロセスP2である。プロセスP3のデータ送信先は、プロセスP5である。プロセスP4のデータ送信先は、プロセスP4である。プロセスP5のデータ送信先は、プロセスP3である。プロセスP6のデータ送信先は、プロセスP6である。プロセスP7のデータ送信先は、プロセスP1である。処理部1bは、各プロセスから該当のプロセスに対して決定したデータ送信先のプロセスへのデータの送信を並列に行う。処理部1bは、各プロセスによるデータ送信とともに、各プロセスによるデータ送信元のプロセスからのデータの受信も行う。処理部1bは、各プロセスによるstep=0の一対一通信が完了すると、ステップ数をインクリメントして、次のステップに進む。各プロセスによる一対一通信の完了の同期は、例えば1ステップ毎に行われる。ただし、各プロセスによる一対一通信の完了の同期は、複数ステップ毎に行われてもよい。
【0036】
例えばstep=1の場合、各プロセスのデータ送信先のプロセスは次のようになる。
プロセスP0のデータ送信先は、プロセスP1である。プロセスP1のデータ送信先は、プロセスP6である。プロセスP2のデータ送信先は、プロセスP3である。プロセスP3のデータ送信先は、プロセスP4である。プロセスP4のデータ送信先は、プロセスP5である。プロセスP5のデータ送信先は、プロセスP2である。プロセスP6のデータ送信先は、プロセスP7である。プロセスP7のデータ送信先は、プロセスP0である。処理部1bは、各プロセスから該当のプロセスに対して決定したデータ送信先のプロセスへのデータの送信とともに、各プロセスによるデータ送信元のプロセスからのデータの受信を行う。以降、同様に、処理部1bは、最終ステップに達するまで、プロセス間の一対一通信を実行することで、プロセス間の全対全通信を行う。
【0037】
情報処理装置1によれば、複数のプロセスにおけるプロセス間の全対全通信の初期設定時に、ハードウェア情報から各プロセスに固有のノード順プロセス番号が生成され、ノード順プロセス番号を基に各プロセスの仮想ランク番号が算出されて記憶部に格納される。複数のプロセスにおけるプロセス間の全対全通信処理時に、記憶部に記憶された仮想ランク番号と全対全通信のステップ数とに基づく排他的論理和演算を行うことで現ステップにおける通信先のプロセスが各プロセスに対して決定される。そして、各プロセスから通信先のプロセスに対する通信が行われる。
【0038】
これにより、輻輳の発生を抑えることができる。例えば、複数のプロセスの全対全通信を行う場合に、ユーザや所定のアプリケーションなどによってプロセス毎に予め付与された識別番号に基づいて、あるプロセスに対する通信先のプロセスを決定することも考えられる。しかし、予め付与された識別番号を使用すると、リングバス1b4における時計回りの経路の一部分、または、反時計回りの経路の一部分が、複数の一対一通信で共有されて、輻輳が発生する可能性が高まる。
【0039】
そこで、情報処理装置1では、ハードウェア情報に基づくノード順プロセス番号から算出される仮想ランク番号に基づいて、通信先のプロセスを決定する。仮想ランク番号を用いて、上記の式(1)~(3)により各プロセスに対する通信先プロセスを決定することで、リングバス1b4における時計回りの経路の一部分、または、反時計回りの経路の一部分が複数の一対一通信で共有される可能性を減らせる。
【0040】
例えば、上記のstep=0の場合では、プロセスP3からプロセスP5への時計回りの通信と、プロセスP5からプロセスP3への時計回りの通信とが、リングバス1b4上の時計回りの通信路を共有せずに行われる。また、プロセスP1からプロセスP7への反時計回りの通信と、プロセスP7からプロセスP1への反時計回りの通信とが、リングバス1b4上の反時計回りの通信路を共有せずに行われる。
【0041】
また、上記のstep=1の場合では、プロセスP3からプロセスP4への時計回りの通信と、プロセスP5からプロセスP2への時計回りの通信とが、リングバス1b4上の時計回りの通信路を共有せずに行われる。また、プロセスP1からプロセスP6への反時計回りの通信と、プロセスP7からプロセスP0への反時計回りの通信とが、リングバス1b4上の反時計回りの通信路を共有せずに行われる。他のstepについても同様に、リングバス1b4における時計回りの経路の一部分、または、反時計回りの経路の一部分が複数の一対一通信で共有されることを抑えられる。
【0042】
このように、情報処理装置1は、NUMA(Non-Uniform Memory Access)を意識した識別番号である仮想ランク番号を各プロセスに付与することで、全対全通信を構成する各一対一通信の発行順序を、輻輳が極力起きないように並び替えることができる。
【0043】
こうして、リングバス1b4における輻輳の発生を抑えることができる。その結果、全対全通信を高速化できる。また、ユーザやOS(Operating System)、通信ライブラリおよびジョブスケジューラなどの外部の要因による、各プロセスに対する識別番号の割り当てポリシーに依らずに、高速な全対全通信を行えるようになる。更に、情報処理装置1は、各プロセスに対する通信先のプロセスの決定を、排他的論理和を用いた単純な演算で行うので、当該通信先のプロセスの決定を高速に実行でき、全対全通信の高速化を図れる。
【0044】
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図2は、第2の実施の形態の情報処理装置のハードウェア例を示す図である。
【0045】
情報処理装置10は、CPU11およびメモリ12,13,14,15を有する。CPU11は、第1の実施の形態の処理部1bに対応する。メモリ12,13,14,15は、第1の実施の形態の記憶部1a0,1a1,1a2,1a3に対応する。
【0046】
CPU11は、ノード11a0,11a1,11a2,11a3およびリングバス11bを有する。CPU11のノード数は4つに限らず、他の数でもよい。
ノード11a0,11a1,11a2,11a3は、それぞれ複数のコアを有し、複数のコアにより同一ジョブに属する複数のプロセスを並列に実行する。
【0047】
リングバス11bは、ノード間の通信路である。リングバス11bは、ノード11a0,11a1,11a2,11a3が接続される。ノード11a0,11a1,11a2,11a3は、例えば、
図2で表されるようにCPU11が配置される基板面上に区画される。リングバス11bには、基板面を上方から見たときに、ノード11a0,11a2,11a3,11a1がこの順に時計回りに接続されている。ノード11a0,11a1,11a2,11a3それぞれには、ノード番号が付与されている。ノード11a0のノード番号は、「#0」である。ノード11a1のノード番号は、「#1」である。ノード11a2のノード番号は、「#2」である。ノード11a3のノード番号は、「#3」である。ここで、ノード番号は、回転移動や対称移動によって、時計回りに「#0」、「#2」、「#3」、「#1」の順になるように付与されていればよい。
【0048】
リングバス11bは、第1通信路11b0および第2通信路11b1を有する。第1通信路11b0は、時計回りの通信路である。第2通信路11b1は、反時計回りの通信路である。第1通信路11b0および第2通信路11b1は、物理的に独立して設けられている。第1通信路11b0による通信、および、第2通信路11b1による通信は互いに干渉しない。
【0049】
CPU11は、ノードとリングバスとの間を接続する接続バス11c0,11c1,11c2,11c3を有する。ノード11a0は、接続バス11c0を介して第1通信路11b0および第2通信路11b1に接続される。ノード11a1は、接続バス11c1を介して第1通信路11b0および第2通信路11b1に接続される。ノード11a2は、接続バス11c2を介して第1通信路11b0および第2通信路11b1に接続される。ノード11a3は、接続バス11c3を介して第1通信路11b0および第2通信路11b1に接続される。
【0050】
メモリ12,13,14,15は、それぞれノード11a0,11a1,11a2,11a3に接続される主記憶装置である。メモリ12,13,14,15としては、例えばHBM2などのRAMが用いられる。メモリ12,13,14,15は、それぞれノード11a0,11a1,11a2,11a3により実行されるプログラムやプログラムの処理に用いられるデータなどを記憶する。メモリ12,13,14,15は、送信データを記憶する送信バッファ、および、受信データを記憶する受信バッファとしても用いられる。
【0051】
ここで、情報処理装置10は、更に、CPU11の各ノードとメモリ12,13,14,15とを接続する接続バス16,17,18,19を有する。接続バス16は、ノード11a0とメモリ12とを接続する。接続バス17は、ノード11a1とメモリ13とを接続する。接続バス18は、ノード11a2とメモリ14とを接続する。接続バス19は、ノード11a3とメモリ15とを接続する。
【0052】
接続バス11c0~11c3,16~19で利用可能な通信帯域は、第1通信路11b0および第2通信路11b1で利用可能な通信帯域に比べて十分に大きい。このため、複数の通信が接続バス11c0~11c3,16~19を共有しても、輻輳は発生しない。
【0053】
図3は、ノードに属するコアの例を示す図である。
1つのノードは12個の演算用のコアを有する。
図3ではノード11a0のコアを例示するが、ノード11a1,11a2,11a3も同様に12個のコアを有する。ただし、各ノードは、主に各ノードの制御に用いられるアシスタントコアを、例えば1つずつ更に有してもよい。
【0054】
ノード11a0は、コアc0~c11を有する。ノード11a0は、コアc0~c11により複数のプロセスを実行可能である。1つのプロセスは1以上のコアにより実行される。1つのプロセスを複数のコアにより実行する場合、例えば、当該1つのプロセスに対応する複数のスレッドを複数のコアにより並列に実行することができる。なお、各ノードが有するコアの数は12個に限らず、他の数(例えば、2個や4個や16個など)でもよい。
【0055】
図4は、輻輳が発生しない通信の例を示す図である。
前述のように、リングバス11bでは、第1通信路11b0と第2通信路11b1とでは、干渉せずに通信を行える。このため、例えば、ノード11a2からノード11a3へのデータ送信と、ノード11a3からノード11a2へのデータ送信とが同時に行われたとしても、リングバス11bでは輻輳が発生しない。
【0056】
ここで、以下の説明では、リングバス11bにおける第1通信路11b0および第2通信路11b1の図示を省略することがある。
図5は、集団通信の例を示す図である。
【0057】
情報処理装置10におけるプロセス間の通信には、MPIライブラリなどの通信ライブラリが用いられる。当該通信ライブラリによるプロセス間の通信は、集団通信を含む。集団通信は、多数のプロセスが通信を行い、データのやり取りを行う通信である。例えば、集団通信における全対全通信は、全プロセスが他の全プロセスにそれぞれ異なるデータを送信することで、転置のような動作を実現する。
【0058】
例えば、送信バッファM1における行方向に各プロセス(ここでは、「プロセス0~3」とする)の送信データが格納されている。「プロセス0」の送信データは、データA1,A2,A3,A4である。「プロセス1」の送信データは、データB1,B2,B3,B4である。「プロセス2」の送信データは、データC1,C2,C3,C4である。「プロセス3」の送信データは、データD1,D2,D3,D4である。
【0059】
全対全通信の結果、受信バッファM2には「プロセス0~3」に対して次の受信データが格納される。「プロセス0」の受信データは、データA1,B1,C1,D1である。「プロセス1」の受信データは、データA2,B2,C2,D2である。「プロセス2」の受信データは、データA3,B3,C3,D3である。「プロセス3」の受信データは、データA4,B4,C4,D4である。
【0060】
集団通信は、一対一通信を組み合わせることで構成される。各プロセスは、一対一通信をプロセス数に相当する回数だけ行うことで、集団通信を実現する。ステップ数は、当該プロセス数回繰り返される通信のうち、何回目であるかを示す。ただし、アルゴリズムによっては、全体ステップ数がプロセス数にならないこともある。
【0061】
一対一通信では、送信側プロセスが送信先のプロセスを指定するだけでなく、受信側プロセスも、送信元のプロセスを指定することがある。その場合、一対一通信の組み合わせによる集団通信では、各プロセスは、送信先および送信元をステップ毎に求めて、通信コマンドを発行する。
【0062】
例えば、MPI規格における通信では、送信先プロセスおよび送信元プロセスの指定にランク番号またはランクと呼ばれる、各プロセスの識別子が用いられる。MPI規格の場合、送信側プロセス、受信側プロセスがそれぞれ送信関数、受信関数を呼び出すことにより一対一通信が行われる。このとき、送信関数に対して送信先プロセスのランク番号が指定され、受信関数に対して送信元プロセスのランク番号が指定され得る。
【0063】
ただし、各プロセスが送信先のプロセスを指定し、送信元のプロセスの指定を行わずにプロセス間の一対一通信を行う方法も考えられる。
図6は、ノードで実行されるプロセスの例を示す図である。
【0064】
第2の実施の形態の例では、ノード11a0~11a3それぞれは、2つのプロセスを並列に実行する。したがって、ノード11a0~11a3では、合計で8個のプロセスが並列に実行される。ただし、後述されるように、各ノードで並列に実行されるプロセスの数は、2以外でもよいし、一部ノードにおいて並列に実行されるプロセスの数が他のノードで並列に実行されるプロセスの数と異なっていてもよい。
【0065】
ノード11a0は、プロセスp0,p1を並列に実行する。ノード11a1は、プロセスp2,p3を並列に実行する。ノード11a2は、プロセスp4,p5を並列に実行する。ノード11a3は、プロセスp6,p7を並列に実行する。
【0066】
図7は、ルーティングの例を示す図である。
リングバス11bにおけるルーティングは、送信元ノードと送信先ノードとの組によってのみ決まり、動的にルーティングが変更されることはない。リングバス11bにおけるルーティングのルールは次の通りである。
【0067】
第1のルールは、時計回りと反時計回りとで経路のホップ数が異なる場合、ホップ数が小さい方の経路が使用されるというルールである。
第2のルールは、時計回りと反時計回りとで経路のホップ数が同じ場合、ノード11a0,11a3の組では反時計回りの経路が使用され、ノード11a1,11a2の組では時計回りの経路が使用されるというルールである。
【0068】
ここで、図中、時計回りの通信を実線の矢印で表し、反時計回りの通信を点線の矢印で表す。また、図中、プロセスを円で表す。円の中の数字はランク番号である。
図7~12の説明において、一例として、プロセスp0~p7それぞれに対し、ユーザや所定のソフトウェアにより、ランク番号「0」~「7」が予め付与されているものとする。
【0069】
図7(A)は、ルーティングの第1の例を示す。
図7(A)について、互いに隣接するノード間の通信には、最短経路が用いられる。互いに隣接するノード間の通信とは、例えば、ノード11a1とノード11a3との通信、ノード11a0とノード11a2との通信、ノード11a0とノード11a1との通信、および、ノード11a2とノード11a3との通信である。
【0070】
図7(B)は、ルーティングの第2の例を示す。
図7(B)について、ノード11a0とノード11a3との通信、および、ノード11a1とノード11a2との通信では、時計回りおよび反時計回りのどちらを選択してもホップ数は2である。この場合は、ノード11a1とノード11a2との通信では時計回りの経路(第1通信路11b0)が用いられる。また、ノード11a0とノード11a3との通信では反時計回りの経路(第2通信路11b1)が用いられる。
【0071】
図8は、発生しないルーティングの例を示す図である。
図8(A)は、発生しないルーティングの第1の例を示す。
図8(A)のルーティングは、互いに隣接するノード11a1,11a3の通信に最短経路が用いられておらず、
図7で説明したルーティングの第1のルールに反する。このため、リングバス11bでは、
図8(A)のルーティングは発生しない。
【0072】
図8(B)は、発生しないルーティングの第2の例を示す。
図8(B)のルーティングは、ノード11a0,11a3の通信に時計回りの経路が用いられている。また、ノード11a1,11a2の通信に反時計回りの経路が用いられている。すなわち、
図7で説明したルーティングの第2のルールに反する。このため、リングバス11bでは、
図8(B)のルーティングは発生しない。
【0073】
図9は、輻輳が発生する通信パターンの例を示す図である。
図9(A)は、輻輳が発生する通信パターンの第1の例を示す。
図9(A)の例では、プロセスp0からプロセスp2への通信とプロセスp1からプロセスp3への通信とが反時計回りの経路の一部を共有して行われている。この場合、リングバス11bの第2通信路11b1におけるノード11a0とノード11a1との間の区間で輻輳が発生する。
【0074】
図9(B)は、輻輳が発生する通信パターンの第2の例を示す。
図9(B)の例では、プロセスp6からプロセスp0への通信とプロセスp7からプロセスp5への通信とが反時計回りの経路の一部を共有して行われている。この場合、リングバス11bの第2通信路11b1におけるノード11a2とノード11a3との間の区間で輻輳が発生する。
【0075】
図10は、輻輳が発生しない通信パターンの例を示す図である。
図10(A)は、輻輳が発生しない通信パターンの第1の例を示す。
図10(A)の例では、プロセスp0からプロセスp2への反時計回りの通信と、プロセスp3からプロセスp1への時計回りの通信とが行われているが、リングバス11b上では、同一経路が共有されていない。すなわち、プロセスp0からプロセスp2への反時計回りの通信には第2通信路11b1が用いられ、プロセスp3からプロセスp1への時計回りの通信には第1通信路11b0が用いられる。時計回りの通信と反時計回りの通信とは干渉しないため、
図10(A)の通信パターンでは、輻輳が発生しない。
【0076】
図10(B)は、輻輳が発生しない通信パターンの第2の例を示す。
図10(B)の例では、プロセスp3からプロセスp7への反時計回りの通信と、プロセスp7からプロセスp0への反時計回りの通信とが行われているが、リングバス11b上では、反時計回りの経路で共有される部分はない。また、ノード11a3とリングバス11bとの間の経路(接続バス11c3)が共有されているが、前述のように、接続バス11c3が共有されても輻輳は起きない。このため、
図10(B)の通信パターンでは、輻輳が発生しない。
【0077】
図11は、輻輳が多発する全対全通信の例を示す図である。
図11,12では、
図7で例示した各プロセスのランク番号に基づいて全対全通信を行う例を説明する。ここでは、当該ランク番号に基づいて、単純なアルゴリズムで通信先が決定される例を示す。当該アルゴリズムでは、各プロセスは、自身のランク番号にステップ数を加算した値を8で割った剰余を、データ送信先のプロセスのランク番号とする。また、全対全通信のステップ数をstepと表記する。stepは0から1ずつ昇順に増えるものとする。
【0078】
図中、リングバス11bのうち、時計回りの通信に対応する実線の矢印が2本以上通っている区間、および、反時計回りの通信に対応する点線の矢印が2本以上通っている区間で輻輳が発生している。
【0079】
この例では、
図11に示されるstep=0~3のうち、step=2,3で輻輳が発生する。step=2では、次の箇所に輻輳が発生する。第1に、ノード11a3からノード11a0への反時計回りの経路部分である。第2に、ノード11a0からノード11a1への反時計回りの経路部分である。第3に、ノード11a1からノード11a2への時計回りの経路部分である。第4に、ノード11a2からノード11a3への時計回りの経路部分である。
【0080】
step=3では、次の箇所に輻輳が発生する。第1に、ノード11a2からノード11a0への反時計回りの経路部分である。第2に、ノード11a0からノード11a2への時計回りの経路部分である。
【0081】
step=3の次は、step=4に進む。
図12は、輻輳が多発する全対全通信の例を示す図である。
この例では、
図12に示されるstep=4~7のうち、step=4~6で輻輳が発生する。step=4では、次の箇所に輻輳が発生する。第1に、ノード11a2から11a0への反時計回りの経路部分である。第2に、ノード11a1からノード11a3への反時計回りの経路部分である。第3に、ノード11a0からノード11a2への時計回りの経路部分である。第4に、ノード11a3からノード11a1への時計回りの経路部分である。
【0082】
step=5では、次の箇所に輻輳が発生する。第1に、ノード11a1からノード11a3への反時計回りの経路部分である。第2に、ノード11a3からノード11a1への時計回りの経路部分である。
【0083】
step=6では、次の箇所に輻輳が発生する。第1に、ノード11a3からノード11a2への反時計回りの経路部分である。第2に、ノード11a0からノード11a3への反時計回りの経路部分である。第3に、ノード11a2からノード11a1への時計回りの経路部分である。第4に、ノード11a1からノード11a0への時計回りの経路部分である。
【0084】
図11,12で例示されるように、ユーザなどによって予め付与されたランク番号を用いて全対全通信を行うと、輻輳が多発する可能性がある。そこで、ノード11a0~11a3は、予め付与されたランク番号ではなく、CPU11におけるハードウェア構成に応じた仮想ランク番号を用いて全対全通信を行うことで、輻輳の発生を抑制する機能を提供する。
【0085】
情報処理装置10において全対全通信を行うための手順は次の2つに分かれる。第1に、仮想ランク番号の割り当てである。第2に、全対全通信の実行である。仮想ランク番号の割り当てでは、CPU11の初期化時や全対全通信の発行開始時に、ユーザなどにより予め付与されたランク番号とは別に、仮想ランク番号を割り当てる。仮想ランク番号は、全対全通信を行うための識別子として用いられる。すなわち、全対全通信を構成する一対一通信において、送信側プロセスは、送信関数を呼び出す際に、送信関数に対して送信先プロセスの仮想ランク番号を指定する。また、受信側プロセスは、受信関数を呼び出す際に、受信関数に対して送信元プロセスの仮想ランク番号を指定することがある。
【0086】
次に、情報処理装置10の全対全通信の処理手順の例を説明する。
図13は、情報処理装置の処理例を示すフローチャートである。
ここで、
図13では、ノード11a0のプロセスp0,p1に着目するが、ノード11a1,11a2,11a3上の他のプロセスも同様の処理を並列に実行する。また、図中、プロセスp0の処理に対応するプロセスp1の処理を、例えば、プロセスp0の「ステップS10」に対して、プロセスp1の「ステップS10a」のように、符号の末尾に「a」の文字を付して表記することがある。プロセスp1の各ステップにおける処理内容はプロセスp0と同様であるため、説明を省略する。下記のステップS10は、情報処理装置10により並列プログラムが実行開始されると実行される。並列プログラムの実行開始に応じて、並列プログラムのプロセスp0~p7が起動される。
【0087】
(S10)プロセスp0は、ユーザ定義プロセス番号を決定する。ユーザ定義プロセス番号は、ユーザなどによって予め付与されるランク番号に相当する。
(S11)プロセスp0は、プログラムの実行を開始する。
【0088】
(S12)プロセスp0は、並列プログラムの初期化処理を開始する。初期化処理は、下記のステップS13~S16を含む。
(S13)プロセスp0は、メモリ12に予め記憶されたハードウェア情報に基づいて、CPUコア番号を取得する。
【0089】
(S14)プロセスp0は、プロセス間で通信を行い、プロセスのランク番号とCPUコア番号とを対応付けた表データ(ランク番号表と呼ぶ)を作成し、メモリ12に格納する。
【0090】
(S15)プロセスp0は、各プロセスのノード順プロセス番号を決定する。ノード順プロセス番号は、ノード番号の昇順に、各ノードで実行されるプロセスに対して0から昇順に割り当てられる。メモリ12に記憶されるハードウェア情報には、ノード番号とCPUコア番号との対応関係を示す情報(CPUコア番号表)が含まれる。このため、プロセスp0は、CPUコア番号表とステップS14で作成したランク番号表とに基づいて、各プロセスに対するノード番号の順序を識別する。例えば、プロセスp0は、決定したノード順プロセス番号を記録したノード順プロセス番号表を作成し、メモリ12に格納してもよい。
【0091】
(S16)プロセスp0は、ノード順プロセス番号から仮想ランク番号を決定する。ノード順プロセス番号をnum、仮想ランク番号をvrankとすると、ノード順プロセス番号numに対応する仮想ランク番号vrankは、式(1)により表される。式(1)を再掲する。
【0092】
vrank=(num%2==0?num:size-num) ・・・(1)
第2の実施の形態の例ではsize=8である。例えば、プロセスp0は、決定した仮想ランク番号を記録した仮想ランク番号表を作成し、メモリ12に格納してもよい。
【0093】
(S17)プロセスp0は、並列プログラムの初期化処理を終了する。
(S18)プロセスp0は、ユーザにより定義された所定の演算を実行する。
(S19)プロセスp0は、全対全通信を開始する。プロセスp0は、ステップ数step=0に設定する。
【0094】
(S20)プロセスp0は、現在のステップ数stepに対応する通信相手のプロセスを、プロセスp0の仮想ランク番号に基づいて決定し、通信を実行する。通信相手のプロセスは、プロセスp0のデータ送信先のプロセスおよびプロセスp0へのデータ送信元のプロセスを示す。データ送信先のプロセスのノード順プロセス番号num_dは、データ送信元のプロセスの仮想ランク番号vrankを用いて式(2)により表される。式(2)を再掲する。
【0095】
num_d=step^vrank ・・・(2)
「^」は、両辺の値を2進数で表した値の排他的論理和演算を取ることを示す。プロセスp0は、プロセスp0からのデータ送信先のプロセスの仮想ランク番号を、式(1)のnumにnum_dを代入することで算出する。
【0096】
また、データ送信元のプロセスのノード順プロセス番号num_sは、データ送信先のプロセスの仮想ランク番号vrankを用いて、式(3)により表される。式(3)を再掲する。
【0097】
num_s=(step%2==0?step:maxstep-step)^vrank ・・・(3)
第2の実施の形態の例ではsize=8であり、maxstep=8である。
【0098】
プロセスp0は、プロセスp0へのデータ送信元のプロセスの仮想ランク番号を、式(1)のnumにnum_sを代入することで算出する。
(S21)プロセスp0は、stepが最終ステップに到達したか否かを判定する。第2の実施の形態の例では、step=7の場合に、最終ステップに到達したことになる。最終ステップに到達した場合、ステップS23に処理が進む。最終ステップに到達していない場合、ステップS22に処理が進む。
【0099】
(S22)プロセスp0は、stepに1を加算する。すなわち、プロセスp0は、ステップ数をインクリメントする。そして、ステップS20に処理が進む。
(S23)プロセスp0は、全対全通信を終了する。
【0100】
(S24)プロセスp0は、ユーザにより定義された所定の演算を実行する。
(S25)プロセスp0は、プログラムの演算を終了する。同様に他のプロセスの演算も終了し、並列プログラムの実行が終了する。
【0101】
このようにして、プロセスp0~p7は、仮想ランク番号に基づいて全対全通信を行う。ステップS20では、CPU11は、各プロセスの仮想ランク番号とステップ数とに基づく式(2)の排他的論理和演算を行うことで現ステップにおけるデータ送信先のプロセスを該当のプロセスに対して決定する。また、CPU11は、各プロセスの仮想ランク番号とステップ数とに基づく式(3)の排他的論理和演算を行うことで現ステップにおけるデータ送信元のプロセスを該当のプロセスに対して決定する。CPU11は、各プロセスによるデータ送信先のプロセスへのデータ送信、および、データ送信元のプロセスからのデータ受信を実行する。
【0102】
プロセスp0~p7は、ステップS24,S24aの後に、再度、全対全通信を行ってもよい。例えば、プロセスp0~p7は、ステップS18~S23に相当する処理を、複数回繰り返して実行してもよい。
【0103】
また、ステップS20における各プロセスによる一対一通信の完了の同期を取る処理は、例えば、各プロセスによって全対全通信の1ステップ毎に、プロセス間で所定の通知を送受信することで行われる。CPU11は、当該同期を取る処理を行った後に、ステップ数をインクリメントする。CPU11は、全対全通信の複数ステップ毎に、同期を取る処理を行うようにしてもよい。また、プロセス間の一対一通信の所要時間が、通信を行うプロセスの組毎にほぼ同一である場合も考えられる。この場合、あるプロセス間での一対一通信が完了した場合には、他のプロセス間での一対一通信も完了しているので、CPU11は、各プロセスによる一対一通信の完了の同期を取る処理を行わないようにしてもよい。その場合、例えば、各プロセスは、自身による一対一通信が完了すると、ステップ数をインクリメントして、次のステップに進む。
【0104】
図14は、データ構造例を示す図である。
図14(A)は、CPUコア番号表121を示す。CPUコア番号表121は、ノードのノード番号と当該ノードに含まれるコアのCPUコア番号との対応関係を示すハードウェア情報である。CPUコア番号は、CPU11内で各コアに対して一意に付与されたコアの識別番号である。CPUコア番号表121は、例えば、メモリ12,13,14,15に予め格納される。ただし、CPUコア番号表121は、ノード11a0~11a3により参照可能な、メモリ12,13,14,15以外の他のメモリに予め格納されてもよい。
【0105】
CPUコア番号表121は、ノード番号およびCPUコア番号の項目を含む。ノード番号の項目にはノードのノード番号が登録される。CPUコア番号の項目には該当のノードに設けられたコアのCPUコア番号が登録される。
【0106】
例えば、CPUコア番号表121には、ノード番号が「0」、CPUコア番号が「0」という情報が含まれる。これは、ノード番号「0」のノードにCPUコア番号「0」のコアが存在することを示す。
【0107】
図14(B)は、ランク番号表122を示す。ランク番号表122は、ステップS14に相当する処理により作成される。ランク番号表は、CPUコア番号の項目およびランク番号の項目を含む。CPUコア番号の項目にはCPUコア番号が登録される。ランク番号の項目には、該当のCPUコア番号のコアで実行されるプロセスに対してユーザなどにより予め付与されたランク番号が登録される。当該ランク番号は、ユーザ定義プロセス番号に相当する。
【0108】
例えば、ランク番号表122には、CPUコア番号が「0」、ランク番号が「2」という情報が含まれる。これは、CPUコア番号「0」のコアが、ランク番号「2」のプロセスの実行に用いられることを示す。例えば、複数のコアを用いて1つのプロセスを実行する場合、複数のCPUコア番号に対して該当のプロセスのランク番号が対応付けられる。
【0109】
CPUコア番号表121で示されるように、メモリ12,13,14,15に格納されるハードウェア情報は、複数のプロセスを実行する複数のノードそれぞれのノード番号と、各ノードに含まれる複数のコアそれぞれのコア番号とを含んでいる。CPU11は、複数のプロセスそれぞれが割り当てられたコアのコア番号を取得し、ハードウェア情報に基づいて、コア番号に対応するノード番号の順に、コアに割り当てられたプロセスのノード順プロセス番号を生成する。
【0110】
図15は、データ構造例を示す図である。
図15(A)は、ノード順プロセス番号表123を示す。ノード順プロセス番号表123は、CPUコア番号の項目およびノード順プロセス番号の項目を含む。CPUコア番号の項目にはCPUコア番号が登録される。ノード順プロセス番号の項目には、該当のCPUコア番号のコアで実行されるプロセスのノード順プロセス番号が登録される。
【0111】
例えば、ノード順プロセス番号表123には、CPUコア番号が「0」、ノード順プロセス番号が「0」という情報が含まれる。これは、CPUコア番号「0」のコアで実行されるプロセスのノード順プロセス番号が「0」であることを示す。例えば、複数のコアを用いて1つのプロセスを実行する場合、複数のCPUコア番号に対して該当のプロセスのノード順プロセス番号が対応付けられる。
【0112】
図15(B)は、仮想ランク番号表124を示す。仮想ランク番号表124は、CPUコア番号の項目および仮想ランク番号の項目を含む。CPUコア番号の項目にはCPUコア番号が登録される。仮想ランク番号の項目には、該当のCPUコア番号のコアで実行されるプロセスの仮想ランク番号が登録される。
【0113】
例えば、仮想ランク番号表124には、CPUコア番号が「0」、仮想ランク番号が「0」という情報が含まれる。これは、CPUコア番号「0」のコアで実行されるプロセスの仮想ランク番号が「0」であることを示す。例えば、複数のコアを用いて1つのプロセスを実行する場合、複数のCPUコア番号に対して該当のプロセスの仮想ランク番号が対応付けられる。
【0114】
図16は、仮想ランク番号の決定例を示す図である。
プロセスp0~p7は、予め指定されたユーザ定義プロセス番号をプロセスp0~p7に割り当てる(ST11)。例えば、プロセスp0のユーザ定義プロセス番号は「2」である。プロセスp1のユーザ定義プロセス番号は「6」である。プロセスp2のユーザ定義プロセス番号は「4」である。プロセスp3のユーザ定義プロセス番号は「3」である。プロセスp4のユーザ定義プロセス番号は「1」である。プロセスp5のユーザ定義プロセス番号は「0」である。プロセスp6のユーザ定義プロセス番号は「5」である。プロセスp7のユーザ定義プロセス番号は「7」である。ユーザ定義プロセス番号は、ユーザなどにより予め定められるランク番号に相当する。
【0115】
プロセスp0~p7は、CPUコア番号表121およびランク番号表122に基づいて、プロセスp0~p7それぞれに対するノード順プロセス番号を決定する(ST12)。ノード順プロセス番号は、0を最小値として、CPUコア番号表121を基に、所属するノードのノード番号が小さいプロセスから昇順に付与される。1つのノードで複数のプロセスが実行される場合、当該複数のプロセスに対しては任意の順にノード順プロセス番号が付与される。例えば、CPUコア番号の順にノード順プロセス番号が付与されてもよい。
【0116】
プロセスp0のノード順プロセス番号は「0」である。プロセスp1のノード順プロセス番号は「1」である。プロセスp2のノード順プロセス番号は「2」である。プロセスp3のノード順プロセス番号は「3」である。プロセスp4のノード順プロセス番号は「4」である。プロセスp5のノード順プロセス番号は「5」である。プロセスp6のノード順プロセス番号は「6」である。プロセスp7のノード順プロセス番号は「7」である。
【0117】
プロセスp0~p7は、プロセスp0~p7それぞれのノード順プロセス番号に基づいて、式(1)により、プロセスp0~p7それぞれの仮想ランク番号を決定する(ST13)。プロセスp0の仮想ランク番号は「0」である。プロセスp1の仮想ランク番号は「7」である。プロセスp2の仮想ランク番号は「2」である。プロセスp3の仮想ランク番号は「5」である。プロセスp4の仮想ランク番号は「4」である。プロセスp5の仮想ランク番号は「3」である。プロセスp6の仮想ランク番号は「6」である。プロセスp7の仮想ランク番号は「1」である。
【0118】
ここで、プロセスp0~p7は、自プロセスの仮想ランク番号を入力として、式(2)によりデータ送信先のプロセスのノード順プロセス番号を求めることが可能である。また、プロセスp0~p7は、自プロセスの仮想ランク番号を入力として、式(3)によりデータ送信元のプロセスのノード順プロセス番号を求めることが可能である。
【0119】
ノード順プロセス番号に加えて、仮想ランク番号を導入することで、送信先プロセスを求める式(2)や送信元プロセスを求める式(3)を比較的単純な式で表すことができ、演算を単純化できる。
【0120】
図17は、送信先の仮想ランク番号の計算例を示す図である。
表125は、全対全通信の各ステップにおける、仮想ランク番号「7」のプロセスp1に着目したデータ送信先のプロセスの仮想ランク番号の計算例を示す。
【0121】
step=0の場合、式(2)により算出されるデータ送信先のプロセスのノード順プロセス番号は「0^7=7」である。したがって、式(1)により算出されるデータ送信先のプロセスの仮想ランク番号は「1」である。
【0122】
step=1の場合、データ送信先のプロセスのノード順プロセス番号は「1^7=6」である。したがって、データ送信先のプロセスの仮想ランク番号は「6」である。
step=2の場合、データ送信先のプロセスのノード順プロセス番号は「2^7=5」である。したがって、データ送信先のプロセスの仮想ランク番号は「3」である。
【0123】
step=3の場合、データ送信先のプロセスのノード順プロセス番号は「3^7=4」である。したがって、データ送信先のプロセスの仮想ランク番号は「4」である。
step=4の場合、データ送信先のプロセスのノード順プロセス番号は「4^7=3」である。したがって、データ送信先のプロセスの仮想ランク番号は「5」である。
【0124】
step=5の場合、データ送信先のプロセスのノード順プロセス番号は「5^7=2」である。したがって、データ送信先のプロセスの仮想ランク番号は「2」である。
step=6の場合、データ送信先のプロセスのノード順プロセス番号は「6^7=1」である。したがって、データ送信先のプロセスの仮想ランク番号は「7」である。
【0125】
step=7の場合、データ送信先のプロセスのノード順プロセス番号は「7^7=0」である。したがって、データ送信先のプロセスの仮想ランク番号は「0」である。
図18は、送信元の仮想ランク番号の計算例を示す図である。
【0126】
表126は、全対全通信の各ステップにおける、仮想ランク番号「7」のプロセスp1に着目したデータ送信元の仮想ランク番号の計算例を示す。
表126では、表125の項目に加えて、ステップ評価値を示している。ステップ評価値は、式(3)の括弧で閉じられた項、すなわち、(step%2==0?step:maxstep-step)の計算結果を示す。
【0127】
step=0の場合、ステップ評価値は「0」である。この場合、式(3)により算出されるデータ送信元のプロセスのノード順プロセス番号は「0^7=7」である。したがって、式(1)により算出されるデータ送信元のプロセスの仮想ランク番号は「1」である。
【0128】
step=1の場合、ステップ評価値は「7」である。この場合、データ送信元のプロセスのノード順プロセス番号は「7^7=0」である。したがって、データ送信元のプロセスの仮想ランク番号は「0」である。
【0129】
step=2の場合、ステップ評価値は「2」である。この場合、データ送信元のプロセスのノード順プロセス番号は「2^7=5」である。したがって、データ送信元のプロセスの仮想ランク番号は「3」である。
【0130】
step=3の場合、ステップ評価値は「5」である。この場合、データ送信元のプロセスのノード順プロセス番号は「5^7=2」である。したがって、データ送信元のプロセスの仮想ランク番号は「2」である。
【0131】
step=4の場合、ステップ評価値は「4」である。この場合、データ送信元のプロセスのノード順プロセス番号は「4^7=3」である。したがって、データ送信元のプロセスの仮想ランク番号は「5」である。
【0132】
step=5の場合、ステップ評価値は「3」である。この場合、データ送信元のプロセスのノード順プロセス番号は「3^7=4」である。したがって、データ送信元のプロセスの仮想ランク番号は「4」である。
【0133】
step=6の場合、ステップ評価値は「6」である。この場合、データ送信元のプロセスのノード順プロセス番号は「6^7=1」である。したがって、データ送信元のプロセスの仮想ランク番号は「7」である。
【0134】
step=7の場合、ステップ評価値は「1」である。この場合、データ送信元のプロセスのノード順プロセス番号は「1^7=6」である。したがって、データ送信元のプロセスの仮想ランク番号は「6」である。
【0135】
図19は、仮想ランク番号に基づく全対全通信の例を示す図である。
図19,20ではプロセスp1(仮想ランク番号「7」)に着目し、プロセスp1が送信元または送信先となる通信を例示する。プロセスp0~p7それぞれを表す円の中に記載された数値は、該当のプロセスの仮想ランク番号を示す。
【0136】
step=0では、プロセスp1は、反時計回りの経路を用いてプロセスp7にデータを送信する。プロセスp7は、プロセスp1からデータを受信する。また、プロセスp7は、反時計回りの経路を用いてプロセスp1にデータを送信する。プロセスp1は、プロセスp7からデータを受信する。
【0137】
step=1では、プロセスp1は、反時計回りの経路を用いてプロセスp6にデータを送信する。プロセスp6は、プロセスp1からデータを受信する。また、プロセスp0は、プロセスp1にデータを送信する。プロセスp1は、プロセスp0からデータを受信する。同一ノード内での通信ではリングバス11bは使用されない。
【0138】
step=2では、プロセスp1は、時計回りの経路を用いてプロセスp5にデータを送信する。プロセスp5は、プロセスp1からデータを受信する。また、プロセスp5は、反時計回りの経路を用いてプロセスp1にデータを送信する。プロセスp1は、プロセスp5からデータを受信する。
【0139】
step=3では、プロセスp1は、時計回りの経路を用いてプロセスp4にデータを送信する。プロセスp4は、プロセスp1からデータを受信する。また、プロセスp2は、時計回りの経路を用いてプロセスp1にデータを送信する。プロセスp1は、プロセスp2からデータを受信する。
【0140】
図20は、仮想ランク番号に基づく全対全通信の例を示す図である。
step=4では、プロセスp1は、反時計回りの経路を用いてプロセスp3にデータを送信する。プロセスp3は、プロセスp1からデータを受信する。また、プロセスp3は、時計回りの経路を用いてプロセスp1にデータを送信する。プロセスp1は、プロセスp3からデータを受信する。
【0141】
step=5では、プロセスp1は、反時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp1からデータを受信する。また、プロセスp4は、反時計回りの経路を用いてプロセスp1にデータを送信する。プロセスp1は、プロセスp4からデータを受信する。
【0142】
step=6では、プロセスp1は、プロセスp1にデータを送信する。プロセスp1は、プロセスp1からデータを受信する。例えば、プロセスp1からプロセスp1へのデータ送信により、プロセスp1の送信バッファに格納されたデータが受信バッファに移される。
【0143】
step=7では、プロセスp1は、プロセスp0にデータを送信する。プロセスp0は、プロセスp1からデータを受信する。また、プロセスp6は、反時計回りの経路を用いてプロセスp1にデータを送信する。プロセスp1は、プロセスp6からデータを受信する。
【0144】
次に、全対全通信の各ステップにおける全てのプロセスp0~p7の通信を例示する。
図21は、仮想ランク番号に基づく全対全通信の例を示す図である。
step=0では、次の通信が実行される。なお、各プロセスによるデータの受信の説明を省略する。
【0145】
プロセスp0は、プロセスp0にデータを送信する。
プロセスp1は、反時計回りの経路を用いてプロセスp7にデータを送信する。
プロセスp2は、プロセスp2にデータを送信する。
【0146】
プロセスp3は、時計回りの経路を用いてプロセスp5にデータを送信する。
プロセスp4は、プロセスp4にデータを送信する。
プロセスp5は、時計回りの経路を用いてプロセスp3にデータを送信する。
【0147】
プロセスp6は、プロセスp6にデータを送信する。
プロセスp7は、反時計回りの経路を用いてプロセスp1にデータを送信する。
step=1では、次の通信が実行される。
【0148】
プロセスp0は、プロセスp1にデータを送信する。
プロセスp1は、反時計回りの経路を用いてプロセスp6にデータを送信する。
プロセスp2は、プロセスp3にデータを送信する。
【0149】
プロセスp3は、時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp4は、プロセスp5にデータを送信する。
プロセスp5は、時計回りの経路を用いてプロセスp2にデータを送信する。
【0150】
プロセスp6は、プロセスp7にデータを送信する。
プロセスp7は、反時計回りの経路を用いてプロセスp0にデータを送信する。
step=2では、次の通信が実行される。
【0151】
プロセスp0は、反時計回りの経路を用いてプロセスp2にデータを送信する。
プロセスp1は、時計回りの経路を用いてプロセスp5にデータを送信する。
プロセスp2は、時計回りの経路を用いてプロセスp0にデータを送信する。
【0152】
プロセスp3は、反時計回りの経路を用いてプロセスp7にデータを送信する。
プロセスp4は、時計回りの経路を用いてプロセスp6にデータを送信する。
プロセスp5は、反時計回りの経路を用いてプロセスp1にデータを送信する。
【0153】
プロセスp6は、反時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp7は、時計回りの経路を用いてプロセスp3にデータを送信する。
step=3では、次の通信が実行される。
【0154】
プロセスp0は、反時計回りの経路を用いてプロセスp3にデータを送信する。
プロセスp1は、時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp2は、時計回りの経路を用いてプロセスp1にデータを送信する。
【0155】
プロセスp3は、反時計回りの経路を用いてプロセスp6にデータを送信する。
プロセスp4は、時計回りの経路を用いてプロセスp7にデータを送信する。
プロセスp5は、反時計回りの経路を用いてプロセスp0にデータを送信する。
【0156】
プロセスp6は、反時計回りの経路を用いてプロセスp5にデータを送信する。
プロセスp7は、時計回りの経路を用いてプロセスp2にデータを送信する。
図22は、仮想ランク番号に基づく全対全通信の例を示す図である。
【0157】
step=4では、次の通信が実行される。
プロセスp0は、時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp1は、反時計回りの経路を用いてプロセスp3にデータを送信する。
【0158】
プロセスp2は、反時計回りの経路を用いてプロセスp6にデータを送信する。
プロセスp3は、時計回りの経路を用いてプロセスp1にデータを送信する。
プロセスp4は、反時計回りの経路を用いてプロセスp0にデータを送信する。
【0159】
プロセスp5は、時計回りの経路を用いてプロセスp7にデータを送信する。
プロセスp6は、時計回りの経路を用いてプロセスp2にデータを送信する。
プロセスp7は、反時計回りの経路を用いてプロセスp5にデータを送信する。
【0160】
step=5では、次の通信が実行される。
プロセスp0は、時計回りの経路を用いてプロセスp5にデータを送信する。
プロセスp1は、反時計回りの経路を用いてプロセスp2にデータを送信する。
【0161】
プロセスp2は、反時計回りの経路を用いてプロセスp7にデータを送信する。
プロセスp3は、時計回りの経路を用いてプロセスp0にデータを送信する。
プロセスp4は、反時計回りの経路を用いてプロセスp1にデータを送信する。
【0162】
プロセスp5は、時計回りの経路を用いてプロセスp6にデータを送信する。
プロセスp6は、時計回りの経路を用いてプロセスp3にデータを送信する。
プロセスp7は、反時計回りの経路を用いてプロセスp4にデータを送信する。
【0163】
step=6では、次の通信が実行される。
プロセスp0は、反時計回りの経路を用いてプロセスp6にデータを送信する。
プロセスp1は、プロセスp1にデータを送信する。
【0164】
プロセスp2は、時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp3は、プロセスp3にデータを送信する。
プロセスp4は、時計回りの経路を用いてプロセスp2にデータを送信する。
【0165】
プロセスp5は、プロセスp5にデータを送信する。
プロセスp6は、反時計回りの経路を用いてプロセスp0にデータを送信する。
プロセスp7は、プロセスp7にデータを送信する。
【0166】
step=7では、次の通信が実行される。
プロセスp0は、反時計回りの経路を用いてプロセスp7にデータを送信する。
プロセスp1は、プロセスp0にデータを送信する。
【0167】
プロセスp2は、時計回りの経路を用いてプロセスp5にデータを送信する。
プロセスp3は、プロセスp2にデータを送信する。
プロセスp4は、時計回りの経路を用いてプロセスp3にデータを送信する。
【0168】
プロセスp5は、プロセスp4にデータを送信する。
プロセスp6は、反時計回りの経路を用いてプロセスp1にデータを送信する。
プロセスp7は、プロセスp6にデータを送信する。
【0169】
このように、CPU11は、排他的論理和演算により各プロセスに対する通信先のプロセスを決定することで、第1通信路11b0の一部の区間および第2通信路11b1の一部の区間がプロセスの2以上の組の通信により共有されることを回避する。
【0170】
第2の実施の形態の例では、全対全通信の各ステップにおいて、リングバス11bの時計回りの経路(第1通信路11b0)、および、反時計回りの経路(第2通信路11b1)の何れの箇所も共有されることがない。このため、リングバス11bで輻輳を発生させずに、高速に全対全通信を行える。
【0171】
また、仮想ランク番号を用いることで、ユーザやOS、通信ライブラリおよびジョブスケジューラなどの外部の要因による、各プロセスに対する識別番号の割り当てポリシーに依らずに、高速な全対全通信を行えるようになる。更に、各プロセスに対する通信先のプロセスの決定が排他的論理和を用いた単純な演算で行える。このため、各プロセスに対する通信先のプロセスの決定を高速に実行できる。
【0172】
[第3の実施の形態]
次に、第3の実施の形態を説明する。前述の第2の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
【0173】
第2の実施の形態では、ノード11a0~11a3それぞれが2つのプロセスを実行する例を示したが、ノード11a0~11a3それぞれが3以上のプロセスを実行してもよい。そこで、第3の実施の形態では、ノード11a0~11a3それぞれが3つのプロセスを実行する例を説明する。第3の実施の形態の情報処理装置10のハードウェア例は、
図2で例示した第2の実施の形態のハードウェア例と同様である。各プロセスは、
図13で例示した手順を実行することで、並列プログラムの処理に伴う全対全通信を実行する。
【0174】
図23は、第3の実施の形態の仮想ランク番号の決定例を示す図である。
ノード11a0~11a3それぞれのノード番号は、第2の実施の形態と同様である。すなわち、ノード11a0のノード番号は「0」である。ノード11a1のノード番号は「1」である。ノード11a2のノード番号は「2」である。ノード11a3のノード番号は「3」である。
【0175】
ノード11a0は、プロセスp0,p1,p2を並列に実行する。ノード11a1は、プロセスp3,p4,p5を並列に実行する。ノード11a2は、プロセスp6,p7,p8を並列に実行する。ノード11a3は、プロセスp9,p10,p11を並列に実行する。
【0176】
プロセスp0~p11は、予め指定されたユーザプロセス番号をプロセスp0~p11に割り当てる(ST21)。例えば、プロセスp0のユーザ定義プロセス番号は「2」である。プロセスp1のユーザ定義プロセス番号は「11」である。プロセスp2のユーザ定義プロセス番号は「6」である。プロセスp3のユーザ定義プロセス番号は「4」である。プロセスp4のユーザ定義プロセス番号は「9」である。プロセスp5のユーザ定義プロセス番号は「3」である。プロセスp6のユーザ定義プロセス番号は「1」である。プロセスp7のユーザ定義プロセス番号は「10」である。プロセスp8のユーザ定義プロセス番号は「0」である。プロセスp9のユーザ定義プロセス番号は「5」である。プロセスp10のユーザ定義プロセス番号は「8」である。プロセスp11のユーザ定義プロセス番号は「7」である。ユーザ定義プロセス番号は、ユーザなどにより予め定められるランク番号に相当する。
【0177】
プロセスp0~p11は、プロセス間で通信してランク番号表122を作成する。プロセスp0~p11は、CPUコア番号表121およびランク番号表122に基づいて、プロセスp0~p11それぞれに対するノード順プロセス番号を決定する(ST22)。ノード順プロセス番号は、0を最小値として、CPUコア番号表121を基に、所属するノードのノード番号が小さいプロセスから昇順に付与される。1つのノードで複数のプロセスが実行される場合、当該複数のプロセスに対しては任意の順にノード順プロセス番号が付与される。例えば、CPUコア番号の順にノード順プロセス番号が付与されてもよい。
【0178】
プロセスp0のノード順プロセス番号は「0」である。プロセスp1のノード順プロセス番号は「1」である。プロセスp2のノード順プロセス番号は「2」である。プロセスp3のノード順プロセス番号は「3」である。プロセスp4のノード順プロセス番号は「4」である。プロセスp5のノード順プロセス番号は「5」である。プロセスp6のノード順プロセス番号は「6」である。プロセスp7のノード順プロセス番号は「7」である。プロセスp8のノード順プロセス番号は「8」である。プロセスp9のノード順プロセス番号は「9」である。プロセスp10のノード順プロセス番号は「10」である。プロセスp11のノード順プロセス番号は「11」である。
【0179】
プロセスp0~p11は、プロセスp0~p11それぞれのノード順プロセス番号に基づいて、式(1)により、プロセスp0~p11それぞれの仮想ランク番号を決定する(ST23)。ここで、第3の実施の形態では、式(1)のsize=12である。プロセスp0の仮想ランク番号は「0」である。プロセスp1の仮想ランク番号は「11」である。プロセスp2の仮想ランク番号は「2」である。プロセスp3の仮想ランク番号は「9」である。プロセスp4の仮想ランク番号は「4」である。プロセスp5の仮想ランク番号は「7」である。プロセスp6の仮想ランク番号は「6」である。プロセスp7の仮想ランク番号は「5」である。プロセスp8の仮想ランク番号は「8」である。プロセスp9の仮想ランク番号は「3」である。プロセスp10の仮想ランク番号は「10」である。プロセスp11の仮想ランク番号は「1」である。
【0180】
図24は、仮想ランク番号に基づく全対全通信の例を示す図である。
図24~26ではプロセスp2(仮想ランク番号「2」)に着目し、プロセスp2が送信元または送信先となる通信を例示する。プロセスp0~p11それぞれを表す円の中に記載された数値は、該当のプロセスの仮想ランク番号を示す。
【0181】
全対全通信の各ステップにおいて、各プロセスに対するデータ送信先のプロセスの仮想ランク番号は、式(2)および式(1)により計算される。また、各プロセスに対するデータ送信元のプロセスの仮想ランク番号は、式(3)および式(1)により計算される。
【0182】
step=0では、プロセスp2は、プロセスp2にデータを送信する。プロセスp2は、プロセスp2からデータを受信する。例えば、プロセスp2からプロセスp2へのデータ送信により、プロセスp2の送信バッファに格納されたデータが受信バッファに移される。
【0183】
step=1では、プロセスp2は、リングバス11bの反時計回りの経路を用いてプロセスp3にデータを送信する。プロセスp3は、プロセスp2からデータを受信する。また、プロセスp9は、反時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp9からデータを受信する。
【0184】
step=2では、プロセスp2は、プロセスp0にデータを送信する。プロセスp0は、プロセスp2からデータを受信する。また、プロセスp0は、プロセスp2にデータを送信する。プロセスp2は、プロセスp0からデータを受信する。
【0185】
step=3では、プロセスp2は、プロセスp1にデータを送信する。プロセスp1は、プロセスp2からデータを受信する。また、プロセスp11は、反時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp11からデータを受信する。
【0186】
図25は、仮想ランク番号に基づく全対全通信の例を示す図である。
step=4では、プロセスp2は、時計回りの経路を用いてプロセスp6にデータを送信する。プロセスp6は、プロセスp2からデータを受信する。また、プロセスp6は、反時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp6からデータを受信する。
【0187】
step=5では、プロセスp2は、時計回りの経路を用いてプロセスp7にデータを送信する。プロセスp7は、プロセスp2からデータを受信する。また、プロセスp5は、時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp5からデータを受信する。
【0188】
step=6では、プロセスp2は、反時計回りの経路を用いてプロセスp4にデータを送信する。プロセスp4は、プロセスp2からデータを受信する。また、プロセスp4は、時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp4からデータを受信する。
【0189】
step=7では、プロセスp2は、反時計回りの経路を用いてプロセスp5にデータを送信する。プロセスp5は、プロセスp2からデータを受信する。また、プロセスp7は、反時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp7からデータを受信する。
【0190】
図26は、仮想ランク番号に基づく全対全通信の例を示す図である。
step=8では、プロセスp2は、反時計回りの経路を用いてプロセスp10にデータを送信する。プロセスp10は、プロセスp2からデータを受信する。また、プロセスp10は、反時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp10からデータを受信する。
【0191】
step=9では、プロセスp2は、反時計回りの経路を用いてプロセスp11にデータを送信する。プロセスp11は、プロセスp2からデータを受信する。また、プロセスp1は、プロセスp2にデータを送信する。プロセスp2は、プロセスp1からデータを受信する。
【0192】
step=10では、プロセスp2は、時計回りの経路を用いてプロセスp8にデータを送信する。プロセスp8は、プロセスp2からデータを受信する。また、プロセスp8は、反時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp8からデータを受信する。
【0193】
step=11では、プロセスp2は、反時計回りの経路を用いてプロセスp9にデータを送信する。プロセスp9は、プロセスp2からデータを受信する。また、プロセスp3は、時計回りの経路を用いてプロセスp2にデータを送信する。プロセスp2は、プロセスp3からデータを受信する。
【0194】
プロセスp2以外の他のプロセスについても、各ステップにおいて、他のプロセスとの通信を行う。このように、各ノードで実行されるプロセス数が3以上の場合であっても、仮想ランク番号に基づく全対全通信を行える。また、全対全通信における通信路の共有を極力回避することができ、ユーザなどにより予め付与されたランク番号を用いるよりも輻輳の発生を抑えることができる。すなわち、全対全通信の最初のステップから最終のステップに亘って、輻輳が発生する頻度を低減できる。その結果、全対全通信を高速化できる。
【0195】
また、仮想ランク番号を用いることで、ユーザやOS、通信ライブラリおよびジョブスケジューラなどの外部の要因による、各プロセスに対する識別番号の割り当てポリシーに依らずに、高速な全対全通信を行えるようになる。更に、各プロセスに対する通信先のプロセスの決定が排他的論理和を用いた単純な演算で行える。このため、各プロセスに対する通信先のプロセスの決定を高速に実行できる。
【0196】
[第4の実施の形態]
次に、第4の実施の形態を説明する。前述の第2,第3の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
【0197】
第2,第3の実施の形態では、ノード11a0~11a3それぞれが同じ数のプロセスを実行する例を示したが、ノード11a0~11a3の一部が異なる数のプロセスを実行してもよい。そこで、第4の実施の形態では、CPU11のノード11a0~11a2のそれぞれが2つのプロセスを実行し、ノード11a3が1つのプロセスを実行する例を説明する。第4の実施の形態の情報処理装置10のハードウェア例は、
図2で例示した第2の実施の形態のハードウェア例と同様である。各プロセスは、
図13で例示した手順を実行することで、並列プログラムの処理に伴う全対全通信を実行する。
【0198】
図27は、第4の実施の形態の仮想ランク番号の決定例を示す図である。
ノード11a0~11a3それぞれのノード番号は、第2の実施の形態と同様である。すなわち、ノード11a0のノード番号は「0」である。ノード11a1のノード番号は「1」である。ノード11a2のノード番号は「2」である。ノード11a3のノード番号は「3」である。
【0199】
ノード11a0は、プロセスp0,p1を並列に実行する。ノード11a1は、プロセスp2,p3を並列に実行する。ノード11a2は、プロセスp4,p5を並列に実行する。ノード11a3は、プロセスp6を実行する。
【0200】
プロセスp0~p6は、予め指定されたユーザプロセス番号をプロセスp0~p6に割り当てる(ST31)。例えば、プロセスp0のユーザ定義プロセス番号は「2」である。プロセスp1のユーザ定義プロセス番号は「6」である。プロセスp2のユーザ定義プロセス番号は「4」である。プロセスp3のユーザ定義プロセス番号は「3」である。プロセスp4のユーザ定義プロセス番号は「1」である。プロセスp5のユーザ定義プロセス番号は「0」である。プロセスp6のユーザ定義プロセス番号は「5」である。ユーザ定義プロセス番号は、ユーザなどにより予め定められるランク番号に相当する。
【0201】
プロセスp0~p6は、プロセス間で通信してランク番号表122を作成する。プロセスp0~p6は、CPUコア番号表121およびランク番号表122に基づいて、プロセスp0~p6それぞれに対するノード順プロセス番号を決定する(ST32)。ノード順プロセス番号は、0を最小値として、CPUコア番号表121を基に、所属するノードのノード番号が小さいプロセスから昇順に付与される。1つのノードで複数のプロセスが実行される場合、当該複数のプロセスに対しては任意の順にノード順プロセス番号が付与される。例えば、CPUコア番号の順にノード順プロセス番号が付与されてもよい。
【0202】
プロセスp0のノード順プロセス番号は「0」である。プロセスp1のノード順プロセス番号は「1」である。プロセスp2のノード順プロセス番号は「2」である。プロセスp3のノード順プロセス番号は「3」である。プロセスp4のノード順プロセス番号は「4」である。プロセスp5のノード順プロセス番号は「5」である。プロセスp6のノード順プロセス番号は「6」である。
【0203】
プロセスp0~p6は、プロセスp0~p6それぞれのノード順プロセス番号に基づいて、式(1)により、プロセスp0~p6それぞれの仮想ランク番号を決定する(ST33)。sizeが奇数のとき、仮想ランク番号を求める際の式(1)のsizeをsize’=size-1に置き換えてもよい。プロセスp0の仮想ランク番号は「0」である。プロセスp1の仮想ランク番号は「5」である。プロセスp2の仮想ランク番号は「2」である。プロセスp3の仮想ランク番号は「3」である。プロセスp4の仮想ランク番号は「4」である。プロセスp5の仮想ランク番号は「1」である。プロセスp6の仮想ランク番号は「6」である。
【0204】
図28は、送信先の仮想ランク番号の計算例を示す図である。
表127は、全対全通信の各ステップにおける、仮想ランク番号「5」のプロセスp1に着目したデータ送信先のプロセスの仮想ランク番号の計算例を示す。第4の実施の形態の例では、size=7であり、2の冪でないため、maxstepは7よりも大きい最小の2の冪である8となる。
【0205】
step=0の場合、式(2)により算出されるデータ送信先のプロセスのノード順プロセス番号は「0^5=5」である。したがって、データ送信先のプロセスの仮想ランク番号は「1」である。
【0206】
step=1の場合、データ送信先のプロセスのノード順プロセス番号は「1^5=4」である。したがって、データ送信先のプロセスの仮想ランク番号は「4」である。
step=2の場合、データ送信先のプロセスのノード順プロセス番号は「2^5=7」である。ノード順プロセス番号「7」は存在しない。したがって、データ送信先のプロセスはなし(ハイフン記号「-」で表記している)となる。
【0207】
step=3の場合、データ送信先のプロセスのノード順プロセス番号は「3^5=6」である。したがって、データ送信先のプロセスの仮想ランク番号は「6」である。
step=4の場合、データ送信先のプロセスのノード順プロセス番号は「4^5=1」である。したがって、データ送信先のプロセスの仮想ランク番号は「5」である。
【0208】
step=5の場合、データ送信先のプロセスのノード順プロセス番号は「5^5=0」である。したがって、データ送信先のプロセスの仮想ランク番号は「0」である。
step=6の場合、データ送信先のプロセスのノード順プロセス番号は「6^5=3」である。したがって、データ送信先のプロセスの仮想ランク番号は「3」である。
【0209】
step=7の場合、データ送信先のプロセスのノード順プロセス番号は「7^5=2」である。したがって、データ送信先のプロセスの仮想ランク番号は「2」である。
次に、全対全通信の各ステップにおけるプロセスp0~p6の通信を例示する。
【0210】
図29は、仮想ランク番号に基づく全対全通信の例を示す図である。
step=0では、次の通信が実行される。なお、各プロセスによるデータの受信の説明を省略する。
【0211】
プロセスp0は、プロセスp0にデータを送信する。
プロセスp1は、時計回りの経路を用いてプロセスp5にデータを送信する。
プロセスp2は、プロセスp2にデータを送信する。
【0212】
プロセスp3は、プロセスp3にデータを送信する。
プロセスp4は、プロセスp4にデータを送信する。
プロセスp5は、反時計回りの経路を用いてプロセスp1にデータを送信する。
【0213】
プロセスp6は、プロセスp6にデータを送信する。
step=1では、次の通信が実行される。
プロセスp0は、プロセスp1にデータを送信する。
【0214】
プロセスp1は、時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp2は、プロセスp3にデータを送信する。
プロセスp3は、プロセスp2にデータを送信する。
【0215】
プロセスp4は、プロセスp5にデータを送信する。
プロセスp5は、反時計回りの経路を用いてプロセスp0にデータを送信する。
プロセスp6は、データ送信を行わない。
【0216】
step=2では、次の通信が実行される。
プロセスp0は、反時計回りの経路を用いてプロセスp2にデータを送信する。
プロセスp1は、データ送信を行わない。
【0217】
プロセスp2は、時計回りの経路を用いてプロセスp0にデータを送信する。
プロセスp3は、時計回りの経路を用いてプロセスp1にデータを送信する。
プロセスp4は、時計回りの経路を用いてプロセスp6にデータを送信する。
【0218】
プロセスp5は、時計回りの経路を用いてプロセスp3にデータを送信する。
プロセスp6は、反時計回りの経路を用いてプロセスp4にデータを送信する。
step=3では、次の通信が実行される。
【0219】
プロセスp0は、反時計回りの経路を用いてプロセスp3にデータを送信する。
プロセスp1は、反時計回りの経路を用いてプロセスp6にデータを送信する。
プロセスp2は、時計回りの経路を用いてプロセスp1にデータを送信する。
【0220】
プロセスp3は、時計回りの経路を用いてプロセスp0にデータを送信する。
プロセスp4は、データ送信を行わない。
プロセスp5は、時計回りの経路を用いてプロセスp2にデータを送信する。
【0221】
プロセスp6は、反時計回りの経路を用いてプロセスp5にデータを送信する。
図30は、仮想ランク番号に基づく全対全通信の例を示す図である。
step=4では、次の通信が実行される。
【0222】
プロセスp0は、時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp1は、プロセスp1にデータを送信する。
プロセスp2は、反時計回りの経路を用いてプロセスp6にデータを送信する。
【0223】
プロセスp3は、データ送信を行わない。
プロセスp4は、反時計回りの経路を用いてプロセスp0にデータを送信する。
プロセスp5は、プロセスp5にデータを送信する。
【0224】
プロセスp6は、時計回りの経路を用いてプロセスp2にデータを送信する。
step=5では、次の通信が実行される。
プロセスp0は、時計回りの経路を用いてプロセスp5にデータを送信する。
【0225】
プロセスp1は、プロセスp0にデータを送信する。
プロセスp2は、データ送信を行わない。
プロセスp3は、反時計回りの経路を用いてプロセスp6にデータを送信する。
【0226】
プロセスp4は、反時計回りの経路を用いてプロセスp1にデータを送信する。
プロセスp5は、プロセスp4にデータを送信する。
プロセスp6は、時計回りの経路を用いてプロセスp3にデータを送信する。
【0227】
step=6では、次の通信が実行される。
プロセスp0は、反時計回りの経路を用いてプロセスp6にデータを送信する。
プロセスp1は、反時計回りの経路を用いてプロセスp3にデータを送信する。
【0228】
プロセスp2は、時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp3は、時計回りの経路を用いてプロセスp5に送信する。
プロセスp4は、時計回りの経路を用いてプロセスp2にデータを送信する。
【0229】
プロセスp5は、データ送信を行わない。
プロセスp6は、反時計回りの経路を用いてプロセスp0にデータを送信する。
step=7では、次の通信が実行される。
【0230】
プロセスp0は、データ送信を行わない。
プロセスp1は、反時計回りの経路を用いてプロセスp2にデータを送信する。
プロセスp2は、時計回りの経路を用いてプロセスp5にデータを送信する。
【0231】
プロセスp3は、時計回りの経路を用いてプロセスp4にデータを送信する。
プロセスp4は、時計回りの経路を用いてプロセスp3にデータを送信する。
プロセスp5は、時計回りの経路を用いてプロセスp6にデータを送信する。
【0232】
プロセスp6は、反時計回りの経路を用いてプロセスp1にデータを送信する。
このように、ノード11a0~11a3の一部が異なる数のプロセスを実行していても、CPU11はプロセス間の全対全通信を行える。
【0233】
なお、上記のように、ノード11a3上のプロセス数が他のノードよりも少なくなるケースとして、第2の実施の形態のように各ノードで2つずつプロセスを実行している状態からの何れかのプロセスが消滅するケースが考えられる。プロセスの消滅は、例えば、ノード11a3におけるコアの減縮(一部のコアが障害などにより利用できなくなるなど)に起因して発生し得る。例えば、各ノードで2つずつプロセスを実行している状態で、何れかのプロセスが消滅した場合には、各プロセスは、
図13のステップS12~S17を再実行することで、各プロセスのノード順プロセス番号および仮想ランク番号を再決定する。
【0234】
このように、CPU11は、仮想ランク番号を算出した後に、CPU11における複数のプロセスの数が減ると、残りのプロセスのノード順プロセス番号および仮想ランク番号を更新する。これにより、並列プログラムの処理途中において一部のプロセスでプロセスの数が減ったとしても、残りのプロセスで全対全通信を実行し、処理を継続できる。
【0235】
ここで、上記の第2~第4の実施の形態に対して次のことが言える。
情報処理装置10において輻輳の発生を最も抑えられるのは、「ノード内に2の冪のプロセス数(1,2,4,8,16,…)が存在し、かつ、全てのノードにおいて、プロセス数が同じであること」という条件を満たすときである。第2の実施の形態の例は、当該条件を満たすケースである。ただし、当該条件を満たさなくても、ユーザなどにより予め用いられたランク番号を用いるよりも、輻輳の発生を抑えることができる。また、何れかのノードでコアの縮退などによりプロセス数が変化しても、仮想ランク番号を再決定することで、残りのプロセスで全対全通信を行って処理を継続できる。
【0236】
次に、第2~第4の実施の形態で例示した情報処理装置10を複数用いた並列処理システムを例示する。
図31は、並列処理システムの例を示す図である。
【0237】
並列処理システム100は、情報処理装置10,10a,10b,10c,…を有する。並列処理システム100は、同一のジョブに属する複数のプロセスを、情報処理装置10,10a,10b,10c,…を用いて並列に実行する。1つの情報処理装置は、複数のノードおよび複数のノードが接続されるリングバスを含むCPUと、各ノードに接続されたHBM2などのメモリとを有する。
【0238】
例えば、情報処理装置10は、前述のように、ノード11a0,11a1,11a2,11a3、リングバス11bおよびメモリ12,13,14,15を有する。ノード11a0,11a1,11a2,11a3はリングバス11bに接続される。ノード11a0はメモリ12に接続される。ノード11a1はメモリ13に接続される。ノード11a2はメモリ14に接続される。ノード11a3はメモリ15に接続される。また、情報処理装置10は、通信インタフェース(図示を省略している)を有する。情報処理装置10は、当該通信インタフェースを介してネットワーク50に接続し、他のコンピュータと通信する。また、情報処理装置10は、並列処理システム100が備えるインターコネクト(図示を省略している)を介して、並列処理システム100における他の情報処理装置と相互に通信する。インターコネクトには、例えばTofu(登録商標)インターコネクトなどの6次元メッシュ/トーラスのトポロジーによる直接網が用いられる。
【0239】
ネットワーク50には、サーバ200および端末装置300が接続される。
サーバ200は、CPU、RAMおよびHDD(Hard Disk Drive)やSSD(Solid State Drive)などの補助記憶装置を有し、共有ファイルシステム210を実現するサーバコンピュータである。
【0240】
情報処理装置10,10a,10b,10c,…は、ネットワーク50を介して共有ファイルシステム210にアクセスし、共有ファイルシステム210に格納されたプログラム211やデータをダウンロードし、各情報処理装置のメモリに格納する。各情報処理装置のメモリに格納されたプログラムは、各情報処理装置のCPUによって実行される。
【0241】
例えば、サーバ200は、記録媒体20に格納されたプログラム211やデータを読み取る媒体リーダを有し、記録媒体20に格納されたプログラム211やデータを共有ファイルシステム210に格納する。記録媒体20として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。記録媒体20は可搬型記録媒体と呼ばれてもよく、プログラムやデータの配布に用いられることがある。また、記録媒体20は、コンピュータ読み取り可能な記録媒体と呼ばれることもある。
【0242】
端末装置300は、ユーザによって利用されるクライアントコンピュータである。例えば、端末装置300は、並列処理システム100に対する並列プログラムの実行開始指示を入力したり、並列プログラムの実行スケジュールを並列処理システム100に設定したりする。また、端末装置300は、並列プログラムの実行結果を端末装置300が備えるディスプレイに表示し、ユーザによる当該実行結果の確認に用いられてもよい。
【0243】
ここで、HPC(High-Performance Computing)分野では、性能向上のためにノード数の増加やCPUのコア数を増やすメニーコア化による大規模化が進んでいる。
HPC分野では、並列計算のための規格としてMPIが用いられることが多い。並列処理システム100では、MPIプロセスを同時に多数実行することで、並列計算が実現される。大規模化によって、実行されるMPIプロセスの数は多くなるため、MPIプロセス間の通信性能が重要となる。情報処理装置10,10a,10b,10c,…により、各情報処理装置内のプロセス間の全対全通信を伴う処理を高速に実行でき、並列処理システム100全体の処理の高速化を図ることができる。
【符号の説明】
【0244】
1 情報処理装置
1a0,1a1,1a2,1a3 記憶部
1b 処理部
1b0,1b1,1b2,1b3 ノード
1b4 リングバス
P0,P1,P2,P3,P4,P5,P6,P7 プロセス