xref: /petsc/src/sys/objects/kokkos/kinit.kokkos.cxx (revision ab4ee011827fbbb77f789779c813f6db6bb0cbfa)
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