[petsc-users] The multiplication of large matrices

Jed Brown jedbrown at mcs.anl.gov
Wed May 29 15:42:16 CDT 2013


Joon hee Choi <choi240 at purdue.edu> writes:

> Dear Matthew,
>
> Thank you for your fast reply.
> I am attaching the actual error output and my code below. The error output is repeated by for-loop. Could you let me know what might be wrong? 
>
> Thank you,
> Joon
>
> [0]PETSC ERROR: --------------------- Error Message ------------------------------------
> [0]PETSC ERROR: No support for this operation for this object type!
> [0]PETSC ERROR: MatMatMult not supported for B of type localref!
> [0]PETSC ERROR: ------------------------------------------------------------------------
> [0]PETSC ERROR: Petsc Release Version 3.3.0, Patch 6, Mon Feb 11 12:26:34 CST 2013
> [0]PETSC ERROR: See docs/changes/index.html for recent updates.
> [0]PETSC ERROR: See docs/faq.html for hints about trouble shooting.
> [0]PETSC ERROR: See docs/index.html for manual pages.
> [0]PETSC ERROR: ------------------------------------------------------------------------
> [0]PETSC ERROR: ./tensor on a linux-sta named rossmann-a009.rcac.purdue.edu by choi240 Wed May 29 05:53:46 2013
> [0]PETSC ERROR: Libraries linked from /apps/rhel5/petsc-3.3-p6/64/impi-4.1.0.024_intel-13.0.1.117_ind64/linux-static/lib
> [0]PETSC ERROR: Configure run at Tue May 21 15:56:45 2013
> [0]PETSC ERROR: Configure options --with-cc=mpiicc --with-cxx=mpiicpc --with-fc=mpiifort --with-scalar-type=real --with-shared-libraries=0 --with-pic=1 --with-clanguage=C++ --with-fortran --with-fortran-kernels=1 --with-64-bit-indices=1 --with-debugging=0 --with-blas-lapack-dir=/opt/intel/composer_xe_2013.1.117/mkl/lib/intel64 --COPTFLAGS=-O3 --CXXOPTFLAGS=-O3 --FOPTFLAGS=-O3 --download-hdf5=no --download-metis=no --download-parmetis=no --download-superlu_dist=no --download-mumps=no --download-scalapack=yes --download-blacs=yes --download-hypre=no --download-spooles=no
> [0]PETSC ERROR: ------------------------------------------------------------------------
> [0]PETSC ERROR: MatMatMult() line 8603 in /apps/rhel5/petsc-3.3-p6/64/impi-4.1.0.024_intel-13.0.1.117_ind64/src/mat/interface/matrix.c
> [0]PETSC ERROR: --------------------- Error Message ------------------------------------
> [0]PETSC ERROR: No support for this operation for this object type!
> [0]PETSC ERROR: MatMatMult not supported for B of type localref!
>
>    for (i=0; i<I; i++) idxXrow[i] = i;
>    for (i=0; i<I; i++) idxBrow[i] = i;
>    for (j=0; j<J; j++) idxCrow[j] = j;
>    ierr = ISCreateGeneral(PETSC_COMM_SELF, I, idxXrow, PETSC_COPY_VALUES, &isXrow); CHKERRQ(ierr);
>    ierr = ISCreateGeneral(PETSC_COMM_SELF, I, idxBrow, PETSC_COPY_VALUES, &isBrow); CHKERRQ(ierr);
>    ierr = ISCreateGeneral(PETSC_COMM_SELF, J, idxCrow, PETSC_COPY_VALUES, &isCrow); CHKERRQ(ierr);
>
>    for (r=0; r<R; r++) {
>       ierr = ISCreateGeneral(PETSC_COMM_SELF, 1, &r, PETSC_COPY_VALUES, &isBCcol); CHKERRQ(ierr);
>       ierr = MatGetLocalSubMatrix(B, isBrow, isBCcol, &tempB); CHKERRQ(ierr);
>       ierr = MatGetLocalSubMatrix(C, isCrow, isBCcol, &tempC); CHKERRQ(ierr);

>From the man page:

   Depending on the format of mat, the returned submat may not implement MatMult().  Its communicator may be
   the same as mat, it may be PETSC_COMM_SELF, or some other subcomm of mat's.

   The submat always implements MatSetValuesLocal().  If isrow and iscol have the same block size, then
   MatSetValuesBlockedLocal() will also be implemented.


>       ierr = MatAssemblyBegin(tempB, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>       ierr = MatAssemblyEnd(tempB, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>       ierr = MatAssemblyBegin(tempC, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>       ierr = MatAssemblyEnd(tempC, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>
>       for (j=0; j<J; j++)
>          for (i=0; i<I; i++) idxXcol[i] = i + j*I;
>          ierr = ISCreateGeneral(PETSC_COMM_SELF, I, idxXcol, PETSC_COPY_VALUES, &isXcol); CHKERRQ(ierr);
>          ierr = MatGetLocalSubMatrix(X1, isXrow, isXcol, &tempX); CHKERRQ(ierr);
>          ierr = MatAssemblyBegin(tempX, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>          ierr = MatAssemblyEnd(tempX, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>          ierr = MatMatMult(tempX, tempB, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &tempM);

It does not implement MatMult.  I don't see enough context in this email
about what you are trying to do, but MatGetLocalSubMatrix is not
intended for what you are doing.  MatGetSubMatrices() might do what you
want.

>          ierr = MatRestoreLocalSubMatrix(X1, isXrow, isXcol, &tempX); CHKERRQ(ierr);
>       }
>       ierr = MatRestoreLocalSubMatrix(B, isBrow, isBCcol, &tempB); CHKERRQ(ierr);
>       ierr = MatRestoreLocalSubMatrix(C, isCrow, isBCcol, &tempC); CHKERRQ(ierr);
>    }
>
> ----- Original Message -----
> From: "Matthew Knepley" <knepley at gmail.com>
> To: "Joon hee Choi" <choi240 at purdue.edu>
> Cc: petsc-users at mcs.anl.gov
> Sent: Wednesday, May 29, 2013 7:01:26 AM
> Subject: Re: [petsc-users] The multiplication of large matrices
>
>
> On Wed, May 29, 2013 at 6:43 AM, Joon hee Choi < choi240 at purdue.edu > wrote: 
>
>
>
>
> Hello all, 
>
> I am trying to compute the multiplication of large matrices using petsc. First, 
>
> I=2.6*10^7, J=4.8*10^7. 
> The matrix X is as follows: size of I*(I*J), block size of I, and non-zeros of 1.4*10^8. 
> -> X=[X1 X2 ...] 
> The matrix B is as follows: size of I*1, and dense. 
> The matrix M is as follows: size of I*J. M is the multiplication of each block of the matrix X and the matrix B. 
> -> M=[X1*B X2*B ...] 
>
> I have to get the matrix M, given X and B. I successfully set up very large aij matrix X. However, I don't know what I have to do next. I tried two ways, but I failed. 
>
> First, I tried to get each block X1, X2,... using ISCreate and MatGetLocalSubMatrix, compute X1*B, X2*B,... using MatMatMult, and then set up the matrix M using ISLocalToGlobalMappingCreate and MatSetLocalToGlobalMapping. However, I got "No support for this operation for this object type" error. Also, this code was very slow because of 48 million loops. 
>
>
>
> Look, we have rules on this list. Without them, we cannot help you. You MUST send the ENTIRE error output. 
> Without that, we are just guessing. 
>
>
>
>
> Second, I tried to set up the new matrix BB from B. The matrix BB has the size of (I*J)*J and the block size of I*1. And every diagonal block of BB is B and all other blocks are 0 matrices. That is, 
>
> | B 0 0 .. 0 | 
> BB = | 0 B 0 .. 0 | 
> | ... | 
> | 0 0 0 .. B | 
>
> This is not a block diagonal matrix because B is not square. Anyway, if I set up BB, I can get M easily because M=X*BB. However, I got "out of memory" error from MatCreateSeqAIJ. I think this is because BB has non-zeros of I*J=10^15. 
>
>
>
> If you get an Out Of Memory error (which we need to see), it means that you are out of memory. 
>
>
> Matt 
>
>
> I never have any other ideas. If someone can fix my wrong ways correctly or has new ideas, then please please let me know. Thank you very much. 
>
> Joon 
>
>
>
>
> -- 
> What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead. 
> -- Norbert Wiener 


More information about the petsc-users mailing list