xref: /libCEED/backends/cuda/ceed-cuda-common.c (revision e26ec02599109ff3515b5118893f538030923aec)
1 // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2 // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3 //
4 // SPDX-License-Identifier: BSD-2-Clause
5 //
6 // This file is part of CEED:  http://github.com/ceed
7 
8 #include <string.h>
9 #include "ceed-cuda-common.h"
10 
11 //------------------------------------------------------------------------------
12 // Get root resource without device spec
13 //------------------------------------------------------------------------------
14 int CeedCudaGetResourceRoot(Ceed ceed, const char *resource,
15                             char **resource_root) {
16   int ierr;
17 
18   char *device_spec = strstr(resource, ":device_id=");
19   size_t resource_root_len = device_spec
20                              ? (size_t)(device_spec - resource) + 1
21                              : strlen(resource) + 1;
22   ierr = CeedCalloc(resource_root_len, resource_root); CeedChkBackend(ierr);
23   memcpy(*resource_root, resource, resource_root_len - 1);
24 
25   return CEED_ERROR_SUCCESS;
26 }
27 
28 //------------------------------------------------------------------------------
29 // Device information backend init
30 //------------------------------------------------------------------------------
31 int CeedCudaInit(Ceed ceed, const char *resource) {
32   int ierr;
33   const char *device_spec = strstr(resource, ":device_id=");
34   const int device_id = (device_spec) ? atoi(device_spec + 11) : -1;
35 
36   int current_device_id;
37   ierr = cudaGetDevice(&current_device_id); CeedChk_Cu(ceed, ierr);
38   if (device_id >= 0 && current_device_id != device_id) {
39     ierr = cudaSetDevice(device_id); CeedChk_Cu(ceed, ierr);
40     current_device_id = device_id;
41   }
42   Ceed_Cuda *data;
43   ierr = CeedGetData(ceed, &data); CeedChkBackend(ierr);
44   data->device_id = current_device_id;
45   ierr = cudaGetDeviceProperties(&data->device_prop, current_device_id);
46   CeedChk_Cu(ceed, ierr);
47   return CEED_ERROR_SUCCESS;
48 }
49 
50 //------------------------------------------------------------------------------
51 // Backend destroy
52 //------------------------------------------------------------------------------
53 int CeedDestroy_Cuda(Ceed ceed) {
54   int ierr;
55   Ceed_Cuda *data;
56   ierr = CeedGetData(ceed, &data); CeedChkBackend(ierr);
57   if (data->cublas_handle) {
58     ierr = cublasDestroy(data->cublas_handle); CeedChk_Cublas(ceed, ierr);
59   }
60   ierr = CeedFree(&data); CeedChkBackend(ierr);
61   return CEED_ERROR_SUCCESS;
62 }
63 
64 //------------------------------------------------------------------------------
65