Skip to content

Commit 6abb29c

Browse files
author
Jatin Bhateja
committed
8376794: Enable copy and mismatch Partial Inlining for AMD AVX512 targets
Reviewed-by: sviswanathan, thartmann
1 parent 5868d35 commit 6abb29c

File tree

2 files changed

+70
-28
lines changed

2 files changed

+70
-28
lines changed

src/hotspot/cpu/x86/vm_version_x86.cpp

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,41 +1659,40 @@ void VM_Version::get_processor_features() {
16591659
if (FLAG_IS_DEFAULT(AllocatePrefetchInstr) && supports_3dnow_prefetch()) {
16601660
FLAG_SET_DEFAULT(AllocatePrefetchInstr, 3);
16611661
}
1662+
}
1663+
16621664
#ifdef COMPILER2
1663-
if (UseAVX > 2) {
1664-
if (FLAG_IS_DEFAULT(ArrayOperationPartialInlineSize) ||
1665-
(!FLAG_IS_DEFAULT(ArrayOperationPartialInlineSize) &&
1666-
ArrayOperationPartialInlineSize != 0 &&
1667-
ArrayOperationPartialInlineSize != 16 &&
1668-
ArrayOperationPartialInlineSize != 32 &&
1669-
ArrayOperationPartialInlineSize != 64)) {
1670-
int inline_size = 0;
1671-
if (MaxVectorSize >= 64 && AVX3Threshold == 0) {
1672-
inline_size = 64;
1673-
} else if (MaxVectorSize >= 32) {
1674-
inline_size = 32;
1675-
} else if (MaxVectorSize >= 16) {
1676-
inline_size = 16;
1677-
}
1678-
if(!FLAG_IS_DEFAULT(ArrayOperationPartialInlineSize)) {
1679-
warning("Setting ArrayOperationPartialInlineSize as %d", inline_size);
1680-
}
1681-
ArrayOperationPartialInlineSize = inline_size;
1665+
if (UseAVX > 2) {
1666+
if (FLAG_IS_DEFAULT(ArrayOperationPartialInlineSize) ||
1667+
(!FLAG_IS_DEFAULT(ArrayOperationPartialInlineSize) &&
1668+
ArrayOperationPartialInlineSize != 0 &&
1669+
ArrayOperationPartialInlineSize != 16 &&
1670+
ArrayOperationPartialInlineSize != 32 &&
1671+
ArrayOperationPartialInlineSize != 64)) {
1672+
int inline_size = 0;
1673+
if (MaxVectorSize >= 64 && AVX3Threshold == 0) {
1674+
inline_size = 64;
1675+
} else if (MaxVectorSize >= 32) {
1676+
inline_size = 32;
1677+
} else if (MaxVectorSize >= 16) {
1678+
inline_size = 16;
1679+
}
1680+
if(!FLAG_IS_DEFAULT(ArrayOperationPartialInlineSize)) {
1681+
warning("Setting ArrayOperationPartialInlineSize as %d", inline_size);
16821682
}
1683+
ArrayOperationPartialInlineSize = inline_size;
1684+
}
16831685

1684-
if (ArrayOperationPartialInlineSize > MaxVectorSize) {
1685-
ArrayOperationPartialInlineSize = MaxVectorSize >= 16 ? MaxVectorSize : 0;
1686-
if (ArrayOperationPartialInlineSize) {
1687-
warning("Setting ArrayOperationPartialInlineSize as MaxVectorSize=%zd", MaxVectorSize);
1688-
} else {
1689-
warning("Setting ArrayOperationPartialInlineSize as %zd", ArrayOperationPartialInlineSize);
1690-
}
1686+
if (ArrayOperationPartialInlineSize > MaxVectorSize) {
1687+
ArrayOperationPartialInlineSize = MaxVectorSize >= 16 ? MaxVectorSize : 0;
1688+
if (ArrayOperationPartialInlineSize) {
1689+
warning("Setting ArrayOperationPartialInlineSize as MaxVectorSize=%zd", MaxVectorSize);
1690+
} else {
1691+
warning("Setting ArrayOperationPartialInlineSize as %zd", ArrayOperationPartialInlineSize);
16911692
}
16921693
}
1693-
#endif
16941694
}
16951695

1696-
#ifdef COMPILER2
16971696
if (FLAG_IS_DEFAULT(OptimizeFill)) {
16981697
if (MaxVectorSize < 32 || (!EnableX86ECoreOpts && !VM_Version::supports_avx512vlbw())) {
16991698
OptimizeFill = false;

test/micro/org/openjdk/bench/jdk/incubator/vector/ArrayMismatchBenchmark.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727

2828
import jdk.incubator.vector.ByteVector;
29+
import jdk.incubator.vector.ShortVector;
2930
import jdk.incubator.vector.DoubleVector;
3031
import jdk.incubator.vector.IntVector;
3132
import jdk.incubator.vector.LongVector;
@@ -59,6 +60,9 @@ public class ArrayMismatchBenchmark {
5960
byte[] byteData1;
6061
byte[] byteData2;
6162

63+
short[] shortData1;
64+
short[] shortData2;
65+
6266
int[] intData1;
6367
int[] intData2;
6468

@@ -69,6 +73,7 @@ public class ArrayMismatchBenchmark {
6973
double[] doubleData2;
7074

7175
static final VectorSpecies<Byte> BYTE_SPECIES_PREFERRED = ByteVector.SPECIES_PREFERRED;
76+
static final VectorSpecies<Short> SHORT_SPECIES_PREFERRED = ShortVector.SPECIES_PREFERRED;
7277
static final VectorSpecies<Integer> INT_SPECIES_PREFERRED = IntVector.SPECIES_PREFERRED;
7378
static final VectorSpecies<Double> FLOAT_SPECIES_PREFERRED = DoubleVector.SPECIES_PREFERRED;
7479
static final VectorSpecies<Long> LONG_SPECIES_PREFERRED = LongVector.SPECIES_PREFERRED;
@@ -89,6 +94,16 @@ public void setup(BenchmarkParams params) {
8994

9095
System.arraycopy(commonBytes, 0, byteData1, 0, common);
9196
System.arraycopy(commonBytes, 0, byteData2, 0, common);
97+
} else if (params.getBenchmark().endsWith("Short")) {
98+
shortData1 = new short[size];
99+
shortData2 = new short[size];
100+
Arrays.fill(shortData1, (short)random.nextInt());
101+
Arrays.fill(shortData2, (short)random.nextInt());
102+
103+
short[] commonShorts = new short[common];
104+
Arrays.fill(commonShorts, (short)random.nextInt());
105+
System.arraycopy(commonShorts, 0, shortData1, 0, common);
106+
System.arraycopy(commonShorts, 0, shortData2, 0, common);
92107
} else if (params.getBenchmark().endsWith("Int")) {
93108
intData1 = random.ints(size).toArray();
94109
intData2 = random.ints(size).toArray();
@@ -141,6 +156,34 @@ public int mismatchVectorByte() {
141156
return mismatch;
142157
}
143158

159+
@Benchmark
160+
public int mismatchIntrinsicShort() {
161+
return Arrays.mismatch(shortData1, shortData2);
162+
}
163+
164+
@Benchmark
165+
public int mismatchVectorShort() {
166+
int length = Math.min(shortData1.length, shortData2.length);
167+
int index = 0;
168+
for (; index < SHORT_SPECIES_PREFERRED.loopBound(length); index += SHORT_SPECIES_PREFERRED.length()) {
169+
ShortVector vector1 = ShortVector.fromArray(SHORT_SPECIES_PREFERRED, shortData1, index);
170+
ShortVector vector2 = ShortVector.fromArray(SHORT_SPECIES_PREFERRED, shortData2, index);
171+
VectorMask<Short> mask = vector1.compare(VectorOperators.NE, vector2);
172+
if (mask.anyTrue()) {
173+
return index + mask.firstTrue();
174+
}
175+
}
176+
// process the tail
177+
int mismatch = -1;
178+
for (int i = index; i < length; ++i) {
179+
if (shortData1[i] != shortData2[i]) {
180+
mismatch = i;
181+
break;
182+
}
183+
}
184+
return mismatch;
185+
}
186+
144187
@Benchmark
145188
public int mismatchIntrinsicInt() {
146189
return Arrays.mismatch(intData1, intData2);

0 commit comments

Comments
 (0)