1*a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 2c2b86a48SJunchao Zhang #include <Kokkos_Core.hpp> 3c2b86a48SJunchao Zhang 445639126SStefano Zampini PetscBool PetscKokkosInitialized = PETSC_FALSE; 545639126SStefano Zampini 6c2b86a48SJunchao Zhang PetscErrorCode PetscKokkosFinalize_Private(void) 7c2b86a48SJunchao Zhang { 8c2b86a48SJunchao Zhang PetscFunctionBegin; 9c2b86a48SJunchao Zhang Kokkos::finalize(); 10c2b86a48SJunchao Zhang PetscFunctionReturn(0); 11c2b86a48SJunchao Zhang } 12c2b86a48SJunchao Zhang 13c2b86a48SJunchao Zhang PetscErrorCode PetscKokkosIsInitialized_Private(PetscBool *isInitialized) 14c2b86a48SJunchao Zhang { 15c2b86a48SJunchao Zhang PetscFunctionBegin; 16c2b86a48SJunchao Zhang *isInitialized = Kokkos::is_initialized() ? PETSC_TRUE : PETSC_FALSE; 17c2b86a48SJunchao Zhang PetscFunctionReturn(0); 18c2b86a48SJunchao Zhang } 19375e5adfSJunchao Zhang 20*a4af0ceeSJacob Faibussowitsch #define PETSC_AND_KOKKOS_HAVE(CUPM) (defined(KOKKOS_ENABLE_##CUPM) && PetscDefined(HAVE_##CUPM)) 21*a4af0ceeSJacob Faibussowitsch 2234766dafSJunchao Zhang /* Initialize Kokkos if not yet */ 23375e5adfSJunchao Zhang PetscErrorCode PetscKokkosInitializeCheck(void) 24375e5adfSJunchao Zhang { 2534766dafSJunchao Zhang Kokkos::InitArguments args; 26375e5adfSJunchao Zhang 27375e5adfSJunchao Zhang PetscFunctionBegin; 2834766dafSJunchao Zhang if (!Kokkos::is_initialized()) { 2911f0be55SJunchao Zhang args.num_threads = -1; /* Kokkos default value of each parameter is -1 */ 3011f0be55SJunchao Zhang args.num_numa = -1; 3111f0be55SJunchao Zhang args.device_id = -1; 3211f0be55SJunchao Zhang args.ndevices = -1; 3311f0be55SJunchao Zhang args.skip_device = -1; 34b84ac304SJunchao Zhang 35b84ac304SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS_INIT_WARNINGS) 3611f0be55SJunchao Zhang args.disable_warnings = false; 37b84ac304SJunchao Zhang #else 38b84ac304SJunchao Zhang args.disable_warnings = true; 39b84ac304SJunchao Zhang #endif 40b84ac304SJunchao Zhang 41*a4af0ceeSJacob Faibussowitsch #if PETSC_AND_KOKKOS_HAVE(CUDA) || PETSC_AND_KOKKOS_HAVE(HIP) 42*a4af0ceeSJacob Faibussowitsch /* Kokkos does not support CUDA and HIP at the same time (but we do :)) */ 43*a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 44*a4af0ceeSJacob Faibussowitsch PetscErrorCode ierr; 45b9d03b0cSStefano Zampini 46*a4af0ceeSJacob Faibussowitsch ierr = PetscDeviceContextGetCurrentContext(&dctx);CHKERRQ(ierr); 47*a4af0ceeSJacob Faibussowitsch ierr = PetscMPIIntCast(dctx->device->deviceId,&args.device_id);CHKERRQ(ierr); 48375e5adfSJunchao Zhang #endif 4911f0be55SJunchao Zhang 5011f0be55SJunchao Zhang /* To use PetscNumOMPThreads, one has to configure petsc --with-openmp. 5111f0be55SJunchao Zhang Otherwise, let's keep the default value (-1) of args.num_threads. 5211f0be55SJunchao Zhang */ 5311f0be55SJunchao Zhang #if defined(KOKKOS_ENABLE_OPENMP) && defined(PETSC_HAVE_OPENMP) 5411f0be55SJunchao Zhang args.num_threads = PetscNumOMPThreads; 5511f0be55SJunchao Zhang #endif 5611f0be55SJunchao Zhang 5734766dafSJunchao Zhang Kokkos::initialize(args); 5859e55d94SJunchao Zhang PetscBeganKokkos = PETSC_TRUE; 5959e55d94SJunchao Zhang } 6045639126SStefano Zampini PetscKokkosInitialized = PETSC_TRUE; 61375e5adfSJunchao Zhang PetscFunctionReturn(0); 62375e5adfSJunchao Zhang } 63