Files
TheRock/rocm-systems/projects/rocprofiler-systems/docs/how-to/unified-memory-profiling.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

382 lines
13 KiB
ReStructuredText

.. meta::
:description: ROCm Systems Profiler unified memory profiling how-to guide
:keywords: rocprof-sys, rocprofiler-systems, ROCm, unified memory, managed memory, KFD, XNACK, page fault, page migration, profiling
****************************************************
Unified memory profiling
****************************************************
ROCm Systems Profiler can generate unified memory profiling reports from KFD
page fault and page migration events. Use this feature with HIP managed memory workloads. For example, workloads that use:
* ``hipMallocManaged`` for dynamic managed memory allocation
* ``__managed__`` variables for static managed memory, or
* Managed memory abstractions built on those HIP features.
This feature helps you understand:
* Page faults
* Migration triggers, and
* Effective migration throughput between host and device memory.
Unified memory profiling generates two summary files, in addition to the standard trace or database outputs. By default, ROCm Systems Profiler appends the process ID to the output file names. The reports are saved as: ``unified_memory-<pid>.txt``
and ``unified_memory-<pid>.json``:
* ``unified_memory-<pid>.txt``: Human-readable per-GPU migration and page-fault
summary.
* ``unified_memory-<pid>.json``: Machine-readable equivalent for validation,
scripting, and dashboards.
Prerequisites
=============
Unified memory profiling requires:
* An XNACK-capable AMD GPU.
* ``HSA_XNACK=1`` in the target application's environment.
* ROCm 7.13 or later. For standalone `ROCprofiler-SDK <https://rocm.docs.amd.com/projects/rocprofiler-sdk/en/latest/index.html>`_ installations, ROCProfiler-SDK 1.2.2 or later.
* A workload that produces KFD page fault or page migration events.
Check XNACK support with ``rocminfo``:
.. code-block:: shell
rocminfo | grep xnack
If the output contains ``xnack-``, XNACK is available but disabled. Enable it
before launching the profiled application:
.. code-block:: shell
export HSA_XNACK=1
Quick start
===========
To enable unified memory profiling, set the following environment variables:
``ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON``:
.. code-block:: shell
HSA_XNACK=1 \
ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON \
ROCPROFSYS_TRACE=ON \
rocprof-sys-run -- ./my_managed_memory_app
.. note::
``ROCPROFSYS_TRACE=ON`` enables Perfetto trace generation. This lets you view unified memory page fault and migration throughput tracks on a timeline. The
``unified_memory.txt`` and ``unified_memory.json`` summary reports are
enabled by ``ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON``.
The unified memory setting automatically enables the required KFD tracing
domains for page faults and page migrations. You don't need to add
``kfd_events`` to ``ROCPROFSYS_ROCM_DOMAINS`` separately.
Example workload
================
The ROCm Systems Profiler repository includes a HIP managed memory example in
`examples/unified-memory
<https://github.com/ROCm/rocm-systems/tree/develop/projects/rocprofiler-systems/examples/unified-memory>`_.
It runs access patterns that can trigger host-to-device migrations,
device-to-host migrations, prefetch-driven migrations, memory-pressure
behavior, and page faults.
If you don't already have a ``rocm-systems`` checkout, follow the sparse
checkout instructions in the `Unified memory example README
<https://github.com/ROCm/rocm-systems/tree/develop/projects/rocprofiler-systems/examples/unified-memory#readme>`_.
The README also contains the build command and the example's runtime arguments.
After building the example, profile it with unified memory profiling enabled:
.. code-block:: shell
HSA_XNACK=1 \
ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON \
ROCPROFSYS_TRACE=ON \
rocprof-sys-run -- ./build-unified-memory/unified-memory -s 32 -p 256 -i 4
.. tip::
The ``-s``, ``-p``, and ``-i`` options are specific to the unified-memory
example workload. See the `Unified memory example README
<https://github.com/ROCm/rocm-systems/tree/develop/projects/rocprofiler-systems/examples/unified-memory#readme>`_
for the full option table and default values.
Use ``ROCPROFSYS_UNIFIED_MEMORY_OUTPUT_PATH`` when you want a predictable output
directory for the unified memory text and JSON reports:
.. code-block:: shell
HSA_XNACK=1 \
ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON \
ROCPROFSYS_TRACE=ON \
ROCPROFSYS_UNIFIED_MEMORY_OUTPUT_PATH=ump-output \
rocprof-sys-run -- ./build-unified-memory/unified-memory -s 32 -p 256 -i 4
Set ``ROCPROFSYS_USE_PID=NO`` if you want stable output filenames without the
process ID suffix:
.. code-block:: shell
HSA_XNACK=1 \
ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON \
ROCPROFSYS_TRACE=ON \
ROCPROFSYS_UNIFIED_MEMORY_OUTPUT_PATH=ump-output \
ROCPROFSYS_USE_PID=NO \
rocprof-sys-run -- ./build-unified-memory/unified-memory -s 32 -p 256 -i 4
Output files
============
After a successful run, look in the ROCm Systems Profiler output directory for:
.. list-table::
:header-rows: 1
:widths: 30 70
* - File
- Contents
* - ``unified_memory-<pid>.txt``
- Text summary with per-device migration rows, total page faults, and
migration trigger counts.
* - ``unified_memory-<pid>.json``
- Structured summary with ``devices`` and ``summary`` objects.
* - ``perfetto-trace-<pid>.proto``
- Perfetto trace with unified memory page-fault counters and migration
throughput counters when migration events are present.
When ``ROCPROFSYS_USE_PID=NO`` is set, the unified memory report filenames are
``unified_memory.txt`` and ``unified_memory.json``. The Perfetto trace filename
is also written without a PID suffix as ``perfetto-trace.proto``.
.. note::
The ``rocpd`` database output is optional. When ``rocpd`` output is enabled (for
example, by including ``rocpd`` in ``--output-format``), the output directory
also contains ``rocpd-<pid>.db``.
Sample text output
==================
The following sample shows a discrete memory system with KFD page-migration
events. In the output prefix, ``12345`` is a placeholder for the profiled process ID:
.. code-block:: text
==12345== Unified Memory profiling result:
Device "gfx950 (via AMD EPYC 9655 96-Core Processor) (2)"
Count Avg Size Min Size Max Size Total Size Total Time Migration Throughput Name
36 11.4670MB 2.0000MB 173.4062MB 412.8125MB 827.8592ms 0.52 GB/s Host To Device
32 1.9375MB 4.0000KB 2.0000MB 62.0000MB 39.1353ms 1.66 GB/s Device To Host
Total Page Faults: 33
Migration Triggers:
GPU page fault: 30
CPU page fault: 2
Prefetch: 1
``Migration Throughput`` is calculated as migrated bytes divided by KFD
page-migration event duration. It is an end-to-end migration-service metric and
can include page-fault handling, scheduling, replay, and driver overhead. Don't
interpret it as raw PCIe, XGMI, SDMA, HBM, or memory-subsystem bandwidth.
Sample JSON output
==================
The JSON output uses the same information in a stable structure:
.. code-block:: json
{
"devices": [
{
"device_id": 2,
"device_name": "gfx950 (via AMD EPYC 9655 96-Core Processor)",
"migrations": {
"host_to_device": {
"count": 36,
"avg_size_bytes": 12024035.55,
"min_size_bytes": 2097152,
"max_size_bytes": 181829632,
"total_size_bytes": 432865280,
"total_time_ns": 827859200,
"migration_throughput_gbps": 0.52
},
"device_to_host": {
"count": 32,
"avg_size_bytes": 2031616,
"min_size_bytes": 4096,
"max_size_bytes": 2097152,
"total_size_bytes": 65011712,
"total_time_ns": 39135300,
"migration_throughput_gbps": 1.66
},
"device_to_device": {
"count": 0,
"avg_size_bytes": 0,
"min_size_bytes": 0,
"max_size_bytes": 0,
"total_size_bytes": 0,
"total_time_ns": 0,
"migration_throughput_gbps": 0
}
}
}
],
"summary": {
"total_page_faults": 33,
"xnack_enabled": true,
"migration_triggers": {
"gpu_page_fault": 30,
"cpu_page_fault": 2,
"prefetch": 1,
"ttm_eviction": 0,
"unknown": 0
}
}
}
Perfetto trace output
=====================
When ``ROCPROFSYS_TRACE=ON`` is set, the Perfetto trace can include:
* ``Unified Memory Page Faults [Device N]`` counter tracks.
* ``Unified Memory Migration Throughput [Device N]`` counter tracks when KFD
page-migration events are present.
Open the generated Perfetto trace file, for example
``perfetto-trace-<pid>.proto``, in the Perfetto UI to compare page-fault
activity, migration-throughput samples, HIP API calls, kernels, and memory
copies on one timeline.
The following screenshot shows unified memory migration-throughput and
page-fault tracks in Perfetto:
.. image:: ../data/rocprof-sys-unified-memory-perfetto.png
:alt: Perfetto trace showing unified memory migration-throughput and page-fault tracks
The migration-throughput track appears when KFD page-migration events are
present. Fault-only systems might show only the page-fault track.
Migration events absent on shared-HBM systems
=============================================
On MI300A and other systems where CPU and GPU agents point to the same physical
HBM, page faults can occur without page migrations because there is no separate
CPU memory and GPU memory to migrate between. In that topology, a valid
unified memory report might not include page migration events:
* ``total_page_faults`` can be nonzero.
* ``devices`` can be empty, or migration direction buckets can have zero counts.
* ``Unified Memory Page Faults`` can appear in Perfetto.
* ``Unified Memory Migration Throughput`` is not shown when no migration events
are emitted.
Example fault-only text output:
.. code-block:: text
==12345== Unified Memory profiling result:
Total Page Faults: 100
Example fault-only JSON output:
.. code-block:: json
{
"devices": [],
"summary": {
"total_page_faults": 100,
"xnack_enabled": true,
"migration_triggers": {
"gpu_page_fault": 0,
"cpu_page_fault": 0,
"prefetch": 0,
"ttm_eviction": 0,
"unknown": 0
}
}
}
Related memory profiling options
================================
Unified memory profiling is focused on KFD page-fault and page-migration
events. Combine it with ROCm API domains when you also need the surrounding
memory operations in the timeline or ROCpd database:
.. list-table::
:header-rows: 1
:widths: 25 75
* - Domain
- Use
* - ``memory_copy``
- Traces asynchronous memory-copy operations. This is useful for comparing
explicit copies with unified memory page migrations.
* - ``memory_allocation``
- Traces ROCm memory allocation and free operations. With the ROCm 7.13 or
later prerequisite for this page, this includes virtual memory allocation
and free records.
* - ``scratch_memory``
- Traces kernel scratch-memory allocation activity. Scratch allocation-size
counter tracks are emitted in ROCm 7.0.2 and later.
For a memory-focused trace, enable the related domains explicitly:
.. code-block:: shell
HSA_XNACK=1 \
ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON \
ROCPROFSYS_ROCM_DOMAINS=hip_runtime_api,marker_api,kernel_dispatch,memory_copy,memory_allocation,scratch_memory \
rocprof-sys-run --output-format proto rocpd -- ./my_managed_memory_app
Troubleshooting
===============
The following sections help you diagnose and resolve common issues with unified memory profiling. Review each topic based on the behavior you observe.
Missing unified memory profiling output files
-----------------------------------------------------------------------------------
If the unified memory profiling output files: ``unified_memory-<pid>.txt`` or ``unified_memory-<pid>.json`` fail to generate, check if ``ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON`` and ``HSA_XNACK=1``
are set in the environment used to launch the target application. Also, confirm
that the workload actually uses managed memory and produces KFD page-fault or
page-migration events.
Only page faults are shown
--------------------------
On shared-HBM systems such as AMD Instinct MI300A GPUs, the absence of migration events is
expected. If you expected migration rows on a discrete memory system, confirm
that XNACK is enabled and that the workload moves managed memory pages between
CPU and GPU accesses.
No migration-throughput track appears in Perfetto
-------------------------------------------------
The migration throughput track appears only when KFD page migration events are present.
A trace that includes page faults but no migration events is still valid.
Unexpected overhead
-------------------
KFD event tracing and extra ROCm domains add overhead. Start with
``ROCPROFSYS_USE_UNIFIED_MEMORY_PROFILING=ON`` and add
``memory_copy``, ``memory_allocation``, and ``scratch_memory`` only when those
events are needed for the analysis.
See also
========
* :doc:`Configuring runtime options <./configuring-runtime-options>` for the
runtime option reference.
* :doc:`Using preset profiles and domain flags <./using-preset-profiles>` for
ROCm domain flag usage.
* :doc:`Understanding ROCm Systems Profiler output <./understanding-rocprof-sys-output>`
for output directory and trace-file details.