I'm attempting to implement PETSc for the parallel solution of a large sparse 
matrix in a computer program I work with. The program is written in Fortran. I 
currently have been able to get the program working using PETSc and giving 
correct results, but the issue is its performance. It is much slower than 
solving the matrix in serial. I seem to have narrowed the major PETSc time sink 
down to actually constructing the matrix (getting the matrix terms into the 
PETSc matrix). Specifically, it is hanging for a very long time to do this step:

  do values_counter = 1, total_values
     call 
MatSetValues(A,1,coeff_row(values_counter),1,coeff_col(values_counter),coeff(values_counter),INSERT_VALUES,petsc_err)
  end do

Building the right-hand-side vector for this matrix is much faster:

  call VecSetValues(y,nrows,index_of_values,rhs_values,INSERT_VALUES,petsc_err)

The difference, as I see it, is that I'm sending the matrix coefficients to the 
PETSc matrix one element at a time whereas with the RHS vector, I'm sending all 
the values in one shot. There are 7 times more elements in the matrix than the 
vector, so I get that it will take longer. So I did some timing studies using 
MPI_Wtime and putting the matrix values into the PETSc matrix is taking 4,800 
times longer than putting the values into the RHS vector.

Then there is the actual assembly of the matrix that you have to do using 
MatAssemblyBegin and MatAssemblyEnd. That takes even longer than assigning 
values to the matrix. More than twice as long. Actually solving the matrix and 
then distributing the solution back to the domains in the program takes about 
as much time as the RHS vector assignment step, so that is nearly 5,000 times 
faster than putting data into PETSc. Surely there must be something wrong that 
I'm doing with the assignment of data into PETSc.

So my question is, is there a more efficient way to build the matrix? I already 
have my coefficients stored in AIJ form in the program. I understand that PETSc 
uses AIJ. Can't I somehow just send the three AIJ vectors to PETSc in one shot?

Thanks,
Bob

Reply via email to