Skip to content

Commit d8a00da

Browse files
author
Amos Shi
committed
8315024: Vector API FP reduction tests should not test for exact equality
Backport-of: e6f23a90d4a53339a3c9c2b76fc5d317940e4472
1 parent 2d89cc2 commit d8a00da

13 files changed

+415
-120
lines changed

test/jdk/jdk/incubator/vector/Double128VectorTests.java

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public class Double128VectorTests extends AbstractVectorTest {
6060
static final int INVOC_COUNT = Integer.getInteger("jdk.incubator.vector.test.loop-iterations", 100);
6161

6262

63+
// for floating point reduction ops that may introduce rounding errors
64+
private static final double RELATIVE_ROUNDING_ERROR = (double)0.000001;
6365

6466
static final int BUFFER_REPS = Integer.getInteger("jdk.incubator.vector.test.buffer-vectors", 25000 / 128);
6567

@@ -119,15 +121,21 @@ interface FReductionAllOp {
119121

120122
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
121123
FReductionOp f, FReductionAllOp fa) {
124+
assertReductionArraysEquals(r, rc, a, f, fa, (double)0.0);
125+
}
126+
127+
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
128+
FReductionOp f, FReductionAllOp fa,
129+
double relativeError) {
122130
int i = 0;
123131
try {
124-
Assert.assertEquals(rc, fa.apply(a));
132+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError));
125133
for (; i < a.length; i += SPECIES.length()) {
126-
Assert.assertEquals(r[i], f.apply(a, i));
134+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError));
127135
}
128136
} catch (AssertionError e) {
129-
Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!");
130-
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
137+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError), "Final result is incorrect!");
138+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError), "at index #" + i);
131139
}
132140
}
133141

@@ -141,15 +149,22 @@ interface FReductionAllMaskedOp {
141149

142150
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
143151
FReductionMaskedOp f, FReductionAllMaskedOp fa) {
152+
assertReductionArraysEqualsMasked(r, rc, a, mask, f, fa, (double)0.0);
153+
}
154+
155+
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
156+
FReductionMaskedOp f, FReductionAllMaskedOp fa,
157+
double relativeError) {
144158
int i = 0;
145159
try {
146-
Assert.assertEquals(rc, fa.apply(a, mask));
160+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError));
147161
for (; i < a.length; i += SPECIES.length()) {
148-
Assert.assertEquals(r[i], f.apply(a, i, mask));
162+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] *
163+
relativeError));
149164
}
150165
} catch (AssertionError e) {
151-
Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!");
152-
Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
166+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError), "Final result is incorrect!");
167+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] * relativeError), "at index #" + i);
153168
}
154169
}
155170

@@ -1078,6 +1093,14 @@ static long bits(double e) {
10781093
return fill(s * BUFFER_REPS,
10791094
i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1)));
10801095
}),
1096+
withToString("double[0.01 + (i / (i + 1))]", (int s) -> {
1097+
return fill(s * BUFFER_REPS,
1098+
i -> (double)0.01 + ((double)i / (i + 1)));
1099+
}),
1100+
withToString("double[i -> i % 17 == 0 ? cornerCaseValue(i) : 0.01 + (i / (i + 1))]", (int s) -> {
1101+
return fill(s * BUFFER_REPS,
1102+
i -> i % 17 == 0 ? cornerCaseValue(i) : (double)0.01 + ((double)i / (i + 1)));
1103+
}),
10811104
withToString("double[cornerCaseValue(i)]", (int s) -> {
10821105
return fill(s * BUFFER_REPS,
10831106
i -> cornerCaseValue(i));
@@ -2168,7 +2191,7 @@ static void ADDReduceDouble128VectorTests(IntFunction<double[]> fa) {
21682191
}
21692192

21702193
assertReductionArraysEquals(r, ra, a,
2171-
Double128VectorTests::ADDReduce, Double128VectorTests::ADDReduceAll);
2194+
Double128VectorTests::ADDReduce, Double128VectorTests::ADDReduceAll, RELATIVE_ROUNDING_ERROR);
21722195
}
21732196

