mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
math_brute_force: fix fdim to use device's rounding when converting 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.
This commit is contained in:
@@ -266,6 +266,7 @@ cl_int TestHalf(cl_uint job_id, cl_uint thread_id, void *data)
|
|||||||
return CL_SUCCESS;
|
return CL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cl_half_rounding_mode halfRoundingMode = CL_HALF_RTE;
|
||||||
FPU_mode_type oldMode;
|
FPU_mode_type oldMode;
|
||||||
oldRoundMode = kRoundToNearestEven;
|
oldRoundMode = kRoundToNearestEven;
|
||||||
if (isFDim)
|
if (isFDim)
|
||||||
@@ -275,7 +276,11 @@ cl_int TestHalf(cl_uint job_id, cl_uint thread_id, void *data)
|
|||||||
if (ftz) ForceFTZ(&oldMode);
|
if (ftz) ForceFTZ(&oldMode);
|
||||||
|
|
||||||
// Set the rounding mode to match the device
|
// 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;
|
if (!strcmp(name, "copysign")) copysign_test = 1;
|
||||||
@@ -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]);
|
s2[j] = cl_half_to_float(p2[j]);
|
||||||
if (isNextafter)
|
if (isNextafter)
|
||||||
r[j] = cl_half_from_float(reference_nextafterh(s[j], s2[j]),
|
r[j] = cl_half_from_float(reference_nextafterh(s[j], s2[j]),
|
||||||
CL_HALF_RTE);
|
halfRoundingMode);
|
||||||
else
|
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);
|
if (isFDim && ftz) RestoreFPState(&oldMode);
|
||||||
|
|||||||
Reference in New Issue
Block a user