diff --git a/.github/workflows/rust-test-with-style.yml b/.github/workflows/rust-test-with-style.yml index f8e9499fe2..80ea4a4dbf 100644 --- a/.github/workflows/rust-test-with-style.yml +++ b/.github/workflows/rust-test-with-style.yml @@ -10,7 +10,7 @@ jobs: test: strategy: matrix: - os: [ubuntu-24.04] + os: [ubuntu-24.04, macos-15] compiler: [clang] runs-on: ${{ matrix.os }} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a907bfb1db..87a3f1f76c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -110,7 +110,7 @@ noether-cpu: - cd .. && export NEK5K_VERSION=Nek5000-19.0 && { [[ -d $NEK5K_VERSION ]] || { git clone --depth 1 --branch v19.0 https://github.com/Nek5000/Nek5000.git $NEK5K_VERSION && cd $NEK5K_VERSION/tools && ./maketools genbox genmap reatore2 && cd ../..; }; } && export NEK5K_DIR=$PWD/$NEK5K_VERSION && export PATH=$NEK5K_DIR/bin:$PATH MPI=0 && cd libCEED - echo "-------------- Nek5000 -------------" && git -C $NEK5K_DIR describe --tags - export NPROC_POOL=1 - - make -k -j$NPROC_CPU BACKENDS="$BACKENDS_CPU" JUNIT_BATCH="cpu" junit search=nek NEK5K_DIR=$NEK5K_DIR + - make -B -k -j$NPROC_CPU BACKENDS="$BACKENDS_CPU" JUNIT_BATCH="cpu" junit search=nek NEK5K_DIR=$NEK5K_DIR # -- deal.II 8bd5c262f13e15793aa206b6eed8774a9b25ce11 - BACKENDS_CPU=$(make info-backends-all | grep -o '/cpu[^ ]*' | tr '\n' ' ') - export DEAL_II_ROOT_DIR=/projects/dealii DEAL_II_DIR=/projects/dealii/install @@ -277,7 +277,7 @@ noether-cuda: - cd .. && export NEK5K_VERSION=Nek5000-19.0 && { [[ -d $NEK5K_VERSION ]] || { git clone --depth 1 --branch v19.0 https://github.com/Nek5000/Nek5000.git $NEK5K_VERSION && cd $NEK5K_VERSION/tools && ./maketools genbox genmap reatore2 && cd ../..; }; } && export NEK5K_DIR=$PWD/$NEK5K_VERSION && export PATH=$NEK5K_DIR/bin:$PATH MPI=0 && cd libCEED - echo "-------------- Nek5000 -------------" && git -C $NEK5K_DIR describe --tags - export NPROC_POOL=1 - - make -k -j$NPROC_GPU BACKENDS="$BACKENDS_GPU" JUNIT_BATCH="cuda" junit search=nek NEK5K_DIR=$NEK5K_DIR + - make -B -k -j$NPROC_GPU BACKENDS="$BACKENDS_GPU" JUNIT_BATCH="cuda" junit search=nek NEK5K_DIR=$NEK5K_DIR # -- deal.II 8bd5c262f13e15793aa206b6eed8774a9b25ce11 - export DEAL_II_ROOT_DIR=/projects/dealii DEAL_II_DIR=/projects/dealii/install - echo "-------------- deal.II -------------" && git -C $DEAL_II_ROOT_DIR -c safe.directory=$DEAL_II_ROOT_DIR describe --always diff --git a/Makefile b/Makefile index 5ecaecd71a..c282491c56 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,9 @@ quiet ?= $($(1)) .PRECIOUS: %/.DIR +DARWIN := $(filter Darwin,$(shell uname -s)) + + # ------------------------------------------------------------ # Root directories for backend dependencies # ------------------------------------------------------------ @@ -72,7 +75,7 @@ ifeq (,$(filter-out undefined default,$(origin AR))) AR = ar endif ifeq (,$(filter-out undefined default,$(origin ARFLAGS))) - ARFLAGS = crD + ARFLAGS = $(if $(DARWIN),cr,crD) endif NVCC ?= $(CUDA_DIR)/bin/nvcc NVCC_CXX ?= $(CXX) @@ -222,7 +225,6 @@ MFLAGS := -j $(NPROCS) --warn-undefined-variables \ PYTHON ?= python3 PROVE ?= prove PROVE_OPTS ?= -j $(NPROCS) -DARWIN := $(filter Darwin,$(shell uname -s)) SO_EXT := $(if $(DARWIN),dylib,so) ceed.pc := $(LIBDIR)/pkgconfig/ceed.pc @@ -486,9 +488,10 @@ MEMCHK_STATUS = Disabled MEMCHK := $(shell echo "$(HASH)include " | $(CC) $(CPPFLAGS) -E - >/dev/null 2>&1 && echo 1) MEMCHK_BACKENDS = /cpu/self/memcheck/serial /cpu/self/memcheck/blocked ifeq ($(MEMCHK),1) - MEMCHK_STATUS = Enabled - libceed.c += $(ceedmemcheck.c) + MEMCHK_STATUS = Enabled + libceed.c += $(ceedmemcheck.c) BACKENDS_MAKE += $(MEMCHK_BACKENDS) + CFLAGS += "-DCEED_USE_MEMCHECK" endif # AVX Backeds @@ -497,9 +500,10 @@ AVX_FLAG := $(if $(filter clang,$(CC_VENDOR)),+avx,-mavx) AVX := $(filter $(AVX_FLAG),$(shell $(CC) $(CFLAGS:-M%=) -v -E -x c /dev/null 2>&1)) AVX_BACKENDS = /cpu/self/avx/serial /cpu/self/avx/blocked ifneq ($(AVX),) - AVX_STATUS = Enabled - libceed.c += $(avx.c) + AVX_STATUS = Enabled + libceed.c += $(avx.c) BACKENDS_MAKE += $(AVX_BACKENDS) + CFLAGS += "-DCEED_USE_AVX" endif # Collect list of libraries and paths for use in linking and pkg-config @@ -522,10 +526,11 @@ ifneq ($(wildcard $(XSMM_DIR)/lib/libxsmm.*),) endif BLAS_LIB ?= $(MKL_LINK) -Wl,--push-state,--no-as-needed -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl -Wl,--pop-state endif - PKG_LIBS += $(BLAS_LIB) + PKG_LIBS += $(BLAS_LIB) libceed.c += $(xsmm.c) $(xsmm.c:%.c=$(OBJDIR)/%.o) $(xsmm.c:%=%.tidy) : CPPFLAGS += -I$(XSMM_DIR)/include BACKENDS_MAKE += $(XSMM_BACKENDS) + CFLAGS += "-DCEED_USE_XSMM" endif # CUDA Backends @@ -537,7 +542,7 @@ CUDA_LIB_DIR_STUBS := $(CUDA_LIB_DIR)/stubs CUDA_BACKENDS = /gpu/cuda/ref /gpu/cuda/shared /gpu/cuda/gen ifneq ($(CUDA_LIB_DIR),) $(libceeds) : CPPFLAGS += -I$(CUDA_DIR)/include - PKG_LIBS += -L$(abspath $(CUDA_LIB_DIR)) -lcudart -lnvrtc -lcuda -lcublas + PKG_LIBS += -L$(abspath $(CUDA_LIB_DIR)) -lcudart -lnvrtc -lcuda -lcublas PKG_STUBS_LIBS += -L$(CUDA_LIB_DIR_STUBS) LIBCEED_CONTAINS_CXX = 1 libceed.c += interface/ceed-cuda.c @@ -545,6 +550,7 @@ ifneq ($(CUDA_LIB_DIR),) libceed.cpp += $(cuda-all.cpp) libceed.cu += $(cuda-all.cu) BACKENDS_MAKE += $(CUDA_BACKENDS) + CFLAGS += "-DCEED_USE_CUDA" endif # HIP Backends @@ -563,6 +569,7 @@ ifneq ($(HIP_LIB_DIR),) libceed.cpp += $(hip-all.cpp) libceed.hip += $(hip-all.hip) BACKENDS_MAKE += $(HIP_BACKENDS) + CFLAGS += "-DCEED_USE_HIP" endif # SYCL Backends @@ -576,6 +583,7 @@ ifneq ($(SYCL_LIB_DIR),) LIBCEED_CONTAINS_CXX = 1 libceed.sycl += $(sycl-core.cpp) $(sycl-ref.cpp) $(sycl-shared.cpp) $(sycl-gen.cpp) BACKENDS_MAKE += $(SYCL_BACKENDS) + CFLAGS += "-DCEED_USE_SYCL" endif # MAGMA Backends @@ -612,6 +620,7 @@ ifneq ($(wildcard $(MAGMA_DIR)/lib/libmagma.*),) endif LIBCEED_CONTAINS_CXX = 1 BACKENDS_MAKE += $(MAGMA_BACKENDS) + CFLAGS += "-DCEED_USE_MAGMA" endif BACKENDS ?= $(BACKENDS_MAKE) @@ -645,17 +654,16 @@ endif # Building core library components # ------------------------------------------------------------ -# File names *-weak.c contain weak symbol definitions, which must be listed last -# when creating shared or static libraries. -weak_last = $(filter-out %-weak.o,$(1)) $(filter %-weak.o,$(1)) +FORCE: +$(OBJDIR)/backends/ceed-backend-register.o: FORCE libceed.o = $(libceed.c:%.c=$(OBJDIR)/%.o) $(libceed.cpp:%.cpp=$(OBJDIR)/%.o) $(libceed.cu:%.cu=$(OBJDIR)/%.o) $(libceed.hip:%.hip.cpp=$(OBJDIR)/%.o) $(libceed.sycl:%.sycl.cpp=$(OBJDIR)/%.o) $(filter %fortran.o,$(libceed.o)) : CPPFLAGS += $(if $(filter 1,$(UNDERSCORE)),-DUNDERSCORE) $(libceed.o): | info-backends -$(libceed.so) : $(call weak_last,$(libceed.o)) | $$(@D)/.DIR +$(libceed.so) : $(libceed.o) | $$(@D)/.DIR $(call quiet,LINK) $(LDFLAGS) $(CEED_LDFLAGS) -shared -o $@ $^ $(CEED_LDLIBS) $(LDLIBS) -$(libceed.a) : $(call weak_last,$(libceed.o)) | $$(@D)/.DIR +$(libceed.a) : $(libceed.o) | $$(@D)/.DIR $(call quiet,AR) $(ARFLAGS) $@ $^ $(OBJDIR)/%.o : $(CURDIR)/%.c | $$(@D)/.DIR diff --git a/backends/avx/ceed-avx-blocked.c b/backends/avx/ceed-avx-blocked.c index 8452fd8591..9cf1c59a10 100644 --- a/backends/avx/ceed-avx-blocked.c +++ b/backends/avx/ceed-avx-blocked.c @@ -10,12 +10,13 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-avx.h" //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Avx(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Avx_Blocked(const char *resource, Ceed ceed) { Ceed ceed_ref; CeedCheck(!strcmp(resource, "/cpu/self") || !strcmp(resource, "/cpu/self/avx") || !strcmp(resource, "/cpu/self/avx/blocked"), ceed, @@ -32,8 +33,3 @@ static int CeedInit_Avx(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Avx_Blocked(void) { return CeedRegister("/cpu/self/avx/blocked", CeedInit_Avx, 30); } - -//------------------------------------------------------------------------------ diff --git a/backends/avx/ceed-avx-serial.c b/backends/avx/ceed-avx-serial.c index 06ed5f9fdb..38dbefb3e4 100644 --- a/backends/avx/ceed-avx-serial.c +++ b/backends/avx/ceed-avx-serial.c @@ -10,12 +10,13 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-avx.h" //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Avx(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Avx_Serial(const char *resource, Ceed ceed) { Ceed ceed_ref; CeedCheck(!strcmp(resource, "/cpu/self") || !strcmp(resource, "/cpu/self/avx/serial"), ceed, CEED_ERROR_BACKEND, @@ -32,8 +33,3 @@ static int CeedInit_Avx(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Avx_Serial(void) { return CeedRegister("/cpu/self/avx/serial", CeedInit_Avx, 35); } - -//------------------------------------------------------------------------------ diff --git a/backends/blocked/ceed-blocked.c b/backends/blocked/ceed-blocked.c index f50d2fc91e..735439c177 100644 --- a/backends/blocked/ceed-blocked.c +++ b/backends/blocked/ceed-blocked.c @@ -5,17 +5,18 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-blocked.h" - #include #include #include #include +#include "../ceed-backend-init.h" +#include "ceed-blocked.h" + //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Blocked(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Ref_Blocked(const char *resource, Ceed ceed) { Ceed ceed_ref; CeedCheck(!strcmp(resource, "/cpu/self") || !strcmp(resource, "/cpu/self/ref/blocked"), ceed, CEED_ERROR_BACKEND, @@ -32,8 +33,3 @@ static int CeedInit_Blocked(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Ref_Blocked(void) { return CeedRegister("/cpu/self/ref/blocked", CeedInit_Blocked, 55); } - -//------------------------------------------------------------------------------ diff --git a/backends/ceed-backend-init.h b/backends/ceed-backend-init.h new file mode 100644 index 0000000000..b68da262ea --- /dev/null +++ b/backends/ceed-backend-init.h @@ -0,0 +1,14 @@ +// Copyright (c) 2017-2025, Lawrence Livermore National Security, LLC and other CEED contributors. +// All Rights Reserved. See the top-level LICENSE and NOTICE files for details. +// +// SPDX-License-Identifier: BSD-2-Clause +// +// This file is part of CEED: http://github.com/ceed +#pragma once + +#include + +#undef CEED_BACKEND +#define CEED_BACKEND(name, ...) CEED_INTERN int CeedInit_##name(const char *resource, Ceed ceed); +#include "../backends/ceed-backend-list.h" +#undef CEED_BACKEND diff --git a/backends/ceed-backend-list.h b/backends/ceed-backend-list.h index 017d8a76a0..bca4b167fd 100644 --- a/backends/ceed-backend-list.h +++ b/backends/ceed-backend-list.h @@ -7,28 +7,72 @@ // This header does not have guards because it is included multiple times. -// List each backend registration function once here. -// This will be expanded inside CeedRegisterAll() to call each registration function in the order listed, and also to define weak symbol aliases for -// backends that are not configured. - -CEED_BACKEND(CeedRegister_Avx_Blocked, 1, "/cpu/self/avx/blocked") -CEED_BACKEND(CeedRegister_Avx_Serial, 1, "/cpu/self/avx/serial") -CEED_BACKEND(CeedRegister_Cuda, 1, "/gpu/cuda/ref") -CEED_BACKEND(CeedRegister_Cuda_Gen, 1, "/gpu/cuda/gen") -CEED_BACKEND(CeedRegister_Cuda_Shared, 1, "/gpu/cuda/shared") -CEED_BACKEND(CeedRegister_Hip, 1, "/gpu/hip/ref") -CEED_BACKEND(CeedRegister_Hip_Gen, 1, "/gpu/hip/gen") -CEED_BACKEND(CeedRegister_Hip_Shared, 1, "/gpu/hip/shared") -CEED_BACKEND(CeedRegister_Sycl, 1, "/gpu/sycl/ref") -CEED_BACKEND(CeedRegister_Sycl_Shared, 1, "/gpu/sycl/shared") -CEED_BACKEND(CeedRegister_Sycl_Gen, 1, "/gpu/sycl/gen") -CEED_BACKEND(CeedRegister_Magma, 2, "/gpu/cuda/magma", "/gpu/hip/magma") -CEED_BACKEND(CeedRegister_Magma_Det, 2, "/gpu/cuda/magma/det", "/gpu/hip/magma/det") -CEED_BACKEND(CeedRegister_Memcheck_Blocked, 1, "/cpu/self/memcheck/blocked") -CEED_BACKEND(CeedRegister_Memcheck_Serial, 1, "/cpu/self/memcheck/serial") -CEED_BACKEND(CeedRegister_Opt_Blocked, 1, "/cpu/self/opt/blocked") -CEED_BACKEND(CeedRegister_Opt_Serial, 1, "/cpu/self/opt/serial") -CEED_BACKEND(CeedRegister_Ref, 1, "/cpu/self/ref/serial") -CEED_BACKEND(CeedRegister_Ref_Blocked, 1, "/cpu/self/ref/blocked") -CEED_BACKEND(CeedRegister_Xsmm_Blocked, 1, "/cpu/self/xsmm/blocked") -CEED_BACKEND(CeedRegister_Xsmm_Serial, 1, "/cpu/self/xsmm/serial") +// List each backend function suffix once here. +// The CEED_BACKEND(name, suffix, is_enabled, num_prefixes, prefix_0, priority_0, ...) macro is used in several places. +// +// This list will be expanded inside ceed-backend-init.h to declare all initialization functions of the form CeedInit_##name(resource, ceed). +// These functions must be defined in their respective backends. +// +// This list will be expanded inside ceed-backend-register.h to declare all initialization functions of the form CeedRegister_##name##suffix(void). +// These functions are defined ceed-register.c. +// +// In ceed-register.c, if the backend is enabled, then CeedRegister_##name##suffix(void) registers each prefix with the corresponding priority and uses CeedInit_##name. +// If the backend is not enabled, then CeedRegister_##name##suffix(void) registers each prefix with an initialization function that gives an error message. +// +// This list is expanded inside CeedRegisterAll() to call each registration function in the order listed. + +CEED_BACKEND(Ref_Serial, , true, 1, "/cpu/self/ref/serial", 50) +CEED_BACKEND(Ref_Blocked, , true, 1, "/cpu/self/ref/blocked", 55) +CEED_BACKEND(Opt_Serial, , true, 1, "/cpu/self/opt/serial", 40) +CEED_BACKEND(Opt_Blocked, , true, 1, "/cpu/self/opt/blocked", 45) + +#ifndef CEED_USE_MEMCHECK +#define CEED_USE_MEMCHECK false +#endif +CEED_BACKEND(Memcheck_Serial, , CEED_USE_MEMCHECK, 1, "/cpu/self/memcheck/serial", 100) +CEED_BACKEND(Memcheck_Blocked, , CEED_USE_MEMCHECK, 1, "/cpu/self/memcheck/blocked", 110) + +#ifndef CEED_USE_AVX +#define CEED_USE_AVX false +#endif +CEED_BACKEND(Avx_Serial, , CEED_USE_AVX, 1, "/cpu/self/avx/serial", 30) +CEED_BACKEND(Avx_Blocked, , CEED_USE_AVX, 1, "/cpu/self/avx/blocked", 30) + +#ifndef CEED_USE_XSMM +#define CEED_USE_XSMM false +#endif +CEED_BACKEND(Xsmm_Serial, , CEED_USE_XSMM, 1, "/cpu/self/xsmm/serial", 20) +CEED_BACKEND(Xsmm_Blocked, , CEED_USE_XSMM, 1, "/cpu/self/xsmm/blocked", 25) + +#ifndef CEED_USE_CUDA +#define CEED_USE_CUDA false +#endif +CEED_BACKEND(Cuda_Ref, , CEED_USE_CUDA, 1, "/gpu/cuda/ref", 40) +CEED_BACKEND(Cuda_Shared, , CEED_USE_CUDA, 1, "/gpu/cuda/shared", 30) +CEED_BACKEND(Cuda_Gen, , CEED_USE_CUDA, 1, "/gpu/cuda/gen", 20) + +#ifndef CEED_USE_HIP +#define CEED_USE_HIP false +#endif +CEED_BACKEND(Hip_Ref, , CEED_USE_HIP, 1, "/gpu/hip/ref", 40) +CEED_BACKEND(Hip_Shared, , CEED_USE_HIP, 1, "/gpu/hip/shared", 30) +CEED_BACKEND(Hip_Gen, , CEED_USE_HIP, 1, "/gpu/hip/gen", 20) + +#ifndef CEED_USE_SYCL +#define CEED_USE_SYCL false +#endif +CEED_BACKEND(Sycl_Ref, , CEED_USE_SYCL, 2, "/gpu/sycl/ref", 40, "/cpu/sycl/ref", 45) +CEED_BACKEND(Sycl_Shared, , CEED_USE_SYCL, 2, "/gpu/sycl/shared", 30, "/cpu/sycl/shared", 35) +CEED_BACKEND(Sycl_Gen, , CEED_USE_SYCL, 1, "/gpu/sycl/gen", 20) + +#ifndef CEED_MAGMA_USE_CUDA +#define CEED_MAGMA_USE_CUDA false +#endif +CEED_BACKEND(Magma, _Cuda, CEED_MAGMA_USE_CUDA, 1, "/gpu/cuda/magma", 120) +CEED_BACKEND(Magma_Det, _Cuda, CEED_MAGMA_USE_CUDA, 1, "/gpu/cuda/magma/det", 125) + +#ifndef CEED_MAGMA_USE_HIP +#define CEED_MAGMA_USE_HIP false +#endif +CEED_BACKEND(Magma, _Hip, CEED_MAGMA_USE_HIP, 1, "/gpu/hip/magma", 120) +CEED_BACKEND(Magma_Det, _Hip, CEED_MAGMA_USE_HIP, 1, "/gpu/hip/magma/det", 125) diff --git a/backends/ceed-backend-register.c b/backends/ceed-backend-register.c new file mode 100644 index 0000000000..242cc41194 --- /dev/null +++ b/backends/ceed-backend-register.c @@ -0,0 +1,78 @@ +// Copyright (c) 2017-2025, Lawrence Livermore National Security, LLC and other CEED contributors. +// All Rights Reserved. See the top-level LICENSE and NOTICE files for details. +// +// SPDX-License-Identifier: BSD-2-Clause +// +// This file is part of CEED: http://github.com/ceed + +#include "ceed-backend-register.h" +#include +#include "ceed-backend-init.h" + +#define CEED_PRIORITY_UNCOMPILED 1024 // Revisit if we ever use 4 digit priority values + +//------------------------------------------------------------------------------ +// Backend register functions +//------------------------------------------------------------------------------ +// LCOV_EXCL_START +// This function provides error messages on initialization attempt for uncompiled backends +static int CeedInit_Uncompiled(const char *resource, Ceed ceed) { + return CeedError(ceed, CEED_ERROR_UNSUPPORTED, "Backend not currently compiled: %s\nConsult the installation instructions to compile this backend", + resource); +} +// LCOV_EXCL_STOP + +// This function registers uncompiled backends +static int CeedRegister_Uncompiled(int (*f)(const char *, struct Ceed_private *), int num_prefixes, ...) { + va_list prefixes; + int ierr; + + va_start(prefixes, num_prefixes); + for (int i = 0; i < num_prefixes; i++) { + const char *prefix = va_arg(prefixes, const char *); + const int priority = va_arg(prefixes, int); + + CeedDebugEnv("Weak Register : %s, %d", prefix, priority); + ierr = CeedRegisterImpl(prefix, CeedInit_Uncompiled, CEED_PRIORITY_UNCOMPILED); + if (ierr) { + va_end(prefixes); // Prevent leak on error + return ierr; + } + } + va_end(prefixes); + return CEED_ERROR_SUCCESS; +} + +// This function registers compiled backends +static int CeedRegister_Compiled(int (*f)(const char *, struct Ceed_private *), int num_prefixes, ...) { + va_list prefixes; + int ierr; + + va_start(prefixes, num_prefixes); + for (int i = 0; i < num_prefixes; i++) { + const char *prefix = va_arg(prefixes, const char *); + const int priority = va_arg(prefixes, int); + + ierr = CeedRegister(prefix, f, priority); + if (ierr) { + va_end(prefixes); // Prevent leak on error + return ierr; + } + } + va_end(prefixes); + return CEED_ERROR_SUCCESS; +} + +// This macro creates a wrapper registration function that calls the compiled/uncompiled registration function +#define CEED_BACKEND(name, suffix, is_enabled, num_prefixes, ...) \ + CEED_INTERN int CeedRegister_##name##suffix(void) { \ + if (is_enabled) { \ + return CeedRegister_Compiled(CeedInit_##name, num_prefixes, __VA_ARGS__); \ + } else { \ + return CeedRegister_Uncompiled(NULL, num_prefixes, __VA_ARGS__); \ + } \ + } +#include "../backends/ceed-backend-list.h" +#undef CEED_BACKEND + +//------------------------------------------------------------------------------ diff --git a/backends/ceed-backend-register.h b/backends/ceed-backend-register.h new file mode 100644 index 0000000000..04759b0e31 --- /dev/null +++ b/backends/ceed-backend-register.h @@ -0,0 +1,14 @@ +// Copyright (c) 2017-2025, Lawrence Livermore National Security, LLC and other CEED contributors. +// All Rights Reserved. See the top-level LICENSE and NOTICE files for details. +// +// SPDX-License-Identifier: BSD-2-Clause +// +// This file is part of CEED: http://github.com/ceed +#pragma once + +#include + +#undef CEED_BACKEND +#define CEED_BACKEND(name, suffix, ...) CEED_INTERN int CeedRegister_##name##suffix(void); +#include "../backends/ceed-backend-list.h" +#undef CEED_BACKEND diff --git a/backends/ceed-backend-weak.c b/backends/ceed-backend-weak.c deleted file mode 100644 index 81abd45a3d..0000000000 --- a/backends/ceed-backend-weak.c +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2017-2026, Lawrence Livermore National Security, LLC and other CEED contributors. -// All Rights Reserved. See the top-level LICENSE and NOTICE files for details. -// -// SPDX-License-Identifier: BSD-2-Clause -// -// This file is part of CEED: http://github.com/ceed - -#include -#include -#include - -// LCOV_EXCL_START -// This function provides improved error messages for uncompiled backends -static int CeedInit_Weak(const char *resource, Ceed ceed) { - return CeedError(ceed, CEED_ERROR_UNSUPPORTED, "Backend not currently compiled: %s\nConsult the installation instructions to compile this backend", - resource); -} - -// This function provides a debug target for weak symbols -static int CeedRegister_Weak(const char *name, int num_prefixes, ...) { - va_list prefixes; - int ierr; - - va_start(prefixes, num_prefixes); - for (int i = 0; i < num_prefixes; i++) { - const char *prefix = va_arg(prefixes, const char *); - - CeedDebugEnv("Weak Register : %s", prefix); - ierr = CeedRegisterImpl(prefix, CeedInit_Weak, CEED_MAX_BACKEND_PRIORITY); - if (ierr) { - va_end(prefixes); // Prevent leak on error - return ierr; - } - } - va_end(prefixes); - return CEED_ERROR_SUCCESS; -} -// LCOV_EXCL_STOP - -#define CEED_BACKEND(name, num_prefixes, ...) \ - CEED_INTERN int name(void) __attribute__((weak)); \ - int name(void) { return CeedRegister_Weak(__func__, num_prefixes, __VA_ARGS__); } -#include "ceed-backend-list.h" -#undef CEED_BACKEND diff --git a/backends/cuda-gen/ceed-cuda-gen.c b/backends/cuda-gen/ceed-cuda-gen.c index 799c35fd1e..0824752287 100644 --- a/backends/cuda-gen/ceed-cuda-gen.c +++ b/backends/cuda-gen/ceed-cuda-gen.c @@ -5,18 +5,18 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-cuda-gen.h" - #include #include #include +#include "../ceed-backend-init.h" #include "../cuda/ceed-cuda-common.h" +#include "ceed-cuda-gen.h" //------------------------------------------------------------------------------ // Backend init //------------------------------------------------------------------------------ -static int CeedInit_Cuda_gen(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Cuda_Gen(const char *resource, Ceed ceed) { char *resource_root; Ceed ceed_shared, ceed_ref; Ceed_Cuda *data; @@ -47,8 +47,3 @@ static int CeedInit_Cuda_gen(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Register backend -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Cuda_Gen(void) { return CeedRegister("/gpu/cuda/gen", CeedInit_Cuda_gen, 20); } - -//------------------------------------------------------------------------------ diff --git a/backends/cuda-ref/ceed-cuda-ref.c b/backends/cuda-ref/ceed-cuda-ref.c index 0937b0ce17..1fade9cdad 100644 --- a/backends/cuda-ref/ceed-cuda-ref.c +++ b/backends/cuda-ref/ceed-cuda-ref.c @@ -5,14 +5,14 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-cuda-ref.h" - #include #include #include #include +#include "../ceed-backend-init.h" #include "../cuda/ceed-cuda-common.h" +#include "ceed-cuda-ref.h" //------------------------------------------------------------------------------ // CUDA preferred MemType @@ -37,7 +37,7 @@ int CeedGetCublasHandle_Cuda(Ceed ceed, cublasHandle_t *handle) { //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Cuda_ref(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Cuda_Ref(const char *resource, Ceed ceed) { Ceed_Cuda *data; char *resource_root; @@ -67,8 +67,3 @@ static int CeedInit_Cuda_ref(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Cuda(void) { return CeedRegister("/gpu/cuda/ref", CeedInit_Cuda_ref, 40); } - -//------------------------------------------------------------------------------ diff --git a/backends/cuda-shared/ceed-cuda-shared.c b/backends/cuda-shared/ceed-cuda-shared.c index 1224032995..a77cf2d7a2 100644 --- a/backends/cuda-shared/ceed-cuda-shared.c +++ b/backends/cuda-shared/ceed-cuda-shared.c @@ -5,19 +5,19 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-cuda-shared.h" - #include #include #include #include +#include "../ceed-backend-init.h" #include "../cuda/ceed-cuda-common.h" +#include "ceed-cuda-shared.h" //------------------------------------------------------------------------------ // Backend init //------------------------------------------------------------------------------ -static int CeedInit_Cuda_shared(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Cuda_Shared(const char *resource, Ceed ceed) { Ceed ceed_ref; Ceed_Cuda *data; char *resource_root; @@ -42,8 +42,3 @@ static int CeedInit_Cuda_shared(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Register backend -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Cuda_Shared(void) { return CeedRegister("/gpu/cuda/shared", CeedInit_Cuda_shared, 25); } - -//------------------------------------------------------------------------------ diff --git a/backends/hip-gen/ceed-hip-gen.c b/backends/hip-gen/ceed-hip-gen.c index 8b3ead0db7..e8d2f61751 100644 --- a/backends/hip-gen/ceed-hip-gen.c +++ b/backends/hip-gen/ceed-hip-gen.c @@ -5,18 +5,18 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-hip-gen.h" - #include #include #include +#include "../ceed-backend-init.h" #include "../hip/ceed-hip-common.h" +#include "ceed-hip-gen.h" //------------------------------------------------------------------------------ // Backend init //------------------------------------------------------------------------------ -static int CeedInit_Hip_gen(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Hip_Gen(const char *resource, Ceed ceed) { char *resource_root; Ceed ceed_shared, ceed_ref; Ceed_Hip *data; @@ -47,8 +47,3 @@ static int CeedInit_Hip_gen(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Register backend -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Hip_Gen(void) { return CeedRegister("/gpu/hip/gen", CeedInit_Hip_gen, 20); } - -//------------------------------------------------------------------------------ diff --git a/backends/hip-ref/ceed-hip-ref.c b/backends/hip-ref/ceed-hip-ref.c index f22f3a16e7..1670665718 100644 --- a/backends/hip-ref/ceed-hip-ref.c +++ b/backends/hip-ref/ceed-hip-ref.c @@ -5,14 +5,14 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-hip-ref.h" - #include #include #include #include +#include "../ceed-backend-init.h" #include "../hip/ceed-hip-common.h" +#include "ceed-hip-ref.h" //------------------------------------------------------------------------------ // HIP preferred MemType @@ -40,7 +40,7 @@ int CeedGetHipblasHandle_Hip(Ceed ceed, hipblasHandle_t *handle) { //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Hip_ref(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Hip_Ref(const char *resource, Ceed ceed) { Ceed_Hip *data; char *resource_root; @@ -70,8 +70,3 @@ static int CeedInit_Hip_ref(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Hip(void) { return CeedRegister("/gpu/hip/ref", CeedInit_Hip_ref, 40); } - -//------------------------------------------------------------------------------ diff --git a/backends/hip-shared/ceed-hip-shared.c b/backends/hip-shared/ceed-hip-shared.c index afb39e8bde..37b6eaa94f 100644 --- a/backends/hip-shared/ceed-hip-shared.c +++ b/backends/hip-shared/ceed-hip-shared.c @@ -5,19 +5,19 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-hip-shared.h" - #include #include #include #include +#include "../ceed-backend-init.h" #include "../hip/ceed-hip-common.h" +#include "ceed-hip-shared.h" //------------------------------------------------------------------------------ // Backend init //------------------------------------------------------------------------------ -static int CeedInit_Hip_shared(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Hip_Shared(const char *resource, Ceed ceed) { Ceed ceed_ref; Ceed_Hip *data; char *resource_root; @@ -42,8 +42,3 @@ static int CeedInit_Hip_shared(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Register backend -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Hip_Shared(void) { return CeedRegister("/gpu/hip/shared", CeedInit_Hip_shared, 25); } - -//------------------------------------------------------------------------------ diff --git a/backends/magma/ceed-magma-det.c b/backends/magma/ceed-magma-det.c index 081cb6e7d9..23287e3798 100644 --- a/backends/magma/ceed-magma-det.c +++ b/backends/magma/ceed-magma-det.c @@ -10,12 +10,13 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-magma-common.h" //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Magma_Det(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Magma_Det(const char *resource, Ceed ceed) { Ceed ceed_ref; Ceed_Magma *data; const int nrc = 18; // number of characters in resource @@ -42,14 +43,3 @@ static int CeedInit_Magma_Det(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Magma_Det(void) { -#ifdef CEED_MAGMA_USE_HIP - return CeedRegister("/gpu/hip/magma/det", CeedInit_Magma_Det, 125); -#else - return CeedRegister("/gpu/cuda/magma/det", CeedInit_Magma_Det, 125); -#endif -} - -//------------------------------------------------------------------------------ diff --git a/backends/magma/ceed-magma.c b/backends/magma/ceed-magma.c index 9908dd55da..448cb28d29 100644 --- a/backends/magma/ceed-magma.c +++ b/backends/magma/ceed-magma.c @@ -5,19 +5,19 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-magma.h" - #include #include #include #include +#include "../ceed-backend-init.h" #include "ceed-magma-common.h" +#include "ceed-magma.h" //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Magma(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Magma(const char *resource, Ceed ceed) { Ceed ceed_ref; Ceed_Magma *data; const int nrc = 14; // number of characters in resource @@ -47,14 +47,3 @@ static int CeedInit_Magma(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Magma(void) { -#ifdef CEED_MAGMA_USE_HIP - return CeedRegister("/gpu/hip/magma", CeedInit_Magma, 120); -#else - return CeedRegister("/gpu/cuda/magma", CeedInit_Magma, 120); -#endif -} - -//------------------------------------------------------------------------------ diff --git a/backends/memcheck/ceed-memcheck-blocked.c b/backends/memcheck/ceed-memcheck-blocked.c index 009c9e4601..59d2d0330f 100644 --- a/backends/memcheck/ceed-memcheck-blocked.c +++ b/backends/memcheck/ceed-memcheck-blocked.c @@ -9,12 +9,13 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-memcheck.h" //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Memcheck(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Memcheck_Blocked(const char *resource, Ceed ceed) { Ceed ceed_ref; CeedCheck(!strcmp(resource, "/cpu/self/memcheck/blocked"), ceed, CEED_ERROR_BACKEND, "Valgrind Memcheck backend cannot use resource: %s", resource); @@ -34,8 +35,3 @@ static int CeedInit_Memcheck(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Memcheck_Blocked(void) { return CeedRegister("/cpu/self/memcheck/blocked", CeedInit_Memcheck, 110); } - -//------------------------------------------------------------------------------ diff --git a/backends/memcheck/ceed-memcheck-serial.c b/backends/memcheck/ceed-memcheck-serial.c index a0140fbd75..eafa84caed 100644 --- a/backends/memcheck/ceed-memcheck-serial.c +++ b/backends/memcheck/ceed-memcheck-serial.c @@ -9,12 +9,13 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-memcheck.h" //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Memcheck(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Memcheck_Serial(const char *resource, Ceed ceed) { Ceed ceed_ref; CeedCheck(!strcmp(resource, "/cpu/self/memcheck") || !strcmp(resource, "/cpu/self/memcheck/serial"), ceed, CEED_ERROR_BACKEND, @@ -35,8 +36,3 @@ static int CeedInit_Memcheck(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Memcheck_Serial(void) { return CeedRegister("/cpu/self/memcheck/serial", CeedInit_Memcheck, 100); } - -//------------------------------------------------------------------------------ diff --git a/backends/opt/ceed-opt-blocked.c b/backends/opt/ceed-opt-blocked.c index e8980c3ba9..768bb8c7a9 100644 --- a/backends/opt/ceed-opt-blocked.c +++ b/backends/opt/ceed-opt-blocked.c @@ -10,6 +10,7 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-opt.h" //------------------------------------------------------------------------------ @@ -26,7 +27,7 @@ static int CeedDestroy_Opt(Ceed ceed) { //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Opt_Blocked(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Opt_Blocked(const char *resource, Ceed ceed) { Ceed ceed_ref; Ceed_Opt *data; @@ -51,8 +52,3 @@ static int CeedInit_Opt_Blocked(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Opt_Blocked(void) { return CeedRegister("/cpu/self/opt/blocked", CeedInit_Opt_Blocked, 40); } - -//------------------------------------------------------------------------------ diff --git a/backends/opt/ceed-opt-serial.c b/backends/opt/ceed-opt-serial.c index 1e3517b44a..38612d0d23 100644 --- a/backends/opt/ceed-opt-serial.c +++ b/backends/opt/ceed-opt-serial.c @@ -10,6 +10,7 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-opt.h" //------------------------------------------------------------------------------ @@ -26,7 +27,7 @@ static int CeedDestroy_Opt(Ceed ceed) { //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Opt_Serial(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Opt_Serial(const char *resource, Ceed ceed) { Ceed ceed_ref; Ceed_Opt *data; @@ -51,8 +52,3 @@ static int CeedInit_Opt_Serial(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Opt_Serial(void) { return CeedRegister("/cpu/self/opt/serial", CeedInit_Opt_Serial, 45); } - -//------------------------------------------------------------------------------ diff --git a/backends/ref/ceed-ref.c b/backends/ref/ceed-ref.c index 46af219839..ef8571b58d 100644 --- a/backends/ref/ceed-ref.c +++ b/backends/ref/ceed-ref.c @@ -5,16 +5,17 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-ref.h" - #include #include #include +#include "../ceed-backend-init.h" +#include "ceed-ref.h" + //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Ref(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Ref_Serial(const char *resource, Ceed ceed) { CeedCheck(!strcmp(resource, "/cpu/self") || !strcmp(resource, "/cpu/self/ref") || !strcmp(resource, "/cpu/self/ref/serial"), ceed, CEED_ERROR_BACKEND, "Ref backend cannot use resource: %s", resource); CeedCallBackend(CeedSetDeterministic(ceed, true)); @@ -36,13 +37,3 @@ static int CeedInit_Ref(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Ref(void) { - return - //! [Register] - CeedRegister("/cpu/self/ref/serial", CeedInit_Ref, 50); - //! [Register] -} - -//------------------------------------------------------------------------------ diff --git a/backends/sycl-gen/ceed-sycl-gen.sycl.cpp b/backends/sycl-gen/ceed-sycl-gen.sycl.cpp index 1d67da7e0a..87594ae39c 100644 --- a/backends/sycl-gen/ceed-sycl-gen.sycl.cpp +++ b/backends/sycl-gen/ceed-sycl-gen.sycl.cpp @@ -5,19 +5,19 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-sycl-gen.hpp" - #include #include - #include #include #include +#include "../ceed-backend-init.h" +#include "ceed-sycl-gen.hpp" + //------------------------------------------------------------------------------ // Backend init //------------------------------------------------------------------------------ -static int CeedInit_Sycl_gen(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Sycl_gen(const char *resource, Ceed ceed) { Ceed ceed_shared, ceed_ref; Ceed_Sycl *data; char *resource_root; @@ -48,8 +48,3 @@ static int CeedInit_Sycl_gen(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Register backend -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Sycl_Gen(void) { return CeedRegister("/gpu/sycl/gen", CeedInit_Sycl_gen, 20); } - -//------------------------------------------------------------------------------ diff --git a/backends/sycl-ref/ceed-sycl-ref.sycl.cpp b/backends/sycl-ref/ceed-sycl-ref.sycl.cpp index ffa5a78d7d..54ee07079d 100644 --- a/backends/sycl-ref/ceed-sycl-ref.sycl.cpp +++ b/backends/sycl-ref/ceed-sycl-ref.sycl.cpp @@ -6,14 +6,14 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-sycl-ref.hpp" - #include #include - #include #include +#include "../ceed-backend-init.h" +#include "ceed-sycl-ref.hpp" + //------------------------------------------------------------------------------ // SYCL preferred MemType //------------------------------------------------------------------------------ @@ -25,7 +25,7 @@ static int CeedGetPreferredMemType_Sycl(CeedMemType *mem_type) { //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Sycl_ref(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Sycl_Ref(const char *resource, Ceed ceed) { Ceed_Sycl *data; char *resource_root; @@ -53,12 +53,3 @@ static int CeedInit_Sycl_ref(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Sycl(void) { - CeedCallBackend(CeedRegister("/gpu/sycl/ref", CeedInit_Sycl_ref, 40)); - CeedCallBackend(CeedRegister("/cpu/sycl/ref", CeedInit_Sycl_ref, 50)); - return CEED_ERROR_SUCCESS; -} - -//------------------------------------------------------------------------------ diff --git a/backends/sycl-shared/ceed-sycl-shared.sycl.cpp b/backends/sycl-shared/ceed-sycl-shared.sycl.cpp index a563a73626..48939ef2e3 100644 --- a/backends/sycl-shared/ceed-sycl-shared.sycl.cpp +++ b/backends/sycl-shared/ceed-sycl-shared.sycl.cpp @@ -5,19 +5,19 @@ // // This file is part of CEED: http://github.com/ceed -#include "ceed-sycl-shared.hpp" - #include #include - #include #include #include +#include "../ceed-backend-init.h" +#include "ceed-sycl-shared.hpp" + //------------------------------------------------------------------------------ // Backend init //------------------------------------------------------------------------------ -static int CeedInit_Sycl_shared(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Sycl_Shared(const char *resource, Ceed ceed) { Ceed ceed_ref; Ceed_Sycl *data; char *resource_root; @@ -50,12 +50,3 @@ static int CeedInit_Sycl_shared(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Register backend -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Sycl_Shared(void) { - CeedCallBackend(CeedRegister("/gpu/sycl/shared", CeedInit_Sycl_shared, 25)); - CeedCallBackend(CeedRegister("/cpu/sycl/shared", CeedInit_Sycl_shared, 35)); - return CEED_ERROR_SUCCESS; -} - -//------------------------------------------------------------------------------ diff --git a/backends/xsmm/ceed-xsmm-blocked.c b/backends/xsmm/ceed-xsmm-blocked.c index 2abaa247c1..eabbb82411 100644 --- a/backends/xsmm/ceed-xsmm-blocked.c +++ b/backends/xsmm/ceed-xsmm-blocked.c @@ -10,12 +10,13 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-xsmm.h" //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Xsmm_Blocked(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Xsmm_Blocked(const char *resource, Ceed ceed) { Ceed ceed_ref; CeedCheck(!strcmp(resource, "/cpu/self") || !strcmp(resource, "/cpu/self/xsmm") || !strcmp(resource, "/cpu/self/xsmm/blocked"), ceed, @@ -32,8 +33,3 @@ static int CeedInit_Xsmm_Blocked(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Xsmm_Blocked(void) { return CeedRegister("/cpu/self/xsmm/blocked", CeedInit_Xsmm_Blocked, 20); } - -//------------------------------------------------------------------------------ diff --git a/backends/xsmm/ceed-xsmm-serial.c b/backends/xsmm/ceed-xsmm-serial.c index 7892e845be..8e7ca36103 100644 --- a/backends/xsmm/ceed-xsmm-serial.c +++ b/backends/xsmm/ceed-xsmm-serial.c @@ -10,12 +10,13 @@ #include #include +#include "../ceed-backend-init.h" #include "ceed-xsmm.h" //------------------------------------------------------------------------------ // Backend Init //------------------------------------------------------------------------------ -static int CeedInit_Xsmm_Serial(const char *resource, Ceed ceed) { +CEED_INTERN int CeedInit_Xsmm_Serial(const char *resource, Ceed ceed) { Ceed ceed_ref; CeedCheck(!strcmp(resource, "/cpu/self") || !strcmp(resource, "/cpu/self/xsmm/serial"), ceed, CEED_ERROR_BACKEND, @@ -32,8 +33,3 @@ static int CeedInit_Xsmm_Serial(const char *resource, Ceed ceed) { } //------------------------------------------------------------------------------ -// Backend Register -//------------------------------------------------------------------------------ -CEED_INTERN int CeedRegister_Xsmm_Serial(void) { return CeedRegister("/cpu/self/xsmm/serial", CeedInit_Xsmm_Serial, 25); } - -//------------------------------------------------------------------------------ diff --git a/doc/sphinx/source/libCEEDapi.md b/doc/sphinx/source/libCEEDapi.md index 66caa15688..dec562027f 100644 --- a/doc/sphinx/source/libCEEDapi.md +++ b/doc/sphinx/source/libCEEDapi.md @@ -390,7 +390,7 @@ To illustrate how the user can declare a {ref}`CeedQFunction` via the gallery of LibCEED is intended to be extensible via backends that are packaged with the library and packaged separately (possibly as a binary containing proprietary code). Backends are registered by calling -```{literalinclude} ../../../backends/ref/ceed-ref.c +```{literalinclude} ../../../backends/ceed-backend-list.c :end-before: //! [Register] :language: c :start-after: //! [Register] diff --git a/gallery/ceed-gallery-weak.c b/gallery/ceed-gallery-weak.c deleted file mode 100644 index 8744f75d8f..0000000000 --- a/gallery/ceed-gallery-weak.c +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2017-2026, Lawrence Livermore National Security, LLC and other CEED contributors. -// All Rights Reserved. See the top-level LICENSE and NOTICE files for details. -// -// SPDX-License-Identifier: BSD-2-Clause -// -// This file is part of CEED: http://github.com/ceed - -#include -#include - -// This function provides a debug target for weak symbols -// LCOV_EXCL_START -static int CeedQFunctionRegister_Weak(const char *name) { - CeedDebugEnv("** Weak Register: %s", name); - return CEED_ERROR_SUCCESS; -} -// LCOV_EXCL_STOP - -#define CEED_GALLERY_QFUNCTION(name) \ - CEED_INTERN int name(void) __attribute__((weak)); \ - int name(void) { return CeedQFunctionRegister_Weak(__func__); } -#include "ceed-gallery-list.h" -#undef CEED_GALLERY_QFUNCTION diff --git a/interface/ceed-register.c b/interface/ceed-register.c index 759a6463fb..8d5f7179e2 100644 --- a/interface/ceed-register.c +++ b/interface/ceed-register.c @@ -9,11 +9,9 @@ #include #include -static bool register_all_called; +#include "../backends/ceed-backend-register.h" -#define CEED_BACKEND(name, ...) CEED_INTERN int name(void); -#include "../backends/ceed-backend-list.h" -#undef CEED_BACKEND +static bool register_all_called; /** @brief Register all pre-configured backends. @@ -33,8 +31,8 @@ int CeedRegisterAll(void) { CeedPragmaCritical(CeedRegisterAll) { if (!register_all_called) { CeedDebugEnv256(CEED_DEBUG_COLOR_SUCCESS, "\n---------- Registering Backends ----------\n"); -#define CEED_BACKEND(name, ...) \ - if (!ierr) ierr = name(); +#define CEED_BACKEND(name, suffix, ...) \ + if (!ierr) ierr = CeedRegister_##name##suffix(); #include "../backends/ceed-backend-list.h" #undef CEED_BACKEND register_all_called = true; diff --git a/interface/ceed.c b/interface/ceed.c index f53d92c4e4..ca5503436d 100644 --- a/interface/ceed.c +++ b/interface/ceed.c @@ -464,7 +464,7 @@ int CeedSetHostCeedScalarArray(const CeedScalar *source_array, CeedCopyMode copy @ref Backend **/ int CeedRegister(const char *prefix, int (*init)(const char *, Ceed), unsigned int priority) { - CeedDebugEnv("Backend Register: %s", prefix); + CeedDebugEnv("Backend Register: %s, %d", prefix, priority); CeedRegisterImpl(prefix, init, priority); return CEED_ERROR_SUCCESS; }