From 4e45bfcd394b47ef89b24013df9ab498d7538d55 Mon Sep 17 00:00:00 2001 From: Aude Vuilliomenet Date: Mon, 24 Aug 2026 09:58:16 +0100 Subject: [PATCH] Add LUTI Learning Path * Introduce the lookup-table instructions (LUTI): concepts, code implementation, and validation. Signed-off-by: Aude Vuilliomenet --- .../luti/01_overview.md | 101 +++++ .../luti/02_luti_and_sme2.md | 148 ++++++++ .../luti/03_environment_setup.md | 193 ++++++++++ .../luti/04_lut_decoding_c_sme2.md | 344 ++++++++++++++++++ .../luti/05_programming_luti_sme2.md | 307 ++++++++++++++++ .../luti/06_additional_luti_features.md | 114 ++++++ .../mobile-graphics-and-gaming/luti/_index.md | 84 +++++ .../luti/_next-steps.md | 8 + .../luti/code/.clang-format | 18 + .../luti/code/Makefile | 130 +++++++ .../luti/code/example_1_luti_sme2.c | 305 ++++++++++++++++ .../luti/code/luti_sme2_programming.c | 210 +++++++++++ .../luti/code/luti_sme2_programming_test.c | 305 ++++++++++++++++ .../luti/images/luti2.png | Bin 0 -> 58633 bytes .../luti/images/luti4.png | Bin 0 -> 57448 bytes .../luti/images/luti_datatypes.png | Bin 0 -> 69987 bytes .../luti/images/luti_flow_overview.png | Bin 0 -> 39524 bytes 17 files changed, 2267 insertions(+) create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/01_overview.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/02_luti_and_sme2.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/03_environment_setup.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/04_lut_decoding_c_sme2.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/05_programming_luti_sme2.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/06_additional_luti_features.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/_index.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/_next-steps.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/code/.clang-format create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/code/Makefile create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/code/example_1_luti_sme2.c create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/code/luti_sme2_programming.c create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/code/luti_sme2_programming_test.c create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/images/luti2.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/images/luti4.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/images/luti_datatypes.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/luti/images/luti_flow_overview.png diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/01_overview.md b/content/learning-paths/mobile-graphics-and-gaming/luti/01_overview.md new file mode 100644 index 0000000000..2dd3bf2101 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/01_overview.md @@ -0,0 +1,101 @@ +--- +title: Understand why LUTI helps low-bit matrix multiplication +description: Understand how packed low-bit weights reduce memory traffic and how LUTI expands their indices inside an Arm vector data path. +weight: 2 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Overview +We are at a point where Large Language Model(LLM) inference on the CPU is practical on mobile and edge devices. This is due in large part to the rise of low-bit AI models. +Low-bit AI models store weights in compact packed format that must be efficiently expanded before matrix multiplication. You will see how 2-bit and 4-bit weights are stored, why conventional unpacking adds cycles, and how lookup-table instructions (LUTI) removes the unpacking step. + +By the end, you should be able to explain why packed low-bit indices are efficient for storage and memory traffic, how the indices are laid out in memory and how to use LUTI instructions to efficiently expand it. + +## Why use sub-byte weights? + +Large language model (LLM) inference on mobile and edge devices is often limited by memory capacity and bandwidth. During inference, model weights must be transferred from memory to the CPU, contributing to latency and energy use. + +Quantization reduces this traffic by storing weights in lower-precision formats. Weight-only quantization maps each 32-bit floating-point (`fp32`) weight to a compact logical code and stores shared metadata, such as a scale or zero point, for each block. + +{{% notice Note %}} The terms `4-bit` and `2-bit` specify the number of bits assigned to each logical code. These codes do not necessarily denote the numerical datatypes `int4` or `int2`. A `4-bit` or `2-bit` code might represent a signed integer, an unsigned integer, or an index into a codebook, depending on the quantization format. {{% /notice %}} + +Physical packing is the storage layout that places several low-bit codes into each byte. If you ignore the metadata, four `2-bit` codes or two `4-bit` codes can be stored in one byte. + +

+ Data Type Storage in Vector Register +

+ +

+ Figure 1. Packing low-bit weight codes into a scalable vector register. An int8 value occupies 1 byte, whereas one byte can hold four 2-bit codes or two 4-bit codes. Consequently, a 128-bit (16 bytes) vector can contain 16 int8 values, 32 packed 4-bit codes, or 64 packed 2-bit codes. + +

+ +This approach trades reconstruction accuracy for lower memory use. Its value also depends on decoding the packed codes efficiently. LUTI addresses that work by expanding low-bit codes directly into arithmetic-ready vector values. + +## Understand the LUTI operation + +Matrix multiplication kernels do not usually operate on packed 2-bit or 4-bit codes. +Before arithmetic, the codes must be decoded into values the computation can consume. + +Conceptually, the operation is: +```c +index = get_lut_index(packed_code); +expanded_value = lookup_table[index]; +``` + +Armv9-A LUTI instructions perform lookup-table operations that map low-bit indices to expanded values. LUTI2 and LUTI4 operate on 2-bit and 4-bit indices, respectively. + +- `LUTI2` uses each 2-bit index to select one of four lookup-table values. +- `LUTI4` uses each 4-bit index to select one of sixteen lookup-table values. + +The lookup table defines the expanded value associated with each code according to the quantization scheme. + +### LUT for 2-bit codes + +For example, a 2-bit lookup table might contain: + +| Packed Code | LUT Index | Expanded Value | +|---|---|---| +| `0b00` | lut[0] | `-2` | +| `0b01` | lut[1] | `-1` | +| `0b10` | lut[2] | `0` | +| `0b11` | lut[3] | `1` | + + +### From packed 2-bit codes to 8-bit values +The key benefit of LUTI is that the matrix multiplication kernel can load weights in their compact form. A source vector of packed weights therefore carries more values per memory load than a vector containing already expanded 8-bit, 16-bit, or 32-bit values. + +For 2-bit codes, LUTI uses the packed indices in a source vector to select lookup-table entries and writes the resulting values to destination vector registers. Figure 2 shows how 2-bit codes expand into 8-bit values. + +

+ Lookup-Table Overview +

+ +

+ Figure 2. LUTI maps packed 2-bit codes to lookup-table indices, selects the relevant 8-bit values, and writes them to a destination vector. Compared with storing expanded 8-bit values, the packed format allows each memory load to supply four times as many weights. + +

+ +## Identify LUTI responsibilities + +Keep these boundaries in mind when using LUTI: + +- The lookup table defines the meaning of each packed code +- LUTI2 and LUTI4 expand indices; they don't calculate quantization metadata +- Scaling, zero-point correction, bias, activation, clamping, and requantization remain separate operations +- Expansion happens in the vector path, close to the arithmetic that consumes the values + +## What you've learned and what's next +You've learned how LUTI uses packed low-bit codes as indices and expands them into values for subsequent arithmetic. + +Next, you'll set up the compiler and SME2 hardware needed to build and run the examples. diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/02_luti_and_sme2.md b/content/learning-paths/mobile-graphics-and-gaming/luti/02_luti_and_sme2.md new file mode 100644 index 0000000000..7ff19020b2 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/02_luti_and_sme2.md @@ -0,0 +1,148 @@ +--- +title: Use LUTI with SME2 +description: Trace packed indices through the SME2 ZT0 table, streaming Z registers, and ZA matrix accumulators. +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## SME and SME2 architectural features + +SME extends the Armv9-A architecture and accelerates matrix-heavy computations, such as outer products and matrix multiplication. +SME introduces __Streaming SVE mode__ and the __scalable ZA matrix-storage__ array. ZA accumulates matrix outer products and multi-vector dot products. + +SME2 builds on SME and adds __multi-vector instructions__ and the fixed __512-bit ZT0 lookup-table register__. + +For this learning path, the important points to note is that LUTI uses packed low-bit codes from Z source registers, reads the corresponding look-up table entries from `ZT0`, and writes expanded operands into Z destination registers. +The expanded operands can then be consumed by SME2 matrix instructions such as `SDOT` or `SMOPA`, with results accumulated in `ZA` array. + +## ZT0 lookup-table register + +SME2 provides a fixed 512-bit architectural register named `ZT0`. It contains 64 bytes, arranged as sixteen 32-bit table entries. + +

+ SME2 ZT0 Lookup-Table Register + SME2 ZT0 Lookup-Table Register +

+ +

+ Figure 3. ZT0 lookup-table organization and use by LUTI2 and LUTI4. ZT0 entries form a single linear table of entries 0–15. LUTI2 selects among entries 0–3 using 2-bit indices, while LUTI4 can select among all entries 0–15 using 4-bit indices. According to the destination element size, LUTI copies the low 8, 16, or 32 bits of the selected 32-bit table entry into the destination Z registers. + +

