/* * Copyright (C) 2017 Linaro Limited. All rights received. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.linaro.benchmarks.vector; import org.openjdk.jmh.annotations.*; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) @State(Scope.Benchmark) public class TestSIMDFma { static final int LENGTH = 1024; static final int COUNT = 128; static float [] fa = new float[LENGTH]; static float [] fb = new float[LENGTH]; static float [] fc = new float[LENGTH]; static double [] da = new double[LENGTH]; static double [] db = new double[LENGTH]; static double [] dc = new double[LENGTH]; public static void testSIMDFmaInit() { for (int i = 0; i < LENGTH; i++) { fa[i] = (float)(i + 3); fb[i] = (float)(i + 2); fc[i] = (float)(i + 1); da[i] = (double)(i + 3); db[i] = (double)(i + 2); dc[i] = (double)(i + 1); } } public static void vecFusedMulAddFloat( float[] a, float[] b, float[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = Math.fma(a[i], b[i], c[i]); } } public static void vecFusedMulSub1Float( float[] a, float[] b, float[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = Math.fma(-a[i], b[i], c[i]); } } public static void vecFusedMulSub2Float( float[] a, float[] b, float[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = Math.fma(a[i], -b[i], c[i]); } } public static void vecNegFusedMulSubFloat( float[] a, float[] b, float[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = Math.fma(a[i], b[i], -c[i]); } } public static void vecNegFusedMulAddFloat( float[] a, float[] b, float[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = -(Math.fma(a[i], b[i], c[i])); } } public static void vecFusedMulAddDouble( double[] a, double[] b, double[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = Math.fma(a[i], b[i], c[i]); } } public static void vecFusedMulSub1Double( double[] a, double[] b, double[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = Math.fma(-a[i], b[i], c[i]); } } public static void vecFusedMulSub2Double( double[] a, double[] b, double[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = Math.fma(a[i], -b[i], c[i]); } } public static void vecNegFusedMulSubDouble( double[] a, double[] b, double[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = Math.fma(a[i], b[i], -c[i]); } } public static void vecNegFusedMulAddDouble( double[] a, double[] b, double[] c, int loop) { for (int i = 0; i < loop; i++) { c[i] = -(Math.fma(a[i], b[i], c[i])); } } @Setup public void setup() { testSIMDFmaInit(); } @Benchmark public void testVecFusedMulAddFloat() { for (int i = 0; i < COUNT; i++) { vecFusedMulAddFloat(fa, fb, fc, LENGTH); } } @Benchmark public void testVecFusedMulSub1Float() { for (int i = 0; i < COUNT; i++) { vecFusedMulSub1Float(fa, fb, fc, LENGTH); } } @Benchmark public void testVecFusedMulSub2Float() { for (int i = 0; i < COUNT; i++) { vecFusedMulSub2Float(fa, fb, fc, LENGTH); } } @Benchmark public void testVecNegFusedMulAddFloat() { for (int i = 0; i < COUNT; i++) { vecNegFusedMulAddFloat(fa, fb, fc, LENGTH); } } @Benchmark public void testVecNegFusedMulSubFloat() { for (int i = 0; i < COUNT; i++) { vecNegFusedMulSubFloat(fa, fb, fc, LENGTH); } } @Benchmark public void testVecFusedMulAddDouble() { for (int i = 0; i < COUNT; i++) { vecFusedMulAddDouble(da, db, dc, LENGTH); } } @Benchmark public void testVecFusedMulSub1Double() { for (int i = 0; i < COUNT; i++) { vecFusedMulSub1Double(da, db, dc, LENGTH); } } @Benchmark public void testVecFusedMulSub2Double() { for (int i = 0; i < COUNT; i++) { vecFusedMulSub2Double(da, db, dc, LENGTH); } } @Benchmark public void testVecNegFusedMulAddDouble() { for (int i = 0; i < COUNT; i++) { vecNegFusedMulAddDouble(da, db, dc, LENGTH); } } @Benchmark public void testVecNegFusedMulSubDouble() { for (int i = 0; i < COUNT; i++) { vecNegFusedMulSubDouble(da, db, dc, LENGTH); } } }