Использование darray mpi типа данных в скальпаке в c - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь использовать 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 работать в матрицах прямоугольника.

...