Fixing a bunch of SM 6.2 Tests
- BinaryHalfOp tests reading input2 instead of input1
- Fixed converting signed zero from float to float16
- Fixed compiler options for float16 min,max test
- Fixed expected results for following float16 operations
- cos(0), sin(314), sin(-314)
- frc(-7.39)
- rsqrt(65504)
- int16 subtraction
- int16 unsigned multiplication
- sqrt, rsqrt, round_pi, round_ni, fmad treat denorm as it is
This commit is contained in:
Young Kim 2018-01-30 14:28:49 -08:00 коммит произвёл GitHub
Родитель e9120a1594
Коммит d5d3d8d49a
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 98 добавлений и 58 удалений

Просмотреть файл

@ -2838,6 +2838,17 @@ static TableParameter DenormTertiaryFPOpParameters[] = {
{ L"Validation.Tolerance", TableParameter::DOUBLE, true },
};
static bool IsHexString(PCWSTR str, uint16_t *value) {
std::wstring wString(str);
wString.erase(std::remove(wString.begin(), wString.end(), L' '), wString.end());
LPCWSTR wstr = wString.c_str();
if (wcsncmp(wstr, L"0x", 2) == 0 || wcsncmp(wstr, L"0b", 2) == 0) {
*value = (uint16_t)wcstol(wstr, NULL, 0);
return true;
}
return false;
}
static HRESULT ParseDataToFloat(PCWSTR str, float &value) {
std::wstring wString(str);
wString.erase(std::remove(wString.begin(), wString.end(), L' '), wString.end());
@ -3109,13 +3120,19 @@ HRESULT TableParameterHandler::ParseTableRow() {
}
table[i].m_halfTable.resize(tempTable.GetSize());
for (size_t j = 0, end = tempTable.GetSize(); j != end; ++j) {
float val;
ParseDataToFloat(tempTable[j], val);
if (isdenorm(val))
table[i].m_halfTable[j] = signbit(val) ? Float16NegDenorm : Float16PosDenorm;
else
table[i].m_halfTable[j] = ConvertFloat32ToFloat16(val);
}
uint16_t value = 0;
if (IsHexString(tempTable[j], &value)) {
table[i].m_halfTable[j] = value;
}
else {
float val;
ParseDataToFloat(tempTable[j], val);
if (isdenorm(val))
table[i].m_halfTable[j] = signbit(val) ? Float16NegDenorm : Float16PosDenorm;
else
table[i].m_halfTable[j] = ConvertFloat32ToFloat16(val);
}
}
break;
}
case TableParameter::DOUBLE_TABLE: {
@ -3543,7 +3560,7 @@ TEST_F(ExecutionTest, BinaryHalfOpTest) {
for (size_t i = 0; i < count; ++i) {
SBinaryHalfOp *p = &pPrimitives[i];
p->input1 = (*Validation_Input1)[i % Validation_Input1->size()];
p->input2 = (*Validation_Input1)[i % Validation_Input1->size()];
p->input2 = (*Validation_Input2)[i % Validation_Input2->size()];
}
// use shader from data table

Просмотреть файл

@ -272,7 +272,7 @@ inline uint16_t ConvertFloat32ToFloat16(float val) {
if (isLessThanNormal) {
// Compute Denormal result
return (uint16_t)(Abs.f_bits * *(float*)(&DenormalRatio)) | sign;
return (uint16_t)(Abs.f_bits * *(float*)(&DenormalRatio)) | (sign >> 16);
}
else if (isInfOrNaN) {
// Compute Inf or Nan result

Просмотреть файл

@ -514,7 +514,7 @@
<Parameter Name="Validation.Expected1">
<Value>NaN</Value>
<Value>NaN</Value>
<Value>-0</Value>
<Value>NaN</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>0</Value>
@ -1449,7 +1449,7 @@
<Value>-0</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>0</Value>
<Value>1</Value>
<Value>Inf</Value>
<Value>10.0</Value>
<Value>11.0</Value>
@ -1665,7 +1665,7 @@
<Parameter Name="Validation.Expected1">
<Value>NaN</Value>
<Value>-Inf</Value>
<Value>-0</Value>
<Value>-1</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>0</Value>
@ -1715,8 +1715,8 @@
<Value>0</Value>
<Value>0</Value>
<Value>NaN</Value>
<Value>-0.1585929</Value>
<Value>0.1585929</Value>
<Value>-0.1585929</Value>
</Parameter>
<Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
</Row>
@ -1875,7 +1875,7 @@
<Value>-1</Value>
<Value>2.719</Value>
<Value>1000.5</Value>
<Value>-7.39</Value>
<Value>0xC764</Value>
</Parameter>
<Parameter Name="Validation.Expected1">
<Value>NaN</Value>
@ -1888,7 +1888,7 @@
<Value>0</Value>
<Value>0.719</Value>
<Value>0.5</Value>
<Value>0.61</Value>
<Value>0x38E1</Value>
</Parameter>
<Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
</Row>
@ -2003,10 +2003,10 @@
<Parameter Name="Validation.Expected1">
<Value>NaN</Value>
<Value>NaN</Value>
<Value>-0</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>0</Value>
<Value>1.0</Value>
<Value>1.0</Value>
<Value>1.0</Value>
<Value>1.0</Value>
<Value>NaN</Value>
<Value>0.987344</Value>
<Value>0.987344</Value>
@ -2074,25 +2074,25 @@
<Value>-denorm</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>denorm</Value>
<Value>0x03FF</Value>
<Value>Inf</Value>
<Value>-1</Value>
<Value>16.0</Value>
<Value>256.0</Value>
<Value>65500</Value>
<Value>0x7bff</Value>
</Parameter>
<Parameter Name="Validation.Expected1">
<Value>NaN</Value>
<Value>NaN</Value>
<Value>-Inf</Value>
<Value>NaN</Value>
<Value>-Inf</Value>
<Value>Inf</Value>
<Value>Inf</Value>
<Value>0x5800</Value>
<Value>0</Value>
<Value>NaN</Value>
<Value>0.25</Value>
<Value>0.0625</Value>
<Value>0.00001526</Value>
<Value>0x1C00</Value>
</Parameter>
<Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
</Row>
@ -2117,7 +2117,7 @@
<Value>-denorm</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>denorm</Value>
<Value>0x03FF</Value>
<Value>Inf</Value>
<Value>-1</Value>
<Value>2</Value>
@ -2127,13 +2127,13 @@
<Parameter Name="Validation.Expected1">
<Value>NaN</Value>
<Value>NaN</Value>
<Value>-0</Value>
<Value>-0</Value>
<Value>NaN</Value>
<Value>0</Value>
<Value>0</Value>
<Value>0x1FFF</Value>
<Value>Inf</Value>
<Value>NaN</Value>
<Value>1.41421356237</Value>
<Value>1.41421</Value>
<Value>4.0</Value>
<Value>16.0</Value>
</Parameter>
@ -2203,7 +2203,7 @@
l.output2 = max(l.input1, l.input2);
g_buf[GI] = l;
};</Parameter>
<Parameter Name="ShaderOp.Target">cs_6_0</Parameter>
<Parameter Name="ShaderOp.Target">cs_6_2</Parameter>
<Parameter Name="Validation.Input1">
<Value>-inf</Value>
<Value>-inf</Value>
@ -2280,6 +2280,7 @@
<Value>-1.0</Value>
<Value>1.0</Value>
</Parameter>
<Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
</Row>
<Row Name="FMulHalf">
<Parameter Name="Validation.Type">ulp</Parameter>
@ -2422,10 +2423,9 @@
<Parameter Name="Validation.Input1">
<Value>NaN</Value>
<Value>-Inf</Value>
<Value>-denorm</Value>
<Value>0x03FF</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>denorm</Value>
<Value>Inf</Value>
<Value>1.0</Value>
<Value>-1.0</Value>
@ -2436,10 +2436,9 @@
<Parameter Name="Validation.Input2">
<Value>NaN</Value>
<Value>-Inf</Value>
<Value>-denorm</Value>
<Value>1</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>denorm</Value>
<Value>Inf</Value>
<Value>1.0</Value>
<Value>-1.0</Value>
@ -2450,10 +2449,9 @@
<Parameter Name="Validation.Input3">
<Value>NaN</Value>
<Value>-Inf</Value>
<Value>-denorm</Value>
<Value>0x03FF</Value>
<Value>-0</Value>
<Value>0</Value>
<Value>denorm</Value>
<Value>Inf</Value>
<Value>1.0</Value>
<Value>-1.0</Value>
@ -2464,8 +2462,7 @@
<Parameter Name="Validation.Expected1">
<Value>NaN</Value>
<Value>NaN</Value>
<Value>0</Value>
<Value>0</Value>
<Value>0x07FE</Value>
<Value>0</Value>
<Value>0</Value>
<Value>Inf</Value>
@ -3537,7 +3534,7 @@
<Value>0</Value>
<Value>0</Value>
<Value>40</Value>
<Value>10001</Value>
<Value>10100</Value>
<Value>0</Value>
</Parameter>
<Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
@ -3839,7 +3836,7 @@
<Parameter Name="Validation.Expected1">
<Value>-32768</Value>
<Value>-20</Value>
<Value>-3114</Value>
<Value>3114</Value>
<Value>-272</Value>
<Value>-5</Value>
<Value>32767</Value>

Просмотреть файл

@ -546,9 +546,11 @@ g_denorm_tests = ["FAddDenormAny", "FAddDenormFTZ", "FAddDenormPreserve",
"FMinDenormAny", "FMinDenormFTZ", "FMinDenormPreserve",
"FMaxDenormAny", "FMaxDenormFTZ", "FMaxDenormPreserve"]
# This is a collection of test case for driver tests per instruction
# Warning: For test cases, when you want to pass in signed integer,
# Warning: For test cases, when you want to pass in signed 32-bit integer,
# make sure to pass in negative numbers with decimal values instead of hexadecimal representation.
# For some reason, TAEF is not handling them properly.
# For half values, hex is preferable since the test framework will read string as float values
# and convert them to float16, possibly losing precision. The test will read hex values as it is.
def add_test_cases():
nan = float('nan')
p_inf = float('inf')
@ -566,8 +568,8 @@ def add_test_cases():
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314',
'314'
]], half_outputs=[[
'NaN', 'NaN', '-0', '-0', '0', '0', 'NaN', '-0.1585929',
'0.1585929'
'NaN', 'NaN', '-0', '-0', '0', '0', 'NaN', '0.1585929',
'-0.1585929'
]])
add_test_case_float_half('Cos', ['Cos'], 'Epsilon', 0.0008, [[
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314.16',
@ -579,7 +581,7 @@ def add_test_cases():
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314',
'314'
]], half_outputs=[[
'NaN', 'NaN', '-0', '-0', '0', '0', 'NaN', '0.987344',
'NaN', 'NaN', '1.0', '1.0', '1.0', '1.0', 'NaN', '0.987344',
'0.987344'
]])
add_test_case_float_half('Tan', ['Tan'], 'Epsilon', 0.0008, [[
@ -641,10 +643,10 @@ def add_test_cases():
'0.611'
]], "unary float", "frac",
half_inputs=[['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '2.719',
'1000.5', '-7.39']],
'1000.5', '0xC764']],
half_outputs=[[
'NaN', 'NaN', '0', '0', '0', '0', 'NaN', '0', '0.719', '0.5',
'0.61']])
'0x38E1']])
add_test_case_float_half('Log', ['Log'], 'Relative', 21, [[
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1',
'2.718281828', '7.389056', '100'
@ -662,9 +664,11 @@ def add_test_cases():
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '2',
'16.0', '256.0'
]], [[
'NaN', 'NaN', '-0', '-0', '0', '0', 'Inf', 'NaN', '1.41421356237',
'NaN', 'NaN', 'NaN', '-0', '0', '0', 'Inf', 'NaN', '1.41421356237',
'4.0', '16.0'
]], "unary float", "sqrt")
]], "unary float", "sqrt",
half_inputs=[['NaN', '-Inf', '-denorm', '-0', '0', '0x03FF', 'Inf', '-1', '2', '16.0', '256.0']],
half_outputs=[['NaN', 'NaN', 'NaN', '0', '0', '0x1FFF', 'Inf', 'NaN', '1.41421', '4.0', '16.0']])
add_test_case_float_half('Rsqrt', ['Rsqrt'], 'ulp', 1, [[
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '16.0',
'256.0', '65536.0'
@ -672,11 +676,11 @@ def add_test_cases():
'NaN', 'NaN', '-Inf', '-Inf', 'Inf', 'Inf', '0', 'NaN', '0.25',
'0.0625', '0.00390625'
]], "unary float", "rsqrt", half_inputs=[[
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '16.0',
'256.0', '65500'
'NaN', '-Inf', '-denorm', '-0', '0', '0x03FF', 'Inf', '-1', '16.0',
'256.0', '0x7bff'
]], half_outputs=[[
'NaN', 'NaN', '-Inf', '-Inf', 'Inf', 'Inf', '0', 'NaN', '0.25',
'0.0625', '0.00001526'
'NaN', 'NaN', 'NaN', '-Inf', 'Inf', '0x5800', '0', 'NaN', '0.25',
'0.0625', '0x1C00'
]])
add_test_case_float_half('Round_ne', ['Round_ne'], 'Epsilon', 0, [[
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
@ -691,12 +695,22 @@ def add_test_cases():
]], [[
'NaN', '-Inf', '-0', '-0', '0', '0', 'Inf', '10.0', '10.0', '10.0',
'10.0', '-10.0', '-11.0', '-11.0', '-11.0'
]], "unary float", "floor")
]], "unary float", "floor", half_inputs=[[
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
'10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6'
]], half_outputs=[[
'NaN', '-Inf', '-1', '-0', '0', '0', 'Inf', '10.0', '10.0', '10.0',
'10.0', '-10.0', '-11.0', '-11.0', '-11.0'
]])
add_test_case_float_half('Round_pi', ['Round_pi'], 'Epsilon', 0,
[['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
'10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6']],
[['NaN', '-Inf', '-0', '-0', '0', '0', 'Inf', '10.0', '11.0', '11.0',
'11.0', '-10.0', '-10.0', '-10.0', '-10.0']], "unary float", "ceil")
'11.0', '-10.0', '-10.0', '-10.0', '-10.0']], "unary float", "ceil",
half_inputs=[['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
'10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6']],
half_outputs=[['NaN', '-Inf', '-0', '-0', '0', '1', 'Inf', '10.0', '11.0', '11.0',
'11.0', '-10.0', '-10.0', '-10.0', '-10.0']])
add_test_case_float_half('Round_z', ['Round_z'], 'Epsilon', 0,
[['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
'10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6']],
@ -753,7 +767,7 @@ def add_test_cases():
], [
'-inf', 'inf', '1.0', '-inf', 'inf', 'inf', 'inf', 'inf', '-inf',
'inf', '1.0', 'NaN', '1.0', 'inf', '1.0', '-1.0', '1.0'
]], 'cs_6_0', ''' struct SBinaryHalfOp {
]], 'cs_6_2', ''' struct SBinaryHalfOp {
half input1;
half input2;
half output1;
@ -766,7 +780,7 @@ def add_test_cases():
l.output1 = min(l.input1, l.input2);
l.output2 = max(l.input1, l.input2);
g_buf[GI] = l;
};''')
};''', shader_arguments="-enable-16bit-types")
add_test_case_float_half('FAdd', ['FAdd'], 'ulp', 1, [['-1.0', '1.0', '32.5', '1.0000001000'],['4', '5.5', '334.7', '0.5000001000']], [['3.0', '6.5', '367.2', '1.5000002000']],
"binary float", "+")
add_test_case_float_half('FSub', ['FSub'], 'ulp', 1, [['-1.0', '5.5', '32.5', '1.0000001000'],['4', '1.25', '334.7', '0.5000001000']], [['-5', '4.25', '-302.2', '0.5000']],
@ -808,7 +822,18 @@ def add_test_cases():
'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '1.0', '-1.0',
'1', '0', '-5.5'
]], [['NaN', 'NaN', '0', '0', '0', '0', 'Inf', '2', '0', '1', '1', '9.5']],
"tertiary float", "mad")
"tertiary float", "mad",
half_inputs=[[
'NaN', '-Inf', '0x03FF', '-0', '0', 'Inf', '1.0', '-1.0',
'0', '1', '1.5'
], [
'NaN', '-Inf', '1', '-0', '0', 'Inf', '1.0', '-1.0',
'0', '1', '10'
], [
'NaN', '-Inf', '0x03FF', '-0', '0', 'Inf', '1.0', '-1.0',
'1', '0', '-5.5'
]],
half_outputs=[['NaN', 'NaN', '0x07FE', '0', '0', 'Inf', '2', '0', '1', '1', '9.5']])
# Denorm Tertiary Float
add_test_case_denorm('FMadDenorm', ['FMad'], 'ulp', 1,
@ -882,7 +907,7 @@ def add_test_cases():
"binary int", "-",
input_16=[[int16_min, '-10', '0', '0', '10', int16_max],
['0', '10', '-3114', '272', '15', '0']],
output_16=[[int16_min, '-20', '-3114', '-272', '-5', int16_max]])
output_16=[[int16_min, '-20', '3114', '-272', '-5', int16_max]])
add_test_case_int('IMax', ['IMax'], 'Epsilon', 0,
[[int32_min, '-10', '0', '0', '10', int32_max],
['0', '10', '-10', '10', '10', '0']],
@ -1011,7 +1036,7 @@ def add_test_cases():
"binary uint", "*",
input_16=[['0', '0', '10', '100', int16_max],
['0', '256', '4', '101', '0']],
output_16=[['0', '0', '40', '10001', '0']])
output_16=[['0', '0', '40', '10100', '0']])
add_test_case('UDiv', ['UDiv', 'URem'], 'Epsilon', 0,
[['1', '1', '10', '10000', int32_max, int32_max, '0xffffffff'],
['0', '256', '4', '10001', '0', int32_max, '1']],
@ -1669,6 +1694,7 @@ def generate_table_for_taef():
print(cur_inst.dxil_class)
tree._setroot(root)
tree.write(f)
print("Saved file at: " + f.name)
f.close()
def print_untested_inst():