1*5aed82e4SJeremy L Thompson // Copyright (c) 2017-2024, Lawrence Livermore National Security, LLC and other CEED contributors. 23d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 30d0321e0SJeremy L Thompson // 43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 50d0321e0SJeremy L Thompson // 63d8e8822SJeremy L Thompson // This file is part of CEED: http://github.com/ceed 70d0321e0SJeremy L Thompson 849aac155SJeremy L Thompson #include <ceed.h> 90d0321e0SJeremy L Thompson #include <ceed/backend.h> 1049aac155SJeremy L Thompson #include <stdbool.h> 110d0321e0SJeremy L Thompson #include <string.h> 12c85e8640SSebastian Grimberg #include <hip/hip_runtime.h> 132b730f8bSJeremy L Thompson 1449aac155SJeremy L Thompson #include "../hip/ceed-hip-common.h" 150d0321e0SJeremy L Thompson #include "ceed-hip-ref.h" 160d0321e0SJeremy L Thompson 170d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 180d0321e0SJeremy L Thompson // Sync host to device 190d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 202b730f8bSJeremy L Thompson static inline int CeedQFunctionContextSyncH2D_Hip(const CeedQFunctionContext ctx) { 210d0321e0SJeremy L Thompson Ceed ceed; 22b7453713SJeremy L Thompson size_t ctx_size; 230d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 24b7453713SJeremy L Thompson 25b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetCeed(ctx, &ceed)); 262b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 270d0321e0SJeremy L Thompson 286574a04fSJeremy L Thompson CeedCheck(impl->h_data, ceed, CEED_ERROR_BACKEND, "No valid host data to sync to device"); 290d0321e0SJeremy L Thompson 30b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetContextSize(ctx, &ctx_size)); 310d0321e0SJeremy L Thompson if (impl->d_data_borrowed) { 320d0321e0SJeremy L Thompson impl->d_data = impl->d_data_borrowed; 330d0321e0SJeremy L Thompson } else if (impl->d_data_owned) { 340d0321e0SJeremy L Thompson impl->d_data = impl->d_data_owned; 350d0321e0SJeremy L Thompson } else { 36b7453713SJeremy L Thompson CeedCallHip(ceed, hipMalloc((void **)&impl->d_data_owned, ctx_size)); 370d0321e0SJeremy L Thompson impl->d_data = impl->d_data_owned; 380d0321e0SJeremy L Thompson } 39b7453713SJeremy L Thompson CeedCallHip(ceed, hipMemcpy(impl->d_data, impl->h_data, ctx_size, hipMemcpyHostToDevice)); 400d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 410d0321e0SJeremy L Thompson } 420d0321e0SJeremy L Thompson 430d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 440d0321e0SJeremy L Thompson // Sync device to host 450d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 462b730f8bSJeremy L Thompson static inline int CeedQFunctionContextSyncD2H_Hip(const CeedQFunctionContext ctx) { 470d0321e0SJeremy L Thompson Ceed ceed; 48b7453713SJeremy L Thompson size_t ctx_size; 490d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 50b7453713SJeremy L Thompson 51b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetCeed(ctx, &ceed)); 522b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 530d0321e0SJeremy L Thompson 546574a04fSJeremy L Thompson CeedCheck(impl->d_data, ceed, CEED_ERROR_BACKEND, "No valid device data to sync to host"); 550d0321e0SJeremy L Thompson 56b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetContextSize(ctx, &ctx_size)); 570d0321e0SJeremy L Thompson if (impl->h_data_borrowed) { 580d0321e0SJeremy L Thompson impl->h_data = impl->h_data_borrowed; 590d0321e0SJeremy L Thompson } else if (impl->h_data_owned) { 600d0321e0SJeremy L Thompson impl->h_data = impl->h_data_owned; 610d0321e0SJeremy L Thompson } else { 62b7453713SJeremy L Thompson CeedCallBackend(CeedMallocArray(1, ctx_size, &impl->h_data_owned)); 630d0321e0SJeremy L Thompson impl->h_data = impl->h_data_owned; 640d0321e0SJeremy L Thompson } 65b7453713SJeremy L Thompson CeedCallHip(ceed, hipMemcpy(impl->h_data, impl->d_data, ctx_size, hipMemcpyDeviceToHost)); 660d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 670d0321e0SJeremy L Thompson } 680d0321e0SJeremy L Thompson 690d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 700d0321e0SJeremy L Thompson // Sync data of type 710d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 722b730f8bSJeremy L Thompson static inline int CeedQFunctionContextSync_Hip(const CeedQFunctionContext ctx, CeedMemType mem_type) { 7343c928f4SJeremy L Thompson switch (mem_type) { 742b730f8bSJeremy L Thompson case CEED_MEM_HOST: 752b730f8bSJeremy L Thompson return CeedQFunctionContextSyncD2H_Hip(ctx); 762b730f8bSJeremy L Thompson case CEED_MEM_DEVICE: 772b730f8bSJeremy L Thompson return CeedQFunctionContextSyncH2D_Hip(ctx); 780d0321e0SJeremy L Thompson } 790d0321e0SJeremy L Thompson return CEED_ERROR_UNSUPPORTED; 800d0321e0SJeremy L Thompson } 810d0321e0SJeremy L Thompson 820d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 830d0321e0SJeremy L Thompson // Set all pointers as invalid 840d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 852b730f8bSJeremy L Thompson static inline int CeedQFunctionContextSetAllInvalid_Hip(const CeedQFunctionContext ctx) { 860d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 870d0321e0SJeremy L Thompson 88b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 890d0321e0SJeremy L Thompson impl->h_data = NULL; 900d0321e0SJeremy L Thompson impl->d_data = NULL; 910d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 920d0321e0SJeremy L Thompson } 930d0321e0SJeremy L Thompson 940d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 950d0321e0SJeremy L Thompson // Check for valid data 960d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 972b730f8bSJeremy L Thompson static inline int CeedQFunctionContextHasValidData_Hip(const CeedQFunctionContext ctx, bool *has_valid_data) { 980d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 99b7453713SJeremy L Thompson 1002b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 1011c66c397SJeremy L Thompson *has_valid_data = impl && (impl->h_data || impl->d_data); 1020d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1030d0321e0SJeremy L Thompson } 1040d0321e0SJeremy L Thompson 1050d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 1060d0321e0SJeremy L Thompson // Check if ctx has borrowed data 1070d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 1082b730f8bSJeremy L Thompson static inline int CeedQFunctionContextHasBorrowedDataOfType_Hip(const CeedQFunctionContext ctx, CeedMemType mem_type, 1090d0321e0SJeremy L Thompson bool *has_borrowed_data_of_type) { 1100d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 1110d0321e0SJeremy L Thompson 112b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 11343c928f4SJeremy L Thompson switch (mem_type) { 1140d0321e0SJeremy L Thompson case CEED_MEM_HOST: 1151c66c397SJeremy L Thompson *has_borrowed_data_of_type = impl->h_data_borrowed; 1160d0321e0SJeremy L Thompson break; 1170d0321e0SJeremy L Thompson case CEED_MEM_DEVICE: 1181c66c397SJeremy L Thompson *has_borrowed_data_of_type = impl->d_data_borrowed; 1190d0321e0SJeremy L Thompson break; 1200d0321e0SJeremy L Thompson } 1210d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1220d0321e0SJeremy L Thompson } 1230d0321e0SJeremy L Thompson 1240d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 1250d0321e0SJeremy L Thompson // Check if data of given type needs sync 1260d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 1272b730f8bSJeremy L Thompson static inline int CeedQFunctionContextNeedSync_Hip(const CeedQFunctionContext ctx, CeedMemType mem_type, bool *need_sync) { 1280d0321e0SJeremy L Thompson bool has_valid_data = true; 129b7453713SJeremy L Thompson CeedQFunctionContext_Hip *impl; 130b7453713SJeremy L Thompson 131b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 1322b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextHasValidData_Hip(ctx, &has_valid_data)); 13343c928f4SJeremy L Thompson switch (mem_type) { 1340d0321e0SJeremy L Thompson case CEED_MEM_HOST: 1350d0321e0SJeremy L Thompson *need_sync = has_valid_data && !impl->h_data; 1360d0321e0SJeremy L Thompson break; 1370d0321e0SJeremy L Thompson case CEED_MEM_DEVICE: 1380d0321e0SJeremy L Thompson *need_sync = has_valid_data && !impl->d_data; 1390d0321e0SJeremy L Thompson break; 1400d0321e0SJeremy L Thompson } 1410d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1420d0321e0SJeremy L Thompson } 1430d0321e0SJeremy L Thompson 1440d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 1450d0321e0SJeremy L Thompson // Set data from host 1460d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 1472b730f8bSJeremy L Thompson static int CeedQFunctionContextSetDataHost_Hip(const CeedQFunctionContext ctx, const CeedCopyMode copy_mode, void *data) { 1480d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 1490d0321e0SJeremy L Thompson 150b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 1512b730f8bSJeremy L Thompson CeedCallBackend(CeedFree(&impl->h_data_owned)); 15243c928f4SJeremy L Thompson switch (copy_mode) { 1530d0321e0SJeremy L Thompson case CEED_COPY_VALUES: { 154b7453713SJeremy L Thompson size_t ctx_size; 155b7453713SJeremy L Thompson 156b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetContextSize(ctx, &ctx_size)); 157b7453713SJeremy L Thompson CeedCallBackend(CeedMallocArray(1, ctx_size, &impl->h_data_owned)); 1580d0321e0SJeremy L Thompson impl->h_data_borrowed = NULL; 1590d0321e0SJeremy L Thompson impl->h_data = impl->h_data_owned; 160b7453713SJeremy L Thompson memcpy(impl->h_data, data, ctx_size); 1610d0321e0SJeremy L Thompson } break; 1620d0321e0SJeremy L Thompson case CEED_OWN_POINTER: 1630d0321e0SJeremy L Thompson impl->h_data_owned = data; 1640d0321e0SJeremy L Thompson impl->h_data_borrowed = NULL; 1650d0321e0SJeremy L Thompson impl->h_data = data; 1660d0321e0SJeremy L Thompson break; 1670d0321e0SJeremy L Thompson case CEED_USE_POINTER: 1680d0321e0SJeremy L Thompson impl->h_data_borrowed = data; 1690d0321e0SJeremy L Thompson impl->h_data = data; 1700d0321e0SJeremy L Thompson break; 1710d0321e0SJeremy L Thompson } 1720d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1730d0321e0SJeremy L Thompson } 1740d0321e0SJeremy L Thompson 1750d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 1760d0321e0SJeremy L Thompson // Set data from device 1770d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 1782b730f8bSJeremy L Thompson static int CeedQFunctionContextSetDataDevice_Hip(const CeedQFunctionContext ctx, const CeedCopyMode copy_mode, void *data) { 1790d0321e0SJeremy L Thompson Ceed ceed; 1800d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 181b7453713SJeremy L Thompson 182b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetCeed(ctx, &ceed)); 1832b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 1840d0321e0SJeremy L Thompson 1852b730f8bSJeremy L Thompson CeedCallHip(ceed, hipFree(impl->d_data_owned)); 1860d0321e0SJeremy L Thompson impl->d_data_owned = NULL; 18743c928f4SJeremy L Thompson switch (copy_mode) { 188539ec17dSJeremy L Thompson case CEED_COPY_VALUES: { 189b7453713SJeremy L Thompson size_t ctx_size; 190b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetContextSize(ctx, &ctx_size)); 191b7453713SJeremy L Thompson CeedCallHip(ceed, hipMalloc((void **)&impl->d_data_owned, ctx_size)); 1920d0321e0SJeremy L Thompson impl->d_data_borrowed = NULL; 1930d0321e0SJeremy L Thompson impl->d_data = impl->d_data_owned; 194b7453713SJeremy L Thompson CeedCallHip(ceed, hipMemcpy(impl->d_data, data, ctx_size, hipMemcpyDeviceToDevice)); 195539ec17dSJeremy L Thompson } break; 1960d0321e0SJeremy L Thompson case CEED_OWN_POINTER: 1970d0321e0SJeremy L Thompson impl->d_data_owned = data; 1980d0321e0SJeremy L Thompson impl->d_data_borrowed = NULL; 1990d0321e0SJeremy L Thompson impl->d_data = data; 2000d0321e0SJeremy L Thompson break; 2010d0321e0SJeremy L Thompson case CEED_USE_POINTER: 2020d0321e0SJeremy L Thompson impl->d_data_owned = NULL; 2030d0321e0SJeremy L Thompson impl->d_data_borrowed = data; 2040d0321e0SJeremy L Thompson impl->d_data = data; 2050d0321e0SJeremy L Thompson break; 2060d0321e0SJeremy L Thompson } 2070d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 2080d0321e0SJeremy L Thompson } 2090d0321e0SJeremy L Thompson 2100d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 211b2165e7aSSebastian Grimberg // Set the data used by a user context, 212b2165e7aSSebastian Grimberg // freeing any previously allocated data if applicable 2130d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 2142b730f8bSJeremy L Thompson static int CeedQFunctionContextSetData_Hip(const CeedQFunctionContext ctx, const CeedMemType mem_type, const CeedCopyMode copy_mode, void *data) { 2152b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextSetAllInvalid_Hip(ctx)); 21643c928f4SJeremy L Thompson switch (mem_type) { 2170d0321e0SJeremy L Thompson case CEED_MEM_HOST: 21843c928f4SJeremy L Thompson return CeedQFunctionContextSetDataHost_Hip(ctx, copy_mode, data); 2190d0321e0SJeremy L Thompson case CEED_MEM_DEVICE: 22043c928f4SJeremy L Thompson return CeedQFunctionContextSetDataDevice_Hip(ctx, copy_mode, data); 2210d0321e0SJeremy L Thompson } 2220d0321e0SJeremy L Thompson return CEED_ERROR_UNSUPPORTED; 2230d0321e0SJeremy L Thompson } 2240d0321e0SJeremy L Thompson 2250d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 2260d0321e0SJeremy L Thompson // Take data 2270d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 2282b730f8bSJeremy L Thompson static int CeedQFunctionContextTakeData_Hip(const CeedQFunctionContext ctx, const CeedMemType mem_type, void *data) { 229b7453713SJeremy L Thompson bool need_sync = false; 2300d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 231b7453713SJeremy L Thompson 2322b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 2330d0321e0SJeremy L Thompson 23443c928f4SJeremy L Thompson // Sync data to requested mem_type 2352b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextNeedSync_Hip(ctx, mem_type, &need_sync)); 236b2165e7aSSebastian Grimberg if (need_sync) CeedCallBackend(CeedQFunctionContextSync_Hip(ctx, mem_type)); 2370d0321e0SJeremy L Thompson 2380d0321e0SJeremy L Thompson // Update pointer 23943c928f4SJeremy L Thompson switch (mem_type) { 2400d0321e0SJeremy L Thompson case CEED_MEM_HOST: 2410d0321e0SJeremy L Thompson *(void **)data = impl->h_data_borrowed; 2420d0321e0SJeremy L Thompson impl->h_data_borrowed = NULL; 2430d0321e0SJeremy L Thompson impl->h_data = NULL; 2440d0321e0SJeremy L Thompson break; 2450d0321e0SJeremy L Thompson case CEED_MEM_DEVICE: 2460d0321e0SJeremy L Thompson *(void **)data = impl->d_data_borrowed; 2470d0321e0SJeremy L Thompson impl->d_data_borrowed = NULL; 2480d0321e0SJeremy L Thompson impl->d_data = NULL; 2490d0321e0SJeremy L Thompson break; 2500d0321e0SJeremy L Thompson } 2510d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 2520d0321e0SJeremy L Thompson } 2530d0321e0SJeremy L Thompson 2540d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 25528bfd0b7SJeremy L Thompson // Core logic for GetData. 25628bfd0b7SJeremy L Thompson // If a different memory type is most up to date, this will perform a copy 2570d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 2582b730f8bSJeremy L Thompson static int CeedQFunctionContextGetDataCore_Hip(const CeedQFunctionContext ctx, const CeedMemType mem_type, void *data) { 259b7453713SJeremy L Thompson bool need_sync = false; 2600d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 261b7453713SJeremy L Thompson 2622b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 2630d0321e0SJeremy L Thompson 26443c928f4SJeremy L Thompson // Sync data to requested mem_type 2652b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextNeedSync_Hip(ctx, mem_type, &need_sync)); 2662b730f8bSJeremy L Thompson if (need_sync) CeedCallBackend(CeedQFunctionContextSync_Hip(ctx, mem_type)); 2670d0321e0SJeremy L Thompson 268b2165e7aSSebastian Grimberg // Update pointer 26943c928f4SJeremy L Thompson switch (mem_type) { 2700d0321e0SJeremy L Thompson case CEED_MEM_HOST: 2710d0321e0SJeremy L Thompson *(void **)data = impl->h_data; 2720d0321e0SJeremy L Thompson break; 2730d0321e0SJeremy L Thompson case CEED_MEM_DEVICE: 2740d0321e0SJeremy L Thompson *(void **)data = impl->d_data; 2750d0321e0SJeremy L Thompson break; 2760d0321e0SJeremy L Thompson } 27728bfd0b7SJeremy L Thompson return CEED_ERROR_SUCCESS; 27828bfd0b7SJeremy L Thompson } 27928bfd0b7SJeremy L Thompson 28028bfd0b7SJeremy L Thompson //------------------------------------------------------------------------------ 28128bfd0b7SJeremy L Thompson // Get read-only access to the data 28228bfd0b7SJeremy L Thompson //------------------------------------------------------------------------------ 2832b730f8bSJeremy L Thompson static int CeedQFunctionContextGetDataRead_Hip(const CeedQFunctionContext ctx, const CeedMemType mem_type, void *data) { 28428bfd0b7SJeremy L Thompson return CeedQFunctionContextGetDataCore_Hip(ctx, mem_type, data); 28528bfd0b7SJeremy L Thompson } 28628bfd0b7SJeremy L Thompson 28728bfd0b7SJeremy L Thompson //------------------------------------------------------------------------------ 28828bfd0b7SJeremy L Thompson // Get read/write access to the data 28928bfd0b7SJeremy L Thompson //------------------------------------------------------------------------------ 2902b730f8bSJeremy L Thompson static int CeedQFunctionContextGetData_Hip(const CeedQFunctionContext ctx, const CeedMemType mem_type, void *data) { 29128bfd0b7SJeremy L Thompson CeedQFunctionContext_Hip *impl; 29228bfd0b7SJeremy L Thompson 293b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 2942b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetDataCore_Hip(ctx, mem_type, data)); 29528bfd0b7SJeremy L Thompson 2960d0321e0SJeremy L Thompson // Mark only pointer for requested memory as valid 2972b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextSetAllInvalid_Hip(ctx)); 29843c928f4SJeremy L Thompson switch (mem_type) { 2990d0321e0SJeremy L Thompson case CEED_MEM_HOST: 3000d0321e0SJeremy L Thompson impl->h_data = *(void **)data; 3010d0321e0SJeremy L Thompson break; 3020d0321e0SJeremy L Thompson case CEED_MEM_DEVICE: 3030d0321e0SJeremy L Thompson impl->d_data = *(void **)data; 3040d0321e0SJeremy L Thompson break; 3050d0321e0SJeremy L Thompson } 3060d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 3070d0321e0SJeremy L Thompson } 3080d0321e0SJeremy L Thompson 3090d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 3100d0321e0SJeremy L Thompson // Destroy the user context 3110d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 3120d0321e0SJeremy L Thompson static int CeedQFunctionContextDestroy_Hip(const CeedQFunctionContext ctx) { 3130d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 3140d0321e0SJeremy L Thompson 315b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 3166e536b99SJeremy L Thompson CeedCallHip(CeedQFunctionContextReturnCeed(ctx), hipFree(impl->d_data_owned)); 3172b730f8bSJeremy L Thompson CeedCallBackend(CeedFree(&impl->h_data_owned)); 3182b730f8bSJeremy L Thompson CeedCallBackend(CeedFree(&impl)); 3190d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 3200d0321e0SJeremy L Thompson } 3210d0321e0SJeremy L Thompson 3220d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 3230d0321e0SJeremy L Thompson // QFunctionContext Create 3240d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 3250d0321e0SJeremy L Thompson int CeedQFunctionContextCreate_Hip(CeedQFunctionContext ctx) { 3260d0321e0SJeremy L Thompson CeedQFunctionContext_Hip *impl; 3270d0321e0SJeremy L Thompson Ceed ceed; 3280d0321e0SJeremy L Thompson 329b7453713SJeremy L Thompson CeedCallBackend(CeedQFunctionContextGetCeed(ctx, &ceed)); 3302b730f8bSJeremy L Thompson CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "HasValidData", CeedQFunctionContextHasValidData_Hip)); 3312b730f8bSJeremy L Thompson CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "HasBorrowedDataOfType", CeedQFunctionContextHasBorrowedDataOfType_Hip)); 3322b730f8bSJeremy L Thompson CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "SetData", CeedQFunctionContextSetData_Hip)); 3332b730f8bSJeremy L Thompson CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "TakeData", CeedQFunctionContextTakeData_Hip)); 3342b730f8bSJeremy L Thompson CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "GetData", CeedQFunctionContextGetData_Hip)); 3352b730f8bSJeremy L Thompson CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "GetDataRead", CeedQFunctionContextGetDataRead_Hip)); 3362b730f8bSJeremy L Thompson CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "Destroy", CeedQFunctionContextDestroy_Hip)); 3372b730f8bSJeremy L Thompson CeedCallBackend(CeedCalloc(1, &impl)); 3382b730f8bSJeremy L Thompson CeedCallBackend(CeedQFunctionContextSetBackendData(ctx, impl)); 3390d0321e0SJeremy L Thompson return CEED_ERROR_SUCCESS; 3400d0321e0SJeremy L Thompson } 3412a86cc9dSSebastian Grimberg 3420d0321e0SJeremy L Thompson //------------------------------------------------------------------------------ 343