Files
TheRock/rocm-systems/projects/rocshmem/docs/api/memory_management.rst
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

206 lines
7.9 KiB
ReStructuredText

.. meta::
:description: rocSHMEM intra-kernel networking runtime for AMD dGPUs on the ROCm platform.
:keywords: rocSHMEM, API, ROCm, documentation, HIP, Networking, Communication
.. _rocshmem-api-memory-management:
---------------------------
Memory management routines
---------------------------
ROCSHMEM_MALLOC
---------------
.. cpp:function:: __host__ void *rocshmem_malloc(size_t size)
:param size: Memory allocation size in bytes.
:returns: A pointer to the allocated memory on the symmetric heap.
If a valid allocation cannot be made, it returns ``NULL``.
**Description:**
This routine allocates memory of ``size`` bytes from the symmetric heap.
This is a collective operation and must be called by all PEs.
ROCSHMEM_ALIGN
--------------
.. cpp:function:: __host__ void *rocshmem_align(size_t alignment, size_t size)
:param alignment: Required pointer alignment in bytes. Must be a power of
two **and** a multiple of ``sizeof(void *)``.
:param size: Memory allocation size in bytes.
:returns: A pointer to the allocated memory on the symmetric heap, aligned
to ``alignment`` bytes. Returns ``NULL`` if ``alignment`` is
invalid (not a power of two, or not a multiple of
``sizeof(void *)``) or if the allocation cannot be satisfied.
**Description:**
This routine allocates ``size`` bytes from the symmetric heap and returns a
pointer that is aligned to ``alignment`` bytes. It is a collective operation
and must be called by all PEs with identical ``alignment`` and ``size``
arguments.
Constraints on ``alignment`` (mirroring OpenSHMEM ``shmem_align`` and POSIX
``posix_memalign`` semantics):
* ``alignment`` must be a power of two.
* ``alignment`` must be a multiple of ``sizeof(void *)``.
Any power of two that is at least ``sizeof(void *)`` (8 bytes on a 64-bit
build) automatically satisfies both rules. The smallest accepted value is
therefore ``sizeof(void *)``; accepted values are
``sizeof(void *), 2*sizeof(void *), 4*sizeof(void *), ...``.
Invalid values (``0``, ``1``, ``2``, ``4`` on 64-bit, or any non
power-of-two) cause the routine to return ``NULL`` and emit a warning. The
collective barrier is still entered so other PEs do not deadlock.
Notes:
* ``alignment`` values less than or equal to the default symmetric-heap
alignment (128 bytes) yield a 128-byte aligned pointer, identical to
:ref:`rocshmem_malloc`.
ROCSHMEM_CALLOC
---------------
.. cpp:function:: __host__ void *rocshmem_calloc(size_t count, size_t size)
:param count: Number of elements.
:param size: Size of each element in bytes.
:returns: A pointer to ``count * size`` bytes of zero-initialized memory
on the symmetric heap, or ``NULL`` if ``count`` or ``size`` is
``0``, if ``count * size`` overflows ``size_t``, or if the
allocation cannot be satisfied.
**Description:**
This routine allocates memory for an array of ``count`` elements of ``size``
bytes each from the symmetric heap and zero-initializes the allocation.
It is a collective operation and must be called by all PEs with identical
``count`` and ``size`` arguments.
The returned pointer satisfies the same default symmetric-heap alignment as
:ref:`rocshmem_malloc`. Mirrors OpenSHMEM ``shmem_calloc`` semantics.
Notes:
* If ``count`` is ``0``, ``size`` is ``0``, or ``count * size`` would
overflow ``size_t``, this routine returns ``NULL`` (and emits a warning
for the overflow case). The collective barrier is still entered on every
return path so other PEs do not deadlock.
ROCSHMEM_FREE
-------------
.. cpp:function:: __host__ void rocshmem_free(void *ptr)
:param ptr: A pointer to previously allocated memory on the symmetric heap.
:returns: None.
**Description:**
This routine frees a memory allocation from the symmetric heap.
It is a collective operation and must be called by all PEs.
ROCSHMEM_BUFFER_REGISTER
------------------------
.. cpp:function:: __host__ int rocshmem_buffer_register(void *addr, size_t length);
:param addr: Pointer to previously allocated memory
:param length: Length of addr
:returns: ROCSHMEM_SUCCESS or an error.
**Description:**
Registers a user-allocated buffer. This buffer can be used as a local
buffer to most rocSHMEM communication calls. It is erroneous to use it for a
remote buffer.
ROCSHMEM_BUFFER_UNREGISTER
--------------------------
.. cpp:function:: __host__ int rocshmem_buffer_unregister(void *addr);
:param addr: Pointer to previously registered memory
:returns: ROCSHMEM_SUCCESS or an error.
**Description:**
Deregisters a previously registered buffer that was registered using
`rocshmem_buffer_register`.
ROCSHMEM_BUFFER_UNREGISTER_ALL
------------------------------
.. cpp:function:: __host__ void rocshmem_buffer_unregister_all();
**Description:**
Deregisters all buffers that were previously registered using
`rocshmem_buffer_register`.
ROCSHMEM_BUFFER_REGISTER_SYMMETRIC
----------------------------------
.. cpp:function:: __host__ void *rocshmem_buffer_register_symmetric(void *addr, size_t length);
:param addr: Pointer to previously allocated VMM memory.
:param length: Length of ``addr`` in bytes.
:returns: The rocSHMEM-managed symmetric address on success, ``NULL``
otherwise.
**Description:**
Registers a user-allocated buffer so that it can be used as the remote target
of RMA operations. Unlike :ref:`rocshmem_buffer_register`, this is a
**collective** operation that must be called by all PEs with a buffer of the
same ``length``.
The call maps the user's buffer to a rocSHMEM-managed virtual address and
returns it. That returned address (**not** ``addr``) is the symmetric handle
the caller must use as the target for RMA routines, and the same address must
later be passed to :ref:`rocshmem_buffer_unregister_symmetric`.
Notes:
* This routine is restricted to memory allocated through the HIP
Virtual Memory Management (VMM) APIs (ROCm 7.0 or newer). Passing a non-VMM
pointer returns ``NULL``.
* Each PE may supply a different underlying buffer, but all PEs must agree on
``length`` and on the buffer's alignment so the region is symmetric across
the job.
* The underlying buffer ranges must not overlap a region that is already
registered.
* The maximum number of concurrently registered symmetric buffers is bounded
by the ``ROCSHMEM_MAX_SYMM_REGIONS`` environment variable.
Backend behavior:
* **IPC backend:** peer buffers are mapped into the local address space, so
registered buffers are reached directly through inter-process copies.
* **GDA backend:** registered buffers are registered with each NIC's
protection domain and are reachable over the NIC by every peer. When the IPC
fast path is additionally available for node-local peers (see
``ROCSHMEM_DISABLE_MIXED_IPC``), the buffer is also exposed to those peers
over IPC, and their accesses use the IPC path in preference to the NIC; the
NIC registration remains in place and is used for all other peers.
* **RO (reverse offload) backend:** symmetric user-buffer registration is not
supported; this routine returns ``NULL``.
ROCSHMEM_BUFFER_UNREGISTER_SYMMETRIC
------------------------------------
.. cpp:function:: __host__ int rocshmem_buffer_unregister_symmetric(void *addr);
:param addr: The symmetric address returned by
``rocshmem_buffer_register_symmetric``.
:returns: ROCSHMEM_SUCCESS on success, ROCSHMEM_ERROR otherwise.
**Description:**
Deregisters a buffer that was previously registered using
:ref:`rocshmem_buffer_register_symmetric`. This is a **collective** operation
that must be called by all PEs that participated in the matching
``rocshmem_buffer_register_symmetric`` call.
The ``addr`` argument must be the rocSHMEM-managed symmetric address returned by
``rocshmem_buffer_register_symmetric`` (not the caller's original buffer
pointer). The call unmaps the rocSHMEM-managed virtual address; the user's
original buffer is left untouched.