プログラムの高速化・並列化サービスの事例

チューニングレポート<要約>:MPI並列有限要素法ソルバPARA-BMUへの並列I/O実装

*ここに掲載するのは、エジンバラ大学、EPCCのNick Johnson, Iain Bethune両博士によるHECToRレポート「Adding Parallel I/O to PARA-BMU, Nick Johnson, Iain Bethune, EPCC, The University of Edinburgh, October 1, 2012」を要約したものです。

[2016年10月掲載]



概要

VOX-FEは、Hull大学のMichael Fagan教授の医学&生物工学グループにより開発されたボクセルベースの有限要素骨格モデリングソフトウェアです。これはEPSRCのプロジェクト“大規模スパース系の新規の非同期アルゴリズム“におけるデモアプリケーションの一つです。VOX-FEのアルゴリズムのコアは、スケーラビリティと機能の改善が成されています。VOX-FEは、骨格構造の作成と応力適用結果の可視化のためのGUIと、線形弾性問題の計算と骨格内の応力と歪み計算ためのMPI並列有限要素法ソルバPARA-BMUから構成されています。計算例には、切歯を噛む際のヒト下顎骨(顎骨)の最大主ひずみの計算、または軸方向に負荷をかけた大腿骨の応力の解析が含まれます。

入出力はASCIIファイルを用いています。ソルバルーチンが並列で実行する際に、一つのプロセスが入出力をシリアル実行します。こうしたやり方は多数の有限要素を用いた大規模コア数上ではスケールせず、実行時間は計算よりもI/OとMPIデータ通信に支配されます。テキストファイルを用いる際の副作用として、問題サイズが大きくなるとファイルサイズとデータ転送時間が膨大になることがあります。Fagan教授グループは近い将来に百万以上の要素を用いた骨格モデルを頻繁に研究する方針です。そこでは入力ファイルは数GBになると予想されます。


目標

当初のプロジェクトの目標は、I/Oルーチンの並列化によりコードのスケーラビリティを改善することでした。そこで以下の目標がありました:
・ファイルをnetCDF-HDF5フォーマットへ変更することで、ファイルサイズを2から20倍縮小する。
・並列netCDFルーチンを用いて、ディスクI/O速度を最低3から4倍高速化する。

現状ではこのコードの強スケール性は良くありません。入力はマスタープロセス上でシリアル実行され、出力は各プロセスで実行されますが、ラウンドロビンによるシリアル実行です。1MPIプロセスによるシリアル実行に比べ、最大で22倍までの高速化しか示しません。このコードの理論的な並列限界は領域分割が一次元のため問題のz平面数です。このレポートではFagan教授グループより渡された、約29M要素のから成る884個のz平面を持つ高解像度モデルを使用します。

後方互換性のために、依然のデータファイルを使用可能のままにして全てのシリアルI/Oルーチンを残しておきます。さらに、依然のASCIIファイルと新しいフォーマット間の変換ユーティリティを作成します。


I/O最適化

現状のPARA-BMUでは、データはBYTE型の動的アロケーション配列に格納されます。この型は8ビット長で符号無しのC++のユーザ定義型です。配列要素はボクセルを表し、その値は物理領域のHounsfield値(実際には骨格サンプルのCTスキャンで得られた密度値)です。データはカルテシアン座標に対応する次元を持つ3D配列として構成されています。ソルバは系のz平面スライス上で計算します。データは、物質が存在していないことを表す0値を持つ要素(すなわち空き空間)を多く含んでいます。

入力

既存の入力処理は、ASCIIフォーマットテキストファイルから全データをマスタープロセスのバッファへ読み込む部分と、その後z平面データをMPIで各プロセスへ送信する部分から構成されます。
ヘッダ情報以外の入力ファイルの各行は1レコードで一つのボクセルに相当します。これには要素番号、タイプ(データ値)および先述の系におけるボクセルのx,y,z座標が含まれます。このデータは、ファイル入力値から内部表現の定義された材質データへ変換されます。
入力が完了したら、ステンシル演算が適用されて、z平面毎にある値を持つ要素の分布を生成します。負荷バランス手法が適用され、このz平面データ数分布を各MPIプロセスへ分散します。

