Add JMH benchmark for the masked filter
This commit is contained in:
47
jmh/src/main/java/com/ankurm/vectorapi/MaskedBench.java
Normal file
47
jmh/src/main/java/com/ankurm/vectorapi/MaskedBench.java
Normal file
@@ -0,0 +1,47 @@
|
||||
package com.ankurm.vectorapi;
|
||||
|
||||
import jdk.incubator.vector.*;
|
||||
import org.openjdk.jmh.annotations.*;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/** JMH version of the masked filter-and-sum: the headline speedup case. */
|
||||
@BenchmarkMode(Mode.AverageTime)
|
||||
@OutputTimeUnit(TimeUnit.NANOSECONDS)
|
||||
@State(Scope.Thread)
|
||||
@Warmup(iterations = 5, time = 1)
|
||||
@Measurement(iterations = 5, time = 1)
|
||||
@Fork(1)
|
||||
public class MaskedBench {
|
||||
static final VectorSpecies<Float> SP = FloatVector.SPECIES_PREFERRED;
|
||||
static final float THRESH = 0.5f;
|
||||
float[] a;
|
||||
|
||||
@Setup
|
||||
public void setup() {
|
||||
a = new float[8192];
|
||||
Random r = new Random(7);
|
||||
for (int i = 0; i < a.length; i++) a[i] = r.nextFloat();
|
||||
}
|
||||
|
||||
// Both methods return their result, so JMH consumes it and nothing is dead.
|
||||
@Benchmark
|
||||
public float scalarBranch() {
|
||||
float sum = 0;
|
||||
for (int i = 0; i < a.length; i++) if (a[i] > THRESH) sum += a[i];
|
||||
return sum;
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
public float vectorMasked() {
|
||||
FloatVector acc = FloatVector.zero(SP);
|
||||
int i = 0, bound = SP.loopBound(a.length);
|
||||
for (; i < bound; i += SP.length()) {
|
||||
var v = FloatVector.fromArray(SP, a, i);
|
||||
acc = acc.add(v, v.compare(VectorOperators.GT, THRESH));
|
||||
}
|
||||
float sum = acc.reduceLanes(VectorOperators.ADD);
|
||||
for (; i < a.length; i++) if (a[i] > THRESH) sum += a[i];
|
||||
return sum;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user