Skip to content

Commit 5fef984

Browse files
author
Amos Shi
committed
8315024: Vector API FP reduction tests should not test for exact equality
Reviewed-by: mdoerr Backport-of: e6f23a90d4a53339a3c9c2b76fc5d317940e4472
1 parent ba98d8b commit 5fef984

13 files changed

+417
-120
lines changed

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

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public class Double128VectorTests extends AbstractVectorTest {
5959

6060
static final int INVOC_COUNT = Integer.getInteger("jdk.incubator.vector.test.loop-iterations", 100);
6161

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

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

@@ -118,15 +120,21 @@ interface FReductionAllOp {
118120

119121
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
120122
FReductionOp f, FReductionAllOp fa) {
123+
assertReductionArraysEquals(r, rc, a, f, fa, (double)0.0);
124+
}
125+
126+
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
127+
FReductionOp f, FReductionAllOp fa,
128+
double relativeError) {
121129
int i = 0;
122130
try {
123-
Assert.assertEquals(rc, fa.apply(a));
131+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError));
124132
for (; i < a.length; i += SPECIES.length()) {
125-
Assert.assertEquals(r[i], f.apply(a, i));
133+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError));
126134
}
127135
} catch (AssertionError e) {
128-
Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!");
129-
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
136+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError), "Final result is incorrect!");
137+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError), "at index #" + i);
130138
}
131139
}
132140

@@ -140,15 +148,22 @@ interface FReductionAllMaskedOp {
140148

141149
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
142150
FReductionMaskedOp f, FReductionAllMaskedOp fa) {
151+
assertReductionArraysEqualsMasked(r, rc, a, mask, f, fa, (double)0.0);
152+
}
153+
154+
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
155+
FReductionMaskedOp f, FReductionAllMaskedOp fa,
156+
double relativeError) {
143157
int i = 0;
144158
try {
145-
Assert.assertEquals(rc, fa.apply(a, mask));
159+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError));
146160
for (; i < a.length; i += SPECIES.length()) {
147-
Assert.assertEquals(r[i], f.apply(a, i, mask));
161+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] *
162+
relativeError));
148163
}
149164
} catch (AssertionError e) {
150-
Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!");
151-
Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
165+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError), "Final result is incorrect!");
166+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] * relativeError), "at index #" + i);
152167
}
153168
}
154169

