Skip to content

Commit 8da1e4a

Browse files
authored
Merge pull request #1856 from CEED/zach/remove-op-fallback-parent
ceed - replace usage of `ceed->op_fallback_parent` with `ceed->parent`
2 parents 66c2c38 + 8a3c90c commit 8da1e4a

File tree

7 files changed

+27
-92
lines changed

7 files changed

+27
-92
lines changed

backends/cuda-gen/ceed-cuda-gen.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
//------------------------------------------------------------------------------
1919
static int CeedInit_Cuda_gen(const char *resource, Ceed ceed) {
2020
char *resource_root;
21-
Ceed ceed_shared;
21+
Ceed ceed_shared, ceed_ref;
2222
Ceed_Cuda *data;
2323

2424
CeedCallBackend(CeedGetResourceRoot(ceed, resource, ":", &resource_root));
@@ -34,7 +34,9 @@ static int CeedInit_Cuda_gen(const char *resource, Ceed ceed) {
3434
CeedCallBackend(CeedSetDelegate(ceed, ceed_shared));
3535
CeedCallBackend(CeedDestroy(&ceed_shared));
3636

37-
CeedCallBackend(CeedSetOperatorFallbackResource(ceed, "/gpu/cuda/ref"));
37+
CeedCallBackend(CeedInit("/gpu/cuda/ref", &ceed_ref));
38+
CeedCallBackend(CeedSetOperatorFallbackCeed(ceed, ceed_ref));
39+
CeedCallBackend(CeedDestroy(&ceed_ref));
3840

3941
CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "QFunctionCreate", CeedQFunctionCreate_Cuda_gen));
4042
CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "OperatorCreate", CeedOperatorCreate_Cuda_gen));

backends/hip-gen/ceed-hip-gen.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
//------------------------------------------------------------------------------
1919
static int CeedInit_Hip_gen(const char *resource, Ceed ceed) {
2020
char *resource_root;
21-
Ceed ceed_shared;
21+
Ceed ceed_shared, ceed_ref;
2222
Ceed_Hip *data;
2323

2424
CeedCallBackend(CeedGetResourceRoot(ceed, resource, ":", &resource_root));
@@ -34,7 +34,9 @@ static int CeedInit_Hip_gen(const char *resource, Ceed ceed) {
3434
CeedCallBackend(CeedSetDelegate(ceed, ceed_shared));
3535
CeedCallBackend(CeedDestroy(&ceed_shared));
3636

37-
CeedCallBackend(CeedSetOperatorFallbackResource(ceed, "/gpu/hip/ref"));
37+
CeedCallBackend(CeedInit("/gpu/hip/ref", &ceed_ref));
38+
CeedCallBackend(CeedSetOperatorFallbackCeed(ceed, ceed_ref));
39+
CeedCallBackend(CeedDestroy(&ceed_ref));
3840

3941
CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "QFunctionCreate", CeedQFunctionCreate_Hip_gen));
4042
CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "OperatorCreate", CeedOperatorCreate_Hip_gen));