21742197
static double ADDReduceMasked(double[] a, int idx, boolean[] mask) {
@@ -2214,7 +2237,7 @@ static void ADDReduceDouble128VectorTestsMasked(IntFunction<double[]> fa, IntFun
22142237
}
22152238

22162239
assertReductionArraysEqualsMasked(r, ra, a, mask,
2217-
Double128VectorTests::ADDReduceMasked, Double128VectorTests::ADDReduceAllMasked);
2240+
Double128VectorTests::ADDReduceMasked, Double128VectorTests::ADDReduceAllMasked, RELATIVE_ROUNDING_ERROR);
22182241
}
22192242

22202243
static double MULReduce(double[] a, int idx) {
@@ -2257,7 +2280,7 @@ static void MULReduceDouble128VectorTests(IntFunction<double[]> fa) {
22572280
}
22582281

22592282
assertReductionArraysEquals(r, ra, a,
2260-
Double128VectorTests::MULReduce, Double128VectorTests::MULReduceAll);
2283+
Double128VectorTests::MULReduce, Double128VectorTests::MULReduceAll, RELATIVE_ROUNDING_ERROR);
22612284
}
22622285

22632286
static double MULReduceMasked(double[] a, int idx, boolean[] mask) {
@@ -2303,7 +2326,7 @@ static void MULReduceDouble128VectorTestsMasked(IntFunction<double[]> fa, IntFun
23032326
}
23042327

23052328
assertReductionArraysEqualsMasked(r, ra, a, mask,
2306-
Double128VectorTests::MULReduceMasked, Double128VectorTests::MULReduceAllMasked);
2329+
Double128VectorTests::MULReduceMasked, Double128VectorTests::MULReduceAllMasked, RELATIVE_ROUNDING_ERROR);
23072330
}
23082331

23092332
static double MINReduce(double[] a, int idx) {

test/jdk/jdk/incubator/vector/Double256VectorTests.java

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public class Double256VectorTests extends AbstractVectorTest {
6060
static final int INVOC_COUNT = Integer.getInteger("jdk.incubator.vector.test.loop-iterations", 100);
6161

6262

63+
// for floating point reduction ops that may introduce rounding errors
64+
private static final double RELATIVE_ROUNDING_ERROR = (double)0.000001;
6365

6466
static final int BUFFER_REPS = Integer.getInteger("jdk.incubator.vector.test.buffer-vectors", 25000 / 256);
6567

@@ -119,15 +121,21 @@ interface FReductionAllOp {
119121

120122
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
121123
FReductionOp f, FReductionAllOp fa) {
124+
assertReductionArraysEquals(r, rc, a, f, fa, (double)0.0);
125+
}
126+
127+
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
128+
FReductionOp f, FReductionAllOp fa,
129+
double relativeError) {
122130
int i = 0;
123131
try {
124-
Assert.assertEquals(rc, fa.apply(a));
132+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError));
125133
for (; i < a.length; i += SPECIES.length()) {
126-
Assert.assertEquals(r[i], f.apply(a, i));
134+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError));
127135
}
128136
} catch (AssertionError e) {
129-
Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!");
130-
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
137+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError), "Final result is incorrect!");
138+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError), "at index #" + i);
131139
}
132140
}
133141

@@ -141,15 +149,22 @@ interface FReductionAllMaskedOp {
141149

142150
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
143151
FReductionMaskedOp f, FReductionAllMaskedOp fa) {
152+
assertReductionArraysEqualsMasked(r, rc, a, mask, f, fa, (double)0.0);
153+
}
154+
155+
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
156+
FReductionMaskedOp f, FReductionAllMaskedOp fa,
157+
double relativeError) {
144158
int i = 0;
145159
try {
146-
Assert.assertEquals(rc, fa.apply(a, mask));
160+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError));
147161
for (; i < a.length; i += SPECIES.length()) {
148-
Assert.assertEquals(r[i], f.apply(a, i, mask));
162+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] *
163+
relativeError));
149164
}
150165
} catch (AssertionError e) {
151-
Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!");
152-
Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
166+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError), "Final result is incorrect!");
167+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] * relativeError), "at index #" + i);
153168
}
154169
}
155170

