xref: /libCEED/rust/libceed-sys/c-src/backends/cuda-gen/ceed-cuda-gen.c (revision dfdfb19e57f3fc18ccfd612ad88e5987a5e7a393)
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 <string.h>
11 #include "ceed-cuda-gen.h"
12 
13 //------------------------------------------------------------------------------
14 // Backend init
15 //------------------------------------------------------------------------------
16 static int CeedInit_Cuda_gen(const char *resource, Ceed ceed) {
17   int ierr;
18 
19   char *resource_root;
20   ierr = CeedCudaGetResourceRoot(ceed, resource, &resource_root);
21   CeedChkBackend(ierr);
22   if (strcmp(resource_root, "/gpu/cuda")
23       && strcmp(resource_root, "/gpu/cuda/gen"))
24     // LCOV_EXCL_START
25     return CeedError(ceed, CEED_ERROR_BACKEND,
26                      "Cuda backend cannot use resource: %s", resource);
27   // LCOV_EXCL_STOP
28   ierr = CeedFree(&resource_root); CeedChkBackend(ierr);
29 
30   Ceed_Cuda *data;
31   ierr = CeedCalloc(1, &data); CeedChkBackend(ierr);
32   ierr = CeedSetData(ceed, data); CeedChkBackend(ierr);
33   ierr = CeedCudaInit(ceed, resource); CeedChkBackend(ierr);
34 
35   Ceed ceedshared;
36   CeedInit("/gpu/cuda/shared", &ceedshared);
37   ierr = CeedSetDelegate(ceed, ceedshared); CeedChkBackend(ierr);
38 
39   const char fallbackresource[] = "/gpu/cuda/ref";
40   ierr = CeedSetOperatorFallbackResource(ceed, fallbackresource);
41   CeedChkBackend(ierr);
42 
43   ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "QFunctionCreate",
44                                 CeedQFunctionCreate_Cuda_gen); CeedChkBackend(ierr);
45   ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "OperatorCreate",
46                                 CeedOperatorCreate_Cuda_gen); CeedChkBackend(ierr);
47   ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "Destroy",
48                                 CeedDestroy_Cuda); CeedChkBackend(ierr);
49   return CEED_ERROR_SUCCESS;
50 }
51 
52 //------------------------------------------------------------------------------
53 // Register backend
54 //------------------------------------------------------------------------------
55 CEED_INTERN int CeedRegister_Cuda_Gen(void) {
56   return CeedRegister("/gpu/cuda/gen", CeedInit_Cuda_gen, 20);
57 }
58 //------------------------------------------------------------------------------
59