783193c75f
* adding L2 model with updated legend and removal of large images * changed image name to perf_model
755 строки
28 KiB
ReStructuredText
755 строки
28 KiB
ReStructuredText
.. meta::
|
||
:description: ROCm Compute Profiler performance model: L2 cache (TCC)
|
||
:keywords: Omniperf, ROCm Compute Profiler, ROCm, profiler, tool, Instinct, accelerator, L2, cache, infinity fabric, metrics
|
||
|
||
**************
|
||
L2 cache (TCC)
|
||
**************
|
||
|
||
The L2 cache is the coherence point for current AMD Instinct™ MI-series GCN™
|
||
GPUs and CDNA™ accelerators, and is shared by all :doc:`CUs <compute-unit>`
|
||
on the device. Besides serving requests from the
|
||
:doc:`vector L1 data caches <vector-l1-cache>`, the L2 cache also is responsible
|
||
for servicing requests from the :ref:`L1 instruction caches <desc-l1i>`, the
|
||
:ref:`scalar L1 data caches <desc-sL1D>` and the
|
||
:doc:`command processor <command-processor>`. The L2 cache is composed of a
|
||
number of distinct channels (32 on MI100 and :ref:`MI2XX <mixxx-note>` series CDNA
|
||
accelerators at 256B address interleaving) which can largely operate
|
||
independently. Mapping of incoming requests to a specific L2 channel is
|
||
determined by a hashing mechanism that attempts to evenly distribute requests
|
||
across the L2 channels. Requests that miss in the L2 cache are passed out to
|
||
:ref:`Infinity Fabric™ <l2-fabric>` to be routed to the appropriate memory
|
||
location.
|
||
|
||
The L2 cache metrics reported by ROCm Compute Profiler are broken down into four
|
||
categories:
|
||
|
||
* :ref:`L2 Speed-of-Light <l2-sol>`
|
||
|
||
* :ref:`L2 cache accesses <l2-cache-accesses>`
|
||
|
||
* :ref:`L2-Fabric transactions <l2-fabric>`
|
||
|
||
* :ref:`L2-Fabric stalls <l2-fabric-stalls>`
|
||
|
||
.. _l2-sol:
|
||
|
||
L2 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 L2 cache’s speed-of-light table contains a few key metrics about the
|
||
performance of the L2 cache, aggregated over all the L2 channels, as a
|
||
comparison with the peak achievable values of those metrics:
|
||
|
||
.. list-table::
|
||
:header-rows: 1
|
||
|
||
* - Metric
|
||
|
||
- Description
|
||
|
||
- Unit
|
||
|
||
* - Utilization
|
||
|
||
- The ratio of the
|
||
:ref:`number of cycles an L2 channel was active, summed over all L2 channels on the accelerator <total-active-l2-cycles>`
|
||
over the :ref:`total L2 cycles <total-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
* - Bandwidth
|
||
|
||
- The number of bytes looked up in the L2 cache, as a percent of the peak
|
||
theoretical bandwidth achievable on the specific accelerator. The number
|
||
of bytes is calculated as the number of cache lines requested multiplied
|
||
by the cache line size. This value does not consider partial requests, so
|
||
e.g., if only a single value is requested in a cache line, the data
|
||
movement will still be counted as a full cache line.
|
||
|
||
- Percent
|
||
|
||
* - Hit Rate
|
||
|
||
- The ratio of the number of L2 cache line requests that hit in the L2
|
||
cache over the total number of incoming cache line requests to the L2
|
||
cache.
|
||
|
||
- Percent
|
||
|
||
* - L2-Fabric Read BW
|
||
|
||
- The number of bytes read by the L2 over the
|
||
:ref:`Infinity Fabric interface <l2-fabric>` per unit time.
|
||
|
||
- GB/s
|
||
|
||
* - L2-Fabric Write and Atomic BW
|
||
|
||
- The number of bytes sent by the L2 over the
|
||
:ref:`Infinity Fabric interface <l2-fabric>` by write and atomic
|
||
operations per unit time.
|
||
|
||
- GB/s
|
||
|
||
.. note::
|
||
|
||
The L2 cache on AMD Instinct MI 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 latency metric in the :ref:`L2-Fabric <l2-fabric>`
|
||
section when evaluating the L2 hit rate.
|
||
|
||
.. _l2-cache-accesses:
|
||
|
||
L2 cache accesses
|
||
=================
|
||
|
||
This section details the incoming requests to the L2 cache from the
|
||
:doc:`vL1D <vector-l1-cache>` and other clients -- for instance, the
|
||
:ref:`sL1D <desc-sL1D>` and :ref:`L1I <desc-l1i>` caches.
|
||
|
||
.. list-table::
|
||
:header-rows: 1
|
||
:widths: 13 70 17
|
||
|
||
* - Metric
|
||
|
||
- Description
|
||
|
||
- Unit
|
||
|
||
* - Bandwidth
|
||
|
||
- The number of bytes looked up in the L2 cache, per
|
||
:ref:`normalization unit <normalization-units>`. The number of bytes is
|
||
calculated as the number of cache lines requested multiplied by the cache
|
||
line size. This value does not consider partial requests, so for example,
|
||
if only a single value is requested in a cache line, the data movement
|
||
will still be counted as a full cache line.
|
||
|
||
- Bytes per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Requests
|
||
|
||
- The total number of incoming requests to the L2 from all clients for all
|
||
request types, per :ref:`normalization unit <normalization-units>`.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Read Requests
|
||
|
||
- The total number of read requests to the L2 from all clients.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`
|
||
|
||
* - Write Requests
|
||
|
||
- The total number of write requests to the L2 from all clients.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`
|
||
|
||
* - Atomic Requests
|
||
|
||
- The total number of atomic requests (with and without return) to the L2
|
||
from all clients.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`
|
||
|
||
* - Streaming Requests
|
||
|
||
- The total number of incoming requests to the L2 that are marked as
|
||
*streaming*. The exact meaning of this may differ depending on the
|
||
targeted accelerator, however on an :ref:`MI2XX <mixxx-note>` this
|
||
corresponds to
|
||
`non-temporal load or stores <https://clang.llvm.org/docs/LanguageExtensions.html#non-temporal-load-store-builtins>`_.
|
||
The L2 cache attempts to evict *streaming* requests before normal
|
||
requests when the L2 is at capacity.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`
|
||
|
||
* - Probe Requests
|
||
|
||
- The number of coherence probe requests made to the L2 cache from outside
|
||
the accelerator. On an :ref:`MI2XX <mixxx-note>`, probe requests may be
|
||
generated by, for example, writes to
|
||
:ref:`fine-grained device <memory-type>` memory or by writes to
|
||
:ref:`coarse-grained <memory-type>` device memory.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`
|
||
|
||
* - Hit Rate
|
||
|
||
- The ratio of the number of L2 cache line requests that hit in the L2
|
||
cache over the total number of incoming cache line requests to the L2
|
||
cache.
|
||
|
||
- Percent
|
||
|
||
* - Hits
|
||
|
||
- The total number of requests to the L2 from all clients that hit in the
|
||
cache. As noted in the :ref:`Speed-of-Light <l2-sol>` section, this
|
||
includes hit-on-miss requests.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`
|
||
|
||
* - Misses
|
||
|
||
- The total number of requests to the L2 from all clients that miss in the
|
||
cache. As noted in the :ref:`Speed-of-Light <l2-sol>` section, these do
|
||
not include hit-on-miss requests.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`
|
||
|
||
* - Writebacks
|
||
|
||
- The total number of L2 cache lines written back to memory for any reason.
|
||
Write-backs may occur due to user code (such as HIP kernel calls to
|
||
``__threadfence_system`` or atomic built-ins) by the
|
||
:doc:`command processor <command-processor>`'s memory acquire/release
|
||
fences, or for other internal hardware reasons.
|
||
|
||
- Cache lines per :ref:`normalization unit <normalization-units>`
|
||
|
||
* - Writebacks (Internal)
|
||
|
||
- The total number of L2 cache lines written back to memory for internal
|
||
hardware reasons, per :ref:`normalization unit <normalization-units>`.
|
||
|
||
- Cache lines per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Writebacks (vL1D Req)
|
||
|
||
- The total number of L2 cache lines written back to memory due to requests
|
||
initiated by the :doc:`vL1D cache <vector-l1-cache>`, per
|
||
:ref:`normalization unit <normalization-units>`.
|
||
|
||
- Cache lines per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Evictions (Normal)
|
||
|
||
- The total number of L2 cache lines evicted from the cache due to capacity
|
||
limits, per :ref:`normalization unit <normalization-units>`.
|
||
|
||
- Cache lines per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Evictions (vL1D Req)
|
||
|
||
- The total number of L2 cache lines evicted from the cache due to
|
||
invalidation requests initiated by the
|
||
:doc:`vL1D cache <vector-l1-cache>`, per
|
||
:ref:`normalization unit <normalization-units>`.
|
||
|
||
- Cache lines per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Non-hardware-Coherent Requests
|
||
|
||
- The total number of requests to the L2 to Not-hardware-Coherent (NC)
|
||
memory allocations, per :ref:`normalization unit <normalization-units>`.
|
||
See the :ref:`memory-type` for more information.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Uncached Requests
|
||
|
||
- The total number of requests to the L2 that go to Uncached (UC) memory
|
||
allocations. See the :ref:`memory-type` for more information.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Coherently Cached Requests
|
||
|
||
- The total number of requests to the L2 that go to Coherently Cacheable (CC)
|
||
memory allocations. See the :ref:`memory-type` for more information.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Read/Write Coherent Requests
|
||
|
||
- The total number of requests to the L2 that go to Read-Write coherent memory
|
||
(RW) allocations. See the :ref:`memory-type` for more information.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
.. note::
|
||
|
||
All requests to the L2 are for a single cache line's worth of data. The size
|
||
of a cache line may vary depending on the accelerator, however on an AMD
|
||
Instinct CDNA2 :ref:`MI2XX <mixxx-note>` accelerator, it is 128B, while on
|
||
an MI100, it is 64B.
|
||
|
||
.. _l2-fabric:
|
||
|
||
L2-Fabric transactions
|
||
======================
|
||
|
||
Requests/data that miss in the L2 must be routed to memory in order to
|
||
service them. The backing memory for a request may be local to this
|
||
accelerator (i.e., in the local high-bandwidth memory), in a remote
|
||
accelerator’s memory, or even in the CPU’s memory. Infinity Fabric
|
||
is responsible for routing these memory requests/data to the correct
|
||
location and returning any fetched data to the L2 cache. The
|
||
:ref:`l2-request-flow` describes the flow of these requests through
|
||
Infinity Fabric in more detail, as described by ROCm Compute Profiler metrics,
|
||
while :ref:`l2-request-metrics` give detailed definitions of
|
||
individual metrics.
|
||
|
||
.. _l2-request-flow:
|
||
|
||
Request flow
|
||
------------
|
||
|
||
The following is a diagram that illustrates how L2↔Fabric requests are reported
|
||
by ROCm Compute Profiler:
|
||
|
||
.. figure:: ../data/performance-model/l2perf_model.png
|
||
:align: center
|
||
:alt: L2-Fabric transaction flow on AMD Instinct MI-series accelerators
|
||
:width: 800
|
||
|
||
L2↔Fabric transaction flow on AMD Instinct MI-series accelerators.
|
||
|
||
|
||
Requests from the L2 Cache are broken down into two major categories, read
|
||
requests and write requests (at this granularity, atomic requests are treated
|
||
as writes).
|
||
|
||
From there, these requests can additionally subdivided in a number of ways.
|
||
First, these requests may be sent across Infinity Fabric as different
|
||
transaction sizes, 32B or 64B on current CDNA accelerators.
|
||
|
||
.. note::
|
||
|
||
On current CDNA accelerators, the 32B read request path is expected to be
|
||
unused and so is disconnected in the flow diagram.
|
||
|
||
In addition, the read and write requests can be further categorized as:
|
||
|
||
* Uncached read/write requests, for instance: for access to
|
||
:ref:`fine-grained memory <memory-type>`
|
||
|
||
* Atomic requests, for instance: for atomic updates to
|
||
:ref:`fine-grained memory <memory-type>`
|
||
|
||
* HBM read/write requests OR remote read/write requests, for instance: for
|
||
requests to the accelerator’s local HBM OR requests to a remote accelerator’s
|
||
HBM or the CPU’s DRAM
|
||
|
||
These classifications are not necessarily *exclusive*. For example, a
|
||
write request can be classified as an atomic request to the
|
||
accelerator’s local HBM, and an uncached write request. The request-flow
|
||
diagram marks *exclusive* classifications as a splitting of the flow,
|
||
while *non-exclusive* requests do not split the flow line. For example,
|
||
a request is either a 32B Write Request OR a 64B Write request, as the
|
||
flow splits at this point.
|
||
|
||
However, continuing along, the same request might be an atomic request and an
|
||
uncached write request, as reflected by a non-split flow.
|
||
|
||
Finally, we note that :ref:`uncached <memory-type>` read requests (e.g., to
|
||
:ref:`fine-grained memory <memory-type>`) are handled specially on CDNA
|
||
accelerators, as indicated in the request flow diagram. These are
|
||
expected to be counted as a 64B Read Request, and *if* they are requests
|
||
to uncached memory (denoted by the dashed line), they will also be
|
||
counted as *two* uncached read requests (that is, the request is split).
|
||
|
||
|
||
.. _l2-request-metrics:
|
||
|
||
Metrics
|
||
-------
|
||
|
||
The following metrics are reported for the L2-Fabric interface:
|
||
|
||
.. list-table::
|
||
:header-rows: 1
|
||
|
||
* - Metric
|
||
|
||
- Description
|
||
|
||
- Unit
|
||
|
||
* - L2-Fabric Read Bandwidth
|
||
|
||
- The total number of bytes read by the L2 cache from Infinity Fabric per
|
||
:ref:`normalization unit <normalization-units>`.
|
||
|
||
- Bytes per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - HBM Read Traffic
|
||
|
||
- The percent of read requests generated by the L2 cache that are routed to
|
||
the accelerator's local high-bandwidth memory (HBM). This breakdown does
|
||
not consider the *size* of the request (meaning that 32B and 64B requests
|
||
are both counted as a single request), so this metric only *approximates*
|
||
the percent of the L2-Fabric Read bandwidth directed to the local HBM.
|
||
|
||
- Percent
|
||
|
||
* - Remote Read Traffic
|
||
|
||
- The percent of read requests generated by the L2 cache that are routed to
|
||
any memory location other than the accelerator's local high-bandwidth
|
||
memory (HBM) -- for example, the CPU's DRAM or a remote accelerator's
|
||
HBM. This breakdown does not consider the *size* of the request (meaning
|
||
that 32B and 64B requests are both counted as a single request), so this
|
||
metric only *approximates* the percent of the L2-Fabric Read bandwidth
|
||
directed to a remote location.
|
||
|
||
- Percent
|
||
|
||
* - Uncached Read Traffic
|
||
|
||
- The percent of read requests generated by the L2 cache that are reading
|
||
from an :ref:`uncached memory allocation <memory-type>`. Note, as
|
||
described in the :ref:`request flow <l2-request-flow>` section, a single
|
||
64B read request is typically counted as two uncached read requests. So,
|
||
it is possible for the Uncached Read Traffic to reach up to 200% of the
|
||
total number of read requests. This breakdown does not consider the
|
||
*size* of the request (i.e., 32B and 64B requests are both counted as a
|
||
single request), so this metric only *approximates* the percent of the
|
||
L2-Fabric read bandwidth directed to an uncached memory location.
|
||
|
||
- Percent
|
||
|
||
* - L2-Fabric Write and Atomic Bandwidth
|
||
|
||
- The total number of bytes written by the L2 over Infinity Fabric by write
|
||
and atomic operations per
|
||
:ref:`normalization unit <normalization-units>`. Note that on current
|
||
CDNA accelerators, such as the :ref:`MI2XX <mixxx-note>`, requests are
|
||
only considered *atomic* by Infinity Fabric if they are targeted at
|
||
non-write-cacheable memory, for example,
|
||
:ref:`fine-grained memory <memory-type>` allocations or
|
||
:ref:`uncached memory <memory-type>` allocations on the
|
||
MI2XX.
|
||
|
||
- Bytes per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - HBM Write and Atomic Traffic
|
||
|
||
- The percent of write and atomic requests generated by the L2 cache that
|
||
are routed to the accelerator's local high-bandwidth memory (HBM). This
|
||
breakdown does not consider the *size* of the request (meaning that 32B
|
||
and 64B requests are both counted as a single request), so this metric
|
||
only *approximates* the percent of the L2-Fabric Write and Atomic
|
||
bandwidth directed to the local HBM. Note that on current CDNA
|
||
accelerators, such as the :ref:`MI2XX <mixxx-note>`, requests are only
|
||
considered *atomic* by Infinity Fabric if they are targeted at
|
||
:ref:`fine-grained memory <memory-type>` allocations or
|
||
:ref:`uncached memory <memory-type>` allocations.
|
||
|
||
- Percent
|
||
|
||
* - Remote Write and Atomic Traffic
|
||
|
||
- The percent of read requests generated by the L2 cache that are routed to
|
||
any memory location other than the accelerator's local high-bandwidth
|
||
memory (HBM) -- for example, the CPU's DRAM or a remote accelerator's
|
||
HBM. This breakdown does not consider the *size* of the request (meaning
|
||
that 32B and 64B requests are both counted as a single request), so this
|
||
metric only *approximates* the percent of the L2-Fabric Read bandwidth
|
||
directed to a remote location. Note that on current CDNA
|
||
accelerators, such as the :ref:`MI2XX <mixxx-note>`, requests are only
|
||
considered *atomic* by Infinity Fabric if they are targeted at
|
||
:ref:`fine-grained memory <memory-type>` allocations or
|
||
:ref:`uncached memory <memory-type>` allocations.
|
||
|
||
- Percent
|
||
|
||
* - Atomic Traffic
|
||
|
||
- The percent of write requests generated by the L2 cache that are atomic
|
||
requests to *any* memory location. This breakdown does not consider the
|
||
*size* of the request (meaning that 32B and 64B requests are both counted
|
||
as a single request), so this metric only *approximates* the percent of
|
||
the L2-Fabric Read bandwidth directed to a remote location. Note that on
|
||
current CDNA accelerators, such as the :ref:`MI2XX <mixxx-note>`,
|
||
requests are only considered *atomic* by Infinity Fabric if they are
|
||
targeted at :ref:`fine-grained memory <memory-type>` allocations or
|
||
:ref:`uncached memory <memory-type>` allocations.
|
||
|
||
- Percent
|
||
|
||
* - Uncached Write and Atomic Traffic
|
||
|
||
- The percent of write and atomic requests generated by the L2 cache that
|
||
are targeting :ref:`uncached memory allocations <memory-type>`. This
|
||
breakdown does not consider the *size* of the request (meaning that 32B
|
||
and 64B requests are both counted as a single request), so this metric
|
||
only *approximates* the percent of the L2-Fabric read bandwidth directed
|
||
to uncached memory allocations.
|
||
|
||
- Percent
|
||
|
||
* - Read Latency
|
||
|
||
- The time-averaged number of cycles read requests spent in Infinity Fabric
|
||
before data was returned to the L2.
|
||
|
||
- Cycles
|
||
|
||
* - Write Latency
|
||
|
||
- The time-averaged number of cycles write requests spent in Infinity
|
||
Fabric before a completion acknowledgement was returned to the L2.
|
||
|
||
- Cycles
|
||
|
||
* - Atomic Latency
|
||
|
||
- The time-averaged number of cycles atomic requests spent in Infinity
|
||
Fabric before a completion acknowledgement (atomic without return value)
|
||
or data (atomic with return value) was returned to the L2.
|
||
|
||
- Cycles
|
||
|
||
* - Read Stall
|
||
|
||
- The ratio of the total number of cycles the L2-Fabric interface was
|
||
stalled on a read request to any destination (local HBM, remote PCIe®
|
||
connected accelerator or CPU, or remote Infinity Fabric connected
|
||
accelerator [#inf]_ or CPU) over the
|
||
:ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
* - Write Stall
|
||
|
||
- The ratio of the total number of cycles the L2-Fabric interface was
|
||
stalled on a write or atomic request to any destination (local HBM,
|
||
remote accelerator or CPU, PCIe connected accelerator or CPU, or remote
|
||
Infinity Fabric connected accelerator [#inf]_ or CPU) over the
|
||
:ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
.. _l2-detailed-metrics:
|
||
|
||
Detailed transaction metrics
|
||
----------------------------
|
||
|
||
The following metrics are available in the detailed L2-Fabric
|
||
transaction breakdown table:
|
||
|
||
.. list-table::
|
||
:header-rows: 1
|
||
|
||
* - Metric
|
||
|
||
- Description
|
||
|
||
- Unit
|
||
|
||
* - 32B Read Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to read 32B of data
|
||
from any memory location, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail. Typically unused on CDNA
|
||
accelerators.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Uncached Read Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to read
|
||
:ref:`uncached data <memory-type>` from any memory location, per
|
||
:ref:`normalization unit <normalization-units>`. 64B requests for
|
||
uncached data are counted as two 32B uncached data requests. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - 64B Read Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to read 64B of data
|
||
from any memory location, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - HBM Read Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to read 32B or 64B of
|
||
data from the accelerator's local HBM, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Remote Read Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to read 32B or 64B of
|
||
data from any source other than the accelerator's local HBM, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - 32B Write and Atomic Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to write or atomically
|
||
update 32B of data to any memory location, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Uncached Write and Atomic Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to write or atomically
|
||
update 32B or 64B of :ref:`uncached data <memory-type>`, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - 64B Write and Atomic Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to write or atomically
|
||
update 64B of data in any memory location, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - HBM Write and Atomic Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to write or atomically
|
||
update 32B or 64B of data in the accelerator's local HBM, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Remote Write and Atomic Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to write or atomically
|
||
update 32B or 64B of data in any memory location other than the
|
||
accelerator's local HBM, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
* - Atomic Requests
|
||
|
||
- The total number of L2 requests to Infinity Fabric to atomically update
|
||
32B or 64B of data in any memory location, per
|
||
:ref:`normalization unit <normalization-units>`. See
|
||
:ref:`l2-request-flow` for more detail. Note that on current CDNA
|
||
accelerators, such as the :ref:`MI2XX <mixxx-note>`, requests are only
|
||
considered *atomic* by Infinity Fabric if they are targeted at
|
||
non-write-cacheable memory, such as
|
||
:ref:`fine-grained memory <memory-type>` allocations or
|
||
:ref:`uncached memory <memory-type>` allocations on the MI2XX.
|
||
|
||
- Requests per :ref:`normalization unit <normalization-units>`.
|
||
|
||
.. _l2-fabric-stalls:
|
||
|
||
L2-Fabric interface stalls
|
||
==========================
|
||
|
||
When the interface between the L2 cache and Infinity Fabric becomes backed up by
|
||
requests, it may stall, preventing the L2 from issuing additional requests to
|
||
Infinity Fabric until prior requests complete. This section gives a breakdown of
|
||
what types of requests in a kernel caused a stall (like read versus write), and
|
||
to which locations -- for instance, to the accelerator’s local memory, or to
|
||
remote accelerators or CPUs.
|
||
|
||
.. list-table::
|
||
:header-rows: 1
|
||
|
||
* - Metric
|
||
|
||
- Description
|
||
|
||
- Unit
|
||
|
||
* - Read - PCIe Stall
|
||
|
||
- The number of cycles the L2-Fabric interface was stalled on read requests
|
||
to remote PCIe connected accelerators [#inf]_ or CPUs as a percent of the
|
||
:ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
* - Read - Infinity Fabric Stall
|
||
|
||
- The number of cycles the L2-Fabric interface was stalled on read requests
|
||
to remote Infinity Fabric connected accelerators [#inf]_ or CPUs as a
|
||
percent of the :ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
* - Read - HBM Stall
|
||
|
||
- The number of cycles the L2-Fabric interface was stalled on read requests
|
||
to the accelerator's local HBM as a percent of the
|
||
:ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
* - Write - PCIe Stall
|
||
|
||
- The number of cycles the L2-Fabric interface was stalled on write or
|
||
atomic requests to remote PCIe connected accelerators [#inf]_ or CPUs as
|
||
a percent of the :ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
* - Write - Infinity Fabric Stall
|
||
|
||
- The number of cycles the L2-Fabric interface was stalled on write or
|
||
atomic requests to remote Infinity Fabric connected accelerators [#inf]_
|
||
or CPUs as a percent of the
|
||
:ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
* - Write - HBM Stall
|
||
|
||
- The number of cycles the L2-Fabric interface was stalled on write or
|
||
atomic requests to accelerator's local HBM as a percent of the
|
||
:ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
* - Write - Credit Starvation
|
||
|
||
- The number of cycles the L2-Fabric interface was stalled on write or
|
||
atomic requests to any memory location because too many write/atomic
|
||
requests were currently in flight, as a percent of the
|
||
:ref:`total active L2 cycles <total-active-l2-cycles>`.
|
||
|
||
- Percent
|
||
|
||
.. warning::
|
||
|
||
On current CDNA accelerators and GCN GPUs, these L2↔Fabric stalls can be undercounted in some circumstances.
|
||
|
||
.. rubric:: Footnotes
|
||
|
||
.. [#inf] In addition to being used for on-accelerator data-traffic, AMD
|
||
`Infinity Fabric <https://www.amd.com/en/technologies/infinity-architecture>`_
|
||
technology can be used to connect multiple accelerators to achieve advanced
|
||
peer-to-peer connectivity and enhanced bandwidths over traditional PCIe
|
||
connections. Some AMD Instinct MI-series accelerators like the MI250X feature coherent CPU-to-accelerator connections are built using AMD Infinity Fabric. For more information, see the `AMD CDNA2 white paper <https://www.amd.com/content/dam/amd/en/documents/instinct-business-docs/white-papers/amd-cdna2-white-paper.pdf>`_.
|
||
|
||
.. rubric:: Disclaimer
|
||
|
||
PCIe® is a registered trademark of PCI-SIG Corporation.
|