<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jul 6, 2018 at 2:26 PM, Mark Adams <span dir="ltr"><<a href="mailto:mfadams@lbl.gov" target="_blank">mfadams@lbl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">



<div>
<div dir="ltr">
<div class="gmail_quote"><span>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div><br>
</div>
<div>Glad to hear that you got something (at least sort of) working, Mark. Let me know if you want me to work with your users on understanding the performance they are seeing. When I was working for Intel, I probably spent more time on dealing with stupid thread
 affinity settings than anything else when "optimizing" code performance.</div>
<div><br>
</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
</span><div>That is a good idea. I will loop you into the thread.</div><span>
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div></div>
<div>I should point out that, even with all of the thread settings correct, the current PETSc code base might not get much out of OpenMP threading with MKL. I'm assuming since you are using GAMG that a significant portion of time is spent in MatPtAP() operations?
 I'm not sure how much use of the sequential matrix-matrix multiply code the parallel MatPtAP() code can achieve.
</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
</span><div>The RAP or AP is in MKL right? I understand they have these sparse matrix-matrix kernels. The get some reuse out of the RAP I think. I will ask when I bring you in the thread (but I will wait for you to clarify what is supported).</div></div></div></div></blockquote><div><br></div><div>My SeqAIJMKL routines currently implement MatMatMult(), MatMatMultNumeric(), MatTransposeMatMult(), MatPtAP(), and MatPtAPNumeric(). Notice that there are no MatMatMultSymbolic and MatPtAPSymbolic() routines in there. The problem is that, even though MKL internally computes a symbolic multiplication and then a numeric one, until version 18 update 2 (the latest MKL), there was only one interface provided: one that did the full (symbolic + numeric) multiplication, that is, that maps to MatMatMult(). I (and I think a few others) complained about this, so in version 18 update 2, they added a "two stage" interface. Unfortunately, it's not the two stages that I want: The first stage only determines the amount of memory needed but doesn't compute the sparsity pattern. I did add some "Numeric" routines that use the sparsity pattern from a previous full multiplication (so for the MAT_REUSE_MATRIX case), but I've recently learned that what I've done isn't actually safe because that causes a memory leak in MKL. Frustrating.</div><div><br></div><div>Support for a MatPtAP() operation was added very recently in MKL, but it is only for a symmetric matrix A. I check for MatIsSymmetricKnown(), and call the MKL version only if this check returns true; otherwise, I just call MatPtAP_SeqAIJ_SeqAIJ().</div><div><br></div><div>--Richard</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div dir="ltr"><div class="gmail_quote"><span>
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div>There are some issues with mapping between the MKL interfaces for this and the PETSc ones, e.g., there is currently no equivalent of MatMultSymbolic() in MKL. I've had some discussions with the MKL team about this, but the current model they have isn't
 one that I can map all of the PETSc matrix-matrix interface onto. Hopefully I can get them to change this.<br>
</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
</span><div>OK, I don't think it will be a problem in the near term ... and I don't understand why there is no <span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">equivalent of MatMultSymbolic
 (setting up communication maps?). How does if function without this. Please clarify!</span></div>
<div><span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
</span></div>
<div><span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Thanks,</span></div><div><div class="gmail-m_-5999204526283133335h5">
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div></div>
<div><br>
</div>
<div>--Richard<br>
</div>
<div><br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div dir="ltr">
<div class="gmail_quote">
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span><br>
<br>
   Barry<br>
<br>
<br>
> On Wed, Jul 4, 2018 at 9:44 AM Mark Adams <<a href="mailto:mfadams@lbl.gov" target="_blank">mfadams@lbl.gov</a>> wrote:<br>
> <br>
> <br>
> On Wed, Jul 4, 2018 at 3:01 AM Richard Tran Mills <<a href="mailto:rtmills@anl.gov" target="_blank">rtmills@anl.gov</a>> wrote:<br>
</span><span>> Hi Mark,<br>
> <br>
> I'd never looked at the code for MatCreateMPIAIJWithSeqAIJ(), but it looks like if you are using MPIAIJ matrices but you've set "-mat_seqaij_type seqaijmkl",<br>
> <br>
</span><span>> No, I am using -mat_type aijmkl<br>
>  <br>
</span><span>> then the "diagonal" portion of the MPIAIJ matrix ends up as a SEQAIJMKL instance, but the off-diagonal portion ends up as a plain SEQAIJ when it is created with MatCreateSeqAIJWithArrays(). (I have not stepped through this with a debugger to
 verify that this is actually what happens.) So, if we want the off-diagonal matrix to also be a SEQAIJMKL, then we either need to add some logic after the MatCreateSeqAIJWithArrays() call to check to see if a different subtype of SEQAIJ is being used and then
 convert it to the correct type, or we need a variant of MatCreateSeqAIJWithArrays() that will honor the subtype of SEQAIJ that we are using. Barry, since you added the concept of subtyping for SEQAIJ, what do you prefer?<br>
> <br>
</span>> No preference.<span><br>
>  <br>
> I note that in some (most?) cases, I think we are OK or even better off with the off-diagonal matrix in the MPIAIJ not being a SEQAIJMKL one, because the PETSc routines can used the "compressed row" stuff to speed up handling the many zero rows that often
 end up in the off-diagonal, whereas the MKL routines cannot.<br>
> <br>
> <br>
</span><span>> OK , I'll keep that in mind. I pushed a branch with fixes to get my gamg tests working (ksp ex56 primarily). I'm going to make a new branch and try "-mat_seqaij_type seqaijmkl".<br>
> <br>
> Thanks,<br>
> Mark<br>
>  <br>
</span><span>> --Richard<br>
> <br>
> On Tue, Jul 3, 2018 at 4:31 PM, Mark Adams <<a href="mailto:mfadams@lbl.gov" target="_blank">mfadams@lbl.gov</a>> wrote:<br>
> I have having to fix AIJ methods that don't get the type from the args to set created matrix type, so as to keep the MKL typing.<br>
> <br>
> I am not sure how to fix this because I don't know to say 'make MPI from SEQ' in this method<br>
> <br>
> PetscErrorCode MatCreateMPIAIJWithSeqAIJ(MPI_<wbr>Comm comm,Mat A,Mat B,const PetscInt garray[],Mat *mat)<br>
> {<br>
>  ....  <br>
>   ierr = MatCreate(comm,mat);CHKERRQ(ie<wbr>rr);<br>
>   ierr = MatGetSize(A,&m,&n);CHKERRQ(ie<wbr>rr);<br>
> .... <br>
>   ierr = MatSetSizes(*mat,m,n,PETSC_DEC<wbr>IDE,N);CHKERRQ(ierr);<br>
>   ierr = MatSetType(*mat,MATMPIAIJ);CHK<wbr>ERRQ(ierr);<br>
> <br>
> How should I do this?  Other places in the code I get the type from input (MPI) args and set created matrix types accordingly. I could just put a switch with an error for any new types that might come along in the future ...<br>
> <br>
> Mark<br>
> <br>
<br>
</span></blockquote>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</blockquote>
</div></div></div>
</div>
</div>

</blockquote></div><br></div></div>