ここでは、原研において高速化技術者が実際に行っている高速化作業の手順及び事例等を紹介する。
VPP500における高速化作業の進め方について説明する。
ユーザより入手した原子力コードは、ユーザの要望に沿って作業を行うことになるが、使用状況等により表4.1のような作業分類を行う。
解析規模を大きくする場合は、1PEのメモリでは実行不可能なため、メモリ分割による並列化が必然となる。一方、高速化の場合、原則的にコードの性質、運用上の条件を加味し、表4.1に準じて作業を行っている。これは、CPUの有効利用にも関係するものである。
さらに、コードによってはベクトル化が困難な場合がある。このような場合には、原研で導入しているAP3000へのインストール、さらに並列化を行う場合もある。
コードを入手してからベクトル化・並列化までの一般的な手順を示す。
ベクトル化・並列化を行うにあたり、その手法について以下にまとめる。
ベクトル化・並列化のためにコードを変更することになるが、手法によっては、オリジナルのコードを大幅に変更することがある。一方、原研では高速化チューニングを施したコードに対して、後にユーザが(高速化とは無関係な)機能拡張等のための変更を加えることがある。このような場合、チューニングされたコードをユーザ自身が変更することは困難である。このため、作業前にユーザの確認を取り、高度チューニングの範囲を限定する場合がある。
並列化を行う場合、VPP FORTRANと MPIのどちらかを使用することになる。原研では前述のとおり複数の並列計算機を所有しているため、VPP500以外でコードを実行する場合がある。このため、最近はMPIによって並列化を行う傾向が高い。
ベクトル化、並列化を行っていく上で重要なポイントとなるのは、どの軸でベクトル化、または並列化をしていくかということである。特に並列化の場合、並列軸の選択次第で各PEの負荷分散や通信の発生に影響を与えるため、作業前に慎重な調査を要する。また、ベクトル軸との兼用をした場合、(ベクトル長が短くなることで)ベクトル性能の低下を招くことがあるので、なるべく避けるようにしている。
当該コードはCRAY計算機で開発されたため、基本的にベクトル処理できる構造になっている。また、2次元コードであり、ベクトル軸としてはX方向、もしくはY方向となる。
しかし、オリジナル版でのベクトル化状況はあまりよくない。当該コードのVPP500へのインストール時に、CRAY特有の組み込み関数(CVMGM)がVPP500では用意されていないため、これを模擬した外部関数を作成し代用している。このため、この関数はCRAY上ではベクトル化対象組み込み関数であったが、VPP500では一般の外部関数となり、この呼び出し部分はベクトル化対象外となってしまった。この他、細かい所でベクトル化されない要素を含んでいる。
規模拡大のための並列化を検討した結果、このコードでは領域分割が有効であることが判明した。コード内で使用される配列(array)は、領域(メッシュ)に関するものが大部分であり、これを効果的に分割することで、解析対象の大規模化が実現できる。
これらの結果、原則的にX方向をベクトル軸、Y方向を並列軸に採用することにした。
CPUコスト分布を調査するため、SAMPLER及びANALYZERを実行した。SAMPLERは実際のVPP500上でのCPU分布を、ANALYZERは副プログラムの詳細な情報を得るためのものである。表4.3、表4.4にそれぞれの実行結果を示す。表4.3から分かるように、上位5ルーチンがコストの約98%を占めており、これらを高速化の対象とした。
sub1: | フォッカープランク方程式を解きながら粒子の物性値を解く。 |
sub2: | 配列の操作を行う。 |
sub3: | ある計算ルーチンであるが、後にユーザのコード修正で廃止。 |
sub4: | フォッカープランク方程式解法ルーチンのひとつ。 |
当該コードにベクトル化チューニングを施した一例を以下に示す。
前述したように、CRAY計算機で開発したコードが元になっているので、ベクトル化を意識したコーディングになっている(図4.1)。CRAY組み込み関数CVMGMを模擬した関数(図4.2)を、コンパイルオプションによるインライン展開をすることでベクトル化が実現できた(図4.3)。
参考として、ベクトル化による性能向上率の測定結果を表4.5に示す。
当該コードにY方向の領域分割を行う並列化を施した一例を以下に示す。
領域分割の概念を図4.4に示す。
(1)メモリ分割
領域の大きさに関連を持つ配列すべてに対し、分割を行う。Y方向で分割するが、ある物性値を持つ格子に関する配列においては、ある格子点におけるその値が、隣の位置の物性値の影響を受ける場合がある。このため、場所によってはPEをまたいで参照する場合があり、袖を持たせている。オリジナルの配列宣言文を図4.5に、袖を持たせて分割した配列宣言文を図4.6に示す。
(2)命令の分割
配列の分割に伴い、正しく並列処理が行えるよう命令に対しても分割を行う。
一例として、図4.7に示したDOループを対象とし、その処理を分割し並列化したものを図4.8に示す。
ベクトル並列化版を使用して速度向上率、解析可能サイズの調査を行った。
(1)速度
速度向上率についての測定結果を表4.6及び図4.9に示す。
並列化による台数効果は使用PEが多くなるにつれ低下する。これは、コード内で並列化不可部分があること、データ転送時間によるオーバーヘッド等が原因である。
(2)解析可能サイズ
解析可能サイズについての測定結果を表4.7に示す。
解析可能サイズが台数分より大きくなっているのは、不要な配列の削除、配列の兼用のチューニングを行ったためである。
大規模計算は
1) | メモリを多く使用することで解析対象を大きくするorメッシュを細かくする。 |
2) | 高速化によって時間発展シミュレーションを長時間にわたって行うor時間ステップを小さくして詳細な解析を行う。 |
原研における高速化作業において一番の長所は、高速化技術者が実際に使用するユーザと同じ原研内に常駐していることである。これは、
1) | 高速化作業中にユーザと密に接触できることで、作業が比較的スムーズに進めやすい。 |
2) | コード納品後、コードの使い方、ユーザによるコード改良及び問題発生等において、高速化作業者が緻密なフォローができる。 |