diff options
author | Jeremy Johnson <jeremy.johnson@arm.com> | 2024-02-01 15:54:07 +0000 |
---|---|---|
committer | Jeremy Johnson <jeremy.johnson@arm.com> | 2024-02-08 11:14:04 +0000 |
commit | 32d0b5af61d978d9932ac5576b42203e57881168 (patch) | |
tree | eb9f3d6d845edc0f53da06285db1e4736282b4c3 /reference_model/src/verify | |
parent | 6f57e6e665094959aed40c0e388ac81fbd118720 (diff) | |
download | reference_model-32d0b5af61d978d9932ac5576b42203e57881168.tar.gz |
Main Compliance: Add RESIZE support
Add RELATIVE verify mode for RESIZE.
Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com>
Change-Id: I4fe352579507211dae7a048bf080c24426ce42a2
Diffstat (limited to 'reference_model/src/verify')
-rw-r--r-- | reference_model/src/verify/verifiers.h | 11 | ||||
-rw-r--r-- | reference_model/src/verify/verify_entry.cc | 3 | ||||
-rw-r--r-- | reference_model/src/verify/verify_relative.cc | 83 | ||||
-rw-r--r-- | reference_model/src/verify/verify_utils.cc | 11 | ||||
-rw-r--r-- | reference_model/src/verify/verify_utils.h | 13 |
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 |