aboutsummaryrefslogtreecommitdiff
path: root/reference_model/src/verify
diff options
context:
space:
mode:
Diffstat (limited to 'reference_model/src/verify')
-rw-r--r--reference_model/src/verify/verifiers.h11
-rw-r--r--reference_model/src/verify/verify_entry.cc3
-rw-r--r--reference_model/src/verify/verify_relative.cc83
-rw-r--r--reference_model/src/verify/verify_utils.cc11
-rw-r--r--reference_model/src/verify/verify_utils.h13
5 files changed, 120 insertions, 1 deletions
diff --git a/reference_model/src/verify/verifiers.h b/reference_model/src/verify/verifiers.h
index 6830115..80b6e19 100644
--- a/reference_model/src/verify/verifiers.h
+++ b/reference_model/src/verify/verifiers.h
@@ -71,6 +71,17 @@ bool verifyULP(const CTensor* referenceTensor, const CTensor* implementationTens
/// \return True if compliant else false
bool verifyAbsError(const CTensor* ref, const CTensor* refBnd, const CTensor* imp, const AbsErrorVerifyInfo& aeInfo);
+/// \brief Perform relative result verification
+///
+/// \param referenceTensor Reference tensor
+/// \param implementationTensor Implementation resulting tensor
+/// \param rInfo Relative verification meta-data
+///
+/// \return True if compliant else false
+bool verifyRelative(const CTensor* referenceTensor,
+ const CTensor* implementationTensor,
+ const RelativeVerifyInfo& rInfo);
+
}; // namespace TosaReference
#endif // VERIFIERS_H_
diff --git a/reference_model/src/verify/verify_entry.cc b/reference_model/src/verify/verify_entry.cc
index afc5916..9702c36 100644
--- a/reference_model/src/verify/verify_entry.cc
+++ b/reference_model/src/verify/verify_entry.cc
@@ -43,6 +43,9 @@ bool verify(const CTensor* ref, const CTensor* refBnd, const CTensor* imp, const
case VerifyMode::AbsError: {
return verifyAbsError(ref, refBnd, imp, cfg.absErrorInfo);
}
+ case VerifyMode::Relative: {
+ return verifyRelative(ref, imp, cfg.relativeInfo);
+ }
default: {
WARNING("[Verifier] Unsupported verification mode.");
break;
diff --git a/reference_model/src/verify/verify_relative.cc b/reference_model/src/verify/verify_relative.cc
new file mode 100644
index 0000000..b12daf7
--- /dev/null
+++ b/reference_model/src/verify/verify_relative.cc
@@ -0,0 +1,83 @@
+
+// Copyright (c) 2024, ARM Limited.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cmath>
+#include <vector>
+
+#include "verifiers.h"
+#include "verify/verify_utils.h"
+
+namespace TosaReference
+{
+
+namespace
+{
+template <typename OutDtype>
+bool validateData(const double* ref,
+ const OutDtype* imp,
+ const std::vector<int32_t>& shape,
+ const RelativeVerifyInfo& cfg)
+{
+ const size_t T = static_cast<size_t>(numElements(shape));
+ TOSA_REF_REQUIRE(T > 0, "[R] Invalid shape for reference tensor");
+
+ double errBound = cfg.max * cfg.scale;
+ for (size_t i = 0; i < T; ++i)
+ {
+ bool valid = tosaCheckFloatBound(imp[i], ref[i], errBound);
+ if (!valid)
+ {
+ auto pos = indexToPosition(i, shape);
+ WARNING("[Verifier][RP] Location %s", positionToString(pos).c_str());
+ return false;
+ }
+ }
+ return true;
+}
+} // namespace
+
+bool verifyRelative(const CTensor* referenceTensor,
+ const CTensor* implementationTensor,
+ const RelativeVerifyInfo& rInfo)
+{
+ // Validate that tensors are provided
+ TOSA_REF_REQUIRE(referenceTensor != nullptr, "[R] Reference tensor is missing");
+ TOSA_REF_REQUIRE(implementationTensor != nullptr, "[R] Implementation tensor is missing");
+
+ const std::vector<int32_t> refShape(referenceTensor->shape, referenceTensor->shape + referenceTensor->num_dims);
+
+ const double* refData = reinterpret_cast<const double*>(referenceTensor->data);
+ TOSA_REF_REQUIRE(refData != nullptr, "[R] Missing data for reference");
+
+ switch (implementationTensor->data_type)
+ {
+ case tosa_datatype_fp32_t: {
+ const auto* impData = reinterpret_cast<const float*>(implementationTensor->data);
+ TOSA_REF_REQUIRE(impData != nullptr, "[R] Missing data for implementation");
+ return validateData(refData, impData, refShape, rInfo);
+ }
+ case tosa_datatype_fp16_t: {
+ const auto* impData = reinterpret_cast<const half_float::half*>(implementationTensor->data);
+ TOSA_REF_REQUIRE(impData != nullptr, "[R] Missing data for implementation");
+ return validateData(refData, impData, refShape, rInfo);
+ }
+ default:
+ WARNING("[Verifier][R] Data-type not supported.");
+ break;
+ }
+
+ return false;
+}
+} // namespace TosaReference
diff --git a/reference_model/src/verify/verify_utils.cc b/reference_model/src/verify/verify_utils.cc
index abb55eb..14bc6f1 100644
--- a/reference_model/src/verify/verify_utils.cc
+++ b/reference_model/src/verify/verify_utils.cc
@@ -52,6 +52,7 @@ NLOHMANN_JSON_SERIALIZE_ENUM(VerifyMode,
{ VerifyMode::FpSpecial, "FP_SPECIAL" },
{ VerifyMode::ReduceProduct, "REDUCE_PRODUCT" },
{ VerifyMode::AbsError, "ABS_ERROR" },
+ { VerifyMode::Relative, "RELATIVE" },
})
void from_json(const nlohmann::json& j, UlpVerifyInfo& ulpInfo)
@@ -78,6 +79,12 @@ void from_json(const nlohmann::json& j, AbsErrorVerifyInfo& absErrorInfo)
}
}
+void from_json(const nlohmann::json& j, RelativeVerifyInfo& rInfo)
+{
+ j.at("max").get_to(rInfo.max);
+ j.at("scale").get_to(rInfo.scale);
+}
+
void from_json(const nlohmann::json& j, VerifyConfig& cfg)
{
j.at("mode").get_to(cfg.mode);
@@ -100,6 +107,10 @@ void from_json(const nlohmann::json& j, VerifyConfig& cfg)
{
j.at("abs_error_info").get_to(cfg.absErrorInfo);
}
+ if (j.contains("relative_info"))
+ {
+ j.at("relative_info").get_to(cfg.relativeInfo);
+ }
}
std::optional<VerifyConfig> parseVerifyConfig(const char* tensorName, const char* json)
diff --git a/reference_model/src/verify/verify_utils.h b/reference_model/src/verify/verify_utils.h
index 0fc68fb..341bd90 100644
--- a/reference_model/src/verify/verify_utils.h
+++ b/reference_model/src/verify/verify_utils.h
@@ -46,7 +46,8 @@ enum class VerifyMode
DotProduct,
FpSpecial,
ReduceProduct,
- AbsError
+ AbsError,
+ Relative
};
/// \brief ULP verification meta-data
@@ -83,6 +84,15 @@ struct AbsErrorVerifyInfo
double lowerBound;
};
+/// \brief relative verification meta-data
+struct RelativeVerifyInfo
+{
+ RelativeVerifyInfo() = default;
+
+ double max;
+ double scale;
+};
+
/// \brief Verification meta-data
struct VerifyConfig
{
@@ -94,6 +104,7 @@ struct VerifyConfig
DotProductVerifyInfo dotProductInfo;
ReduceProductVerifyInfo reduceProductInfo;
AbsErrorVerifyInfo absErrorInfo;
+ RelativeVerifyInfo relativeInfo;
};
/// \brief Parse the verification config for a tensor when given in JSON form