1a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 20e6b6b59SJacob Faibussowitsch #include <petscpkg_version.h> 3c2b86a48SJunchao Zhang #include <Kokkos_Core.hpp> 4c2b86a48SJunchao Zhang 545639126SStefano Zampini PetscBool PetscKokkosInitialized = PETSC_FALSE; 645639126SStefano Zampini 7d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscKokkosFinalize_Private(void) 8d71ae5a4SJacob Faibussowitsch { 9c2b86a48SJunchao Zhang PetscFunctionBegin; 10c2b86a48SJunchao Zhang Kokkos::finalize(); 113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12c2b86a48SJunchao Zhang } 13c2b86a48SJunchao Zhang 14d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscKokkosIsInitialized_Private(PetscBool *isInitialized) 15d71ae5a4SJacob Faibussowitsch { 16c2b86a48SJunchao Zhang PetscFunctionBegin; 17c2b86a48SJunchao Zhang *isInitialized = Kokkos::is_initialized() ? PETSC_TRUE : PETSC_FALSE; 183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19c2b86a48SJunchao Zhang } 20375e5adfSJunchao Zhang 2134766dafSJunchao Zhang /* Initialize Kokkos if not yet */ 22d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscKokkosInitializeCheck(void) 23d71ae5a4SJacob Faibussowitsch { 24375e5adfSJunchao Zhang PetscFunctionBegin; 2534766dafSJunchao Zhang if (!Kokkos::is_initialized()) { 26471471fdSJunchao Zhang #if PETSC_PKG_KOKKOS_VERSION_GE(3, 7, 0) 27c66e0907SJunchao Zhang auto args = Kokkos::InitializationSettings(); 28c66e0907SJunchao Zhang #else 2962825ce1SJacob Faibussowitsch auto args = Kokkos::InitArguments{}; /* use default constructor */ 30c66e0907SJunchao Zhang #endif 31b84ac304SJunchao Zhang 3262825ce1SJacob Faibussowitsch #if (defined(KOKKOS_ENABLE_CUDA) && PetscDefined(HAVE_CUDA)) || (defined(KOKKOS_ENABLE_HIP) && PetscDefined(HAVE_HIP)) || (defined(KOKKOS_ENABLE_SYCL) && PetscDefined(HAVE_SYCL)) 3362825ce1SJacob Faibussowitsch /* Kokkos does not support CUDA and HIP at the same time (but we do :)) */ 34*ab4ee011SJunchao Zhang PetscDevice device; 35*ab4ee011SJunchao Zhang PetscInt deviceId; 36*ab4ee011SJunchao Zhang PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device)); 37*ab4ee011SJunchao Zhang PetscCall(PetscDeviceGetDeviceId(device, &deviceId)); 38*ab4ee011SJunchao Zhang PetscCall(PetscDeviceDestroy(&device)); 39*ab4ee011SJunchao Zhang #if PETSC_PKG_KOKKOS_VERSION_GE(4, 0, 0) 40*ab4ee011SJunchao Zhang // if device_id is not set, and no gpus have been found, kokkos will use CPU 41*ab4ee011SJunchao Zhang if (deviceId >= 0) args.set_device_id(static_cast<int>(deviceId)); 42*ab4ee011SJunchao Zhang #elif PETSC_PKG_KOKKOS_VERSION_GE(3, 7, 0) 43*ab4ee011SJunchao Zhang args.set_device_id(static_cast<int>(deviceId)); 44c66e0907SJunchao Zhang #else 45*ab4ee011SJunchao Zhang PetscCall(PetscMPIIntCast(deviceId, &args.device_id)); 46375e5adfSJunchao Zhang #endif 47c66e0907SJunchao Zhang #endif 4811f0be55SJunchao Zhang 49471471fdSJunchao Zhang #if PETSC_PKG_KOKKOS_VERSION_GE(3, 7, 0) 50c66e0907SJunchao Zhang args.set_disable_warnings(!PetscDefined(HAVE_KOKKOS_INIT_WARNINGS)); 51c66e0907SJunchao Zhang #else 5262825ce1SJacob Faibussowitsch args.disable_warnings = !PetscDefined(HAVE_KOKKOS_INIT_WARNINGS); 53c66e0907SJunchao Zhang #endif 5462825ce1SJacob Faibussowitsch 5511f0be55SJunchao Zhang /* To use PetscNumOMPThreads, one has to configure petsc --with-openmp. 5611f0be55SJunchao Zhang Otherwise, let's keep the default value (-1) of args.num_threads. 5711f0be55SJunchao Zhang */ 5862825ce1SJacob Faibussowitsch #if defined(KOKKOS_ENABLE_OPENMP) && PetscDefined(HAVE_OPENMP) 59471471fdSJunchao Zhang #if PETSC_PKG_KOKKOS_VERSION_GE(3, 7, 0) 60c66e0907SJunchao Zhang args.set_num_threads(PetscNumOMPThreads); 61c66e0907SJunchao Zhang #else 6211f0be55SJunchao Zhang args.num_threads = PetscNumOMPThreads; 6311f0be55SJunchao Zhang #endif 64c66e0907SJunchao Zhang #endif 65*ab4ee011SJunchao Zhang PetscCallCXX(Kokkos::initialize(args)); 6659e55d94SJunchao Zhang PetscBeganKokkos = PETSC_TRUE; 6759e55d94SJunchao Zhang } 6845639126SStefano Zampini PetscKokkosInitialized = PETSC_TRUE; 693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 70375e5adfSJunchao Zhang } 71