1 /* 2 * Copyright (c) 2018, 2019, 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 java.util.concurrent.TimeUnit; 27 import java.util.function.IntFunction; 28 29 import org.openjdk.jmh.annotations.*; 30 import org.openjdk.jmh.infra.Blackhole; 31 32 @BenchmarkMode(Mode.Throughput) 33 @OutputTimeUnit(TimeUnit.MILLISECONDS) 34 @State(Scope.Benchmark) 35 @Warmup(iterations = 3, time = 1) 36 @Measurement(iterations = 5, time = 1) 37 @Fork(value = 1, jvmArgsPrepend = {"--add-modules=jdk.incubator.vector"}) 38 public class LongScalar extends AbstractVectorBenchmark { 39 static final int INVOC_COUNT = 1; // To align with vector benchmarks. 40 41 @Param("1024") 42 int size; 43 44 long[] fill(IntFunction<Long> f) { 45 long[] array = new long[size]; 46 for (int i = 0; i < array.length; i++) { 47 array[i] = f.apply(i); 48 } 49 return array; 50 } 51 52 long[] as, bs, cs, rs; 53 boolean[] ms, rms; 54 int[] ss; 55 56 @Setup 57 public void init() { 58 as = fill(i -> (long)(2*i)); 59 bs = fill(i -> (long)(i+1)); 60 cs = fill(i -> (long)(i+5)); 61 rs = fill(i -> (long)0); 62 ms = fillMask(size, i -> (i % 2) == 0); 63 rms = fillMask(size, i -> false); 64 65 ss = fillInt(size, i -> RANDOM.nextInt(Math.max(i,1))); 66 } 67 68 final IntFunction<long[]> fa = vl -> as; 69 final IntFunction<long[]> fb = vl -> bs; 70 final IntFunction<long[]> fc = vl -> cs; 71 final IntFunction<long[]> fr = vl -> rs; 72 final IntFunction<boolean[]> fm = vl -> ms; 73 final IntFunction<boolean[]> fmr = vl -> rms; 74 final IntFunction<int[]> fs = vl -> ss; 75 76 77 @Benchmark 78 public void add(Blackhole bh) { 79 long[] as = fa.apply(size); 80 long[] bs = fb.apply(size); 81 long[] rs = fr.apply(size); 82 83 for (int ic = 0; ic < INVOC_COUNT; ic++) { 84 for (int i = 0; i < as.length; i++) { 85 long a = as[i]; 86 long b = bs[i]; 87 rs[i] = (long)(a + b); 88 } 89 } 90 91 bh.consume(rs); 92 } 93 94 @Benchmark 95 public void addMasked(Blackhole bh) { 96 long[] as = fa.apply(size); 97 long[] bs = fb.apply(size); 98 long[] rs = fr.apply(size); 99 boolean[] ms = fm.apply(size); 100 101 for (int ic = 0; ic < INVOC_COUNT; ic++) { 102 for (int i = 0; i < as.length; i++) { 103 long a = as[i]; 104 long b = bs[i]; 105 if (ms[i % ms.length]) { 106 rs[i] = (long)(a + b); 107 } else { 108 rs[i] = a; 109 } 110 } 111 } 112 bh.consume(rs); 113 } 114 115 @Benchmark 116 public void sub(Blackhole bh) { 117 long[] as = fa.apply(size); 118 long[] bs = fb.apply(size); 119 long[] rs = fr.apply(size); 120 121 for (int ic = 0; ic < INVOC_COUNT; ic++) { 122 for (int i = 0; i < as.length; i++) { 123 long a = as[i]; 124 long b = bs[i]; 125 rs[i] = (long)(a - b); 126 } 127 } 128 129 bh.consume(rs); 130 } 131 132 @Benchmark 133 public void subMasked(Blackhole bh) { 134 long[] as = fa.apply(size); 135 long[] bs = fb.apply(size); 136 long[] rs = fr.apply(size); 137 boolean[] ms = fm.apply(size); 138 139 for (int ic = 0; ic < INVOC_COUNT; ic++) { 140 for (int i = 0; i < as.length; i++) { 141 long a = as[i]; 142 long b = bs[i]; 143 if (ms[i % ms.length]) { 144 rs[i] = (long)(a - b); 145 } else { 146 rs[i] = a; 147 } 148 } 149 } 150 bh.consume(rs); 151 } 152 153 154 155 @Benchmark 156 public void mul(Blackhole bh) { 157 long[] as = fa.apply(size); 158 long[] bs = fb.apply(size); 159 long[] rs = fr.apply(size); 160 161 for (int ic = 0; ic < INVOC_COUNT; ic++) { 162 for (int i = 0; i < as.length; i++) { 163 long a = as[i]; 164 long b = bs[i]; 165 rs[i] = (long)(a * b); 166 } 167 } 168 169 bh.consume(rs); 170 } 171 172 @Benchmark 173 public void mulMasked(Blackhole bh) { 174 long[] as = fa.apply(size); 175 long[] bs = fb.apply(size); 176 long[] rs = fr.apply(size); 177 boolean[] ms = fm.apply(size); 178 179 for (int ic = 0; ic < INVOC_COUNT; ic++) { 180 for (int i = 0; i < as.length; i++) { 181 long a = as[i]; 182 long b = bs[i]; 183 if (ms[i % ms.length]) { 184 rs[i] = (long)(a * b); 185 } else { 186 rs[i] = a; 187 } 188 } 189 } 190 bh.consume(rs); 191 } 192 193 194 @Benchmark 195 public void and(Blackhole bh) { 196 long[] as = fa.apply(size); 197 long[] bs = fb.apply(size); 198 long[] rs = fr.apply(size); 199 200 for (int ic = 0; ic < INVOC_COUNT; ic++) { 201 for (int i = 0; i < as.length; i++) { 202 long a = as[i]; 203 long b = bs[i]; 204 rs[i] = (long)(a & b); 205 } 206 } 207 208 bh.consume(rs); 209 } 210 211 212 213 @Benchmark 214 public void andMasked(Blackhole bh) { 215 long[] as = fa.apply(size); 216 long[] bs = fb.apply(size); 217 long[] rs = fr.apply(size); 218 boolean[] ms = fm.apply(size); 219 220 for (int ic = 0; ic < INVOC_COUNT; ic++) { 221 for (int i = 0; i < as.length; i++) { 222 long a = as[i]; 223 long b = bs[i]; 224 if (ms[i % ms.length]) { 225 rs[i] = (long)(a & b); 226 } else { 227 rs[i] = a; 228 } 229 } 230 } 231 bh.consume(rs); 232 } 233 234 235 236 @Benchmark 237 public void or(Blackhole bh) { 238 long[] as = fa.apply(size); 239 long[] bs = fb.apply(size); 240 long[] rs = fr.apply(size); 241 242 for (int ic = 0; ic < INVOC_COUNT; ic++) { 243 for (int i = 0; i < as.length; i++) { 244 long a = as[i]; 245 long b = bs[i]; 246 rs[i] = (long)(a | b); 247 } 248 } 249 250 bh.consume(rs); 251 } 252 253 254 255 @Benchmark 256 public void orMasked(Blackhole bh) { 257 long[] as = fa.apply(size); 258 long[] bs = fb.apply(size); 259 long[] rs = fr.apply(size); 260 boolean[] ms = fm.apply(size); 261 262 for (int ic = 0; ic < INVOC_COUNT; ic++) { 263 for (int i = 0; i < as.length; i++) { 264 long a = as[i]; 265 long b = bs[i]; 266 if (ms[i % ms.length]) { 267 rs[i] = (long)(a | b); 268 } else { 269 rs[i] = a; 270 } 271 } 272 } 273 bh.consume(rs); 274 } 275 276 277 278 @Benchmark 279 public void xor(Blackhole bh) { 280 long[] as = fa.apply(size); 281 long[] bs = fb.apply(size); 282 long[] rs = fr.apply(size); 283 284 for (int ic = 0; ic < INVOC_COUNT; ic++) { 285 for (int i = 0; i < as.length; i++) { 286 long a = as[i]; 287 long b = bs[i]; 288 rs[i] = (long)(a ^ b); 289 } 290 } 291 292 bh.consume(rs); 293 } 294 295 296 297 @Benchmark 298 public void xorMasked(Blackhole bh) { 299 long[] as = fa.apply(size); 300 long[] bs = fb.apply(size); 301 long[] rs = fr.apply(size); 302 boolean[] ms = fm.apply(size); 303 304 for (int ic = 0; ic < INVOC_COUNT; ic++) { 305 for (int i = 0; i < as.length; i++) { 306 long a = as[i]; 307 long b = bs[i]; 308 if (ms[i % ms.length]) { 309 rs[i] = (long)(a ^ b); 310 } else { 311 rs[i] = a; 312 } 313 } 314 } 315 bh.consume(rs); 316 } 317 318 319 320 @Benchmark 321 public void shiftR(Blackhole bh) { 322 long[] as = fa.apply(size); 323 long[] bs = fb.apply(size); 324 long[] rs = fr.apply(size); 325 326 for (int ic = 0; ic < INVOC_COUNT; ic++) { 327 for (int i = 0; i < as.length; i++) { 328 long a = as[i]; 329 long b = bs[i]; 330 rs[i] = (long)((a >>> b)); 331 } 332 } 333 334 bh.consume(rs); 335 } 336 337 338 339 @Benchmark 340 public void shiftRMasked(Blackhole bh) { 341 long[] as = fa.apply(size); 342 long[] bs = fb.apply(size); 343 long[] rs = fr.apply(size); 344 boolean[] ms = fm.apply(size); 345 346 for (int ic = 0; ic < INVOC_COUNT; ic++) { 347 for (int i = 0; i < as.length; i++) { 348 long a = as[i]; 349 long b = bs[i]; 350 if (ms[i % ms.length]) { 351 rs[i] = (long)((a >>> b)); 352 } else { 353 rs[i] = a; 354 } 355 } 356 } 357 bh.consume(rs); 358 } 359 360 361 362 @Benchmark 363 public void shiftL(Blackhole bh) { 364 long[] as = fa.apply(size); 365 long[] bs = fb.apply(size); 366 long[] rs = fr.apply(size); 367 368 for (int ic = 0; ic < INVOC_COUNT; ic++) { 369 for (int i = 0; i < as.length; i++) { 370 long a = as[i]; 371 long b = bs[i]; 372 rs[i] = (long)((a << b)); 373 } 374 } 375 376 bh.consume(rs); 377 } 378 379 380 381 @Benchmark 382 public void shiftLMasked(Blackhole bh) { 383 long[] as = fa.apply(size); 384 long[] bs = fb.apply(size); 385 long[] rs = fr.apply(size); 386 boolean[] ms = fm.apply(size); 387 388 for (int ic = 0; ic < INVOC_COUNT; ic++) { 389 for (int i = 0; i < as.length; i++) { 390 long a = as[i]; 391 long b = bs[i]; 392 if (ms[i % ms.length]) { 393 rs[i] = (long)((a << b)); 394 } else { 395 rs[i] = a; 396 } 397 } 398 } 399 bh.consume(rs); 400 } 401 402 403 404 @Benchmark 405 public void aShiftR(Blackhole bh) { 406 long[] as = fa.apply(size); 407 long[] bs = fb.apply(size); 408 long[] rs = fr.apply(size); 409 410 for (int ic = 0; ic < INVOC_COUNT; ic++) { 411 for (int i = 0; i < as.length; i++) { 412 long a = as[i]; 413 long b = bs[i]; 414 rs[i] = (long)((a >> b)); 415 } 416 } 417 418 bh.consume(rs); 419 } 420 421 422 423 @Benchmark 424 public void aShiftRMasked(Blackhole bh) { 425 long[] as = fa.apply(size); 426 long[] bs = fb.apply(size); 427 long[] rs = fr.apply(size); 428 boolean[] ms = fm.apply(size); 429 430 for (int ic = 0; ic < INVOC_COUNT; ic++) { 431 for (int i = 0; i < as.length; i++) { 432 long a = as[i]; 433 long b = bs[i]; 434 if (ms[i % ms.length]) { 435 rs[i] = (long)((a >> b)); 436 } else { 437 rs[i] = a; 438 } 439 } 440 } 441 bh.consume(rs); 442 } 443 444 445 446 @Benchmark 447 public void aShiftRShift(Blackhole bh) { 448 long[] as = fa.apply(size); 449 long[] bs = fb.apply(size); 450 long[] rs = fr.apply(size); 451 452 for (int ic = 0; ic < INVOC_COUNT; ic++) { 453 for (int i = 0; i < as.length; i++) { 454 long a = as[i]; 455 long b = bs[i]; 456 rs[i] = (long)((a >> b)); 457 } 458 } 459 460 bh.consume(rs); 461 } 462 463 464 465 @Benchmark 466 public void aShiftRMaskedShift(Blackhole bh) { 467 long[] as = fa.apply(size); 468 long[] bs = fb.apply(size); 469 long[] rs = fr.apply(size); 470 boolean[] ms = fm.apply(size); 471 472 for (int ic = 0; ic < INVOC_COUNT; ic++) { 473 for (int i = 0; i < as.length; i++) { 474 long a = as[i]; 475 long b = bs[i]; 476 boolean m = ms[i % ms.length]; 477 rs[i] = (m ? (long)((a >> b)) : a); 478 } 479 } 480 481 bh.consume(rs); 482 } 483 484 485 486 @Benchmark 487 public void shiftRShift(Blackhole bh) { 488 long[] as = fa.apply(size); 489 long[] bs = fb.apply(size); 490 long[] rs = fr.apply(size); 491 492 for (int ic = 0; ic < INVOC_COUNT; ic++) { 493 for (int i = 0; i < as.length; i++) { 494 long a = as[i]; 495 long b = bs[i]; 496 rs[i] = (long)((a >>> b)); 497 } 498 } 499 500 bh.consume(rs); 501 } 502 503 504 505 @Benchmark 506 public void shiftRMaskedShift(Blackhole bh) { 507 long[] as = fa.apply(size); 508 long[] bs = fb.apply(size); 509 long[] rs = fr.apply(size); 510 boolean[] ms = fm.apply(size); 511 512 for (int ic = 0; ic < INVOC_COUNT; ic++) { 513 for (int i = 0; i < as.length; i++) { 514 long a = as[i]; 515 long b = bs[i]; 516 boolean m = ms[i % ms.length]; 517 rs[i] = (m ? (long)((a >>> b)) : a); 518 } 519 } 520 521 bh.consume(rs); 522 } 523 524 525 526 @Benchmark 527 public void shiftLShift(Blackhole bh) { 528 long[] as = fa.apply(size); 529 long[] bs = fb.apply(size); 530 long[] rs = fr.apply(size); 531 532 for (int ic = 0; ic < INVOC_COUNT; ic++) { 533 for (int i = 0; i < as.length; i++) { 534 long a = as[i]; 535 long b = bs[i]; 536 rs[i] = (long)((a << b)); 537 } 538 } 539 540 bh.consume(rs); 541 } 542 543 544 545 @Benchmark 546 public void shiftLMaskedShift(Blackhole bh) { 547 long[] as = fa.apply(size); 548 long[] bs = fb.apply(size); 549 long[] rs = fr.apply(size); 550 boolean[] ms = fm.apply(size); 551 552 for (int ic = 0; ic < INVOC_COUNT; ic++) { 553 for (int i = 0; i < as.length; i++) { 554 long a = as[i]; 555 long b = bs[i]; 556 boolean m = ms[i % ms.length]; 557 rs[i] = (m ? (long)((a << b)) : a); 558 } 559 } 560 561 bh.consume(rs); 562 } 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 @Benchmark 578 public void max(Blackhole bh) { 579 long[] as = fa.apply(size); 580 long[] bs = fb.apply(size); 581 long[] rs = fr.apply(size); 582 583 for (int ic = 0; ic < INVOC_COUNT; ic++) { 584 for (int i = 0; i < as.length; i++) { 585 long a = as[i]; 586 long b = bs[i]; 587 rs[i] = (long)(Math.max(a, b)); 588 } 589 } 590 591 bh.consume(rs); 592 } 593 594 @Benchmark 595 public void min(Blackhole bh) { 596 long[] as = fa.apply(size); 597 long[] bs = fb.apply(size); 598 long[] rs = fr.apply(size); 599 600 for (int ic = 0; ic < INVOC_COUNT; ic++) { 601 for (int i = 0; i < as.length; i++) { 602 long a = as[i]; 603 long b = bs[i]; 604 rs[i] = (long)(Math.min(a, b)); 605 } 606 } 607 608 bh.consume(rs); 609 } 610 611 612 @Benchmark 613 public void andAll(Blackhole bh) { 614 long[] as = fa.apply(size); 615 long r = -1; 616 for (int ic = 0; ic < INVOC_COUNT; ic++) { 617 r = -1; 618 for (int i = 0; i < as.length; i++) { 619 r &= as[i]; 620 } 621 } 622 bh.consume(r); 623 } 624 625 626 627 @Benchmark 628 public void orAll(Blackhole bh) { 629 long[] as = fa.apply(size); 630 long r = 0; 631 for (int ic = 0; ic < INVOC_COUNT; ic++) { 632 r = 0; 633 for (int i = 0; i < as.length; i++) { 634 r |= as[i]; 635 } 636 } 637 bh.consume(r); 638 } 639 640 641 642 @Benchmark 643 public void xorAll(Blackhole bh) { 644 long[] as = fa.apply(size); 645 long r = 0; 646 for (int ic = 0; ic < INVOC_COUNT; ic++) { 647 r = 0; 648 for (int i = 0; i < as.length; i++) { 649 r ^= as[i]; 650 } 651 } 652 bh.consume(r); 653 } 654 655 656 @Benchmark 657 public void addAll(Blackhole bh) { 658 long[] as = fa.apply(size); 659 long r = 0; 660 for (int ic = 0; ic < INVOC_COUNT; ic++) { 661 r = 0; 662 for (int i = 0; i < as.length; i++) { 663 r += as[i]; 664 } 665 } 666 bh.consume(r); 667 } 668 669 @Benchmark 670 public void mulAll(Blackhole bh) { 671 long[] as = fa.apply(size); 672 long r = 1; 673 for (int ic = 0; ic < INVOC_COUNT; ic++) { 674 r = 1; 675 for (int i = 0; i < as.length; i++) { 676 r *= as[i]; 677 } 678 } 679 bh.consume(r); 680 } 681 682 @Benchmark 683 public void minAll(Blackhole bh) { 684 long[] as = fa.apply(size); 685 long r = Long.MAX_VALUE; 686 for (int ic = 0; ic < INVOC_COUNT; ic++) { 687 r = Long.MAX_VALUE; 688 for (int i = 0; i < as.length; i++) { 689 r = (long)Math.min(r, as[i]); 690 } 691 } 692 bh.consume(r); 693 } 694 695 @Benchmark 696 public void maxAll(Blackhole bh) { 697 long[] as = fa.apply(size); 698 long r = Long.MIN_VALUE; 699 for (int ic = 0; ic < INVOC_COUNT; ic++) { 700 r = Long.MIN_VALUE; 701 for (int i = 0; i < as.length; i++) { 702 r = (long)Math.max(r, as[i]); 703 } 704 } 705 bh.consume(r); 706 } 707 708 709 @Benchmark 710 public void anyTrue(Blackhole bh) { 711 boolean[] ms = fm.apply(size); 712 boolean r = false; 713 for (int ic = 0; ic < INVOC_COUNT; ic++) { 714 r = false; 715 for (int i = 0; i < ms.length; i++) { 716 r |= ms[i]; 717 } 718 } 719 bh.consume(r); 720 } 721 722 723 724 @Benchmark 725 public void allTrue(Blackhole bh) { 726 boolean[] ms = fm.apply(size); 727 boolean r = true; 728 for (int ic = 0; ic < INVOC_COUNT; ic++) { 729 r = true; 730 for (int i = 0; i < ms.length; i++) { 731 r &= ms[i]; 732 } 733 } 734 bh.consume(r); 735 } 736 737 738 @Benchmark 739 public void lessThan(Blackhole bh) { 740 long[] as = fa.apply(size); 741 long[] bs = fb.apply(size); 742 743 boolean r = false; 744 for (int ic = 0; ic < INVOC_COUNT; ic++) { 745 r = false; 746 for (int i = 0; i < as.length; i++) { 747 boolean m = (as[i] < bs[i]); 748 r |= m; // accumulate so JIT can't eliminate the computation 749 } 750 } 751 752 bh.consume(r); 753 } 754 755 @Benchmark 756 public void greaterThan(Blackhole bh) { 757 long[] as = fa.apply(size); 758 long[] bs = fb.apply(size); 759 760 boolean r = false; 761 for (int ic = 0; ic < INVOC_COUNT; ic++) { 762 r = false; 763 for (int i = 0; i < as.length; i++) { 764 boolean m = (as[i] > bs[i]); 765 r |= m; // accumulate so JIT can't eliminate the computation 766 } 767 } 768 769 bh.consume(r); 770 } 771 772 @Benchmark 773 public void equal(Blackhole bh) { 774 long[] as = fa.apply(size); 775 long[] bs = fb.apply(size); 776 777 boolean r = false; 778 for (int ic = 0; ic < INVOC_COUNT; ic++) { 779 r = false; 780 for (int i = 0; i < as.length; i++) { 781 boolean m = (as[i] == bs[i]); 782 r |= m; // accumulate so JIT can't eliminate the computation 783 } 784 } 785 786 bh.consume(r); 787 } 788 789 @Benchmark 790 public void notEqual(Blackhole bh) { 791 long[] as = fa.apply(size); 792 long[] bs = fb.apply(size); 793 794 boolean r = false; 795 for (int ic = 0; ic < INVOC_COUNT; ic++) { 796 r = false; 797 for (int i = 0; i < as.length; i++) { 798 boolean m = (as[i] != bs[i]); 799 r |= m; // accumulate so JIT can't eliminate the computation 800 } 801 } 802 803 bh.consume(r); 804 } 805 806 @Benchmark 807 public void lessThanEq(Blackhole bh) { 808 long[] as = fa.apply(size); 809 long[] bs = fb.apply(size); 810 811 boolean r = false; 812 for (int ic = 0; ic < INVOC_COUNT; ic++) { 813 r = false; 814 for (int i = 0; i < as.length; i++) { 815 boolean m = (as[i] <= bs[i]); 816 r |= m; // accumulate so JIT can't eliminate the computation 817 } 818 } 819 820 bh.consume(r); 821 } 822 823 @Benchmark 824 public void greaterThanEq(Blackhole bh) { 825 long[] as = fa.apply(size); 826 long[] bs = fb.apply(size); 827 828 boolean r = false; 829 for (int ic = 0; ic < INVOC_COUNT; ic++) { 830 r = false; 831 for (int i = 0; i < as.length; i++) { 832 boolean m = (as[i] >= bs[i]); 833 r |= m; // accumulate so JIT can't eliminate the computation 834 } 835 } 836 837 bh.consume(r); 838 } 839 840 @Benchmark 841 public void blend(Blackhole bh) { 842 long[] as = fa.apply(size); 843 long[] bs = fb.apply(size); 844 long[] rs = fr.apply(size); 845 boolean[] ms = fm.apply(size); 846 847 for (int ic = 0; ic < INVOC_COUNT; ic++) { 848 for (int i = 0; i < as.length; i++) { 849 long a = as[i]; 850 long b = bs[i]; 851 boolean m = ms[i % ms.length]; 852 rs[i] = (m ? b : a); 853 } 854 } 855 856 bh.consume(rs); 857 } 858 void rearrangeShared(int window, Blackhole bh) { 859 long[] as = fa.apply(size); 860 int[] order = fs.apply(size); 861 long[] rs = fr.apply(size); 862 863 for (int ic = 0; ic < INVOC_COUNT; ic++) { 864 for (int i = 0; i < as.length; i += window) { 865 for (int j = 0; j < window; j++) { 866 long a = as[i+j]; 867 int pos = order[j]; 868 rs[i + pos] = a; 869 } 870 } 871 } 872 873 bh.consume(rs); 874 } 875 876 @Benchmark 877 public void rearrange064(Blackhole bh) { 878 int window = 64 / Long.SIZE; 879 rearrangeShared(window, bh); 880 } 881 882 @Benchmark 883 public void rearrange128(Blackhole bh) { 884 int window = 128 / Long.SIZE; 885 rearrangeShared(window, bh); 886 } 887 888 @Benchmark 889 public void rearrange256(Blackhole bh) { 890 int window = 256 / Long.SIZE; 891 rearrangeShared(window, bh); 892 } 893 894 @Benchmark 895 public void rearrange512(Blackhole bh) { 896 int window = 512 / Long.SIZE; 897 rearrangeShared(window, bh); 898 } 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 @Benchmark 921 public void neg(Blackhole bh) { 922 long[] as = fa.apply(size); 923 long[] rs = fr.apply(size); 924 925 for (int ic = 0; ic < INVOC_COUNT; ic++) { 926 for (int i = 0; i < as.length; i++) { 927 long a = as[i]; 928 rs[i] = (long)(-((long)a)); 929 } 930 } 931 932 bh.consume(rs); 933 } 934 935 @Benchmark 936 public void negMasked(Blackhole bh) { 937 long[] as = fa.apply(size); 938 long[] rs = fr.apply(size); 939 boolean[] ms = fm.apply(size); 940 941 for (int ic = 0; ic < INVOC_COUNT; ic++) { 942 for (int i = 0; i < as.length; i++) { 943 long a = as[i]; 944 boolean m = ms[i % ms.length]; 945 rs[i] = (m ? (long)(-((long)a)) : a); 946 } 947 } 948 949 bh.consume(rs); 950 } 951 952 @Benchmark 953 public void abs(Blackhole bh) { 954 long[] as = fa.apply(size); 955 long[] rs = fr.apply(size); 956 957 for (int ic = 0; ic < INVOC_COUNT; ic++) { 958 for (int i = 0; i < as.length; i++) { 959 long a = as[i]; 960 rs[i] = (long)(Math.abs((long)a)); 961 } 962 } 963 964 bh.consume(rs); 965 } 966 967 @Benchmark 968 public void absMasked(Blackhole bh) { 969 long[] as = fa.apply(size); 970 long[] rs = fr.apply(size); 971 boolean[] ms = fm.apply(size); 972 973 for (int ic = 0; ic < INVOC_COUNT; ic++) { 974 for (int i = 0; i < as.length; i++) { 975 long a = as[i]; 976 boolean m = ms[i % ms.length]; 977 rs[i] = (m ? (long)(Math.abs((long)a)) : a); 978 } 979 } 980 981 bh.consume(rs); 982 } 983 984 985 @Benchmark 986 public void not(Blackhole bh) { 987 long[] as = fa.apply(size); 988 long[] rs = fr.apply(size); 989 990 for (int ic = 0; ic < INVOC_COUNT; ic++) { 991 for (int i = 0; i < as.length; i++) { 992 long a = as[i]; 993 rs[i] = (long)(~((long)a)); 994 } 995 } 996 997 bh.consume(rs); 998 } 999 1000 1001 1002 @Benchmark 1003 public void notMasked(Blackhole bh) { 1004 long[] as = fa.apply(size); 1005 long[] rs = fr.apply(size); 1006 boolean[] ms = fm.apply(size); 1007 1008 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1009 for (int i = 0; i < as.length; i++) { 1010 long a = as[i]; 1011 boolean m = ms[i % ms.length]; 1012 rs[i] = (m ? (long)(~((long)a)) : a); 1013 } 1014 } 1015 1016 bh.consume(rs); 1017 } 1018 1019 1020 1021 1022 @Benchmark 1023 public void gatherBase0(Blackhole bh) { 1024 long[] as = fa.apply(size); 1025 int[] is = fs.apply(size); 1026 long[] rs = fr.apply(size); 1027 1028 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1029 for (int i = 0; i < as.length; i++) { 1030 int ix = 0 + is[i]; 1031 rs[i] = as[ix]; 1032 } 1033 } 1034 1035 bh.consume(rs); 1036 } 1037 1038 1039 void gather(int window, Blackhole bh) { 1040 long[] as = fa.apply(size); 1041 int[] is = fs.apply(size); 1042 long[] rs = fr.apply(size); 1043 1044 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1045 for (int i = 0; i < as.length; i += window) { 1046 for (int j = 0; j < window; j++) { 1047 int ix = i + is[i + j]; 1048 rs[i + j] = as[ix]; 1049 } 1050 } 1051 } 1052 1053 bh.consume(rs); 1054 } 1055 1056 @Benchmark 1057 public void gather064(Blackhole bh) { 1058 int window = 64 / Long.SIZE; 1059 gather(window, bh); 1060 } 1061 1062 @Benchmark 1063 public void gather128(Blackhole bh) { 1064 int window = 128 / Long.SIZE; 1065 gather(window, bh); 1066 } 1067 1068 @Benchmark 1069 public void gather256(Blackhole bh) { 1070 int window = 256 / Long.SIZE; 1071 gather(window, bh); 1072 } 1073 1074 @Benchmark 1075 public void gather512(Blackhole bh) { 1076 int window = 512 / Long.SIZE; 1077 gather(window, bh); 1078 } 1079 1080 1081 1082 @Benchmark 1083 public void scatterBase0(Blackhole bh) { 1084 long[] as = fa.apply(size); 1085 int[] is = fs.apply(size); 1086 long[] rs = fr.apply(size); 1087 1088 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1089 for (int i = 0; i < as.length; i++) { 1090 int ix = 0 + is[i]; 1091 rs[ix] = as[i]; 1092 } 1093 } 1094 1095 bh.consume(rs); 1096 } 1097 1098 void scatter(int window, Blackhole bh) { 1099 long[] as = fa.apply(size); 1100 int[] is = fs.apply(size); 1101 long[] rs = fr.apply(size); 1102 1103 for (int ic = 0; ic < INVOC_COUNT; ic++) { 1104 for (int i = 0; i < as.length; i += window) { 1105 for (int j = 0; j < window; j++) { 1106 int ix = i + is[i + j]; 1107 rs[ix] = as[i + j]; 1108 } 1109 } 1110 } 1111 1112 bh.consume(rs); 1113 } 1114 1115 @Benchmark 1116 public void scatter064(Blackhole bh) { 1117 int window = 64 / Long.SIZE; 1118 scatter(window, bh); 1119 } 1120 1121 @Benchmark 1122 public void scatter128(Blackhole bh) { 1123 int window = 128 / Long.SIZE; 1124 scatter(window, bh); 1125 } 1126 1127 @Benchmark 1128 public void scatter256(Blackhole bh) { 1129 int window = 256 / Long.SIZE; 1130 scatter(window, bh); 1131 } 1132 1133 @Benchmark 1134 public void scatter512(Blackhole bh) { 1135 int window = 512 / Long.SIZE; 1136 scatter(window, bh); 1137 } 1138 1139 } 1140