1 /* 2 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have 21 * questions. 22 */ 23 24 package benchmark.jdk.incubator.vector; 25 26 import jdk.incubator.vector.Vector; 27 import jdk.incubator.vector.Vector.Shape; 28 import jdk.incubator.vector.LongVector; 29 30 import java.util.concurrent.TimeUnit; 31 import java.util.function.BiFunction; 32 import java.util.function.IntFunction; 33 34 import org.openjdk.jmh.annotations.*; 35 import org.openjdk.jmh.infra.Blackhole; 36 37 @BenchmarkMode(Mode.Throughput) 38 @OutputTimeUnit(TimeUnit.MILLISECONDS) 39 @State(Scope.Benchmark) 40 @Warmup(iterations = 3, time = 1) 41 @Measurement(iterations = 5, time = 1) 42 @Fork(value = 1, jvmArgsPrepend = {"--add-modules=jdk.incubator.vector"}) 43 public class LongMaxVector extends AbstractVectorBenchmark { 44 static final LongVector.LongSpecies SPECIES = LongVector.species(Shape.S_Max_BIT); 45 46 static final int INVOC_COUNT = 1; // get rid of outer loop 47 48 @Param("1024") 49 int size; 50 51 long[] fill(IntFunction<Long> f) { 52 long[] array = new long[size]; 53 for (int i = 0; i < array.length; i++) { 54 array[i] = f.apply(i); 55 } 56 return array; 57 } 58 59 long[] a, b, c, r; 60 boolean[] m, rm; 61 int[] s; 62 63 @Setup 64 public void init() { 65 size += size % SPECIES.length(); // FIXME: add post-loops 66 67 a = fill(i -> (long)(2*i)); 68 b = fill(i -> (long)(i+1)); 69 c = fill(i -> (long)(i+5)); 70 r = fill(i -> (long)0); 71 72 m = fillMask(size, i -> (i % 2) == 0); 73 rm = fillMask(size, i -> false); 74 75 s = fillInt(size, i -> RANDOM.nextInt(SPECIES.length())); 76 } 77 78 final IntFunction<long[]> fa = vl -> a; 79 final IntFunction<long[]> fb = vl -> b; 80 final IntFunction<long[]> fc = vl -> c; 81 final IntFunction<long[]> fr = vl -> r; 82 final IntFunction<boolean[]> fm = vl -> m; 83 final IntFunction<boolean[]> fmr = vl -> rm; 84 final BiFunction<Integer,Integer,int[]> fs = (i,j) -> s; 85 86 87 @Benchmark 88 public void add(Blackhole bh) { 89 long[] a = fa.apply(SPECIES.length()); 90 long[] b = fb.apply(SPECIES.length()); 91 long[] r = fr.apply(SPECIES.length()); 92 93 for (int ic = 0; ic < INVOC_COUNT; ic++) { 94 for (int i = 0; i < a.length; i += SPECIES.length()) { 95 LongVector av = LongVector.fromArray(SPECIES, a, i); 96 LongVector bv = LongVector.fromArray(SPECIES, b, i); 97 av.add(bv).intoArray(r, i); 98 } 99 } 100 101 bh.consume(r); 102 } 103 104 @Benchmark 105 public void addMasked(Blackhole bh) { 106 long[] a = fa.apply(SPECIES.length()); 107 long[] b = fb.apply(SPECIES.length()); 108 long[] r = fr.apply(SPECIES.length()); 109 boolean[] mask = fm.apply(SPECIES.length()); 110 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 111 112 for (int ic = 0; ic < INVOC_COUNT; ic++) { 113 for (int i = 0; i < a.length; i += SPECIES.length()) { 114 LongVector av = LongVector.fromArray(SPECIES, a, i); 115 LongVector bv = LongVector.fromArray(SPECIES, b, i); 116 av.add(bv, vmask).intoArray(r, i); 117 } 118 } 119 120 bh.consume(r); 121 } 122 123 @Benchmark 124 public void sub(Blackhole bh) { 125 long[] a = fa.apply(SPECIES.length()); 126 long[] b = fb.apply(SPECIES.length()); 127 long[] r = fr.apply(SPECIES.length()); 128 129 for (int ic = 0; ic < INVOC_COUNT; ic++) { 130 for (int i = 0; i < a.length; i += SPECIES.length()) { 131 LongVector av = LongVector.fromArray(SPECIES, a, i); 132 LongVector bv = LongVector.fromArray(SPECIES, b, i); 133 av.sub(bv).intoArray(r, i); 134 } 135 } 136 137 bh.consume(r); 138 } 139 140 @Benchmark 141 public void subMasked(Blackhole bh) { 142 long[] a = fa.apply(SPECIES.length()); 143 long[] b = fb.apply(SPECIES.length()); 144 long[] r = fr.apply(SPECIES.length()); 145 boolean[] mask = fm.apply(SPECIES.length()); 146 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 147 148 for (int ic = 0; ic < INVOC_COUNT; ic++) { 149 for (int i = 0; i < a.length; i += SPECIES.length()) { 150 LongVector av = LongVector.fromArray(SPECIES, a, i); 151 LongVector bv = LongVector.fromArray(SPECIES, b, i); 152 av.sub(bv, vmask).intoArray(r, i); 153 } 154 } 155 156 bh.consume(r); 157 } 158 159 160 161 @Benchmark 162 public void mul(Blackhole bh) { 163 long[] a = fa.apply(SPECIES.length()); 164 long[] b = fb.apply(SPECIES.length()); 165 long[] r = fr.apply(SPECIES.length()); 166 167 for (int ic = 0; ic < INVOC_COUNT; ic++) { 168 for (int i = 0; i < a.length; i += SPECIES.length()) { 169 LongVector av = LongVector.fromArray(SPECIES, a, i); 170 LongVector bv = LongVector.fromArray(SPECIES, b, i); 171 av.mul(bv).intoArray(r, i); 172 } 173 } 174 175 bh.consume(r); 176 } 177 178 @Benchmark 179 public void mulMasked(Blackhole bh) { 180 long[] a = fa.apply(SPECIES.length()); 181 long[] b = fb.apply(SPECIES.length()); 182 long[] r = fr.apply(SPECIES.length()); 183 boolean[] mask = fm.apply(SPECIES.length()); 184 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 185 186 for (int ic = 0; ic < INVOC_COUNT; ic++) { 187 for (int i = 0; i < a.length; i += SPECIES.length()) { 188 LongVector av = LongVector.fromArray(SPECIES, a, i); 189 LongVector bv = LongVector.fromArray(SPECIES, b, i); 190 av.mul(bv, vmask).intoArray(r, i); 191 } 192 } 193 194 bh.consume(r); 195 } 196 197 198 @Benchmark 199 public void and(Blackhole bh) { 200 long[] a = fa.apply(SPECIES.length()); 201 long[] b = fb.apply(SPECIES.length()); 202 long[] r = fr.apply(SPECIES.length()); 203 204 for (int ic = 0; ic < INVOC_COUNT; ic++) { 205 for (int i = 0; i < a.length; i += SPECIES.length()) { 206 LongVector av = LongVector.fromArray(SPECIES, a, i); 207 LongVector bv = LongVector.fromArray(SPECIES, b, i); 208 av.and(bv).intoArray(r, i); 209 } 210 } 211 212 bh.consume(r); 213 } 214 215 216 217 @Benchmark 218 public void andMasked(Blackhole bh) { 219 long[] a = fa.apply(SPECIES.length()); 220 long[] b = fb.apply(SPECIES.length()); 221 long[] r = fr.apply(SPECIES.length()); 222 boolean[] mask = fm.apply(SPECIES.length()); 223 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 224 225 for (int ic = 0; ic < INVOC_COUNT; ic++) { 226 for (int i = 0; i < a.length; i += SPECIES.length()) { 227 LongVector av = LongVector.fromArray(SPECIES, a, i); 228 LongVector bv = LongVector.fromArray(SPECIES, b, i); 229 av.and(bv, vmask).intoArray(r, i); 230 } 231 } 232 233 bh.consume(r); 234 } 235 236 237 238 @Benchmark 239 public void or(Blackhole bh) { 240 long[] a = fa.apply(SPECIES.length()); 241 long[] b = fb.apply(SPECIES.length()); 242 long[] r = fr.apply(SPECIES.length()); 243 244 for (int ic = 0; ic < INVOC_COUNT; ic++) { 245 for (int i = 0; i < a.length; i += SPECIES.length()) { 246 LongVector av = LongVector.fromArray(SPECIES, a, i); 247 LongVector bv = LongVector.fromArray(SPECIES, b, i); 248 av.or(bv).intoArray(r, i); 249 } 250 } 251 252 bh.consume(r); 253 } 254 255 256 257 @Benchmark 258 public void orMasked(Blackhole bh) { 259 long[] a = fa.apply(SPECIES.length()); 260 long[] b = fb.apply(SPECIES.length()); 261 long[] r = fr.apply(SPECIES.length()); 262 boolean[] mask = fm.apply(SPECIES.length()); 263 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 264 265 for (int ic = 0; ic < INVOC_COUNT; ic++) { 266 for (int i = 0; i < a.length; i += SPECIES.length()) { 267 LongVector av = LongVector.fromArray(SPECIES, a, i); 268 LongVector bv = LongVector.fromArray(SPECIES, b, i); 269 av.or(bv, vmask).intoArray(r, i); 270 } 271 } 272 273 bh.consume(r); 274 } 275 276 277 278 @Benchmark 279 public void xor(Blackhole bh) { 280 long[] a = fa.apply(SPECIES.length()); 281 long[] b = fb.apply(SPECIES.length()); 282 long[] r = fr.apply(SPECIES.length()); 283 284 for (int ic = 0; ic < INVOC_COUNT; ic++) { 285 for (int i = 0; i < a.length; i += SPECIES.length()) { 286 LongVector av = LongVector.fromArray(SPECIES, a, i); 287 LongVector bv = LongVector.fromArray(SPECIES, b, i); 288 av.xor(bv).intoArray(r, i); 289 } 290 } 291 292 bh.consume(r); 293 } 294 295 296 297 @Benchmark 298 public void xorMasked(Blackhole bh) { 299 long[] a = fa.apply(SPECIES.length()); 300 long[] b = fb.apply(SPECIES.length()); 301 long[] r = fr.apply(SPECIES.length()); 302 boolean[] mask = fm.apply(SPECIES.length()); 303 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 304 305 for (int ic = 0; ic < INVOC_COUNT; ic++) { 306 for (int i = 0; i < a.length; i += SPECIES.length()) { 307 LongVector av = LongVector.fromArray(SPECIES, a, i); 308 LongVector bv = LongVector.fromArray(SPECIES, b, i); 309 av.xor(bv, vmask).intoArray(r, i); 310 } 311 } 312 313 bh.consume(r); 314 } 315 316 317 318 @Benchmark 319 public void shiftR(Blackhole bh) { 320 long[] a = fa.apply(SPECIES.length()); 321 long[] b = fb.apply(SPECIES.length()); 322 long[] r = fr.apply(SPECIES.length()); 323 324 for (int ic = 0; ic < INVOC_COUNT; ic++) { 325 for (int i = 0; i < a.length; i += SPECIES.length()) { 326 LongVector av = LongVector.fromArray(SPECIES, a, i); 327 LongVector bv = LongVector.fromArray(SPECIES, b, i); 328 av.shiftR(bv).intoArray(r, i); 329 } 330 } 331 332 bh.consume(r); 333 } 334 335 336 337 @Benchmark 338 public void shiftRMasked(Blackhole bh) { 339 long[] a = fa.apply(SPECIES.length()); 340 long[] b = fb.apply(SPECIES.length()); 341 long[] r = fr.apply(SPECIES.length()); 342 boolean[] mask = fm.apply(SPECIES.length()); 343 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 344 345 for (int ic = 0; ic < INVOC_COUNT; ic++) { 346 for (int i = 0; i < a.length; i += SPECIES.length()) { 347 LongVector av = LongVector.fromArray(SPECIES, a, i); 348 LongVector bv = LongVector.fromArray(SPECIES, b, i); 349 av.shiftR(bv, vmask).intoArray(r, i); 350 } 351 } 352 353 bh.consume(r); 354 } 355 356 357 358 @Benchmark 359 public void shiftL(Blackhole bh) { 360 long[] a = fa.apply(SPECIES.length()); 361 long[] b = fb.apply(SPECIES.length()); 362 long[] r = fr.apply(SPECIES.length()); 363 364 for (int ic = 0; ic < INVOC_COUNT; ic++) { 365 for (int i = 0; i < a.length; i += SPECIES.length()) { 366 LongVector av = LongVector.fromArray(SPECIES, a, i); 367 LongVector bv = LongVector.fromArray(SPECIES, b, i); 368 av.shiftL(bv).intoArray(r, i); 369 } 370 } 371 372 bh.consume(r); 373 } 374 375 376 377 @Benchmark 378 public void shiftLMasked(Blackhole bh) { 379 long[] a = fa.apply(SPECIES.length()); 380 long[] b = fb.apply(SPECIES.length()); 381 long[] r = fr.apply(SPECIES.length()); 382 boolean[] mask = fm.apply(SPECIES.length()); 383 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 384 385 for (int ic = 0; ic < INVOC_COUNT; ic++) { 386 for (int i = 0; i < a.length; i += SPECIES.length()) { 387 LongVector av = LongVector.fromArray(SPECIES, a, i); 388 LongVector bv = LongVector.fromArray(SPECIES, b, i); 389 av.shiftL(bv, vmask).intoArray(r, i); 390 } 391 } 392 393 bh.consume(r); 394 } 395 396 397 398 @Benchmark 399 public void aShiftR(Blackhole bh) { 400 long[] a = fa.apply(SPECIES.length()); 401 long[] b = fb.apply(SPECIES.length()); 402 long[] r = fr.apply(SPECIES.length()); 403 404 for (int ic = 0; ic < INVOC_COUNT; ic++) { 405 for (int i = 0; i < a.length; i += SPECIES.length()) { 406 LongVector av = LongVector.fromArray(SPECIES, a, i); 407 LongVector bv = LongVector.fromArray(SPECIES, b, i); 408 av.aShiftR(bv).intoArray(r, i); 409 } 410 } 411 412 bh.consume(r); 413 } 414 415 416 417 @Benchmark 418 public void aShiftRMasked(Blackhole bh) { 419 long[] a = fa.apply(SPECIES.length()); 420 long[] b = fb.apply(SPECIES.length()); 421 long[] r = fr.apply(SPECIES.length()); 422 boolean[] mask = fm.apply(SPECIES.length()); 423 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 424 425 for (int ic = 0; ic < INVOC_COUNT; ic++) { 426 for (int i = 0; i < a.length; i += SPECIES.length()) { 427 LongVector av = LongVector.fromArray(SPECIES, a, i); 428 LongVector bv = LongVector.fromArray(SPECIES, b, i); 429 av.aShiftR(bv, vmask).intoArray(r, i); 430 } 431 } 432 433 bh.consume(r); 434 } 435 436 437 438 @Benchmark 439 public void aShiftRShift(Blackhole bh) { 440 long[] a = fa.apply(SPECIES.length()); 441 long[] b = fb.apply(SPECIES.length()); 442 long[] r = fr.apply(SPECIES.length()); 443 444 for (int ic = 0; ic < INVOC_COUNT; ic++) { 445 for (int i = 0; i < a.length; i += SPECIES.length()) { 446 LongVector av = LongVector.fromArray(SPECIES, a, i); 447 av.aShiftR((int)b[i]).intoArray(r, i); 448 } 449 } 450 451 bh.consume(r); 452 } 453 454 455 456 @Benchmark 457 public void aShiftRMaskedShift(Blackhole bh) { 458 long[] a = fa.apply(SPECIES.length()); 459 long[] b = fb.apply(SPECIES.length()); 460 long[] r = fr.apply(SPECIES.length()); 461 boolean[] mask = fm.apply(SPECIES.length()); 462 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 463 464 for (int ic = 0; ic < INVOC_COUNT; ic++) { 465 for (int i = 0; i < a.length; i += SPECIES.length()) { 466 LongVector av = LongVector.fromArray(SPECIES, a, i); 467 av.aShiftR((int)b[i], vmask).intoArray(r, i); 468 } 469 } 470 471 bh.consume(r); 472 } 473 474 475 476 @Benchmark 477 public void shiftRShift(Blackhole bh) { 478 long[] a = fa.apply(SPECIES.length()); 479 long[] b = fb.apply(SPECIES.length()); 480 long[] r = fr.apply(SPECIES.length()); 481 482 for (int ic = 0; ic < INVOC_COUNT; ic++) { 483 for (int i = 0; i < a.length; i += SPECIES.length()) { 484 LongVector av = LongVector.fromArray(SPECIES, a, i); 485 av.shiftR((int)b[i]).intoArray(r, i); 486 } 487 } 488 489 bh.consume(r); 490 } 491 492 493 494 @Benchmark 495 public void shiftRMaskedShift(Blackhole bh) { 496 long[] a = fa.apply(SPECIES.length()); 497 long[] b = fb.apply(SPECIES.length()); 498 long[] r = fr.apply(SPECIES.length()); 499 boolean[] mask = fm.apply(SPECIES.length()); 500 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 501 502 for (int ic = 0; ic < INVOC_COUNT; ic++) { 503 for (int i = 0; i < a.length; i += SPECIES.length()) { 504 LongVector av = LongVector.fromArray(SPECIES, a, i); 505 av.shiftR((int)b[i], vmask).intoArray(r, i); 506 } 507 } 508 509 bh.consume(r); 510 } 511 512 513 514 @Benchmark 515 public void shiftLShift(Blackhole bh) { 516 long[] a = fa.apply(SPECIES.length()); 517 long[] b = fb.apply(SPECIES.length()); 518 long[] r = fr.apply(SPECIES.length()); 519 520 for (int ic = 0; ic < INVOC_COUNT; ic++) { 521 for (int i = 0; i < a.length; i += SPECIES.length()) { 522 LongVector av = LongVector.fromArray(SPECIES, a, i); 523 av.shiftL((int)b[i]).intoArray(r, i); 524 } 525 } 526 527 bh.consume(r); 528 } 529 530 531 532 @Benchmark 533 public void shiftLMaskedShift(Blackhole bh) { 534 long[] a = fa.apply(SPECIES.length()); 535 long[] b = fb.apply(SPECIES.length()); 536 long[] r = fr.apply(SPECIES.length()); 537 boolean[] mask = fm.apply(SPECIES.length()); 538 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 539 540 for (int ic = 0; ic < INVOC_COUNT; ic++) { 541 for (int i = 0; i < a.length; i += SPECIES.length()) { 542 LongVector av = LongVector.fromArray(SPECIES, a, i); 543 av.shiftL((int)b[i], vmask).intoArray(r, i); 544 } 545 } 546 547 bh.consume(r); 548 } 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 @Benchmark 564 public void max(Blackhole bh) { 565 long[] a = fa.apply(SPECIES.length()); 566 long[] b = fb.apply(SPECIES.length()); 567 long[] r = fr.apply(SPECIES.length()); 568 569 for (int ic = 0; ic < INVOC_COUNT; ic++) { 570 for (int i = 0; i < a.length; i += SPECIES.length()) { 571 LongVector av = LongVector.fromArray(SPECIES, a, i); 572 LongVector bv = LongVector.fromArray(SPECIES, b, i); 573 av.max(bv).intoArray(r, i); 574 } 575 } 576 577 bh.consume(r); 578 } 579 580 @Benchmark 581 public void min(Blackhole bh) { 582 long[] a = fa.apply(SPECIES.length()); 583 long[] b = fb.apply(SPECIES.length()); 584 long[] r = fr.apply(SPECIES.length()); 585 586 for (int ic = 0; ic < INVOC_COUNT; ic++) { 587 for (int i = 0; i < a.length; i += SPECIES.length()) { 588 LongVector av = LongVector.fromArray(SPECIES, a, i); 589 LongVector bv = LongVector.fromArray(SPECIES, b, i); 590 av.min(bv).intoArray(r, i); 591 } 592 } 593 594 bh.consume(r); 595 } 596 597 598 @Benchmark 599 public void andAll(Blackhole bh) { 600 long[] a = fa.apply(SPECIES.length()); 601 long[] r = fr.apply(SPECIES.length()); 602 long ra = -1; 603 604 for (int ic = 0; ic < INVOC_COUNT; ic++) { 605 for (int i = 0; i < a.length; i += SPECIES.length()) { 606 LongVector av = LongVector.fromArray(SPECIES, a, i); 607 r[i] = av.andAll(); 608 } 609 } 610 611 for (int ic = 0; ic < INVOC_COUNT; ic++) { 612 ra = -1; 613 for (int i = 0; i < a.length; i += SPECIES.length()) { 614 LongVector av = LongVector.fromArray(SPECIES, a, i); 615 ra &= av.andAll(); 616 } 617 } 618 619 bh.consume(ra); 620 bh.consume(r); 621 } 622 623 624 625 @Benchmark 626 public void orAll(Blackhole bh) { 627 long[] a = fa.apply(SPECIES.length()); 628 long[] r = fr.apply(SPECIES.length()); 629 long ra = 0; 630 631 for (int ic = 0; ic < INVOC_COUNT; ic++) { 632 for (int i = 0; i < a.length; i += SPECIES.length()) { 633 LongVector av = LongVector.fromArray(SPECIES, a, i); 634 r[i] = av.orAll(); 635 } 636 } 637 638 for (int ic = 0; ic < INVOC_COUNT; ic++) { 639 ra = 0; 640 for (int i = 0; i < a.length; i += SPECIES.length()) { 641 LongVector av = LongVector.fromArray(SPECIES, a, i); 642 ra |= av.orAll(); 643 } 644 } 645 646 bh.consume(ra); 647 bh.consume(r); 648 } 649 650 651 652 @Benchmark 653 public void xorAll(Blackhole bh) { 654 long[] a = fa.apply(SPECIES.length()); 655 long[] r = fr.apply(SPECIES.length()); 656 long ra = 0; 657 658 for (int ic = 0; ic < INVOC_COUNT; ic++) { 659 for (int i = 0; i < a.length; i += SPECIES.length()) { 660 LongVector av = LongVector.fromArray(SPECIES, a, i); 661 r[i] = av.xorAll(); 662 } 663 } 664 665 for (int ic = 0; ic < INVOC_COUNT; ic++) { 666 ra = 0; 667 for (int i = 0; i < a.length; i += SPECIES.length()) { 668 LongVector av = LongVector.fromArray(SPECIES, a, i); 669 ra ^= av.xorAll(); 670 } 671 } 672 673 bh.consume(ra); 674 bh.consume(r); 675 } 676 677 678 @Benchmark 679 public void addAll(Blackhole bh) { 680 long[] a = fa.apply(SPECIES.length()); 681 long[] r = fr.apply(SPECIES.length()); 682 long ra = 0; 683 684 for (int ic = 0; ic < INVOC_COUNT; ic++) { 685 for (int i = 0; i < a.length; i += SPECIES.length()) { 686 LongVector av = LongVector.fromArray(SPECIES, a, i); 687 r[i] = av.addAll(); 688 } 689 } 690 691 for (int ic = 0; ic < INVOC_COUNT; ic++) { 692 ra = 0; 693 for (int i = 0; i < a.length; i += SPECIES.length()) { 694 LongVector av = LongVector.fromArray(SPECIES, a, i); 695 ra += av.addAll(); 696 } 697 } 698 699 bh.consume(ra); 700 bh.consume(r); 701 } 702 703 @Benchmark 704 public void mulAll(Blackhole bh) { 705 long[] a = fa.apply(SPECIES.length()); 706 long[] r = fr.apply(SPECIES.length()); 707 long ra = 1; 708 709 for (int ic = 0; ic < INVOC_COUNT; ic++) { 710 for (int i = 0; i < a.length; i += SPECIES.length()) { 711 LongVector av = LongVector.fromArray(SPECIES, a, i); 712 r[i] = av.mulAll(); 713 } 714 } 715 716 for (int ic = 0; ic < INVOC_COUNT; ic++) { 717 ra = 1; 718 for (int i = 0; i < a.length; i += SPECIES.length()) { 719 LongVector av = LongVector.fromArray(SPECIES, a, i); 720 ra *= av.mulAll(); 721 } 722 } 723 724 bh.consume(ra); 725 bh.consume(r); 726 } 727 728 @Benchmark 729 public void minAll(Blackhole bh) { 730 long[] a = fa.apply(SPECIES.length()); 731 long[] r = fr.apply(SPECIES.length()); 732 long ra = Long.MAX_VALUE; 733 734 for (int ic = 0; ic < INVOC_COUNT; ic++) { 735 for (int i = 0; i < a.length; i += SPECIES.length()) { 736 LongVector av = LongVector.fromArray(SPECIES, a, i); 737 r[i] = av.minAll(); 738 } 739 } 740 741 for (int ic = 0; ic < INVOC_COUNT; ic++) { 742 ra = Long.MAX_VALUE; 743 for (int i = 0; i < a.length; i += SPECIES.length()) { 744 LongVector av = LongVector.fromArray(SPECIES, a, i); 745 ra = (long)Math.min(ra, av.minAll()); 746 } 747 } 748 749 bh.consume(ra); 750 bh.consume(r); 751 } 752 753 @Benchmark 754 public void maxAll(Blackhole bh) { 755 long[] a = fa.apply(SPECIES.length()); 756 long[] r = fr.apply(SPECIES.length()); 757 long ra = Long.MIN_VALUE; 758 759 for (int ic = 0; ic < INVOC_COUNT; ic++) { 760 for (int i = 0; i < a.length; i += SPECIES.length()) { 761 LongVector av = LongVector.fromArray(SPECIES, a, i); 762 r[i] = av.maxAll(); 763 } 764 } 765 766 for (int ic = 0; ic < INVOC_COUNT; ic++) { 767 ra = Long.MIN_VALUE; 768 for (int i = 0; i < a.length; i += SPECIES.length()) { 769 LongVector av = LongVector.fromArray(SPECIES, a, i); 770 ra = (long)Math.max(ra, av.maxAll()); 771 } 772 } 773 774 bh.consume(ra); 775 bh.consume(r); 776 } 777 778 779 @Benchmark 780 public void anyTrue(Blackhole bh) { 781 boolean[] mask = fm.apply(SPECIES.length()); 782 boolean[] r = fmr.apply(SPECIES.length()); 783 784 for (int ic = 0; ic < INVOC_COUNT; ic++) { 785 for (int i = 0; i < mask.length; i += SPECIES.length()) { 786 Vector.Mask<Long> vmask = LongVector.maskFromArray(SPECIES, mask, i); 787 r[i] = vmask.anyTrue(); 788 } 789 } 790 791 bh.consume(r); 792 } 793 794 795 796 @Benchmark 797 public void allTrue(Blackhole bh) { 798 boolean[] mask = fm.apply(SPECIES.length()); 799 boolean[] r = fmr.apply(SPECIES.length()); 800 801 for (int ic = 0; ic < INVOC_COUNT; ic++) { 802 for (int i = 0; i < mask.length; i += SPECIES.length()) { 803 Vector.Mask<Long> vmask = LongVector.maskFromArray(SPECIES, mask, i); 804 r[i] = vmask.allTrue(); 805 } 806 } 807 808 bh.consume(r); 809 } 810 811 812 @Benchmark 813 public void with(Blackhole bh) { 814 long[] a = fa.apply(SPECIES.length()); 815 long[] r = fr.apply(SPECIES.length()); 816 817 for (int ic = 0; ic < INVOC_COUNT; ic++) { 818 for (int i = 0; i < a.length; i += SPECIES.length()) { 819 LongVector av = LongVector.fromArray(SPECIES, a, i); 820 av.with(0, (long)4).intoArray(r, i); 821 } 822 } 823 824 bh.consume(r); 825 } 826 827 @Benchmark 828 public Object lessThan() { 829 long[] a = fa.apply(size); 830 long[] b = fb.apply(size); 831 boolean[] ms = fm.apply(size); 832 Vector.Mask<Long> m = LongVector.maskFromArray(SPECIES, ms, 0); 833 834 for (int ic = 0; ic < INVOC_COUNT; ic++) { 835 for (int i = 0; i < a.length; i += SPECIES.length()) { 836 LongVector av = LongVector.fromArray(SPECIES, a, i); 837 LongVector bv = LongVector.fromArray(SPECIES, b, i); 838 Vector.Mask<Long> mv = av.lessThan(bv); 839 840 m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations 841 } 842 } 843 return m; 844 } 845 846 847 @Benchmark 848 public Object greaterThan() { 849 long[] a = fa.apply(size); 850 long[] b = fb.apply(size); 851 boolean[] ms = fm.apply(size); 852 Vector.Mask<Long> m = LongVector.maskFromArray(SPECIES, ms, 0); 853 854 for (int ic = 0; ic < INVOC_COUNT; ic++) { 855 for (int i = 0; i < a.length; i += SPECIES.length()) { 856 LongVector av = LongVector.fromArray(SPECIES, a, i); 857 LongVector bv = LongVector.fromArray(SPECIES, b, i); 858 Vector.Mask<Long> mv = av.greaterThan(bv); 859 860 m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations 861 } 862 } 863 return m; 864 } 865 866 867 @Benchmark 868 public Object equal() { 869 long[] a = fa.apply(size); 870 long[] b = fb.apply(size); 871 boolean[] ms = fm.apply(size); 872 Vector.Mask<Long> m = LongVector.maskFromArray(SPECIES, ms, 0); 873 874 for (int ic = 0; ic < INVOC_COUNT; ic++) { 875 for (int i = 0; i < a.length; i += SPECIES.length()) { 876 LongVector av = LongVector.fromArray(SPECIES, a, i); 877 LongVector bv = LongVector.fromArray(SPECIES, b, i); 878 Vector.Mask<Long> mv = av.equal(bv); 879 880 m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations 881 } 882 } 883 return m; 884 } 885 886 887 @Benchmark 888 public Object notEqual() { 889 long[] a = fa.apply(size); 890 long[] b = fb.apply(size); 891 boolean[] ms = fm.apply(size); 892 Vector.Mask<Long> m = LongVector.maskFromArray(SPECIES, ms, 0); 893 894 for (int ic = 0; ic < INVOC_COUNT; ic++) { 895 for (int i = 0; i < a.length; i += SPECIES.length()) { 896 LongVector av = LongVector.fromArray(SPECIES, a, i); 897 LongVector bv = LongVector.fromArray(SPECIES, b, i); 898 Vector.Mask<Long> mv = av.notEqual(bv); 899 900 m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations 901 } 902 } 903 return m; 904 } 905 906 907 @Benchmark 908 public Object lessThanEq() { 909 long[] a = fa.apply(size); 910 long[] b = fb.apply(size); 911 boolean[] ms = fm.apply(size); 912 Vector.Mask<Long> m = LongVector.maskFromArray(SPECIES, ms, 0); 913 914 for (int ic = 0; ic < INVOC_COUNT; ic++) { 915 for (int i = 0; i < a.length; i += SPECIES.length()) { 916 LongVector av = LongVector.fromArray(SPECIES, a, i); 917 LongVector bv = LongVector.fromArray(SPECIES, b, i); 918 Vector.Mask<Long> mv = av.lessThanEq(bv); 919 920 m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations 921 } 922 } 923 return m; 924 } 925 926 927 @Benchmark 928 public Object greaterThanEq() { 929 long[] a = fa.apply(size); 930 long[] b = fb.apply(size); 931 boolean[] ms = fm.apply(size); 932 Vector.Mask<Long> m = LongVector.maskFromArray(SPECIES, ms, 0); 933 934 for (int ic = 0; ic < INVOC_COUNT; ic++) { 935 for (int i = 0; i < a.length; i += SPECIES.length()) { 936 LongVector av = LongVector.fromArray(SPECIES, a, i); 937 LongVector bv = LongVector.fromArray(SPECIES, b, i); 938 Vector.Mask<Long> mv = av.greaterThanEq(bv); 939 940 m = m.and(mv); // accumulate results, so JIT can't eliminate relevant computations 941 } 942 } 943 return m; 944 } 945 946 947 @Benchmark 948 public void blend(Blackhole bh) { 949 long[] a = fa.apply(SPECIES.length()); 950 long[] b = fb.apply(SPECIES.length()); 951 long[] r = fr.apply(SPECIES.length()); 952 boolean[] mask = fm.apply(SPECIES.length()); 953 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 954 955 for (int ic = 0; ic < INVOC_COUNT; ic++) { 956 for (int i = 0; i < a.length; i += SPECIES.length()) { 957 LongVector av = LongVector.fromArray(SPECIES, a, i); 958 LongVector bv = LongVector.fromArray(SPECIES, b, i); 959 av.blend(bv, vmask).intoArray(r, i); 960 } 961 } 962 963 bh.consume(r); 964 } 965 966 @Benchmark 967 public void rearrange(Blackhole bh) { 968 long[] a = fa.apply(SPECIES.length()); 969 int[] order = fs.apply(a.length, SPECIES.length()); 970 long[] r = fr.apply(SPECIES.length()); 971 972 for (int ic = 0; ic < INVOC_COUNT; ic++) { 973 for (int i = 0; i < a.length; i += SPECIES.length()) { 974 LongVector av = LongVector.fromArray(SPECIES, a, i); 975 av.rearrange(LongVector.shuffleFromArray(SPECIES, order, i)).intoArray(r, i); 976 } 977 } 978 979 bh.consume(r); 980 } 981 982 @Benchmark 983 public void extract(Blackhole bh) { 984 long[] a = fa.apply(SPECIES.length()); 985 long[] r = fr.apply(SPECIES.length()); 986 987 for (int ic = 0; ic < INVOC_COUNT; ic++) { 988 for (int i = 0; i < a.length; i += SPECIES.length()) { 989 LongVector av = LongVector.fromArray(SPECIES, a, i); 990 int num_lanes = SPECIES.length(); 991 // Manually unroll because full unroll happens after intrinsification. 992 // Unroll is needed because get intrinsic requires for index to be a known constant. 993 if (num_lanes == 1) { 994 r[i]=av.get(0); 995 } else if (num_lanes == 2) { 996 r[i]=av.get(0); 997 r[i+1]=av.get(1); 998 } else if (num_lanes == 4) { 999 r[i]=av.get(0); 1000 r[i+1]=av.get(1); 1001 r[i+2]=av.get(2); 1002 r[i+3]=av.get(3); 1003 } else if (num_lanes == 8) { 1004 r[i]=av.get(0); 1005 r[i+1]=av.get(1); 1006 r[i+2]=av.get(2); 1007 r[i+3]=av.get(3); 1008 r[i+4]=av.get(4); 1009 r[i+5]=av.get(5); 1010 r[i+6]=av.get(6); 1011 r[i+7]=av.get(7); 1012 } else if (num_lanes == 16) { 1013 r[i]=av.get(0); 1014 r[i+1]=av.get(1); 1015 r[i+2]=av.get(2); 1016 r[i+3]=av.get(3); 1017 r[i+4]=av.get(4); 1018 r[i+5]=av.get(5); 1019 r[i+6]=av.get(6); 1020 r[i+7]=av.get(7); 1021 r[i+8]=av.get(8); 1022 r[i+9]=av.get(9); 1023 r[i+10]=av.get(10); 1024 r[i+11]=av.get(11); 1025 r[i+12]=av.get(12); 1026 r[i+13]=av.get(13); 1027 r[i+14]=av.get(14); 1028 r[i+15]=av.get(15); 1029 } else if (num_lanes == 32) { 1030 r[i]=av.get(0); 1031 r[i+1]=av.get(1); 1032 r[i+2]=av.get(2); 1033 r[i+3]=av.get(3); 1034 r[i+4]=av.get(4); 1035 r[i+5]=av.get(5); 1036 r[i+6]=av.get(6); 1037 r[i+7]=av.get(7); 1038 r[i+8]=av.get(8); 1039 r[i+9]=av.get(9); 1040 r[i+10]=av.get(10); 1041 r[i+11]=av.get(11); 1042 r[i+12]=av.get(12); 1043 r[i+13]=av.get(13); 1044 r[i+14]=av.get(14); 1045 r[i+15]=av.get(15); 1046 r[i+16]=av.get(16); 1047 r[i+17]=av.get(17); 1048 r[i+18]=av.get(18); 1049 r[i+19]=av.get(19); 1050 r[i+20]=av.get(20); 1051 r[i+21]=av.get(21); 1052 r[i+22]=av.get(22); 1053 r[i+23]=av.get(23); 1054 r[i+24]=av.get(24); 1055 r[i+25]=av.get(25); 1056 r[i+26]=av.get(26); 1057 r[i+27]=av.get(27); 1058 r[i+28]=av.get(28); 1059 r[i+29]=av.get(29); 1060 r[i+30]=av.get(30); 1061 r[i+31]=av.get(31); 1062 } else if (num_lanes == 64) { 1063 r[i]=av.get(0); 1064 r[i+1]=av.get(1); 1065 r[i+2]=av.get(2); 1066 r[i+3]=av.get(3); 1067 r[i+4]=av.get(4); 1068 r[i+5]=av.get(5); 1069 r[i+6]=av.get(6); 1070 r[i+7]=av.get(7); 1071 r[i+8]=av.get(8); 1072 r[i+9]=av.get(9); 1073 r[i+10]=av.get(10); 1074 r[i+11]=av.get(11); 1075 r[i+12]=av.get(12); 1076 r[i+13]=av.get(13); 1077 r[i+14]=av.get(14); 1078 r[i+15]=av.get(15); 1079 r[i+16]=av.get(16); 1080 r[i+17]=av.get(17); 1081 r[i+18]=av.get(18); 1082 r[i+19]=av.get(19); 1083 r[i+20]=av.get(20); 1084 r[i+21]=av.get(21); 1085 r[i+22]=av.get(22); 1086 r[i+23]=av.get(23); 1087 r[i+24]=av.get(24); 1088 r[i+25]=av.get(25); 1089 r[i+26]=av.get(26); 1090 r[i+27]=av.get(27); 1091 r[i+28]=av.get(28); 1092 r[i+29]=av.get(29); 1093 r[i+30]=av.get(30); 1094 r[i+31]=av.get(31); 1095 r[i+32]=av.get(32); 1096 r[i+33]=av.get(33); 1097 r[i+34]=av.get(34); 1098 r[i+35]=av.get(35); 1099 r[i+36]=av.get(36); 1100 r[i+37]=av.get(37); 1101 r[i+38]=av.get(38); 1102 r[i+39]=av.get(39); 1103 r[i+40]=av.get(40); 1104 r[i+41]=av.get(41); 1105 r[i+42]=av.get(42); 1106 r[i+43]=av.get(43); 1107 r[i+44]=av.get(44); 1108 r[i+45]=av.get(45); 1109 r[i+46]=av.get(46); 1110 r[i+47]=av.get(47); 1111 r[i+48]=av.get(48); 1112 r[i+49]=av.get(49); 1113 r[i+50]=av.get(50); 1114 r[i+51]=av.get(51); 1115 r[i+52]=av.get(52); 1116 r[i+53]=av.get(53); 1117 r[i+54]=av.get(54); 1118 r[i+55]=av.get(55); 1119 r[i+56]=av.get(56); 1120 r[i+57]=av.get(57); 1121 r[i+58]=av.get(58); 1122 r[i+59]=av.get(59); 1123 r[i+60]=av.get(60); 1124 r[i+61]=av.get(61); 1125 r[i+62]=av.get(62); 1126 r[i+63]=av.get(63); 1127 } else { 1128 for (int j = 0; j < SPECIES.length(); j++) { 1129 r[i+j]=av.get(j); 1130 } 1131 } 1132 } 1133 } 1134 1135 bh.consume(r); 1136 } 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 @Benchmark 1159 public void neg(Blackhole bh) { 1160 long[] a = fa.apply(SPECIES.length()); 1161 long[] r = fr.apply(SPECIES.length()); 1162 1163 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1164 for (int i = 0; i < a.length; i += SPECIES.length()) { 1165 LongVector av = LongVector.fromArray(SPECIES, a, i); 1166 av.neg().intoArray(r, i); 1167 } 1168 } 1169 1170 bh.consume(r); 1171 } 1172 1173 @Benchmark 1174 public void negMasked(Blackhole bh) { 1175 long[] a = fa.apply(SPECIES.length()); 1176 long[] r = fr.apply(SPECIES.length()); 1177 boolean[] mask = fm.apply(SPECIES.length()); 1178 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 1179 1180 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1181 for (int i = 0; i < a.length; i += SPECIES.length()) { 1182 LongVector av = LongVector.fromArray(SPECIES, a, i); 1183 av.neg(vmask).intoArray(r, i); 1184 } 1185 } 1186 1187 bh.consume(r); 1188 } 1189 1190 @Benchmark 1191 public void abs(Blackhole bh) { 1192 long[] a = fa.apply(SPECIES.length()); 1193 long[] r = fr.apply(SPECIES.length()); 1194 1195 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1196 for (int i = 0; i < a.length; i += SPECIES.length()) { 1197 LongVector av = LongVector.fromArray(SPECIES, a, i); 1198 av.abs().intoArray(r, i); 1199 } 1200 } 1201 1202 bh.consume(r); 1203 } 1204 1205 @Benchmark 1206 public void absMasked(Blackhole bh) { 1207 long[] a = fa.apply(SPECIES.length()); 1208 long[] r = fr.apply(SPECIES.length()); 1209 boolean[] mask = fm.apply(SPECIES.length()); 1210 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 1211 1212 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1213 for (int i = 0; i < a.length; i += SPECIES.length()) { 1214 LongVector av = LongVector.fromArray(SPECIES, a, i); 1215 av.abs(vmask).intoArray(r, i); 1216 } 1217 } 1218 1219 bh.consume(r); 1220 } 1221 1222 1223 @Benchmark 1224 public void not(Blackhole bh) { 1225 long[] a = fa.apply(SPECIES.length()); 1226 long[] r = fr.apply(SPECIES.length()); 1227 1228 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1229 for (int i = 0; i < a.length; i += SPECIES.length()) { 1230 LongVector av = LongVector.fromArray(SPECIES, a, i); 1231 av.not().intoArray(r, i); 1232 } 1233 } 1234 1235 bh.consume(r); 1236 } 1237 1238 1239 1240 @Benchmark 1241 public void notMasked(Blackhole bh) { 1242 long[] a = fa.apply(SPECIES.length()); 1243 long[] r = fr.apply(SPECIES.length()); 1244 boolean[] mask = fm.apply(SPECIES.length()); 1245 Vector.Mask<Long> vmask = LongVector.maskFromValues(SPECIES, mask); 1246 1247 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1248 for (int i = 0; i < a.length; i += SPECIES.length()) { 1249 LongVector av = LongVector.fromArray(SPECIES, a, i); 1250 av.not(vmask).intoArray(r, i); 1251 } 1252 } 1253 1254 bh.consume(r); 1255 } 1256 1257 1258 1259 1260 1261 @Benchmark 1262 public void gather(Blackhole bh) { 1263 long[] a = fa.apply(SPECIES.length()); 1264 int[] b = fs.apply(a.length * 2, SPECIES.length()); 1265 long[] r = new long[a.length]; 1266 1267 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1268 for (int i = 0; i < a.length; i += SPECIES.length()) { 1269 LongVector av = LongVector.fromArray(SPECIES, a, i, b, i); 1270 av.intoArray(r, i); 1271 } 1272 } 1273 1274 bh.consume(r); 1275 } 1276 1277 1278 1279 @Benchmark 1280 public void scatter(Blackhole bh) { 1281 long[] a = fa.apply(SPECIES.length()); 1282 int[] b = fs.apply(a.length * 2, SPECIES.length()); 1283 long[] r = new long[a.length]; 1284 1285 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1286 for (int i = 0; i < a.length; i += SPECIES.length()) { 1287 LongVector av = LongVector.fromArray(SPECIES, a, i); 1288 av.intoArray(r, i, b, i); 1289 } 1290 } 1291 1292 bh.consume(r); 1293 } 1294 1295 } 1296