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 <ceed/ceed.h> 9 #include <ceed/backend.h> 10 #include <cublas_v2.h> 11 #include <cuda.h> 12 #include <cuda_runtime.h> 13 #include <string.h> 14 #include "ceed-cuda-ref.h" 15 16 //------------------------------------------------------------------------------ 17 // CUDA preferred MemType 18 //------------------------------------------------------------------------------ 19 static int CeedGetPreferredMemType_Cuda(CeedMemType *mem_type) { 20 *mem_type = CEED_MEM_DEVICE; 21 return CEED_ERROR_SUCCESS; 22 } 23 24 //------------------------------------------------------------------------------ 25 // Get CUBLAS handle 26 //------------------------------------------------------------------------------ 27 int CeedCudaGetCublasHandle(Ceed ceed, cublasHandle_t *handle) { 28 int ierr; 29 Ceed_Cuda *data; 30 ierr = CeedGetData(ceed, &data); CeedChkBackend(ierr); 31 32 if (!data->cublas_handle) { 33 ierr = cublasCreate(&data->cublas_handle); CeedChk_Cublas(ceed, ierr); 34 } 35 *handle = data->cublas_handle; 36 return CEED_ERROR_SUCCESS; 37 } 38 39 //------------------------------------------------------------------------------ 40 // Backend Init 41 //------------------------------------------------------------------------------ 42 static int CeedInit_Cuda(const char *resource, Ceed ceed) { 43 int ierr; 44 45 if (strcmp(resource, "/gpu/cuda/ref")) 46 // LCOV_EXCL_START 47 return CeedError(ceed, CEED_ERROR_BACKEND, 48 "Cuda backend cannot use resource: %s", resource); 49 // LCOV_EXCL_STOP 50 ierr = CeedSetDeterministic(ceed, true); CeedChk(ierr); 51 52 Ceed_Cuda *data; 53 ierr = CeedCalloc(1, &data); CeedChkBackend(ierr); 54 ierr = CeedSetData(ceed, data); CeedChkBackend(ierr); 55 ierr = CeedCudaInit(ceed, resource); CeedChkBackend(ierr); 56 57 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "GetPreferredMemType", 58 CeedGetPreferredMemType_Cuda); CeedChkBackend(ierr); 59 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "VectorCreate", 60 CeedVectorCreate_Cuda); CeedChkBackend(ierr); 61 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "BasisCreateTensorH1", 62 CeedBasisCreateTensorH1_Cuda); CeedChkBackend(ierr); 63 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "BasisCreateH1", 64 CeedBasisCreateH1_Cuda); CeedChkBackend(ierr); 65 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "ElemRestrictionCreate", 66 CeedElemRestrictionCreate_Cuda); CeedChkBackend(ierr); 67 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, 68 "ElemRestrictionCreateBlocked", 69 CeedElemRestrictionCreateBlocked_Cuda); 70 CeedChkBackend(ierr); 71 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "QFunctionCreate", 72 CeedQFunctionCreate_Cuda); CeedChkBackend(ierr); 73 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "QFunctionContextCreate", 74 CeedQFunctionContextCreate_Cuda); CeedChkBackend(ierr); 75 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "OperatorCreate", 76 CeedOperatorCreate_Cuda); CeedChkBackend(ierr); 77 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "Destroy", 78 CeedDestroy_Cuda); CeedChkBackend(ierr); 79 return CEED_ERROR_SUCCESS; 80 } 81 82 //------------------------------------------------------------------------------ 83 // Backend Register 84 //------------------------------------------------------------------------------ 85 CEED_INTERN int CeedRegister_Cuda(void) { 86 return CeedRegister("/gpu/cuda/ref", CeedInit_Cuda, 40); 87 } 88 //------------------------------------------------------------------------------ 89