> On Jun 24, 2017, at 4:44 PM, Pierre Jolivet <[email protected]> 
> wrote:
> 
> Hello Barry,
> Sorry to bump up this old thread, but I’m still struggling with MatAssembly.
> Just as a reminder, on 1280 processors, reference timings:
> MatAssemblyBegin       2 1.0 1.4302e+006436.3 0.00e+00 0.0 0.0e+00 0.0e+00 
> 3.0e+00  1  0  0  0  1   1  0  0  0  1     0
> MatAssemblyEnd         2 1.0 5.0301e+01 1.0 0.00e+00 0.0 0.0e+00 0.0e+00 
> 1.8e+01 31  0  0  3  7  31  0  0  3  9     0
> 
> I’ve turned VecScatterCreate_PtoS into a no-op (almost), so I’m rather 
> satisfied with this part. The new timings were:
> MatAssemblyBegin       2 1.0 1.6892e+007015.1 0.00e+00 0.0 0.0e+00 0.0e+00 
> 3.0e+00  0  0  0  0  2   0  0  0  0  2     0
> MatAssemblyEnd         2 1.0 2.9842e+01 1.1 0.00e+00 0.0 9.0e+03 7.9e+04 
> 1.7e+01 15  0  0  0  9  15  0  0  0 11     0
> 
> I dug around in the code, and it turned out that a high percentage of the ~30 
> seconds were spent in MatSetUpMultiply_MPIAIJ.
> I tried to set PETSC_USE_CTABLE to 0 and now I get:
> MatAssemblyBegin       3 1.0 1.4183e+005960.8 0.00e+00 0.0 0.0e+00 0.0e+00 
> 3.0e+00  0  0  0  0  2   0  0  0  0  2     0
> MatAssemblyEnd         3 1.0 7.4979e+00 1.3 0.00e+00 0.0 9.0e+03 7.9e+04 
> 1.7e+01  4  0 70  0 14   4  0 70  0 14     0
> 
> My follow-up questions are thus:
> 1) any ideas why using ctable is a terrible idea here? Looking at ctable.c it 
> looks like ctable is an integer-specific hash table, so I’m guessing the 
> number of collisions is rather low and it should be efficient.

    We don't understand this. We occasionally see really bad performance with 
stable. It is usually just on a subset of processes. Have you tried with the 
master branch? We tried mucking with it to get better performance.


> 2) why is PETSC_USE_CTABLE not a runtime option, and a preprocessor variable 
> instead? Is it wrong to set PETSC_USE_CTABLE to 0 for 
> MatSetUpMultiply_MPIAIJ, and 1 elsewhere?

   Good question. It should be runtime option attached to each object so it can 
be turned on and off as needed. We'd be happy to receive a pull request that 
fixed this or post an issue at bitbucket.com/petsc/petsc


