1a4af0ceeSJacob 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 2034766dafSJunchao Zhang /* Initialize Kokkos if not yet */ 21375e5adfSJunchao Zhang PetscErrorCode PetscKokkosInitializeCheck(void) 22375e5adfSJunchao Zhang { 23375e5adfSJunchao Zhang PetscFunctionBegin; 2434766dafSJunchao Zhang if (!Kokkos::is_initialized()) { 25*62825ce1SJacob Faibussowitsch auto args = Kokkos::InitArguments{}; /* use default constructor */ 26b84ac304SJunchao Zhang 27*62825ce1SJacob Faibussowitsch #if (defined(KOKKOS_ENABLE_CUDA) && PetscDefined(HAVE_CUDA)) || (defined(KOKKOS_ENABLE_HIP) && PetscDefined(HAVE_HIP)) || (defined(KOKKOS_ENABLE_SYCL) && PetscDefined(HAVE_SYCL)) 28*62825ce1SJacob Faibussowitsch /* Kokkos does not support CUDA and HIP at the same time (but we do :)) */ 29a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 30a4af0ceeSJacob Faibussowitsch PetscErrorCode ierr; 31b9d03b0cSStefano Zampini 32a4af0ceeSJacob Faibussowitsch ierr = PetscDeviceContextGetCurrentContext(&dctx);CHKERRQ(ierr); 33a4af0ceeSJacob Faibussowitsch ierr = PetscMPIIntCast(dctx->device->deviceId,&args.device_id);CHKERRQ(ierr); 34375e5adfSJunchao Zhang #endif 3511f0be55SJunchao Zhang 36*62825ce1SJacob Faibussowitsch args.disable_warnings = !PetscDefined(HAVE_KOKKOS_INIT_WARNINGS); 37*62825ce1SJacob Faibussowitsch 3811f0be55SJunchao Zhang /* To use PetscNumOMPThreads, one has to configure petsc --with-openmp. 3911f0be55SJunchao Zhang Otherwise, let's keep the default value (-1) of args.num_threads. 4011f0be55SJunchao Zhang */ 41*62825ce1SJacob Faibussowitsch #if defined(KOKKOS_ENABLE_OPENMP) && PetscDefined(HAVE_OPENMP) 4211f0be55SJunchao Zhang args.num_threads = PetscNumOMPThreads; 4311f0be55SJunchao Zhang #endif 4411f0be55SJunchao Zhang 4534766dafSJunchao Zhang Kokkos::initialize(args); 4659e55d94SJunchao Zhang PetscBeganKokkos = PETSC_TRUE; 4759e55d94SJunchao Zhang } 4845639126SStefano Zampini PetscKokkosInitialized = PETSC_TRUE; 49375e5adfSJunchao Zhang PetscFunctionReturn(0); 50375e5adfSJunchao Zhang } 51