aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--reference_model/src/generate/generate_utils.cc5
-rw-r--r--reference_model/src/verify/verify_abs_error.cc2
-rw-r--r--reference_model/src/verify/verify_ulp.cc9
-rw-r--r--reference_model/src/verify/verify_utils.cc13
-rw-r--r--verif/conformance/tosa_main_profile_ops_info.json35
-rw-r--r--verif/generator/tosa_test_gen.py153
6 files changed, 98 insertions, 119 deletions
diff --git a/reference_model/src/generate/generate_utils.cc b/reference_model/src/generate/generate_utils.cc
index 5546269..d2168c9 100644
--- a/reference_model/src/generate/generate_utils.cc
+++ b/reference_model/src/generate/generate_utils.cc
@@ -43,11 +43,14 @@ NLOHMANN_JSON_SERIALIZE_ENUM(Op,
{ Op::Op_ARGMAX, "ARGMAX" },
{ Op::Op_AVG_POOL2D, "AVG_POOL2D" },
{ Op::Op_CEIL, "CEIL" },
+ { Op::Op_CLAMP, "CLAMP" },
{ Op::Op_CONV2D, "CONV2D" },
+ { Op::Op_ERF, "ERF" },
{ Op::Op_EXP, "EXP" },
{ Op::Op_FLOOR, "FLOOR" },
{ Op::Op_FULLY_CONNECTED, "FULLY_CONNECTED" },
{ Op::Op_IDENTITY, "IDENTITY" },
+ { Op::Op_LOG, "LOG" },
{ Op::Op_MATMUL, "MATMUL" },
{ Op::Op_MAXIMUM, "MAXIMUM" },
{ Op::Op_MAX_POOL2D, "MAX_POOL2D" },
@@ -61,7 +64,9 @@ NLOHMANN_JSON_SERIALIZE_ENUM(Op,
{ Op::Op_REDUCE_MAX, "REDUCE_MAX" },
{ Op::Op_REDUCE_MIN, "REDUCE_MIN" },
{ Op::Op_REDUCE_SUM, "REDUCE_SUM" },
+ { Op::Op_SIGMOID, "SIGMOID" },
{ Op::Op_SUB, "SUB" },
+ { Op::Op_TANH, "TANH" },
})
} // namespace tosa
diff --git a/reference_model/src/verify/verify_abs_error.cc b/reference_model/src/verify/verify_abs_error.cc
index 1afa7fd..b43da08 100644
--- a/reference_model/src/verify/verify_abs_error.cc
+++ b/reference_model/src/verify/verify_abs_error.cc
@@ -32,7 +32,7 @@ bool validateData(const double* ref, const double* bnd, const float* imp, const
for (size_t i = 0; i < T; ++i)
{
- double errBound = ref[i] * exp2(-AccPrecision<float>::normal_frac) * bnd[i];
+ double errBound = std::abs(ref[i]) * exp2(-AccPrecision<float>::normal_frac) * bnd[i];
bool valid = tosaCheckFloatBound(imp[i], ref[i], errBound);
if (!valid)
{
diff --git a/reference_model/src/verify/verify_ulp.cc b/reference_model/src/verify/verify_ulp.cc
index b333810..6e78b96 100644
--- a/reference_model/src/verify/verify_ulp.cc
+++ b/reference_model/src/verify/verify_ulp.cc
@@ -30,15 +30,8 @@ bool tosaCheckULP(float testValue, double referenceValue, double ulpNum)
double errorBound = 0.0;
if (std::isfinite(referenceValue) && std::abs(referenceValue) != 0.0)
{
- // Make the sign of the reference value positive
- // and adjust the test value appropriately.
- if (referenceValue < 0)
- {
- referenceValue = -referenceValue;
- testValue = -testValue;
- }
// Find the exponent of the reference value.
- int32_t referenceExponent = ilog2(referenceValue);
+ int32_t referenceExponent = ilog2(std::abs(referenceValue));
// Work out the values magnitude - by raising 2 to the power of the
// exponent and taking the normalized minimum for denormal values
diff --git a/reference_model/src/verify/verify_utils.cc b/reference_model/src/verify/verify_utils.cc
index 414f7d7..9aa6ba2 100644
--- a/reference_model/src/verify/verify_utils.cc
+++ b/reference_model/src/verify/verify_utils.cc
@@ -170,7 +170,11 @@ DType mapToDType(tosa_datatype_t dataType)
// Like const_exp2 but for use during runtime
double exp2(int32_t n)
{
- TOSA_REF_REQUIRE(-1022 <= n && n <= 1023, " Invalid exponent value (%d) in exp2", n);
+ if (n < -1075)
+ {
+ return 0.0; // smaller than smallest denormal
+ }
+ TOSA_REF_REQUIRE(n <= 1023, " Invalid exponent value (%d) in exp2", n);
return const_exp2(n);
}
@@ -212,6 +216,9 @@ bool tosaCheckFloatBound(float testValue, double referenceValue, double errorBou
return false;
}
+ // Check the errorBound
+ TOSA_REF_REQUIRE(errorBound >= 0.f, " Invalid error bound (%g)", errorBound);
+
// Make the sign of the reference value positive
// and adjust the test value appropriately.
if (referenceValue < 0)
@@ -219,10 +226,6 @@ bool tosaCheckFloatBound(float testValue, double referenceValue, double errorBou
referenceValue = -referenceValue;
testValue = -testValue;
}
- if (errorBound < 0)
- {
- errorBound = -errorBound;
- }
// At this point we are ready to calculate the ULP bounds for the reference value.
double referenceMin, referenceMax;
diff --git a/verif/conformance/tosa_main_profile_ops_info.json b/verif/conformance/tosa_main_profile_ops_info.json
index 87b14c2..35d72e8 100644
--- a/verif/conformance/tosa_main_profile_ops_info.json
+++ b/verif/conformance/tosa_main_profile_ops_info.json
@@ -403,6 +403,7 @@
"profile": [
"tosa-mi"
],
+ "support_for": [ "lazy_data_gen" ],
"generation": {
"standard": {
"generator_args": [
@@ -414,7 +415,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-max,max",
"--tensor-dim-range",
"20,64",
"--target-rank",
@@ -432,7 +433,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-max,max",
"--tensor-dim-range",
"1,20",
"--target-rank",
@@ -444,7 +445,7 @@
"--target-dtype",
"fp32",
"--fp-values-range",
- "-2.0,2.0",
+ "-max,max",
"--target-shape",
"1,2,1,65536",
"--target-shape",
@@ -1369,6 +1370,7 @@
"profile": [
"tosa-mi"
],
+ "support_for": [ "lazy_data_gen" ],
"generation": {
"standard": {
"generator_args": [
@@ -1382,7 +1384,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-max,max",
"--tensor-dim-range",
"15,64",
"--target-rank",
@@ -1398,7 +1400,7 @@
"--target-dtype",
"fp32",
"--fp-values-range",
- "-2.0,2.0",
+ "-max,max",
"--tensor-dim-range",
"1,15",
"--target-rank",
@@ -1412,7 +1414,7 @@
"--target-dtype",
"fp16",
"--fp-values-range",
- "-2.0,2.0",
+ "-max,max",
"--target-shape",
"1,65530,1,2",
"--target-shape",
@@ -2748,6 +2750,7 @@
"profile": [
"tosa-mi"
],
+ "support_for": [ "lazy_data_gen" ],
"generation": {
"standard": {
"generator_args": [
@@ -2759,7 +2762,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-16.0,16.0",
"--tensor-dim-range",
"16,64",
"--target-rank",
@@ -2777,7 +2780,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-16.0,16.0",
"--tensor-dim-range",
"1,19",
"--target-rank",
@@ -2789,7 +2792,7 @@
"--target-dtype",
"fp32",
"--fp-values-range",
- "-2.0,2.0",
+ "-16.0,16.0",
"--target-shape",
"1,2,65538,2,1",
"--target-shape",
@@ -2946,6 +2949,7 @@
"profile": [
"tosa-mi"
],
+ "support_for": [ "lazy_data_gen" ],
"generation": {
"standard": {
"generator_args": [
@@ -2957,7 +2961,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-8.0,8.0",
"--tensor-dim-range",
"18,60",
"--target-rank",
@@ -2975,7 +2979,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-8.0,8.0",
"--tensor-dim-range",
"1,24",
"--target-rank",
@@ -2987,7 +2991,7 @@
"--target-dtype",
"fp32",
"--fp-values-range",
- "-2.0,2.0",
+ "-8.0,8.0",
"--target-shape",
"1,65535,2,1,1",
"--target-shape",
@@ -3011,6 +3015,7 @@
"profile": [
"tosa-mi"
],
+ "support_for": [ "lazy_data_gen" ],
"generation": {
"standard": {
"generator_args": [
@@ -3022,7 +3027,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-4.0,4.0",
"--tensor-dim-range",
"18,60",
"--target-rank",
@@ -3040,7 +3045,7 @@
"--target-dtype",
"bf16",
"--fp-values-range",
- "-2.0,2.0",
+ "-4.0,4.0",
"--tensor-dim-range",
"1,24",
"--target-rank",
@@ -3052,7 +3057,7 @@
"--target-dtype",
"fp32",
"--fp-values-range",
- "-2.0,2.0",
+ "-4.0,4.0",
"--target-shape",
"1,65535,2,1,1",
"--target-shape",
diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py
index 9f65fd4..04093b8 100644
--- a/verif/generator/tosa_test_gen.py
+++ b/verif/generator/tosa_test_gen.py
@@ -405,13 +405,9 @@ class TosaTestGen:
self.ser.addOperator(op["op"], input_list, output_list, attr)
- if op["op"] in (Op.LOG,):
- # TODO - add compliance support LOG
- compliance = None
- else:
- compliance = self.tensorComplianceMetaData(
- op, a.dtype, args_dict, result_tensor, error_name
- )
+ compliance = self.tensorComplianceMetaData(
+ op, a.dtype, args_dict, result_tensor, error_name
+ )
return TosaTestGen.BuildInfo(result_tensor, compliance)
def build_binary_broadcast(
@@ -1241,8 +1237,13 @@ class TosaTestGen:
return TosaTestGen.BuildInfo(result_tensor, compliance)
- def build_clamp(self, op, a, validator_fcns=None, error_name=None):
- result_tens = OutputShaper.unaryOp(self.ser, self.rng, a, error_name)
+ def build_clamp(
+ self, op, inputs, args_dict, validator_fcns=None, error_name=None, qinfo=None
+ ):
+ assert len(inputs) == 1
+ a = inputs[0]
+
+ result_tensor = OutputShaper.unaryOp(self.ser, self.rng, a, error_name)
v = [self.getRandNumberDType(a.dtype), self.getRandNumberDType(a.dtype)]
@@ -1258,7 +1259,7 @@ class TosaTestGen:
# Invalidate Input/Output list for error if checks.
input_list = [a.name]
- output_list = [result_tens.name]
+ output_list = [result_tensor.name]
pCount, cCount = op["operands"]
num_operands = pCount + cCount
input_list, output_list = TosaErrorIfArgGen.eiInvalidateInputOutputList(
@@ -1273,10 +1274,10 @@ class TosaTestGen:
max_val=max_val,
min_val=min_val,
input_shape=a.shape,
- output_shape=result_tens.shape,
+ output_shape=result_tensor.shape,
input_dtype=a.dtype,
- output_dtype=result_tens.dtype,
- result_tensors=[result_tens],
+ output_dtype=result_tensor.dtype,
+ result_tensors=[result_tensor],
input_list=input_list,
output_list=output_list,
num_operands=num_operands,
@@ -1295,7 +1296,12 @@ class TosaTestGen:
attr.ClampAttribute(self.ser.builder, min_val, max_val, 0, 0)
self.ser.addOperator(op["op"], input_list, output_list, attr)
- return result_tens
+
+ compliance = self.tensorComplianceMetaData(
+ op, a.dtype, args_dict, result_tensor, error_name
+ )
+
+ return TosaTestGen.BuildInfo(result_tensor, compliance)
def build_leaky_relu(self, op, a, validator_fcns=None, error_name=None):
result_tens = OutputShaper.unaryOp(self.ser, self.rng, a, error_name)
@@ -1313,43 +1319,17 @@ class TosaTestGen:
self.ser.addOperator(op["op"], [a.name], [result_tens.name])
return result_tens
- def build_sigmoid(self, op, a, validator_fcns=None, error_name=None):
- result_tens = OutputShaper.unaryOp(self.ser, self.rng, a, error_name)
-
- # Invalidate Input/Output list for error if checks.
- input_list = [a.name]
- output_list = [result_tens.name]
- pCount, cCount = op["operands"]
- num_operands = pCount + cCount
- input_list, output_list = TosaErrorIfArgGen.eiInvalidateInputOutputList(
- self, error_name, input_list, output_list
- )
-
- if not TosaErrorValidator.evValidateErrorIfs(
- self.ser,
- validator_fcns,
- error_name,
- op=op,
- input_shape=a.shape,
- output_shape=result_tens.shape,
- input_dtype=a.dtype,
- output_dtype=result_tens.dtype,
- result_tensors=[result_tens],
- input_list=input_list,
- output_list=output_list,
- num_operands=num_operands,
- ):
- return None
-
- self.ser.addOperator(op["op"], input_list, output_list)
- return result_tens
+ def build_activation(
+ self, op, inputs, args_dict, validator_fcns=None, error_name=None, qinfo=None
+ ):
+ assert len(inputs) == 1
+ a = inputs[0]
- def build_tanh(self, op, a, validator_fcns=None, error_name=None):
- result_tens = OutputShaper.unaryOp(self.ser, self.rng, a, error_name)
+ result_tensor = OutputShaper.unaryOp(self.ser, self.rng, a, error_name)
# Invalidate Input/Output list for error if checks.
input_list = [a.name]
- output_list = [result_tens.name]
+ output_list = [result_tensor.name]
pCount, cCount = op["operands"]
num_operands = pCount + cCount
input_list, output_list = TosaErrorIfArgGen.eiInvalidateInputOutputList(
@@ -1362,10 +1342,10 @@ class TosaTestGen:
error_name,
op=op,
input_shape=a.shape,
- output_shape=result_tens.shape,
+ output_shape=result_tensor.shape,
input_dtype=a.dtype,
- output_dtype=result_tens.dtype,
- result_tensors=[result_tens],
+ output_dtype=result_tensor.dtype,
+ result_tensors=[result_tensor],
input_list=input_list,
output_list=output_list,
num_operands=num_operands,
@@ -1373,38 +1353,12 @@ class TosaTestGen:
return None
self.ser.addOperator(op["op"], input_list, output_list)
- return result_tens
-
- def build_erf(self, op, a, validator_fcns=None, error_name=None):
- result_tens = OutputShaper.unaryOp(self.ser, self.rng, a, error_name)
- # Invalidate Input/Output list for error if checks.
- input_list = [a.name]
- output_list = [result_tens.name]
- pCount, cCount = op["operands"]
- num_operands = pCount + cCount
- input_list, output_list = TosaErrorIfArgGen.eiInvalidateInputOutputList(
- self, error_name, input_list, output_list
+ compliance = self.tensorComplianceMetaData(
+ op, a.dtype, args_dict, result_tensor, error_name
)
- if not TosaErrorValidator.evValidateErrorIfs(
- self.ser,
- validator_fcns,
- error_name,
- op=op,
- input_shape=a.shape,
- output_shape=result_tens.shape,
- input_dtype=a.dtype,
- output_dtype=result_tens.dtype,
- result_tensors=[result_tens],
- input_list=input_list,
- output_list=output_list,
- num_operands=num_operands,
- ):
- return None
-
- self.ser.addOperator(op["op"], input_list, output_list)
- return result_tens
+ return TosaTestGen.BuildInfo(result_tensor, compliance)
def build_concat(
self, op, inputs, args_dict, validator_fcns=None, error_name=None, qinfo=None
@@ -3220,8 +3174,8 @@ class TosaTestGen:
"build_fcn": (
build_clamp,
TosaTensorGen.tgBasic,
- TosaTensorValuesGen.tvgDefault,
- None,
+ TosaTensorValuesGen.tvgLazyGenDefault,
+ TosaArgGen.agNone,
),
"types": TYPE_NARROW_INT_FP,
"error_if_validators": (
@@ -3231,15 +3185,18 @@ class TosaTestGen:
TosaErrorValidator.evWrongInputList,
TosaErrorValidator.evWrongOutputList,
),
+ "data_gen": {
+ "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+ },
},
"sigmoid": {
"op": Op.SIGMOID,
"operands": (1, 0),
"build_fcn": (
- build_sigmoid,
+ build_activation,
TosaTensorGen.tgBasic,
- TosaTensorValuesGen.tvgDefault,
- None,
+ TosaTensorValuesGen.tvgLazyGenDefault,
+ TosaArgGen.agNone,
),
"types": TYPE_FP,
"error_if_validators": (
@@ -3248,15 +3205,19 @@ class TosaTestGen:
TosaErrorValidator.evWrongInputList,
TosaErrorValidator.evWrongOutputList,
),
+ "data_gen": {
+ "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+ },
+ "compliance": {"ulp": 5},
},
"tanh": {
"op": Op.TANH,
"operands": (1, 0),
"build_fcn": (
- build_tanh,
+ build_activation,
TosaTensorGen.tgBasic,
- TosaTensorValuesGen.tvgDefault,
- None,
+ TosaTensorValuesGen.tvgLazyGenDefault,
+ TosaArgGen.agNone,
),
"types": TYPE_FP,
"error_if_validators": (
@@ -3265,15 +3226,19 @@ class TosaTestGen:
TosaErrorValidator.evWrongInputList,
TosaErrorValidator.evWrongOutputList,
),
+ "data_gen": {
+ "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+ },
+ "compliance": {"ulp": 5},
},
"erf": {
"op": Op.ERF,
"operands": (1, 0),
"build_fcn": (
- build_erf,
+ build_activation,
TosaTensorGen.tgBasic,
- TosaTensorValuesGen.tvgDefault,
- None,
+ TosaTensorValuesGen.tvgLazyGenDefault,
+ TosaArgGen.agNone,
),
"types": TYPE_FP,
"error_if_validators": (
@@ -3282,6 +3247,10 @@ class TosaTestGen:
TosaErrorValidator.evWrongInputList,
TosaErrorValidator.evWrongOutputList,
),
+ "data_gen": {
+ "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+ },
+ "compliance": {"ulp": 5},
},
# Elementwise Binary Operators
"add": {
@@ -3778,6 +3747,10 @@ class TosaTestGen:
TosaErrorValidator.evWrongInputList,
TosaErrorValidator.evWrongOutputList,
),
+ "data_gen": {
+ "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+ },
+ "compliance": {"ulp": 5},
},
"logical_not": {
"op": Op.LOGICAL_NOT,