Barry Smith <[email protected]> writes: > Yes, it is generally for arrays, but also makes sense for local variables > inside a kernel; just makes the code clearer. For example > > Kokkos::parallel_for(Kokkos::RangePolicy<ExecutionSpace>(0,nx), > KOKKOS_LAMBDA (const PetscInt &i) > { > PetscKokkosReal uvleft = eval(U,0, i, 1, .5); > PetscKokkosReal uvright = eval(U,0, i+1, 1, -.5); > PetscKokkosReal uwleft = eval(U,1, i, 1, .5); > PetscKokkosReal uwright = eval(U,1, i+1, 1, -.5); > flux(0,i, 1) = -.5*(uwleft+uwright)+.5*alpha_LF*(uvleft-uvright); > flux(1,i, 1) = -.5*(uvleft+uvright)+.5*alpha_LF*(uwleft-uwright); > }); > > vs > > Kokkos::parallel_for(Kokkos::RangePolicy<ExecutionSpace>(0,nx), > KOKKOS_LAMBDA (const PetscInt &i) > { > PetscReal uvleft = eval(U,0, i, 1, .5); > PetscReal uvright = eval(U,0, i+1, 1, -.5); > PetscReal uwleft = eval(U,1, i, 1, .5); > PetscReal uwright = eval(U,1, i+1, 1, -.5); > flux(0,i, 1) = -.5*(uwleft+uwright)+.5*alpha_LF*(uvleft-uvright); > flux(1,i, 1) = -.5*(uvleft+uvright)+.5*alpha_LF*(uwleft-uwright); > });
I don't see the benefit in this context. > I don't think there is need for conversion between PetscKokkosReal and > PetscReal. One uses the normal code for moving data between the memory spaces. > It is different than PetscInt and PetscBLASInt. Fine for values, but you can't just convert between device and host pointers (without unified memory and a potential performance hit).