@@ -1078,6 +1093,14 @@ static long bits(double e) {
10781093
return fill(s * BUFFER_REPS,
10791094
i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1)));
10801095
}),
1096+
withToString("double[0.01 + (i / (i + 1))]", (int s) -> {
1097+
return fill(s * BUFFER_REPS,
1098+
i -> (double)0.01 + ((double)i / (i + 1)));
1099+
}),
1100+
withToString("double[i -> i % 17 == 0 ? cornerCaseValue(i) : 0.01 + (i / (i + 1))]", (int s) -> {
1101+
return fill(s * BUFFER_REPS,
1102+
i -> i % 17 == 0 ? cornerCaseValue(i) : (double)0.01 + ((double)i / (i + 1)));
1103+
}),
10811104
withToString("double[cornerCaseValue(i)]", (int s) -> {
10821105
return fill(s * BUFFER_REPS,
10831106
i -> cornerCaseValue(i));
@@ -2168,7 +2191,7 @@ static void ADDReduceDouble256VectorTests(IntFunction<double[]> fa) {
21682191
}
21692192

21702193
assertReductionArraysEquals(r, ra, a,
2171-
Double256VectorTests::ADDReduce, Double256VectorTests::ADDReduceAll);
2194+
Double256VectorTests::ADDReduce, Double256VectorTests::ADDReduceAll, RELATIVE_ROUNDING_ERROR);
21722195
}
21732196

21742197
static double ADDReduceMasked(double[] a, int idx, boolean[] mask) {
@@ -2214,7 +2237,7 @@ static void ADDReduceDouble256VectorTestsMasked(IntFunction<double[]> fa, IntFun
22142237
}
22152238

22162239
assertReductionArraysEqualsMasked(r, ra, a, mask,
2217-
Double256VectorTests::ADDReduceMasked, Double256VectorTests::ADDReduceAllMasked);
2240+
Double256VectorTests::ADDReduceMasked, Double256VectorTests::ADDReduceAllMasked, RELATIVE_ROUNDING_ERROR);
22182241
}
22192242

22202243
static double MULReduce(double[] a, int idx) {
@@ -2257,7 +2280,7 @@ static void MULReduceDouble256VectorTests(IntFunction<double[]> fa) {
22572280
}
22582281

22592282
assertReductionArraysEquals(r, ra, a,
2260-
Double256VectorTests::MULReduce, Double256VectorTests::MULReduceAll);
2283+
Double256VectorTests::MULReduce, Double256VectorTests::MULReduceAll, RELATIVE_ROUNDING_ERROR);
22612284
}
22622285

22632286
static double MULReduceMasked(double[] a, int idx, boolean[] mask) {
@@ -2303,7 +2326,7 @@ static void MULReduceDouble256VectorTestsMasked(IntFunction<double[]> fa, IntFun
23032326
}
23042327

23052328
assertReductionArraysEqualsMasked(r, ra, a, mask,
2306-
Double256VectorTests::MULReduceMasked, Double256VectorTests::MULReduceAllMasked);
2329+
Double256VectorTests::MULReduceMasked, Double256VectorTests::MULReduceAllMasked, RELATIVE_ROUNDING_ERROR);
23072330
}
23082331

23092332
static double MINReduce(double[] a, int idx) {

test/jdk/jdk/incubator/vector/Double512VectorTests.java

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public class Double512VectorTests extends AbstractVectorTest {
6060
static final int INVOC_COUNT = Integer.getInteger("jdk.incubator.vector.test.loop-iterations", 100);
6161

6262

63+
// for floating point reduction ops that may introduce rounding errors
64+
private static final double RELATIVE_ROUNDING_ERROR = (double)0.000001;
6365

6466
static final int BUFFER_REPS = Integer.getInteger("jdk.incubator.vector.test.buffer-vectors", 25000 / 512);
6567

@@ -119,15 +121,21 @@ interface FReductionAllOp {
119121

120122
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
121123
FReductionOp f, FReductionAllOp fa) {
124+
assertReductionArraysEquals(r, rc, a, f, fa, (double)0.0);
125+
}
126+
127+
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
128+
FReductionOp f, FReductionAllOp fa,
129+
double relativeError) {
122130
int i = 0;
123131
try {
124-
Assert.assertEquals(rc, fa.apply(a));
132+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError));
125133
for (; i < a.length; i += SPECIES.length()) {
126-
Assert.assertEquals(r[i], f.apply(a, i));
134+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError));
127135
}
128136
} catch (AssertionError e) {
129-
Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!");
130-
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
137+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError), "Final result is incorrect!");
138+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError), "at index #" + i);
131139
}
132140
}
133141

