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
402 lines
12 KiB
ReStructuredText
402 lines
12 KiB
ReStructuredText
.. meta::
|
||
:description: ROCm Compute Profiler performance model: Shader engine (SE)
|
||
:keywords: Omniperf, ROCm Compute Profiler, ROCm, profiler, tool, Instinct, accelerator, shader, engine, sL1D, L1I, workgroup manager, SPI
|
||
|
||
******************
|
||
Shader engine (SE)
|
||
******************
|
||
|
||
The :doc:`compute units <compute-unit>` on a CDNA™ architecture-based GPUs are grouped
|
||
together into a higher-level organizational unit called a shader engine (SE):
|
||
|
||
.. figure:: ../../data/performance-model/selayout.png
|
||
:align: center
|
||
:alt: Example of CU-grouping into shader engines
|
||
:width: 800
|
||
|
||
The number of CUs on a SE varies from chip to chip (For example, see
|
||
:hip-training-pdf:`20`).
|
||
|
||
For the purposes of ROCm Compute Profiler, resources that are shared between
|
||
multiple CUs on a single SE as part of the SE's metrics are considered.
|
||
|
||
These include:
|
||
|
||
* :ref:`Scalar L1 data cache <desc-sl1d>`
|
||
|
||
* :ref:`L1 instruction cache <desc-l1i>`
|
||
|
||
* :ref:`Workgroup manager <desc-spi>`
|
||
|
||
.. _desc-sl1d:
|
||
|
||
Scalar L1 data cache (sL1D)
|
||
===========================
|
||
|
||
The Scalar L1 Data cache (sL1D) can cache data accessed from scalar load
|
||
instructions (and scalar store instructions on GPUs where they exist)
|
||
from wavefronts in the :doc:`CUs <compute-unit>`. The sL1D is shared between
|
||
multiple CUs (:gcn-crash-course:`36`). The exact number of CUs depends on the
|
||
architecture (3 CUs in GCN™ GPUs and AMD Instinct MI100 GPUs, 2 CUs in
|
||
AMD Instinct :ref:`MI2XX <mixxx-note>` GPUs), and is backed by the :doc:`L2 cache <l2-cache>`.
|
||
|
||
In typical usage, the data in the sL1D is comprised of:
|
||
|
||
* Kernel arguments, such as pointers,
|
||
`non-populated <https://llvm.org/docs/AMDGPUUsage.html#amdgpu-amdhsa-sgpr-register-set-up-order-table>`_
|
||
grid and block dimensions, and others
|
||
|
||
* HIP's ``__constant__`` memory, when accessed in a provably uniform manner
|
||
[#uniform-access]_
|
||
|
||
* Other memory, when accessed in a provably uniform manner, *and* the backing
|
||
memory is provably constant [#uniform-access]_
|
||
|
||
.. _desc-sl1d-sol:
|
||
|
||
Scalar L1D 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 a GPU. This may not be realistic for all
|
||
workloads.
|
||
|
||
The Scalar L1D speed-of-light chart shows some key metrics of the sL1D
|
||
cache as a comparison with the peak achievable values of those metrics:
|
||
|
||
.. tab-set::
|
||
|
||
.. tab-item:: CDNA
|
||
|
||
.. jinja:: desc-sl1d-sol-gfx908
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 2
|
||
|
||
.. jinja:: desc-sl1d-sol-gfx90a
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 3
|
||
|
||
.. jinja:: desc-sl1d-sol-gfx942
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 4
|
||
:selected:
|
||
|
||
.. jinja:: desc-sl1d-sol-gfx950
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. _desc-sl1d-stats:
|
||
|
||
Scalar L1D cache accesses
|
||
-------------------------
|
||
|
||
This section details the types of accesses made to the sL1D,
|
||
and the hit/miss statistics.
|
||
|
||
.. tab-set::
|
||
|
||
.. tab-item:: CDNA
|
||
|
||
.. jinja:: desc-sl1d-stats-gfx908
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 2
|
||
|
||
.. jinja:: desc-sl1d-stats-gfx90a
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 3
|
||
|
||
.. jinja:: desc-sl1d-stats-gfx942
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 4
|
||
:selected:
|
||
|
||
.. jinja:: desc-sl1d-stats-gfx950
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. _desc-sl1d-l2-interface:
|
||
|
||
sL1D ↔ L2 Interface
|
||
-------------------
|
||
|
||
This section details the data requested across the sL1D↔:doc:`L2 <l2-cache>` interface.
|
||
|
||
.. tab-set::
|
||
|
||
.. tab-item:: CDNA
|
||
|
||
.. jinja:: desc-sl1d-l2-interface-gfx908
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 2
|
||
|
||
.. jinja:: desc-sl1d-l2-interface-gfx90a
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 3
|
||
|
||
.. jinja:: desc-sl1d-l2-interface-gfx942
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 4
|
||
:selected:
|
||
|
||
.. jinja:: desc-sl1d-l2-interface-gfx950
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. rubric:: Footnotes
|
||
|
||
.. [#uniform-access] The scalar data cache is used when the compiler generates
|
||
scalar load instructions to access data. This requires that the data can have a guaranteed
|
||
uniform accesses (the compiler can verify that all work-items in a
|
||
wavefront access the same data), and that the data can be proven to be
|
||
read-only (for instance, HIP's ``__constant__`` memory, or properly
|
||
``__restrict__``\ed pointers to avoid write-aliasing). For example, access of
|
||
``__constant__`` memory is not guaranteed to go through the sL1D
|
||
if the wavefront loads a non-uniform value.
|
||
|
||
.. [#sl1d-cache] Unlike the :doc:`vL1D <vector-l1-cache>` and
|
||
:doc:`L2 <l2-cache>` caches, the sL1D cache on CDNA architecture-based AMD Instinct MI-Series GPUs doesn't use the "hit-on-miss" approach to report the cache
|
||
hits. While satisfying a miss, if another request comes in that
|
||
would hit on the same pending cache line, the subsequent request will be
|
||
counted as a duplicated miss.
|
||
|
||
.. _desc-l1i:
|
||
|
||
L1 Instruction Cache (L1I)
|
||
==========================
|
||
|
||
As with the :ref:`sL1D <desc-sL1D>`, the L1 Instruction (L1I) cache is shared
|
||
between multiple CUs on a shader-engine, where the precise number of CUs
|
||
sharing a L1I depends on the architecture in question (:gcn-crash-course:`36`)
|
||
and is backed by the :doc:`L2 cache <l2-cache>`. Unlike the sL1D, the
|
||
instruction cache is read-only.
|
||
|
||
.. _desc-l1i-sol:
|
||
|
||
L1I 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 a GPU. This may not be realistic for all
|
||
workloads.
|
||
|
||
The L1 Instruction Cache speed-of-light chart shows some key metrics of
|
||
the L1I cache as a comparison with the peak achievable values of those
|
||
metrics:
|
||
|
||
.. tab-set::
|
||
|
||
.. tab-item:: CDNA
|
||
|
||
.. jinja:: desc-l1i-sol-gfx908
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 2
|
||
|
||
.. jinja:: desc-l1i-sol-gfx90a
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 3
|
||
|
||
.. jinja:: desc-l1i-sol-gfx942
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 4
|
||
:selected:
|
||
|
||
.. jinja:: desc-l1i-sol-gfx950
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. _desc-l1i-stats:
|
||
|
||
L1I cache accesses
|
||
------------------
|
||
|
||
This section details the hit/miss statistics of the L1I:
|
||
|
||
.. tab-set::
|
||
|
||
.. tab-item:: CDNA
|
||
|
||
.. jinja:: desc-l1i-stats-gfx908
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 2
|
||
|
||
.. jinja:: desc-l1i-stats-gfx90a
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 3
|
||
|
||
.. jinja:: desc-l1i-stats-gfx942
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 4
|
||
:selected:
|
||
|
||
.. jinja:: desc-l1i-stats-gfx950
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. _desc-l1i-l2-interface:
|
||
|
||
L1I - L2 interface
|
||
------------------
|
||
|
||
This section details the data requested across the L1I-:doc:`L2 <l2-cache>` interface.
|
||
|
||
.. tab-set::
|
||
|
||
.. tab-item:: CDNA
|
||
|
||
.. jinja:: desc-l1i-l2-interface-gfx908
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 2
|
||
|
||
.. jinja:: desc-l1i-l2-interface-gfx90a
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 3
|
||
|
||
.. jinja:: desc-l1i-l2-interface-gfx942
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 4
|
||
:selected:
|
||
|
||
.. jinja:: desc-l1i-l2-interface-gfx950
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. rubric:: Footnotes
|
||
|
||
.. [#l1i-cache] Unlike the :doc:`vL1D <vector-l1-cache>` and
|
||
:doc:`L2 <l2-cache>` caches, the L1I cache on CDNA architecture-based AMD Instinct MI-Series GPUs doesn't use the "hit-on-miss" approach to report the cache
|
||
hits. While satisfying a miss, if another request comes in that
|
||
would hit on the same pending cache line, the subsequent request will be
|
||
counted as a duplicated miss.
|
||
|
||
.. _desc-spi:
|
||
|
||
Workgroup manager (SPI)
|
||
=======================
|
||
|
||
The workgroup manager (SPI) is the bridge between the
|
||
:doc:`command processor <command-processor>` and the
|
||
:doc:`compute units <compute-unit>`. After the command processor processes a
|
||
kernel dispatch, it will then pass the dispatch off to the workgroup manager,
|
||
which then schedules :ref:`workgroups <desc-workgroup>` onto the compute units.
|
||
As workgroups complete execution and resources become available, the
|
||
workgroup manager will schedule new workgroups onto compute units. The workgroup
|
||
manager's metrics therefore are focused on reporting the following:
|
||
|
||
* Utilizations of various parts of the GPU that the workgroup
|
||
manager interacts with (and the workgroup manager itself)
|
||
|
||
* How many workgroups were dispatched, their size, and how many
|
||
resources they used
|
||
|
||
* Percent of scheduler opportunities (cycles) where workgroups failed
|
||
to dispatch, and
|
||
|
||
* Percent of scheduler opportunities (cycles) where workgroups failed
|
||
to dispatch due to lack of a specific resource on the CUs (for instance, too
|
||
many VGPRs allocated)
|
||
|
||
This gives you an idea of why the workgroup manager couldn’t schedule more
|
||
wavefronts onto the device, and is most useful for workloads that you suspect to
|
||
be limited by scheduling or launch rate.
|
||
|
||
The command processor on AMD Instinct MI-Series GPUs contains four hardware
|
||
scheduler-pipes, each with eight software threads (:mantor-vega10-pdf:`19`). Each
|
||
scheduler-pipe can issue a kernel dispatch to the workgroup manager to schedule
|
||
concurrently. Therefore, some workgroup manager metrics are presented relative
|
||
to the utilization of these scheduler-pipes (for instance, whether all four are
|
||
issuing concurrently). For more details, see :doc:`Command processor <command-processor>`.
|
||
|
||
.. note::
|
||
|
||
Current versions of the profiling libraries underlying ROCm Compute Profiler attempt to
|
||
serialize concurrent kernels running on the GPU, as the performance
|
||
counters on the device are global (shared between concurrent
|
||
kernels). For example, this means that these scheduler-pipe utilization metrics are
|
||
expected to reach a maximum of one pipe active.
|
||
|
||
.. _spi-util:
|
||
|
||
Workgroup manager utilizations
|
||
------------------------------
|
||
|
||
This section details the utilization of the workgroup manager, and the
|
||
hardware components it interacts with.
|
||
|
||
.. tab-set::
|
||
|
||
.. tab-item:: CDNA
|
||
|
||
.. jinja:: spi-util-gfx908
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 2
|
||
|
||
.. jinja:: spi-util-gfx90a
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 3
|
||
|
||
.. jinja:: spi-util-gfx942
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 4
|
||
:selected:
|
||
|
||
.. jinja:: spi-util-gfx950
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. _spi-resc-util:
|
||
|
||
Resource allocation
|
||
-------------------
|
||
|
||
This panel gives more detail on how workgroups and wavefronts are scheduled
|
||
onto compute units, and what occupancy limiters they hit, if any. When
|
||
analyzing these metrics, you should also take into account their
|
||
achieved occupancy, such as
|
||
:ref:`wavefront occupancy <wavefront-runtime-stats>`. A kernel may be occupancy
|
||
limited by LDS usage, but as an example, may still achieve high occupancy levels
|
||
such that improving occupancy further may not improve performance. For more details, see
|
||
:ref:`occupancy-example`.
|
||
|
||
.. tab-set::
|
||
|
||
.. tab-item:: CDNA
|
||
|
||
.. jinja:: spi-resc-util-gfx908
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 2
|
||
|
||
.. jinja:: spi-resc-util-gfx90a
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 3
|
||
|
||
.. jinja:: spi-resc-util-gfx942
|
||
:file: _templates/metrics_table.j2
|
||
|
||
.. tab-item:: CDNA 4
|
||
:selected:
|
||
|
||
.. jinja:: spi-resc-util-gfx950
|
||
:file: _templates/metrics_table.j2
|