Ошибка ScaLapack разложения cholesky
Я получаю следующую ошибку, и яЯ не уверен, почему.
{ 1, 1}: On entry to PDPOTRF parameter number 2 had an illegal value
{ 1, 0}: On entry to PDPOTRF parameter number 2 had an illegal value
{ 0, 1}: On entry to PDPOTRF parameter number 2 had an illegal value
{ 0, 0}: On entry to PDPOTRF parameter number 2 had an illegal value
info < 0: If the i-th argument is an array and the j-entry had an illegal value, then INFO = -(i*100+j), if the i-th argument is a scalar and had an illegal value, then INFO = -i.
Я знаю, что означают сообщения об ошибках, но я следовал за датированной документацией, доступной в Интернете, как можно лучше и пытался собрать параллельную фактуру cholesky из рабочих примеров кодов в Интернете. Я'Я не уверен, где я ошибся.
Может кто-нибудь объяснить, где я ошибся в коде ниже? Вот'обзор того, что делает код, яm тестирование с 4 процессорами и разделение матрицы 8x8 на сетку блоков процессора 2 x 2 загружает матрицу из файла, вот пример матричного файла 8 x 8,
182 147 140 125 132 76 126 157
147 213 185 150 209 114 166 188
140 185 232 129 194 142 199 205
125 150 129 143 148 81 104 150
132 209 194 148 214 122 172 189
76 114 142 81 122 102 129 117
126 166 199 104 172 129 187 181
157 188 205 150 189 117 181 259
Я следовал примерам, чтобы распределить матрицу по 4 отдельным локальным массивам 4x4 по одному на каждый из 4 узлов. Я тогда бегуdescinit_
и позвонить в связанныйpdpotrf_
рутина, которая дает вышеупомянутую ошибку. Я понятия не имею, где я ошибся и попытался следовать документации как можно лучше. Рабочий пример параллельного разложения по Холески в фортране также очень помог бы
Ссылки на вызовы функций
Параметры запуска
code name - Meaning = Value
N - Global Rows = 8
M - Global Cols = 8
Nb - Local Block Rows = 2
Mb - Local Block Cols = 2
nrows - Local Rows = 4
ncols Local Cols= 4
lda - Leading dimension of local array = 4 (i've tried 2,4,8)
ord - Order of Matrix = 4 (i've also tried many different things here as well)
Я напечатал вышеупомянутые параметры на каждом узле, и они одинаковы
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/*
To compile:
mpic++ test.cpp -o test -L/home/admin/libs -lscalapack -lrefblas -ltmg -lreflapack -lgfortran -Wall -O2
To run:
mpirun -np 4 ./test matrixfile 8 8 2 2
*/
extern "C" {
/* Cblacs declarations */
void Cblacs_pinfo(int*, int*);
void Cblacs_get(int, int, int*);
void Cblacs_gridinit(int*, const char*, int, int);
void Cblacs_gridinfo(int, int*, int*, int*,int*);
void Cblacs_pcoord(int, int, int*, int*);
void Cblacs_gridexit(int);
void Cblacs_barrier(int, const char*);
void Cdgerv2d(int, int, int, double*, int, int, int);
void Cdgesd2d(int, int, int, double*, int, int, int);
int numroc_(int*, int*, int*, int*, int*);
void pdpotrf_(char*, int*, double*,
int*, int*, int*, int*);
void descinit_( int *, int *, int *, int *, int *, int *, int *,
int *, int *, int *);
}
int main(int argc, char **argv){
/* MPI */
int mpirank,nprocs;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &mpirank);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
double MPIelapsed;
double MPIt2;
double MPIt1;
/* Helping vars */
int iZERO = 0;
int verbose = 1;
bool mpiroot = (mpirank == 0);
if (argc < 6) {
if (mpiroot)
cerr < "Usage: matrixTest matrixfile N M Nb Mb"
< endl
< " N = Rows , M = Cols , Nb = Row Blocks , Mb = Col Blocks "
< endl;
MPI_Finalize();
return 1;
}
/* Scalapack / Blacs Vars */
int N, M, Nb, Mb;
int descA[9];
int info = 0;
// int mla = 4;
int ord = 8;
double *A_glob = NULL, *A_glob2 = NULL, *A_loc = NULL;
/* Parse command line arguments */
if (mpiroot) {
/* Read command line arguments */
stringstream stream;
stream < argv[2] < " " < argv[3] < " " < argv[4] < " " < argv[5];
stream >> N >> M >> Nb >> Mb;
/* Reserve space and read matrix (with transposition!) */
A_glob = new double[N*M];
A_glob2 = new double[N*M];
string fname(argv[1]);
ifstream file(fname.c_str());
for (int r = 0; r < N; ++r) {
for (int c = 0; c < M; ++c) {
file >> *(A_glob + N*c + r);
}
}
/* Print matrix */
if(verbose == 1) {
cout < "Matrix A:\n";
for (int r = 0; r < N; ++r) {
for (int c = 0; c < M; ++c) {
cout < setw(3) < *(A_glob + N*c + r) < " ";
}
cout < "\n";
}
cout < endl;
}
}
/* Begin Cblas context */
int ctxt, myid, myrow, mycol, numproc;
//