backends/sycl-gen/ceed-sycl-gen.sycl.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
// Backend init
1919
//------------------------------------------------------------------------------
2020
static int CeedInit_Sycl_gen(const char *resource, Ceed ceed) {
21-
Ceed ceed_shared;
21+
Ceed ceed_shared, ceed_ref;
2222
Ceed_Sycl *data;
2323
char *resource_root;
2424

@@ -36,12 +36,10 @@ static int CeedInit_Sycl_gen(const char *resource, Ceed ceed) {
3636
CeedCallBackend(CeedSetStream_Sycl(ceed_shared, &(data->sycl_queue)));
3737
CeedCallBackend(CeedDestroy(&ceed_shared));
3838

39-
CeedCallBackend(CeedSetOperatorFallbackResource(ceed, "/gpu/sycl/ref"));
40-
41-
Ceed ceed_fallback = NULL;
42-
CeedCallBackend(CeedGetOperatorFallbackCeed(ceed, &ceed_fallback));
43-
CeedCallBackend(CeedSetStream_Sycl(ceed_fallback, &(data->sycl_queue)));
44-
CeedCallBackend(CeedDestroy(&ceed_fallback));
39+
CeedCallBackend(CeedInit("/gpu/sycl/ref", &ceed_ref));
40+
CeedCallBackend(CeedSetOperatorFallbackCeed(ceed, ceed_ref));
41+
CeedCallBackend(CeedSetStream_Sycl(ceed_ref, &(data->sycl_queue)));
42+
CeedCallBackend(CeedDestroy(&ceed_ref));
4543

4644
CeedCallBackend(CeedSetBackendFunctionCpp(ceed, "Ceed", ceed, "QFunctionCreate", CeedQFunctionCreate_Sycl_gen));
4745
CeedCallBackend(CeedSetBackendFunctionCpp(ceed, "Ceed", ceed, "OperatorCreate", CeedOperatorCreate_Sycl_gen));

doc/sphinx/source/libCEEDdev.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ There are three mechanisms by which a Ceed backend can inherit implementations f
3232
This delegate {ref}`Ceed` will only provide the implementation of that specific libCeed object for the parent backend.
3333
Object delegation has higher precedence than delegation.
3434

35-
3. Operator fallback - Developers may use {c:func}`CeedSetOperatorFallbackResource` to set a string identifying which {ref}`Ceed` backend will be instantiated to provide any unimplemented {ref}`CeedOperator` methods that support preconditioning, such as {c:func}`CeedOperatorLinearAssemble`.
35+
3. Operator fallback - Developers may use {c:func}`CeedSetOperatorFallbackCeed` to set a {ref}`Ceed` object to provide any unimplemented {ref}`CeedOperator` methods that support preconditioning, such as {c:func}`CeedOperatorLinearAssemble`.
3636
The parent backend must implement the basic {ref}`CeedOperator` functionality.
37-
This fallback {ref}`Ceed` object will only be created if a method is called that is not implemented by the parent backend.
37+
Like the delegates above, this fallback {ref}`Ceed` object should be created and set in the backend `CeedInit` function.
3838
In order to use operator fallback, the parent backend and fallback backend must use compatible E-vector and Q-vector layouts.
3939
For example, `/gpu/cuda/gen` falls back to `/gpu/cuda/ref` for missing {ref}`CeedOperator` preconditioning support methods.
40-
If an unimplemented method is called, then the parent `/gpu/cuda/gen` {ref}`Ceed` object creates a fallback `/gpu/cuda/ref` {ref}`Ceed` object and creates a clone of the {ref}`CeedOperator` with this fallback {ref}`Ceed` object.
40+
If an unimplemented method is called, then the parent `/gpu/cuda/gen` {ref}`Ceed` object uses its fallback `/gpu/cuda/ref` {ref}`Ceed` object to create a clone of the {ref}`CeedOperator`.
4141
This clone {ref}`CeedOperator` is then used for the unimplemented preconditioning support methods.
4242

4343
## Backend Families

include/ceed-impl.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ struct Ceed_private {
9696
Ceed parent;
9797
ObjDelegate *obj_delegates;
9898
int obj_delegate_count;
99-
Ceed op_fallback_ceed, op_fallback_parent;
100-
const char *op_fallback_resource;
99+
Ceed op_fallback_ceed;
101100
char **jit_source_roots;
102101
CeedInt num_jit_source_roots, max_jit_source_roots, num_jit_source_roots_readers;
103102
char **jit_defines;
@@ -126,7 +125,6 @@ struct Ceed_private {
126125
int ref_count;
127126
void *data;
128127
bool is_debug;
129-
bool has_valid_op_fallback_resource;
130128
bool is_deterministic;
131129
char err_msg[CEED_MAX_RESOURCE_LEN];
132130
FOffset *f_offsets;

include/ceed/backend.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,8 @@ CEED_EXTERN int CeedGetDelegate(Ceed ceed, Ceed *delegate);
246246
CEED_EXTERN int CeedSetDelegate(Ceed ceed, Ceed delegate);
247247
CEED_EXTERN int CeedGetObjectDelegate(Ceed ceed, Ceed *delegate, const char *obj_name);
248248
CEED_EXTERN int CeedSetObjectDelegate(Ceed ceed, Ceed delegate, const char *obj_name);
249-
CEED_EXTERN int CeedGetOperatorFallbackResource(Ceed ceed, const char **resource);
250249
CEED_EXTERN int CeedGetOperatorFallbackCeed(Ceed ceed, Ceed *fallback_ceed);
251-
CEED_EXTERN int CeedSetOperatorFallbackResource(Ceed ceed, const char *resource);
250+
CEED_EXTERN int CeedSetOperatorFallbackCeed(Ceed ceed, Ceed fallback_ceed);
252251
CEED_EXTERN int CeedSetDeterministic(Ceed ceed, bool is_deterministic);
253252
CEED_EXTERN int CeedSetBackendFunctionImpl(Ceed ceed, const char *type, void *object, const char *func_name, void (*f)(void));
254253
CEED_EXTERN int CeedGetData(Ceed ceed, void *data);

interface/ceed.c

Lines changed: 9 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -623,21 +623,6 @@ int CeedSetObjectDelegate(Ceed ceed, Ceed delegate, const char *obj_name) {
623623
return CEED_ERROR_SUCCESS;
624624
}
625625

626-
/**
627-
@brief Get the fallback resource for `CeedOperator`
628-
629-
@param[in] ceed `Ceed` context
630-
@param[out] resource Variable to store fallback resource
631-
632-
@return An error code: 0 - success, otherwise - failure
633-
634-
@ref Backend
635-
**/
636-
int CeedGetOperatorFallbackResource(Ceed ceed, const char **resource) {
637-
*resource = (const char *)ceed->op_fallback_resource;
638-
return CEED_ERROR_SUCCESS;
639-
}
640-
641626
/**
642627
@brief Get the fallback `Ceed` for `CeedOperator`
643628
@@ -649,72 +634,32 @@ int CeedGetOperatorFallbackResource(Ceed ceed, const char **resource) {
649634
@ref Backend
650635
**/
651636
int CeedGetOperatorFallbackCeed(Ceed ceed, Ceed *fallback_ceed) {
652-
if (ceed->has_valid_op_fallback_resource) {
637+
if (ceed->op_fallback_ceed) {
653638
CeedDebug256(ceed, CEED_DEBUG_COLOR_SUCCESS, "---------- Ceed Fallback ----------\n");
654-
CeedDebug(ceed, "Falling back from Ceed with backend %s at address %p to Ceed with backend %s", ceed->resource, ceed, ceed->op_fallback_resource);
639+
CeedDebug(ceed, "Falling back from Ceed with backend %s at address %p to Ceed with backend %s at address %p", ceed->resource, ceed,
640+
ceed->op_fallback_ceed->resource, ceed->op_fallback_ceed);
655641
}
656642

657-
// Create fallback Ceed if uninitialized
658-
if (!ceed->op_fallback_ceed && ceed->has_valid_op_fallback_resource) {
659-
CeedDebug(ceed, "Creating fallback Ceed");
660-
661-
Ceed fallback_ceed;
662-
const char *fallback_resource;
663-
664-
CeedCall(CeedGetOperatorFallbackResource(ceed, &fallback_resource));
665-
CeedCall(CeedInit(fallback_resource, &fallback_ceed));
666-
fallback_ceed->op_fallback_parent = ceed;
667-
fallback_ceed->Error = ceed->Error;
668-
ceed->op_fallback_ceed = fallback_ceed;
669-
{
670-
const char **jit_source_roots;
671-
CeedInt num_jit_source_roots = 0;
672-
673-
CeedCall(CeedGetJitSourceRoots(ceed, &num_jit_source_roots, &jit_source_roots));
674-
for (CeedInt i = 0; i < num_jit_source_roots; i++) {
675-
CeedCall(CeedAddJitSourceRoot(fallback_ceed, jit_source_roots[i]));
676-
}
677-
CeedCall(CeedRestoreJitSourceRoots(ceed, &jit_source_roots));
678-
}
679-
{
680-
const char **jit_defines;
681-
CeedInt num_jit_defines = 0;
682-
683-
CeedCall(CeedGetJitDefines(ceed, &num_jit_defines, &jit_defines));
684-
for (CeedInt i = 0; i < num_jit_defines; i++) {
685-
CeedCall(CeedAddJitSourceRoot(fallback_ceed, jit_defines[i]));
686-
}
687-
CeedCall(CeedRestoreJitDefines(ceed, &jit_defines));
688-
}
689-
}
690643
*fallback_ceed = NULL;
691-
CeedDebug(ceed, "Fallback Ceed with backend %s at address %p\n", ceed->op_fallback_resource, ceed->op_fallback_ceed);
692644
if (ceed->op_fallback_ceed) CeedCall(CeedReferenceCopy(ceed->op_fallback_ceed, fallback_ceed));
693645
return CEED_ERROR_SUCCESS;
694646
}
695647

696648
/**
697649
@brief Set the fallback resource for `CeedOperator`.
698650
699-
The current resource, if any, is freed by calling this function.
700-
This string is freed upon the destruction of the `Ceed` context.
651+
The current fallback, if any, is freed by calling this function.
701652
702-
@param[in,out] ceed `Ceed` context
703-
@param[in] resource Fallback resource to set
653+
@param[in,out] ceed `Ceed` context
654+
@param[in] fallback_ceed `Ceed` context to create fallback operators
704655
705656
@return An error code: 0 - success, otherwise - failure
706657
707658
@ref Backend
708659
**/
709-
int CeedSetOperatorFallbackResource(Ceed ceed, const char *resource) {
710-
// Free old
711-
CeedCall(CeedFree(&ceed->op_fallback_resource));
712-
713-
// Set new
714-
CeedCall(CeedStringAllocCopy(resource, (char **)&ceed->op_fallback_resource));
715-
716-
// Check validity
717-
ceed->has_valid_op_fallback_resource = ceed->op_fallback_resource && ceed->resource && strcmp(ceed->op_fallback_resource, ceed->resource);
660+
int CeedSetOperatorFallbackCeed(Ceed ceed, Ceed fallback_ceed) {
661+
CeedCall(CeedReferenceCopy(fallback_ceed, &ceed->op_fallback_ceed));
662+
fallback_ceed->parent = ceed;
718663
return CEED_ERROR_SUCCESS;
719664
}
720665

@@ -1323,10 +1268,6 @@ int CeedInit(const char *resource, Ceed *ceed) {
13231268
CeedCall(CeedCalloc(sizeof(f_offsets), &(*ceed)->f_offsets));
13241269
memcpy((*ceed)->f_offsets, f_offsets, sizeof(f_offsets));
13251270

1326-
// Set fallback for advanced CeedOperator functions
1327-
const char fallback_resource[] = "";
1328-
CeedCall(CeedSetOperatorFallbackResource(*ceed, fallback_resource));
1329-
13301271
// Record env variables CEED_DEBUG or DBG
13311272
(*ceed)->is_debug = getenv("CEED_DEBUG") || getenv("DEBUG") || getenv("DBG");
13321273

@@ -1575,7 +1516,6 @@ int CeedDestroy(Ceed *ceed) {
15751516
CeedCall(CeedFree(&(*ceed)->f_offsets));
15761517
CeedCall(CeedFree(&(*ceed)->resource));
15771518
CeedCall(CeedDestroy(&(*ceed)->op_fallback_ceed));
1578-
CeedCall(CeedFree(&(*ceed)->op_fallback_resource));
15791519
CeedCall(CeedWorkVectorsDestroy(*ceed));
15801520
CeedCall(CeedFree(ceed));
15811521
return CEED_ERROR_SUCCESS;
@@ -1584,7 +1524,6 @@ int CeedDestroy(Ceed *ceed) {
15841524
// LCOV_EXCL_START
15851525
const char *CeedErrorFormat(Ceed ceed, const char *format, va_list *args) {
15861526
if (ceed->parent) return CeedErrorFormat(ceed->parent, format, args);
1587-
if (ceed->op_fallback_parent) return CeedErrorFormat(ceed->op_fallback_parent, format, args);
15881527
// Using pointer to va_list for better FFI, but clang-tidy can't verify va_list is initalized
15891528
vsnprintf(ceed->err_msg, CEED_MAX_RESOURCE_LEN, format, *args); // NOLINT
15901529
return ceed->err_msg;
@@ -1648,7 +1587,6 @@ int CeedErrorReturn(Ceed ceed, const char *filename, int line_no, const char *fu
16481587
// LCOV_EXCL_START
16491588
int CeedErrorStore(Ceed ceed, const char *filename, int line_no, const char *func, int err_code, const char *format, va_list *args) {
16501589
if (ceed->parent) return CeedErrorStore(ceed->parent, filename, line_no, func, err_code, format, args);
1651-
if (ceed->op_fallback_parent) return CeedErrorStore(ceed->op_fallback_parent, filename, line_no, func, err_code, format, args);
16521590

16531591
// Build message
16541592
int len = snprintf(ceed->err_msg, CEED_MAX_RESOURCE_LEN, "%s:%d in %s(): ", filename, line_no, func);
@@ -1728,7 +1666,6 @@ int CeedSetErrorHandler(Ceed ceed, CeedErrorHandler handler) {
17281666
**/
17291667
int CeedGetErrorMessage(Ceed ceed, const char **err_msg) {
17301668
if (ceed->parent) return CeedGetErrorMessage(ceed->parent, err_msg);
1731-
if (ceed->op_fallback_parent) return CeedGetErrorMessage(ceed->op_fallback_parent, err_msg);
17321669
*err_msg = ceed->err_msg;
17331670
return CEED_ERROR_SUCCESS;
17341671
}
@@ -1747,7 +1684,6 @@ int CeedGetErrorMessage(Ceed ceed, const char **err_msg) {
17471684
**/
17481685
int CeedResetErrorMessage(Ceed ceed, const char **err_msg) {
17491686
if (ceed->parent) return CeedResetErrorMessage(ceed->parent, err_msg);
1750-
if (ceed->op_fallback_parent) return CeedResetErrorMessage(ceed->op_fallback_parent, err_msg);
17511687
*err_msg = NULL;
17521688
memcpy(ceed->err_msg, "No error message stored", 24);
17531689
return CEED_ERROR_SUCCESS;

0 commit comments

Comments
 (0)