[petsc-dev] using typedef for each different memory space the variable lives in

Mark Adams mfadams at lbl.gov
Sat Dec 12 16:23:15 CST 2020

On Sat, Dec 12, 2020 at 10:44 AM Barry Smith <bsmith at petsc.dev> wrote:

>    Currently we use PetscScalar and PetscScalar * to refer to variables
> that could be in any memory space. On the CPU, on the GPU, in Kokkos, etc.
>    Would it make sense to use typedef to indicate at each location the
> true type of the memory location when possible?

No. Absolutely not.

Because Cuda is simple C code (eg, printf is provided but few standard libs
are provided and you can't call non-device functions from the device), you
can put kernels in a header file and include it in the .cu file to get Cuda
code. You need to #define things like the device declaration syntax (eg
__device__) and things like atomicAdd. This is how MatSetValuesDevice works.

The way I do deep copies in Cuda I declare a host a device struct, like:

Mat h_mat, *d_mat.

Then do cuda mallocs into pointers in h_mat, then a cuda malloc on to get
d_mat. Then a cuda copy-to-device to put any data (cuda malloced) or
metadata (eg, array size, dim, etc) from h_mat into d_mat. I don't know how
I could do this if h_mat and d_mat are not the same without even more

The Kokkos people have been working with this for a long time and I think
they have probably learned the hard way what works. I would look at what
they do. If they or SYCL does it I would take a look.

>    typedef PetscReal PetscKokkosReal   means the variable is in the Kokkos
> memory space

There is no such thing. THere is the default execution space, default host
space, Cuda memory space, etc.

>    typedef PetscReal PetscCUDAReal
>    typedef PetscReal PetscNVSHEMReal
>    etc.
>   Then one could write things like
>   struct {
>      ...
>      PetscNVSHEMReal *values;
>   }
>   Similarly inside kernels one would use the type type associated with the
> kernel, cuda with cuda etc.
>   I think the resulting code will be much clearer and easier to dive into,
> then having to first figure out where each variable lives.
>   I find the current code confusing because one cannot immediately see a
> variable declaration and know where it lives, even though it does live
> somewhere in particular..
>   Barry
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20201212/4b2ad2ca/attachment.html>

More information about the petsc-dev mailing list