xref: /libCEED/rust/libceed-sys/c-src/backends/sycl-shared/ceed-sycl-shared.sycl.cpp (revision bc246734e1a318011d33a38eecea04c89961ac52)
1bd882c8aSJames Wright // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2bd882c8aSJames Wright // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3bd882c8aSJames Wright //
4bd882c8aSJames Wright // SPDX-License-Identifier: BSD-2-Clause
5bd882c8aSJames Wright //
6bd882c8aSJames Wright // This file is part of CEED:  http://github.com/ceed
7bd882c8aSJames Wright 
8bd882c8aSJames Wright #include "ceed-sycl-shared.hpp"
9bd882c8aSJames Wright 
10bd882c8aSJames Wright #include <ceed/backend.h>
11bd882c8aSJames Wright #include <ceed/ceed.h>
12bd882c8aSJames Wright 
13bd882c8aSJames Wright #include <sstream>
14bd882c8aSJames Wright #include <string>
15bd882c8aSJames Wright #include <string_view>
16bd882c8aSJames Wright 
17bd882c8aSJames Wright //------------------------------------------------------------------------------
18bd882c8aSJames Wright // Backend init
19bd882c8aSJames Wright //------------------------------------------------------------------------------
20bd882c8aSJames Wright static int CeedInit_Sycl_shared(const char *resource, Ceed ceed) {
21bd882c8aSJames Wright   char *resource_root;
22*bc246734SJeremy L Thompson   CeedCallBackend(CeedGetResourceRoot(ceed, resource, ":", &resource_root));
23bd882c8aSJames Wright   CeedCheck(!std::strcmp(resource_root, "/gpu/sycl/shared") || !std::strcmp(resource_root, "/cpu/sycl/shared"), ceed, CEED_ERROR_BACKEND,
24bd882c8aSJames Wright             "Sycl backend cannot use resource: %s", resource);
25bd882c8aSJames Wright   std::string_view root_view = resource_root;
26bd882c8aSJames Wright 
27bd882c8aSJames Wright   auto suffix_length = root_view.size() - root_view.rfind("shared");
28bd882c8aSJames Wright   root_view.remove_suffix(suffix_length);
29bd882c8aSJames Wright 
30bd882c8aSJames Wright   std::ostringstream ref_resource;
31bd882c8aSJames Wright   ref_resource << root_view << "ref";
32bd882c8aSJames Wright 
33bd882c8aSJames Wright   CeedCallBackend(CeedFree(&resource_root));
34bd882c8aSJames Wright   CeedCallBackend(CeedSetDeterministic(ceed, true));
35bd882c8aSJames Wright 
36bd882c8aSJames Wright   Ceed_Sycl *data;
37bd882c8aSJames Wright   CeedCallBackend(CeedCalloc(1, &data));
38bd882c8aSJames Wright   CeedCallBackend(CeedSetData(ceed, data));
39bd882c8aSJames Wright   CeedCallBackend(CeedSyclInit(ceed, resource));
40bd882c8aSJames Wright 
41bd882c8aSJames Wright   Ceed ceed_ref;
42bd882c8aSJames Wright   CeedCallBackend(CeedInit(ref_resource.str().c_str(), &ceed_ref));
43bd882c8aSJames Wright 
44bd882c8aSJames Wright   Ceed_Sycl *ref_data;
45bd882c8aSJames Wright   CeedCallBackend(CeedGetData(ceed_ref, &ref_data));
46bd882c8aSJames Wright 
47bd882c8aSJames Wright   // Need to use the same queue everywhere for correct synchronization
48bd882c8aSJames Wright   ref_data->sycl_queue   = data->sycl_queue;
49bd882c8aSJames Wright   ref_data->sycl_context = data->sycl_context;
50bd882c8aSJames Wright   ref_data->sycl_device  = data->sycl_device;
51bd882c8aSJames Wright 
52bd882c8aSJames Wright   CeedCallBackend(CeedSetDelegate(ceed, ceed_ref));
53bd882c8aSJames Wright 
54bd882c8aSJames Wright   CeedCallBackend(CeedSetBackendFunctionCpp(ceed, "Ceed", ceed, "BasisCreateTensorH1", CeedBasisCreateTensorH1_Sycl_shared));
55bd882c8aSJames Wright   CeedCallBackend(CeedSetBackendFunctionCpp(ceed, "Ceed", ceed, "Destroy", CeedDestroy_Sycl));
56bd882c8aSJames Wright   return CEED_ERROR_SUCCESS;
57bd882c8aSJames Wright }
58bd882c8aSJames Wright 
59bd882c8aSJames Wright //------------------------------------------------------------------------------
60bd882c8aSJames Wright // Register backend
61bd882c8aSJames Wright //------------------------------------------------------------------------------
62bd882c8aSJames Wright CEED_INTERN int CeedRegister_Sycl_Shared(void) {
63bd882c8aSJames Wright   CeedCallBackend(CeedRegister("/gpu/sycl/shared", CeedInit_Sycl_shared, 25));
64bd882c8aSJames Wright   CeedCallBackend(CeedRegister("/cpu/sycl/shared", CeedInit_Sycl_shared, 35));
65bd882c8aSJames Wright   return CEED_ERROR_SUCCESS;
66bd882c8aSJames Wright }
67bd882c8aSJames Wright //------------------------------------------------------------------------------
68