@Jed: thank you for your answer! @Barry: yes, I am thinking on CUDA Fortran.
Thank you, -Han > On Dec 12, 2023, at 6:41 PM, Barry Smith <bsm...@petsc.dev> wrote: > > > Are you thinking CUDA Fortran or some other "Fortran but running on the > GPU"? > > >> On Dec 12, 2023, at 8:11 PM, Jed Brown <j...@jedbrown.org> wrote: >> >> Han Tran <hant...@cs.utah.edu> writes: >> >>> Hi Jed, >>> >>> Thank you for your answer. I have not had a chance to work on this since I >>> asked. I have some follow-up questions. >>> >>> (1) From the Petsc manual, >>> https://petsc.org/release/manualpages/Vec/VecGetArrayAndMemType/, it shows >>> that both VecGetArrayAndMemType() and VecGetArrayReadAndMemType() do not >>> have Fortran support. Has Petsc added the Fortran support for these >>> functions so far? >> >> It doesn't look like it. I think one would mirror the VecGetArrayF90 >> implementation. >> >>> (2) My user-defined MatMult(A, u, v) already handles the communication, >>> i.e., the return vector v=A*u was computed with all needed communication. >>> Thus, I do not quite understand when you said that “use >>> DMGlobalToLocalBegin/End()…”. Do I need this function even if the >>> communication is already done by my user-defined MatMult()? >> >> If you do your own communication, you don't need to use >> DMGlobalToLocalBegin/End. >> >>> >>> Thank you, >>> Han >>> >>>> On Nov 4, 2022, at 9:06 AM, Jed Brown <j...@jedbrown.org> wrote: >>>> >>>> Yes, this is supported. You can use VecGetArrayAndMemType() to get access >>>> to device memory. You'll often use DMGlobalToLocalBegin/End() or >>>> VecScatter to communicate, but that will use GPU-aware MPI if your Vec is >>>> a device vector. >>>> >>>> Han Tran <hant...@cs.utah.edu> writes: >>>> >>>>> Hi, >>>>> >>>>> I am aware that PETSc recently supports solvers on GPU. I wonder whether >>>>> PETSc supports MatShell with GPU solvers, i.e., I have a user-defined >>>>> MatMult() function residing on the device, and I want to use MatShell >>>>> directly with PETSc GPU solvers without any transfer back and forth >>>>> between host and device. If this is possible, could you let me know how >>>>> to do this (an example, if any, would be very appreciated)? >>>>> >>>>> Thank you! >>>>> Han