/* * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have * questions. */ package benchmark.jdk.incubator.vector; import jdk.incubator.vector.Vector; import jdk.incubator.vector.Vector.Shape; import jdk.incubator.vector.Vector.Species; import jdk.incubator.vector.DoubleVector; import java.util.concurrent.TimeUnit; import java.util.function.BiFunction; import java.util.function.IntFunction; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @Warmup(iterations = 3, time = 1) @Measurement(iterations = 5, time = 1) @Fork(value = 1, jvmArgsPrepend = {"--add-modules=jdk.incubator.vector"}) public class Double64Vector extends AbstractVectorBenchmark { static final Species SPECIES = DoubleVector.SPECIES_64; static final int INVOC_COUNT = 1; // get rid of outer loop @Param("1024") int size; double[] fill(IntFunction f) { double[] array = new double[size]; for (int i = 0; i < array.length; i++) { array[i] = f.apply(i); } return array; } double[] a, b, c, r; boolean[] m, rm; int[] s; @Setup public void init() { size += size % SPECIES.length(); // FIXME: add post-loops a = fill(i -> (double)(2*i)); b = fill(i -> (double)(i+1)); c = fill(i -> (double)(i+5)); r = fill(i -> (double)0); m = fillMask(size, i -> (i % 2) == 0); rm = fillMask(size, i -> false); s = fillInt(size, i -> RANDOM.nextInt(SPECIES.length())); } final IntFunction fa = vl -> a; final IntFunction fb = vl -> b; final IntFunction fc = vl -> c; final IntFunction fr = vl -> r; final IntFunction fm = vl -> m; final IntFunction fmr = vl -> rm; final BiFunction fs = (i,j) -> s; @Benchmark public void add(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.add(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void addMasked(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.add(bv, vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void sub(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.sub(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void subMasked(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.sub(bv, vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void div(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.div(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void divMasked(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.div(bv, vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void mul(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.mul(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void mulMasked(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.mul(bv, vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void max(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.max(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void min(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.min(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void addAll(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double ra = 0; for (int ic = 0; ic < INVOC_COUNT; ic++) { ra = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); ra += av.addAll(); } } bh.consume(ra); } @Benchmark public void mulAll(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double ra = 1; for (int ic = 0; ic < INVOC_COUNT; ic++) { ra = 1; for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); ra *= av.mulAll(); } } bh.consume(ra); } @Benchmark public void minAll(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double ra = Double.POSITIVE_INFINITY; for (int ic = 0; ic < INVOC_COUNT; ic++) { ra = Double.POSITIVE_INFINITY; for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); ra = (double)Math.min(ra, av.minAll()); } } bh.consume(ra); } @Benchmark public void maxAll(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double ra = Double.NEGATIVE_INFINITY; for (int ic = 0; ic < INVOC_COUNT; ic++) { ra = Double.NEGATIVE_INFINITY; for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); ra = (double)Math.max(ra, av.maxAll()); } } bh.consume(ra); } @Benchmark public void with(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.with(0, (double)4).intoArray(r, i); } } bh.consume(r); } @Benchmark public Object lessThan() { double[] a = fa.apply(size); double[] b = fb.apply(size); boolean[] ms = fm.apply(size); Vector.Mask m = DoubleVector.maskFromArray(SPECIES, ms, 0); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); Vector.Mask mv = av.lessThan(bv); m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations } } return m; } @Benchmark public Object greaterThan() { double[] a = fa.apply(size); double[] b = fb.apply(size); boolean[] ms = fm.apply(size); Vector.Mask m = DoubleVector.maskFromArray(SPECIES, ms, 0); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); Vector.Mask mv = av.greaterThan(bv); m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations } } return m; } @Benchmark public Object equal() { double[] a = fa.apply(size); double[] b = fb.apply(size); boolean[] ms = fm.apply(size); Vector.Mask m = DoubleVector.maskFromArray(SPECIES, ms, 0); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); Vector.Mask mv = av.equal(bv); m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations } } return m; } @Benchmark public Object notEqual() { double[] a = fa.apply(size); double[] b = fb.apply(size); boolean[] ms = fm.apply(size); Vector.Mask m = DoubleVector.maskFromArray(SPECIES, ms, 0); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); Vector.Mask mv = av.notEqual(bv); m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations } } return m; } @Benchmark public Object lessThanEq() { double[] a = fa.apply(size); double[] b = fb.apply(size); boolean[] ms = fm.apply(size); Vector.Mask m = DoubleVector.maskFromArray(SPECIES, ms, 0); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); Vector.Mask mv = av.lessThanEq(bv); m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations } } return m; } @Benchmark public Object greaterThanEq() { double[] a = fa.apply(size); double[] b = fb.apply(size); boolean[] ms = fm.apply(size); Vector.Mask m = DoubleVector.maskFromArray(SPECIES, ms, 0); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); Vector.Mask mv = av.greaterThanEq(bv); m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations } } return m; } @Benchmark public void blend(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.blend(bv, vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void rearrange(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); int[] order = fs.apply(a.length, SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.rearrange(DoubleVector.shuffleFromArray(SPECIES, order, i)).intoArray(r, i); } } bh.consume(r); } @Benchmark public void extract(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); int num_lanes = SPECIES.length(); // Manually unroll because full unroll happens after intrinsification. // Unroll is needed because get intrinsic requires for index to be a known constant. if (num_lanes == 1) { r[i]=av.get(0); } else if (num_lanes == 2) { r[i]=av.get(0); r[i+1]=av.get(1); } else if (num_lanes == 4) { r[i]=av.get(0); r[i+1]=av.get(1); r[i+2]=av.get(2); r[i+3]=av.get(3); } else if (num_lanes == 8) { r[i]=av.get(0); r[i+1]=av.get(1); r[i+2]=av.get(2); r[i+3]=av.get(3); r[i+4]=av.get(4); r[i+5]=av.get(5); r[i+6]=av.get(6); r[i+7]=av.get(7); } else if (num_lanes == 16) { r[i]=av.get(0); r[i+1]=av.get(1); r[i+2]=av.get(2); r[i+3]=av.get(3); r[i+4]=av.get(4); r[i+5]=av.get(5); r[i+6]=av.get(6); r[i+7]=av.get(7); r[i+8]=av.get(8); r[i+9]=av.get(9); r[i+10]=av.get(10); r[i+11]=av.get(11); r[i+12]=av.get(12); r[i+13]=av.get(13); r[i+14]=av.get(14); r[i+15]=av.get(15); } else if (num_lanes == 32) { r[i]=av.get(0); r[i+1]=av.get(1); r[i+2]=av.get(2); r[i+3]=av.get(3); r[i+4]=av.get(4); r[i+5]=av.get(5); r[i+6]=av.get(6); r[i+7]=av.get(7); r[i+8]=av.get(8); r[i+9]=av.get(9); r[i+10]=av.get(10); r[i+11]=av.get(11); r[i+12]=av.get(12); r[i+13]=av.get(13); r[i+14]=av.get(14); r[i+15]=av.get(15); r[i+16]=av.get(16); r[i+17]=av.get(17); r[i+18]=av.get(18); r[i+19]=av.get(19); r[i+20]=av.get(20); r[i+21]=av.get(21); r[i+22]=av.get(22); r[i+23]=av.get(23); r[i+24]=av.get(24); r[i+25]=av.get(25); r[i+26]=av.get(26); r[i+27]=av.get(27); r[i+28]=av.get(28); r[i+29]=av.get(29); r[i+30]=av.get(30); r[i+31]=av.get(31); } else if (num_lanes == 64) { r[i]=av.get(0); r[i+1]=av.get(1); r[i+2]=av.get(2); r[i+3]=av.get(3); r[i+4]=av.get(4); r[i+5]=av.get(5); r[i+6]=av.get(6); r[i+7]=av.get(7); r[i+8]=av.get(8); r[i+9]=av.get(9); r[i+10]=av.get(10); r[i+11]=av.get(11); r[i+12]=av.get(12); r[i+13]=av.get(13); r[i+14]=av.get(14); r[i+15]=av.get(15); r[i+16]=av.get(16); r[i+17]=av.get(17); r[i+18]=av.get(18); r[i+19]=av.get(19); r[i+20]=av.get(20); r[i+21]=av.get(21); r[i+22]=av.get(22); r[i+23]=av.get(23); r[i+24]=av.get(24); r[i+25]=av.get(25); r[i+26]=av.get(26); r[i+27]=av.get(27); r[i+28]=av.get(28); r[i+29]=av.get(29); r[i+30]=av.get(30); r[i+31]=av.get(31); r[i+32]=av.get(32); r[i+33]=av.get(33); r[i+34]=av.get(34); r[i+35]=av.get(35); r[i+36]=av.get(36); r[i+37]=av.get(37); r[i+38]=av.get(38); r[i+39]=av.get(39); r[i+40]=av.get(40); r[i+41]=av.get(41); r[i+42]=av.get(42); r[i+43]=av.get(43); r[i+44]=av.get(44); r[i+45]=av.get(45); r[i+46]=av.get(46); r[i+47]=av.get(47); r[i+48]=av.get(48); r[i+49]=av.get(49); r[i+50]=av.get(50); r[i+51]=av.get(51); r[i+52]=av.get(52); r[i+53]=av.get(53); r[i+54]=av.get(54); r[i+55]=av.get(55); r[i+56]=av.get(56); r[i+57]=av.get(57); r[i+58]=av.get(58); r[i+59]=av.get(59); r[i+60]=av.get(60); r[i+61]=av.get(61); r[i+62]=av.get(62); r[i+63]=av.get(63); } else { for (int j = 0; j < SPECIES.length(); j++) { r[i+j]=av.get(j); } } } } bh.consume(r); } @Benchmark public void sin(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.sin().intoArray(r, i); } } bh.consume(r); } @Benchmark public void exp(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.exp().intoArray(r, i); } } bh.consume(r); } @Benchmark public void log1p(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.log1p().intoArray(r, i); } } bh.consume(r); } @Benchmark public void log(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.log().intoArray(r, i); } } bh.consume(r); } @Benchmark public void log10(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.log10().intoArray(r, i); } } bh.consume(r); } @Benchmark public void expm1(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.expm1().intoArray(r, i); } } bh.consume(r); } @Benchmark public void cos(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.cos().intoArray(r, i); } } bh.consume(r); } @Benchmark public void tan(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.tan().intoArray(r, i); } } bh.consume(r); } @Benchmark public void sinh(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.sinh().intoArray(r, i); } } bh.consume(r); } @Benchmark public void cosh(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.cosh().intoArray(r, i); } } bh.consume(r); } @Benchmark public void tanh(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.tanh().intoArray(r, i); } } bh.consume(r); } @Benchmark public void asin(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.asin().intoArray(r, i); } } bh.consume(r); } @Benchmark public void acos(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.acos().intoArray(r, i); } } bh.consume(r); } @Benchmark public void atan(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.atan().intoArray(r, i); } } bh.consume(r); } @Benchmark public void cbrt(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.cbrt().intoArray(r, i); } } bh.consume(r); } @Benchmark public void hypot(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.hypot(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void pow(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.pow(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void atan2(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); av.atan2(bv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void fma(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] c = fc.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); DoubleVector cv = DoubleVector.fromArray(SPECIES, c, i); av.fma(bv, cv).intoArray(r, i); } } bh.consume(r); } @Benchmark public void fmaMasked(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] b = fb.apply(SPECIES.length()); double[] c = fc.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); DoubleVector bv = DoubleVector.fromArray(SPECIES, b, i); DoubleVector cv = DoubleVector.fromArray(SPECIES, c, i); av.fma(bv, cv, vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void neg(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.neg().intoArray(r, i); } } bh.consume(r); } @Benchmark public void negMasked(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.neg(vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void abs(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.abs().intoArray(r, i); } } bh.consume(r); } @Benchmark public void absMasked(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.abs(vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void sqrt(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.sqrt().intoArray(r, i); } } bh.consume(r); } @Benchmark public void sqrtMasked(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); double[] r = fr.apply(SPECIES.length()); boolean[] mask = fm.apply(SPECIES.length()); Vector.Mask vmask = DoubleVector.maskFromValues(SPECIES, mask); for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.sqrt(vmask).intoArray(r, i); } } bh.consume(r); } @Benchmark public void gather(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); int[] b = fs.apply(a.length, SPECIES.length()); double[] r = new double[a.length]; for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i, b, i); av.intoArray(r, i); } } bh.consume(r); } @Benchmark public void scatter(Blackhole bh) { double[] a = fa.apply(SPECIES.length()); int[] b = fs.apply(a.length, SPECIES.length()); double[] r = new double[a.length]; for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) { DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); av.intoArray(r, i, b, i); } } bh.consume(r); } }