diff options
author | Yang Zhang <yang.zhang@linaro.org> | 2016-09-18 11:26:49 +0800 |
---|---|---|
committer | Ningsheng Jian <ningsheng.jian@linaro.org> | 2016-11-01 01:28:33 +0000 |
commit | c9b02571a9db10157ef3d8b72ae83055b81302f2 (patch) | |
tree | f2fdadb9271d90114fc9d4d65b4cca57b2187eab | |
parent | 6ebcd3d033a8124289662890293a985884aef1ce (diff) |
Add samples to measure vector multiply-add performance
Add the test cases as follows:
1. Vector sum of multiply-add for int
2. Vector sum of multiply-add and vector multiply-add for short
SLP support for different data types can also be measured by comparing
short cases with int cases.
Change-Id: Ia57f80c3b21edd0fcc78866fac8b848b4a2d1b4f
-rw-r--r-- | src/main/java/org/linaro/benchmarks/TestSIMDMlaInt.java | 88 | ||||
-rw-r--r-- | src/main/java/org/linaro/benchmarks/TestSIMDMlaShort.java | 132 |
2 files changed, 220 insertions, 0 deletions
diff --git a/src/main/java/org/linaro/benchmarks/TestSIMDMlaInt.java b/src/main/java/org/linaro/benchmarks/TestSIMDMlaInt.java new file mode 100644 index 0000000..ae1bc6f --- /dev/null +++ b/src/main/java/org/linaro/benchmarks/TestSIMDMlaInt.java @@ -0,0 +1,88 @@ +package org.linaro.benchmarks; + +import org.openjdk.jmh.annotations.*; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Benchmark) + +public class TestSIMDMlaInt { + static final int LENGTH = 256 * 1024; + static int [] a = new int[LENGTH]; + static int [] b = new int[LENGTH]; + static int [] c = new int[LENGTH]; + static int [] d = new int[LENGTH]; + + public static void TestSIMDMlaInit() { + for (int i = 0; i < LENGTH; i++) { + a[i] = 3; + b[i] = 2; + c[i] = 1; + } + } + + public static int vectSumOfMulAdd1( + int[] a, + int[] b, + int[] c, + int[] d) { + int total = 0; + for (int i = 0; i < LENGTH; i++) { + d[i] = (int)(a[i] * b[i] + c[i]); + total += d[i]; + } + return total; + } + + public static int vectSumOfMulAdd2( + int[] a, + int[] b, + int[] c, + int[] d) { + int total = 0; + for (int i = 0; i < LENGTH; i++) { + d[i] = (int)(a[i] * b[i] + a[i] * c[i]); + total += d[i]; + } + return total; + } + + public static int vectSumOfMulAdd3( + int[] a, + int[] b, + int[] c, + int[] d) { + int total = 0; + for (int i = 0; i < LENGTH; i++) { + d[i] = (int)((a[i] * b[i]) + (a[i] * c[i]) + (b[i] * c[i])); + total += d[i]; + } + return total; + } + + @Setup + public void setup() + { + TestSIMDMlaInit(); + } + + @Benchmark + public void testVectSumOfMulAdd1() { + int sum = 0; + sum = vectSumOfMulAdd1(a, b, c, d); + } + + @Benchmark + public void testVectSumOfMulAdd2() { + int sum = 0; + sum = vectSumOfMulAdd2(a, b, c, d); + } + + @Benchmark + public void testVectSumOfMulAdd3() { + int sum = 0; + sum = vectSumOfMulAdd3(a, b, c, d); + } + +} diff --git a/src/main/java/org/linaro/benchmarks/TestSIMDMlaShort.java b/src/main/java/org/linaro/benchmarks/TestSIMDMlaShort.java new file mode 100644 index 0000000..17cf3ce --- /dev/null +++ b/src/main/java/org/linaro/benchmarks/TestSIMDMlaShort.java @@ -0,0 +1,132 @@ +package org.linaro.benchmarks; + +import org.openjdk.jmh.annotations.*; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Benchmark) + +public class TestSIMDMlaShort { + static final int LENGTH = 256 * 1024; + static short [] a = new short[LENGTH]; + static short [] b = new short[LENGTH]; + static short [] c = new short[LENGTH]; + static short [] d = new short[LENGTH]; + + public static void TestSIMDMlaInit() { + for (int i = 0; i < LENGTH; i++) { + a[i] = 3; + b[i] = 2; + c[i] = 1; + } + } + + public static int vectSumOfMulAdd1( + short[] a, + short[] b, + short[] c, + short[] d) { + int total = 0; + for (int i = 0; i < LENGTH; i++) { + d[i] = (short)(a[i] * b[i] + c[i]); + total += d[i]; + } + return total; + } + + public static int vectSumOfMulAdd2( + short[] a, + short[] b, + short[] c, + short[] d) { + int total = 0; + for (int i = 0; i < LENGTH; i++) { + d[i] = (short)(a[i] * b[i] + a[i] * c[i]); + total += d[i]; + } + return total; + } + + public static int vectSumOfMulAdd3( + short[] a, + short[] b, + short[] c, + short[] d) { + int total = 0; + for (int i = 0; i < LENGTH; i++) { + d[i] = (short)((a[i] * b[i]) + (a[i] * c[i]) + (b[i] * c[i])); + total += d[i]; + } + return total; + } + + public static void vectMulAdd1( + short[] a, + short[] b, + short[] c, + short[] d) { + for (int i = 0; i < LENGTH; i++) { + d[i] = (short)(a[i] * b[i] + c[i]); + } + } + + public static void vectMulAdd2( + short[] a, + short[] b, + short[] c, + short[] d) { + for (int i = 0; i < LENGTH; i++) { + d[i] = (short)(a[i] * b[i] + a[i] * c[i]); + } + } + + public static void vectMulAdd3( + short[] a, + short[] b, + short[] c, + short[] d) { + for (int i = 0; i < LENGTH; i++) { + d[i] = (short)((a[i] * b[i]) + (a[i] * c[i]) + (b[i] * c[i])); + } + } + + @Setup + public void setup() + { + TestSIMDMlaInit(); + } + + @Benchmark + public void testVectSumOfMulAdd1() { + int sum = 0; + sum = vectSumOfMulAdd1(a, b, c, d); + } + + @Benchmark + public void testVectSumOfMulAdd2() { + int sum = 0; + sum = vectSumOfMulAdd2(a, b, c, d); + } + + @Benchmark + public void testVectSumOfMulAdd3() { + int sum = 0; + sum = vectSumOfMulAdd3(a, b, c, d); + } + @Benchmark + public void testVectMulAdd1() { + vectMulAdd1(a, b, c, d); + } + + @Benchmark + public void testVectMulAdd2() { + vectMulAdd2(a, b, c, d); + } + + @Benchmark + public void testVectMulAdd3() { + vectMulAdd3(a, b, c, d); + } + +} |