| llvm-calc-occupancy - AMDGPU occupancy calculator |
| ================================================= |
| |
| .. program:: llvm-calc-occupancy |
| |
| SYNOPSIS |
| -------- |
| |
| :program:`llvm-calc-occupancy` -mcpu=<gfxNNN> [*options*] |
| |
| DESCRIPTION |
| ----------- |
| |
| :program:`llvm-calc-occupancy` reports the occupancy (waves per execution unit) |
| that an AMDGPU kernel would achieve for a given combination of workgroup size, |
| VGPR usage, SGPR usage and LDS allocation. It is a thin front-end over the same |
| occupancy math the AMDGPU backend uses (``GCNSubtarget``), so the numbers match |
| what the compiler computes for an equivalent kernel. |
| |
| Any resource that is not specified is treated as unconstrained. When the |
| workgroup size is left unspecified (or given as a range), the occupancy is |
| reported as a range as well. |
| |
| The tool only supports the AMDGPU target. New callers should use the |
| ``amdgpu`` triple (for example ``amdgpu-amd-amdhsa``); the legacy ``amdgcn`` |
| spelling is still accepted. |
| |
| EXAMPLE |
| ------- |
| |
| .. code-block:: console |
| |
| $ llvm-calc-occupancy -mcpu=gfx90a --wg-size=512 --vgprs=50 --sgprs=30 |
| llvm-calc-occupancy - AMDGPU occupancy calculator |
| |
| Target |
| Triple: amdgpu-amd-amdhsa |
| GPU (-mcpu): gfx90a |
| Wavefront size: 64 |
| Max waves/EU: 8 (waves per SIMD, hardware limit) |
| EUs (SIMDs) per CU: 4 |
| ... |
| |
| Per-constraint occupancy (waves/EU) |
| Workgroup + LDS: 8 |
| VGPRs: 8 |
| SGPRs: 8 |
| |
| Result |
| Occupancy: 8 waves/EU (32 waves/CU) |
| Limited by: workgroup size / LDS, VGPRs, SGPRs |
| Next step: already at the hardware maximum |
| |
| OPTIONS |
| ------- |
| |
| .. option:: -mcpu=<gfxNNN> |
| |
| Target GPU, for example ``gfx90a``. Required. |
| |
| .. option:: -mtriple=<triple> |
| |
| Target triple. Defaults to ``amdgpu-amd-amdhsa``. Must be an AMDGPU triple |
| (the ``amdgpu`` or legacy ``amdgcn`` arch). |
| |
| .. option:: -mattr=<features> |
| |
| Comma-separated list of subtarget features, for example |
| ``+wavefrontsize32``. |
| |
| .. option:: --wg-size=<N>, --flat-workgroup-size=<N> |
| |
| Flat workgroup size. Accepts a single value ``N`` or a range ``MIN:MAX``. |
| When omitted, the full legal range is assumed and the occupancy is reported |
| as a range. |
| |
| .. option:: --vgprs=<N> |
| |
| Number of VGPRs used per lane. When omitted, VGPRs do not constrain the |
| occupancy. |
| |
| .. option:: --sgprs=<N> |
| |
| Number of SGPRs used per wave. When omitted, SGPRs do not constrain the |
| occupancy. |
| |
| .. option:: --lds=<size> |
| |
| LDS bytes allocated per workgroup. Accepts an optional ``k``/``kb`` or |
| ``m``/``mb`` suffix (base 1024). |
| |
| .. option:: --dynamic-vgpr-block-size=<N> |
| |
| Dynamic VGPR block size. ``0`` (the default) disables dynamic VGPR mode. |
| |
| .. option:: --limits |
| |
| Print, for each occupancy level supported by the GPU, the maximum number of |
| VGPRs and SGPRs that still reaches that level. |
| |
| .. option:: --help |
| |
| Print a summary of command line options and exit. |
| |
| EXIT STATUS |
| ----------- |
| |
| :program:`llvm-calc-occupancy` returns 0 on success and a non-zero exit code if |
| the arguments are invalid (for example a missing or non-AMDGPU target). |