2
0
Ficheiros
vedithal-amd 354fe5f52c Unified configuration for metrics (#726)
* Show description of metrics during analysis
    * Use --include-cols Description show the Description column in analyze mode (this is hidden by default)
    * Remove tips field from analysis config

* Align metric names in analysis config and documentation

* Add unified config utils/unified_config.yaml

* Add python script utils/split_config.py to auto generate analysis configuration and documentation metrics description
   * Add test case to ensure unified config is older than auto-generated config
   * Auto generate analysis config and documentation metrics description

* Update CONTRIBUTING.md to add instructions to build documentation assets
    * Add docker image and compose file to build documentation

* Update CHANGELOG and Documentation

* Use jinja template instead of hardcoding metric tables in documentation

[ROCm/rocprofiler-compute commit: bb44e90b2d]
2025-07-25 14:01:34 -04:00

306 linhas
11 KiB
ReStructuredText

Este ficheiro contém caracteres Unicode ambíguos
Este ficheiro contém caracteres Unicode que podem ser confundidos com outros caracteres. Se acha que é intencional, pode ignorar este aviso com segurança. Use o botão Revelar para os mostrar.
.. meta::
:description: ROCm Compute Profiler performance model: Vector L1 cache (vL1D)
:keywords: Omniperf, ROCm Compute Profiler, ROCm, profiler, tool, Instinct, accelerator, AMD, vector, l1, cache, vl1d
**********************
Vector L1 cache (vL1D)
**********************
The vector L1 data (vL1D) cache is local to each
:doc:`compute unit <compute-unit>` on the accelerator, and handles vector memory
operations issued by a wavefront. The vL1D cache consists of several components:
* An address processing unit, also known as the
:ref:`texture addresser <desc-ta>` which receives commands (instructions) and
write/atomic data from the :doc:`compute unit <compute-unit>`, and coalesces
them into fewer requests for the cache to process.
* An address translation unit, also known as the
:ref:`L1 Unified Translation Cache (UTCL1) <desc-utcl1>`, that translates
requests from virtual to physical addresses for lookup in the cache. The
translation unit has an L1 translation lookaside buffer (L1TLB) to reduce the
cost of repeated translations.
* A Tag RAM that looks up whether a requested cache line is already
present in the :ref:`cache <desc-tc>`.
* The result of the Tag RAM lookup is placed in the L1 cache controller
for routing to the correct location; for instance, the
:ref:`L2 Memory Interface <vl1d-l2-transaction-detail>` for misses or the
:ref:`cache RAM <desc-tc>` for hits.
* The cache RAM, also known as the :ref:`texture cache (TC) <desc-tc>`, stores
requested data for potential reuse. Data returned from the
:doc:`L2 cache <l2-cache>` is placed into the cache RAM before going down the
:ref:`data-return path <desc-td>`.
* A backend data processing unit, also known as the
:ref:`texture data (TD) <desc-td>` that routes data back to the requesting
:doc:`compute unit <compute-unit>`.
Together, this complex is known as the vL1D, or Texture Cache per Pipe
(TCP). A simplified diagram of the vL1D is presented below:
.. figure:: ../data/performance-model/l1perf_model.png
:align: center
:alt: Performance model of the vL1D Cache on AMD Instinct
:width: 800
Performance model of the vL1D Cache on AMD Instinct MI-series accelerators.
.. _vl1d-sol:
vL1D Speed-of-Light
===================
.. warning::
The theoretical maximum throughput for some metrics in this section are
currently computed with the maximum achievable clock frequency, as reported
by ``rocminfo``, for an accelerator. This may not be realistic for all
workloads.
The vL1Ds speed-of-light chart shows several key metrics for the vL1D
as a comparison with the peak achievable values of those metrics.
.. jinja:: vl1d-sol
:file: _templates/metrics_table.j2
.. _desc-ta:
Address processing unit or Texture Addresser (TA)
=================================================
The :doc:`vL1D <vector-l1-cache>`s address processing unit receives vector
memory instructions (commands) along with write/atomic data from a
:doc:`compute unit <compute-unit>` and is responsible for coalescing these into
requests for lookup in the :ref:`vL1D RAM <desc-tc>`. The address processor
passes information about the commands (coalescing state, destination SIMD,
etc.) to the :ref:`data processing unit <desc-td>` for use after the requested
data has been retrieved.
ROCm Compute Profiler reports several metrics to indicate performance bottlenecks in
the address processing unit, which are broken down into a few
categories:
- :ref:`ta-busy-stall`
- :ref:`ta-instruction-counts`
- :ref:`ta-spill-stack`
.. _ta-busy-stall:
Busy / stall metrics
--------------------
When executing vector memory instructions, the compute unit must send an
address (and in the case of writes/atomics, data) to the address
processing unit. When the front-end cannot accept any more addresses, it
must backpressure the wave-issue logic for the VMEM pipe and prevent the
issue of further vector memory instructions.
.. jinja:: ta-busy-stall
:file: _templates/metrics_table.j2
.. _ta-instruction-counts:
Instruction counts
------------------
The address processor also counts instruction types to give the user
information on what sorts of memory instructions were executed by the
kernel. These are broken down into a few major categories:
.. list-table::
:header-rows: 1
* - Memory type
- Usage
- Description
* - Global
- Global memory
- Global memory can be seen by all threads from a process. This includes
the local accelerator's DRAM, remote accelerator's DRAM, and the host's
DRAM.
* - Generic
- Dynamic address spaces
- Generic memory, or "flat" memory, is used when the compiler cannot
statically prove that a pointer is to memory in one or the other address
spaces. The pointer could dynamically point into global, local, constant,
or private memory.
* - Private Memory
- Register spills / Stack memory
- Private memory, or "scratch" memory, is only visible to a particular
:ref:`work-item <desc-work-item>` in a particular
:ref:`workgroup <desc-workgroup>`. On AMD Instinct™ MI-series
accelerators, private memory is used to implement both register spills
and stack memory accesses.
The address processor counts these instruction types as follows:
.. jinja:: ta-instruction-counts
:file: _templates/metrics_table.j2
.. note::
The above is a simplified model specifically for the HIP programming language
that does not consider inline assembly usage, constant memory usage or
texture memory.
These categories correspond to:
* Global/Generic: global and flat memory operations, that are used for global
and generic memory access.
* Spill/Stack: buffer instructions which are used on the MI50, MI100, and
:ref:`MI2XX <mixxx-note>` accelerators for register spills / stack memory.
These concepts are described in more detail in the :ref:`memory-spaces`,
while generic memory access is explored in the
:ref:`generic memory benchmark <flat-memory-ex>` section.
.. _ta-spill-stack:
Spill / stack metrics
---------------------
Finally, the address processing unit contains a separate coalescing
stage for spill/stack memory, and thus reports:
.. jinja:: ta-spill-stack
:file: _templates/metrics_table.j2
.. _desc-utcl1:
L1 Unified Translation Cache (UTCL1)
====================================
After a vector memory instruction has been processed/coalesced by the
address processing unit of the vL1D, it must be translated from a
virtual to physical address. This process is handled by the L1 Unified
Translation Cache (UTCL1). This cache contains a L1 Translation
Lookaside Buffer (TLB) which stores recently translated addresses to
reduce the cost of subsequent re-translations.
ROCm Compute Profiler reports the following L1 TLB metrics:
.. jinja:: desc-utcl1
:file: _templates/metrics_table.j2
.. note::
On current CDNA accelerators, such as the :ref:`MI2XX <mixxx-note>`, the
UTCL1 does *not* count hit-on-miss requests.
.. _desc-tc:
Vector L1 Cache RAM or Texture Cache (TC)
=========================================
After coalescing in the :ref:`address processing unit <desc-ta>` of the v1LD,
and address translation in the :ref:`L1 TLB <desc-utcl1>` the request proceeds
to the Cache RAM stage of the pipeline. Incoming requests are looked up
in the cache RAMs using parts of the physical address as a tag. Hits
will be returned through the :ref:`data-return path <desc-td>`, while misses
will routed out to the :doc:`L2 Cache <l2-cache>` for servicing.
The metrics tracked by the vL1D RAM include:
- :ref:`Stall metrics <vl1d-cache-stall-metrics>`
- :ref:`Cache access metrics <vl1d-cache-access-metrics>`
- :ref:`vL1D-L2 transaction detail metrics <vl1d-l2-transaction-detail>`
.. _vl1d-cache-stall-metrics:
vL1D cache stall metrics
------------------------
The vL1D also reports where it is stalled in the pipeline, which may
indicate performance limiters of the cache. A stall in the pipeline may
result in backpressuring earlier parts of the pipeline, e.g., a stall on
L2 requests may backpressure the wave-issue logic of the :ref:`VMEM <desc-vmem>`
pipe and prevent it from issuing more vector memory instructions until
the vL1Ds outstanding requests are completed.
.. jinja:: vl1d-cache-stall-metrics
:file: _templates/metrics_table.j2
.. _vl1d-cache-access-metrics:
vL1D cache access metrics
-------------------------
The vL1D cache access metrics broadly indicate the type of requests
incoming from the :ref:`cache front-end <desc-ta>`, the number of requests that
were serviced by the vL1D, and the number & type of outgoing requests to
the :doc:`L2 cache <l2-cache>`. In addition, this section includes the
approximate latencies of accesses to the cache itself, along with
latencies of read/write memory operations to the :doc:`L2 cache <l2-cache>`.
.. jinja:: vl1d-cache-access-metrics
:file: _templates/metrics_table.j2
.. note::
All cache accesses in vL1D are for a single cache line's worth of data.
The size of a cache line may vary, however on current AMD Instinct MI CDNA
accelerators and GCN™ GPUs the L1 cache line size is 64B.
.. rubric :: Footnotes
.. [#vl1d-hit] The vL1D cache on AMD Instinct MI-series CDNA accelerators
uses a "hit-on-miss" approach to reporting cache hits. That is, if while
satisfying a miss, another request comes in that would hit on the same
pending cache line, the subsequent request will be counted as a "hit".
Therefore, it is also important to consider the access latency metric in the
:ref:`Cache access metrics <vl1d-cache-stall-metrics>` section when
evaluating the vL1D hit rate.
.. [#vl1d-activity] ROCm Compute Profiler considers the vL1D to be active when any part of
the vL1D (excluding the :ref:`address processor <desc-ta>` and
:ref:`data return <desc-td>` units) are active, for example, when performing
a translation, waiting for data, accessing the Tag or Cache RAMs, etc.
.. _vl1d-l2-transaction-detail:
vL1D - L2 Transaction Detail
----------------------------
This section provides a more granular look at the types of requests made
to the :doc:`L2 cache <l2-cache>`. These are broken down by the operation type
(read / write / atomic, with, or without return), and the
:ref:`memory type <memory-type>`.
.. _desc-td:
Vector L1 data-return path or Texture Data (TD)
===============================================
The data-return path of the vL1D cache, also known as the Texture Data
(TD) unit, is responsible for routing data returned from the
:ref:`vL1D cache RAM <desc-tc>` back to a wavefront on a SIMD. As described in
the :ref:`vL1D cache front-end <desc-ta>` section, the data-return path is passed
information about the space requirements and routing for data requests
from the :ref:`VALU <desc-valu>`. When data is returned from the
:ref:`vL1D cache RAM <desc-tc>`, it is matched to this previously stored request
data, and returned to the appropriate SIMD.
ROCm Compute Profiler reports the following vL1D data-return path metrics:
.. jinja:: desc-td
:file: _templates/metrics_table.j2