It's to let you interleave calls. You can call MatAssemblyBegin as soon as you've finished assembling the matrix, but you need not call MatAssemblyEnd until you require more operations on A.
So you can build A (call Begin), build B (call Begin), build a vector x and b, and only call MatAssemblyEnd when you use the solver on A. I've found that proper placement of MatAssemblyBegin and End make huge performance differences. If you can isolate all your write operations, just call MatAssemblyBegin once, and then call MatAssemblyEnd just before you require the matrix, you take a huge load off of interprocess communications. On the other hand, if you mix your read and writes so that you have many MatAssemblyBegin/End pairs, you'll get several orders of magnitude worse performance. Like most programming -- think about what's going on at a low level. If you think about the involved MPI calls, there must be some sends or broadcasts going on, with a barrier at the end to synchronize the processes. The fewer sends and particularly the fewer barrier calls, the better performance you'll get. If you get an error, very often it's that you've gotten your processes out of sync --- the constraints on which calls require a MatAssembly pair aren't in the documentation. Regards, Alex Peyser On Monday 04 August 2008 12:09:16 pm Ahmed El Zein wrote: > On Mon, 2008-08-04 at 23:13 +0800, Zi-Hao Wei wrote: > > On Mon, Aug 4, 2008 at 10:53 PM, Ahmed El Zein <ahmed at azein.com> wrote: > > > my code looks like: > > > ierr = MatCreate(PETSC_COMM_WORLD,&A); CHKERRQ(ierr); > > > ierr = MatSetSizes(A,M,N,M,N); CHKERRQ(ierr); > > > ierr = MatSetType(A, MATSEQAIJ); CHKERRQ(ierr); > > > ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); > > > [...lots of MatSetValue() calls...] > > > ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); > > > > I think that the code should be > > ierr = MatCreate(PETSC_COMM_WORLD,&A); CHKERRQ(ierr); > > ierr = MatSetSizes(A,M,N,M,N); CHKERRQ(ierr); > > ierr = MatSetType(A, MATSEQAIJ); CHKERRQ(ierr); > > [...lots of MatSetValue() calls...] > > ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); > > ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); > > > > The routines MatAssemblyBegin and MatAssemblyEnd should be called > > after completing all calls to MatSetValues(). > > You are right of course. But if these 2 calls are meant to be right > after each other, why isn't there just one MatAssembly() call versus a > Begin and End call? > > btw fixing this did not affect the problem I had. > > Ahmed -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 197 bytes Desc: This is a digitally signed message part. URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20080804/b4305472/attachment.pgp>
