xref: /petsc/src/sys/objects/kokkos/kinit.kokkos.cxx (revision b84ac304b1ef89c32d2d1c522342d13037de039f)
1b9d03b0cSStefano Zampini #include <petscdevice.h>
2c2b86a48SJunchao Zhang #include <petsc/private/petscimpl.h>
3c2b86a48SJunchao Zhang #include <Kokkos_Core.hpp>
4c2b86a48SJunchao Zhang 
545639126SStefano Zampini PetscBool PetscKokkosInitialized = PETSC_FALSE;
645639126SStefano Zampini 
7c2b86a48SJunchao Zhang PetscErrorCode PetscKokkosFinalize_Private(void)
8c2b86a48SJunchao Zhang {
9c2b86a48SJunchao Zhang   PetscFunctionBegin;
10c2b86a48SJunchao Zhang   Kokkos::finalize();
11c2b86a48SJunchao Zhang   PetscFunctionReturn(0);
12c2b86a48SJunchao Zhang }
13c2b86a48SJunchao Zhang 
14c2b86a48SJunchao Zhang PetscErrorCode PetscKokkosIsInitialized_Private(PetscBool *isInitialized)
15c2b86a48SJunchao Zhang {
16c2b86a48SJunchao Zhang   PetscFunctionBegin;
17c2b86a48SJunchao Zhang   *isInitialized = Kokkos::is_initialized() ? PETSC_TRUE : PETSC_FALSE;
18c2b86a48SJunchao Zhang   PetscFunctionReturn(0);
19c2b86a48SJunchao Zhang }
20375e5adfSJunchao Zhang 
2134766dafSJunchao Zhang /* Initialize Kokkos if not yet */
22375e5adfSJunchao Zhang PetscErrorCode PetscKokkosInitializeCheck(void)
23375e5adfSJunchao Zhang {
2455c8bb78SStefano Zampini #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP)
25375e5adfSJunchao Zhang   PetscErrorCode        ierr;
2655c8bb78SStefano Zampini #endif
2734766dafSJunchao Zhang   Kokkos::InitArguments args;
2834766dafSJunchao Zhang   int                   devId = -1;
29375e5adfSJunchao Zhang 
30375e5adfSJunchao Zhang   PetscFunctionBegin;
3134766dafSJunchao Zhang   if (!Kokkos::is_initialized()) {
3211f0be55SJunchao Zhang     args.num_threads = -1; /* Kokkos default value of each parameter is -1 */
3311f0be55SJunchao Zhang     args.num_numa    = -1;
3411f0be55SJunchao Zhang     args.device_id   = -1;
3511f0be55SJunchao Zhang     args.ndevices    = -1;
3611f0be55SJunchao Zhang     args.skip_device = -1;
37*b84ac304SJunchao Zhang 
38*b84ac304SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS_INIT_WARNINGS)
3911f0be55SJunchao Zhang     args.disable_warnings = false;
40*b84ac304SJunchao Zhang #else
41*b84ac304SJunchao Zhang     args.disable_warnings = true;
42*b84ac304SJunchao Zhang #endif
43*b84ac304SJunchao Zhang 
44375e5adfSJunchao Zhang    #if defined(KOKKOS_ENABLE_CUDA)
45b9d03b0cSStefano Zampini     cudaError_t cerr;
46b9d03b0cSStefano Zampini 
47375e5adfSJunchao Zhang     ierr = PetscCUDAInitializeCheck();CHKERRQ(ierr);
48b9d03b0cSStefano Zampini     cerr = cudaGetDevice(&devId);CHKERRCUDA(cerr);
4934766dafSJunchao Zhang    #elif defined(KOKKOS_ENABLE_HIP) /* Kokkos does not support CUDA and HIP at the same time */
50b9d03b0cSStefano Zampini     hipError_t herr;
51b9d03b0cSStefano Zampini 
52375e5adfSJunchao Zhang     ierr = PetscHIPInitializeCheck();CHKERRQ(ierr);
53b9d03b0cSStefano Zampini     herr = hipGetDevice(&devId);CHKERRHIP(herr);
54375e5adfSJunchao Zhang    #endif
5511f0be55SJunchao Zhang 
5611f0be55SJunchao Zhang     /* To use PetscNumOMPThreads, one has to configure petsc --with-openmp.
5711f0be55SJunchao Zhang        Otherwise, let's keep the default value (-1) of args.num_threads.
5811f0be55SJunchao Zhang     */
5911f0be55SJunchao Zhang    #if defined(KOKKOS_ENABLE_OPENMP) && defined(PETSC_HAVE_OPENMP)
6011f0be55SJunchao Zhang     args.num_threads = PetscNumOMPThreads;
6111f0be55SJunchao Zhang    #endif
6211f0be55SJunchao Zhang 
6334766dafSJunchao Zhang     args.device_id   = devId;
6434766dafSJunchao Zhang     Kokkos::initialize(args);
6559e55d94SJunchao Zhang     PetscBeganKokkos = PETSC_TRUE;
6659e55d94SJunchao Zhang   }
6745639126SStefano Zampini   PetscKokkosInitialized = PETSC_TRUE;
68375e5adfSJunchao Zhang   PetscFunctionReturn(0);
69375e5adfSJunchao Zhang }
70