1a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 20e6b6b59SJacob Faibussowitsch #include <petscpkg_version.h> 3*524fe776SJunchao Zhang #include <petsc_kokkos.hpp> 4c2b86a48SJunchao Zhang 545639126SStefano Zampini PetscBool PetscKokkosInitialized = PETSC_FALSE; 645639126SStefano Zampini 7*524fe776SJunchao Zhang Kokkos::DefaultExecutionSpace *PetscKokkosExecutionSpacePtr = nullptr; 8*524fe776SJunchao Zhang 9d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscKokkosFinalize_Private(void) 10d71ae5a4SJacob Faibussowitsch { 11c2b86a48SJunchao Zhang PetscFunctionBegin; 12*524fe776SJunchao Zhang PetscCallCXX(delete PetscKokkosExecutionSpacePtr); 13c2b86a48SJunchao Zhang Kokkos::finalize(); 143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 15c2b86a48SJunchao Zhang } 16c2b86a48SJunchao Zhang 17d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscKokkosIsInitialized_Private(PetscBool *isInitialized) 18d71ae5a4SJacob Faibussowitsch { 19c2b86a48SJunchao Zhang PetscFunctionBegin; 20c2b86a48SJunchao Zhang *isInitialized = Kokkos::is_initialized() ? PETSC_TRUE : PETSC_FALSE; 213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22c2b86a48SJunchao Zhang } 23375e5adfSJunchao Zhang 2434766dafSJunchao Zhang /* Initialize Kokkos if not yet */ 25d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscKokkosInitializeCheck(void) 26d71ae5a4SJacob Faibussowitsch { 27375e5adfSJunchao Zhang PetscFunctionBegin; 2834766dafSJunchao Zhang if (!Kokkos::is_initialized()) { 29471471fdSJunchao Zhang #if PETSC_PKG_KOKKOS_VERSION_GE(3, 7, 0) 30c66e0907SJunchao Zhang auto args = Kokkos::InitializationSettings(); 31c66e0907SJunchao Zhang #else 3262825ce1SJacob Faibussowitsch auto args = Kokkos::InitArguments{}; /* use default constructor */ 33c66e0907SJunchao Zhang #endif 34b84ac304SJunchao Zhang 3562825ce1SJacob Faibussowitsch #if (defined(KOKKOS_ENABLE_CUDA) && PetscDefined(HAVE_CUDA)) || (defined(KOKKOS_ENABLE_HIP) && PetscDefined(HAVE_HIP)) || (defined(KOKKOS_ENABLE_SYCL) && PetscDefined(HAVE_SYCL)) 3662825ce1SJacob Faibussowitsch /* Kokkos does not support CUDA and HIP at the same time (but we do :)) */ 37a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 38b9d03b0cSStefano Zampini 399566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 40471471fdSJunchao Zhang #if PETSC_PKG_KOKKOS_VERSION_GE(3, 7, 0) 41c66e0907SJunchao Zhang args.set_device_id(static_cast<int>(dctx->device->deviceId)); 42c66e0907SJunchao Zhang #else 439566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(dctx->device->deviceId, &args.device_id)); 44375e5adfSJunchao Zhang #endif 45c66e0907SJunchao Zhang #endif 4611f0be55SJunchao Zhang 47471471fdSJunchao Zhang #if PETSC_PKG_KOKKOS_VERSION_GE(3, 7, 0) 48c66e0907SJunchao Zhang args.set_disable_warnings(!PetscDefined(HAVE_KOKKOS_INIT_WARNINGS)); 49c66e0907SJunchao Zhang #else 5062825ce1SJacob Faibussowitsch args.disable_warnings = !PetscDefined(HAVE_KOKKOS_INIT_WARNINGS); 51c66e0907SJunchao Zhang #endif 5262825ce1SJacob Faibussowitsch 5311f0be55SJunchao Zhang /* To use PetscNumOMPThreads, one has to configure petsc --with-openmp. 5411f0be55SJunchao Zhang Otherwise, let's keep the default value (-1) of args.num_threads. 5511f0be55SJunchao Zhang */ 5662825ce1SJacob Faibussowitsch #if defined(KOKKOS_ENABLE_OPENMP) && PetscDefined(HAVE_OPENMP) 57471471fdSJunchao Zhang #if PETSC_PKG_KOKKOS_VERSION_GE(3, 7, 0) 58c66e0907SJunchao Zhang args.set_num_threads(PetscNumOMPThreads); 59c66e0907SJunchao Zhang #else 6011f0be55SJunchao Zhang args.num_threads = PetscNumOMPThreads; 6111f0be55SJunchao Zhang #endif 62c66e0907SJunchao Zhang #endif 6311f0be55SJunchao Zhang 6434766dafSJunchao Zhang Kokkos::initialize(args); 65*524fe776SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 66*524fe776SJunchao Zhang extern cudaStream_t PetscDefaultCudaStream; 67*524fe776SJunchao Zhang PetscCallCXX(PetscKokkosExecutionSpacePtr = new Kokkos::DefaultExecutionSpace(PetscDefaultCudaStream)); 68*524fe776SJunchao Zhang #elif defined(PETS_HAVE_HIP) 69*524fe776SJunchao Zhang extern hipStream_t PetscDefaultHipStream; 70*524fe776SJunchao Zhang PetscCallCXX(PetscKokkosExecutionSpacePtr = new Kokkos::DefaultExecutionSpace(PetscDefaultHipStream)); 71*524fe776SJunchao Zhang #else 72*524fe776SJunchao Zhang PetscCallCXX(PetscKokkosExecutionSpacePtr = new Kokkos::DefaultExecutionSpace()); 73*524fe776SJunchao Zhang #endif 7459e55d94SJunchao Zhang PetscBeganKokkos = PETSC_TRUE; 7559e55d94SJunchao Zhang } 7645639126SStefano Zampini PetscKokkosInitialized = PETSC_TRUE; 773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 78375e5adfSJunchao Zhang } 79