+ +LUTI instructions use packed low-bit indices from a source Z register (`Zn`) to select the corresponding `ZT0` register entry. + +The relevant `ZT0` entries are expanded to chosen output element destination width and written to output Z registers (`Zd`). + +LUTI2 and LUTI4 can populate one, two, or four destination Z registers. The number of destination registers and the expanded element width (`.B`, `.H`, or `.S`) determine how many packed source bits fill the destinations. + +The element suffix specifies the expanded destination width: +- `.B` produces 8-bit elements. +- `.H` produces 16-bit elements. +- `.S` produces 32-bit elements. + +## Streaming mode + +ZT0-based SME2 LUTI instructions need both streaming mode and ZA enabled. `SMSTART` enables the required state, and `SMSTOP` disables it. + +Streaming mode changes the execution context in three ways: + +- Vector and predicate lengths use the *streaming vector length* (SVL), which can differ from the non-streaming vector length +- Streaming instructions, including the multi-register LUTI2, SDOT, and SMOPA forms, become available +- `PSTATE.ZA` controls access to both the ZA matrix-storage array and `ZT0` + +Efficient kernels enter streaming mode before repeated loops and exit afterwards. Streaming mode does not automatically stream matrix data from memory. The kernel still loads only the current computation tile. + +## Follow the SME2 LUTI data path + +A simplified SME2 LUTI sequence is: + +```text +SMSTART +* load ZT0 once +* perform LUTI2 +SMSTOP +``` + +A detailed LUTI SME2 flow is: + 1. Enter SME streaming mode with `SMSTART` and load the LUT into the sixteen 32-bit `ZT0` register. + 2. Load LHS activations and packed RHS data for the current computation tile. + 3. Use LUTI2 or LUTI4 to expand the packed RHS indices from `ZT0` into Z registers. + 4. Feed the expanded RHS elements and LHS activations to SME2 instructions, such as `SDOT` or `SMOPA`. + 5. Accumulate partial matrix products in the SME2 `ZA` array. + 6. Convert, clamp, and store the completed output tile as required by the kernel. + 7. Exit SME streaming mode with `SMSTOP`. This disables the ZA and ZT0 state after the kernel completes. + +LUTI replaces the explicit unpack/decode portion of the data path. It does not replace the matrix multiply instruction that consumes the expanded values. + +### Example: kernel with LUTI2 + +This example shows how LUTI2 expands packed 2-bit RHS weights. It simplifies register allocation, predication, addressing, and loop control to focus on the LUTI data flow. + +{{% notice Note %}} This example uses a 512-bit streaming vector length (SVL). The SVL is a CPU specific property. {{% /notice %}} + +__1. Define and pass the LUT__ + +`ZT0` contains sixteen 32-bit entries. LUTI2 uses entries 0–3; entries 4–15 are unused and contain zero. +```c +static const int32_t lut_i8_i2[16] = {-2, -1, 0, 1,}; +``` + +For a `.B` LUTI result, the low 8 bits of the selected 32-bit entry form the destination element. + +__2. Load the LUT into ZT0__ + +Enter streaming mode, initialize ZA, and load ZT0. The lookup table does not change across the inner matrix loop, so load it once before the loop. + +```asm +smstart // Enable Streaming SVE mode and ZA/ZT0 state +zero {za} // Zero initialize accumulators for this output tile +ldr zt0, [x_lut] // load LUT into fixed 512-bit ZT0 table +``` + +__3. Load LHS and packed RHS__ + +Load the LHS activations and packed RHS 2-bit indices for the current computation tile, not the entire matrix. + +```asm +ld1rqb {z0.b}, ... , [x_lhs] // load LHS +ld1b {z16.b-z19.b}, ... , [x_packed_rhs] // load RHS packed 2-bit indices +``` + - The `z0.b` register receives the LHS activations. + - The `z16.b`–`z19.b` registers receive the packed RHS 2-bit indices. + +`ld1rqb` is the SVE load-and-replicate-quadword operation. For a 512-bit SVL, you can view `z0` as four 128-bit regions. `ld1rqb` replicates the 16-byte LHS block across those regions. + +__4. LUTI2 expands the packed indices__ +```asm +luti2 { z24.b - z27.b }, zt0, z16[0] // unpack 2-bit indices +luti2 { z4.b - z7.b }, zt0, z17[0] + +luti2 { z8.b - z11.b }, zt0, z18[0] +luti2 { z12.b - z15.b }, zt0, z19[0] +``` +Each LUTI2 instruction reads packed 2-bit indices from one source Z register (`z16` to `z19`) and expands them into four `.B` destination registers for a 512-bit SVL. + +__5. Feed the expanded vectors directly to SDOT__ + +The expanded vectors can now feed SME2 matrix instructions such as `SDOT` or `SMOPA`, which accumulate the results in `ZA`. + +## What you've learned and what's next + +You've learned how LUTI operates within SME2: a micro-kernel loads the lookup table into `ZT0`, uses packed low-bit indices in Z registers to expand the RHS values, and feeds those expanded values into SME2 instructions. + +Next, you'll apply these concepts to a complete low-bit matrix multiplication kernel and examine how LUTI can replace explicit unpacking and decoding in the inner computation loop. + +## Further reading +- [Arm SME2 Introduction](https://developer.arm.com/community/arm-community-blogs/b/architectures-and-processors-blog/posts/part4-arm-sme2-introduction) +- [SME2 lookup table Armv9-A Documentation](https://developer.arm.com/documentation/109246/0101/SME-Overview/SME-and-SME2/SME2-lookup-table) +- [Introduction to streaming and non-streaming mode](https://arm-software.github.io/acle/main/acle.html#controlling-the-use-of-streaming-mode) diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/03_environment_setup.md b/content/learning-paths/mobile-graphics-and-gaming/luti/03_environment_setup.md new file mode 100644 index 0000000000..18b1b897c9 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/03_environment_setup.md @@ -0,0 +1,193 @@ +--- +title: Set up the SME2 environment +description: Build and run the SME2 LUTI examples natively on macOS or cross-compile them for an Android device with SME2 support. +weight: 4 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Choose an SME2 execution environment + +You can run the examples using one of the following route: + +- Build and run natively on an arm64 macOS® device with an M4 processor or later +- Cross-compile on macOS or Linux and run on an Android™ phone with SME2 support + +See the [list of devices with native SME2 support](https://learn.arm.com/learning-paths/cross-platform/multiplying-matrices-with-sme2/1-get-started/#devices) before selecting a target device. + +The examples prefer LLVM Clang 22 or later because they use recent Arm C Language Extensions (ACLE) intrinsics and SME2 assembly syntax. The Makefile checks the appropriate compiler version before building. + +## Set up native macOS development + +Confirm that the system uses the `arm64` architecture: + +```bash +uname -m +``` + +The expected output is: + +```output +arm64 +``` + +Check that SME2 is available to applications and inspect the maximum streaming vector length (SVL): + +```bash +sysctl -n hw.optional.arm.FEAT_SME2 +sysctl -n hw.optional.arm.sme_max_svl_b +``` + +The first command must print `1`. The second command reports the maximum SVL in bytes. For example, `64` bytes corresponds to an SVL of 512 bits. + +Install Homebrew LLVM and confirm its version: + +```bash +brew install llvm +/opt/homebrew/opt/llvm/bin/clang --version +``` + +The Makefile selects Homebrew LLVM when it is installed. Otherwise, it falls +back to Apple Clang from the active Xcode Command Line Tools. + +## Set up Android cross-compilation +To run the LUTI examples codes on Android, install Android Native Development Kit (Android NDK): + +{{< tabpane code=true >}} + {{< tab header="macOS host" language="bash">}} +wget https://dl.google.com/android/repository/android-ndk-r29-darwin.zip +unzip android-ndk-r29-darwin.zip + {{< /tab >}} + {{< tab header="Linux host" language="bash">}} +wget https://dl.google.com/android/repository/android-ndk-r29-linux.zip +unzip android-ndk-r29-darwin.zip + {{< /tab >}} +{{< /tabpane >}} + +For easier access and execution of Android NDK tools, add these to the PATH and set the NDK_PATH variable: +{{< tabpane code=true >}} + {{< tab header="macOS host" language="bash">}} +export NDK_PATH=$HOME/Library/Android/android-ndk-r29/ +export ANDROID_NDK_HOME=$NDK_PATH + {{< /tab >}} + {{< tab header="Linux host" language="bash">}} +export NDK_PATH=$HOME/Android/android-ndk-r29/ +export ANDROID_NDK_HOME=$NDK_PATH + {{< /tab >}} +{{< /tabpane >}} + +Install Android Debug Bridge (`adb`) if it isn't already available: + +{{< tabpane code=true >}} + {{< tab header="macOS host" language="bash">}} +brew install android-platform-tools + {{< /tab >}} + {{< tab header="Linux host" language="bash">}} +sudo apt update +sudo apt install adb + {{< /tab >}} +{{< /tabpane >}} + +Enable developer options and USB debugging on the Android phone, connect it to the host, and accept the debugging prompt on the phone. Verify the connection: + +```bash +adb devices -l +``` + +Confirm that the device uses the `arm64-v8a` application binary interface (ABI): + +```bash +adb shell getprop ro.product.cpu.abi +``` + +The expected output is: + +```output +arm64-v8a +``` + +You can also inspect the CPU feature list: + +```bash +adb shell "grep -m1 '^Features' /proc/cpuinfo" +``` + +The executable performs the definitive runtime check. If SME2 isn't available to Android applications, it prints `SKIP: No support for SME2 on this device; SME2 tests were not run.` + +## Download and explore the code examples + +__[!REVIEW - ADD THE PUBLIC CODE-EXAMPLE ARCHIVE URL BEFORE PUBLISHING]__ + +Download and extract the published code-example archive, then change to its `code` directory. + +The directory contains these source and build files: + +```text +code/ +├── Makefile +├── example_1_luti_sme2.c +├── luti_sme2_programming.c +└── luti_sme2_programming_test.c +``` + +## Build and run on macOS + +From the `code` directory, clean previous outputs and build the native executable: + +```bash +make clean +make +``` + +Running `make macos` performs the same native build explicitly. Both commands +use `-march=native+sme2+nosve2+nosve`. The `+nosve2+nosve` modifiers prevent +the compiler from emitting non-streaming SVE or SVE2 instructions in the +macOS executable. + +Run the introductory plain C and SME2 comparison: + +```bash +./sme2_luti +``` + +Run the additional LUTI programming examples: + +```bash +./sme2_luti --learning +``` + +## Build and run on Android + +From the same `code` directory, cross-compile for Android: + +```bash +make clean +make android +``` +Connect your Android device to your development machine using a cable. +Approve the connection on your phone and use adb to copies the executable to `/data/local/tmp/sme2_luti_android`: + +```bash +adb push sme2_luti_android /data/local/tmp/sme2_luti_android +``` + +Start a new shell to access the device’s system from your development machine and runs the executable: + +``` +adb shell +./data/local/tmp/sme2_luti_android +``` + +Run the additional LUTI programming examples with: + +```bash +./data/local/tmp/sme2_luti_android --learning +``` + +## What you've accomplished and what's next + +You've prepared a compatible Clang compiler, verified an SME2-capable target, +and built the same executable for native macOS or AArch64 Android. + +Next, you'll use `example_1_luti_sme2.c` to compare plain C shifts, masks, and scalar lookups with SME2 `LUTI2` expansion and matrix accumulation. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/04_lut_decoding_c_sme2.md b/content/learning-paths/mobile-graphics-and-gaming/luti/04_lut_decoding_c_sme2.md new file mode 100644 index 0000000000..09eae32227 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/04_lut_decoding_c_sme2.md @@ -0,0 +1,344 @@ +--- +title: Compare plain C decoding with SME2 LUTI2 +description: Compare low-bit matrix multiplication in plain C with an SME2 implementation that uses LUTI2 and SMOPA. +weight: 5 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Compare plain C and SME2 + +In this section, you compare two ways to expand packed 2-bit right-hand side +(RHS) values for signed 8-bit matrix multiplication. + +The plain C reference extracts each index with a shift and mask. It then uses +the index to select a signed 8-bit value from the lookup table. The SME2 +implementation uses `LUTI2` to expand one packed vector and `SMOPA` to +accumulate four adjacent output panels in `ZA0`-`ZA3`. + +Both implementations use the same matrix dimensions, packed RHS bytes, and +lookup table. The program compares their output matrices element by element. + +## Set up the example + +Open `code/example_1_luti_sme2.c`. The file contains both implementations and +the validation code. The following snippets highlight the sections to inspect +before you build the complete example. + +### Inspect the matrix shape + +The example derives its matrix dimensions from the streaming vector length (SVL). +SVL is the number of bits in one streaming vector. + +Use these relationships when reasoning about the dimensions: + +- `svcntb()` returns the number of bytes in one streaming vector. +- `svcntw()` returns the number of 32-bit words in one streaming vector. +- One 32-bit word contains four bytes, so `svcntb() = 4 * svcntw()` + +The example uses those values to define the matrix shape: + +```c +const size_t m = streaming_vector_words(); // svcntw() +const size_t n = 4 * m; // svcntb() +``` + +Both implementations calculate: + +```text +DST[M, N] = LHS[M, K] x RHS[K, N] +``` + +`M` is the number of 32-bit words for one streaming vector: `M = svcntw()`. +`N` is the number of bytes in one streaming vector: `N = svcntb()`, which is equivalent to `N = 4 * M`. + +The example fixes `K = 4` for two related reasons. First, LUTI2 uses 2-bit lookup indices, so one packed RHS byte contains four 2-bit groups. +Those four groups provide the four RHS values along the K dimension for one output column. +Second, with `M = svcntw()`, setting `K = 4` makes the `M * K` signed 8-bit LHS block occupy exactly one streaming vector. + +For an SVL of 512 bits: + +- M = svcntw() = 512 / 32 = 16 +- N = svcntb() = 512 / 8 = 64 +- K = 4 + +| Block | Calculation | Size | +|---|---|---| +| LHS | `M * K = 16 * 4` | 64 signed 8-bit values | +| Logical RHS | `K * N = 4 * 64` | 256 2-bit codes | +| Packed RHS | `256 * 2 bits = 512 bits` | 64 bytes | +| DST | `M * N = 16 * 64` | 1024 signed 32-bit values | + +The complete LHS block and packed RHS block each fit in one streaming Z register. + +### Low-bit packed format + +For each output column, the packed RHS stores the four `K` dimension RHS values in one byte: rhs_packed[col]. +LUTI2 uses 2-bit indices, so the byte is split into four 2-bit groups. +Each group selects the lookup-table value for one RHS element, RHS[k, col]. + +```text +rhs_packed[col] +bits [7:6] | [5:4] | [3:2] | [1:0] +RHS: [k3,col] | [k2,col] | [k1,col] | [0k,col] +``` + +The example reads the 2-bit groups from the least-significant bits first. For example: + +```text +packed byte: 0xE4 = 11_10_01_00 + | | | | + k3 k2 k1 k0 + +lookup indices read in k order: 0, 1, 2, 3 +``` + +The example uses these constants in both implementations: + +```c +enum { + K = 4, + LUT_INDICES_PER_BYTE = 4, +}; +``` + +### Inspect the lookup table + +The example uses this mapping: + +```text +2-bit code index signed 8-bit value raw byte + 00 0 -3 0xFD + 01 1 -1 0xFF + 10 2 1 0x01 + 11 3 3 0x03 +``` + +```c +static const int8_t lut_i8_i2[16] = { + -3, -1, 1, 3, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +}; +``` + +The 2-bit indices select only entries 0-3. Entries 4-15 remain zero. + +## Inspect the plain C reference + +The plain C reference calculates one output element at a time. It reads one +packed RHS byte for each column. For each `k` position, the inner loop shifts +the corresponding 2-bit field into bits `[1:0]`, applies the `0x03` mask, +and uses the result to index `lut_i8_i2`. + +```c +static void plain_c_matmul( + const int8_t* lhs, + const uint8_t* rhs_packed, + int32_t* dst, + size_t m, + size_t n) { + + // Iterate over the output rows and columns. + for (size_t row = 0; row < m; ++row) { + for (size_t col = 0; col < n; ++col) { + + // Read the packed byte for this output column. + const uint8_t packed_byte = rhs_packed[col]; + + // Initialize the accumulator for this output element. + int32_t acc_sum = 0; + + for (size_t k_idx = 0; k_idx < K; ++k_idx) { + // Extract the 2-bit lookup table index for this k position. + const unsigned bit_shift = 2U * (unsigned)k_idx; + const uint8_t lut_idx = (uint8_t)((packed_byte >> bit_shift) & 0x3U); + const int8_t expanded_byte = lut_i8_i2[lut_idx]; + + // Widen the LHS and RHS values before multiplication. + const int32_t lhs_value = (int32_t)lhs[row * K + k_idx]; + const int32_t expanded_rhs_value = (int32_t)expanded_byte; + + acc_sum += lhs_value * expanded_rhs_value; + } + + // Store the accumulator in the corresponding output element. + dst[row * n + col] = acc_sum; + } + } +} +``` + +For each output element, the loop implements: + +```text +DST[row, col] = sum(k=0..3) LHS[row, k] * RHS[k, col] +``` + +The program uses this implementation as the correctness reference. The +innermost loop shifts, masks, looks up, and multiplies each value. + +## Inspect the SME2 LUTI2 implementation + +### Step 1: Store the same lookup values in `ZT0` + +The SME2 path uses the same logical lookup values. `ZT0` has a fixed physical +layout of sixteen 32-bit entries (64 bytes). + +```c +static const int32_t zt0_table[16] __attribute__((aligned(64))) = { + -3, -1, 1, 3, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +}; +``` + +`LUTI2 .B` selects entries 0-3 and copies the low byte of each selected +32-bit entry. The low bytes of `ZT0` entries 0-3 therefore match the bit +patterns in the plain C table for the four signed 8-bit values. + +### Step 2: Declare a locally streaming SME function + +```c +__arm_new("za", "zt0") __arm_locally_streaming +``` + +These attributes tell the compiler to run the function body in streaming +mode and provide new `ZA` and `ZT0` state for the function. + +### Step 3: Follow the SME2 compute path + +Review the SME2 implementation below. Inline assembly loads `ZT0`, expands +the packed RHS, and accumulates four output panels. ACLE intrinsics read `ZA` +and store the output matrix. + +```c +__arm_new("za", "zt0") __arm_locally_streaming +static void luti2_sme2_asm_matmul(const int8_t *lhs, + const uint8_t *rhs_packed, + int32_t *dst, size_t m, size_t n) { + __asm__ volatile( + "ptrue p0.b\n" + "ldr zt0, [%[table]]\n" // Load the lookup table into ZT0 + "zero {za}\n" // Clear all ZA accumulator state + + // Load one streaming vector from each input. + "ld1b {z0.b}, p0/z, [%[lhs]]\n" + "ld1b {z1.b}, p0/z, [%[rhs]]\n" + + // Expand one packed source vector into four signed 8-bit vectors. + "luti2 {z4.b-z7.b}, zt0, z1[0]\n" + + // Accumulate four adjacent M-by-M output panels in ZA0-ZA3. + "smopa za0.s, p0/m, p0/m, z0.b, z4.b\n" + "smopa za1.s, p0/m, p0/m, z0.b, z5.b\n" + "smopa za2.s, p0/m, p0/m, z0.b, z6.b\n" + "smopa za3.s, p0/m, p0/m, z0.b, z7.b\n" + : + : [lhs] "r"(lhs), + [rhs] "r"(rhs_packed), + [table] "r"(zt0_table) + : "p0", "z0", "z1", "z4", "z5", "z6", "z7", + "za", "zt0", "memory"); + + // Read four vectors from ZA and store them. + for (uint32_t row = 0; row < m; ++row) { + svint8x4_t read_tiles = svread_hor_za8_s8_vg4(0, 4 * row); + svint32x4_t output_tiles = svreinterpret_s32_s8_x4(read_tiles); + svst1_s32_x4( + svptrue_c32(), + dst + (size_t)row * n, + output_tiles); + } +} +``` + +The inline assembly loads the lookup table into `ZT0` and loads one vector +from each input. `LUTI2` expands the packed RHS into four vectors. Four +`SMOPA` instructions accumulate those vectors into `ZA0`-`ZA3`. + +The output loop reads one horizontal row across `ZA0`-`ZA3`. It +reinterprets the returned bytes as four vectors of `int32_t` accumulators and +stores them as one contiguous output row. + +`LUTI2` does not perform the multiplication. The packed RHS stays compact +until the matrix kernel needs it. The expanded values then pass directly from +Z registers to SME2 matrix instructions. + +To see the same instruction pattern in production code, inspect the +[`qai8dxp_qsu2csp` Arm® KleidiAI™ micro-kernel source](https://gitlab.arm.com/kleidi/kleidiai/-/blob/v1.30.0/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsu2cxp/kai_matmul_clamp_f32_qai8dxp1vlx4_qsu2cxp4vlx4_1vlx4vl_sme2_mopa_asm.S). + +## Build and validate the example + +From the `code` directory, compile `example_1_luti_sme2.c` with SME2 enabled: + +```bash +/opt/homebrew/opt/llvm/bin/clang \ + -O2 -Wall -Wextra -Werror \ + -march=native+sme2 \ + -isysroot "$(xcrun --show-sdk-path)" \ + example_1_luti_sme2.c \ + -o example_1_luti_sme2 +``` + +Run the example: + +```bash +./example_1_luti_sme2 +``` + +The program first prints the logical lookup table: + +```text +bits idx signed raw byte + 00 0 -3 0xFD + 01 1 -1 0xFF + 10 2 1 0x01 + 11 3 3 0x03 +``` + +It then prints sample packed bytes, their indices in `k0` to `k3` order, and +the signed and hexadecimal decoded values. + +After showing a preview of the result matrix, the program reports: + +```text +PASS: LUTI2 SME2 matches plain C matmul. +``` + +The program produces this message only after comparing every SME2 result +against the corresponding plain C result. + +## Inspect the generated SME2 instructions + +Disassemble the executable and confirm that the SME2 function contains +`LUTI2` followed by four `SMOPA` instructions. + +```bash +/opt/homebrew/opt/llvm/bin/llvm-objdump -d example_1_luti_sme2 | \ + grep -E "luti2|smopa" +``` + +## Check your understanding + +Before continuing, make sure you can explain: + +- Why one packed byte represents four values along the `K` dimension. +- Why the plain C shift counts are 0, 2, 4, and 6. +- Why the mask is `0x03`. +- How one `LUTI2` produces four decoded Z registers. +- Why four `SMOPA` instructions produce four adjacent output panels in + `ZA0`-`ZA3`. +- How the element-by-element comparison validates the SME2 result. + +## What you can do now and what's next + +You can now decode the same packed 2-bit RHS data in plain C or expand it with +SME2 `LUTI2`. You can also pass the expanded Z-register values directly to +`SMOPA` and accumulate signed 32-bit results in `ZA`. + +Next, develop intuition for programming LUTI instructions through practical +SME2 examples. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/05_programming_luti_sme2.md b/content/learning-paths/mobile-graphics-and-gaming/luti/05_programming_luti_sme2.md new file mode 100644 index 0000000000..41a7f072d1 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/05_programming_luti_sme2.md @@ -0,0 +1,307 @@ +--- +title: Program SME2 LUTI examples +description: Select LUTI destination groups and source segments for FP16 FMOPA and two-stage SDOT kernels. +weight: 6 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +The examples in `luti_sme2_programming.c` show a recipe-based approach to programming +with LUTI instructions. + +The examples cover the following combinations and have their base +in KleidiAI's matrix multiplication micro-kernels: + +| Example | Decode | Arithmetic | Main concept | +|---|---|---|---| +| One | LUTI4 to `float16` | GEMM using FMOPA | Use LUTI and source segments | +| Two | LUTI4, then LUTI2 to `int8` | GEMV using SDOT | Use multiple LUTs and source segments | + +## Run the learning tests + +From the `code` directory, run: + +```bash +./sme2_luti --learning +``` + +In the output, `SVL` is the streaming vector length in bits. `VL_b` is the +number of byte elements (`SVL / 8`), `VL_h` is the number of half-word +elements (`SVL / 16`), and `VL_s` is the number of 32-bit word elements +(`SVL / 32`). + +With a 512-bit SVL, the expected output is: +```output +FP16 LUTI4 + FMOPA test (M = VL_s, K = 2, N = 4 * VL_s) +PASS +LUTI4 -> LUTI2 -> SDOT test (M = 1, K = N = VL_b) +PASS +``` + +Each `PASS` confirms that the kernel matches the reference result. + +## The four-step LUTI recipe + +For every LUTI call, answer these questions. + +| Step | Decision | Result | +|---|---|---| +| 1 | What are the packed-index and table-element widths? | Choose the LUTI form and ZT0 register table-entry width. | +| 2 | What element type does the destination Z register require? | Select `.B`, `.H`, or `.S`. | +| 3 | How many destination Z registers do you need the lookup to fill? | Choose x1, x2, or x4 to match the target operation. | +| 4 | How much of the source Z register fills the destination register group? | Source-register segment | + +A *source segment* is the portion of one packed source Z register that fills the chosen destination group.
+Its selector is relative to the destination-group size.
+The examples use several source-segment cases to help you develop intuition for selecting the correct segment. + + +## Example 1: LUTI4 for FP16 GEMM using FMOPA + +This example is a focused extraction from KleidiAI's +[FP16 LUTI4 FMOPA micro-kernel](https://gitlab.arm.com/kleidi/kleidiai/-/blob/v1.30.0/kai/ukernels/matmul/matmul_clamp_f32_f16p_qsi4c32p/kai_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa.c). +The example uses 4-bit codes as indices that map to `float16` values. +This example shows how the source-index segment is interpreted relative to the destination-group size. +This section uses generic SVL terminology to explain the example. + +```c +__arm_new("za", "zt0") __arm_locally_streaming void arm_lp_gemm_luti4( + const float16_t* lhs, const uint8_t* rhs_indices, float32_t* out, const uint32_t* zt0_lut) { + uint32_t m = svcntw(); // Number of FP32 rows/columns in one ZA tile. + + /* LUTI4 decode + * +------+---------------------------+----------------------------------------+ + * | Step | Decision | Choice | + * +------+---------------------------+----------------------------------------+ + * | 1 | Index and table width | 4-bit index | + * | | | 16-bit ZT0 LUT register element | + * | 2 | Destination element type | .H, because FMOPA consumes FP16 | + * | 3 | Destination group | x1 for rhs_0/rhs_1, then x2 for rhs_23 | + * +------+---------------------------+----------------------------------------+ + */ + + // There are more than one ways to reason about the number of input segment. Here, we go + // about it from the source register as the reference point. + + // Load the LUT + svldr_zt(0, zt0_lut); + svzero_za(); + + // Load the LHS + svbool_t pg = svptrue_b16(); + svfloat16_t lhs_ip = svld1_f16(pg, lhs); + + // Load one source register of indices + svuint8_t s4_indices = svld1_u8(svptrue_b8(), rhs_indices); + + // Case 1: a single-register destination group uses one of four segments. + + // Step 4 : Number of input segments for x1 + // -------------------------------------------- + // one byte of index produces two half words after the look up. + // VL_b bytes of indices from a source register produces 2 * VL_h half-word elements or + // 4 * VL_b bytes. + // In other words, to fill VL_b bytes of destination, VL_b / 4 bytes + // is needed => 4 input segments with values 0, 1, 2 and 3 + + // + // source z register: Packed indices + // +-------------+-------------+-------------+-------------+ + // | segment [3] | segment [2] | segment [1] | segment [0] | + // +-------------+-------------+-------------+-------------+ + // | + // | LUTI4 .H, segment [0] + // v + // destination z register with F16 elements + // +----------------------------------------------------+ + // | VL_h elements | + // +----------------------------------------------------+ + + // Unpredicated LUTI read. + svfloat16_t rhs_0 = svluti4_lane_zt_f16(0, s4_indices, /* segment */ 0); + svfloat16_t rhs_1 = svluti4_lane_zt_f16(0, s4_indices, /* segment */ 1); + + // Case 2: a two-register destination group using one of two segments. + + // Step 4 : Number of input segments for x2 + // -------------------------------------------- + // VL_b bytes of indices from a source register produces 2 * VL_h half-word elements or + // 4 * VL_b bytes. + // In other words, to fill 2 * VL_b bytes of destination, VL_b / 2 bytes + // is needed => 2 segments with values 0 and 1 + // + // source z register: packed indices + // +---------------------------+---------------------------+ + // | segment [1] | segment [0] | + // +---------------------------+---------------------------+ + // | + // | LUTI4 .H, segment [1] + // v + // two-register destination z register group + // +---------------------+---------------------+ + // | destination 1 | destination 0 | + // | VL_h elements | VL_h elements | + // +---------------------+---------------------+ + svfloat16x2_t rhs_23 = svluti4_lane_zt_f16_x2(0, s4_indices, /* Segment */ 1); + + svmopa_za32_f16_m(0, pg, pg, lhs_ip, rhs_0); + svmopa_za32_f16_m(1, pg, pg, lhs_ip, rhs_1); + svmopa_za32_f16_m(2, pg, pg, lhs_ip, svget2_f16(rhs_23, 0)); + svmopa_za32_f16_m(3, pg, pg, lhs_ip, svget2_f16(rhs_23, 1)); + + // Extract out the data from ZA tiles and store + for (uint32_t i_m = 0; i_m < m; i_m += 1) { + svfloat32x4_t out_row = svread_hor_za32_f32_vg4(0, 4 * i_m); + svst1_f32_x4(svptrue_c32(), out + ((size_t)4 * i_m * m), out_row); + } +} +``` +## Two-stage LUTI4 and LUTI2 for GEMV using SDOT + +The SDOT micro-kernel and block size are similar to the KleidiAI's +[SDOT micro-kernel](https://gitlab.arm.com/kleidi/kleidiai/-/blob/v1.30.0/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp1x4_qsi4cxp4vlx4_1x4vl_sme2_sdot.c), +with two LUTs added to implement a two-stage decode of vector-quantized +weights. + +### Define the terms + +In this context, vector quantization uses a 4-bit code as an index to select an 8-bit codeword that represents a four-weight pattern. The sixteen `ZT0` entries represent sixteen unique patterns. + +The two-stage decode uses LUTI4 to select an 8-bit codeword, then LUTI2 to map the codeword to four 8-bit numerical values. + +This encoding reduces the bytes required to store weights. +```text + packed 4-bit pattern ID + +-----------------------------+ + | index[3:0] | + +-----------------------------+ + | + | LUTI4: select one 8-bit codeword from ZT0 + v + packed 8-bit data with 2-bit symbols + +--------+--------+--------+--------+ + | sym[3] | sym[2] | sym[1] | sym[0] | + | 2 bits| 2 bits| 2 bits| 2 bits| + +--------+--------+--------+--------+ + | | | | + +--------+--------+--------+ + | LUTI2: expand each 2-bit symbol from ZT0 + v + +--------+--------+--------+--------+ + | weight3| weight2| weight1| weight0| + | int8 | int8 | int8 | int8 | + +--------+--------+--------+--------+ + +``` + +```c +__arm_new("za", "zt0") __arm_locally_streaming void arm_lp_gemv_luti2_luti4( + const int8_t* lhs, const uint8_t* rhs_indices, int32_t* out, + const uint32_t* zt0_luti4, const uint32_t* zt0_luti2) { + const size_t vl_b = svcntb(); + const size_t lhs_blocks = vl_b / 16; + const svbool_t pg8 = svptrue_b8(); + const svcount_t pn8 = svptrue_c8(); + + assert(lhs != NULL); + assert(rhs_indices != NULL); + assert(out != NULL); + assert(zt0_luti4 != NULL); + assert(zt0_luti2 != NULL); + assert(vl_b % 16 == 0); + + svzero_za(); + for (size_t i_k = 0; i_k < lhs_blocks; i_k++) { + // For a SVL of 512 bits: SVL_b = 64 bytes and SVL_s = 16 words. + + // Replicated read of one 16-byte LHS block for SDOT lanes. + svint8_t lhs_ip = svld1rq_s8(pg8, lhs); + lhs += 16; + + /* LUTI4 decode (first stage) + * +------+---------------------------+----------------------------------------+ + * | Step | Decision | Choice | + * +------+---------------------------+----------------------------------------+ + * | 1 | Index and table width | 4-bit index | + * | | | 8-bit ZT0 LUT register element | + * | 2 | Destination element type | NA. Second decode stage addresses this | + * | 3 | Destination group | x2 for patterns_01 and patterns_23 | + * +------+---------------------------+----------------------------------------+ + */ + + // Two source registers provide the four packed 2-bit vectors needed for the second stage. + svuint8x2_t rhs_packed = svld1_u8_x2(pn8, rhs_indices); + rhs_indices += 2 * vl_b; + + // Load LUT 1 + svldr_zt(0, zt0_luti4); + + // Step 4 : Number of input segments for x2 + // -------------------------------------------- + // One packed byte contains two 4-bit indices and produces two bytes + // after the lookup. SVL_b bytes of indices from one source register + // therefore produce 2 * SVL_b bytes, filling the x2 destination + // group. This uses one input segment with value 0. + + svuint8x2_t patterns_01 = svluti4_lane_zt_u8_x2(0, svget2_u8(rhs_packed, 0), 0); + svuint8x2_t patterns_23 = svluti4_lane_zt_u8_x2(0, svget2_u8(rhs_packed, 1), 0); + + /* LUTI2 decode (second stage) + * +------+---------------------------+----------------------------------------+ + * | Step | Decision | Choice | + * +------+---------------------------+----------------------------------------+ + * | 1 | Index and table width | 2-bit index | + * | | | 8-bit ZT0 LUT register element | + * | 2 | Destination element type | .B, SDOT consumes int8 | + * | 3 | Destination group | x4 for rhs_unpacked | + * +------+---------------------------+----------------------------------------+ + */ + + // Load LUT 2 + svldr_zt(0, zt0_luti2); + + // Step 4 : Number of input segments for x4 + // -------------------------------------------- + // One packed byte contains four 2-bit indices and produces four + // bytes after the lookup. SVL_b bytes of indices from one source + // register therefore produce 4 * SVL_b bytes, filling the x4 + // destination group. This uses one input segment with value 0. + + svint8x4_t rhs_unpacked = svreinterpret_s8_u8_x4(svluti2_lane_zt_u8_x4(0, svget2_u8(patterns_01, 0), 0)); + + // Process k index of 0 to 3. + // Process 1VL_s of N + svdot_lane_za32_s8_vg1x4(0, rhs_unpacked, lhs_ip, /* Lane */ 0); + + rhs_unpacked = svreinterpret_s8_u8_x4(svluti2_lane_zt_u8_x4(0, svget2_u8(patterns_01, 1), 0)); + + // Process k index of 4 to 7 + // process next 1VL_s of N + svdot_lane_za32_s8_vg1x4(0, rhs_unpacked, lhs_ip, /* Lane */ 1); + + rhs_unpacked = svreinterpret_s8_u8_x4(svluti2_lane_zt_u8_x4(0, svget2_u8(patterns_23, 0), 0)); + + // Process k index of 8 to 11 + // Process next 1VL_s of N + svdot_lane_za32_s8_vg1x4(0, rhs_unpacked, lhs_ip, /* Lane */ 2); + + rhs_unpacked = svreinterpret_s8_u8_x4(svluti2_lane_zt_u8_x4(0, svget2_u8(patterns_23, 1), 0)); + + // Process k index of 12 to 15 + // Process next 1VL_s or N + svdot_lane_za32_s8_vg1x4(0, rhs_unpacked, lhs_ip, /* Lane */ 3); + + // Total processed: 16 K-values, 4VL_s N values + } + + svint32x4_t result = svread_za32_s32_vg1x4(0); + svst1_s32_x4(svptrue_c32(), out, result); +} +``` + +## What you've learned in this section + +You've seen how destination-group size determines the meaning of a source +segment, and how the same four-step method applies once or repeatedly in a +multi-stage decode. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/06_additional_luti_features.md b/content/learning-paths/mobile-graphics-and-gaming/luti/06_additional_luti_features.md new file mode 100644 index 0000000000..41ce92e024 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/06_additional_luti_features.md @@ -0,0 +1,114 @@ +--- +title: Identify additional LUTI features +description: Compare ZT0 and Z-register lookup tables, SME2.1 destination forms, and their compile-time feature macros. +weight: 7 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +The earlier examples use the original SME2 lookup path: a table in `ZT0`, +packed indices in Z registers, and one or more Z-register results. Other +architectural features use a different table source or add specialized forms. + +## Compare the feature paths + +| Feature path | Table source | Execution state | Distinguishing capability | +|---|---|---|---| +| `FEAT_SME2` | Fixed 512-bit `ZT0` | Streaming mode with ZA enabled | `LUTI2` and `LUTI4` can produce one, two, or four Z-register results, subject to the element-width encoding | +| `FEAT_SME2p1` | Fixed 512-bit `ZT0` | Streaming mode with ZA enabled | Extends the SME2 forms with strided destination pairs and quads | +| `FEAT_LUT` with `FEAT_SVE2` or `FEAT_SME2` | One or two scalable Z registers | Non-streaming SVE or Streaming SVE, respectively | Add Z-register table forms of `LUTI2` and `LUTI4` which produce one Z-register result without using `ZT0` | + +## Use Z-register tables with FEAT_LUT + +`FEAT_LUT` expand the functionality of `FEAT_SME2` allowing to use scalable Z registers as the lookup-table source. This provide an alternative to using the `ZT0` register. + +```text +table Z register(s) + packed-index Z register + | + LUTI2/LUTI4 + | + one result Z register +``` + +Use this form for vector kernels that do not need `ZT0` register and where multiple LUT are +required by the algorithm. + +For example, the two-stage vector decode loop in section 5 reloads `ZT0` for its LUTI4 and +LUTI2 tables. With `FEAT_LUT`, load separate Z-register tables once before +the loop with the appropriate predicate. For the byte forms shown here, the +LUTI4 load needs 16 active lanes and the LUTI2 load needs 4. + +```c +const svuint8_t luti4_table_z = svld1_u8(pg_1, luti4_table_storage); +const svuint8_t luti2_table_z = svld1_u8(pg_2, luti2_table_storage); + +for (size_t i_k = 0; i_k < lhs_blocks; ++i_k) { + svuint8_t packed_indices = svld1_u8(pg8, rhs_indices); + rhs_indices += vl_b; +``` + svldr_zt(0, zt0_luti4); +```c + svuint8_t codewords = + svluti4_lane_u8(luti4_table_z, packed_indices, /* segment */ 0); + .. +``` + svldr_zt(0, zt0_luti2); +```c + svint8_t values = svreinterpret_s8_u8( + svluti2_lane_u8(luti2_table_z, codewords, /* segment */ 0)); + // Consume values, then continue with the next input block. + .. +} +``` + +Each Z-register-table LUTI instruction produces one destination Z register. +The table entries are the one or two SVL-sized Z register. The logical LUT is still the four entries for LUTI2 +or sixteen entries for LUTI4. + +## Place results with FEAT_SME2p1 + +The SME2 examples use consecutive destination registers. `FEAT_SME2p1` extends the `ZT0` SME2 forms with strided destination pairs and quads: + +```text +Consecutive pair: { z0, z1 } +Strided pair: { z0, z8 } + +Consecutive quad: { z0, z1, z2, z3 } +Strided quad: { z0, z4, z8, z12 } +``` + +For example, the following LUTI2 instruction writes a strided destination quad: +```asm +luti2 {z0.b, z4.b, z8.b, z12.b}, zt0, z1[0] +``` + +This form gives the register allocator more placement options. It does not change +the index width, table contents, or number of results produced by the +instruction. + +## Check compiler feature macros + +Use ACLE macros to guard the currently standardized intrinsic families: + +```c +#if defined(__ARM_FEATURE_SME2) +// Original ZT0-based LUTI2 and LUTI4 forms. +#endif + +#if defined(__ARM_FEATURE_LUT) && \ + (defined(__ARM_FEATURE_SVE2) || defined(__ARM_FEATURE_SME2)) +// Z-register table forms. +#endif + +#if defined(__ARM_FEATURE_SME2p1) +// SME2.1 forms, including strided destination groups. +#endif +``` + +These macros describe the compiler target. Runtime dispatch separately checks +that the operating system exposes the required feature on the current processor. + +## What you've learned + +You've identified the table source, execution state, output shape, and feature macro for the main LUTI variants. Use these distinctions when selecting an instruction form and when adding compile-time and runtime feature checks to production code. diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/_index.md b/content/learning-paths/mobile-graphics-and-gaming/luti/_index.md new file mode 100644 index 0000000000..a4a0968d6f --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/_index.md @@ -0,0 +1,84 @@ +--- +title: Decode low-bit weights with Arm SME2 LUTI instructions + +minutes_to_complete: 60 + +who_is_this_for: This is an advanced topic for developers who want to efficiently decode packed low-bit weights inside a SME2 matrix multiplication kernel. + +learning_objectives: + - Explain how LUTI2 expands packed 2-bit indices into arithmetic-ready values + - Explain how to implement equivalent low-bit decode paths using plain C and SME2 LUTI2 + - Validate the implementations against a scalar reference and inspect the generated SME2 instructions + - A recipe-based approach to programming with LUTI instructions + +prerequisites: + - Familiarity with C, AArch64 assembly, quantization, and matrix multiplication + - Understanding of SME2 streaming mode and ZA storage; see [Accelerate matrix multiplication performance with SME2](/learning-paths/cross-platform/multiplying-matrices-with-sme2/) + - A Mac system with Apple silicon (M4 or later), or an Android device with SME2 support + - Git and LLVM Clang 22 or later for native macOS builds; Apple Clang 21 or later is supported as a fallback + - Android NDK with LLVM Clang 21 or later for Android builds + + +author: + - Aude Vuilliomenet + - Felix Johnny Thomasmathibalan + +# New Learning Paths are opted in for the next manual generated summary/FAQ run. +# The generator resets this to false after a successful write. +generate_summary_faq: true + +# Optional one-shot controls: set either field to true to regenerate just that +# generated section the next time the summary/FAQ tool runs. The tool resets +# them to false after a successful write. +rerun_summary: false +rerun_faqs: false + +### Tags +skilllevels: Advanced +subjects: Performance and Architecture +armips: + - Arm C1 +tools_software_languages: + - C + - Assembly + - LLVM + - Clang + - SME2 +operatingsystems: + - macOS + - Linux + - Android + +further_reading: + - resource: + title: SME2 lookup table + link: https://developer.arm.com/documentation/109246/0101/SME-Overview/SME-and-SME2/SME2-lookup-table + type: documentation + - resource: + title: LUTI2 lookup-table read with 2-bit indices + link: https://developer.arm.com/documentation/ddi0602/2025-12/SVE-Instructions/LUTI2--8-bit-and-16-bit---Lookup-table-read-with-2-bit-indices--8-bit-and-16-bit--?lang=en + type: documentation + - resource: + title: LUTI4 lookup-table read with 4-bit indices + link: https://developer.arm.com/documentation/ddi0602/2025-12/SVE-Instructions/LUTI4--8-bit-and-16-bit---Lookup-table-read-with-4-bit-indices--8-bit-and-16-bit--?lang=en + type: documentation + - resource: + title: Set up your SME2 development environment + link: /learning-paths/cross-platform/multiplying-matrices-with-sme2/1-get-started/ + type: documentation + - resource: + title: Understand SME2 outer products + link: /learning-paths/cross-platform/multiplying-matrices-with-sme2/5-outer-product/ + type: documentation + - resource: + title: KleidiAI project + link: https://github.com/ARM-software/kleidiai + type: website + + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/_next-steps.md b/content/learning-paths/mobile-graphics-and-gaming/luti/_next-steps.md new file mode 100644 index 0000000000..727b395ddd --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # The weight controls the order of the pages. _index.md always has weight 1. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/code/.clang-format b/content/learning-paths/mobile-graphics-and-gaming/luti/code/.clang-format new file mode 100644 index 0000000000..140efccf6e --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/code/.clang-format @@ -0,0 +1,18 @@ +# +# SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates +# +# SPDX-License-Identifier: Apache-2.0 +# +--- +Language: Cpp +BasedOnStyle: Google +ColumnLimit: 120 + +AccessModifierOffset: -4 +AlignAfterOpenBracket: AlwaysBreak +AlignOperands: DontAlign +AllowShortFunctionsOnASingleLine: None +BreakConstructorInitializers: AfterColon +DerivePointerAlignment: false +IndentWidth: 4 +PointerAlignment: Left diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/code/Makefile b/content/learning-paths/mobile-graphics-and-gaming/luti/code/Makefile new file mode 100644 index 0000000000..8e0fd3c461 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/code/Makefile @@ -0,0 +1,130 @@ +# +# SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates +# +# SPDX-License-Identifier: Apache-2.0 +# + +TARGET := sme2_luti +ANDROID_TARGET := sme2_luti_android +ZREG_EXPERIMENT_TARGET := sme2_luti_zreg_experiment + +EXAMPLE_1_SOURCE := example_1_luti_sme2.c +MACOS_EXAMPLE_1_OBJECT := example_1_luti_sme2_macos.o +ANDROID_EXAMPLE_1_OBJECT := example_1_luti_sme2_android.o +COMMON_SOURCES := luti_sme2_programming.c luti_sme2_programming_test.c + +CFLAGS ?= -O2 -Wall -Wextra -Werror +# NDK r29's Clang 21 miscompiles the chained LUTI4-to-LUTI2 example when +# optimization is enabled, so keep Android builds unoptimized. +ANDROID_CFLAGS ?= -O0 -Wall -Wextra -Werror +MACOS_LLVM_MIN_VERSION := 22 +MACOS_APPLE_CLANG_MIN_VERSION := 21 +ANDROID_LLVM_MIN_VERSION := 21 + +# Native macOS build settings. Prefer Homebrew LLVM and fall back to the +# active Xcode Apple Clang when Homebrew LLVM is not installed. +MACOS_LLVM_CC ?= $(firstword $(wildcard /opt/homebrew/opt/llvm/bin/clang /usr/local/opt/llvm/bin/clang)) +MACOS_APPLE_CLANG_CC ?= $(shell xcrun --find clang 2>/dev/null) +MACOS_CC ?= $(if $(MACOS_LLVM_CC),$(MACOS_LLVM_CC),$(MACOS_APPLE_CLANG_CC)) +MACOS_SDKROOT ?= $(shell xcrun --show-sdk-path 2>/dev/null) +MACOS_SME_CFLAGS ?= -march=native+sme2+nosve2+nosve -isysroot $(MACOS_SDKROOT) +MACOS_ZREG_SME_CFLAGS ?= -march=native+sme2+lut+nosve2+nosve -isysroot $(MACOS_SDKROOT) + +# Android cross-build settings. The NDK provides an LLVM/Clang wrapper for +# the selected API level and the target AArch64 Android sysroot. +ANDROID_API ?= 35 +ANDROID_NDK_HOME ?= $(NDK) +HOST_OS := $(shell uname -s) +ifeq ($(HOST_OS),Darwin) +ANDROID_HOST_TAG ?= darwin-x86_64 +else ifeq ($(HOST_OS),Linux) +ANDROID_HOST_TAG ?= linux-x86_64 +else +ANDROID_HOST_TAG ?= unsupported +endif +ANDROID_TOOLCHAIN := $(ANDROID_NDK_HOME)/toolchains/llvm/prebuilt/$(ANDROID_HOST_TAG) +ANDROID_CC := $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android$(ANDROID_API)-clang +ANDROID_SME_CFLAGS ?= -march=armv9.2-a+sme2 + +.PHONY: all macos android clean check-llvm check-macos-llvm \ + check-android-llvm run test zreg-luti-experiment + +all: macos + +macos: check-macos-llvm $(TARGET) + +check-llvm: check-macos-llvm + +check-macos-llvm: + @if [ "$(HOST_OS)" != "Darwin" ]; then \ + echo "error: the native target requires macOS; use 'make android' to cross-compile for Android" >&2; \ + exit 1; \ + fi + @if [ ! -x "$(MACOS_CC)" ]; then \ + echo "error: a macOS Clang compiler was not found; install Homebrew LLVM or the Xcode Command Line Tools, or set MACOS_CC" >&2; \ + exit 1; \ + fi + @version="$$($(MACOS_CC) --version 2>/dev/null)"; \ + major="$$($(MACOS_CC) -dumpversion 2>/dev/null | sed 's/\..*//')"; \ + case "$$version" in \ + *"Apple clang"*) compiler="Apple Clang"; minimum=$(MACOS_APPLE_CLANG_MIN_VERSION) ;; \ + *) compiler="LLVM Clang"; minimum=$(MACOS_LLVM_MIN_VERSION) ;; \ + esac; \ + case "$$major" in \ + ''|*[!0-9]*) valid=no ;; \ + *) valid=yes ;; \ + esac; \ + if [ "$$valid" != yes ] || [ "$$major" -lt "$$minimum" ]; then \ + echo "error: $$compiler $$minimum or newer is required for macOS; found '$$major' from $(MACOS_CC)" >&2; \ + exit 1; \ + fi + +$(TARGET): $(COMMON_SOURCES) $(MACOS_EXAMPLE_1_OBJECT) + $(MACOS_CC) $(CFLAGS) $(MACOS_SME_CFLAGS) $^ -o $@ + +$(MACOS_EXAMPLE_1_OBJECT): $(EXAMPLE_1_SOURCE) + $(MACOS_CC) $(CFLAGS) $(MACOS_SME_CFLAGS) -Dmain=ex1_luti_test -c $< -o $@ + +run test: macos + ./$(TARGET) + +android: check-android-llvm $(ANDROID_TARGET) + +check-android-llvm: + @if [ "$(ANDROID_HOST_TAG)" = "unsupported" ]; then \ + echo "error: Android cross-compilation is supported from macOS and Linux hosts" >&2; \ + exit 1; \ + fi + @if [ -z "$(ANDROID_NDK_HOME)" ]; then \ + echo "error: set ANDROID_NDK_HOME (or NDK) to your Android NDK directory" >&2; \ + exit 1; \ + fi + @if [ ! -x "$(ANDROID_CC)" ]; then \ + echo "error: Android LLVM Clang was not found at $(ANDROID_CC)" >&2; \ + exit 1; \ + fi + @major="$$($(ANDROID_CC) -dumpversion 2>/dev/null | sed 's/\..*//')"; \ + case "$$major" in \ + ''|*[!0-9]*) valid=no ;; \ + *) valid=yes ;; \ + esac; \ + if [ "$$valid" != yes ] || [ "$$major" -lt $(ANDROID_LLVM_MIN_VERSION) ]; then \ + echo "error: Android NDK LLVM $(ANDROID_LLVM_MIN_VERSION) or newer is required; found '$$major' from $(ANDROID_CC)" >&2; \ + exit 1; \ + fi + +$(ANDROID_TARGET): $(COMMON_SOURCES) $(ANDROID_EXAMPLE_1_OBJECT) + $(ANDROID_CC) $(ANDROID_CFLAGS) $(ANDROID_SME_CFLAGS) $^ -o $@ + +$(ANDROID_EXAMPLE_1_OBJECT): $(EXAMPLE_1_SOURCE) + $(ANDROID_CC) $(ANDROID_CFLAGS) $(ANDROID_SME_CFLAGS) -Dmain=ex1_luti_test -c $< -o $@ + +zreg-luti-experiment: check-macos-llvm $(COMMON_SOURCES) $(MACOS_EXAMPLE_1_OBJECT) + $(MACOS_CC) $(CFLAGS) $(MACOS_ZREG_SME_CFLAGS) \ + -DENABLE_ZREG_LUTI_EXPERIMENT $(COMMON_SOURCES) \ + $(MACOS_EXAMPLE_1_OBJECT) -o $(ZREG_EXPERIMENT_TARGET) + +clean: + $(RM) $(TARGET) $(ANDROID_TARGET) $(ZREG_EXPERIMENT_TARGET) \ + $(MACOS_EXAMPLE_1_OBJECT) $(ANDROID_EXAMPLE_1_OBJECT) \ + example_1_luti_sme2_test.o \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/code/example_1_luti_sme2.c b/content/learning-paths/mobile-graphics-and-gaming/luti/code/example_1_luti_sme2.c new file mode 100644 index 0000000000..bd66587fde --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/code/example_1_luti_sme2.c @@ -0,0 +1,305 @@ +/* + * SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include + +// This example assumes it runs on an SME2-compatible system. It deliberately +// performs no runtime capability check. +#if !defined(__ARM_FEATURE_SME2) +#error "Compile with SME2 enabled, for example -march=armv9.2-a+sme2+nosve2+nosve" +#endif + +__arm_new("za", "zt0") __arm_locally_streaming void arm_lp_gemm_luti4( + const float16_t* lhs, const uint8_t* rhs_indices, float32_t* out, const uint32_t* zt0_lut); + +__arm_new("za", "zt0") __arm_locally_streaming void arm_lp_gemv_luti2_luti4( + const int8_t* lhs, const uint8_t* rhs_indices, int32_t* out, const uint32_t* zt0_luti4, const uint32_t* zt0_luti2); + +int ex1_luti_test(void); + +__arm_locally_streaming static size_t get_streaming_vector_bytes(void) { + return svcntb(); +} + +__arm_locally_streaming static uint32_t get_streaming_vl_words(void) { + return svcntw(); +} + +static int compare_outputs_i32( + const int32_t* actual, const int32_t* expected, size_t rows, size_t columns, const char* test_name) { + for (size_t row = 0; row < rows; ++row) + for (size_t column = 0; column < columns; ++column) { + size_t index = row * columns + column; + if (actual[index] != expected[index]) { + fprintf( + stderr, "%s: FAIL at row %zu, column %zu: got %d, expected %d\n", test_name, row, column, + actual[index], expected[index]); + return 1; + } + } + return 0; +} + +/* -------------------------------------------------------------------------- */ +/* Reference matrix multiplication */ +/* -------------------------------------------------------------------------- */ + +// Fixed GEMV shape: M = 1 and K = N = VL_b. The RHS is packed as +// (VL_b / 4) rows of 4 * VL_b bytes, one row for each four-element K group. +static void arm_lp_gemv_luti2_luti4_ref(const int8_t* lhs, const int8_t* rhs, int32_t* out) { + const size_t vl_b = get_streaming_vector_bytes(); + + for (size_t n = 0; n < vl_b; ++n) { + int32_t sum = 0; + for (size_t k = 0; k < vl_b; ++k) sum += (int32_t)lhs[k] * (int32_t)rhs[k * vl_b + n]; + out[n] = sum; + } +} + +// SME2 SDOT reference implementation using already-unpacked RHS weights. +__arm_new("za") __arm_locally_streaming static void arm_lp_matmul_s8_s8_dotprod( + const int8_t* lhs, const int8_t* rhs_packed, int32_t* out) { + const size_t vl_b = svcntb(); + const size_t lhs_blocks = vl_b / 16; // 16 bytes in a 128-bit LHS block. + const svbool_t pg8 = svptrue_b8(); + const svcount_t pn8 = svptrue_c8(); + + svzero_za(); + for (size_t i_k = 0; i_k < lhs_blocks; ++i_k) { + svint8_t lhs_vec = svld1rq_s8(pg8, lhs); + lhs += 16; + + svint8x4_t rhs_vec = svld1_s8_x4(pn8, rhs_packed); + rhs_packed += 4 * vl_b; + svdot_lane_za32_s8_vg1x4(0, rhs_vec, lhs_vec, 0); + + rhs_vec = svld1_s8_x4(pn8, rhs_packed); + rhs_packed += 4 * vl_b; + svdot_lane_za32_s8_vg1x4(0, rhs_vec, lhs_vec, 1); + + rhs_vec = svld1_s8_x4(pn8, rhs_packed); + rhs_packed += 4 * vl_b; + svdot_lane_za32_s8_vg1x4(0, rhs_vec, lhs_vec, 2); + + rhs_vec = svld1_s8_x4(pn8, rhs_packed); + rhs_packed += 4 * vl_b; + svdot_lane_za32_s8_vg1x4(0, rhs_vec, lhs_vec, 3); + } + + svint32x4_t result = svread_za32_s32_vg1x4(0); + svst1_s32_x4(svptrue_c32(), out, result); +} + +/* -------------------------------------------------------------------------- */ +/* Reference packing */ +/* -------------------------------------------------------------------------- */ + +// Pack dense int8 RHS weights for the SME2 SDOT reference implementation. +__arm_locally_streaming static void arm_lp_matmul_s8_s8_dotprod_rhs_pack_ref(const int8_t* rhs, int8_t* rhs_packed) { + const size_t kr = 4; + const size_t vl_b = get_streaming_vector_bytes(); + const size_t columns_per_vector = svcntw(); + + for (size_t k_group = 0; k_group < vl_b / kr; ++k_group) + for (size_t vector = 0; vector < 4; ++vector) { + int8_t* packed_vector = rhs_packed + (k_group * 4 + vector) * vl_b; + + for (size_t column = 0; column < columns_per_vector; ++column) + for (size_t k_lane = 0; k_lane < kr; ++k_lane) + packed_vector[column * kr + k_lane] = + rhs[(k_group * kr + k_lane) * vl_b + vector * columns_per_vector + column]; + } +} + +// Pack a dense M=1, K=N=VL_b RHS matrix for the LUTI4 -> LUTI2 SDOT kernel. +// Return zero on success, or nonzero when a weight or four-weight pattern is +// not representable by the supplied table register contents. +__arm_locally_streaming static int arm_lp_gemv_luti2_luti4_rhs_pack_ref( + const int8_t* rhs, uint8_t* rhs_indices, const uint32_t* zt0_luti4, const uint32_t* zt0_luti2) { + const size_t vl_b = svcntb(); + const size_t packed_bytes = vl_b * vl_b / 8; + + if (rhs == NULL || rhs_indices == NULL || zt0_luti4 == NULL || zt0_luti2 == NULL || vl_b % 16 != 0) return 1; + + for (size_t offset = 0; offset < packed_bytes; offset += vl_b) + svst1_u8(svptrue_b8(), rhs_indices + offset, svdup_n_u8(0)); + for (size_t k_group = 0; k_group < vl_b / 4; ++k_group) { + const size_t block = k_group / 4; + const size_t lane = k_group % 4; + const size_t source_vector = 2 * block + lane / 2; + const size_t source_segment = lane % 2; + const size_t packed_base = source_vector * vl_b + source_segment * (vl_b / 2); + + for (size_t column = 0; column < vl_b; ++column) { + uint8_t packed_levels = 0; + for (size_t k_lane = 0; k_lane < 4; ++k_lane) { + const int8_t weight = rhs[(4 * k_group + k_lane) * vl_b + column]; + size_t level_code; + + for (level_code = 0; level_code < 4; ++level_code) + if (weight == (int8_t)zt0_luti2[level_code]) break; + if (level_code == 4) return 1; + + packed_levels |= (uint8_t)(level_code << (2 * k_lane)); + } + + size_t pattern_id; + for (pattern_id = 0; pattern_id < 16; ++pattern_id) + if (packed_levels == (uint8_t)zt0_luti4[pattern_id]) break; + if (pattern_id == 16) return 1; + + rhs_indices[packed_base + column / 2] |= (uint8_t)(pattern_id << (4 * (column & 1))); + } + } + + return 0; +} + +static int run_arm_lp_gemm_luti4_test(void) { + enum { K = 2 }; + uint32_t lut[16]; + uint32_t m = get_streaming_vl_words(); + uint32_t n = 4 * m; + size_t vl_bytes = (size_t)4 * m; + float16_t* lhs = malloc((size_t)K * m * sizeof(*lhs)); + uint8_t* rhs_indices = calloc(vl_bytes, sizeof(*rhs_indices)); + float32_t* actual = malloc((size_t)m * n * sizeof(*actual)); + int result = 1; + + if (lhs == NULL || rhs_indices == NULL || actual == NULL) { + fputs("failed to allocate FP16 LUTI4 test data\n", stderr); + goto cleanup; + } + + // LUTI4 .H reads the low 16 bits of each 32-bit ZT0 entry. 0x3c00 is 1.0 + // in the IEEE 754 binary16 format. + for (uint32_t entry = 0; entry < 16; ++entry) lut[entry] = 0x00003c00U; + for (uint32_t element = 0; element < K * m; ++element) lhs[element] = (float16_t)1.0F; + + arm_lp_gemm_luti4(lhs, rhs_indices, actual, lut); + puts("FP16 LUTI4 + FMOPA test (M = VL_s, K = 2, N = 4 * VL_s)"); + + result = 0; + for (uint32_t row = 0; row < m; ++row) + for (uint32_t column = 0; column < n; ++column) { + size_t index = (size_t)row * n + column; + if (actual[index] != (float32_t)K) { + fprintf( + stderr, "FAIL: row %u, column %u: got %g, expected %d\n", row, column, (double)actual[index], K); + result = 1; + goto cleanup; + } + } + puts("PASS"); + +cleanup: + free(lhs); + free(rhs_indices); + free(actual); + return result; +} + +static int run_arm_lp_gemv_luti2_luti4_test(void) { + const size_t vl_b = get_streaming_vector_bytes(); + const size_t matrix_bytes = vl_b * vl_b; + const size_t luti_packed_bytes = matrix_bytes / 8; + uint32_t luti4_table[16]; + uint32_t luti2_table[16] = {0}; + int8_t levels[4] = {-3, -1, 1, 3}; + uint8_t codewords[16] = { + 0x00, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xe7, + }; + int8_t* lhs = malloc(vl_b * sizeof(*lhs)); + int8_t* rhs = malloc(matrix_bytes * sizeof(*rhs)); + int8_t* rhs_sdot_packed = malloc(matrix_bytes * sizeof(*rhs_sdot_packed)); + uint8_t* rhs_luti_packed = calloc(luti_packed_bytes, sizeof(*rhs_luti_packed)); + int32_t* reference = malloc(vl_b * sizeof(*reference)); + int32_t* sdot_actual = malloc(vl_b * sizeof(*sdot_actual)); + int32_t* luti_actual = malloc(vl_b * sizeof(*luti_actual)); + int result = 1; + + if (lhs == NULL || rhs == NULL || rhs_sdot_packed == NULL || rhs_luti_packed == NULL || reference == NULL || + sdot_actual == NULL || luti_actual == NULL) { + fputs("failed to allocate LUTI4 -> LUTI2 -> SDOT test data\n", stderr); + goto cleanup; + } + if (vl_b % 16 != 0) { + fputs("LUTI4 -> LUTI2 -> SDOT requires VL_b divisible by 16\n", stderr); + goto cleanup; + } + + for (uint32_t entry = 0; entry < 16; ++entry) luti4_table[entry] = (uint8_t)codewords[entry] * 0x01010101U; + for (uint32_t entry = 0; entry < 4; ++entry) luti2_table[entry] = (uint8_t)levels[entry] * 0x01010101U; + + for (size_t k = 0; k < vl_b; ++k) lhs[k] = (int8_t)(((5 * k + 3) % 9) - 4); + for (size_t k_group = 0; k_group < vl_b / 4; ++k_group) + for (size_t column = 0; column < vl_b; ++column) { + uint8_t id = (uint8_t)((5 * k_group + 3 * column + 1) & 0xf); + uint8_t packed_levels = codewords[id]; + for (size_t k_lane = 0; k_lane < 4; ++k_lane) { + uint8_t level_code = (packed_levels >> (2 * k_lane)) & 0x3; + rhs[(4 * k_group + k_lane) * vl_b + column] = levels[level_code]; + } + } + + arm_lp_matmul_s8_s8_dotprod_rhs_pack_ref(rhs, rhs_sdot_packed); + if (arm_lp_gemv_luti2_luti4_rhs_pack_ref(rhs, rhs_luti_packed, luti4_table, luti2_table) != 0) { + fputs("failed to pack representable RHS for LUTI4 -> LUTI2 -> SDOT\n", stderr); + goto cleanup; + } + + arm_lp_gemv_luti2_luti4_ref(lhs, rhs, reference); + arm_lp_matmul_s8_s8_dotprod(lhs, rhs_sdot_packed, sdot_actual); + arm_lp_gemv_luti2_luti4(lhs, rhs_luti_packed, luti_actual, luti4_table, luti2_table); + if (compare_outputs_i32(sdot_actual, reference, 1, vl_b, "arm_lp_matmul_s8_s8_dotprod") != 0 || + compare_outputs_i32(luti_actual, reference, 1, vl_b, "arm_lp_gemv_luti2_luti4") != 0) + goto cleanup; + + const int8_t saved_weight = rhs[0]; + rhs[0] = 99; + if (arm_lp_gemv_luti2_luti4_rhs_pack_ref(rhs, rhs_luti_packed, luti4_table, luti2_table) == 0) { + fputs("LUTI packer accepted an unsupported scalar level\n", stderr); + goto cleanup; + } + rhs[0] = saved_weight; + + for (size_t k_lane = 0; k_lane < 4; ++k_lane) rhs[k_lane * vl_b] = levels[3]; + if (arm_lp_gemv_luti2_luti4_rhs_pack_ref(rhs, rhs_luti_packed, luti4_table, luti2_table) == 0) { + fputs("LUTI packer accepted an unsupported four-weight pattern\n", stderr); + goto cleanup; + } + + puts("LUTI4 -> LUTI2 -> SDOT test (M = 1, K = N = VL_b)"); + puts("PASS"); + result = 0; + +cleanup: + free(lhs); + free(rhs); + free(rhs_sdot_packed); + free(rhs_luti_packed); + free(reference); + free(sdot_actual); + free(luti_actual); + return result; +} + +int main(int argc, char** argv) { + if (argc == 1) return ex1_luti_test(); + + if (argc != 2 || strcmp(argv[1], "--learning") != 0) { + fprintf(stderr, "Usage: %s [--learning]\n", argv[0]); + return 2; + } + + if (run_arm_lp_gemm_luti4_test() != 0) return 1; + if (run_arm_lp_gemv_luti2_luti4_test() != 0) return 1; + return 0; +} \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/code/luti_sme2_programming.c b/content/learning-paths/mobile-graphics-and-gaming/luti/code/luti_sme2_programming.c new file mode 100644 index 0000000000..955403275c --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/code/luti_sme2_programming.c @@ -0,0 +1,210 @@ +/* + * SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +// These examples assume that they run on an SME2-compatible system. They +// deliberately perform no runtime capability checks. +#if !defined(__ARM_FEATURE_SME2) +#error "Compile with SME2 enabled, for example -march=armv9.2-a+sme2+nosve2+nosve" +#endif + +__arm_new("za", "zt0") __arm_locally_streaming void arm_lp_gemm_luti4( + const float16_t* lhs, const uint8_t* rhs_indices, float32_t* out, const uint32_t* zt0_lut) { + const uint32_t m = svcntw(); // Number of FP32 rows/columns in one ZA tile. + + assert(lhs != NULL); + assert(rhs_indices != NULL); + assert(out != NULL); + assert(zt0_lut != NULL); + + /* LUTI4 decode + * +------+---------------------------+----------------------------------------+ + * | Step | Decision | Choice | + * +------+---------------------------+----------------------------------------+ + * | 1 | Index and table width | 4-bit index | + * | | | Low 16 bits of a 32-bit ZT0 register | + * | | | entry | + * | 2 | Destination element type | .H, because FMOPA consumes FP16 | + * | 3 | Destination group | x1 for rhs_0/rhs_1, then x2 for rhs_23 | + * +------+---------------------------+----------------------------------------+ + */ + + // Derive the source segments from the size of the source register. + + // Load the LUT. + svldr_zt(0, zt0_lut); + svzero_za(); + + // Load the LHS. + svbool_t pg = svptrue_b16(); + svfloat16_t lhs_ip = svld1_f16(pg, lhs); + + // Load one source register of packed indices. Each packed code is a + // lookup-table index. + svuint8_t s4_indices = svld1_u8(svptrue_b8(), rhs_indices); + + // Case 1: a single-register destination group uses one of four segments. + + // Step 4 : Number of input segments for x1 + // -------------------------------------------- + // One byte of indices produces two halfwords after the lookup. + // VL_b bytes of indices from a source register produce 2 * VL_h halfword + // elements, or 4 * VL_b bytes. Filling VL_b destination bytes therefore + // consumes VL_b / 4 source bytes: segments 0, 1, 2, and 3. + + // + // source Z register: packed indices + // +-------------+-------------+-------------+-------------+ + // | segment [3] | segment [2] | segment [1] | segment [0] | + // +-------------+-------------+-------------+-------------+ + // | + // | LUTI4 .H, segment [0] + // v + // destination z register with F16 elements + // +----------------------------------------------------+ + // | VL_h elements | + // +----------------------------------------------------+ + + // Unpredicated LUTI read. + svfloat16_t rhs_0 = svluti4_lane_zt_f16(0, s4_indices, /* segment */ 0); + svfloat16_t rhs_1 = svluti4_lane_zt_f16(0, s4_indices, /* segment */ 1); + + // Case 2: a two-register destination group using one of two segments. + + // Step 4 : Number of input segments for x2 + // -------------------------------------------- + // VL_b bytes of indices from a source register produce 2 * VL_h halfword + // elements, or 4 * VL_b bytes. Filling 2 * VL_b destination bytes + // therefore consumes VL_b / 2 source bytes: segments 0 and 1. + // + // source Z register: packed indices + // +---------------------------+---------------------------+ + // | segment [1] | segment [0] | + // +---------------------------+---------------------------+ + // | + // | LUTI4 .H, segment [1] + // v + // two-register destination z register group + // +---------------------+---------------------+ + // | destination 1 | destination 0 | + // | VL_h elements | VL_h elements | + // +---------------------+---------------------+ + svfloat16x2_t rhs_23 = svluti4_lane_zt_f16_x2(0, s4_indices, /* segment */ 1); + + svmopa_za32_f16_m(0, pg, pg, lhs_ip, rhs_0); + svmopa_za32_f16_m(1, pg, pg, lhs_ip, rhs_1); + svmopa_za32_f16_m(2, pg, pg, lhs_ip, svget2_f16(rhs_23, 0)); + svmopa_za32_f16_m(3, pg, pg, lhs_ip, svget2_f16(rhs_23, 1)); + + // Extract the data from the ZA tiles and store it. + for (uint32_t i_m = 0; i_m < m; i_m += 1) { + svfloat32x4_t out_row = svread_hor_za32_f32_vg4(0, 4 * i_m); + svst1_f32_x4(svptrue_c32(), out + ((size_t)4 * i_m * m), out_row); + } +} + +// This example shows two-stage decoding of vector-quantized weights. +__arm_new("za", "zt0") __arm_locally_streaming void arm_lp_gemv_luti2_luti4( + const int8_t* lhs, const uint8_t* rhs_indices, int32_t* out, const uint32_t* zt0_luti4, const uint32_t* zt0_luti2) { + const size_t vl_b = svcntb(); + const size_t lhs_blocks = vl_b / 16; + const svbool_t pg8 = svptrue_b8(); + const svcount_t pn8 = svptrue_c8(); + + assert(lhs != NULL); + assert(rhs_indices != NULL); + assert(out != NULL); + assert(zt0_luti4 != NULL); + assert(zt0_luti2 != NULL); + assert(vl_b % 16 == 0); + + svzero_za(); + for (size_t i_k = 0; i_k < lhs_blocks; ++i_k) { + // For SVL = 512 bits: VL_b = 64 bytes and VL_s = 16 words. + + // Replicated read of one 16-byte LHS block for SDOT lanes. + svint8_t lhs_ip = svld1rq_s8(pg8, lhs); + lhs += 16; + + /* LUTI4 decode (first stage) + * +------+---------------------------+----------------------------------------+ + * | Step | Decision | Choice | + * +------+---------------------------+----------------------------------------+ + * | 1 | Index and table width | 4-bit index | + * | | | 8-bit ZT0 LUT register element | + * | 2 | Destination element type | NA. Second decode stage addresses this | + * | 3 | Destination group | x2 for patterns_01 and patterns_23 | + * +------+---------------------------+----------------------------------------+ + */ + + // Two source registers provide the four packed 2-bit index vectors needed for the second stage. + svuint8x2_t rhs_packed = svld1_u8_x2(pn8, rhs_indices); + rhs_indices += 2 * vl_b; + + // Load LUT 1. + svldr_zt(0, zt0_luti4); + + // Step 4 : Number of input segments for x2 + // -------------------------------------------- + // One packed byte contains two 4-bit indices and produces two bytes + // after the lookup. VL_b source bytes therefore produce 2 * VL_b + // destination bytes, filling the x2 destination group. This uses + // source segment 0. + + svuint8x2_t patterns_01 = svluti4_lane_zt_u8_x2(0, svget2_u8(rhs_packed, 0), 0); + svuint8x2_t patterns_23 = svluti4_lane_zt_u8_x2(0, svget2_u8(rhs_packed, 1), 0); + + /* LUTI2 decode (second stage) + * +------+---------------------------+----------------------------------------+ + * | Step | Decision | Choice | + * +------+---------------------------+----------------------------------------+ + * | 1 | Index and table width | 2-bit index | + * | | | 8-bit ZT0 LUT register element | + * | 2 | Destination element type | .B, SDOT consumes int8 | + * | 3 | Destination group | x4 for rhs_unpacked | + * +------+---------------------------+----------------------------------------+ + */ + + // Load LUT 2. + svldr_zt(0, zt0_luti2); + + // Step 4 : Number of input segments for x4 + // -------------------------------------------- + // One packed byte contains four 2-bit indices and produces four bytes + // after the lookup. VL_b source bytes therefore produce 4 * VL_b + // destination bytes, filling the x4 destination group. This uses + // source segment 0. + + svint8x4_t rhs_unpacked = svreinterpret_s8_u8_x4(svluti2_lane_zt_u8_x4(0, svget2_u8(patterns_01, 0), 0)); + + // Process K values 0 to 3 for the first VL_s N values. + svdot_lane_za32_s8_vg1x4(0, rhs_unpacked, lhs_ip, /* lane */ 0); + + rhs_unpacked = svreinterpret_s8_u8_x4(svluti2_lane_zt_u8_x4(0, svget2_u8(patterns_01, 1), 0)); + + // Process K values 4 to 7 for the next VL_s N values. + svdot_lane_za32_s8_vg1x4(0, rhs_unpacked, lhs_ip, /* lane */ 1); + + rhs_unpacked = svreinterpret_s8_u8_x4(svluti2_lane_zt_u8_x4(0, svget2_u8(patterns_23, 0), 0)); + + // Process K values 8 to 11 for the next VL_s N values. + svdot_lane_za32_s8_vg1x4(0, rhs_unpacked, lhs_ip, /* lane */ 2); + + rhs_unpacked = svreinterpret_s8_u8_x4(svluti2_lane_zt_u8_x4(0, svget2_u8(patterns_23, 1), 0)); + + // Process K values 12 to 15 for the final VL_s N values. + svdot_lane_za32_s8_vg1x4(0, rhs_unpacked, lhs_ip, /* lane */ 3); + + // Total processed: 16 K values and 4 * VL_s N values. + } + + svint32x4_t result = svread_za32_s32_vg1x4(0); + svst1_s32_x4(svptrue_c32(), out, result); +} \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/code/luti_sme2_programming_test.c b/content/learning-paths/mobile-graphics-and-gaming/luti/code/luti_sme2_programming_test.c new file mode 100644 index 0000000000..bd66587fde --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/luti/code/luti_sme2_programming_test.c @@ -0,0 +1,305 @@ +/* + * SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include + +// This example assumes it runs on an SME2-compatible system. It deliberately +// performs no runtime capability check. +#if !defined(__ARM_FEATURE_SME2) +#error "Compile with SME2 enabled, for example -march=armv9.2-a+sme2+nosve2+nosve" +#endif + +__arm_new("za", "zt0") __arm_locally_streaming void arm_lp_gemm_luti4( + const float16_t* lhs, const uint8_t* rhs_indices, float32_t* out, const uint32_t* zt0_lut); + +__arm_new("za", "zt0") __arm_locally_streaming void arm_lp_gemv_luti2_luti4( + const int8_t* lhs, const uint8_t* rhs_indices, int32_t* out, const uint32_t* zt0_luti4, const uint32_t* zt0_luti2); + +int ex1_luti_test(void); + +__arm_locally_streaming static size_t get_streaming_vector_bytes(void) { + return svcntb(); +} + +__arm_locally_streaming static uint32_t get_streaming_vl_words(void) { + return svcntw(); +} + +static int compare_outputs_i32( + const int32_t* actual, const int32_t* expected, size_t rows, size_t columns, const char* test_name) { + for (size_t row = 0; row < rows; ++row) + for (size_t column = 0; column < columns; ++column) { + size_t index = row * columns + column; + if (actual[index] != expected[index]) { + fprintf( + stderr, "%s: FAIL at row %zu, column %zu: got %d, expected %d\n", test_name, row, column, + actual[index], expected[index]); + return 1; + } + } + return 0; +} + +/* -------------------------------------------------------------------------- */ +/* Reference matrix multiplication */ +/* -------------------------------------------------------------------------- */ + +// Fixed GEMV shape: M = 1 and K = N = VL_b. The RHS is packed as +// (VL_b / 4) rows of 4 * VL_b bytes, one row for each four-element K group. +static void arm_lp_gemv_luti2_luti4_ref(const int8_t* lhs, const int8_t* rhs, int32_t* out) { + const size_t vl_b = get_streaming_vector_bytes(); + + for (size_t n = 0; n < vl_b; ++n) { + int32_t sum = 0; + for (size_t k = 0; k < vl_b; ++k) sum += (int32_t)lhs[k] * (int32_t)rhs[k * vl_b + n]; + out[n] = sum; + } +} + +// SME2 SDOT reference implementation using already-unpacked RHS weights. +__arm_new("za") __arm_locally_streaming static void arm_lp_matmul_s8_s8_dotprod( + const int8_t* lhs, const int8_t* rhs_packed, int32_t* out) { + const size_t vl_b = svcntb(); + const size_t lhs_blocks = vl_b / 16; // 16 bytes in a 128-bit LHS block. + const svbool_t pg8 = svptrue_b8(); + const svcount_t pn8 = svptrue_c8(); + + svzero_za(); + for (size_t i_k = 0; i_k < lhs_blocks; ++i_k) { + svint8_t lhs_vec = svld1rq_s8(pg8, lhs); + lhs += 16; + + svint8x4_t rhs_vec = svld1_s8_x4(pn8, rhs_packed); + rhs_packed += 4 * vl_b; + svdot_lane_za32_s8_vg1x4(0, rhs_vec, lhs_vec, 0); + + rhs_vec = svld1_s8_x4(pn8, rhs_packed); + rhs_packed += 4 * vl_b; + svdot_lane_za32_s8_vg1x4(0, rhs_vec, lhs_vec, 1); + + rhs_vec = svld1_s8_x4(pn8, rhs_packed); + rhs_packed += 4 * vl_b; + svdot_lane_za32_s8_vg1x4(0, rhs_vec, lhs_vec, 2); + + rhs_vec = svld1_s8_x4(pn8, rhs_packed); + rhs_packed += 4 * vl_b; + svdot_lane_za32_s8_vg1x4(0, rhs_vec, lhs_vec, 3); + } + + svint32x4_t result = svread_za32_s32_vg1x4(0); + svst1_s32_x4(svptrue_c32(), out, result); +} + +/* -------------------------------------------------------------------------- */ +/* Reference packing */ +/* -------------------------------------------------------------------------- */ + +// Pack dense int8 RHS weights for the SME2 SDOT reference implementation. +__arm_locally_streaming static void arm_lp_matmul_s8_s8_dotprod_rhs_pack_ref(const int8_t* rhs, int8_t* rhs_packed) { + const size_t kr = 4; + const size_t vl_b = get_streaming_vector_bytes(); + const size_t columns_per_vector = svcntw(); + + for (size_t k_group = 0; k_group < vl_b / kr; ++k_group) + for (size_t vector = 0; vector < 4; ++vector) { + int8_t* packed_vector = rhs_packed + (k_group * 4 + vector) * vl_b; + + for (size_t column = 0; column < columns_per_vector; ++column) + for (size_t k_lane = 0; k_lane < kr; ++k_lane) + packed_vector[column * kr + k_lane] = + rhs[(k_group * kr + k_lane) * vl_b + vector * columns_per_vector + column]; + } +} + +// Pack a dense M=1, K=N=VL_b RHS matrix for the LUTI4 -> LUTI2 SDOT kernel. +// Return zero on success, or nonzero when a weight or four-weight pattern is +// not representable by the supplied table register contents. +__arm_locally_streaming static int arm_lp_gemv_luti2_luti4_rhs_pack_ref( + const int8_t* rhs, uint8_t* rhs_indices, const uint32_t* zt0_luti4, const uint32_t* zt0_luti2) { + const size_t vl_b = svcntb(); + const size_t packed_bytes = vl_b * vl_b / 8; + + if (rhs == NULL || rhs_indices == NULL || zt0_luti4 == NULL || zt0_luti2 == NULL || vl_b % 16 != 0) return 1; + + for (size_t offset = 0; offset < packed_bytes; offset += vl_b) + svst1_u8(svptrue_b8(), rhs_indices + offset, svdup_n_u8(0)); + for (size_t k_group = 0; k_group < vl_b / 4; ++k_group) { + const size_t block = k_group / 4; + const size_t lane = k_group % 4; + const size_t source_vector = 2 * block + lane / 2; + const size_t source_segment = lane % 2; + const size_t packed_base = source_vector * vl_b + source_segment * (vl_b / 2); + + for (size_t column = 0; column < vl_b; ++column) { + uint8_t packed_levels = 0; + for (size_t k_lane = 0; k_lane < 4; ++k_lane) { + const int8_t weight = rhs[(4 * k_group + k_lane) * vl_b + column]; + size_t level_code; + + for (level_code = 0; level_code < 4; ++level_code) + if (weight == (int8_t)zt0_luti2[level_code]) break; + if (level_code == 4) return 1; + + packed_levels |= (uint8_t)(level_code << (2 * k_lane)); + } + + size_t pattern_id; + for (pattern_id = 0; pattern_id < 16; ++pattern_id) + if (packed_levels == (uint8_t)zt0_luti4[pattern_id]) break; + if (pattern_id == 16) return 1; + + rhs_indices[packed_base + column / 2] |= (uint8_t)(pattern_id << (4 * (column & 1))); + } + } + + return 0; +} + +static int run_arm_lp_gemm_luti4_test(void) { + enum { K = 2 }; + uint32_t lut[16]; + uint32_t m = get_streaming_vl_words(); + uint32_t n = 4 * m; + size_t vl_bytes = (size_t)4 * m; + float16_t* lhs = malloc((size_t)K * m * sizeof(*lhs)); + uint8_t* rhs_indices = calloc(vl_bytes, sizeof(*rhs_indices)); + float32_t* actual = malloc((size_t)m * n * sizeof(*actual)); + int result = 1; + + if (lhs == NULL || rhs_indices == NULL || actual == NULL) { + fputs("failed to allocate FP16 LUTI4 test data\n", stderr); + goto cleanup; + } + + // LUTI4 .H reads the low 16 bits of each 32-bit ZT0 entry. 0x3c00 is 1.0 + // in the IEEE 754 binary16 format. + for (uint32_t entry = 0; entry < 16; ++entry) lut[entry] = 0x00003c00U; + for (uint32_t element = 0; element < K * m; ++element) lhs[element] = (float16_t)1.0F; + + arm_lp_gemm_luti4(lhs, rhs_indices, actual, lut); + puts("FP16 LUTI4 + FMOPA test (M = VL_s, K = 2, N = 4 * VL_s)"); + + result = 0; + for (uint32_t row = 0; row < m; ++row) + for (uint32_t column = 0; column < n; ++column) { + size_t index = (size_t)row * n + column; + if (actual[index] != (float32_t)K) { + fprintf( + stderr, "FAIL: row %u, column %u: got %g, expected %d\n", row, column, (double)actual[index], K); + result = 1; + goto cleanup; + } + } + puts("PASS"); + +cleanup: + free(lhs); + free(rhs_indices); + free(actual); + return result; +} + +static int run_arm_lp_gemv_luti2_luti4_test(void) { + const size_t vl_b = get_streaming_vector_bytes(); + const size_t matrix_bytes = vl_b * vl_b; + const size_t luti_packed_bytes = matrix_bytes / 8; + uint32_t luti4_table[16]; + uint32_t luti2_table[16] = {0}; + int8_t levels[4] = {-3, -1, 1, 3}; + uint8_t codewords[16] = { + 0x00, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xe7, + }; + int8_t* lhs = malloc(vl_b * sizeof(*lhs)); + int8_t* rhs = malloc(matrix_bytes * sizeof(*rhs)); + int8_t* rhs_sdot_packed = malloc(matrix_bytes * sizeof(*rhs_sdot_packed)); + uint8_t* rhs_luti_packed = calloc(luti_packed_bytes, sizeof(*rhs_luti_packed)); + int32_t* reference = malloc(vl_b * sizeof(*reference)); + int32_t* sdot_actual = malloc(vl_b * sizeof(*sdot_actual)); + int32_t* luti_actual = malloc(vl_b * sizeof(*luti_actual)); + int result = 1; + + if (lhs == NULL || rhs == NULL || rhs_sdot_packed == NULL || rhs_luti_packed == NULL || reference == NULL || + sdot_actual == NULL || luti_actual == NULL) { + fputs("failed to allocate LUTI4 -> LUTI2 -> SDOT test data\n", stderr); + goto cleanup; + } + if (vl_b % 16 != 0) { + fputs("LUTI4 -> LUTI2 -> SDOT requires VL_b divisible by 16\n", stderr); + goto cleanup; + } + + for (uint32_t entry = 0; entry < 16; ++entry) luti4_table[entry] = (uint8_t)codewords[entry] * 0x01010101U; + for (uint32_t entry = 0; entry < 4; ++entry) luti2_table[entry] = (uint8_t)levels[entry] * 0x01010101U; + + for (size_t k = 0; k < vl_b; ++k) lhs[k] = (int8_t)(((5 * k + 3) % 9) - 4); + for (size_t k_group = 0; k_group < vl_b / 4; ++k_group) + for (size_t column = 0; column < vl_b; ++column) { + uint8_t id = (uint8_t)((5 * k_group + 3 * column + 1) & 0xf); + uint8_t packed_levels = codewords[id]; + for (size_t k_lane = 0; k_lane < 4; ++k_lane) { + uint8_t level_code = (packed_levels >> (2 * k_lane)) & 0x3; + rhs[(4 * k_group + k_lane) * vl_b + column] = levels[level_code]; + } + } + + arm_lp_matmul_s8_s8_dotprod_rhs_pack_ref(rhs, rhs_sdot_packed); + if (arm_lp_gemv_luti2_luti4_rhs_pack_ref(rhs, rhs_luti_packed, luti4_table, luti2_table) != 0) { + fputs("failed to pack representable RHS for LUTI4 -> LUTI2 -> SDOT\n", stderr); + goto cleanup; + } + + arm_lp_gemv_luti2_luti4_ref(lhs, rhs, reference); + arm_lp_matmul_s8_s8_dotprod(lhs, rhs_sdot_packed, sdot_actual); + arm_lp_gemv_luti2_luti4(lhs, rhs_luti_packed, luti_actual, luti4_table, luti2_table); + if (compare_outputs_i32(sdot_actual, reference, 1, vl_b, "arm_lp_matmul_s8_s8_dotprod") != 0 || + compare_outputs_i32(luti_actual, reference, 1, vl_b, "arm_lp_gemv_luti2_luti4") != 0) + goto cleanup; + + const int8_t saved_weight = rhs[0]; + rhs[0] = 99; + if (arm_lp_gemv_luti2_luti4_rhs_pack_ref(rhs, rhs_luti_packed, luti4_table, luti2_table) == 0) { + fputs("LUTI packer accepted an unsupported scalar level\n", stderr); + goto cleanup; + } + rhs[0] = saved_weight; + + for (size_t k_lane = 0; k_lane < 4; ++k_lane) rhs[k_lane * vl_b] = levels[3]; + if (arm_lp_gemv_luti2_luti4_rhs_pack_ref(rhs, rhs_luti_packed, luti4_table, luti2_table) == 0) { + fputs("LUTI packer accepted an unsupported four-weight pattern\n", stderr); + goto cleanup; + } + + puts("LUTI4 -> LUTI2 -> SDOT test (M = 1, K = N = VL_b)"); + puts("PASS"); + result = 0; + +cleanup: + free(lhs); + free(rhs); + free(rhs_sdot_packed); + free(rhs_luti_packed); + free(reference); + free(sdot_actual); + free(luti_actual); + return result; +} + +int main(int argc, char** argv) { + if (argc == 1) return ex1_luti_test(); + + if (argc != 2 || strcmp(argv[1], "--learning") != 0) { + fprintf(stderr, "Usage: %s [--learning]\n", argv[0]); + return 2; + } + + if (run_arm_lp_gemm_luti4_test() != 0) return 1; + if (run_arm_lp_gemv_luti2_luti4_test() != 0) return 1; + return 0; +} \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/images/luti2.png b/content/learning-paths/mobile-graphics-and-gaming/luti/images/luti2.png new file mode 100644 index 0000000000000000000000000000000000000000..3df97b915ff27f17a90d9c834c4544fc71638217 GIT binary patch literal 58633 zcmeFZWmr^g)HXab3@I($-Q67`jg)k^(hWloAR!V;BNBp$bcf^sN|%a&G$JKPBO$`O z2jjlK=YEdw$NT&B*ub7WJFb1LI@h_@vWgILDED#8UqpEUS7X*T$fk5ET7{G5( zP}AsF5D2T(Q9(glRY8GH+soa-(ZwDFQhAt`fv$J=6G`+~`zHN!)W@0|cOGkk*q@_o z2NFj;hGHY3-P=zl zXPt9eJC7GbzJFRT532P8(Qyi#T@V>j!1XMm>H3G#C%H@QIhpa(0{o8@{Bv=~=#9`W{rK>9HoGsff> z#yg5ensB1n>ig+8*Usj-`bPLEWJzxleu=K;0Ko`T*i}GqJNU+gh5;lw=1W2~dD6%# z{j-GXyG~9Nl*@h(a2}J%bl06ZdWH?8>@_{}{QOMAAtH1AMBpCG-%Ua`D(f(erthk8 zf@ry$;=G@Z8LKT4pZDRjPrCz-9X4xkD~>F!c!GFB6K_T>Jijrl=KsiK=_u8z7gCqC z)A3n~o%1J&Snd{k;<5wZEt1TX9fCGQL_OVp%RWT(93qJNNEjnU;cXy84E<WC*G4+?y6TGNy$aG3%=>&6UNcRJtFoYW;Z>q(m9{-@ zTI}#2a?swc8+@1xk&YM<9{A)1a%zv!Ufdv8Ai>A+ijbm{Wy6SjVDlUri;nsHc--I> z21hhUevh{Fk)RJ+3&=bYEx&b~O$gi`F4M!72_5Qks-|hfe%a+SO^O?C*n_!eB1SqI z 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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/images/luti4.png b/content/learning-paths/mobile-graphics-and-gaming/luti/images/luti4.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe8dd541549000b872daed9791bba39ae13ad74 GIT binary patch literal 57448 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 m32!H6d27^Z=lXl^`!gLqPRjt*yt$Dte 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%0DNp_U7DRWKTemVOJ?1ST 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 E1GD-tBme*a literal 0 HcmV?d00001 diff --git a/content/learning-paths/mobile-graphics-and-gaming/luti/images/luti_flow_overview.png b/content/learning-paths/mobile-graphics-and-gaming/luti/images/luti_flow_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..883e7fc9e403c66da38de04663fcfa4d1a3eedbf GIT binary patch literal 39524 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 literal 0 HcmV?d00001