<div dir="ltr">I am trying the port parts of the following function on GPUs. Essentially, the lines of codes between the two "TODO..." comments should be executed on the device. Here is the function:<div><br><div>PetscScalar CalculateSpectralNodesAndWeights(LSDFT_OBJ *pLsdft, int p, int LIp)<br>{<br><br>  PetscInt N_qp;      <br>  N_qp = pLsdft->N_qp;<br>  <br>  int k;<br>  PetscScalar *a, *b;<br>  k=0;<br><br>  PetscMalloc(sizeof(PetscScalar)*(N_qp+1), &a);<br>  PetscMalloc(sizeof(PetscScalar)*(N_qp+1), &b);<br><br>  /*<br>   * TODO: COPY a, b, pLsdft->Vk, pLsdft->Vkm1, pLsdft->Vkp1, pLsdft->LapPlusVeffOprloc, k,p,N_qp from HOST to DEVICE<br>   * DO THE FOLLOWING OPERATIONS ON DEVICE<br>   */<br>  <br>  //zero out vectors<br>  VecZeroEntries(pLsdft->Vk);<br>  VecZeroEntries(pLsdft->Vkm1);<br>  VecZeroEntries(pLsdft->Vkp1);<br><br>  VecSetValue(pLsdft->Vkm1, p, 1.0, INSERT_VALUES);   <br>  MatMult(pLsdft->LapPlusVeffOprloc,pLsdft->Vkm1,pLsdft->Vk);<br>  VecDot(pLsdft->Vkm1, pLsdft->Vk, &a[0]);<br>  VecAXPY(pLsdft->Vk, -a[0], pLsdft->Vkm1);<br>  VecNorm(pLsdft->Vk, NORM_2, &b[0]);<br>  VecScale(pLsdft->Vk, 1.0 / b[0]);<br>   <br>  for (k = 0; k < N_qp; k++) {<br>    MatMult(pLsdft->LapPlusVeffOprloc,pLsdft->Vk,pLsdft->Vkp1);<br>    VecDot(pLsdft->Vk, pLsdft->Vkp1, &a[k + 1]);<br>    VecAXPY(pLsdft->Vkp1, -a[k + 1], pLsdft->Vk);<br>    VecAXPY(pLsdft->Vkp1, -b[k], pLsdft->Vkm1);<br>    VecCopy(pLsdft->Vk, pLsdft->Vkm1);<br>    VecNorm(pLsdft->Vkp1, NORM_2, &b[k + 1]);<br>    VecCopy(pLsdft->Vkp1, pLsdft->Vk);<br>    VecScale(pLsdft->Vk, 1.0 / b[k + 1]);<br>  }<br><br>  /*<br>   * TODO: Copy back a, b, pLsdft->Vk, pLsdft->Vkm1, pLsdft->Vkp1, pLsdft->LapPlusVeffOprloc, k,p,N_qp from DEVICE to HOST<br>   */<br>  <br>  /*<br>   * Some operation with a, and b on HOST<br>   *<br>   */<br>  TridiagEigenVecSolve_NodesAndWeights(pLsdft, a, b, N_qp, LIp);  // operation on the host<br><br>  // free a,b<br>  PetscFree(a);<br>  PetscFree(b);</div><div><br>  return 0;<br>}<br><br></div><div>If I just use the command line options to set vectors Vk,Vkp1 and Vkm1 as cuda vectors and the matrix  LapPlusVeffOprloc as aijcusparse, will the lines of code between the two "TODO" comments be entirely executed on the device?</div><div><br></div><div>Sincerely,</div><div>Swarnava </div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 18, 2021 at 10:13 PM Swarnava Ghosh <<a href="mailto:swarnava89@gmail.com">swarnava89@gmail.com</a>> wrote:<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 dir="ltr">Thanks for the clarification, Junchao.<div><br></div><div>Sincerely,</div><div>Swarnava</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 18, 2021 at 10:08 PM Junchao Zhang <<a href="mailto:junchao.zhang@gmail.com" target="_blank">junchao.zhang@gmail.com</a>> wrote:<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 dir="ltr"><div dir="ltr"><br><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 18, 2021 at 8:47 PM Swarnava Ghosh <<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a>> wrote:<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 dir="ltr">Hi Junchao,<div><br><div>If I want to pass command line options as  -mymat_mat_type aijcusparse, should it be MatSetOptionsPrefix(A,"mymat"); or MatSetOptionsPrefix(A,"mymat_"); ? Could you please clarify?</div></div></div></blockquote><div> my fault, it should be MatSetOptionsPrefix(A,"mymat_"), as seen in mat/tests/ex62.c<br></div><div> Thanks</div><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><div><br></div><div>Sincerely,</div><div>Swarnava</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 18, 2021 at 9:23 PM Junchao Zhang <<a href="mailto:junchao.zhang@gmail.com" target="_blank">junchao.zhang@gmail.com</a>> wrote:<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 dir="ltr"><div dir="ltr"><div style="color:rgb(0,0,0);font-family:Menlo,Monaco,"Courier New",monospace;font-size:14px;line-height:21px;white-space:pre-wrap"><div><span style="color:rgb(121,94,38)">MatSetOptionsPrefix(A,"mymat")</span></div><div><div style="line-height:21px"><div><span style="color:rgb(121,94,38)">VecSetOptionsPrefix</span>(<span style="color:rgb(0,16,128)">v</span>,"myvec")</div><div><br></div></div></div></div><div><div dir="ltr"><div dir="ltr">--Junchao Zhang</div></div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 18, 2021 at 8:04 PM Chang Liu <<a href="mailto:cliu@pppl.gov" target="_blank">cliu@pppl.gov</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Junchao,<br>
<br>
Thank you for your answer. I tried MatConvert and it works. I didn't <br>
make it before because I forgot to convert a vector from mpi to mpicuda <br>
previously.<br>
<br>
For vector, there is no VecConvert to use, so I have to do VecDuplicate, <br>
VecSetType and VecCopy. Is there an easier option?<br></blockquote><div> As Matt suggested, you could single out the matrix and vector with options prefix and set their type on command line</div><div><br></div>MatSetOptionsPrefix(A,"mymat");<br>VecSetOptionsPrefix(v,"myvec");</div><div class="gmail_quote"><br></div><div class="gmail_quote">Then, -mymat_mat_type aijcusparse -myvec_vec_type cuda<br><div> </div><div>A simpler code is to have the vector type automatically set by MatCreateVecs(A,&v,NULL)<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">
<br>
Chang<br>
<br>
On 10/18/21 5:23 PM, Junchao Zhang wrote:<br>
> <br>
> <br>
> On Mon, Oct 18, 2021 at 3:42 PM Chang Liu via petsc-users <br>
> <<a href="mailto:petsc-users@mcs.anl.gov" target="_blank">petsc-users@mcs.anl.gov</a> <mailto:<a href="mailto:petsc-users@mcs.anl.gov" target="_blank">petsc-users@mcs.anl.gov</a>>> wrote:<br>
> <br>
>     Hi Matt,<br>
> <br>
>     I have a related question. In my code I have many matrices and I only<br>
>     want to have one living on GPU, the others still staying on CPU mem.<br>
> <br>
>     I wonder if there is an easier way to copy a mpiaij matrix to<br>
>     mpiaijcusparse (in other words, copy data to GPUs). I can think of<br>
>     creating a new mpiaijcusparse matrix, and copying the data line by<br>
>     line.<br>
>     But I wonder if there is a better option.<br>
> <br>
>     I have tried MatCopy and MatConvert but neither work.<br>
> <br>
> Did you use MatConvert(mat,matype,MAT_INPLACE_MATRIX,&mat)?<br>
> <br>
> <br>
>     Chang<br>
> <br>
>     On 10/17/21 7:50 PM, Matthew Knepley wrote:<br>
>      > On Sun, Oct 17, 2021 at 7:12 PM Swarnava Ghosh<br>
>     <<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a> <mailto:<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a>><br>
>      > <mailto:<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a> <mailto:<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a>>>> wrote:<br>
>      ><br>
>      >     Do I need convert the MATSEQBAIJ to a cuda matrix in code?<br>
>      ><br>
>      ><br>
>      > You would need a call to MatSetFromOptions() to take that type<br>
>     from the<br>
>      > command line, and not have<br>
>      > the type hard-coded in your application. It is generally a bad<br>
>     idea to<br>
>      > hard code the implementation type.<br>
>      ><br>
>      >     If I do it from command line, then are the other MatVec calls are<br>
>      >     ported onto CUDA? I have many MatVec calls in my code, but I<br>
>      >     specifically want to port just one call.<br>
>      ><br>
>      ><br>
>      > You can give that one matrix an options prefix to isolate it.<br>
>      ><br>
>      >    Thanks,<br>
>      ><br>
>      >       Matt<br>
>      ><br>
>      >     Sincerely,<br>
>      >     Swarnava<br>
>      ><br>
>      >     On Sun, Oct 17, 2021 at 7:07 PM Junchao Zhang<br>
>      >     <<a href="mailto:junchao.zhang@gmail.com" target="_blank">junchao.zhang@gmail.com</a> <mailto:<a href="mailto:junchao.zhang@gmail.com" target="_blank">junchao.zhang@gmail.com</a>><br>
>     <mailto:<a href="mailto:junchao.zhang@gmail.com" target="_blank">junchao.zhang@gmail.com</a> <mailto:<a href="mailto:junchao.zhang@gmail.com" target="_blank">junchao.zhang@gmail.com</a>>>><br>
>     wrote:<br>
>      ><br>
>      >         You can do that with command line options -mat_type<br>
>     aijcusparse<br>
>      >         -vec_type cuda<br>
>      ><br>
>      >         On Sun, Oct 17, 2021, 5:32 PM Swarnava Ghosh<br>
>      >         <<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a> <mailto:<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a>><br>
>     <mailto:<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a> <mailto:<a href="mailto:swarnava89@gmail.com" target="_blank">swarnava89@gmail.com</a>>>> wrote:<br>
>      ><br>
>      >             Dear Petsc team,<br>
>      ><br>
>      >             I had a query regarding using CUDA to accelerate a matrix<br>
>      >             vector product.<br>
>      >             I have a sequential sparse matrix (MATSEQBAIJ type).<br>
>     I want<br>
>      >             to port a MatVec call onto GPUs. Is there any<br>
>     code/example I<br>
>      >             can look at?<br>
>      ><br>
>      >             Sincerely,<br>
>      >             SG<br>
>      ><br>
>      ><br>
>      ><br>
>      > --<br>
>      > What most experimenters take for granted before they begin their<br>
>      > experiments is infinitely more interesting than any results to which<br>
>      > their experiments lead.<br>
>      > -- Norbert Wiener<br>
>      ><br>
>      > <a href="https://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br>
>     <<a href="https://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">https://www.cse.buffalo.edu/~knepley/</a>><br>
>     <<a href="http://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">http://www.cse.buffalo.edu/~knepley/</a><br>
>     <<a href="http://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">http://www.cse.buffalo.edu/~knepley/</a>>><br>
> <br>
>     -- <br>
>     Chang Liu<br>
>     Staff Research Physicist<br>
>     +1 609 243 3438<br>
>     <a href="mailto:cliu@pppl.gov" target="_blank">cliu@pppl.gov</a> <mailto:<a href="mailto:cliu@pppl.gov" target="_blank">cliu@pppl.gov</a>><br>
>     Princeton Plasma Physics Laboratory<br>
>     100 Stellarator Rd, Princeton NJ 08540, USA<br>
> <br>
<br>
-- <br>
Chang Liu<br>
Staff Research Physicist<br>
+1 609 243 3438<br>
<a href="mailto:cliu@pppl.gov" target="_blank">cliu@pppl.gov</a><br>
Princeton Plasma Physics Laboratory<br>
100 Stellarator Rd, Princeton NJ 08540, USA<br>
</blockquote></div></div>
</blockquote></div>
</blockquote></div></div>
</blockquote></div>
</blockquote></div>