/* * Copyright (c) Advanced Micro Devices, Inc., or its affiliates. * * SPDX-License-Identifier: MIT */ #pragma once #include #include #include template __host__ __device__ T MakeComplexType(decltype(T().x) input_val1, decltype(T().x) input_val2) { if constexpr (std::is_same_v) { return make_hipFloatComplex(input_val1, input_val2); } else { return make_hipDoubleComplex(input_val1, input_val2); } } template __global__ void MakeComplexTypeKernel(T* const output_val, decltype(T().x) const input_val1, decltype(T().x) const input_val2) { *output_val = MakeComplexType(input_val1, input_val2); } #if HT_AMD // EXSWHTEC-321 __global__ void MakeHipComplexTypeKernel(hipComplex* const output_val, float const input_val1, float const input_val2) { *output_val = make_hipComplex(input_val1, input_val2); } #endif template struct CastType {}; template <> struct CastType { using type = hipDoubleComplex; }; template <> struct CastType { using type = hipFloatComplex; }; template using CastType_t = typename CastType::type; template __device__ __host__ T1 CastComplexType(T2 const input_val) { if constexpr (std::is_same_v) { return hipComplexDoubleToFloat(input_val); } else if constexpr (std::is_same_v) { return hipComplexFloatToDouble(input_val); } } template __global__ void CastComplexTypeKernel(T1* const output_val, T2 const input_val) { *output_val = CastComplexType(input_val); } template void CompareValues(T actual_val, T ref_val, double margin) { if (!std::isnan(ref_val)) { REQUIRE_THAT(actual_val, Catch::Matchers::WithinAbs(ref_val, margin)); } }