diff --git a/README.md b/README.md index 6ffb4dc69f1eaaef84ed3fc4e51c5d87006f4501..1b29692d65994b40d5c848361c8946e0f8e8f77f 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,12 @@ 运行时依赖: - JDK16+ +运行benchmark +```shell +${JAVA_HOME}/bin/java -jar vectorBlas-benchmark/target/vectorBlas-benchmarks.jar + +``` + #### 参与贡献 1. Fork 本仓库 diff --git a/pom.xml b/pom.xml index 0862590d747adcc596aac9c5738eb1c737d416e8..9e001dd5a81a7e901f3799d52e2f609a061ca623 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ vectorBlas + vectorBlas-benchmark diff --git a/vectorBlas-benchmark/.gitignore b/vectorBlas-benchmark/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e9286b3737f58763912fa3ba3b480af752c1b28a --- /dev/null +++ b/vectorBlas-benchmark/.gitignore @@ -0,0 +1,7 @@ +# Java +*.class +vecblas.iml +*.xml +.idea +/target/generated-sources +/target/classes diff --git a/vectorBlas-benchmark/pom.xml b/vectorBlas-benchmark/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..29ee4d17b2c8ebdd1332cf16fdbc56c93d4dacd9 --- /dev/null +++ b/vectorBlas-benchmark/pom.xml @@ -0,0 +1,145 @@ + + + + 4.0.0 + + + com.huawei.vector + parent + 1.0.0 + ../pom.xml + + + vectorBlas-benchmark + 1.0.0 + jar + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + com.huawei.vector + vectorBlas + 1.0.0 + + + + + UTF-8 + 1.29 + vectorBlas-benchmarks + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + package + + shade + + + ${uberjar.name} + + + org.openjdk.jmh.Main + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + + + + maven-clean-plugin + 2.5 + + + maven-deploy-plugin + 2.8.1 + + + maven-install-plugin + 2.5.1 + + + maven-jar-plugin + 2.4 + + + maven-javadoc-plugin + 2.9.1 + + + maven-resources-plugin + 2.6 + + + maven-site-plugin + 3.3 + + + maven-source-plugin + 2.2.1 + + + + + + diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/BenchmarkUtils.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/BenchmarkUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..e5bb75192c70c402c3be30a326eb5e793e69de89 --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/BenchmarkUtils.java @@ -0,0 +1,31 @@ +package com.huawei.vectorblas; + +import java.util.Random; + +public class BenchmarkUtils { + private static final Random rand = new Random(0); + + public static double randomDouble() { + return rand.nextDouble(); + } + + public static double[] randomDoubleArray(int n) { + double[] res = new double[n]; + for (int i = 0; i < n; i++) { + res[i] = rand.nextDouble(); + } + return res; + } + + public static float randomFloat() { + return rand.nextFloat(); + } + + public static float[] randomFloatArray(int n) { + float[] res = new float[n]; + for (int i = 0; i < n; i++) { + res[i] = rand.nextFloat(); + } + return res; + } +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/BlasBenchmark.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/BlasBenchmark.java new file mode 100644 index 0000000000000000000000000000000000000000..4f991c3641b11cb7de6fcf2b0a6adfccf2687bb2 --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/BlasBenchmark.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + */ + +package com.huawei.vectorblas; + +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; + +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.Throughput) +@OutputTimeUnit(TimeUnit.SECONDS) +@State(Scope.Thread) +@Fork(value = 1, jvmArgsAppend = {"--add-modules=jdk.incubator.vector"}) +public class BlasBenchmark { + protected BLAS vBlas = new VectorBLAS(); +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/DdotTest.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/DdotTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6443913e3c327de1c3942ab8595566788222fd38 --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/DdotTest.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + */ + +package com.huawei.vectorblas.l1; + +import com.huawei.vectorblas.BenchmarkUtils; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.infra.Blackhole; + +public class DdotTest extends L1Benchmark { + @Param({"100", "1000", "10000", "100000", "1000000", "10000000", "100000000"}) + public int n; + public double[] x; + public double[] y; + + @Setup(Level.Trial) + public void setup() { + x = BenchmarkUtils.randomDoubleArray(n); + y = BenchmarkUtils.randomDoubleArray(n); + } + + @Benchmark + public void vecBlasDdot(Blackhole bh) { + bh.consume(vBlas.ddot(n, x, 0, 1, y, 0, 1)); + } +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/L1Benchmark.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/L1Benchmark.java new file mode 100644 index 0000000000000000000000000000000000000000..dd51b7ca64afd1e8dde78821dbf1dbf9fc3d3147 --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/L1Benchmark.java @@ -0,0 +1,10 @@ +package com.huawei.vectorblas.l1; + +import com.huawei.vectorblas.BlasBenchmark; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Warmup; + +@Warmup(iterations = 3, time = 3) +@Measurement(iterations = 6, time = 3) +public class L1Benchmark extends BlasBenchmark { +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/SdotTest.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/SdotTest.java new file mode 100644 index 0000000000000000000000000000000000000000..598d339c9a14bd90d6938e83fb332c12329f3e98 --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l1/SdotTest.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + */ + +package com.huawei.vectorblas.l1; + +import com.huawei.vectorblas.BenchmarkUtils; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.infra.Blackhole; + + +public class SdotTest extends L1Benchmark { + @Param({"100", "1000", "10000", "100000", "1000000", "10000000", "100000000"}) + public int n; + public float[] x; + public float[] y; + + @Setup(Level.Trial) + public void setup() { + x = BenchmarkUtils.randomFloatArray(n); + y = BenchmarkUtils.randomFloatArray(n); + } + + @Benchmark + public void vecBlasSdot(Blackhole bh) { + bh.consume(vBlas.sdot(n, x, 0, 1, y, 0, 1)); + } +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/DgemvTest.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/DgemvTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6b3ff8693b8b396f5a624c379881a90ef753c9ec --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/DgemvTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + */ + +package com.huawei.vectorblas.l2; + +import com.huawei.vectorblas.BenchmarkUtils; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.infra.Blackhole; + +public class DgemvTest extends L2Benchmark { + @Param({"N", "T"}) + public String trans; + + @Param({"500", "4000", "10000"}) + public int m; + public int n; + + public double alpha; + public double[] a; + public double[] x; + public double beta; + public double[] y, yclone; + + @Setup(Level.Trial) + public void setup() { + n = m; + alpha = BenchmarkUtils.randomDouble(); + a = BenchmarkUtils.randomDoubleArray(m * n); + x = BenchmarkUtils.randomDoubleArray(trans.equals("T") ? m : n); + beta = BenchmarkUtils.randomDouble(); + y = BenchmarkUtils.randomDoubleArray(trans.equals("T") ? n : m); + } + + @Benchmark + public void vecBlasDgemv(Blackhole bh) { + vBlas.dgemv(trans, m, n, alpha, a, 0, m, x, 0, 1, beta, yclone = y.clone(), 0, 1); + bh.consume(yclone); + } +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/L2Benchmark.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/L2Benchmark.java new file mode 100644 index 0000000000000000000000000000000000000000..f3eadd9e73b62dfcd5b0ed05e4baee1de3cbfb9e --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/L2Benchmark.java @@ -0,0 +1,10 @@ +package com.huawei.vectorblas.l2; + +import com.huawei.vectorblas.BlasBenchmark; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Warmup; + +@Warmup(iterations = 3) +@Measurement(iterations = 6, time = 10) +public class L2Benchmark extends BlasBenchmark { +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/SgemvTest.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/SgemvTest.java new file mode 100644 index 0000000000000000000000000000000000000000..00a678be2066814f9ccceb2328918d15b5834936 --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l2/SgemvTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + */ + +package com.huawei.vectorblas.l2; + +import com.huawei.vectorblas.BenchmarkUtils; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.infra.Blackhole; + +public class SgemvTest extends L2Benchmark { + @Param({"N", "T"}) + public String trans; + + @Param({"500", "4000", "10000"}) + public int m; + public int n; + + public float alpha; + public float[] a; + public float[] x; + public float beta; + public float[] y, yclone; + + @Setup(Level.Trial) + public void setup() { + n = m; + alpha = BenchmarkUtils.randomFloat(); + a = BenchmarkUtils.randomFloatArray(m * n); + x = BenchmarkUtils.randomFloatArray(trans.equals("T") ? m : n); + beta = BenchmarkUtils.randomFloat(); + y = BenchmarkUtils.randomFloatArray(trans.equals("T") ? n : m); + } + + @Benchmark + public void vecBlasSgemv(Blackhole bh) { + vBlas.sgemv(trans, m, n, alpha, a, 0, m, x, 0, 1, beta, yclone = y.clone(), 0, 1); + bh.consume(yclone); + } +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/DgemmTest.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/DgemmTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ef5fc3fc497a9a5a291ab36d6e5b12ef2a517508 --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/DgemmTest.java @@ -0,0 +1,43 @@ +package com.huawei.vectorblas.l3; + +import com.huawei.vectorblas.BenchmarkUtils; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.infra.Blackhole; + +public class DgemmTest extends L3Benchmark { + @Param({"N", "T"}) + public String transa; + @Param({"N", "T"}) + public String transb; + + public int m; + public int n; + @Param({"1000", "2000", "3000"}) + public int k; + + public double alpha; + public double[] a; + public double[] b; + public double beta; + public double[] c, cclone; + + @Setup(Level.Trial) + public void setup() { + m = k; + n = k; + alpha = BenchmarkUtils.randomDouble(); + a = BenchmarkUtils.randomDoubleArray(k * m); + b = BenchmarkUtils.randomDoubleArray(k * n); + beta = BenchmarkUtils.randomDouble(); + c = BenchmarkUtils.randomDoubleArray(m * n); + } + + @Benchmark + public void vecBlasDgemm(Blackhole bh) { + vBlas.dgemm(transa, transb, m, n, k, alpha, a, 0, transa.equals("N") ? m : k, b, 0, transb.equals("N") ? k : n, beta, cclone = c.clone(), 0, m); + bh.consume(cclone); + } +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/L3Benchmark.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/L3Benchmark.java new file mode 100644 index 0000000000000000000000000000000000000000..3eeb8a5bae4071d041404a09893781ef7b4e2f3f --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/L3Benchmark.java @@ -0,0 +1,12 @@ +package com.huawei.vectorblas.l3; + +import com.huawei.vectorblas.BlasBenchmark; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Warmup; + +@Warmup(iterations = 3, time = 10) +@Measurement(iterations = 3, time = 20) +@Fork(value = 1, jvmArgsAppend = {"--add-modules=jdk.incubator.vector"}) +public class L3Benchmark extends BlasBenchmark { +} diff --git a/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/SgemmTest.java b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/SgemmTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a278be797ece0fdb591723dba590d4c376b4b58e --- /dev/null +++ b/vectorBlas-benchmark/src/main/java/com/huawei/vectorblas/l3/SgemmTest.java @@ -0,0 +1,43 @@ +package com.huawei.vectorblas.l3; + +import com.huawei.vectorblas.BenchmarkUtils; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.infra.Blackhole; + +public class SgemmTest extends L3Benchmark { + @Param({"N", "T"}) + public String transa; + @Param({"N", "T"}) + public String transb; + + @Param({"1000", "2000", "3000"}) + public int m; + public int n; + public int k; + + public float alpha; + public float[] a; + public float[] b; + public float beta; + public float[] c, cclone; + + @Setup(Level.Trial) + public void setup() { + n = m; + k = m; + alpha = BenchmarkUtils.randomFloat(); + a = BenchmarkUtils.randomFloatArray(k * m); + b = BenchmarkUtils.randomFloatArray(k * n); + beta = BenchmarkUtils.randomFloat(); + c = BenchmarkUtils.randomFloatArray(m * n); + } + + @Benchmark + public void vecBlasSgemm(Blackhole bh) { + vBlas.sgemm(transa, transb, m, n, k, alpha, a, 0, transa.equals("N") ? m : k, b, 0, transb.equals("N") ? k : n, beta, cclone = c.clone(), 0, m); + bh.consume(cclone); + } +}