@@ -986,6 +1001,14 @@ static long bits(double e) {
9861001
return fill(s * BUFFER_REPS,
9871002
i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1)));
9881003
}),
1004+
withToString("double[0.01 + (i / (i + 1))]", (int s) -> {
1005+
return fill(s * BUFFER_REPS,
1006+
i -> (double)0.01 + ((double)i / (i + 1)));
1007+
}),
1008+
withToString("double[i -> i % 17 == 0 ? cornerCaseValue(i) : 0.01 + (i / (i + 1))]", (int s) -> {
1009+
return fill(s * BUFFER_REPS,
1010+
i -> i % 17 == 0 ? cornerCaseValue(i) : (double)0.01 + ((double)i / (i + 1)));
1011+
}),
9891012
withToString("double[cornerCaseValue(i)]", (int s) -> {
9901013
return fill(s * BUFFER_REPS,
9911014
i -> cornerCaseValue(i));
@@ -2135,7 +2158,7 @@ static void ADDReduceDouble128VectorTests(IntFunction<double[]> fa) {
21352158
}
21362159

21372160
assertReductionArraysEquals(r, ra, a,
2138-
Double128VectorTests::ADDReduce, Double128VectorTests::ADDReduceAll);
2161+
Double128VectorTests::ADDReduce, Double128VectorTests::ADDReduceAll, RELATIVE_ROUNDING_ERROR);
21392162
}
21402163
static double ADDReduceMasked(double[] a, int idx, boolean[] mask) {
21412164
double res = 0;
@@ -2179,7 +2202,7 @@ static void ADDReduceDouble128VectorTestsMasked(IntFunction<double[]> fa, IntFun
21792202
}
21802203

21812204
assertReductionArraysEqualsMasked(r, ra, a, mask,
2182-
Double128VectorTests::ADDReduceMasked, Double128VectorTests::ADDReduceAllMasked);
2205+
Double128VectorTests::ADDReduceMasked, Double128VectorTests::ADDReduceAllMasked, RELATIVE_ROUNDING_ERROR);
21832206
}
21842207
static double MULReduce(double[] a, int idx) {
21852208
double res = 1;
@@ -2220,7 +2243,7 @@ static void MULReduceDouble128VectorTests(IntFunction<double[]> fa) {
22202243
}
22212244

22222245
assertReductionArraysEquals(r, ra, a,
2223-
Double128VectorTests::MULReduce, Double128VectorTests::MULReduceAll);
2246+
Double128VectorTests::MULReduce, Double128VectorTests::MULReduceAll, RELATIVE_ROUNDING_ERROR);
22242247
}
22252248
static double MULReduceMasked(double[] a, int idx, boolean[] mask) {
22262249
double res = 1;
@@ -2264,7 +2287,7 @@ static void MULReduceDouble128VectorTestsMasked(IntFunction<double[]> fa, IntFun
22642287
}
22652288

22662289
assertReductionArraysEqualsMasked(r, ra, a, mask,
2267-
Double128VectorTests::MULReduceMasked, Double128VectorTests::MULReduceAllMasked);
2290+
Double128VectorTests::MULReduceMasked, Double128VectorTests::MULReduceAllMasked, RELATIVE_ROUNDING_ERROR);
22682291
}
22692292
static double MINReduce(double[] a, int idx) {
22702293
double res = Double.POSITIVE_INFINITY;

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

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public class Double256VectorTests extends AbstractVectorTest {
5959

6060
static final int INVOC_COUNT = Integer.getInteger("jdk.incubator.vector.test.loop-iterations", 100);
6161

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

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

@@ -118,15 +120,21 @@ interface FReductionAllOp {
118120

119121
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
120122
FReductionOp f, FReductionAllOp fa) {
123+
assertReductionArraysEquals(r, rc, a, f, fa, (double)0.0);
124+
}
125+
126+
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
127+
FReductionOp f, FReductionAllOp fa,
128+
double relativeError) {
121129
int i = 0;
122130
try {
123-
Assert.assertEquals(rc, fa.apply(a));
131+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError));
124132
for (; i < a.length; i += SPECIES.length()) {
125-
Assert.assertEquals(r[i], f.apply(a, i));
133+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError));
126134
}
127135
} catch (AssertionError e) {
128-
Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!");
129-
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
136+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError), "Final result is incorrect!");
137+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError), "at index #" + i);
130138
}
131139
}
132140

@@ -140,15 +148,22 @@ interface FReductionAllMaskedOp {
140148

141149
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
142150
FReductionMaskedOp f, FReductionAllMaskedOp fa) {
151+
assertReductionArraysEqualsMasked(r, rc, a, mask, f, fa, (double)0.0);
152+
}
153+
154+
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
155+
FReductionMaskedOp f, FReductionAllMaskedOp fa,
156+
double relativeError) {
143157
int i = 0;
144158
try {
145-
Assert.assertEquals(rc, fa.apply(a, mask));
159+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError));
146160
for (; i < a.length; i += SPECIES.length()) {
147-
Assert.assertEquals(r[i], f.apply(a, i, mask));
161+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] *
162+
relativeError));
148163
}
149164
} catch (AssertionError e) {
150-
Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!");
151-
Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
165+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError), "Final result is incorrect!");
166+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] * relativeError), "at index #" + i);
152167
}
153168
}
154169

