-
Notifications
You must be signed in to change notification settings - Fork 2
RokkoRefactorMPIDenseSolvers
Tatsuya Sakashita edited this page Jul 27, 2015
·
27 revisions
動機:solverがないと、maping_bcが作れないのは変。
mapping_bc map(dim, g, solver)
とすると、solverに対する最適なmappingが返される。
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)
- 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の統一化