@@ -141,15 +149,22 @@ interface FReductionAllMaskedOp {
141149

142150
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
143151
FReductionMaskedOp f, FReductionAllMaskedOp fa) {
152+
assertReductionArraysEqualsMasked(r, rc, a, mask, f, fa, (double)0.0);
153+
}
154+
155+
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
156+
FReductionMaskedOp f, FReductionAllMaskedOp fa,
157+
double relativeError) {
144158
int i = 0;
145159
try {
146-
Assert.assertEquals(rc, fa.apply(a, mask));
160+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError));
147161
for (; i < a.length; i += SPECIES.length()) {
148-
Assert.assertEquals(r[i], f.apply(a, i, mask));
162+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] *
163+
relativeError));
149164
}
150165
} catch (AssertionError e) {
151-
Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!");
152-
Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
166+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError), "Final result is incorrect!");
167+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] * relativeError), "at index #" + i);
153168
}
154169
}
155170

@@ -1078,6 +1093,14 @@ static long bits(double e) {
10781093
return fill(s * BUFFER_REPS,
10791094
i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1)));
10801095
}),
1096+
withToString("double[0.01 + (i / (i + 1))]", (int s) -> {
1097+
return fill(s * BUFFER_REPS,
1098+
i -> (double)0.01 + ((double)i / (i + 1)));
1099+
}),
1100+
withToString("double[i -> i % 17 == 0 ? cornerCaseValue(i) : 0.01 + (i / (i + 1))]", (int s) -> {
1101+
return fill(s * BUFFER_REPS,
1102+
i -> i % 17 == 0 ? cornerCaseValue(i) : (double)0.01 + ((double)i / (i + 1)));
1103+
}),
10811104
withToString("double[cornerCaseValue(i)]", (int s) -> {
10821105
return fill(s * BUFFER_REPS,
10831106
i -> cornerCaseValue(i));
@@ -2168,7 +2191,7 @@ static void ADDReduceDouble512VectorTests(IntFunction<double[]> fa) {
21682191
}
21692192

21702193
assertReductionArraysEquals(r, ra, a,
2171-
Double512VectorTests::ADDReduce, Double512VectorTests::ADDReduceAll);
2194+
Double512VectorTests::ADDReduce, Double512VectorTests::ADDReduceAll, RELATIVE_ROUNDING_ERROR);
21722195
}
21732196

21742197
static double ADDReduceMasked(double[] a, int idx, boolean[] mask) {
@@ -2214,7 +2237,7 @@ static void ADDReduceDouble512VectorTestsMasked(IntFunction<double[]> fa, IntFun
22142237
}
22152238

22162239
assertReductionArraysEqualsMasked(r, ra, a, mask,
2217-
Double512VectorTests::ADDReduceMasked, Double512VectorTests::ADDReduceAllMasked);
2240+
Double512VectorTests::ADDReduceMasked, Double512VectorTests::ADDReduceAllMasked, RELATIVE_ROUNDING_ERROR);
22182241
}
22192242

22202243
static double MULReduce(double[] a, int idx) {
@@ -2257,7 +2280,7 @@ static void MULReduceDouble512VectorTests(IntFunction<double[]> fa) {
22572280
}
22582281

22592282
assertReductionArraysEquals(r, ra, a,
2260-
Double512VectorTests::MULReduce, Double512VectorTests::MULReduceAll);
2283+
Double512VectorTests::MULReduce, Double512VectorTests::MULReduceAll, RELATIVE_ROUNDING_ERROR);
22612284
}
22622285

22632286
static double MULReduceMasked(double[] a, int idx, boolean[] mask) {
@@ -2303,7 +2326,7 @@ static void MULReduceDouble512VectorTestsMasked(IntFunction<double[]> fa, IntFun
23032326
}
23042327

23052328
assertReductionArraysEqualsMasked(r, ra, a, mask,
2306-
Double512VectorTests::MULReduceMasked, Double512VectorTests::MULReduceAllMasked);
2329+
Double512VectorTests::MULReduceMasked, Double512VectorTests::MULReduceAllMasked, RELATIVE_ROUNDING_ERROR);
23072330
}
23082331

23092332
static double MINReduce(double[] a, int idx) {

0 commit comments

Comments
 (0)