[petsc-users] About MatGetOwnershipRange()

Joon Hee Choi choi240 at purdue.edu
Thu Sep 12 21:20:12 CDT 2013



----- Original Message -----
From: "Jed Brown" <jedbrown at mcs.anl.gov>
To: "Joon Hee Choi" <choi240 at purdue.edu>
Cc: petsc-users at mcs.anl.gov
Sent: Thursday, September 12, 2013 7:51:21 PM
Subject: Re: [petsc-users] About MatGetOwnershipRange()

Joon Hee Choi <choi240 at purdue.edu> writes:

>> Hi Jed,
>>
>> Thank you for your reply. I tried to follow your method, but I think
>> my code still has something wrong because "localsize" is the same as
>> global row size("I"). 

>Did you run in parallel?

Yes. I tested my code with 2 nodes and 4 ppn(processors per node).

>> Could you let me know what I am missing? My new code is as follows:
>>
>> PetscErrorCode SetUpMatrix(Mat *X, vector< std::tr1::tuple< PetscInt, PetscInt, PetscInt > >, PetscInt I, PetscInt J)
>> {
>>    PetscInt i, j;
>>    PetscScalar val;
>>
>>    MatCreate(PETSC_COMM_WORLD, X);
>>    MatSetType(*X, MATMPIAIJ);
>>    MatSetSizes(*X, PETSC_DECIDE, PETSC_DECIDE, I, J);
>>
>>    PetscInt begin, end, localsize=PETSC_DECIDE;
>>    PetscSplitOwnership(PETSC_COMM_WORLD, &localsize, &I);
>>    MPI_Scan(&localsize, &end, 1, MPI_INT, MPI_SUM, PETSC_COMM_WORLD);
>>    begin = end - localsize;
>>    PetscPrintf(PETSC_COMM_WORLD, "Local Size: %d, begin: %d, end: %d \n", localsize, begin, end);
>>
>>    ...
>> }
>>
>> Also, tuples are the total pairs of (row dimension, column dimension,
>> element), values of sparse matrix, which are read from a file. 

>Using files this way is a massive bottleneck that you'll have to
>eliminate if you want your code to be scalable.

What do you mean a massive bottleneck? Actually, I succeeded in setting up the large matrix using seqaij type and calculating products between huge matrices. However, I need to use multiple machines because I have to run loops of the product many times. And I am a novice of mpi.

>> The tuples are sorted and distributed. 

>When you distribute, are you sure that each process really gets the
>entire row, or would it be possible to cut in the middle of a row?

I think each process gets the entire row. The following is the code for getting tuples from text file:

   ierr = PetscFOpen(PETSC_COMM_WORLD, inputFile, "r", &file); CHKERRQ(ierr);
   while (fscanf(file, "%d %d %d", &ii, &jj, &vv) == 3)
   {
      tups.push_back(std::tr1::make_tuple (ii-1, jj-1, vv));
      if (ii > I) I = ii;
      if (jj > J) J = jj;
   }
   ierr = PetscFClose(PETSC_COMM_WORLD, file); CHKERRQ(ierr);



More information about the petsc-users mailing list