[petsc-users] Setting up MPIBAIJ for MatMult

Barry Smith bsmith at mcs.anl.gov
Thu Nov 13 13:19:34 CST 2014


  I have put support in for allowing setting the block size before the MatLoad() in the branches barry/fix-matsetsize-matload and next. It will be in the next patch release.

   Thanks

    Barry

> On Nov 12, 2014, at 6:48 PM, Steena M <stm8086 at yahoo.com> wrote:
> 
> 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