// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include #include #include #include "verify.hpp" #include "../tensor_holder.hpp" namespace test_helpers { template constexpr bool is_floating_point_tensor = (std::is_same_v || std::is_floating_point_v); template constexpr bool any_float_tensors() { return (is_floating_point_tensor || ...); } template auto const& GetResultData(std::vector const& result) { return result; } template std::vector const& GetResultData(tensor const& result) { return result.data; } template constexpr double GetResultDataErrorMargin(std::vector const& /*result*/, double tolerance) { return (std::numeric_limits::epsilon() * tolerance); } template constexpr double GetResultDataErrorMargin(tensor const& /*result*/, double tolerance) { return (std::numeric_limits::epsilon() * tolerance); } template bool CompareFloatTensorTuples(LeftTuple const& left, RightTuple const& right, double tolerance, std::index_sequence) { return ( (miopen::rms_range(GetResultData(std::get(left)), GetResultData(std::get(right))) <= (GetResultDataErrorMargin(std::get(left), tolerance))) && ...); } template bool Compare(std::tuple const& cpu_result, std::tuple const& gpu_result, double tolerance) { if constexpr(any_float_tensors() || any_float_tensors()) { return CompareFloatTensorTuples( cpu_result, gpu_result, tolerance, std::index_sequence_for{}); } else { return cpu_result == gpu_result; } } template bool Compare(tensor cpu_result, tensor gpu_result, double tolerance) { double threshold = std::numeric_limits::epsilon() * tolerance; return (miopen::rms_range(cpu_result.data, gpu_result.data) <= threshold); } /// Generic comparison helper for structs using cpu() and gpu() methods template auto CompareResults(VerifyT&& verifier, double tolerance = 80.f) -> std::pair { const auto gpu_result = verifier.gpu(); const auto cpu_result = verifier.cpu(); if(!Compare(cpu_result, gpu_result, tolerance)) { verifier.fail(); } return std::make_pair(cpu_result, gpu_result); } } // namespace test_helpers