1*6ca0f394SUmesh Unnikrishnan // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors. 2*6ca0f394SUmesh Unnikrishnan // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 3*6ca0f394SUmesh Unnikrishnan // 4*6ca0f394SUmesh Unnikrishnan // SPDX-License-Identifier: BSD-2-Clause 5*6ca0f394SUmesh Unnikrishnan // 6*6ca0f394SUmesh Unnikrishnan // This file is part of CEED: http://github.com/ceed 7*6ca0f394SUmesh Unnikrishnan 8*6ca0f394SUmesh Unnikrishnan #include <ceed/backend.h> 9*6ca0f394SUmesh Unnikrishnan #include <ceed/ceed.h> 10*6ca0f394SUmesh Unnikrishnan #include <sycl/sycl.hpp> 11*6ca0f394SUmesh Unnikrishnan #include <stdio.h> 12*6ca0f394SUmesh Unnikrishnan #include <string.h> 13*6ca0f394SUmesh Unnikrishnan 14*6ca0f394SUmesh Unnikrishnan #include "ceed-sycl-gen.hpp" 15*6ca0f394SUmesh Unnikrishnan 16*6ca0f394SUmesh Unnikrishnan //------------------------------------------------------------------------------ 17*6ca0f394SUmesh Unnikrishnan // Apply QFunction 18*6ca0f394SUmesh Unnikrishnan //------------------------------------------------------------------------------ 19*6ca0f394SUmesh Unnikrishnan static int CeedQFunctionApply_Sycl_gen(CeedQFunction qf, CeedInt Q, CeedVector *U, CeedVector *V) { 20*6ca0f394SUmesh Unnikrishnan Ceed ceed; 21*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedQFunctionGetCeed(qf, &ceed)); 22*6ca0f394SUmesh Unnikrishnan return CeedError(ceed, CEED_ERROR_BACKEND, "Backend does not implement QFunctionApply"); 23*6ca0f394SUmesh Unnikrishnan } 24*6ca0f394SUmesh Unnikrishnan 25*6ca0f394SUmesh Unnikrishnan //------------------------------------------------------------------------------ 26*6ca0f394SUmesh Unnikrishnan // Destroy QFunction 27*6ca0f394SUmesh Unnikrishnan //------------------------------------------------------------------------------ 28*6ca0f394SUmesh Unnikrishnan static int CeedQFunctionDestroy_Sycl_gen(CeedQFunction qf) { 29*6ca0f394SUmesh Unnikrishnan Ceed ceed; 30*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedQFunctionGetCeed(qf, &ceed)); 31*6ca0f394SUmesh Unnikrishnan CeedQFunction_Sycl_gen *impl; 32*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedQFunctionGetData(qf, &impl)); 33*6ca0f394SUmesh Unnikrishnan Ceed_Sycl *data; 34*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedGetData(ceed, &data)); 35*6ca0f394SUmesh Unnikrishnan 36*6ca0f394SUmesh Unnikrishnan // Wait for all work to finish before freeing memory 37*6ca0f394SUmesh Unnikrishnan CeedCallSycl(ceed, data->sycl_queue.wait_and_throw()); 38*6ca0f394SUmesh Unnikrishnan CeedCallSycl(ceed, sycl::free(impl->d_c, data->sycl_context)); 39*6ca0f394SUmesh Unnikrishnan 40*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedFree(&impl->q_function_source)); 41*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedFree(&impl)); 42*6ca0f394SUmesh Unnikrishnan return CEED_ERROR_SUCCESS; 43*6ca0f394SUmesh Unnikrishnan } 44*6ca0f394SUmesh Unnikrishnan 45*6ca0f394SUmesh Unnikrishnan //------------------------------------------------------------------------------ 46*6ca0f394SUmesh Unnikrishnan // Create QFunction 47*6ca0f394SUmesh Unnikrishnan //------------------------------------------------------------------------------ 48*6ca0f394SUmesh Unnikrishnan int CeedQFunctionCreate_Sycl_gen(CeedQFunction qf) { 49*6ca0f394SUmesh Unnikrishnan Ceed ceed; 50*6ca0f394SUmesh Unnikrishnan CeedQFunctionGetCeed(qf, &ceed); 51*6ca0f394SUmesh Unnikrishnan CeedQFunction_Sycl_gen *impl; 52*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedCalloc(1, &impl)); 53*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedQFunctionSetData(qf, impl)); 54*6ca0f394SUmesh Unnikrishnan 55*6ca0f394SUmesh Unnikrishnan // Read QFunction source 56*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedQFunctionGetKernelName(qf, &impl->q_function_name)); 57*6ca0f394SUmesh Unnikrishnan CeedDebug256(ceed, 2, "----- Loading QFunction User Source -----\n"); 58*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedQFunctionLoadSourceToBuffer(qf, &impl->q_function_source)); 59*6ca0f394SUmesh Unnikrishnan CeedDebug256(ceed, 2, "----- Loading QFunction User Source Complete! -----\n"); 60*6ca0f394SUmesh Unnikrishnan if (!impl->q_function_source) { 61*6ca0f394SUmesh Unnikrishnan // LCOV_EXCL_START 62*6ca0f394SUmesh Unnikrishnan return CeedError(ceed, CEED_ERROR_UNSUPPORTED, "/gpu/sycl/gen backend requires QFunction source code file"); 63*6ca0f394SUmesh Unnikrishnan // LCOV_EXCL_STOP 64*6ca0f394SUmesh Unnikrishnan } 65*6ca0f394SUmesh Unnikrishnan 66*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedSetBackendFunctionCpp(ceed, "QFunction", qf, "Apply", CeedQFunctionApply_Sycl_gen)); 67*6ca0f394SUmesh Unnikrishnan CeedCallBackend(CeedSetBackendFunctionCpp(ceed, "QFunction", qf, "Destroy", CeedQFunctionDestroy_Sycl_gen)); 68*6ca0f394SUmesh Unnikrishnan return CEED_ERROR_SUCCESS; 69*6ca0f394SUmesh Unnikrishnan } 70*6ca0f394SUmesh Unnikrishnan 71*6ca0f394SUmesh Unnikrishnan //------------------------------------------------------------------------------ 72