xref: /petsc/src/sys/objects/kokkos/kinit.kokkos.cxx (revision a4af0ceea8a251db97ee0dc5c0d52d4adf50264a)
1*a4af0ceeSJacob 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 
20*a4af0ceeSJacob Faibussowitsch #define PETSC_AND_KOKKOS_HAVE(CUPM) (defined(KOKKOS_ENABLE_##CUPM) && PetscDefined(HAVE_##CUPM))
21*a4af0ceeSJacob Faibussowitsch 
2234766dafSJunchao Zhang /* Initialize Kokkos if not yet */
23375e5adfSJunchao Zhang PetscErrorCode PetscKokkosInitializeCheck(void)
24375e5adfSJunchao Zhang {
2534766dafSJunchao Zhang   Kokkos::InitArguments args;
26375e5adfSJunchao Zhang 
27375e5adfSJunchao Zhang   PetscFunctionBegin;
2834766dafSJunchao Zhang   if (!Kokkos::is_initialized()) {
2911f0be55SJunchao Zhang     args.num_threads = -1; /* Kokkos default value of each parameter is -1 */
3011f0be55SJunchao Zhang     args.num_numa    = -1;
3111f0be55SJunchao Zhang     args.device_id   = -1;
3211f0be55SJunchao Zhang     args.ndevices    = -1;
3311f0be55SJunchao Zhang     args.skip_device = -1;
34b84ac304SJunchao Zhang 
35b84ac304SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS_INIT_WARNINGS)
3611f0be55SJunchao Zhang     args.disable_warnings = false;
37b84ac304SJunchao Zhang #else
38b84ac304SJunchao Zhang     args.disable_warnings = true;
39b84ac304SJunchao Zhang #endif
40b84ac304SJunchao Zhang 
41*a4af0ceeSJacob Faibussowitsch #if PETSC_AND_KOKKOS_HAVE(CUDA) || PETSC_AND_KOKKOS_HAVE(HIP)
42*a4af0ceeSJacob Faibussowitsch     /* Kokkos does not support CUDA and HIP at the same time (but we do :)) */
43*a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
44*a4af0ceeSJacob Faibussowitsch     PetscErrorCode     ierr;
45b9d03b0cSStefano Zampini 
46*a4af0ceeSJacob Faibussowitsch     ierr = PetscDeviceContextGetCurrentContext(&dctx);CHKERRQ(ierr);
47*a4af0ceeSJacob Faibussowitsch     ierr = PetscMPIIntCast(dctx->device->deviceId,&args.device_id);CHKERRQ(ierr);
48375e5adfSJunchao Zhang #endif
4911f0be55SJunchao Zhang 
5011f0be55SJunchao Zhang     /* To use PetscNumOMPThreads, one has to configure petsc --with-openmp.
5111f0be55SJunchao Zhang        Otherwise, let's keep the default value (-1) of args.num_threads.
5211f0be55SJunchao Zhang     */
5311f0be55SJunchao Zhang    #if defined(KOKKOS_ENABLE_OPENMP) && defined(PETSC_HAVE_OPENMP)
5411f0be55SJunchao Zhang     args.num_threads = PetscNumOMPThreads;
5511f0be55SJunchao Zhang    #endif
5611f0be55SJunchao Zhang 
5734766dafSJunchao Zhang     Kokkos::initialize(args);
5859e55d94SJunchao Zhang     PetscBeganKokkos = PETSC_TRUE;
5959e55d94SJunchao Zhang   }
6045639126SStefano Zampini   PetscKokkosInitialized = PETSC_TRUE;
61375e5adfSJunchao Zhang   PetscFunctionReturn(0);
62375e5adfSJunchao Zhang }
63