新しい入力ルーチンを追加し、スクリプトファイルで既存の引数で選択が可能なように付け加えました。
新しいアルゴリズムでは、マスタープロセスを含む全プロセスがデータを読み込みます。読み込まれた各z平面データは、ソルバで必要となる最低のz平面と共にプロセスへ送信されます。シリアル実行版の負荷バランス手法は用いず、読み込み済みの複雑なデータの再配置用に使用します。

出力

既存の出力では、全プロセスが一つのテキストファイルへ各データを書き込む際に、ラウンドロビン法でシリアル実行します。
最初にマスタープロセスがファイルをオープンし、ヘッダ情報をそのファイルに書き込みます。マスタープロセスがそのデータを書き込むと、シグナルプロセスが1つのMPI呼出しによりその自身のデータを書き込みます。書き込みが終われば次のプロセスが呼び出され、全てのプロセスに渡りデータが書き出されるまで繰り返されます。プロセス呼出しと共に、プロセス間に再番号付けされたノードオフセット(long整数)も送信されます。この値は出力ファイル内の正しいノード番号付けに必要です。各作業プロセスは全プロセスが自身のデータ書き込みの終了するまでアイドル状態で待ち合わせします。

新しい出力ルーチンは概念的にはシリアル版を似ていますが、全出力が並列で実行される点が異なります。
シリアル実行ケースとは対照的に、データの書き込み前に再番号付けオフセットが計算されます。この計算が完了した後、出力ファイルへの並列書き出しプロセスを制御するnc_put_varaルーチン呼出しの前に、プロセス間の同期のためのMPI_Barrierを呼び出します。
入力ファイルとは異なり、そのライブラリ制限によりnetCDFによる書き出し時の圧縮が出来ません。ユーザはnetCDFのコマンド"nccopy"を用いて圧縮を実行する必要があります。


結果

MPI_Wtimeルーチンを挿入してシリアル実行と並列実行バージョンの経過時間を計測しました。ノード当たり32プロセッサを全て用いて、4ノード128プロセッサを上で計測を行いました。各並列プロセス時間は一様でないため、最悪ケースを記録しました。シリアル実行の場合はマスタープロセス時間を記録しました。ここでは入出力関数呼び出しのみを記録し、メモリーへの格納や、変換ルーチン、カウンタインクリメントについては両方で同じなので記録していません。

入力時間はシリアルが30秒に対し、並列版は0.4秒です。出力時間はシリアルが118秒に対し、並列版は7秒でした。並列版は相対的にI/O速度が遅いですが、絶対的な時間が極めて小さくなりました。

ベンチマーク結果から、新しい並列I/Oルーチンを用いた全計算時間はシリアルI/Oに比べ優れていますが、ソルバ単体のスケール性程ではなく依然最適化の余地が残っています。512MPIプロセスを用いた場合シリアル実行と比較して、シリアルI/Oは約22倍、並列I/Oは約90倍、ソルバ単体は180倍に加速します。

結論

netCDFライブラリを用いた改善により、入出力時間とファイルサイズの削減に成功しました。この改善結果はCCPForgeのメイン開発バージョンへマージされました。この結果により、PARA-BMUは小さなクラスタでの実行よりも、HECToR上での利用が現実的なものになり、以前にない大きなスケールと精度による骨格モデリングを可能にします。

謝辞

このプロジェクトは、NAG Ltd.が運営するHECToRの分散計算科学および工学(CSE)サービスの基に実行されました。英国の国立スーパーコンピューティング・サービスである、HECToR:英国リサーチ・カウンシル・ハイエンド計算サービスは、リサーチ・カウンシルを代行するEPSRCが管理しています。そのミッションは英国学術界の科学および工学の研究支援です。HECToRスーパーコンピューターは、UoE HPCx Ltd.およびNAG Ltd.のCSEサポートサービスにより管理運営されています。

文献

[1] Medical & Biological Engineering, University of Hull VOX-FE: Voxel Based Finite Element Analysis http://www2.hull.ac.uk/science/medical__biological_eng/research/vox-fe.aspx
[2] netCDF http://www.unidata.ucar.edu/software/netcdf/
[3] HDF5 http://www.hdfgroup.org/HDF5/
関連情報
MENU
Privacy Policy  /  Trademarks