xref: /petsc/src/sys/objects/kokkos/kinit.kokkos.cxx (revision c66e0907e1a0ab9d8ee6ee3f7f3f2f207451f213)
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*c66e0907SJunchao Zhang    #if PETSC_PKG_KOKKOS_VERSION_GE(3,6,99)
26*c66e0907SJunchao Zhang     auto args = Kokkos::InitializationSettings();
27*c66e0907SJunchao Zhang    #else
2862825ce1SJacob Faibussowitsch     auto args = Kokkos::InitArguments{}; /* use default constructor */
29*c66e0907SJunchao Zhang    #endif
30b84ac304SJunchao Zhang 
3162825ce1SJacob Faibussowitsch #if (defined(KOKKOS_ENABLE_CUDA) && PetscDefined(HAVE_CUDA)) || (defined(KOKKOS_ENABLE_HIP) && PetscDefined(HAVE_HIP)) || (defined(KOKKOS_ENABLE_SYCL) && PetscDefined(HAVE_SYCL))
3262825ce1SJacob Faibussowitsch     /* Kokkos does not support CUDA and HIP at the same time (but we do :)) */
33a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
34b9d03b0cSStefano Zampini 
359566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
36*c66e0907SJunchao Zhang    #if PETSC_PKG_KOKKOS_VERSION_GE(3,6,99)
37*c66e0907SJunchao Zhang     args.set_device_id(static_cast<int>(dctx->device->deviceId));
38*c66e0907SJunchao Zhang    #else
399566063dSJacob Faibussowitsch     PetscCall(PetscMPIIntCast(dctx->device->deviceId,&args.device_id));
40375e5adfSJunchao Zhang    #endif
41*c66e0907SJunchao Zhang #endif
4211f0be55SJunchao Zhang 
43*c66e0907SJunchao Zhang    #if PETSC_PKG_KOKKOS_VERSION_GE(3,6,99)
44*c66e0907SJunchao Zhang     args.set_disable_warnings(!PetscDefined(HAVE_KOKKOS_INIT_WARNINGS));
45*c66e0907SJunchao Zhang    #else
4662825ce1SJacob Faibussowitsch     args.disable_warnings = !PetscDefined(HAVE_KOKKOS_INIT_WARNINGS);
47*c66e0907SJunchao Zhang    #endif
4862825ce1SJacob Faibussowitsch 
4911f0be55SJunchao Zhang     /* To use PetscNumOMPThreads, one has to configure petsc --with-openmp.
5011f0be55SJunchao Zhang        Otherwise, let's keep the default value (-1) of args.num_threads.
5111f0be55SJunchao Zhang     */
5262825ce1SJacob Faibussowitsch #if defined(KOKKOS_ENABLE_OPENMP) && PetscDefined(HAVE_OPENMP)
53*c66e0907SJunchao Zhang    #if PETSC_PKG_KOKKOS_VERSION_GE(3,6,99)
54*c66e0907SJunchao Zhang     args.set_num_threads(PetscNumOMPThreads);
55*c66e0907SJunchao Zhang    #else
5611f0be55SJunchao Zhang     args.num_threads = PetscNumOMPThreads;
5711f0be55SJunchao Zhang    #endif
58*c66e0907SJunchao Zhang #endif
5911f0be55SJunchao Zhang 
6034766dafSJunchao Zhang     Kokkos::initialize(args);
6159e55d94SJunchao Zhang     PetscBeganKokkos = PETSC_TRUE;
6259e55d94SJunchao Zhang   }
6345639126SStefano Zampini   PetscKokkosInitialized = PETSC_TRUE;
64375e5adfSJunchao Zhang   PetscFunctionReturn(0);
65375e5adfSJunchao Zhang }
66