From 49b3e6729226cec830514ea0d63f28b95e10dd0c Mon Sep 17 00:00:00 2001 From: asmhatre Date: Sun, 26 Jul 2026 11:46:28 +0000 Subject: [PATCH] Add floating-point reduction ordering demo --- .../com/ankurm/vectorapi/ReductionOrder.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 timings/src/main/java/com/ankurm/vectorapi/ReductionOrder.java diff --git a/timings/src/main/java/com/ankurm/vectorapi/ReductionOrder.java b/timings/src/main/java/com/ankurm/vectorapi/ReductionOrder.java new file mode 100644 index 0000000..74d408c --- /dev/null +++ b/timings/src/main/java/com/ankurm/vectorapi/ReductionOrder.java @@ -0,0 +1,35 @@ +package com.ankurm.vectorapi; + +import jdk.incubator.vector.*; + +/** Why a vector reduction and a scalar loop disagree in the last bits. */ +public final class ReductionOrder { + + static final VectorSpecies SP = FloatVector.SPECIES_PREFERRED; + + static float scalarSum(float[] a) { + float sum = 0; + for (float v : a) sum += v; // strictly left to right + return sum; + } + + static float vectorSum(float[] a) { + FloatVector acc = FloatVector.zero(SP); + int i = 0, bound = SP.loopBound(a.length); + for (; i < bound; i += SP.length()) acc = acc.add(FloatVector.fromArray(SP, a, i)); + float sum = acc.reduceLanes(VectorOperators.ADD); // lanes combined at the end + for (; i < a.length; i++) sum += a[i]; + return sum; + } + + static void run() { + float[] a = Data.randomFloats(8192, 5); + System.out.println("--- floating-point reduction ordering ---"); + System.out.printf("scalar (left to right) : %.6f%n", scalarSum(a)); + System.out.printf("vector (lanes, then reduce): %.6f%n", vectorSum(a)); + System.out.println("Same mathematical sum; different addition order, so different rounding."); + System.out.println(); + } + + private ReductionOrder() {} +}