Add floating-point reduction ordering demo
This commit is contained in:
@@ -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() {}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user