Я пытаюсь использовать MPI IO, чтобы прочитать большую матрицу, хранящуюся в файле, и обработать ее, используя скальпак, используя язык c.
I first start by creating mpi data type using:
ierr = MPI_Type_create_darray(procs, mpirank, 2,
dims, distribs, dargs, pdims, MPI_ORDER_C,
oldtype, newtype);
Then, I read the file by using:
ierr = MPI_File_open(MPI_COMM_WORLD, filename, MPI_MODE_RDONLY,
MPI_INFO_NULL, &infile);
ierr = MPI_File_set_view(infile, 0, oldtype, newtype, "native", MPI_INFO_NULL );
ierr = MPI_File_read_all(infile, A, A_size, oldtype, &mpistatus);
ierr = MPI_File_close(&infile);
In matrix operations part:
Cblacs_get(-1, 0, &icontxt);
Cblacs_gridinit( &icontxt, "R", prow, pcol );
Cblacs_gridinfo(icontxt, &prow, &pcol, &myrow, &mycol);
// Get the local size and make memeory allocation
int i0 = 0; //int q1=1; int one=1;
myArows = numroc_(&M, &nb, &myrow, &i0, &prow );
myAcols = numroc_(&N, &nb, &mycol, &i0, &pcol );
A = (float *) malloc (myArows*myAcols*sizeof(float));
descinit_(descA, &M, &N, &nb, &nb, &i0, &i0, &icontxt, &myArows, &info );
myBrows = numroc_(&N, &nb, &myrow, &i0, &prow );
myBcols = numroc_(&N, &nb, &mycol, &i0, &pcol );
B = (float *) malloc (myBrows*myBcols*sizeof(float));
descinit_(descB, &N, &N, &nb, &nb, &i0, &i0, &icontxt, &itempB, &info );
psgemm_("T", "N", &N, &N, &M, &alpha, A, &ia, &ja, descA, A, &ia, &ja, descA,
&beta, B, &ia, &ja, descB);
Я пытаюсь вычислить A ^ T * A = B.У меня неправильные результаты, и это не так, как производит Matlab из python.
Я попытался отладить проблему, и я думаю, что проблема, возникающая из-за расположения mpi gird, не совместима со scalapack, поскольку mpi darray использует MPI_ORDER_C и scalapack основанна фортране.Я попробовал другой альтернативный MPI_ORDER_FORTRAN, он работает только с квадратными матрицами, но не с прямоугольником один раз.
Мне нужна помощь, чтобы заставить циклическое распределение mpi-io 2d и циклическое распределение scalapack 2d работать в матрицах прямоугольника.