28#ifndef _MATRIX_SCALAPACK_IMPL_HPP_
29#define _MATRIX_SCALAPACK_IMPL_HPP_
53inline namespace matrix {
65const size_t Matrix<C>::BLOCK_SIZE = 16;
86 : grid(comm), desc(9) {
166 size_t&
g_col)
const {
167 const int lld = get_lld();
170 prep_local_to_global();
178 const int lld = get_lld();
179 const int nprow = grid.nprow;
180 const int npcol = grid.npcol;
181 const int myprow = grid.myprow;
182 const int mypcol = grid.mypcol;
188 if (
p_row !=
size_t(myprow) ||
p_col !=
size_t(mypcol))
return false;
199 prep_global_to_local();
200 const int myprow = proc_row[
g_row];
201 const int mypcol = proc_col[
g_col];
202 comm_rank = grid.mpirank(myprow, mypcol);
208 return local_row_size_;
213 return local_col_size_;
218 return lindex % (
static_cast<size_t>(get_lld()));
223 return lindex / (
static_cast<size_t>(get_lld()));
228 return BLOCK_SIZE * ((
l_row / BLOCK_SIZE) * grid.nprow + grid.myprow) +
229 (
l_row % BLOCK_SIZE);
234 return BLOCK_SIZE * ((
l_col / BLOCK_SIZE) * grid.npcol + grid.mypcol) +
235 (
l_col % BLOCK_SIZE);
241 if (has_local_to_global)
return;
243 const int nprow = grid.nprow;
244 const int npcol = grid.npcol;
245 const int myprow = grid.myprow;
246 const int mypcol = grid.mypcol;
252#pragma omp parallel default(shared)
256 global_row[
l_row] = BLOCK_SIZE * ((
l_row / BLOCK_SIZE) * nprow + myprow) +
257 (
l_row % BLOCK_SIZE);
261 global_col[
l_col] = BLOCK_SIZE * ((
l_col / BLOCK_SIZE) * npcol + mypcol) +
262 (
l_col % BLOCK_SIZE);
266 has_local_to_global =
true;
272 if (has_global_to_local)
return;
274 const int nprow = grid.nprow;
275 const int npcol = grid.npcol;
286 lld_list.resize(nprow);
288#pragma omp parallel default(shared)
305 for (
size_t myprow = 0; myprow <
size_t(nprow); ++myprow) {
313 lld_list[myprow] = (
locr < 1) ? 1 :
locr;
317 has_global_to_local =
true;
324 int xMB = BLOCK_SIZE;
325 int xNB = BLOCK_SIZE;
334 local_row_size_ =
static_cast<size_t>(
locr);
335 local_col_size_ =
static_cast<size_t>(
locc);
336 has_local_to_global =
false;
337 has_global_to_local =
false;
352 out <<
"Matrix: prow= " << grid.myprow <<
" pcol= " << grid.mypcol
353 <<
" local_size= " << local_size() <<
" lld(locr)= " << get_lld()
354 <<
" locc= " << local_size() / get_lld() <<
"\n";
360 for (
size_t i = 0;
i < V.size(); ++
i) V[
i] +=
rhs[
i];
367 for (
size_t i = 0;
i < V.size(); ++
i) V[
i] -=
rhs[
i];
373 for (
size_t i = 0;
i < V.size(); ++
i) V[
i] *=
rhs;
379 for (
size_t i = 0;
i < V.size(); ++
i) V[
i] /=
rhs;
384template <
typename UnaryOperation>
386 std::transform(V.begin(), V.end(), V.begin(),
op);
396 std::vector<int>
dest_rank(local_size());
397 std::vector<size_t> local_position(local_size());
399 for (
size_t i = 0;
i < local_size();
i++) {
406 local_position[
i] =
pos;
418 const size_t n = n_row() * n_col();
419 const size_t nr = n_row();
420 std::vector<C>
vec(
n);
422 for (
size_t i = 0;
i < local_size(); ++
i) {
449 prep_local_to_global();
451 fout <<
"local_size= " << local_size() <<
"\n";
454 fout <<
"[global_row]\n";
456 fout <<
" " << global_row[
i];
457 if (
i % BLOCK_SIZE == BLOCK_SIZE - 1)
fout <<
"\n";
460 fout <<
"[global_col]\n";
462 fout <<
" " << global_col[
i];
463 if (
i % BLOCK_SIZE == BLOCK_SIZE - 1)
fout <<
"\n";
473 const std::vector<size_t>& local_position,
476 const int mpisize =
M.get_comm_size();
478 const size_t local_size =
M.local_size();
480 const C*
mat =
M.head();
485 assert(local_position.size() == local_size);
493 for (
size_t i = 0;
i < local_size; ++
i) {
499 for (
int rank = 0; rank < mpisize; ++rank) {
514 for (
size_t i = 0;
i < local_size; ++
i) {
539 const std::vector<size_t>& local_position,
542 const int mpisize =
M_new.get_comm_size();
544 const size_t local_size = V.size();
546 const C*
mat = V.data();
551 assert(local_position.size() == local_size);
559 for (
size_t i = 0;
i < local_size; ++
i) {
565 for (
int rank = 0; rank < mpisize; ++rank) {
580 for (
size_t i = 0;
i < local_size; ++
i) {
605 const std::vector<size_t>& local_position,
608 const int mpisize =
M.get_comm_size();
609 const int mpirank =
M.get_comm_rank();
610 const size_t local_size =
M.local_size();
614 assert(local_position.size() == local_size);
617 for (
size_t i = 0;
i < local_size; ++
i) {
622 const C*
mat =
M.head();
626 int dest = (mpirank +
step) % mpisize;
627 int source = (mpirank + mpisize -
step) % mpisize;
628 if (
dest == mpirank) {
629 for (
size_t i = 0;
i < local_size;
i++) {
646 for (
size_t i = 0;
i < local_size;
i++) {
674 for (
size_t i = 0;
i <
n; ++
i) {
686 for (
size_t i = 0;
i <
n; ++
i) {
695 const size_t n =
A.local_size();
699 for (
size_t i = 0;
i <
n; ++
i) {
Distributed matrix using ScaLAPACK.
Definition matrix_scalapack.hpp:49
size_t global_row_index(size_t lindex_row) const
Definition matrix_scalapack_impl.hpp:227
Matrix & operator*=(C rhs)
Definition matrix_scalapack_impl.hpp:372
const C * head() const
Definition matrix_scalapack_impl.hpp:103
void global_index(size_t i, size_t &g_row, size_t &g_col) const
Definition matrix_scalapack_impl.hpp:165
Matrix & operator/=(C rhs)
Definition matrix_scalapack_impl.hpp:378
int n_col() const
Definition matrix_scalapack_impl.hpp:149
size_t local_size() const
Definition matrix_scalapack_impl.hpp:113
Matrix()
Definition matrix_scalapack_impl.hpp:70
int get_comm_rank() const
Definition matrix_scalapack_impl.hpp:131
const int * descriptor() const
Definition matrix_scalapack_impl.hpp:136
size_t global_col_index(size_t lindex_col) const
Definition matrix_scalapack_impl.hpp:233
Matrix & operator+=(const Matrix &rhs)
Definition matrix_scalapack_impl.hpp:358
size_t local_row_size() const
Definition matrix_scalapack_impl.hpp:207
const Matrix transpose()
Definition matrix_scalapack_impl.hpp:391
void print_info(std::ostream &) const
Definition matrix_scalapack_impl.hpp:351
void local_position(size_t g_row, size_t g_col, int &comm_rank, size_t &lindex) const
Definition matrix_scalapack_impl.hpp:197
Matrix & map(UnaryOperation op)
size_t local_row_index(size_t lindex) const
Definition matrix_scalapack_impl.hpp:217
void prep_local_to_global() const
Preprocess for fast conversion from local index to global one.
Definition matrix_scalapack_impl.hpp:240
int n_row() const
Definition matrix_scalapack_impl.hpp:144
int get_comm_size() const
Definition matrix_scalapack_impl.hpp:126
void init(size_t n_row, size_t n_col)
Definition matrix_scalapack_impl.hpp:321
void prep_global_to_local() const
Preprocess for fast conversion from global index to local one.
Definition matrix_scalapack_impl.hpp:271
const MPI_Comm & get_comm() const
Definition matrix_scalapack_impl.hpp:121
void save_index(const std::string &filename) const
Definition matrix_scalapack_impl.hpp:446
std::vector< C > flatten()
Definition matrix_scalapack_impl.hpp:417
size_t local_col_size() const
Definition matrix_scalapack_impl.hpp:212
size_t local_col_index(size_t lindex) const
Definition matrix_scalapack_impl.hpp:222
C allreduce_sum(C value) const
Definition matrix_scalapack_impl.hpp:435
bool local_index(size_t g_row, size_t g_col, size_t &i) const
Definition matrix_scalapack_impl.hpp:176
void bcast(D *buffer, int count, int root) const
Definition matrix_scalapack_impl.hpp:441
Matrix & operator-=(const Matrix &rhs)
Definition matrix_scalapack_impl.hpp:365
void barrier() const
Definition matrix_scalapack_impl.hpp:430
const C & operator[](size_t i) const
Definition matrix_scalapack_impl.hpp:93
std::string filename(const std::string &prefix, int proc_size)
Definition common.hpp:32
std::complex< double > complex
Definition complex.hpp:38
mptensor::complex complex
Definition matrix_lapack.cc:36
void descinit_(int desca[], int *M, int *N, int *MB, int *NB, int *irsrc, int *icsrc, int *ictxt, int *lld, int *info)
int numroc_(int *M, int *MB, int *prow, int *irsrc, int *nprow)
Wrapper functions of MPI communications.
C matrix_trace(const Matrix< C > &a)
Definition matrix_scalapack_impl.hpp:694
void sum_matrix_data(const Matrix< C > &M, const std::vector< int > &dest_rank, const std::vector< size_t > &local_position, Matrix< C > &M_new)
Definition matrix_scalapack_impl.hpp:604
void replace_matrix_data(const Matrix< C > &M, const std::vector< int > &dest_rank, const std::vector< size_t > &local_position, Matrix< C > &M_new)
Definition matrix_scalapack_impl.hpp:472
double max_abs(const Matrix< C > &a)
Definition matrix_scalapack_impl.hpp:670
double min_abs(const Matrix< C > &a)
Definition matrix_scalapack_impl.hpp:682
void alltoallv(const C *sendbuf, const int *sendcounts, const int *sdispls, C *recvbuf, const int *recvcounts, const int *rdispls, const MPI_Comm &comm)
Wrapper of MPI_Alltoallv.
Definition mpi_wrapper.hpp:185
std::vector< C > allreduce_vec(const std::vector< C > &vec, const MPI_Comm &comm)
Calculate a summation of each element of vector over MPI communicator.
Definition mpi_wrapper.hpp:89
C allreduce_sum(C val, const MPI_Comm &comm)
Calculate a summation over MPI communicator.
Definition mpi_wrapper.hpp:75
void bcast(C *buffer, int count, int root, const MPI_Comm &comm)
Wrapper of MPI_Bcast.
Definition mpi_wrapper.hpp:202
void sendrecv(const C *sendbuf, int sendcount, int dest, int sendtag, C *recvbuf, int recvcount, int source, int recvtag, const MPI_Comm &comm)
Wrapper of MPI_Sendrecv.
Definition mpi_wrapper.hpp:126
void allreduce(const C *sendbuf, C *recvbuf, int count, MPI_Op op, const MPI_Comm &comm)
Wrapper of MPI_Allreduce.
Definition mpi_wrapper.hpp:107
void alltoall(const C *sendbuf, int sendcount, C *recvbuf, int recvcount, const MPI_Comm &comm)
Wrapper of MPI_Alltoall.
Definition mpi_wrapper.hpp:163
Definition complex.hpp:34