Add ARM fp8 dot kernels

I haven't been able to run this on real hardware to benchmark it, but the inner loop assembly looks reasonably nice. This is the 8x8 kernel:
```
.LBB7_9:                                //   Parent Loop BB7_3 Depth=1
                                        //     Parent Loop BB7_5 Depth=2
                                        //       Parent Loop BB7_7 Depth=3
                                        // =>      This Inner Loop Header: Depth=4
        add     x8, x10, x1
        ldr     d8, [x13, x5]
        add     x26, x29, x1
        ldr     d31, [x21, x5]
        ldr     d30, [x17, x5]
        sub     x9, x9, #8
        ldr     q9, [x8]
        ldr     q10, [x26]
        ldr     d29, [x15, x5]
        add     x1, x1, x14
        ldr     d28, [x16, x5]
        add     x5, x5, #8
        fdot    v23.4s, v9.16b, v8.4b[0]
        fdot    v23.4s, v10.16b, v8.4b[1]
        fdot    v22.4s, v9.16b, v31.4b[0]
        fdot    v22.4s, v10.16b, v31.4b[1]
        fdot    v25.4s, v9.16b, v30.4b[0]
        fdot    v25.4s, v10.16b, v30.4b[1]
        fdot    v26.4s, v9.16b, v29.4b[0]
        fdot    v26.4s, v10.16b, v29.4b[1]
        fdot    v27.4s, v9.16b, v28.4b[0]
        fdot    v27.4s, v10.16b, v28.4b[1]
        ldr     q9, [x8, #16]
        ldr     q10, [x26, #16]
        fdot    v18.4s, v9.16b, v8.4b[0]
        fdot    v18.4s, v10.16b, v8.4b[1]
        fdot    v17.4s, v9.16b, v31.4b[0]
        fdot    v17.4s, v10.16b, v31.4b[1]
        fdot    v20.4s, v9.16b, v30.4b[0]
        fdot    v20.4s, v10.16b, v30.4b[1]
        fdot    v21.4s, v9.16b, v29.4b[0]
        fdot    v21.4s, v10.16b, v29.4b[1]
        fdot    v24.4s, v9.16b, v28.4b[0]
        fdot    v24.4s, v10.16b, v28.4b[1]
        ldr     q9, [x8, #32]
        ldr     q10, [x26, #32]
        fdot    v2.4s, v9.16b, v8.4b[0]
        fdot    v2.4s, v10.16b, v8.4b[1]
        fdot    v6.4s, v9.16b, v31.4b[0]
        fdot    v6.4s, v10.16b, v31.4b[1]
        fdot    v7.4s, v9.16b, v30.4b[0]
        fdot    v7.4s, v10.16b, v30.4b[1]
        fdot    v16.4s, v9.16b, v29.4b[0]
        fdot    v16.4s, v10.16b, v29.4b[1]
        fdot    v19.4s, v9.16b, v28.4b[0]
        fdot    v19.4s, v10.16b, v28.4b[1]
        ldr     q9, [x8, #48]
        ldr     q10, [x26, #48]
        add     x8, x4, x9
        fdot    v0.4s, v9.16b, v8.4b[0]
        fdot    v0.4s, v10.16b, v8.4b[1]
        fdot    v3.4s, v9.16b, v31.4b[0]
        fdot    v3.4s, v10.16b, v31.4b[1]
        fdot    v4.4s, v9.16b, v30.4b[0]
        fdot    v4.4s, v10.16b, v30.4b[1]
        fdot    v5.4s, v9.16b, v29.4b[0]
        fdot    v5.4s, v10.16b, v29.4b[1]
        fdot    v1.4s, v9.16b, v28.4b[0]
        fdot    v1.4s, v10.16b, v28.4b[1]
        cmp     x8, #15
        b.hi    .LBB7_9
```

PiperOrigin-RevId: 933830198
11 files changed
tree: 56d4f843b66383df65ffb8c16817cf5e500705b6
  1. .github/
  2. bench/
  3. build_config/
  4. build_overrides/
  5. cmake/
  6. doc/
  7. docker/
  8. gemm_compiler/
  9. gen/
  10. include/
  11. litert/
  12. scripts/
  13. src/
  14. test/
  15. third_party/
  16. tools/
  17. ynnpack/
  18. .bazelrc
  19. .clang-format
  20. .gitignore
  21. .gn
  22. BUILD.bazel
  23. BUILD.gn
  24. BUILD.md
  25. build_defs.bzl
  26. build_params.bzl
  27. build_srcs.bzl
  28. CMakeLists.txt
  29. CONTRIBUTING.md
  30. DEPS
  31. emscripten.bzl
  32. generated_file.bzl
  33. LICENSE
  34. MODULE.bazel
  35. preamble.js.lds
  36. README.md
  37. register_extension_info.bzl
