[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: AX=B Fortran Petsc Code
- To: petsc-users@xxxxxxxxxxx
- Subject: Re: AX=B Fortran Petsc Code
- From: "Matthew Knepley" <knepley@xxxxxxxxx>
- Date: Wed, 14 Nov 2007 08:29:21 -0600
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; bh=AuhtUYbgglZmVS7+LLWMQ+Lz+8J/JmpgzctyFqFeUiM=; b=WibWjY6Hj0DJfltLquP08KLrHGvT/MpL/sAQ6ZSYn2OIOekZCuZCErPXxKqCxVBmSMU1dYOD69Cbubrh8xiPk625OxExvggBZYz+2gnHLSiyxChI9F5ahDS6tkZA4qofKtGZqbwWhL8XhQ9d5KeEmYRH23C2v7Mk5KxbioQapxo=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=qzcj8m2WkR28Qroo4dxncZlgUFgs5qvx5OPB2rM+h2lyfdBgczslKAmKBernWivV7d6kIzWDwBv/992rCagXl3313ANKIXx18Z7yRFYW3cB2/wx1ELzZKwOqs90ZmLc2JEOr9UXr/dW4awnp7vl7hJ9IZ3goOA4oKtCVC819oZ0=
- In-reply-to: <473B0288.2060002@ichec.ie>
- References: <473B0288.2060002@ichec.ie>
- Reply-to: petsc-users@xxxxxxxxxxx
- Sender: owner-petsc-users@xxxxxxxxxxx
You appear to be setting every value in the sparse matrix. We do not
throw out 0 values (since sometimes they are necessary for structural
reasons). Thus you are allocating a ton of times. You need to remove
the 0 values before calling MatSetValues (and their associated
column entires as well).
Matt
On Nov 14, 2007 8:13 AM, Tim Stitt <timothy.stitt@xxxxxxxx> wrote:
> Dear PETSc Users/Developers,
>
> I have the following sequential Fortran PETSc code that I have been
> developing (on and off) based on the kind advice given by members of
> this list, with respect to solving an inverse sparse matrix problem.
> Essentially, the code reads in a square double complex matrix from
> external file of size (order x order) and then proceeds to do a
> MatMatSolve(), where A is the sparse matrix to invert, B is a dense
> identity matrix and X is the resultant dense matrix....hope that makes
> sense.
>
> My main problem is that the code stalls on the MatSetValues() for the
> sparse matrix A. With a trivial test matrix of (224 x 224) the program
> terminates successfully (by successfully I mean all instructions
> execute...I am not interested in the validity of X right now).
> Unfortunately, when I move up to a (2352 x 2352) matrix the
> MatSetValues() routine for matrix A is still in progress after 15
> minutes on one processor of our AMD Opteron IBM Cluster. I know that
> people will be screaming "preallocation"...but I have tried to take this
> into account by running a loop over the rows in A and counting the
> non-zero values explicitly prior to creation. I then pass this vector
> into the creation routine for the nnz argument. For the large (2352 x
> 2352) problem that seems to be taking forever to set...at most there are
> only 200 elements per row that are non-zero according to the counts.
>
> Can anyone explain why the MatSetValues() routine is taking such a long
> time. Maybe this expected for this specific task...although it seems
> very long?
>
> I did notice that on the trivial (224 x 224) run that I was still
> getting mallocs (approx 2000) for the A assembly when I used the -info
> command line parameter. I thought that it should be 0 if my
> preallocation counts were exact? Does this hint that I am doing
> something wrong. I have checked the code but don't see any obvious
> problems in the logic...not that means anything.
>
> I would be grateful if someone could advise on this matter. Also, if you
> have a few seconds to spare I would be grateful if some experts could
> scan the remaining logic of the code (not in fine detail) to make sure
> that I am doing all that I need to do to get this calculation
> working...assuming I can resolve the MatSetValues() problem.
>
> Once again many thanks in advance,
>
> Tim.
>
> ! Initialise the PETSc MPI Harness
> call PetscInitialize(PETSC_NULL_CHARACTER,error);CHKERRQ(error)
>
> call MPI_COMM_SIZE(PETSC_COMM_SELF,processes,error);CHKERRQ(error)
> call MPI_COMM_RANK(PETSC_COMM_SELF,ID,error);CHKERRQ(error)
>
> ! Read in Matrix
> open(321,file='Hamiltonian.bin',form='unformatted')
> read(321) order
> if (ID==0) then
> print *
> print *,processes," Processing Elements being used"
> print *
> print *,"Matrix has order ",order," rows by ",order," columns"
> print *
> end if
>
> allocate(matrix(order,order))
> read(321) matrix
> close(321)
>
> ! Allocate array for nnz
> allocate(numberZero(order))
>
> ! Count number of non-zero elements in each matrix row
> do row=1,order
> count=0
> do column=1,order
> if (matrix(row,column).ne.(0,0)) count=count+1
> end do
> numberZero(row)=count
> end do
>
> ! Declare a PETSc Matrices
>
> call
> MatCreateSeqAIJ(PETSC_COMM_SELF,order,order,PETSC_NULL_INTEGER,numberZero,A,error);CHKERRQ(error)
> call
> MatCreateSeqAIJ(PETSC_COMM_SELF,order,order,0,PETSC_NULL_INTEGER,factorMat,error);CHKERRQ(error)
> call
> MatCreateSeqDense(PETSC_COMM_SELF,order,order,PETSC_NULL_SCALAR,X,error);CHKERRQ(error)
> call
> MatCreateSeqDense(PETSC_COMM_SELF,order,order,PETSC_NULL_SCALAR,B,error);CHKERRQ(error)
>
> ! Set up zero-based array indexing for use in MatSetValues
> allocate(columnIndices(order))
>
> do column=1,order
> columnIndices(column)=column-1
> end do
>
> ! Need to transpose values array as row-major arrays are used.
> call
> MatSetValues(A,order,columnIndices,order,columnIndices,transpose(matrix),INSERT_VALUES,error);CHKERRQ(error)
>
> ! Assemble Matrix A
> call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,error);CHKERRQ(error)
> call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,error);CHKERRQ(error)
>
> deallocate(matrix)
>
> ! Create Index Sets for Factorisation
> call
> ISCreateGeneral(PETSC_COMM_SELF,order,columnIndices,indexSet,error);CHKERRQ(error)
> call MatFactorInfoInitialize(info,error);CHKERRQ(error)
> call ISSetPermutation(indexSet,error);CHKERRQ(error)
> call
> MatLUFactorSymbolic(A,indexSet,indexSet,info,factorMat,error);CHKERRQ(error)
> call MatLUFactorNumeric(A,info,factorMat,error);CHKERRQ(error)
>
> ! A no-longer needed
> call MatDestroy(A,error);CHKERRQ(error)
>
> one=(1,0)
>
> ! Set Diagonal elements in Identity Matrix B
> do row=0,order-1
> call MatSetValue(B,row,row,one,INSERT_VALUES,error);CHKERRQ(error)
> end do
>
> ! Assemble B
> call MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY,error);CHKERRQ(error)
> call MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY,error);CHKERRQ(error)
>
> ! Assemble X
> call MatAssemblyBegin(X,MAT_FINAL_ASSEMBLY,error);CHKERRQ(error)
> call MatAssemblyEnd(X,MAT_FINAL_ASSEMBLY,error);CHKERRQ(error)
>
> ! Solve AX=B
> call MatMatSolve(factorMat,B,X,error);CHKERRQ(error)
>
> ! Deallocate Storage
> deallocate(columnIndices)
>
> call MatDestroy(factorMat,error);CHKERRQ(error)
> call MatDestroy(B,error);CHKERRQ(error)
> call MatDestroy(X,error);CHKERRQ(error)
>
> call PetscFinalize(error)
>
> --
> Dr. Timothy Stitt <timothy_dot_stitt_at_ichec.ie>
> HPC Application Consultant - ICHEC (www.ichec.ie)
>
> Dublin Institute for Advanced Studies
> 5 Merrion Square - Dublin 2 - Ireland
>
> +353-1-6621333 (tel) / +353-1-6621477 (fax)
>
>
--
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