inference/research
verifiedhigh · 0.85updated 2026-10-04

OCP-FP8 (E4M3/E5M2) vs MXFP8 precision differences on CDNA3 and CDNA4

compute bound

Fields

id
flops/amd-fp8-ocp-vs-mxfp8-precision
Class
quantization_overhead
Bound by
compute
Scales with
precisionblock_sizescaling_strategy
Workarounds
OCP-FP8 uses per-tensor or per-channel scaling - simpler but less accurate for large dynamic rangesMXFP8 uses block-scaled representation (per-block scaling factors) - better accuracy for the same bit widthOn CDNA3, only OCP-FP8 (E4M3/E5M2) is supported - MXFP8 is a CDNA4 additionOn CDNA4, both OCP-FP8 and MXFP8 are natively supported at the same throughput
notes
OCP-FP8 (Open Compute Project FP8) defines two formats: E4M3 (4 exponent bits, 3 mantissa bits - higher precision, smaller range) and E5M2 (5 exponent bits, 2 mantissa bits - lower precision, larger range). These are per-tensor or per-channel scaled formats. MXFP8 (Microscaling FP8) is part of the OCP MX specification and uses block-scaled representation where each block of elements shares a scaling factor. On CDNA3 (MI300X/MI325X), only OCP-FP8 is supported. On CDNA4 (MI350X/MI355X), both OCP-FP8 and MXFP8 are natively supported. AMD's product pages print them separately: 'Peak OCP-FP8 Performance (E5M2, E4M3)' and 'Peak MXFP8 Performance'. On MI355X, both are 5.0 PFLOPs dense. The key difference is that MXFP8's block scaling provides better numerical accuracy for inference workloads with large dynamic ranges, while OCP-FP8 is simpler and has broader ecosystem support. AMD's vLLM blog notes that FP8 KV cache on MI300X uses E4M3 format. RESOLVED (2026-10-04 cross-reference repair): the bare part names in affected_by_hardware were expanded to their record ids - mi300x -> amd-instinct-mi300x, mi325x -> amd-instinct-mi325x, mi350x -> amd-instinct-mi350x, mi355x -> amd-instinct-mi355x. Each name matched exactly one accelerator record in data/accelerators/, so no variant was chosen between siblings (MI300X and MI325X are both CDNA3, MI350X/MI355X/MI350P all CDNA4) - the id is forced by the part name. This field is still a mixed bucket: it also carries the architecture codename values gfx942/gfx950, which are not ids and were left alone.

Notes

OCP-FP8 (Open Compute Project FP8) defines two formats: E4M3 (4 exponent bits, 3 mantissa bits - higher precision, smaller range) and E5M2 (5 exponent bits, 2 mantissa bits - lower precision, larger range). These are per-tensor or per-channel scaled formats. MXFP8 (Microscaling FP8) is part of the OCP MX specification and uses block-scaled representation where each block of elements shares a scaling factor. On CDNA3 (MI300X/MI325X), only OCP-FP8 is supported. On CDNA4 (MI350X/MI355X), both OCP-FP8 and MXFP8 are natively supported. AMD's product pages print them separately: 'Peak OCP-FP8 Performance (E5M2, E4M3)' and 'Peak MXFP8 Performance'. On MI355X, both are 5.0 PFLOPs dense. The key difference is that MXFP8's block scaling provides better numerical accuracy for inference workloads with large dynamic ranges, while OCP-FP8 is simpler and has broader ecosystem support. AMD's vLLM blog notes that FP8 KV cache on MI300X uses E4M3 format. RESOLVED (2026-10-04 cross-reference repair): the bare part names in affected_by_hardware were expanded to their record ids - mi300x -> amd-instinct-mi300x, mi325x -> amd-instinct-mi325x, mi350x -> amd-instinct-mi350x, mi355x -> amd-instinct-mi355x. Each name matched exactly one accelerator record in data/accelerators/, so no variant was chosen between siblings (MI300X and MI325X are both CDNA3, MI350X/MI355X/MI350P all CDNA4) - the id is forced by the part name. This field is still a mixed bucket: it also carries the architecture codename values gfx942/gfx950, which are not ids and were left alone.

Cross-references