RokkoWrapperParallelDenseSolvers - t-sakashita/rokko GitHub Wiki

密行列ソルバ(MPI並列版)向けラッパーの実装

ラッパーROKKO_pdsyevシリーズに、以下を行うラッパーを用意

  • 作業配列のサイズ取得のための固有値ルーチンの呼び出し
  • 計算のための固有値ルーチンの呼び出し

標準出力

  • エラーメッセージやverboseの出力は、プロセス0でのみ行うようにする。

検討

  • LAPACKの関数pxerblaでメッセージを表示するようにする?
  • ScaLAPACKのラッパーでも、LAPACKE_malloc、lapack_intを使うべきか。

ソルバのエラー プロセス数が1のとき、エラーが出る。

  • pdsyevd(Clangでビルド)
$ mpirun -np 1 ./frank_mpi_mapping scalapack:pdsyevd
Eigenvalue decomposition of Frank matrix
library:routine = scalapack:pdsyevd
num_procs = 1
routine = pdsyevd
dimension = 10
{    0,    0}:  On entry to PDORMTR parameter number   16 had an illegal value
largest eigenvalues: 44.766 5.0489 1.873 1 0.6431 0.46523 0.36621 0.30798 0.27379 0.25568
residual of the largest eigenvalue/vector: |x A x - lambda| = 43.951

これは、ScaLAPACKのバグのようだ。 https://listserv.fysik.dtu.dk/pipermail/gpaw-users/2013-September/002347.html

  • pdsyevx(これはClangだけかも)
$ mpirun -np 1 ./frank_mpi_mapping scalapack:pdsyevx
Eigenvalue decomposition of Frank matrix
library:routine = scalapack:pdsyevx
num_procs = 1
routine = pdsyevx
dimension = 10
--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 10896 on node sakashita exited on signal 6 (Abort trap: 6).
--------------------------------------------------------------------------
zsh: exit 134   mpirun -np 1 ./frank_mpi_mapping scalapack:pdsyevx

配列の宣言の仕方を変えるとエラーは消える。

  • エラー出る:double work[1];
  • エラー出ない:double* work = new double[1];

関係ありそう:http://stackoverflow.com/questions/15038582/c-buffer-overflow-why-is-there-a-constant-number-of-bytes-that-trips-a-segfaul