Is INT8 Portable? A Cross-Platform Measurement Study of Quantized Inference on Embedded and Automotive Accelerators
Organizations: Korea Automotive Technology Institute (KATECH)
Abstract
Eight-bit integer (INT8) post-training quantization is the default recipe for edge deployment, under a widely held assumption: INT8 makes inference faster at a small, predictable accuracy cost, and a model quantized once can be carried to any target. We test that assumption with a controlled measurement study across seven hardware classes -- ARM and x86 CPUs, a discrete GPU, an NVIDIA Jetson AGX Orin iGPU and its NVDLA cores, and two vendor NPUs (Qualcomm Hexagon HTP, DEEPX DX-M1) -- holding the ONNX artifact and the quantization scales fixed so the integer kernel or ISA is the only free variable. Portability fails on three axes. (1) The sign of the INT8 speedup is set by the CPU's dot-product ISA (ARM dotprod/SDOT, x86 VNNI): cores that have it speed up by up to 2.1x, cores that lack it slow down by 1.7x, for the identical model and runtime. (2) INT8 outputs are not portable, and the rule is an invariance rather than a gradient: FP32 predictions are bit-identical for every pair (1000/1000), while INT8 predictions agree 1000/1000 exactly when two targets share an integer kernel and 958-965/1000 whenever they do not -- independent of whether the boundary is CPU<->CPU or CPU<->accelerator, and invisible to top-1 accuracy, which is preserved. (3) Vendor NPUs own quantization: a bring-your-own QDQ graph fails silently on one NPU (external scales ignored, accuracy 0.75 -> 0.005 while it compiles, profiles and runs without error) and loudly on the other (the compiler refuses the graph), so only the vendor's native path yields a correct engine. We further show that edge-NPU latency regimes are set by output/device-to-host transfer size rather than compute, and locate the transition with a fixed-compute sweep. We release the scripts and 32 reports. "Quantize once, deploy anywhere" is unsafe for embedded and automotive deployment, where per-input determinism and redundancy matter.
Figures & tables
| Class | Target | Role in the study |
|---|---|---|
| ARM CPU (dotprod) | Raspberry Pi 5, Cortex-A76 | C1 sign, C2 agreement |
| ARM CPU (dotprod) | Jetson AGX Orin, Cortex-A78AE | C1 sign, C2 CPU accelerator |
| ARM CPU (no dotprod) | i.MX8M-Nano, Cortex-A53 | C1 sign (negative) |
| x86 CPU (no VNNI) | Core i9-10900K | C1 sign (negative), C2 |
| Discrete GPU | RTX 3080 (Ampere) | precision ladder, transformer INT8 |
| Edge iGPU + NVDLA | Jetson AGX Orin (iGPU, NVDLA v2) | accelerator char., C2 GPU kernel |
| CPU | Dot-product ISA | FP32 INT8 | INT8 effect |
|---|---|---|---|
| Cortex-A76 (Raspberry Pi 5) | ARM dotprod (SDOT) | ms | 1.83 faster |
| Cortex-A78AE (Jetson AGX Orin) | ARM dotprod | ms | 2.11 faster |
| Core i9-10900K (x86) | no AVX-512 VNNI | ms | 1.76 slower |
| Cortex-A53 (i.MX8M-Nano) | no dot-product | ms | 1.65 slower |
| Comparison | Boundary | Integer kernel | FP32 | INT8 |
|---|---|---|---|---|
| Jetson A78AE vs. Pi 5 A76 | CPU CPU | same (MLAS SDOT) | 1000/1000 | 1000/1000 |
| i.MX8M-Nano A53 vs. Pi 5 A76 | CPU CPU | different | 1000/1000 | 965/1000 |
| i.MX8M-Nano A53 vs. x86 i9 | CPU CPU | different | 1000/1000 | 961/1000 |
| Raspberry Pi 5 A76 vs. x86 i9 | CPU CPU | different | 1000/1000 | 958/1000 |
| Jetson iGPU (TensorRT) vs. A78AE (MLAS) | CPU accel. | different | 1000/1000 | 961/1000 |
| DEEPX DX-M1 (NPU) vs. host A76 CPU | CPU vendor-NPU | different, and different scales | — | 939/1000 |
| Model (on DX-M1) | Output | Regime | Multi-core scaling |
|---|---|---|---|
| ResNet-50 | 4 KB | compute-bound (compute 2.77 ms D2H 0.11 ms) | near-linear on 3 cores |
| YOLO26n | 2.82 MB (raw head) | D2H-bound (D2H 21.81 ms compute 9.0 ms) | flat |
| YOLOv5s | 5.48 MB | D2H-bound , worse | flat; lightest compute (2.59 ms) yet 26 slower than ResNet-50 |
| Output bytes (fixed 2.70 ms compute) | D2H p50 | 3-core scaling |
|---|---|---|
| 3,920 | 0.141 ms | (compute-bound plateau) |
| 256,368 | 0.776 ms | (transition band) |
| 511,952 | 1.367 ms | (transition band) |
| 1,000,384 | 2.429 ms | (transition band) |
| 1,999,984 | 8.892 ms | (D2H-bound) |
| Configuration (ORT, COCO val2017 5,000) | mAP | vs. FP32 |
|---|---|---|
| FP32 | 0.4207 | — |
| Backbone only INT8 (53 Convs) | 0.2653 | % |
| Transformer only INT8 (137 nodes) | 0.2391 | % |
| All INT8 (190 nodes) | 0.2402 | % |
| ORT (§8.1, discrete GPU) | DEEPX dx_com 2.4.0 (DX-M1) | |
|---|---|---|
| INT8 scope | backbone Conv ( input_projection excluded) | backbone + input_projection + first encoder self-attn through its Softmax |
| Weights | per-channel QInt8 | wbit8 |
| Activations | per-tensor QInt8 , MinMax, 100 images | abit8 , EMA, 100 in-domain COCO images |
| Calib. input shape | dynamic axes (varies per image) | fixed , bit-identical .npy |
| Evaluation | COCO val2017, 5,000 images | COCO val2017, first 500 images |
| FP32 INT8 |
Appendix figures & tables1 asset
Supplementary material from the paper’s appendix.
Appendix
| Sec. | Claim | Report ( logs/ ) | Scripts and results ( experiments/ ) |
|---|---|---|---|
| §4 (C1) | INT8 speedup sign set by the dot-product ISA, four CPUs, one model, one runtime | stage4_arm_cpu_fallback_report.html stage4_imx8mn_a53_report.html stage4_jetson_agx_orin_a78ae_report.html | stage5_infrastructure/cpu_proxy/rpi_bench.py rpi_bench_lowmem.py stage5_infrastructure/cpu_proxy/results/resnet50__*.json |
| §5 (C2) | FP32 1000/1000 control; CPU CPU INT8 agreement 1000 / 965 / 961 / 958 | stage4_arm_cpu_fallback_report.html stage4_imx8mn_a53_report.html stage4_jetson_agx_orin_a78ae_report.html | stage5_infrastructure/cpu_proxy/README.md (the agreement matrix) stage5_infrastructure/cpu_proxy/raw/ |
| §5 (C2) | CPU accelerator 961/1000 from the same QDQ artifact; iGPU INT8 top-1 0.7620 | stage3_jetson_orin_accuracy_report.html | stage3_tensorrt/jetson_ondevice/accuracy/scripts/orin_accuracy.py analyze_accuracy.py |
| §5 (C2 ) | Vendor-NPU 939/1000, scales not held fixed (deployment observation only) | stage4_deepx_dxm1_accuracy_report.html | stage4_deepx_dxm1/accuracy/scripts/npu_infer.py cpu_infer.py analyze_dxm1_acc.py |
| §5, §11 | Power-of-two mitigation does not transfer across the x86 A76 boundary: 958 869 (ceil) / 919 (nearest), gate NO-GO; cross-kernel / , tie-breaking refuted; 30 runs bit-identical | stage5_pot_scales_report.html | stage5_infrastructure/pot_scales/pot_rewrite.py pot_bench.py pot_agree.py pot_mech.py stage5_infrastructure/pot_scales/results/ |
| §6 (C3) | Qualcomm HTP silent BYO-QDQ failure 0.75 0.005; native path recovers 0.735 | stage4_qualcomm_aihub_report.html | stage4_qualcomm_aihub/scripts/qaihub_int8.py qaihub_native_quant.py qaihub_acc.py |
AI Accelerator Inference
AI accelerator inference studies hardware and software for running neural networks faster and more efficiently across data-center, edge, and mobile devices.
See all 103 papers