| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
The Unified Memory Framework (UMF) is a library for constructing allocators and memory pools. It also contains broadly useful abstractions and utilities for memory management. UMF allows users to manage multiple memory pools characterized by different attributes, allowing certain allocation types to be isolated from others and allocated using different hardware resources as required.
For a quick introduction to UMF usage, please see examples documentation, which includes the code of the basic example. There are also more advanced examples that allocate USM memory from the Level Zero device using the Level Zero API and UMF Level Zero memory provider and CUDA device using the CUDA API and UMF CUDA memory provider.
UMF's experimental CTL API is showcased in the CTL example, which explores provider and pool statistics, and in the custom CTL example, which wires CTL support into a custom memory provider. These examples rely on experimental headers which may change in future releases.
Required packages:
For development and contributions:
Note: All devs dependencies are defined in third-party/requirements.txt and can be installed, for example: pip install -r third_party/requirements.txt.
For building tests and multithreaded benchmarks:
For Level Zero memory provider tests:
Executable and binaries will be in build/bin. The {build_config} can be either Debug or Release.
cmake -B build -DCMAKE_BUILD_TYPE={build_config}
cmake --build build -j $(nproc)Generating Visual Studio Project. EXE and binaries will be in build/bin/{build_config}. The {build_config} can be either Debug or Release.
cmake -B build -G "Visual Studio 15 2017 Win64"
cmake --build build --config {build_config} -j $Env:NUMBER_OF_PROCESSORSUMF comes with a single-threaded micro benchmark based on ubench. In order to build the benchmark, the UMF_BUILD_BENCHMARKS CMake configuration flag has to be turned ON.
UMF also provides multithreaded benchmarks that can be enabled by setting both UMF_BUILD_BENCHMARKS and UMF_BUILD_BENCHMARKS_MT CMake configuration flags to ON. Multithreaded benchmarks require C++ support.
The Scalable Pool requirements can be found in the relevant 'Memory Pool managers' section below.
List of sanitizers available on Linux:
List of sanitizers available on Windows:
Listed sanitizers can be enabled with appropriate CMake options.
To enable fuzz testing, the UMF_BUILD_FUZZTESTS CMake configuration flag must be set to ON. Note, that this feature is supported only on Linux and requires Clang. Additionally, ensure that the CMAKE_PREFIX_PATH includes the directory containing the libraries necessary for fuzzing (e.g., Clang's libclang_rt.fuzzer_no_main-x86_64.a).
Example:
cmake -B build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Debug -DUMF_BUILD_FUZZTESTS=ON -DCMAKE_PREFIX_PATH=/path/to/fuzzer/libsList of options provided by CMake:
| Name | Description | Values | Default |
|---|---|---|---|
| UMF_BUILD_SHARED_LIBRARY | Build UMF as shared library | ON/OFF | OFF |
| UMF_BUILD_LEVEL_ZERO_PROVIDER | Build Level Zero memory provider | ON/OFF | ON |
| UMF_BUILD_CUDA_PROVIDER | Build CUDA memory provider | ON/OFF | ON |
| UMF_BUILD_LIBUMF_POOL_JEMALLOC | Build the libumf_pool_jemalloc static library | ON/OFF | OFF |
| UMF_BUILD_TESTS | Build UMF tests | ON/OFF | ON |
| UMF_BUILD_GPU_TESTS | Build UMF GPU tests | ON/OFF | OFF |
| UMF_BUILD_BENCHMARKS | Build UMF benchmarks | ON/OFF | OFF |
| UMF_BUILD_EXAMPLES | Build UMF examples | ON/OFF | ON |
| UMF_BUILD_FUZZTESTS | Build UMF fuzz tests (supported only on Linux with Clang) | ON/OFF | OFF |
| UMF_BUILD_GPU_EXAMPLES | Build UMF GPU examples | ON/OFF | OFF |
| UMF_DEVELOPER_MODE | Enable additional developer checks and logs | ON/OFF | OFF |
| UMF_FORMAT_CODE_STYLE | Add clang, cmake, and black -format-check and -format-apply targets to make | ON/OFF | OFF |
| UMF_TESTS_FAIL_ON_SKIP | Treat skips in tests as fail | ON/OFF | OFF |
| UMF_USE_ASAN | Enable AddressSanitizer checks | ON/OFF | OFF |
| UMF_USE_UBSAN | Enable UndefinedBehaviorSanitizer checks | ON/OFF | OFF |
| UMF_USE_TSAN | Enable ThreadSanitizer checks | ON/OFF | OFF |
| UMF_USE_MSAN | Enable MemorySanitizer checks | ON/OFF | OFF |
| UMF_USE_VALGRIND | Enable Valgrind instrumentation | ON/OFF | OFF |
| UMF_USE_COVERAGE | Build with coverage enabled (Linux only) | ON/OFF | OFF |
| UMF_LINK_HWLOC_STATICALLY | Link UMF with HWLOC library statically (proxy library will be disabled on Windows+Debug build) | ON/OFF | OFF |
A UMF memory pool is a combination of a pool allocator and a memory provider. A memory provider is responsible for coarse-grained memory allocations and management of memory pages, while the pool allocator controls memory pooling and handles fine-grained memory allocations.
Pool allocator can leverage existing allocators (e.g. jemalloc or tbbmalloc) or be written from scratch.
UMF comes with predefined pool allocators (see include/umf/pools) and providers (see include/umf/providers). UMF can also work with user-defined pools and providers that implement a specific interface (see include/umf/memory_pool_ops.h and include/umf/memory_provider_ops.h).
More detailed documentation is available here: https://oneapi-src.github.io/unified-memory-framework/
A memory provider that can provide memory from a given pre-allocated buffer.
A memory provider that provides memory from an operating system.
OS memory provider supports two types of memory mappings (set by the visibility parameter):
IPC API requires the UMF_MEM_MAP_SHARED memory visibility mode (UMF_RESULT_ERROR_INVALID_ARGUMENT is returned otherwise).
IPC API uses file descriptor duplication, which requires the pidfd_getfd(2) system call to obtain a duplicate of another process's file descriptor. This system call is supported since Linux 5.6. Required permission ("restricted ptrace") is governed by the PTRACE_MODE_ATTACH_REALCREDS check (see ptrace(2)). To allow file descriptor duplication in a binary that opens IPC handle, you can call prctl(PR_SET_PTRACER, ...) in the producer binary that gets the IPC handle. Alternatively you can change the ptrace_scope globally in the system, e.g.:
sudo bash -c "echo 0 > /proc/sys/kernel/yama/ptrace_scope"There are available two mechanisms for the shared memory mapping:
The shm_name parameter should be a null-terminated string of up to NAME_MAX (i.e., 255) characters none of which are slashes.
An anonymous file descriptor for the shared memory mapping will be created using:
IPC API on Linux requires the PTRACE_MODE_ATTACH_REALCREDS permission (see ptrace(2)) to duplicate another process's file descriptor (see above).
Packages required for tests (Linux-only yet):
A memory provider that provides memory from L0 device.
IPC API uses file descriptor duplication, which requires the pidfd_getfd(2) system call to obtain a duplicate of another process's file descriptor. This system call is supported since Linux 5.6. Required permission ("restricted ptrace") is governed by the PTRACE_MODE_ATTACH_REALCREDS check (see ptrace(2)). To allow file descriptor duplication in a binary that opens IPC handle, you can call prctl(PR_SET_PTRACER, ...) in the producer binary that gets the IPC handle. Alternatively you can change the ptrace_scope globally in the system, e.g.:
sudo bash -c "echo 0 > /proc/sys/kernel/yama/ptrace_scope"Additionally, required for tests:
A memory provider that provides memory from a device DAX (a character device file like /dev/daxX.Y). It can be used when large memory mappings are needed.
A memory provider that provides memory by mapping a regular, extendable file.
IPC API requires the UMF_MEM_MAP_SHARED memory visibility mode (UMF_RESULT_ERROR_INVALID_ARGUMENT is returned otherwise).
The memory visibility mode parameter must be set to UMF_MEM_MAP_SHARED in case of FSDAX.
A memory provider that provides memory from CUDA device.
Additionally, required for tests:
This memory pool is distributed as part of libumf. It forwards all requests to the underlying memory provider. Currently umfPoolRealloc, umfPoolCalloc and umfPoolMallocUsableSize functions are not supported by the proxy pool.
The Disjoint pool is designed to keep internal metadata separate from user data. This separation is particularly useful when user data needs to be placed in memory with relatively high latency, such as GPU memory or disk storage.
Jemalloc pool is a jemalloc-based memory pool manager built as a separate static library: libjemalloc_pool.a on Linux and jemalloc_pool.lib on Windows. The UMF_BUILD_LIBUMF_POOL_JEMALLOC option has to be turned ON to build this library.
jemalloc is required to build the jemalloc pool.
In case of Linux OS jemalloc is built from the (fetched) sources with the following non-default options enabled:
The default jemalloc package is required on Windows.
Scalable Pool is a oneTBB-based memory pool manager. It is distributed as part of libumf. To use this pool, TBB must be installed in the system.
Packages required for using this pool and executing tests/benchmarks (not required for build):
Note: The memspace, memtarget and mempolicy APIs are experimental and may change in future releases.
TODO: Add general information about memspaces.
Memspace backed by all available NUMA nodes discovered on the platform. Can be retrieved using umfMemspaceHostAllGet.
Memspace backed by all available NUMA nodes discovered on the platform sorted by capacity. Can be retrieved using umfMemspaceHighestCapacityGet.
Memspace backed by an aggregated list of NUMA nodes identified as highest bandwidth after selecting each available NUMA node as the initiator. Querying the bandwidth value requires HMAT support on the platform. Calling umfMemspaceHighestBandwidthGet() will return NULL if it's not supported.
Memspace backed by an aggregated list of NUMA nodes identified as lowest latency after selecting each available NUMA node as the initiator. Querying the latency value requires HMAT support on the platform. Calling umfMemspaceLowestLatencyGet() will return NULL if it's not supported.
UMF provides the UMF proxy library (umf_proxy) that makes it possible to override the default allocator in other programs in both Linux and Windows.
To enable this feature, the UMF_BUILD_SHARED_LIBRARY option needs to be turned ON.
In case of Linux it can be done without any code changes using the LD_PRELOAD environment variable:
LD_PRELOAD=/usr/lib/libumf_proxy.so myprogramThe memory used by the proxy memory allocator is mmap'ed:
Size threshold
The size threshold feature (Linux only) causes that all allocations of size less than the given threshold value go to the default system allocator instead of the proxy library. It can be enabled by adding the size.threshold=<value> string to the UMF_PROXY environment variable (with ';' as a separator), for example: UMF_PROXY="page.disposition=shared-shm;size.threshold=64".
Remark: changing a size of allocation (using realloc() ) does not change the allocator (realloc(malloc(threshold - 1), threshold + 1) still belongs to the default system allocator and realloc(malloc(threshold + 1), threshold - 1) still belongs to the proxy library pool allocator).
In case of Windows it requires:
All contributions to the UMF project are most welcome! Before submitting an issue or a Pull Request, please read Contribution Guide.
To enable logging in UMF source files please follow the guide in the web documentation.
Integration of UMF into another project via CMake's FetchContent, is possible with:
include(FetchContent)
FetchContent_Declare(
unified-memory-framework
GIT_REPOSITORY https://github.com/oneapi-src/unified-memory-framework.git
GIT_TAG main # This will pull the latest (potentially unstable) changes from the main branch
)
FetchContent_MakeAvailable(unified-memory-framework)
add_executable(some_example some_example.cpp)
target_include_directories(some_example PRIVATE ${unified-memory-framework_SOURCE_DIR}/include)
target_link_libraries(some_example PRIVATE umf::umf umf::headers)The contents of this repository may have been developed with support from one or more Intel-operated generative artificial intelligence solutions.
| Back | FazBrowse Home | New Git URL |