xref: /libCEED/backends/sycl-shared/ceed-sycl-shared.sycl.cpp (revision dd64fc8452c2d35c954858232143719e6bb2e61d)
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) {
21*dd64fc84SJeremy L Thompson   Ceed       ceed_ref;
22*dd64fc84SJeremy L Thompson   Ceed_Sycl *data, *ref_data;
23bd882c8aSJames Wright   char      *resource_root;
24*dd64fc84SJeremy L Thompson 
25bc246734SJeremy L Thompson   CeedCallBackend(CeedGetResourceRoot(ceed, resource, ":", &resource_root));
26bd882c8aSJames Wright   CeedCheck(!std::strcmp(resource_root, "/gpu/sycl/shared") || !std::strcmp(resource_root, "/cpu/sycl/shared"), ceed, CEED_ERROR_BACKEND,
27bd882c8aSJames Wright             "Sycl backend cannot use resource: %s", resource);
28bd882c8aSJames Wright   std::string_view root_view = resource_root;
29bd882c8aSJames Wright 
30bd882c8aSJames Wright   auto suffix_length = root_view.size() - root_view.rfind("shared");
31bd882c8aSJames Wright   root_view.remove_suffix(suffix_length);
32bd882c8aSJames Wright 
33bd882c8aSJames Wright   std::ostringstream ref_resource;
34bd882c8aSJames Wright   ref_resource << root_view << "ref";
35bd882c8aSJames Wright 
36bd882c8aSJames Wright   CeedCallBackend(CeedFree(&resource_root));
37bd882c8aSJames Wright   CeedCallBackend(CeedSetDeterministic(ceed, true));
38bd882c8aSJames Wright 
39bd882c8aSJames Wright   CeedCallBackend(CeedCalloc(1, &data));
40bd882c8aSJames Wright   CeedCallBackend(CeedSetData(ceed, data));
41eb7e6cafSJeremy L Thompson   CeedCallBackend(CeedInit_Sycl(ceed, resource));
42bd882c8aSJames Wright 
43bd882c8aSJames Wright   CeedCallBackend(CeedInit(ref_resource.str().c_str(), &ceed_ref));
44bd882c8aSJames Wright 
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 }
67ff1e7120SSebastian Grimberg 
68bd882c8aSJames Wright //------------------------------------------------------------------------------
69