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