1 /* 2 * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. 3 * Copyright (c) 2021, Alibaba Group Holding Limited. All Rights Reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 package org.openjdk.bench.jdk.incubator.vector.bigdata; 26 27 import java.util.concurrent.TimeUnit; 28 import java.util.random.RandomGenerator; 29 30 import jdk.incubator.vector.IntVector; 31 import jdk.incubator.vector.VectorSpecies; 32 import jdk.incubator.vector.VectorMask; 33 import jdk.incubator.vector.VectorOperators; 34 35 import org.openjdk.jmh.annotations.*; 36 37 @BenchmarkMode(Mode.Throughput) 38 @OutputTimeUnit(TimeUnit.MILLISECONDS) 39 @State(Scope.Benchmark) 40 @Warmup(iterations = 10, time = 1) 41 @Measurement(iterations = 10, time = 1) 42 @Fork(value = 1, jvmArgsPrepend = {"--add-modules=jdk.incubator.vector"}) 43 public class SelectiveStore { 44 45 @Param("1024") 46 int ARRAY_LENGTH; 47 48 private static final VectorSpecies<Integer> INT_64_SPECIES = 49 IntVector.SPECIES_64; 50 private static final VectorSpecies<Integer> INT_128_SPECIES = 51 IntVector.SPECIES_128; 52 private static final VectorSpecies<Integer> INT_256_SPECIES = 53 IntVector.SPECIES_256; 54 private static final VectorSpecies<Integer> INT_512_SPECIES = 55 IntVector.SPECIES_512; 56 private static final VectorSpecies<Integer> INT_PREFERRED_SPECIES = 57 IntVector.SPECIES_PREFERRED; 58 59 private int conflict_cnt; 60 private int[] index; 61 private int[] input1; 62 private int[] input2; 63 private int[] conflict_array; 64 65 @Setup 66 public void init() { 67 index = new int[ARRAY_LENGTH]; 68 input1 = new int[ARRAY_LENGTH]; 69 input2 = new int[ARRAY_LENGTH]; 70 conflict_array = new int[ARRAY_LENGTH]; 71 72 RandomGenerator rng = RandomGenerator.getDefault(); 73 int conflict_id_each_5_elements = rng.nextInt(5); 74 75 for (int i = 0; i < ARRAY_LENGTH; i++) { 76 index[i] = rng.nextInt(ARRAY_LENGTH); 77 input1[i] = rng.nextInt(); 78 // Generate 20% conflict data 79 int remainder = i % 5; 80 if (remainder == conflict_id_each_5_elements) { 81 input2[i] = rng.nextInt(); 82 } else { 83 input2[i] = input1[i]; 84 } 85 conflict_array[i] = 0; 86 } 87 } 88 89 private void selectiveStore(VectorSpecies<Integer> species) { 90 conflict_cnt = 0; 91 for (int i = 0; i < ARRAY_LENGTH; i += species.length()) { 92 IntVector av = IntVector.fromArray(species, input1, i); 93 IntVector bv = IntVector.fromArray(species, input2, i); 94 IntVector cv = IntVector.fromArray(species, index, i); 95 VectorMask<Integer> mask = av.compare(VectorOperators.NE, bv); 96 IntVector dv = cv.compress(mask); 97 dv.intoArray(conflict_array, conflict_cnt, mask.compress()); 98 conflict_cnt += mask.trueCount(); 99 } 100 } 101 102 @Benchmark 103 public void selectiveStore_scalar() { 104 conflict_cnt = 0; 105 for (int i = 0; i < ARRAY_LENGTH; i++) { 106 if (input1[i] != input2[i]) { 107 conflict_array[conflict_cnt] = index[i]; 108 conflict_cnt++; 109 } 110 } 111 } 112 113 @Benchmark 114 public void selectiveStore_vector_64() { 115 selectiveStore(INT_64_SPECIES); 116 } 117 118 @Benchmark 119 public void selectiveStore_vector_128() { 120 selectiveStore(INT_128_SPECIES); 121 } 122 123 @Benchmark 124 public void selectiveStore_vector_256() { 125 selectiveStore(INT_256_SPECIES); 126 } 127 128 @Benchmark 129 public void selectiveStore_vector_512() { 130 selectiveStore(INT_512_SPECIES); 131 } 132 133 @Benchmark 134 public void selectiveStore_vector_preferred() { 135 selectiveStore(INT_PREFERRED_SPECIES); 136 } 137 } 138