Add JMH benchmark for the brightness kernel
This commit is contained in:
55
jmh/src/main/java/com/ankurm/vectorapi/BrightnessBench.java
Normal file
55
jmh/src/main/java/com/ankurm/vectorapi/BrightnessBench.java
Normal file
@@ -0,0 +1,55 @@
|
||||
package com.ankurm.vectorapi;
|
||||
|
||||
import jdk.incubator.vector.*;
|
||||
import org.openjdk.jmh.annotations.*;
|
||||
import org.openjdk.jmh.infra.Blackhole;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/** JMH version of the image brightness + clamp kernel. */
|
||||
@BenchmarkMode(Mode.AverageTime)
|
||||
@OutputTimeUnit(TimeUnit.NANOSECONDS)
|
||||
@State(Scope.Thread)
|
||||
@Warmup(iterations = 5, time = 1)
|
||||
@Measurement(iterations = 5, time = 1)
|
||||
@Fork(1)
|
||||
public class BrightnessBench {
|
||||
static final VectorSpecies<Float> SP = FloatVector.SPECIES_PREFERRED;
|
||||
float[] in, out;
|
||||
float gain = 1.4f, bias = 12f;
|
||||
|
||||
@Setup
|
||||
public void setup() {
|
||||
in = new float[8192]; out = new float[8192];
|
||||
Random r = new Random(11);
|
||||
for (int i = 0; i < in.length; i++) in[i] = r.nextFloat() * 300f - 20f;
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
public void scalarClamp(Blackhole bh) {
|
||||
for (int i = 0; i < in.length; i++) {
|
||||
float v = in[i] * gain + bias;
|
||||
if (v < 0f) v = 0f; else if (v > 255f) v = 255f;
|
||||
out[i] = v;
|
||||
}
|
||||
bh.consume(out);
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
public void vectorClamp(Blackhole bh) {
|
||||
var vg = FloatVector.broadcast(SP, gain);
|
||||
var vb = FloatVector.broadcast(SP, bias);
|
||||
var lo = FloatVector.zero(SP);
|
||||
var hi = FloatVector.broadcast(SP, 255f);
|
||||
int i = 0, bound = SP.loopBound(in.length);
|
||||
for (; i < bound; i += SP.length()) {
|
||||
FloatVector.fromArray(SP, in, i).fma(vg, vb).max(lo).min(hi).intoArray(out, i);
|
||||
}
|
||||
for (; i < in.length; i++) {
|
||||
float v = in[i] * gain + bias;
|
||||
if (v < 0f) v = 0f; else if (v > 255f) v = 255f;
|
||||
out[i] = v;
|
||||
}
|
||||
bh.consume(out);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user