Skip to content

Commit

Permalink
math_brute_force: fix fdim to use device's rounding when converting…
Browse files Browse the repository at this point in the history
… result back to half. (#2223)

In the half-precision `fdim` test, the original code used `CL_HALF_RTE`
to convert the float result back to half, causing a mismatch in
computation results when the hardware uses RTZ. Some of the examples:
```
  fdim(0x365f, 0xdc63) = fdim( 0.398193f,  -280.75f)     =   281.148193f (RTE=0x5c65, RTZ=0x5c64)
  fdim(0xa4a3, 0xf0e9) = fdim(-0.018112f, 10056.0f)      = 10055.981445f (RTE=0x70e9, RTZ=0x70e8)
  fdim(0x1904, 0x9ab7) = fdim( 0.002449f,    -0.003279f) =     0.005728f (RTE=0x1dde, RTZ=0x1ddd)
```

Fixed this by using the hardware's default rounding mode when converting
the result back to half.
  • Loading branch information
cycheng authored Jan 28, 2025
1 parent 73dd3b9 commit 5749818
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions test_conformance/math_brute_force/binary_half.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ cl_int TestHalf(cl_uint job_id, cl_uint thread_id, void *data)
return CL_SUCCESS;
}

cl_half_rounding_mode halfRoundingMode = CL_HALF_RTE;
FPU_mode_type oldMode;
oldRoundMode = kRoundToNearestEven;
if (isFDim)
Expand All @@ -275,7 +276,11 @@ cl_int TestHalf(cl_uint job_id, cl_uint thread_id, void *data)
if (ftz) ForceFTZ(&oldMode);

// Set the rounding mode to match the device
if (gIsInRTZMode) oldRoundMode = set_round(kRoundTowardZero, kfloat);
if (gIsInRTZMode)
{
oldRoundMode = set_round(kRoundTowardZero, kfloat);
halfRoundingMode = CL_HALF_RTZ;
}
}

if (!strcmp(name, "copysign")) copysign_test = 1;
Expand All @@ -293,9 +298,9 @@ cl_int TestHalf(cl_uint job_id, cl_uint thread_id, void *data)
s2[j] = cl_half_to_float(p2[j]);
if (isNextafter)
r[j] = cl_half_from_float(reference_nextafterh(s[j], s2[j]),
CL_HALF_RTE);
halfRoundingMode);
else
r[j] = cl_half_from_float(ref_func(s[j], s2[j]), CL_HALF_RTE);
r[j] = cl_half_from_float(ref_func(s[j], s2[j]), halfRoundingMode);
}

if (isFDim && ftz) RestoreFPState(&oldMode);
Expand Down

0 comments on commit 5749818

Please sign in to comment.