Skip to content

RokkoRefactorMPIDenseSolvers

Tatsuya Sakashita edited this page Jul 27, 2015 · 27 revisions

MPI分散密行列のリファクタリング

動機:solverがないと、maping_bcが作れないのは変。

メインプログラムの書き方

mapping_bc map(dim, g, solver)

とすると、solverに対する最適なmappingが返される。

mapping_bcのリファクタリング

クラスの構造

mapping_bc

  • mapping_global2local, mapping_local2arrayを継承

mapping_global2local

  • global address (2dim) ←→ local address (2dim)
  • mapping_common_sizesを仮想継承

mapping_local2array

  • local address (2dim) ←→ 1 dimensional address of array (1dim)
  • mapping_common_sizesを仮想継承

mapping_common_sizes

  • m_local, n_localのみを扱うクラス

詳細

MATRIX_MAJORの指定

  • rokko::localized_matrixではテンプレートパラメータで行っている。(Eigen3を継承しているため。)
  • rokko::distributed_matrixでは、コンストラクタに渡すテンプレートパラメータで行うように変更
  • mapping_local2arrayのコンストラクタで無名引数を使って、MATRIX_MAJORを取り出している。(gridクラスと同様)
  • デフォルトはmatrix_col_major(LAPACK系を使うソルバは全てmatrix_col_majorなので)

mapping_bcのgrid

  • コンストラクタで省略した場合、デフォルトのグリッド(MPI_COMM_WORLDからrow-majorで正方になるように作られたもの)が使われる。

matrix_majorをテンプレートパラメータに変更した

理由:

  • get_localなどのメンバ関数を呼び出すときに、その都度if分によるmatrix_majorの判定が入り、オーバーヘッドが生じるため。
  • rokko::localized_matrixと同様にクラステンプレートでmatrix_majorを指定するようになっており、一貫させるため。

rokko::distributed_matrixとの関係:

  • いまのところ、全てのMPI並列ソルバは、matrix_col_majorのみサポートしている。
  • rokko::distributed_matrixもクラステンプレートをとるようにした。
  • ソルバがサポートしているmatrix_majorと一致しているかを、rokko::distributed_matrixのコンストラクタでチェックする。
  • 一致していなかったら、エラーとする。(行と列を読み替えても、lldがある場合、一致しないため。)
  • テンプレートパラメータは取り出せないので、一々、宣言時に書かないといけないのが欠点。

(旧)mapping_bcのコンストラクタでの処理

  • optimized_mappingを返すコンストラクタは、メンバ変数の初期値の代入で処理ができない。
  • そのため、スーパークラスmapping_global2local, mapping_local2arrayのメンバ変数の初期化には、それらのデフォルトコンストラクタが呼び出される。
  • 上記の場合、全てのメンバ変数は上書きされるので、スーパークラスmapping_global2local, mapping_local2arrayのデフォルトコンストラクタは何もしないようにした。

ソルバインターフェースが返す最適なmapping_bcについて

  • MPIソルバごとに対応しているmatrix_majorも返す。
  • solver_in.optimized_mapping(g_in, m_global)の引数がm_global, n_globalのうち片方だけであるのは、今のところ、正方行列をとるソルバしか扱っていないため。 Todo
  • 非正方行列向けのソルバ(QR分解など)を扱えるように、m_global, n_globalもとれるようにする。

mapping_global2localのコンストラクタ

  • m_global, n_globalと(ソルバごとに決まる)mb, nbから、m_local, n_localを計算(ScaLAPACKで使用可能) Todo
  • m_global, n_globalとm_local, n_localから、mb, nbを計算(需要はないかもしれないが)引数:(grid const& g_in, int m_global_in, int n_global_in, int m_local_in, int n_local_in)

distributed_matrix

  • mapping_bcをメンバ変数に持つ
  • arrayの実体を持つ

distributed_matrixとスーパークラスのメンバ関数

  • distributed_matrixにも実装するもの
  • get_m_local(), translate_l2g(), get_nprow()などユーザが頻繁に使う関数
  • mat.get_mapping().get_m_local()だけでなく、mat.get_m_local()とも書ける。
  • しないもの
    • set_lld()などdistributed_matrixの初期化時にしか利用せず、ユーザが直接使用することは少ない。
    • このようなメンバ関数に関しては、get_mapping()を通して呼び出すようにする。

Todo

  • デフォルトコンストラクタでは、m_global(0), n_global(0)と初期化するべきか。

Todo

  • diatributed_matrixとdistributed_vectorの統一化
Clone this wiki locally