#pragma once #include #include namespace at::vec { inline namespace CPU_CAPABILITY { template < typename dst_t, int dst_n, typename src_t, int src_n, typename Enabled = void> struct VecConvert { static inline VectorizedN apply( const VectorizedN& src) { constexpr int count = std::min( VectorizedN::size(), VectorizedN::size()); __at_align__ src_t src_buf[VectorizedN::size()]; src.store(src_buf); __at_align__ dst_t dst_buf[VectorizedN::size()]; for (int i = 0; i < count; i++) { dst_buf[i] = static_cast(src_buf[i]); } return VectorizedN::loadu(dst_buf, count); } }; template inline std::enable_if_t, Vectorized> convert( const Vectorized& src) { return src; } template inline std::enable_if_t, Vectorized> convert(const Vectorized& src) { return VecConvert::apply(src); } template < typename dst_t, int dst_n, typename src_t, int src_n, std::enable_if_t = 0> inline VectorizedN convert(const VectorizedN& src) { return VecConvert::apply(src); } template < typename dst_t, int dst_n, typename src_t, int src_n, bool keep = false, std::enable_if_t = 0> inline std::conditional_t, Vectorized> convert(const VectorizedN& src) { return VecConvert::apply(src); } } // namespace CPU_CAPABILITY template < typename scalar_t, typename std::enable_if_t, int> = 0> inline std::tuple, Vectorized> convert_to_float( const Vectorized&); template < typename scalar_t, typename std::enable_if_t, int> = 0> inline Vectorized convert_from_float( const Vectorized&, const Vectorized&); } // namespace at::vec