1*c2b86a48SJunchao Zhang #include <petscsys.h> 2*c2b86a48SJunchao Zhang #include <petsc/private/petscimpl.h> 3*c2b86a48SJunchao Zhang #include <Kokkos_Core.hpp> 4*c2b86a48SJunchao Zhang 5*c2b86a48SJunchao Zhang /* These wrappers are used as C bindings for the Kokkos routines */ 6*c2b86a48SJunchao Zhang PetscErrorCode PetscKokkosInitialize_Private(void) 7*c2b86a48SJunchao Zhang { 8*c2b86a48SJunchao Zhang Kokkos::InitArguments args; 9*c2b86a48SJunchao Zhang int devId; 10*c2b86a48SJunchao Zhang 11*c2b86a48SJunchao Zhang PetscFunctionBegin; 12*c2b86a48SJunchao Zhang #if defined(KOKKOS_ENABLE_CUDA) 13*c2b86a48SJunchao Zhang cudaGetDevice(&devId); 14*c2b86a48SJunchao Zhang #elif defined(KOKKOS_ENABLE_HIP) /* Kokkos does not support CUDA and HIP at the same time */ 15*c2b86a48SJunchao Zhang hipGetDevice(&devId); 16*c2b86a48SJunchao Zhang #endif 17*c2b86a48SJunchao Zhang args.device_id = devId; 18*c2b86a48SJunchao Zhang Kokkos::initialize(args); 19*c2b86a48SJunchao Zhang PetscFunctionReturn(0); 20*c2b86a48SJunchao Zhang } 21*c2b86a48SJunchao Zhang 22*c2b86a48SJunchao Zhang PetscErrorCode PetscKokkosFinalize_Private(void) 23*c2b86a48SJunchao Zhang { 24*c2b86a48SJunchao Zhang PetscFunctionBegin; 25*c2b86a48SJunchao Zhang Kokkos::finalize(); 26*c2b86a48SJunchao Zhang PetscFunctionReturn(0); 27*c2b86a48SJunchao Zhang } 28*c2b86a48SJunchao Zhang 29*c2b86a48SJunchao Zhang PetscErrorCode PetscKokkosIsInitialized_Private(PetscBool *isInitialized) 30*c2b86a48SJunchao Zhang { 31*c2b86a48SJunchao Zhang PetscFunctionBegin; 32*c2b86a48SJunchao Zhang *isInitialized = Kokkos::is_initialized() ? PETSC_TRUE : PETSC_FALSE; 33*c2b86a48SJunchao Zhang PetscFunctionReturn(0); 34*c2b86a48SJunchao Zhang }