diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ce5028c4..280bfd218 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -423,29 +423,6 @@ if((UMF_BUILD_GPU_TESTS OR UMF_BUILD_GPU_EXAMPLES) AND UMF_BUILD_CUDA_PROVIDER) # TODO do the same for ze_loader endif() -# set optional symbols for map/def files -# -# TODO: ref. #649 -set(UMF_OPTIONAL_SYMBOLS_LINUX "") -set(UMF_OPTIONAL_SYMBOLS_WINDOWS "") - -if(UMF_BUILD_LEVEL_ZERO_PROVIDER) - add_optional_symbol(umfLevelZeroMemoryProviderOps) -endif() - -# Conditional configuration for CUDA provider -if(UMF_BUILD_CUDA_PROVIDER) - add_optional_symbol(umfCUDAMemoryProviderOps) -endif() - -if(NOT UMF_DISABLE_HWLOC) - add_optional_symbol(umfOsMemoryProviderOps) - if(LINUX) - add_optional_symbol(umfDevDaxMemoryProviderOps) - add_optional_symbol(umfFileMemoryProviderOps) - endif() -endif() - add_subdirectory(src) if(UMF_BUILD_TESTS) diff --git a/cmake/helpers.cmake b/cmake/helpers.cmake index 8545f285b..a101c8615 100644 --- a/cmake/helpers.cmake +++ b/cmake/helpers.cmake @@ -446,12 +446,3 @@ macro(add_sanitizer_flag flag) set(CMAKE_REQUIRED_FLAGS ${SAVED_CMAKE_REQUIRED_FLAGS}) endmacro() - -function(add_optional_symbol symbol) - set(UMF_OPTIONAL_SYMBOLS_WINDOWS - "${UMF_OPTIONAL_SYMBOLS_WINDOWS} \n ${symbol}" - PARENT_SCOPE) - set(UMF_OPTIONAL_SYMBOLS_LINUX - "${UMF_OPTIONAL_SYMBOLS_LINUX} \n ${symbol};" - PARENT_SCOPE) -endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fdba77858..873dc6d92 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -110,7 +110,17 @@ set(UMF_SOURCES memtarget.c mempolicy.c memspace.c + memspaces/memspace_host_all.c + memspaces/memspace_highest_capacity.c + memspaces/memspace_highest_bandwidth.c + memspaces/memspace_lowest_latency.c + memspaces/memspace_numa.c provider/provider_coarse.c + provider/provider_cuda.c + provider/provider_devdax_memory.c + provider/provider_file_memory.c + provider/provider_level_zero.c + provider/provider_os_memory.c provider/provider_tracking.c critnib/critnib.c ravl/ravl.c @@ -118,62 +128,35 @@ set(UMF_SOURCES pool/pool_scalable.c) if(NOT UMF_DISABLE_HWLOC) - set(UMF_SOURCES ${UMF_SOURCES} ${HWLOC_DEPENDENT_SOURCES}) + set(UMF_SOURCES ${UMF_SOURCES} ${HWLOC_DEPENDENT_SOURCES} + memtargets/memtarget_numa.c) + set(UMF_LIBS ${UMF_LIBS} ${LIBHWLOC_LIBRARIES}) + set(UMF_PRIVATE_LIBRARY_DIRS ${UMF_PRIVATE_LIBRARY_DIRS} + ${LIBHWLOC_LIBRARY_DIRS}) +else() + set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS} + "UMF_NO_HWLOC=1") endif() set(UMF_SOURCES_LINUX libumf_linux.c) - set(UMF_SOURCES_MACOSX libumf_linux.c) - set(UMF_SOURCES_WINDOWS libumf_windows.c) -set(UMF_SOURCES_COMMON_LINUX_MACOSX - provider/provider_devdax_memory.c - provider/provider_file_memory.c - provider/provider_os_memory.c - memtargets/memtarget_numa.c - memspaces/memspace_numa.c - memspaces/memspace_host_all.c - memspaces/memspace_highest_capacity.c - memspaces/memspace_highest_bandwidth.c - memspaces/memspace_lowest_latency.c) - -if(NOT UMF_DISABLE_HWLOC) - set(UMF_SOURCES_LINUX ${UMF_SOURCES_LINUX} - ${UMF_SOURCES_COMMON_LINUX_MACOSX}) - - set(UMF_SOURCES_MACOSX ${UMF_SOURCES_MACOSX} - ${UMF_SOURCES_COMMON_LINUX_MACOSX}) - - set(UMF_SOURCES_WINDOWS ${UMF_SOURCES_WINDOWS} - provider/provider_os_memory.c) - - set(UMF_LIBS ${UMF_LIBS} ${LIBHWLOC_LIBRARIES}) - - if(NOT WINDOWS) - add_optional_symbol(umfMemspaceCreateFromNumaArray) - add_optional_symbol(umfMemspaceHighestBandwidthGet) - add_optional_symbol(umfMemspaceHighestCapacityGet) - add_optional_symbol(umfMemspaceHostAllGet) - add_optional_symbol(umfMemspaceLowestLatencyGet) - endif() +# Add compile definitions to handle unsupported functions +if(NOT UMF_BUILD_CUDA_PROVIDER) + set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS} + "UMF_NO_CUDA_PROVIDER=1") endif() - -if(WINDOWS) - message(STATUS "UMF_OPTIONAL_SYMBOLS: ${UMF_OPTIONAL_SYMBOLS_WINDOWS}") -else() - message(STATUS "UMF_OPTIONAL_SYMBOLS: ${UMF_OPTIONAL_SYMBOLS_LINUX}") +if(NOT UMF_BUILD_LEVEL_ZERO_PROVIDER) + set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS} + "UMF_NO_LEVEL_ZERO_PROVIDER=1") +endif() +if(UMF_DISABLE_HWLOC OR WINDOWS) + set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS} + "UMF_NO_DEVDAX_PROVIDER=1") + set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS} + "UMF_NO_FILE_PROVIDER=1") endif() - -# Configure map/def files with optional symbols -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/libumf.def.in" - "${CMAKE_CURRENT_BINARY_DIR}/libumf.def" @ONLY) - -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/libumf.map.in" - "${CMAKE_CURRENT_BINARY_DIR}/libumf.map" @ONLY) - -set(UMF_PRIVATE_LIBRARY_DIRS ${UMF_PRIVATE_LIBRARY_DIRS} - ${LIBHWLOC_LIBRARY_DIRS}) if(LINUX) set(UMF_SOURCES ${UMF_SOURCES} ${UMF_SOURCES_LINUX}) @@ -198,8 +181,8 @@ if(UMF_BUILD_SHARED_LIBRARY) TYPE SHARED SRCS ${UMF_SOURCES} LIBS ${UMF_LIBS} ${HWLOC_LIB} - LINUX_MAP_FILE ${CMAKE_CURRENT_BINARY_DIR}/libumf.map - WINDOWS_DEF_FILE ${CMAKE_CURRENT_BINARY_DIR}/libumf.def) + LINUX_MAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libumf.map + WINDOWS_DEF_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libumf.def) set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS} "UMF_SHARED_LIBRARY") set_target_properties( @@ -215,11 +198,6 @@ else() LIBS ${UMF_LIBS}) endif() -if(UMF_DISABLE_HWLOC) - set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS} - UMF_NO_HWLOC=1) -endif() - if(UMF_LINK_HWLOC_STATICALLY) add_dependencies(umf ${UMF_HWLOC_NAME}) endif() @@ -229,8 +207,6 @@ target_link_directories(umf PRIVATE ${UMF_PRIVATE_LIBRARY_DIRS}) target_compile_definitions(umf PRIVATE ${UMF_COMMON_COMPILE_DEFINITIONS}) if(UMF_BUILD_LEVEL_ZERO_PROVIDER) - target_sources(umf PRIVATE provider/provider_level_zero.c) - if(LINUX) # WA for error ze_api.h:14234:20: no newline at end of file # [-Werror,-Wnewline-eof] @@ -244,7 +220,6 @@ if(UMF_BUILD_LEVEL_ZERO_PROVIDER) endif() if(UMF_BUILD_CUDA_PROVIDER) - target_sources(umf PRIVATE provider/provider_cuda.c) set(UMF_COMPILE_DEFINITIONS ${UMF_COMPILE_DEFINITIONS} "UMF_BUILD_CUDA_PROVIDER=1") endif() diff --git a/src/libumf.def.in b/src/libumf.def similarity index 85% rename from src/libumf.def.in rename to src/libumf.def index 01aaa7e68..979187d96 100644 --- a/src/libumf.def.in +++ b/src/libumf.def @@ -16,10 +16,13 @@ EXPORTS umfCloseIPCHandle umfCoarseMemoryProviderGetStats umfCoarseMemoryProviderOps + umfCUDAMemoryProviderOps + umfDevDaxMemoryProviderOps umfFree + umfFileMemoryProviderOps umfGetIPCHandle umfGetLastFailedMemoryProvider - umfMemoryTrackerGetAllocInfo + umfLevelZeroMemoryProviderOps umfMemoryProviderAlloc umfMemoryProviderAllocationMerge umfMemoryProviderAllocationSplit @@ -38,14 +41,20 @@ EXPORTS umfMemoryProviderPurgeForce umfMemoryProviderPurgeLazy umfMemoryProviderPutIPCHandle + umfMemoryTrackerGetAllocInfo umfMempolicyCreate umfMempolicyDestroy umfMempolicySetCustomSplitPartitions umfMempolicySetInterleavePartSize umfMemspaceClone + umfMemspaceCreateFromNumaArray umfMemspaceDestroy umfMemspaceFilterByCapacity umfMemspaceFilterById + umfMemspaceHighestBandwidthGet + umfMemspaceHighestCapacityGet + umfMemspaceHostAllGet + umfMemspaceLowestLatencyGet umfMemspaceMemtargetAdd umfMemspaceMemtargetGet umfMemspaceMemtargetNum @@ -55,7 +64,8 @@ EXPORTS umfMemtargetGetCapacity umfMemtargetGetId umfMemtargetGetType - umfOpenIPCHandle + umfOpenIPCHandle + umfOsMemoryProviderOps umfPoolAlignedMalloc umfPoolByPtr umfPoolCalloc @@ -72,4 +82,3 @@ EXPORTS umfProxyPoolOps umfPutIPCHandle umfScalablePoolOps - @UMF_OPTIONAL_SYMBOLS_WINDOWS@ diff --git a/src/libumf.map.in b/src/libumf.map similarity index 86% rename from src/libumf.map.in rename to src/libumf.map index 9999d882c..bfca09a27 100644 --- a/src/libumf.map.in +++ b/src/libumf.map @@ -10,10 +10,13 @@ UMF_1.0 { umfCloseIPCHandle; umfCoarseMemoryProviderGetStats; umfCoarseMemoryProviderOps; + umfCUDAMemoryProviderOps; + umfDevDaxMemoryProviderOps; umfFree; + umfFileMemoryProviderOps; umfGetIPCHandle; umfGetLastFailedMemoryProvider; - umfMemoryTrackerGetAllocInfo; + umfLevelZeroMemoryProviderOps; umfMemoryProviderAlloc; umfMemoryProviderAllocationMerge; umfMemoryProviderAllocationSplit; @@ -32,14 +35,20 @@ UMF_1.0 { umfMemoryProviderPurgeForce; umfMemoryProviderPurgeLazy; umfMemoryProviderPutIPCHandle; + umfMemoryTrackerGetAllocInfo; umfMempolicyCreate; umfMempolicyDestroy; umfMempolicySetCustomSplitPartitions; umfMempolicySetInterleavePartSize; umfMemspaceClone; + umfMemspaceCreateFromNumaArray; umfMemspaceDestroy; umfMemspaceFilterByCapacity; umfMemspaceFilterById; + umfMemspaceHighestBandwidthGet; + umfMemspaceHighestCapacityGet; + umfMemspaceHostAllGet; + umfMemspaceLowestLatencyGet; umfMemspaceMemtargetAdd; umfMemspaceMemtargetGet; umfMemspaceMemtargetNum; @@ -50,6 +59,7 @@ UMF_1.0 { umfMemtargetGetId; umfMemtargetGetType; umfOpenIPCHandle; + umfOsMemoryProviderOps; umfPoolAlignedMalloc; umfPoolByPtr; umfPoolCalloc; @@ -66,7 +76,6 @@ UMF_1.0 { umfProxyPoolOps; umfPutIPCHandle; umfScalablePoolOps; - @UMF_OPTIONAL_SYMBOLS_LINUX@ local: *; }; diff --git a/src/memspaces/memspace_highest_bandwidth.c b/src/memspaces/memspace_highest_bandwidth.c index a6ea558d7..93fede2cd 100644 --- a/src/memspaces/memspace_highest_bandwidth.c +++ b/src/memspaces/memspace_highest_bandwidth.c @@ -11,6 +11,20 @@ #include #include +#include +#include + +// UMF_MEMSPACE_HIGHEST_BANDWIDTH requires HWLOC +// Additionally, it is currently unsupported on Win +#if defined(_WIN32) || defined(UMF_NO_HWLOC) + +umf_const_memspace_handle_t umfMemspaceHighestBandwidthGet(void) { + // not supported + return NULL; +} + +#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC) + #include "base_alloc_global.h" #include "memspace_internal.h" #include "memtarget_numa.h" @@ -100,3 +114,5 @@ umf_const_memspace_handle_t umfMemspaceHighestBandwidthGet(void) { umfMemspaceHighestBandwidthInit); return UMF_MEMSPACE_HIGHEST_BANDWIDTH; } + +#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC) diff --git a/src/memspaces/memspace_highest_capacity.c b/src/memspaces/memspace_highest_capacity.c index 8a4e19148..4a195316a 100644 --- a/src/memspaces/memspace_highest_capacity.c +++ b/src/memspaces/memspace_highest_capacity.c @@ -10,6 +10,20 @@ #include #include +#include +#include + +// UMF_MEMSPACE_HIGHEST_CAPACITY requires HWLOC +// Additionally, it is currently unsupported on Win +#if defined(_WIN32) || defined(UMF_NO_HWLOC) + +umf_const_memspace_handle_t umfMemspaceHighestCapacityGet(void) { + // not supported + return NULL; +} + +#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC) + #include "base_alloc_global.h" #include "memspace_internal.h" #include "memtarget_numa.h" @@ -72,3 +86,5 @@ umf_const_memspace_handle_t umfMemspaceHighestCapacityGet(void) { umfMemspaceHighestCapacityInit); return UMF_MEMSPACE_HIGHEST_CAPACITY; } + +#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC) diff --git a/src/memspaces/memspace_host_all.c b/src/memspaces/memspace_host_all.c index 09d5877c3..4b7db69d4 100644 --- a/src/memspaces/memspace_host_all.c +++ b/src/memspaces/memspace_host_all.c @@ -10,6 +10,20 @@ #include #include +#include +#include + +// UMF_MEMSPACE_HOST_ALL requires HWLOC +// Additionally, it is currently unsupported on Win + +#if defined(_WIN32) || defined(UMF_NO_HWLOC) +umf_const_memspace_handle_t umfMemspaceHostAllGet(void) { + // not supported + return NULL; +} + +#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC) + #include "base_alloc_global.h" #include "memspace_internal.h" #include "memtarget_numa.h" @@ -93,3 +107,5 @@ umf_const_memspace_handle_t umfMemspaceHostAllGet(void) { utils_init_once(&UMF_MEMSPACE_HOST_ALL_INITIALIZED, umfMemspaceHostAllInit); return UMF_MEMSPACE_HOST_ALL; } + +#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC) diff --git a/src/memspaces/memspace_lowest_latency.c b/src/memspaces/memspace_lowest_latency.c index 52f8e7f36..5ca369fee 100644 --- a/src/memspaces/memspace_lowest_latency.c +++ b/src/memspaces/memspace_lowest_latency.c @@ -11,6 +11,20 @@ #include #include +#include +#include + +// UMF_MEMSPACE_LOWEST_LATENCY requires HWLOC +// Additionally, it is currently unsupported on Win +#if defined(_WIN32) || defined(UMF_NO_HWLOC) + +umf_const_memspace_handle_t umfMemspaceLowestLatencyGet(void) { + // not supported + return NULL; +} + +#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC) + #include "base_alloc_global.h" #include "memspace_internal.h" #include "memtarget_numa.h" @@ -100,3 +114,5 @@ umf_const_memspace_handle_t umfMemspaceLowestLatencyGet(void) { umfMemspaceLowestLatencyInit); return UMF_MEMSPACE_LOWEST_LATENCY; } + +#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC) diff --git a/src/memspaces/memspace_numa.c b/src/memspaces/memspace_numa.c index 306851d7c..0028e394d 100644 --- a/src/memspaces/memspace_numa.c +++ b/src/memspaces/memspace_numa.c @@ -9,6 +9,24 @@ #include +#include +#include + +// umfMemspaceCreateFromNumaArray requires HWLOC +// Additionally, it is currently unsupported on Win +#if defined(_WIN32) || defined(UMF_NO_HWLOC) +umf_result_t umfMemspaceCreateFromNumaArray(unsigned *nodeIds, size_t numIds, + umf_memspace_handle_t *hMemspace) { + (void)nodeIds; + (void)numIds; + (void)hMemspace; + + // not supported + return UMF_RESULT_ERROR_NOT_SUPPORTED; +} + +#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC) + #include "../memspace_internal.h" #include "../memtargets/memtarget_numa.h" #include "base_alloc_global.h" @@ -57,3 +75,5 @@ umf_result_t umfMemspaceCreateFromNumaArray(unsigned *nodeIds, size_t numIds, umf_ba_global_free(memspace); return ret; } + +#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC) diff --git a/src/provider/provider_cuda.c b/src/provider/provider_cuda.c index 22dfc49f1..85d6d9b79 100644 --- a/src/provider/provider_cuda.c +++ b/src/provider/provider_cuda.c @@ -12,6 +12,15 @@ #include #include +#if defined(UMF_NO_CUDA_PROVIDER) + +umf_memory_provider_ops_t *umfCUDAMemoryProviderOps(void) { + // not supported + return NULL; +} + +#else // !defined(UMF_NO_CUDA_PROVIDER) + #include "cuda.h" #include "base_alloc_global.h" @@ -370,3 +379,5 @@ static struct umf_memory_provider_ops_t UMF_CUDA_MEMORY_PROVIDER_OPS = { umf_memory_provider_ops_t *umfCUDAMemoryProviderOps(void) { return &UMF_CUDA_MEMORY_PROVIDER_OPS; } + +#endif // !defined(UMF_NO_CUDA_PROVIDER) diff --git a/src/provider/provider_devdax_memory.c b/src/provider/provider_devdax_memory.c index 0127f75ae..544960995 100644 --- a/src/provider/provider_devdax_memory.c +++ b/src/provider/provider_devdax_memory.c @@ -13,15 +13,24 @@ #include #include +#include +#include +#include + +#if defined(_WIN32) || defined(UMF_NO_HWLOC) + +umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) { + // not supported + return NULL; +} + +#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC) + #include "base_alloc_global.h" #include "utils_common.h" #include "utils_concurrency.h" #include "utils_log.h" -#include -#include -#include - #define NODESET_STR_BUF_LEN 1024 #define TLS_MSG_BUF_LEN 1024 @@ -528,3 +537,5 @@ static umf_memory_provider_ops_t UMF_DEVDAX_MEMORY_PROVIDER_OPS = { umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) { return &UMF_DEVDAX_MEMORY_PROVIDER_OPS; } + +#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC) diff --git a/src/provider/provider_file_memory.c b/src/provider/provider_file_memory.c index b89e6bd86..bb8cad2e3 100644 --- a/src/provider/provider_file_memory.c +++ b/src/provider/provider_file_memory.c @@ -14,16 +14,25 @@ #include #include +#include +#include +#include + +#if defined(_WIN32) || defined(UMF_NO_HWLOC) + +umf_memory_provider_ops_t *umfFileMemoryProviderOps(void) { + // not supported + return NULL; +} + +#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC) + #include "base_alloc_global.h" #include "critnib.h" #include "utils_common.h" #include "utils_concurrency.h" #include "utils_log.h" -#include -#include -#include - #define TLS_MSG_BUF_LEN 1024 typedef struct file_memory_provider_t { @@ -696,3 +705,5 @@ static umf_memory_provider_ops_t UMF_FILE_MEMORY_PROVIDER_OPS = { umf_memory_provider_ops_t *umfFileMemoryProviderOps(void) { return &UMF_FILE_MEMORY_PROVIDER_OPS; } + +#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC) diff --git a/src/provider/provider_level_zero.c b/src/provider/provider_level_zero.c index 6b6cc2e2c..3f122cd6a 100644 --- a/src/provider/provider_level_zero.c +++ b/src/provider/provider_level_zero.c @@ -14,6 +14,15 @@ #include #include +#if defined(UMF_NO_LEVEL_ZERO_PROVIDER) + +umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void) { + // not supported + return NULL; +} + +#else // !defined(UMF_NO_LEVEL_ZERO_PROVIDER) + #include "base_alloc_global.h" #include "utils_assert.h" #include "utils_common.h" @@ -564,3 +573,5 @@ static struct umf_memory_provider_ops_t UMF_LEVEL_ZERO_MEMORY_PROVIDER_OPS = { umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void) { return &UMF_LEVEL_ZERO_MEMORY_PROVIDER_OPS; } + +#endif // !defined(UMF_NO_LEVEL_ZERO_PROVIDER) diff --git a/src/provider/provider_os_memory.c b/src/provider/provider_os_memory.c index 2279678b6..3318beef0 100644 --- a/src/provider/provider_os_memory.c +++ b/src/provider/provider_os_memory.c @@ -13,6 +13,17 @@ #include #include +#include +#include +#include + +// OS Memory Provider requires HWLOC +#if defined(UMF_NO_HWLOC) + +umf_memory_provider_ops_t *umfOsMemoryProviderOps(void) { return NULL; } + +#else // !defined(UMF_NO_HWLOC) + #include "base_alloc_global.h" #include "critnib.h" #include "provider_os_memory_internal.h" @@ -20,10 +31,6 @@ #include "utils_concurrency.h" #include "utils_log.h" -#include -#include -#include - #define NODESET_STR_BUF_LEN 1024 #define TLS_MSG_BUF_LEN 1024 @@ -1332,3 +1339,5 @@ static umf_memory_provider_ops_t UMF_OS_MEMORY_PROVIDER_OPS = { umf_memory_provider_ops_t *umfOsMemoryProviderOps(void) { return &UMF_OS_MEMORY_PROVIDER_OPS; } + +#endif // !defined(UMF_NO_HWLOC)