「二次元古典イジング(Ising)模型」と呼ばれる模型を考える。この 模型では、二次元の正方格子の各格子点に「1 (上向き)」、もしくは「-1 (下向 き)」のどちらかの値を持つ「スピン」が存在し、それぞれの隣り合う二つのス ピンがお互いに同じ向きを持つか、反対の向きを持つかによって、異なるエネル ギーが与えられる。この模型は、現実の磁性体の相転移を記述する最も単純な模 型の一つとして、非常に詳しく研究されてきた。この系の自由エネルギー(free energy)を(計算機の数値精度の範囲で)厳密に求めようとすると、もっとも素直 な方法では、位相空間の大きさと同じ、O(2N)の手間がかかる。(ここでNは 系に含まれるスピンの個数である。 の系を考える場合、計算の手間 は O(2L2)となる。) この計算の手間は、以下に述べる「転送行列 (transfer matrix)法」を用いることにより、 O(L2 2L)にまで減らすことが できることが知られている。
転送行列法では、次元が の行列を考える。この行列は、二次元格 子を一方向にスライスした時の各スライスの自由エネルギーへの寄与を表わして いる。この転送行列をL回掛け合わせた後、トレースを取ることにより、系の 分配関数(partition function)が、さらにその対数を取ることにより、自由エネ ルギーが求められる。
転送行列法のもう一つの利点は、半無限系( )を扱うことができ るという点にある。転送行列の無限回の積を考えると、自由エネルギーに寄与す るのは、転送行列の最大固有値のみとなる。また、最大固有値と第二固有値の比 から、系の相関長を求めることもできる。こうして、古典イジング模型の半無限 系の自由エネルギーを求めるという問題は、「転送行列の固有値問題」へと帰着 する。一般に、転送行列は の正定値の実対称行列である。全ての 行列要素の保存にはO(22L)の主記憶容量が必要であり、べき乗法、ランチョ ス法などの反復法を用いて最大固有値を求めるとしても、O(22L)の計算時 間が必要となる。したがって、一台のプロセッサを用いた場合には、L=14が実 質的な限界となる( )。
しかし、系の持つ物理的特性(すなわち、相互作用が近距離の2体相互作用の和か らなる)を利用することによって、転送行列はL個の「疎な」行列の積に書き直 すことができる。それぞれの疎行列は、各行(各列)で対角成分と一個の非対角成 分を除いては全て零となっている。この疎行列分解を用いると、反復法に必要な、 ベクトルと行列の積の計算にかかる手間は にまで減少する。さ らに、行列を記憶するために必要な主記憶容量も同程度にまで減少する。(零で ない行列要素を「その場で」計算すれば、必要な主記憶容量をO(2L)にまで減 らすことも可能である。) この方法により、1プロセッサで最大 程 度の大きさの系まで扱うことができる。
ここでは、疎行列の要素をあらかじめ主記憶上に記憶しておくのでは なく、全てその場で計算する場合について考える。この場合、行列とベクトルの 積の計算を行なうのに必要となる主記憶容量は、 の長さのベク トル一本分のみである。(計算結果をもとのベクトルに記憶することにより一本 で済む。) このベクトルを各プロセッサに均等に分割して配置する。ただし、 プロセッサ数()は2のべき乗であると仮定する。反復法を行なうのに 必要な、ベクトルのノルム計算、ベクトルの内積計算、ベクトルの定数倍等の操 作についての並列化は自明であるので、以下、行列とベクトルの積の計算につい てのみ考えることにする。
転送行列全体としては密であるので、最も単純に考えると、各プロセッサがそれ ぞれに割り当てられたベクトルについての計算を行なうためには、 の量のデータをネットワーク経由で他のプロセッサ から取り寄せなければならないように思える。しかし、すでに述べた疎行列分解 の方法をつかうと、以下に示す通り、データ転送量は で済むことがわかる。
図1に、 の場合の転送行列の疎行列分解を示す。 もともとの転送行列は密であるが、四つの疎行列に分解した後では、それぞれ、 対角部分行列とそれ以外にただ一つの零でない要素を持つ部分行列からなってい ることがわかる。したがって、各疎行列の積のステップでは、各プロセッサは、 それぞれペアを作って、ベクトルのトランスポーズ転送を行ない、各部分積を計 算した後、逆トランスポーズ転送を行なうことになる。転送パターンは、FFTな どでおなじみのバタフライ演算と同じパターンであり、一プロセッサあたりの転 送量は、合計 となる。
さらに、「動的領域分割」の手法を用いることにより、転送量を(漸近的に)半分
にすることができる。上記で述べた並列化では、各プロセッサの受け持つ部分ベ
クトルの割り当ては静的であった。計算の終わった部分ベクトルをもとのプロセッ
サに送り返す代わりに、各プロセッサへの割り当てそのものを動的に変化させる
ことにより、二度目のトランスポーズ転送は不要になる。この方法では、最終的
な辻褄を合わせるために一回の転送が余分な必要となるので、一プロセッサあた
りの転送量は、合計で
となる。こ
の場合の一プロセッサあたりの演算量と転送量との比は、
厳密対角化法の並列化においては、行列のトランスポーズ転送が並列 時間においてかなりの部分を占めている。この転送は、回数は少ないが一回の転 送量は数十MB〜数GBである。そのため、並列実効性能には、ネットワークの立ち 上がり性能よりむしろ、スループット性能が重要となる。そこで、我々はまず、 VPP500におけるネットワークスループット実効性能を簡単なベンチマークプログ ラムにより評価した。MPIを用いた場合、プロセッサ間でのベクトル(配列)の交 換を行なう方法としては、
まず気が付くのは、MPI_SENDRECVの転送速度が、片方向の転送の場合の 半分程度であるという点である。すなわち、MPI_SENDRECVでは、ハード ウェアの持つ全二重性はほとんど生かされておらず、片方向づつ順番に転送を行 なうのと同程度の性能しか出ない。さらに、MPI_SENDRECV_REPLACEでは、 ライブラリルーチン内で余分なメモリコピーが生じることによるオーバーヘッド を差し引いたとしても、非常に低い性能に留まっている。上記の4種類の転送方 法の中で最も高速なのは、「(3) MPI_ISENDとMPI_RECVの組合せ」 である(ただし、メッセージ長があまり長くない場合には、MPI_SENDRECV とほぼ同じ性能に留まる)。以下では、我々は、「(1) MPI_SENDRECV」と 「(3) MPI_ISENDとMPI_RECVの組合せ」の二通りの転送方法を用 いてプログラムを作成し、性能評価を行なった。
図3に、VPP500における16PEまでの並列化効率の 実測値を示す。「MPI_ISENDとMPI_RECVの組合せ」を用いたプロ グラムでは、ピーク転送性能から見積もった並列化効率と比較しても、十分な並 列化効率が得られている。一方、MPI_SENDRECVを用いたプログラムでは、 前者と比較して1割以上の性能低下が見られる。
|