README.md

XNNPACK

XNNPACK is a highly optimized solution for neural network inference on ARM, x86, WebAssembly, and RISC-V platforms. XNNPACK is not intended for direct use by deep learning practitioners and researchers; instead it provides low-level performance primitives for accelerating high-level machine learning frameworks, such as TensorFlow Lite, TensorFlow.js, PyTorch, ONNX Runtime, ExecuTorch, and MediaPipe.

Supported Architectures

  • ARM64 on Android, iOS, macOS, Linux, and Windows
  • ARMv7 (with NEON) on Android
  • ARMv6 (with VFPv2) on Linux
  • x86 and x86-64 (up to AVX512) on Windows, Linux, macOS, Android, and iOS simulator
  • WebAssembly MVP
  • WebAssembly SIMD
  • WebAssembly Relaxed SIMD (experimental)
  • RISC-V (RV32GC and RV64GC)
  • Hexagon (with HVX)

Operator Coverage

XNNPACK implements the following neural network operators:

  • 2D Convolution (including grouped and depthwise)
  • 2D Deconvolution (AKA Transposed Convolution)
  • 2D Average Pooling
  • 2D Max Pooling
  • 2D ArgMax Pooling (Max Pooling + indices)
  • 2D Unpooling
  • 2D Bilinear Resize
  • 2D Depth-to-Space (AKA Pixel Shuffle)
  • Add (including broadcasting, two inputs only)
  • Subtract (including broadcasting)
  • Divide (including broadcasting)
  • Maximum (including broadcasting)
  • Minimum (including broadcasting)
  • Multiply (including broadcasting)
  • Squared Difference (including broadcasting)
  • Global Average Pooling
  • Channel Shuffle
  • Fully Connected
  • Abs (absolute value)
  • Bankers' Rounding (rounding to nearest, ties to even)
  • Ceiling (rounding to integer above)
  • Clamp (includes ReLU and ReLU6)
  • Convert (includes fixed-point and half-precision quantization and dequantization)
  • Copy
  • ELU
  • Floor (rounding to integer below)
  • HardSwish
  • Leaky ReLU
  • Negate
  • Sigmoid
  • Softmax
  • Square
  • Tanh
  • Transpose
  • Truncation (rounding to integer towards zero)
  • PReLU

All operators in XNNPACK support NHWC layout, but additionally allow custom stride along the Channel dimension. Thus, operators can consume a subset of channels in the input tensor, and produce a subset of channels in the output tensor, providing a zero-cost Channel Split and Channel Concatenation operations.

Performance

Mobile phones

The table below presents single-threaded performance of XNNPACK library on three generations of MobileNet models and three generations of Pixel phones.

ModelPixel, msPixel 2, msPixel 3a, ms
FP32 MobileNet v1 1.0X828688
FP32 MobileNet v2 1.0X495355
FP32 MobileNet v3 Large394244
FP32 MobileNet v3 Small121414

The following table presents multi-threaded (using as many threads as there are big cores) performance of XNNPACK library on three generations of MobileNet models and three generations of Pixel phones.

ModelPixel, msPixel 2, msPixel 3a, ms
FP32 MobileNet v1 1.0X432746
FP32 MobileNet v2 1.0X261828
FP32 MobileNet v3 Large221624
FP32 MobileNet v3 Small768

Benchmarked on March 27, 2020 with end2end_bench --benchmark_min_time=5 on an Android/ARM64 build with Android NDK r21 (bazel build -c opt --config android_arm64 :end2end_bench) and neural network models with randomized weights and inputs.

Raspberry Pi

The table below presents multi-threaded performance of XNNPACK library on three generations of MobileNet models and three generations of Raspberry Pi boards.

ModelRPi Zero W (BCM2835), msRPi 2 (BCM2836), msRPi 3+ (BCM2837B0), msRPi 4 (BCM2711), msRPi 4 (BCM2711, ARM64), ms
FP32 MobileNet v1 1.0X39193021147277
FP32 MobileNet v2 1.0X1987191794146
FP32 MobileNet v3 Large1658161673840
FP32 MobileNet v3 Small47450221315
INT8 MobileNet v1 1.0X2589128462924
INT8 MobileNet v2 1.0X149582302017

Benchmarked on Feb 8, 2022 with end2end-bench --benchmark_min_time=5 on a Raspbian Buster build with CMake (./scripts/build-local.sh) and neural network models with randomized weights and inputs. INT8 inference was evaluated on per-channel quantization schema.

Minimum build requirements

  • C11
  • C++17
  • Python 3

Publications

Ecosystem

Machine Learning Frameworks

Acknowledgements

XNNPACK is based on QNNPACK library. Over time its codebase diverged a lot, and XNNPACK API is no longer compatible with QNNPACK.