@@ -986,6 +1001,14 @@ static long bits(double e) {
9861001
return fill(s * BUFFER_REPS,
9871002
i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1)));
9881003
}),
1004+
withToString("double[0.01 + (i / (i + 1))]", (int s) -> {
1005+
return fill(s * BUFFER_REPS,
1006+
i -> (double)0.01 + ((double)i / (i + 1)));
1007+
}),
1008+
withToString("double[i -> i % 17 == 0 ? cornerCaseValue(i) : 0.01 + (i / (i + 1))]", (int s) -> {
1009+
return fill(s * BUFFER_REPS,
1010+
i -> i % 17 == 0 ? cornerCaseValue(i) : (double)0.01 + ((double)i / (i + 1)));
1011+
}),
9891012
withToString("double[cornerCaseValue(i)]", (int s) -> {
9901013
return fill(s * BUFFER_REPS,
9911014
i -> cornerCaseValue(i));
@@ -2135,7 +2158,7 @@ static void ADDReduceDouble256VectorTests(IntFunction<double[]> fa) {
21352158
}
21362159

21372160
assertReductionArraysEquals(r, ra, a,
2138-
Double256VectorTests::ADDReduce, Double256VectorTests::ADDReduceAll);
2161+
Double256VectorTests::ADDReduce, Double256VectorTests::ADDReduceAll, RELATIVE_ROUNDING_ERROR);
21392162
}
21402163
static double ADDReduceMasked(double[] a, int idx, boolean[] mask) {
21412164
double res = 0;
@@ -2179,7 +2202,7 @@ static void ADDReduceDouble256VectorTestsMasked(IntFunction<double[]> fa, IntFun
21792202
}
21802203

21812204
assertReductionArraysEqualsMasked(r, ra, a, mask,
2182-
Double256VectorTests::ADDReduceMasked, Double256VectorTests::ADDReduceAllMasked);
2205+
Double256VectorTests::ADDReduceMasked, Double256VectorTests::ADDReduceAllMasked, RELATIVE_ROUNDING_ERROR);
21832206
}
21842207
static double MULReduce(double[] a, int idx) {
21852208
double res = 1;
@@ -2220,7 +2243,7 @@ static void MULReduceDouble256VectorTests(IntFunction<double[]> fa) {
22202243
}
22212244

22222245
assertReductionArraysEquals(r, ra, a,
2223-
Double256VectorTests::MULReduce, Double256VectorTests::MULReduceAll);
2246+
Double256VectorTests::MULReduce, Double256VectorTests::MULReduceAll, RELATIVE_ROUNDING_ERROR);
22242247
}
22252248
static double MULReduceMasked(double[] a, int idx, boolean[] mask) {
22262249
double res = 1;
@@ -2264,7 +2287,7 @@ static void MULReduceDouble256VectorTestsMasked(IntFunction<double[]> fa, IntFun
22642287
}
22652288

22662289
assertReductionArraysEqualsMasked(r, ra, a, mask,
2267-
Double256VectorTests::MULReduceMasked, Double256VectorTests::MULReduceAllMasked);
2290+
Double256VectorTests::MULReduceMasked, Double256VectorTests::MULReduceAllMasked, RELATIVE_ROUNDING_ERROR);
22682291
}
22692292
static double MINReduce(double[] a, int idx) {
22702293
double res = Double.POSITIVE_INFINITY;

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

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public class Double512VectorTests extends AbstractVectorTest {
5959

6060
static final int INVOC_COUNT = Integer.getInteger("jdk.incubator.vector.test.loop-iterations", 100);
6161

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

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

@@ -118,15 +120,21 @@ interface FReductionAllOp {
118120

119121
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
120122
FReductionOp f, FReductionAllOp fa) {
123+
assertReductionArraysEquals(r, rc, a, f, fa, (double)0.0);
124+
}
125+
126+
static void assertReductionArraysEquals(double[] r, double rc, double[] a,
127+
FReductionOp f, FReductionAllOp fa,
128+
double relativeError) {
121129
int i = 0;
122130
try {
123-
Assert.assertEquals(rc, fa.apply(a));
131+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError));
124132
for (; i < a.length; i += SPECIES.length()) {
125-
Assert.assertEquals(r[i], f.apply(a, i));
133+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError));
126134
}
127135
} catch (AssertionError e) {
128-
Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!");
129-
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
136+
Assert.assertEquals(rc, fa.apply(a), Math.abs(rc * relativeError), "Final result is incorrect!");
137+
Assert.assertEquals(r[i], f.apply(a, i), Math.abs(r[i] * relativeError), "at index #" + i);
130138
}
131139
}
132140