> 
> BTW, just as a reminder, my matrices have really weird sparsity patterns with 
> extremely large bandwidths. Here is an example for the dimensions of the 
> off-diagonal block B (of the MPIAIJ format): 26871 x 21416009.
> 
> Thanks in advance for your help,
> Pierre
> 
>> On 20 Mar 2017, at 3:22 PM, Pierre Jolivet <[email protected]> 
>> wrote:
>> 
>> Hello Barry,
>> It looks like my vendor mpirun does not support OpenSpeedShop, and I have 
>> been too lazy recompiling everything with IntelMPI.
>> However, I did some really basic profiling and it looks like you were right, 
>> a lot of time is spent in VecScatterCreate_PtoS.
>> I switched to a MPI_Alltoallv implementation and here is the new summary.
>> 
>> MatAssemblyEnd         2 1.0 4.3129e+01 1.0 0.00e+00 0.0 0.0e+00 0.0e+00 
>> 1.8e+01 51  0  0  4 15  51  0  0  4 15     0
>> 
>> That's roughly 30 seconds faster, but I still find that rather slow. I'll 
>> now try an MPI_Alltoall implementation with padding because I know for a 
>> fact that BullxMPI performances for variable-sized collectives are much 
>> worse than for uniform collectives (+ all my local dimensions are almost the 
>> same so the memory cost of padding will be negligible).
>> 
>> Thanks,
>> Pierre
>> 
>> On Fri, 17 Mar 2017 22:02:26 +0100, Pierre Jolivet wrote:
>>> The number of messages during the MatAssembly is effectively halved
>>> MatAssemblyEnd 2 1.0 7.2139e+01 1.0 0.00e+00 0.0 2.6e+06 1.9e+04
>>> 1.8e+01 62 0 99 8 15 62 0 99 8 15 0
>>> But that was only a few second faster (and this may even only be
>>> system noise).
>>> I’ll see what I can infer from the openspeedshop profiling, and
>>> might give another MPI implementation a try during the weekend (I’m
>>> using BullxMPI, based on an ancient OpenMPI, but maybe IntelMPI gives
>>> better results).
>>> 
>>> Thanks anyway!
>>> Pierre
>>> 
>>>> On Mar 17, 2017, at 9:23 PM, Pierre Jolivet wrote:
>>>> 
>>>> Thank you for all your input. openspeedshop/2.1 is installed on my
>>>> cluster but it appears something is wrong with the MPI wrapper so
>>>> I’ll have to wait for the answer from the support on Monday.
>>>> In the meantime I’ll try the patch from Stefano which looks very
>>>> promising since it will replace 1599 sends and 1599 receives by a
>>>> single all-to-all.
>>>> Thanks again!
>>>> Pierre
>>>> 
>>>>> On Mar 17, 2017, at 8:59 PM, Stefano Zampini wrote:
>>>>> 
>>>>> 2017-03-17 22:52 GMT+03:00 Barry Smith :
>>>>> 
>>>>>> Stefano,
>>>>>> 
>>>>>> Thanks this is very helpful.
>>>>>> 
>>>>>> ---------------------
>>>>>> Why not? here is my naive implementation with AlltoAll, which
>>>>>> perform better in my case
>>>>>> 
>>>>>> PetscErrorCode PetscGatherMessageLengths(MPI_Comm
>>>>>> comm,PetscMPIInt nsends,PetscMPIInt nrecvs,const PetscMPIInt
>>>>>> ilengths[],PetscMPIInt **onodes,PetscMPIInt **olengths)
>>>>>> {
>>>>>> PetscErrorCode ierr;
>>>>>> PetscMPIInt size,i,j;
>>>>>> PetscMPIInt *all_lengths;
>>>>>> 
>>>>>> PetscFunctionBegin;
>>>>>> ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
>>>>>> ierr =
>>>>>> 
>>>>> PetscMalloc(size*sizeof(PetscMPIInt),&all_lengths);CHKERRQ(ierr);
>>>>>> ierr =
>>>>>> 
>>>>> 
>>>> 
>>> MPI_Alltoall((void*)ilengths,1,MPI_INT,all_lengths,1,MPI_INT,comm);CHKERRQ(ierr);
>>>>>> ierr =
>>>>>> PetscMalloc(nrecvs*sizeof(PetscMPIInt),olengths);CHKERRQ(ierr);
>>>>>> ierr =
>>>>>> PetscMalloc(nrecvs*sizeof(PetscMPIInt),onodes);CHKERRQ(ierr);
>>>>>> for (i=0,j=0; i
>>>>> 
>>>>> At that time I just fixed (1), not (2). My specific problem was
>>>>> not with timings per se, but with MPI (IntelMPI if I remember
>>>>> correctly) crashing when doing the rendez-vous with thousands of
>>>>> processes.
>>>>> 
>>>>>> Don't go to sleep yet, I may have more questions :-)
>>>>>> 
>>>>>> Barry
>>>>>> 
>>>>>>> On Mar 17, 2017, at 2:32 PM, Stefano Zampini wrote:
>>>>>>> 
>>>>>>> Pierre,
>>>>>>> 
>>>>>>> I remember I had a similar problem some years ago when
>>>>>> working with matrices with "process-dense" rows (i.e., when the
>>>>>> off-diagonal part is shared by many processes). I fixed the
>>>>>> issue by changing the implementation of
>>>>>> PetscGatherMessageLenghts, from rendez-vous to all-to-all.
>>>>>>> 
>>>>>>> Barry, if you had access to petsc-maint, the title of the
>>>>>> thread is "Problem with PetscGatherMessageLengths".
>>>>>>> 
>>>>>>> Hope this helps,
>>>>>>> Stefano
>>>>>>> 
>>>>>>> 
>>>>>>> 2017-03-17 22:21 GMT+03:00 Barry Smith :
>>>>>>> 
>>>>>>>> On Mar 17, 2017, at 4:04 AM, Pierre Jolivet wrote:
>>>>>>>> 
>>>>>>>> On Thu, 16 Mar 2017 15:37:17 -0500, Barry Smith wrote:
>>>>>>>>>> On Mar 16, 2017, at 10:57 AM, Pierre Jolivet wrote:
>>>>>>>>>> 
>>>>>>>>>> Thanks Barry.
>>>>>>>>>> I actually tried the application myself with my optimized
>>>>>> build + your option. I'm attaching two logs for a strong
>>>>> scaling
>>>>>> analysis, if someone could spend a minute or two looking at the
>>>>>> numbers I'd be really grateful:
>>>>>>>>>> 1) MatAssembly still takes a rather long time IMHO. This
>>>>>> is actually the bottleneck of my application. Especially on
>>>>> 1600
>>>>>> cores, the problem here is that I don't know if the huge time
>>>>>> (almost a 5x slow-down w.r.t. the run on 320 cores) is due to
>>>>>> MatMPIAIJSetPreallocationCSR (which I assumed beforehand was a
>>>>>> no-op, but which is clearly not the case looking at the run on
>>>>>> 320 cores) or the the option -pc_bjacobi_blocks 320 which also
>>>>>> does one MatAssembly.
>>>>>>>>> 
>>>>>>>>> There is one additional synchronization point in the
>>>>>>>>> MatAssemblyEnd that has not/cannot be removed. This is the
>>>>>>>>> construction of the VecScatter; I think that likely
>>>>>> explains the huge
>>>>>>>>> amount of time there.
>>>>>>> 
>>>>>>> This concerns me
>>>>>>> 
>>>>>>> MatAssemblyEnd 2 1.0 7.5767e+01 1.0 0.00e+00 0.0 5.1e+06
>>>>>> 9.4e+03 1.6e+01 64 0100 8 14 64 0100 8 14 0
>>>>>>> 
>>>>>>> I am thinking this is all the communication needed to set up
>>>>>> the scatter. Do you have access to any performance profilers
>>>>>> like Intel speedshop to see what is going on during all this
>>>>>> time?
>>>>>>> 
>>>>>>> 
>>>>>>> -vecscatter_alltoall uses alltoall in communication in the
>>>>>> scatters but it does not use all to all in setting up the
>>>>>> scatter (that is determining exactly what needs to be scattered
>>>>>> at each time). I think this is the problem. We need to add more
>>>>>> scatter set up code to optimize this case.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> 2) The other bottleneck is MatMult, which itself calls
>>>>>> VecScatter. Since the structure of the matrix is rather dense,
>>>>>> I'm guessing the communication pattern should be similar to an
>>>>>> all-to-all. After having a look at the thread "VecScatter
>>>>>> scaling problem on KNL", would you also suggest me to use
>>>>>> -vecscatter_alltoall, or do you think this would not be
>>>>>> appropriate for the MatMult?
>>>>>>>>> 
>>>>>>>>> Please run with
>>>>>>>>> 
>>>>>>>>> -vecscatter_view ::ascii_info
>>>>>>>>> 
>>>>>>>>> this will give information about the number of messages
>>>>>> and sizes
>>>>>>>>> needed in the VecScatter. To help decide what to do next.
>>>>>>>> 
>>>>>>>> Here are two more logs. One with -vecscatter_view
>>>>>> ::ascii_info which I don't really know how to analyze (I've
>>>>>> spotted though that there are a couple of negative integers for
>>>>>> the data counters, maybe you are using long instead of long
>>>>>> long?), the other with -vecscatter_alltoall. The latter option
>>>>>> gives a 2x speed-up for the MatMult, and for the PCApply too
>>>>>> (which is weird to me because there should be no global
>>>>>> communication with bjacobi and the diagonal blocks are only of
>>>>>> size "5 processes" so the speed-up seems rather huge for just
>>>>>> doing VecScatter for gathering and scattering the RHS/solution
>>>>>> for all 320 MUMPS instances).
>>>>>>> 
>>>>>>> ok, this is good, it confirms that the large amount of
>>>>>> communication needed in the scatters were a major problem and
>>>>>> using the all to all helps. This is about all you can do about
>>>>>> the scatter time.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Barry
>>>>>>> 
>>>>>>>> 
>>>>>>>> Thanks for your help,
>>>>>>>> Pierre
>>>>>>>> 
>>>>>>>>> Barry
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Thank you very much,
>>>>>>>>>> Pierre
>>>>>>>>>> 
>>>>>>>>>> On Mon, 6 Mar 2017 09:34:53 -0600, Barry Smith wrote:
>>>>>>>>>>> I don't think the lack of the --with-debugging=no is
>>>>>> important here.
>>>>>>>>>>> Though he/she should use --with-debugging=no for
>>>>>> production runs.
>>>>>>>>>>> 
>>>>>>>>>>> I think the reason for the "funny" numbers is that
>>>>>>>>>>> MatAssemblyBegin and End in this case have explicit
>>>>>> synchronization
>>>>>>>>>>> points so some processes are waiting for other processes
>>>>>> to get to the
>>>>>>>>>>> synchronization point thus it looks like some processes
>>>>>> are spending a
>>>>>>>>>>> lot of time in the assembly routines when they are not
>>>>>> really, they
>>>>>>>>>>> are just waiting.
>>>>>>>>>>> 
>>>>>>>>>>> You can remove the synchronization point by calling
>>>>>>>>>>> 
>>>>>>>>>>> MatSetOption(mat, MAT_NO_OFF_PROC_ENTRIES, PETSC_TRUE);
>>>>>> before
>>>>>>>>>>> calling MatMPIAIJSetPreallocationCSR()
>>>>>>>>>>> 
>>>>>>>>>>> Barry
>>>>>>>>>>> 
>>>>>>>>>>>> On Mar 6, 2017, at 8:59 AM, Pierre Jolivet wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> Hello,
>>>>>>>>>>>> I have an application with a matrix with lots of
>>>>>> nonzero entries (that are perfectly load balanced between
>>>>>> processes and rows).
>>>>>>>>>>>> A end user is currently using a PETSc library compiled
>>>>>> with the following flags (among others):
>>>>>>>>>>>> --CFLAGS=-O2 --COPTFLAGS=-O3 --CXXFLAGS="-O2
>>>>>> -std=c++11" --CXXOPTFLAGS=-O3 --FFLAGS=-O2 --FOPTFLAGS=-O3
>>>>>>>>>>>> Notice the lack of --with-debugging=no
>>>>>>>>>>>> The matrix is assembled using
>>>>>> MatMPIAIJSetPreallocationCSR and we end up with something like
>>>>>> that in the -log_view:
>>>>>>>>>>>> MatAssemblyBegin 2 1.0 1.2520e+002602.1 0.00e+00 0.0
>>>>>> 0.0e+00 0.0e+00 8.0e+00 0 0 0 0 2 0 0 0 0 2 0
>>>>>>>>>>>> MatAssemblyEnd 2 1.0 4.5104e+01 1.0 0.00e+00 0.0
>>>>>> 8.2e+05 3.2e+04 4.6e+01 40 0 14 4 9 40 0 14 4 9 0
>>>>>>>>>>>> 
>>>>>>>>>>>> For reference, here is what the matrix looks like (keep
>>>>>> in mind it is well balanced)
>>>>>>>>>>>> Mat Object: 640 MPI processes
>>>>>>>>>>>> type: mpiaij
>>>>>>>>>>>> rows=10682560, cols=10682560
>>>>>>>>>>>> total: nonzeros=51691212800, allocated
>>>>>> nonzeros=51691212800
>>>>>>>>>>>> total number of mallocs used during MatSetValues calls
>>>>>> =0
>>>>>>>>>>>> not using I-node (on process 0) routines
>>>>>>>>>>>> 
>>>>>>>>>>>> Are MatAssemblyBegin/MatAssemblyEnd highly sensitive to
>>>>>> the --with-debugging option on x86 even though the
>>>>> corresponding
>>>>>> code is compiled with -O2, i.e., should I tell the user to have
>>>>>> its PETSc lib recompiled, or would you recommend me to use
>>>>>> another routine for assembling such a matrix?
>>>>>>>>>>>> 
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> Pierre
>>>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> Stefano
>>>>> 
>>>>> --
>>>>> 
>>>>> Stefano
>>> 
>>> 
>>> 
>>> Links:
>>> ------
>>> [1] mailto:[email protected]
>>> [2] mailto:[email protected]
>>> [3] mailto:[email protected]
>>> [4] mailto:[email protected]
>>> [5] mailto:[email protected]
>>> [6] mailto:[email protected]
>>> [7] mailto:[email protected]
>>> [8] mailto:[email protected]

Reply via email to