General matrix interative solver
Satish Balay
balay at mcs.anl.gov
Thu Oct 12 19:32:59 CDT 2006
- calling MAT_FINAL_ASSEMBLY before inserting the values is of no use.
- if the code get slow after 200 calls => your preallocation ran out
at that time. i.e incorrect preallocation.
- You can call MatSetOption(mat,MAT_NEW_NONZERO_ALLOCATION_ERR) to
verify [If an insertion causes a malloc - the above will flag it as
error]. You can then run in a debugger [By placing a breakpint in
PetscError() - and then checking - why the specified preallocation
info is not sufficient]
- You might want to rethink your MatSetValues code. Eventhough its ok
right now to have that many calls to MAT_FLUSH_ASSEMBLY, the code
could probably be organized to avoid this.
- This thread is getting pretty long on the petsc-users mailing list.
If you still have issues - please continue this discussion at
petsc-maint at mcs.anl.gov
Satish
On Thu, 12 Oct 2006, Julian wrote:
> Ok, so this is what I am doing now... And I still get the same result. It goes very slowly till the 200th MAT_FLUSH_ASSEMBLY call and then just stays there... The output that I gave u earlier is the complete output its been giving for the following code:
>
> Mat mat;
> PetscInitialize(0,0,"petscOptions.txt",0);
> int i;
> int *nnz;
> nnz=new int[L];
> for(i=0;i<L;i++){
> nnz[i]=row[i].getNum();
> }
>
> MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L, PETSC_DEFAULT, nnz, &mat);
> delete [] nnz;
>
> Maybe it is not giving the output you are requiring because the program never gets to the point where MAT_FINAL_ASSEMBLY is called.
>
> Now, when I do a MAT_FINAL_ASSEMBLY call right after the preallocation, then I get a different output
>
> Mat mat;
> PetscInitialize(0,0,"petscOptions.txt",0);
> int i;
> int *nnz;
> nnz=new int[L];
> for(i=0;i<L;i++){
> nnz[i]=row[i].getNum();
> }
>
> MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L, PETSC_DEFAULT, nnz, &mat);
>
> MatAssemblyBegin(mat, MAT_FINAL_ASSEMBLY); // <-----------------
> MatAssemblyEnd(mat, MAT_FINAL_ASSEMBLY); // <-----------------
>
> delete [] nnz;
>
> This is what I get :
> [0] PetscInitializePETSc successfully started: number of processors = 1
> [0] PetscGetHostNameRejecting domainname, likely is NIS ALPHA2.ÿÿ0ÿÿ
> [0] PetscInitializeRunning on machine: ALPHA2
> [0] PetscCommDuplicateDuplicating a communicator 1 1 max tags = 100000000
> [0] MatAssemblyEnd_SeqSBAIJMatrix size: 14883 X 14883, block size 1; storage spa
> ce: 1040055 unneeded, 0 used
> [0] MatAssemblyEnd_SeqSBAIJNumber of mallocs during MatSetValues is 0
> [0] MatAssemblyEnd_SeqSBAIJMost nonzeros blocks in any row is 0
>
> In this case, the assembly goes very fast TILL the 200th MAT_FLUSH_ASSEMBLY call and THEN gets stuck!
>
>
>
> > -----Original Message-----
> > From: owner-petsc-users at mcs.anl.gov
> > [mailto:owner-petsc-users at mcs.anl.gov] On Behalf Of Satish Balay
> > Sent: Thursday, October 12, 2006 6:46 PM
> > To: petsc-users at mcs.anl.gov
> > Subject: RE: General matrix interative solver
> >
> > On Thu, 12 Oct 2006, Julian wrote:
> >
> > > I am now using MatCreateSeqSBAIJ() - I am assuming the second
> > > parameter bs=1 in my case because I am using one processor. Is that
> > > correct ?
> >
> > No - it refers to a blocksize. The matrix could have a block
> > structure. In this case - the correct blocksize can be
> > specified. The matrix operations will exploit this block
> > structure for better performance.
> >
> > bs=1 is a fine [This is the equivalent of AIJ type in the
> > block notation]
> >
> > > The method of creating a matrix I used was taken from Pavel Solin's
> > > book 'Partial Differential Equations and the finite Element
> > Method'.
> > > Is there any particular reason why is should follow this
> > > method:
> > > mat = (double*)malloc(sizeof(Mat))
> > > MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L, PETSC_DEFAULT, nnz,
> > > (Mat*)mat); In the examples that I have seen in the petsc website I
> > > don't see this statement where memory is allocated.
> >
> > No - you should just use PETSc example codes a guidelines. i.e
> >
> > Mat mat;
> > MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L, PETSC_DEFAULT,
> > nnz, &mat);
> >
> > Mat is just a pointer - and all the memory allocation
> > required is done inside XXXCreate() routines.
> >
> > > Anyway, I changed my code to the following:
> > > PetscInitialize(0,0,"petscOptions.txt",0);
> > >
> > > int i;
> > > int *nnz;
> > > nnz=new int[L];
> > > for(i=0;i<L;i++){
> > > nnz[i]=row[i].getNum();
> > > }
> > >
> > > Assert( mat = (double*)malloc(sizeof(Mat)) );
> > > MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L,
> > PETSC_DEFAULT, nnz, (Mat*)mat);
> > > delete [] nnz;
> >
> > > And I'm still getting stuck at the same place... There is a
> > difference
> > > though.. Now the assembly process is even slower than before (when
> > > there was no preallocation) I noticed that it is getting
> > stuck around
> > > the 200th MAT_FLUSH_ASSEMBLY call.. I don't know if that is
> > > significant.Is there some limit on how many times
> > MAT_FLUSH_ASSEMBLY
> > > can be called ?
> >
> > MAT_FLUSH_ASSEMBLY is cheap - in sequential mode - but
> > expensive in parallel mode [becasue of parallel
> > syncronization]. However ...
> >
> > > This is the petsc output I get:
> > > [0] PetscInitializePETSc successfully started: number of
> > processors =
> > > 1 [0] PetscGetHostNameRejecting domainname, likely is NIS
> > ALPHA2.ÿÿ0ÿÿ
> > > [0] PetscInitializeRunning on machine: ALPHA2 [0]
> > > PetscCommDuplicateDuplicating a communicator 1 1 max tags =
> > 100000000
> >
> > The above log is incomplete. You should be looking for lines
> > with the string 'malloc'
> >
> > Satish
> >
> > >
> > > I also tried this :
> > > mat = new Mat;
> > > MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L,
> > PETSC_DEFAULT, nnz, mat);
> > >
> > > And got the same performance.
> >
>
>
More information about the petsc-users
mailing list