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