xref: /libCEED/rust/libceed-sys/c-src/backends/sycl-shared/ceed-sycl-shared.sycl.cpp (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 #include "ceed-sycl-shared.hpp"
9*bd882c8aSJames Wright 
10*bd882c8aSJames Wright #include <ceed/backend.h>
11*bd882c8aSJames Wright #include <ceed/ceed.h>
12*bd882c8aSJames Wright 
13*bd882c8aSJames Wright #include <sstream>
14*bd882c8aSJames Wright #include <string>
15*bd882c8aSJames Wright #include <string_view>
16*bd882c8aSJames Wright 
17*bd882c8aSJames Wright //------------------------------------------------------------------------------
18*bd882c8aSJames Wright // Backend init
19*bd882c8aSJames Wright //------------------------------------------------------------------------------
20*bd882c8aSJames Wright static int CeedInit_Sycl_shared(const char *resource, Ceed ceed) {
21*bd882c8aSJames Wright   char *resource_root;
22*bd882c8aSJames Wright   CeedCallBackend(CeedSyclGetResourceRoot(ceed, resource, &resource_root));
23*bd882c8aSJames Wright   CeedCheck(!std::strcmp(resource_root, "/gpu/sycl/shared") || !std::strcmp(resource_root, "/cpu/sycl/shared"), ceed, CEED_ERROR_BACKEND,
24*bd882c8aSJames Wright             "Sycl backend cannot use resource: %s", resource);
25*bd882c8aSJames Wright   std::string_view root_view = resource_root;
26*bd882c8aSJames Wright 
27*bd882c8aSJames Wright   auto suffix_length = root_view.size() - root_view.rfind("shared");
28*bd882c8aSJames Wright   root_view.remove_suffix(suffix_length);
29*bd882c8aSJames Wright 
30*bd882c8aSJames Wright   std::ostringstream ref_resource;
31*bd882c8aSJames Wright   ref_resource << root_view << "ref";
32*bd882c8aSJames Wright 
33*bd882c8aSJames Wright   CeedCallBackend(CeedFree(&resource_root));
34*bd882c8aSJames Wright   CeedCallBackend(CeedSetDeterministic(ceed, true));
35*bd882c8aSJames Wright 
36*bd882c8aSJames Wright   Ceed_Sycl *data;
37*bd882c8aSJames Wright   CeedCallBackend(CeedCalloc(1, &data));
38*bd882c8aSJames Wright   CeedCallBackend(CeedSetData(ceed, data));
39*bd882c8aSJames Wright   CeedCallBackend(CeedSyclInit(ceed, resource));
40*bd882c8aSJames Wright 
41*bd882c8aSJames Wright   Ceed ceed_ref;
42*bd882c8aSJames Wright   CeedCallBackend(CeedInit(ref_resource.str().c_str(), &ceed_ref));
43*bd882c8aSJames Wright 
44*bd882c8aSJames Wright   Ceed_Sycl *ref_data;
45*bd882c8aSJames Wright   CeedCallBackend(CeedGetData(ceed_ref, &ref_data));
46*bd882c8aSJames Wright 
47*bd882c8aSJames Wright   // Need to use the same queue everywhere for correct synchronization
48*bd882c8aSJames Wright   ref_data->sycl_queue   = data->sycl_queue;
49*bd882c8aSJames Wright   ref_data->sycl_context = data->sycl_context;
50*bd882c8aSJames Wright   ref_data->sycl_device  = data->sycl_device;
51*bd882c8aSJames Wright 
52*bd882c8aSJames Wright   CeedCallBackend(CeedSetDelegate(ceed, ceed_ref));
53*bd882c8aSJames Wright 
54*bd882c8aSJames Wright   CeedCallBackend(CeedSetBackendFunctionCpp(ceed, "Ceed", ceed, "BasisCreateTensorH1", CeedBasisCreateTensorH1_Sycl_shared));
55*bd882c8aSJames Wright   CeedCallBackend(CeedSetBackendFunctionCpp(ceed, "Ceed", ceed, "Destroy", CeedDestroy_Sycl));
56*bd882c8aSJames Wright   return CEED_ERROR_SUCCESS;
57*bd882c8aSJames Wright }
58*bd882c8aSJames Wright 
59*bd882c8aSJames Wright //------------------------------------------------------------------------------
60*bd882c8aSJames Wright // Register backend
61*bd882c8aSJames Wright //------------------------------------------------------------------------------
62*bd882c8aSJames Wright CEED_INTERN int CeedRegister_Sycl_Shared(void) {
63*bd882c8aSJames Wright   CeedCallBackend(CeedRegister("/gpu/sycl/shared", CeedInit_Sycl_shared, 25));
64*bd882c8aSJames Wright   CeedCallBackend(CeedRegister("/cpu/sycl/shared", CeedInit_Sycl_shared, 35));
65*bd882c8aSJames Wright   return CEED_ERROR_SUCCESS;
66*bd882c8aSJames Wright }
67*bd882c8aSJames Wright //------------------------------------------------------------------------------
68