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