mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
printf: Fix floating-point rounding consistency for RTZ devices (#2202)
1. In vector test, prepare RTZ answer for RTZ rounding.
2. In mixed_format_random test, for a given float 'arg', the test
previously used 'arg' directly to generate ref_str:
```
ref_str << str_sprintf(format, arg);
```
This approach incorrectly assumes:
```
(float) arg == to_fp(to_str(arg));
```
However, this assumption fails under RTZ rounding. For example:
```
arg = 0xC642549C
to_str(arg) = -12437.152343f
to_fp_rtz(-12437.152343f) = 0xC642549B (-0X1.84A936P+13)
to_fp_rte(-12437.152343f) = 0xC642549C (-0X1.84A938P+13)
```
To address this, the reference result is now computed based on the
literal float string rather than the original 'arg' value.
This commit is contained in:
@@ -317,8 +317,10 @@ cl_program makeMixedFormatPrintfProgram(cl_kernel* kernel_ptr,
|
|||||||
{
|
{
|
||||||
const float max_range = 100000.f;
|
const float max_range = 100000.f;
|
||||||
float arg = get_random_float(-max_range, max_range, gMTdata);
|
float arg = get_random_float(-max_range, max_range, gMTdata);
|
||||||
args_str << str_sprintf("%f", arg) << "f, ";
|
std::string arg_str = str_sprintf("%f", arg);
|
||||||
ref_str << str_sprintf(format, arg) << ", ";
|
args_str << arg_str << "f, ";
|
||||||
|
float arg_deviceRound = std::stof(arg_str);
|
||||||
|
ref_str << str_sprintf(format, arg_deviceRound) << ", ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Restore the original CPU rounding mode
|
// Restore the original CPU rounding mode
|
||||||
|
|||||||
@@ -1336,6 +1336,33 @@ std::vector<std::string> correctBufferVector = {
|
|||||||
"00512,01024,262144,1048576"
|
"00512,01024,262144,1048576"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::vector<std::string> correctBufferVectorRTZ = {
|
||||||
|
|
||||||
|
"1.00,2.00,3.00,4.00",
|
||||||
|
|
||||||
|
"0xfa,0xfb",
|
||||||
|
|
||||||
|
"0x1234,0x8765",
|
||||||
|
|
||||||
|
"0x12345678,0x87654321",
|
||||||
|
|
||||||
|
"12345678,98765432",
|
||||||
|
|
||||||
|
"1.00,2.00,3.00,4.00",
|
||||||
|
|
||||||
|
"1.23e+03,9.87e+05,4.99e-04",
|
||||||
|
|
||||||
|
"0x1p-2,0x1p-1,0x1p+0,0x1.8p+0",
|
||||||
|
|
||||||
|
"1,2,3,4,1.5,3.13999,2.5,3.5",
|
||||||
|
|
||||||
|
"1,2,3,4,5,6,7,10,11,0,40,100,200,400,1000,2000",
|
||||||
|
|
||||||
|
"+1,-2,+3,-4,+5,-6,+7,-8",
|
||||||
|
|
||||||
|
"00512,01024,262144,1048576"
|
||||||
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------
|
//-----------------------------------------------------------
|
||||||
|
|
||||||
//Test case for vector |
|
//Test case for vector |
|
||||||
@@ -1822,7 +1849,14 @@ void generateRef(const cl_device_id device)
|
|||||||
as they're constant and hard-coded
|
as they're constant and hard-coded
|
||||||
*/
|
*/
|
||||||
if (caseToTest->printFN == NULL)
|
if (caseToTest->printFN == NULL)
|
||||||
|
{
|
||||||
|
if (caseToTest->_type == TYPE_VECTOR
|
||||||
|
&& fpConfigSingle == CL_FP_ROUND_TO_ZERO)
|
||||||
|
{
|
||||||
|
caseToTest->_correctBuffer = correctBufferVectorRTZ;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure the reference result is empty
|
// Make sure the reference result is empty
|
||||||
assert(caseToTest->_correctBuffer.size() == 0);
|
assert(caseToTest->_correctBuffer.size() == 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user