[petsc-users] Setting up MPIBAIJ for MatMult

Steena M stm8086 at yahoo.com
Wed Nov 12 18:48:36 CST 2014


Thank you, Barry. That took care of most of the issues. Two more things:

1) The code runs (MatMult executes) for block size =1. For block sizes > 1. For instance, block size = 3, throws:
 PETSC ERROR: Arguments are incompatible!
[0]PETSC ERROR: Cannot change block size 3 to 1!

Matrix setup:

ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filein,FILE_MODE_READ,&fd); 
ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
ierr = MatSetType(A, MATMPIBAIJ);
ierr = MatSetBlockSize(A, bs); CHKERRQ(ierr);
ierr = MatLoad(A,fd);CHKERRQ(ierr); 
ierr = PetscViewerDestroy(&fd);CHKERRQ(ierr);


2) I'm not sure if my vector setup is ideal. Should I be using VecSetValues instead? 

  ierr = MatGetSize(A,&m,&n);
  
  ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr);
  ierr = VecSetType(x,VECMPI);
  ierr = VecSetSizes(x,PETSC_DECIDE,m);CHKERRQ(ierr);
  ierr = VecSetFromOptions(x);CHKERRQ(ierr); 

--------------------------------------------
On Wed, 11/12/14, Barry Smith <bsmith at mcs.anl.gov> wrote:

 Subject: Re: [petsc-users] Setting up MPIBAIJ for MatMult
 To: "Steena M" <stm8086 at yahoo.com>
 Cc: petsc-users at mcs.anl.gov
 Date: Wednesday, November 12, 2014, 11:44 AM
 
 
   1)
 remove all the "preload" stuff
 
   2) MatLoad doesn't require or use the
 Mat preallocation stuff so remove all of that
 
    3) MatLoad
 determines the global matrix size from the binary file so do
 not set that before calling MatLoad
 
    4) All processes in the comm (in
 your case MPI_COMM_WORLD) need to call MatLoad
 
    5) You can call
 MatSetBlockSize() to set the block size before MatLoad()
 
    6) You do not
 need to call MatAssemblyBegin/End after a MatLoad() it would
 do nothing
 
 > On Nov 12, 2014, at
 1:32 PM, Steena M <stm8086 at yahoo.com>
 wrote:
 > 
 > I am
 trying to read in a sparse matrix file in binary format
 (.dat file) to set it up as MPIBAIJ for MPIMatMult. I
 don't think I'm doing the file reading or the matrix
 and vector setup correctly. Should the file loading, matrix
 setup, and loading be done only on rank 0 together with the
 vector setup?  After looking through several examples, this
 is the structure of my code right now:
 >
 
 > Vec            x,y;  
 > Mat            A;  
 > PetscViewer     fd;
 > int rank, global_row_size,
 global_col_size,bs;
 > PetscBool   
    PetscPreLoad = PETSC_FALSE;
 > char       
    filein[PETSC_MAX_PATH_LEN]  /*binary .dat
 matrix file */
 > PetscScalar one =
 1.0;
 > 
 > 
 >  /* Reading relevant block size from ENV
 */
 >  char* bs_env;
 >  bs_env = getenv
 ("BLOCK_SIZE_ENV");
 >  bs =
 (PetscInt)atoi(bs_env);
 > 
 > /*Reading in matrix row/cols size from
 ENV. Matrices are always square:
 global_col_size=global_row_size*/
 > 
 >  char* m_env;
 > 
 m_env = getenv ("MATRIX_ROWS_ENV");
 >  global_row_size =
 (PetscInt)atoi(m_env);
 > 
 global_col_size = global _row_size;
 > 
 > 
 PetscInitialize(&argc,&args,(char *)0,help);
 >  ierr =
 MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 > 
 > /*Matrix reading,
 setup, assembly*/
 > 
 >  if (flg) PetscPreLoad = PETSC_TRUE;
 > 
 PetscPreLoadBegin(PetscPreLoad,"Load");
 >  ierr =
 PetscViewerBinaryOpen(PETSC_COMM_WORLD,filein[PetscPreLoadIt],FILE_MODE_READ,&fd);CHKERRQ(ierr);
 > 
 > 
 >  ierr =
 MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
 >  ierr =
 MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,global_row_size,global_col_size);CHKERRQ(ierr);
 >  ierr =
 MatSetFromOptions(A);CHKERRQ(ierr);
 > 
 ierr = MatSetType(A, MATMPIBAIJ);
 > 
 ierr =
 MatMPIBAIJSetPreallocation(A,bs,5,PETSC_NULL,5,PETSC_NULL);CHKERRQ(ierr);
 >  ierr =
 MatSeqBAIJSetPreallocation(A,bs,5,PETSC_NULL);CHKERRQ(ierr);
 > 
 >  ierr =
 PetscLogStageRegister("Assembly",
 &stage);CHKERRQ(ierr);
 >  ierr =
 PetscLogStagePush(stage);CHKERRQ(ierr);
 >
 
 > 
 >  if
 (rank==0)
 >  {
 > 
 ierr = MatLoad(A,fd);CHKERRQ(ierr); 
 >
 
 >  }
 > 
 > ierr =
 MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
 > ierr =
 MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
 > ierr =
 PetscLogStagePop();CHKERRQ(ierr);
 > ierr
 = PetscViewerDestroy(&fd);CHKERRQ(ierr);
 > 
 > /*Trying two types
 of vector assembly*/
 > 
 > /* Vector setup Attempt 1*/
 > 
 > ierr =
 VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr);
 >  ierr =
 VecSetSizes(x,PETSC_DECIDE,global_row_size);CHKERRQ(ierr);
 >  ierr =
 VecSetFromOptions(x);CHKERRQ(ierr);
 > 
 ierr = VecDuplicate(x,&y);CHKERRQ(ierr);
 >  ierr =
 VecSetFromOptions(y);CHKERRQ(ierr);
 > 
 ierr = VecSet(x,one);CHKERRQ(ierr);
 >
 ierr = VecSet(y,one); CHKERRQ(ierr);
 >
 
 > /*Vector setup Attempt 2*/
 > 
 > ierr =
 VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr);
 > ierr =
 VecGetSize(x,&global_row_size);CHKERRQ(ierr);
 > 
 > if (rank==0)
 >  {
 > 
 >  for (i = 0;  i<global_row_size;
 i++)
 >  {
 >  ierr =
 VecSetValues(x,1,&i,one,INSERT_VALUES); 
 >  CHKERRQ(ierr);
 > 
 }
 > 
 >  }
 >  ierr =
 VecDuplicate(x,&y);CHKERRQ(ierr);
 > 
 ierr = VecSetFromOptions(y);CHKERRQ(ierr);
 > 
 >  ierr =
 VecAssemblyBegin(x); CHKERRQ(ierr);
 > 
 ierr = VecAssemblyEnd(x); CHKERRQ(ierr);
 > 
 > 
 > 
 > /* SpMV*/
 > ierr = MatMult(A,x,y);CHKERRQ(ierr);
 > 
 >  ierr =
 VecDestroy(&x);CHKERRQ(ierr); 
 > 
 ierr = VecDestroy(&y);CHKERRQ(ierr);
 >  ierr =
 MatDestroy(&A);CHKERRQ(ierr);
 > 
 > 
 > 
 > 
 


More information about the petsc-users mailing list