xref: /petsc/src/dm/impls/da/kokkos/dagetov.kokkos.cxx (revision c6583b630ce57b3db0cf15c4e0233179c11bb7a2)
1*c6583b63SJunchao Zhang #include <petsc/private/vecimpl_kokkos.hpp>
2*c6583b63SJunchao Zhang #include <petsc/private/dmdaimpl.h>
3*c6583b63SJunchao Zhang #include <petscdmda_kokkos.hpp>
4*c6583b63SJunchao Zhang 
5*c6583b63SJunchao Zhang /* Use macro instead of inlined function just to avoid annoying warnings like: 'dof' may be used uninitialized in this function [-Wmaybe-uninitialized] */
6*c6583b63SJunchao Zhang #define DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof) \
7*c6583b63SJunchao Zhang do { \
8*c6583b63SJunchao Zhang   PetscErrorCode ierr; \
9*c6583b63SJunchao Zhang   ierr = DMDAGetCorners(da,&xs,&ys,&zs,&xm,&ym,&zm);CHKERRQ(ierr); \
10*c6583b63SJunchao Zhang   ierr = DMDAGetGhostCorners(da,&gxs,&gys,&gzs,&gxm,&gym,&gzm);CHKERRQ(ierr); \
11*c6583b63SJunchao Zhang   ierr = DMDAGetInfo(da,&dim,NULL,NULL,NULL,NULL,NULL,NULL,&dof,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr); \
12*c6583b63SJunchao Zhang   /* Handle case where user passes in global vector as opposed to local */ \
13*c6583b63SJunchao Zhang   ierr = VecGetLocalSize(vec,&N);CHKERRQ(ierr); \
14*c6583b63SJunchao Zhang   if (N == xm*ym*zm*dof) { \
15*c6583b63SJunchao Zhang     gxm = xm; gym = ym; gzm = zm; \
16*c6583b63SJunchao Zhang     gxs = xs; gys = ys; gzs = zs; \
17*c6583b63SJunchao Zhang   } else if (N != gxm*gym*gzm*dof) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Vector local size %D is not compatible with DMDA local sizes %D %D\n",N,xm*ym*zm*dof,gxm*gym*gzm*dof); \
18*c6583b63SJunchao Zhang   if (dim != 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 1D but DMDA is %DD\n",dim); \
19*c6583b63SJunchao Zhang } while (0)
20*c6583b63SJunchao Zhang 
21*c6583b63SJunchao Zhang template<class MemorySpace>
22*c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite)
23*c6583b63SJunchao Zhang {
24*c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
25*c6583b63SJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
26*c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
27*c6583b63SJunchao Zhang 
28*c6583b63SJunchao Zhang   PetscFunctionBegin;
29*c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
30*c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
31*c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
32*c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
33*c6583b63SJunchao Zhang   if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
34*c6583b63SJunchao Zhang   else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);}
35*c6583b63SJunchao Zhang   *ov  = PetscScalarKokkosOffsetView1DType<MemorySpace>(kv,{gxs*dof}); /* View to OffsetView by giving the start. The extent is already known. */
36*c6583b63SJunchao Zhang   PetscFunctionReturn(0);
37*c6583b63SJunchao Zhang }
38*c6583b63SJunchao Zhang 
39*c6583b63SJunchao Zhang template<class MemorySpace>
40*c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite)
41*c6583b63SJunchao Zhang {
42*c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
43*c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
44*c6583b63SJunchao Zhang 
45*c6583b63SJunchao Zhang   PetscFunctionBegin;
46*c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
47*c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
48*c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
49*c6583b63SJunchao Zhang   kv   = ov->view(); /* OffsetView to View */
50*c6583b63SJunchao Zhang   if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
51*c6583b63SJunchao Zhang   else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);}
52*c6583b63SJunchao Zhang   PetscFunctionReturn(0);
53*c6583b63SJunchao Zhang }
54*c6583b63SJunchao Zhang 
55*c6583b63SJunchao Zhang template<class MemorySpace>
56*c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
57*c6583b63SJunchao Zhang {
58*c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
59*c6583b63SJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
60*c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
61*c6583b63SJunchao Zhang 
62*c6583b63SJunchao Zhang   PetscFunctionBegin;
63*c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
64*c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
65*c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
66*c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
67*c6583b63SJunchao Zhang   ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);
68*c6583b63SJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView1DType<MemorySpace>(kv,{gxs*dof}); /* View to OffsetView */
69*c6583b63SJunchao Zhang   PetscFunctionReturn(0);
70*c6583b63SJunchao Zhang }
71*c6583b63SJunchao Zhang 
72*c6583b63SJunchao Zhang template<class MemorySpace>
73*c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
74*c6583b63SJunchao Zhang {
75*c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
76*c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
77*c6583b63SJunchao Zhang 
78*c6583b63SJunchao Zhang   PetscFunctionBegin;
79*c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
80*c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
81*c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
82*c6583b63SJunchao Zhang   kv   = ov->view();
83*c6583b63SJunchao Zhang   ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);
84*c6583b63SJunchao Zhang   PetscFunctionReturn(0);
85*c6583b63SJunchao Zhang }
86*c6583b63SJunchao Zhang 
87*c6583b63SJunchao Zhang template<class MemorySpace>
88*c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
89*c6583b63SJunchao Zhang {
90*c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
91*c6583b63SJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
92*c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
93*c6583b63SJunchao Zhang 
94*c6583b63SJunchao Zhang   PetscFunctionBegin;
95*c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
96*c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
97*c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
98*c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
99*c6583b63SJunchao Zhang   if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
100*c6583b63SJunchao Zhang   else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);}
101*c6583b63SJunchao Zhang   *ov  = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs*dof,(gxs+gxm)*dof}, {gys*dof,(gys+gym)*dof}); /* View to OffsetView */
102*c6583b63SJunchao Zhang   PetscFunctionReturn(0);
103*c6583b63SJunchao Zhang }
104*c6583b63SJunchao Zhang 
105*c6583b63SJunchao Zhang template<class MemorySpace>
106*c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
107*c6583b63SJunchao Zhang {
108*c6583b63SJunchao Zhang   PetscErrorCode                             ierr;
109*c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
110*c6583b63SJunchao Zhang 
111*c6583b63SJunchao Zhang   PetscFunctionBegin;
112*c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
113*c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
114*c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
115*c6583b63SJunchao Zhang   // kv   = ov->view(); /* 2D OffsetView => 2D View => 1D View. Why does it not work? */
116*c6583b63SJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
117*c6583b63SJunchao Zhang   if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
118*c6583b63SJunchao Zhang   else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);}
119*c6583b63SJunchao Zhang   PetscFunctionReturn(0);
120*c6583b63SJunchao Zhang }
121*c6583b63SJunchao Zhang 
122*c6583b63SJunchao Zhang template<class MemorySpace>
123*c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
124*c6583b63SJunchao Zhang {
125*c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
126*c6583b63SJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
127*c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
128*c6583b63SJunchao Zhang 
129*c6583b63SJunchao Zhang   PetscFunctionBegin;
130*c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
131*c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
132*c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
133*c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
134*c6583b63SJunchao Zhang   ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);
135*c6583b63SJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs*dof,(gxs+gxm)*dof}, {gys*dof,(gys+gym)*dof}); /* View to OffsetView */
136*c6583b63SJunchao Zhang   PetscFunctionReturn(0);
137*c6583b63SJunchao Zhang }
138*c6583b63SJunchao Zhang 
139*c6583b63SJunchao Zhang template<class MemorySpace>
140*c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
141*c6583b63SJunchao Zhang {
142*c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
143*c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
144*c6583b63SJunchao Zhang 
145*c6583b63SJunchao Zhang   PetscFunctionBegin;
146*c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
147*c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
148*c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
149*c6583b63SJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
150*c6583b63SJunchao Zhang   ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);
151*c6583b63SJunchao Zhang   PetscFunctionReturn(0);
152*c6583b63SJunchao Zhang }
153*c6583b63SJunchao Zhang 
154*c6583b63SJunchao Zhang 
155*c6583b63SJunchao Zhang /* Function template explicit instantiation */
156*c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,ConstPetscScalarKokkosOffsetView1D*);
157*c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,ConstPetscScalarKokkosOffsetView1D*);
158*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
159*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
160*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
161*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
162*c6583b63SJunchao Zhang 
163*c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,ConstPetscScalarKokkosOffsetView2D*);
164*c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,ConstPetscScalarKokkosOffsetView2D*);
165*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
166*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
167*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
168*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
169*c6583b63SJunchao Zhang 
170