270 likes | 399 Views
多圏間・階層間結合モデル カップラーの開発. 寺田直樹( NICT/JST )、深沢圭一郎( NICT )、 金田香織(京大理)、陣英克( NICT )、 田中高史(九大)、品川裕之( NICT ). 本研究の目的. 前回の検討会では、開発者ごとに異なるディレクトリでモデル(モジュール)開発を行い、ディレクトリを跨いでモデル結合を行う方法案を紹介した 今回の発表では、モデル結合の具体例、特にインターフェース部の紹介と説明を行う 個人作業 → 多人数での作業 まずはインターフェースの整備が必要. 本研究の目的は”基盤部”の整備
E N D
多圏間・階層間結合モデルカップラーの開発 寺田直樹(NICT/JST)、深沢圭一郎(NICT)、 金田香織(京大理)、陣英克(NICT)、 田中高史(九大)、品川裕之(NICT)
本研究の目的 • 前回の検討会では、開発者ごとに異なるディレクトリでモデル(モジュール)開発を行い、ディレクトリを跨いでモデル結合を行う方法案を紹介した • 今回の発表では、モデル結合の具体例、特にインターフェース部の紹介と説明を行う 個人作業 → 多人数での作業 まずはインターフェースの整備が必要
本研究の目的は”基盤部”の整備 • 共有して初めて意味を成す • 誰でも自由に利用して頂きたい (ボランティアベースで提供。×特定グループのプロジェクト) • 助言、批判、協力 大歓迎です • 目標とするインターフェース • 多人数での作業が可能。加えて、個人のサイエンスを楽しむことも可能 • モデルの単なる結合から、究極コード(ブラソフ等)への連続的移行が可能 • 複数領域モデルの結合 • 計算エンジンの切り替え • 便利ツールの共有化 ... などを自由に行える • 並列化・非並列化コードを吸収 • (ペタコンを狙うなら非並列は論外ですが。。)
本発表では、開発中のインターフェース部(カップラーと接合ルーチン)を紹介本発表では、開発中のインターフェース部(カップラーと接合ルーチン)を紹介 • 現在は近くの研究者と不定期に議論 • リソースを共有出来る場所を見つけて公開して行きたい
適用範囲例1: 宇宙天気モデル → 磁気嵐シミュレータ • 多くの開発要素 • 一人のスーパーマンから多人数での開発へ [Toth et al., 2005]
適用範囲例2: HZs • G,M,K型恒星放射スペクトル観測(I. Ribas, Spain) • 恒星風, CMEモデル(M. Khodachenko, Austria) • 惑星熱圏モデル(Y. Kulikov, Rusia) • 惑星外圏モデル(H. Lammer, Austria) • 惑星電磁圏モデル(N. Terada, Japan) • 隕石デリバリー, 環境進化・気候モデル, ... • ISSIチームプロポーザル(2007-) • Europlanet, ADAM&M [Lammer et al., Astrobiology, 2007] 200個以上の系外惑星が発見 地球型も
今回、開発したカップラーによって結合した3モデル今回、開発したカップラーによって結合した3モデル 外圏底より上側 粒子モデル [Kaneda et al.] 太陽風-火星電離圏MHDモデル [Terada et al.] 外圏底より下側 two-streamモデル [Kaneda et al.]
モデル結合方法 簡易結合からソース公開まで、4段階の開発レベルを用意 • レベル1 • カップラー(最上位ルーチン)とその接合部(接合ルーチン)の編集だけでモデル結合を実現。下位ルーチンはなるべく触らないで済むようにする • 下位ルーチンは実行形式(静的ライブラリ)のみ公開 • Grid converterはカップラー内で用意 • 結合変数は、接合ルーチン内でMKS単位系に変換 • レベル2 • 結合変数の規格化量・規格化ルーチンを共有化 • レベル3 • 下位ルーチンにおいてもプログラムの記述形式を統一 • 下位ルーチンも汎用性のあるもの(引数で呼ぶ形)にする • レベル4 • 下位ルーチンも含めてソース公開
カップラーと接合ルーチンの記述ルール • 気象庁・気象研究所で策定されたルールに準拠 • 基本的には、電脳倶楽部dcmodelのコーディングルールを踏襲させて頂く • 変数命名法、配列代入文の上下限指定の省略は廃止(可読性はある程度犠牲にする)などが異なる • 用意された“ひな形”を編集して結合を実現 • カップラー • exm3_couple.f90 • 接合ルーチン • pkm3_ntmism.f90, pkm3_kkexsp.f90, pkm3_kfmgsm.f90, ... • Makefileのひな形も各所に用意 exm: execution module pkm: package module crm: constant reference module vrm: variable reference module
ディレクトリ構成 kkexsp ntmism kfmgsm tuutlv couple beta (開発中コード) kkexsp_kfmgsm ... kkexsp_ntmism_kfmgsm
ディレクトリ構成 静的ライブラリ libkkexsp.a(←pkm3_kkexsp.o, a.o, b.o, ...) を作成・公開 make.ink kkexsp ntmism kfmgsm tuutlv couple beta (開発中コード) Makefile_ar pkm3_kkexsp.f90 コード群(a.f90, b.f90, ...) kkexsp_kfmgsm ... kkexsp_ntmism_kfmgsm Makefile Makefile exm3_local.f90 静的ライブラリ(*.a)と exm3_couple.f90 を結合 Makefile_couple exm3_couple.f90
ディレクトリ構成 静的ライブラリ libkkexsp.a を作成 libtuutlv.a make.ink kkexsp ntmism kfmgsm tuutlv couple beta (開発中コード) Makefile_ar 変数は引数で渡す pkm3_kkexsp.f90 Makefile_ar 計算エンジン部(ブラソフなど) 便利ツール群, ... コード群(a.f90, b.f90, ...) コード/ツールを用いたら、その ディレクトリ開発者(と共同開発者) を共著に入れるルール ⇒ 腕自慢の若手が活躍出来る場
ディレクトリ構成 静的ライブラリ libkkexsp.a を作成 libtuutlv.a make.ink kkexsp ntmism kfmgsm tuutlv couple beta (開発中コード) Makefile_ar 変数は引数で渡す pkm3_kkexsp.f90 Makefile_ar 計算エンジン部(ブラソフなど) 便利ツール群, ... コード群(a.f90, b.f90, ...) 領域モデルの結合 ⇒ 計算エンジンの切り替え 便利ツール群の共有化 究極コードへの連続移行を視野に
結合の実践手順 • 手持ちのプログラムのメイン部分を以下の3つに分割 -init (初期値設定、ファイル読み込み部) -exe (メインループ部) -finalize (終了処理、ファイル書き出し部) • 接合ルーチン(pkm3_ntmism.f90 など)の”ひな形”の指定箇所に、分割したプログラムを挿入 • カップラー(exm3_couple.f90)の”ひな形”のサブルーチンコール部分と、結合変数に関する部分を書き換え • 必要に応じて grid converter を作成or書き換え (あと、細かい変更箇所が数カ所、、) exm: execution module pkm: package module crm: constant reference module vrm: variable reference module
カップラー(exm3_couple.f90)の説明(1/5) PROGRAM exm3_couple !--------------------------------------------------------------------- ! Execution module ! Coupler of 'kkexst', 'kkexsp', and 'ntmism' ! kkexst : Kaori Kaneda, Exosphere two-stream model (open file no.*) ! kkexsp : Kaori Kaneda, Exosphere particle tracing model (open file no.*) ! ntmism : Naoki Terada, Takashi Tanaka, and Hiroyuki Shinagawa, ! Magneto-ionosphere MHD model (open file no.*) !--------------------------------------------------------------------- USE vrm3_couple ! MPI変数やexm3_couple内で使う変数を宣言 USE pkm1_kkexst USE vrm1_kkexst ! kkexstの結合変数を宣言 USE pkm3_kkexsp USE vrm3_kkexsp ! kkexspの結合変数を宣言 USE pkm3_ntmism USE vrm3_ntmism ! ntmismの結合変数を宣言 USE pkm3_ntmism2kkexsp IMPLICIT NONE ! ! Initialize ! ! ! MPI initialize ! (MPI初期化, MPI_INIT, MPI_COMM_SIZE, MPI_COMM_RANK) (MPI初期化, MPI_SPLIT, MPI_COMM_SIZE, MPI_COMM_RANK)
カップラー(exm3_couple.f90)つづき(2/5) ! ! kkexst initialize ! CALL pkm1_kkexst_init(引数) ! 引数には主に結合変数が入る ! ! kkexsp initialize ! CALL pkm3_kkexsp_init(引数) ! ! ntmism initialize ! CALL pkm3_ntmism_init(引数) ! ! Grid conversion initialize (@ ntmism master PE) ! CALL ntmism2kkexsp_gconv_init(引数) ! ! Send to master PEs ! CALL MPI_BCAST(引数)
カップラー(exm3_couple.f90)つづき(3/5) ! ! Main loop ! tim0_couple_t = 0.0_npr0_r tim0_couple_dt = 1.0e-0_npr0_r ! in [s] nlp0_couple_lmax = 1000 DO nlp0_couple_loop = 1, nlp0_couple_lmax ! ! kkexst exe ! CALL pkm1_kkexst_exe(引数) ! 引数には主に結合変数が入る ! ! kkexsp exe ! CALL pkm3_kkexsp_exe(引数) ! ! ntmism exe ! CALL pkm3_ntmism_exe(引数)
カップラー(exm3_couple.f90)つづき(4/5) ! ! Grid conversion (@ ntmism master PE) ! CALL ntmism2kkexsp_gconv_exe(引数) ! ! Send to master PEs ! CALL MPI_BCAST(引数) ! ! Advance coupling variable ! fld3_kkexsp_nhi(変数範囲) = fld3_kkexsp_nhi_adv(変数範囲) fld3_kkexsp_noi(変数範囲) = fld3_kkexsp_noi_adv(変数範囲) fld3_kkexsp_no2i(変数範囲) = fld3_kkexsp_no2i_adv(変数範囲) fld3_kkexsp_nco2i(変数範囲) = fld3_kkexsp_nco2i_adv(変数範囲) fld3_kkexst_phai_u(変数範囲) = fld3_kkexst_phai_u_adv(変数範囲) tim0_couple_t = tim0_couple_t + tim0_couple_dt END DO ! ! Finalize !
カップラー(exm3_couple.f90)つづき(5/5) ! ! kkexst finalize ! CALL pkm1_kkexst_finalize(引数) ! ! kkexsp finalize ! CALL pkm3_kkexsp_finalize(引数) ! ! ntmism finalize ! CALL pkm3_ntmism_finalize(引数) ! ! MPI finalize ! CALL MPI_FINALIZE(引数) STOP END PROGRAM exm3_couple
接合ルーチン(pkm3_ntmism.f90等)の説明 MODULE pkm3_kkexsp !--------------------------------------------------------------------- ! モジュールの説明 (open file no.*) ! 内部サブルーチンの簡単な説明 ! - pkm3_kkexsp_init : initialize calculation (public) ! - pkm3_kkexsp_exe : execute calculation (public) ! - pkm3_kkexsp_finalize : finalize calculation (public) !--------------------------------------------------------------------- IMPLICIT NONE PRIVATE ! private宣言で閉じ込め PUBLIC :: pkm3_kkexsp_init, & & pkm3_kkexsp_exe, & & pkm3_kkexsp_finalize INTEGER(KIND = 4), PARAMETER :: npr0_i = 4, & & npr0_r = 8, & & npr0_c = 1 ! ! ここで kkexsp コード群に共通の定数や変数を宣言(もしくは宣言モジュールを USE する) ! 例えば、、、 ! INTEGER(KIND = npr0_i), PARAMETER :: natom = 100000000 REAL (KIND = npr0_r), SAVE :: vel(natom)
接合ルーチン(pkm3_ntmism.f90等)の説明 CONTAINS SUBROUTINE pkm3_kkexsp_init(引数) ! 引数には主に結合変数が入る !------------------------------------------------------------------- ! 内部サブルーチンの説明 !------------------------------------------------------------------- IMPLICIT NONE ! ! ここで内部サブルーチンで用いる定数や変数を宣言 ! !------------------------------------------------------------------- ! Start main block ! ! ! ここにプログラムの初期化部分を挿入 ! ! ! End main block !------------------------------------------------------------------- RETURN END SUBROUTINE pkm3_kkexsp_init !---------------------------------------------------------------------
接合ルーチン(pkm3_ntmism.f90等)の説明 SUBROUTINE pkm3_kkexsp_exe(引数) ! 引数には主に結合変数が入る !------------------------------------------------------------------- ! 内部サブルーチンの説明 !------------------------------------------------------------------- IMPLICIT NONE ! ! ここで内部サブルーチンで用いる定数や変数を宣言 ! !------------------------------------------------------------------- ! Start main block ! ! ! ここにプログラムのメインループ部分を挿入 ! ! ! End main block !------------------------------------------------------------------- RETURN END SUBROUTINE pkm3_kkexsp_exe !---------------------------------------------------------------------
接合ルーチン(pkm3_ntmism.f90等)の説明 SUBROUTINE pkm3_kkexsp_finalize(引数) !------------------------------------------------------------------- ! 内部サブルーチンの説明 !------------------------------------------------------------------- IMPLICIT NONE ! ! ここで内部サブルーチンで用いる定数や変数を宣言 ! !------------------------------------------------------------------- ! Start main block ! ! ! ここにプログラムの終了処理部分を挿入 ! ! ! End main block !------------------------------------------------------------------- RETURN END SUBROUTINE pkm3_kkexsp_finalize !--------------------------------------------------------------------- END MODULE pkm3_kkexsp
並列実行時のモデル間データ(結合変数)伝送並列実行時のモデル間データ(結合変数)伝送 • MPIを用いて行う • 各モデルで master PE を定義 • 各モデルの接合ルーチン: master PEにデータを集める • カップラー: master PE 間でデータ通信 • 必要に応じて新コミュニケータを作成(以下パターン2では必要) • パターン1 • 全てのモデルがMPI非対応 (カップラーでのみMPIを利用) • パターン2 • いくつかのモデルがMPI対応 • パターン3 • 全てのモデルがMPI対応 (ペタコンでは必須?) モデル1 モデル2 モデル3 青:master PE BCAST (or SENDRECV) モデル1 モデル2 モデル3 GATHERV BCAST (or SENDRECV) モデル1 GATHERV モデル2 GATHERV モデル3 GATHERV
結合変数: 更新のタイミング 結合変数 nM 結合変数 nI 結合変数 nT t=t0 磁気圏モデル 電離圏モデル 熱圏モデル 結合変数は t=t0 ~ t0+dtcouple の間は固定 t=t0+dtcouple nM’ nI’ nT’ 更新
問題点、その他 • 問題点 • MPIを理解している人が一人は必要 → 一人ぐらいいるでしょう • 変数のネーミング → 検討中 • grid converterの一般化は困難 → 個別対応 • ファイル番号 → 開けたらすぐに閉める(例えばファイル番号10-19は一時的な開け閉め用とする)。開けっ放しのファイル番号はカップラーのコメント欄に明示 • 実数(整数?)の精度 → 結合変数に渡す際に double に統一 • grid conversionで保存則等は満たすべき → 将来の課題
問題点、その他 • その他 • どれぐらいの手間と時間がかかったか • 規格を決定してからは約10日。今やれば2〜3日 • 苦労したところ • MPIが絡むところがやっかい(だった) • 他モデル開発者とのやりとり • 金田さんからはA4で3枚の説明書きをもらった • 格子情報は電話で確認