@@ -140,15 +148,22 @@ interface FReductionAllMaskedOp {
140148

141149
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
142150
FReductionMaskedOp f, FReductionAllMaskedOp fa) {
151+
assertReductionArraysEqualsMasked(r, rc, a, mask, f, fa, (double)0.0);
152+
}
153+
154+
static void assertReductionArraysEqualsMasked(double[] r, double rc, double[] a, boolean[] mask,
155+
FReductionMaskedOp f, FReductionAllMaskedOp fa,
156+
double relativeError) {
143157
int i = 0;
144158
try {
145-
Assert.assertEquals(rc, fa.apply(a, mask));
159+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError));
146160
for (; i < a.length; i += SPECIES.length()) {
147-
Assert.assertEquals(r[i], f.apply(a, i, mask));
161+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] *
162+
relativeError));
148163
}
149164
} catch (AssertionError e) {
150-
Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!");
151-
Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
165+
Assert.assertEquals(rc, fa.apply(a, mask), Math.abs(rc * relativeError), "Final result is incorrect!");
166+
Assert.assertEquals(r[i], f.apply(a, i, mask), Math.abs(r[i] * relativeError), "at index #" + i);
152167
}
153168
}
154169

@@ -986,6 +1001,14 @@ static long bits(double e) {
9861001
return fill(s * BUFFER_REPS,
9871002
i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1)));
9881003
}),
1004+
withToString("double[0.01 + (i / (i + 1))]", (int s) -> {
1005+
return fill(s * BUFFER_REPS,
1006+
i -> (double)0.01 + ((double)i / (i + 1)));
1007+
}),
1008+
withToString("double[i -> i % 17 == 0 ? cornerCaseValue(i) : 0.01 + (i / (i + 1))]", (int s) -> {
1009+
return fill(s * BUFFER_REPS,
1010+
i -> i % 17 == 0 ? cornerCaseValue(i) : (double)0.01 + ((double)i / (i + 1)));
1011+
}),
9891012
withToString("double[cornerCaseValue(i)]", (int s) -> {
9901013
return fill(s * BUFFER_REPS,
9911014
i -> cornerCaseValue(i));
@@ -2135,7 +2158,7 @@ static void ADDReduceDouble512VectorTests(IntFunction<double[]> fa) {
21352158
}
21362159

21372160
assertReductionArraysEquals(r, ra, a,
2138-
Double512VectorTests::ADDReduce, Double512VectorTests::ADDReduceAll);
2161+
Double512VectorTests::ADDReduce, Double512VectorTests::ADDReduceAll, RELATIVE_ROUNDING_ERROR);
21392162
}
21402163
static double ADDReduceMasked(double[] a, int idx, boolean[] mask) {
21412164
double res = 0;
@@ -2179,7 +2202,7 @@ static void ADDReduceDouble512VectorTestsMasked(IntFunction<double[]> fa, IntFun
21792202
}
21802203

21812204
assertReductionArraysEqualsMasked(r, ra, a, mask,
2182-
Double512VectorTests::ADDReduceMasked, Double512VectorTests::ADDReduceAllMasked);
2205+
Double512VectorTests::ADDReduceMasked, Double512VectorTests::ADDReduceAllMasked, RELATIVE_ROUNDING_ERROR);
21832206
}
21842207
static double MULReduce(double[] a, int idx) {
21852208
double res = 1;
@@ -2220,7 +2243,7 @@ static void MULReduceDouble512VectorTests(IntFunction<double[]> fa) {
22202243
}
22212244

22222245
assertReductionArraysEquals(r, ra, a,
2223-
Double512VectorTests::MULReduce, Double512VectorTests::MULReduceAll);
2246+
Double512VectorTests::MULReduce, Double512VectorTests::MULReduceAll, RELATIVE_ROUNDING_ERROR);
22242247
}
22252248
static double MULReduceMasked(double[] a, int idx, boolean[] mask) {
22262249
double res = 1;
@@ -2264,7 +2287,7 @@ static void MULReduceDouble512VectorTestsMasked(IntFunction<double[]> fa, IntFun
22642287
}
22652288

22662289
assertReductionArraysEqualsMasked(r, ra, a, mask,
2267-
Double512VectorTests::MULReduceMasked, Double512VectorTests::MULReduceAllMasked);
2290+
Double512VectorTests::MULReduceMasked, Double512VectorTests::MULReduceAllMasked, RELATIVE_ROUNDING_ERROR);
22682291
}
22692292
static double MINReduce(double[] a, int idx) {
22702293
double res = Double.POSITIVE_INFINITY;

0 commit comments

Comments
 (0)