xref: /libCEED/rust/libceed-sys/c-src/backends/sycl/ceed-sycl-common.hpp (revision bd882c8a454763a096666645dc9a6229d5263694)
1*bd882c8aSJames Wright // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2*bd882c8aSJames Wright // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3*bd882c8aSJames Wright //
4*bd882c8aSJames Wright // SPDX-License-Identifier: BSD-2-Clause
5*bd882c8aSJames Wright //
6*bd882c8aSJames Wright // This file is part of CEED:  http://github.com/ceed
7*bd882c8aSJames Wright 
8*bd882c8aSJames Wright #ifndef _ceed_sycl_common_hpp
9*bd882c8aSJames Wright #define _ceed_sycl_common_hpp
10*bd882c8aSJames Wright 
11*bd882c8aSJames Wright #include <ceed/backend.h>
12*bd882c8aSJames Wright #include <ceed/jit-source/sycl/sycl-types.h>
13*bd882c8aSJames Wright 
14*bd882c8aSJames Wright #include <sycl/sycl.hpp>
15*bd882c8aSJames Wright #include <type_traits>
16*bd882c8aSJames Wright 
17*bd882c8aSJames Wright #define CeedCallSycl(ceed, ...)                               \
18*bd882c8aSJames Wright   do {                                                        \
19*bd882c8aSJames Wright     try {                                                     \
20*bd882c8aSJames Wright       __VA_ARGS__;                                            \
21*bd882c8aSJames Wright     } catch (sycl::exception const &e) {                      \
22*bd882c8aSJames Wright       return CeedError((ceed), CEED_ERROR_BACKEND, e.what()); \
23*bd882c8aSJames Wright     }                                                         \
24*bd882c8aSJames Wright   } while (0);
25*bd882c8aSJames Wright 
26*bd882c8aSJames Wright using CeedBackendFunction = int (*)();
27*bd882c8aSJames Wright 
28*bd882c8aSJames Wright template <typename R, class... Args>
29*bd882c8aSJames Wright int CeedSetBackendFunctionCpp(Ceed ceed, const char *type, void *object, const char *fname, R (*f)(Args...)) {
30*bd882c8aSJames Wright   static_assert(std::is_same_v<int, R>, "Ceed backend functions must return int");
31*bd882c8aSJames Wright   // Kris: this is potentially undefined behavior by C++ standards
32*bd882c8aSJames Wright   auto *bf = reinterpret_cast<CeedBackendFunction>(f);
33*bd882c8aSJames Wright   return CeedSetBackendFunction(ceed, type, object, fname, bf);
34*bd882c8aSJames Wright }
35*bd882c8aSJames Wright 
36*bd882c8aSJames Wright typedef struct {
37*bd882c8aSJames Wright   sycl::context sycl_context;
38*bd882c8aSJames Wright   sycl::device  sycl_device;
39*bd882c8aSJames Wright   sycl::queue   sycl_queue;
40*bd882c8aSJames Wright } Ceed_Sycl;
41*bd882c8aSJames Wright 
42*bd882c8aSJames Wright CEED_INTERN int CeedSyclGetResourceRoot(Ceed ceed, const char *resource, char **resource_root);
43*bd882c8aSJames Wright 
44*bd882c8aSJames Wright CEED_INTERN int CeedSyclInit(Ceed ceed, const char *resource);
45*bd882c8aSJames Wright 
46*bd882c8aSJames Wright CEED_INTERN int CeedDestroy_Sycl(Ceed ceed);
47*bd882c8aSJames Wright 
48*bd882c8aSJames Wright CEED_EXTERN int CeedSetSyclStream(Ceed ceed, void *handle);
49*bd882c8aSJames Wright 
50*bd882c8aSJames Wright #endif  // _ceed_sycl_common_h
51