1
0

Add floating-point reduction ordering demo

This commit is contained in:
2026-07-26 11:46:28 +00:00
parent 19405ef9e4
commit 49b3e67292

View File

@@ -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<Float> 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() {}
}