ie_precision: added FloatTrait to fix VS2015 client compilation (#5810)

This commit is contained in:
Maksim Shabunin 2021-05-26 01:04:46 +03:00 committed by GitHub
parent 0e86b095cc
commit 84392f33d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -344,72 +344,89 @@ struct PrecisionTrait {};
template <> template <>
struct PrecisionTrait<Precision::FP32> { struct PrecisionTrait<Precision::FP32> {
using value_type = float; using value_type = float;
enum { is_float = true };
}; };
template <> template <>
struct PrecisionTrait<Precision::FP64> { struct PrecisionTrait<Precision::FP64> {
using value_type = double; using value_type = double;
enum { is_float = true };
}; };
template <> template <>
struct PrecisionTrait<Precision::FP16> { struct PrecisionTrait<Precision::FP16> {
using value_type = int16_t; using value_type = int16_t;
enum { is_float = true };
}; };
template <> template <>
struct PrecisionTrait<Precision::BF16> { struct PrecisionTrait<Precision::BF16> {
using value_type = int16_t; using value_type = int16_t;
enum { is_float = true };
}; };
template<> template<>
struct PrecisionTrait<Precision::Q78> { struct PrecisionTrait<Precision::Q78> {
using value_type = uint16_t; using value_type = uint16_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::I16> { struct PrecisionTrait<Precision::I16> {
using value_type = int16_t; using value_type = int16_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::U16> { struct PrecisionTrait<Precision::U16> {
using value_type = uint16_t; using value_type = uint16_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::U4> { struct PrecisionTrait<Precision::U4> {
using value_type = uint8_t; using value_type = uint8_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::U8> { struct PrecisionTrait<Precision::U8> {
using value_type = uint8_t; using value_type = uint8_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::I4> { struct PrecisionTrait<Precision::I4> {
using value_type = int8_t; using value_type = int8_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::I8> { struct PrecisionTrait<Precision::I8> {
using value_type = int8_t; using value_type = int8_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::BOOL> { struct PrecisionTrait<Precision::BOOL> {
using value_type = uint8_t; using value_type = uint8_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::I32> { struct PrecisionTrait<Precision::I32> {
using value_type = int32_t; using value_type = int32_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::U32> { struct PrecisionTrait<Precision::U32> {
using value_type = uint32_t; using value_type = uint32_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::I64> { struct PrecisionTrait<Precision::I64> {
using value_type = int64_t; using value_type = int64_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::U64> { struct PrecisionTrait<Precision::U64> {
using value_type = uint64_t; using value_type = uint64_t;
enum { is_float = false };
}; };
template <> template <>
struct PrecisionTrait<Precision::BIN> { struct PrecisionTrait<Precision::BIN> {
using value_type = int8_t; using value_type = int8_t;
enum { is_float = false };
}; };
template <class T> template <class T>
@ -420,6 +437,7 @@ inline uint8_t type_size_or_zero() {
template <> template <>
struct PrecisionTrait<Precision::UNSPECIFIED> { struct PrecisionTrait<Precision::UNSPECIFIED> {
using value_type = void; using value_type = void;
enum { is_float = false };
}; };
template <> template <>
@ -430,24 +448,6 @@ inline uint8_t type_size_or_zero<void>() {
return 0; return 0;
} }
namespace {
constexpr bool isSpecificFloatPrecision(const Precision::ePrecision& precision) {
return precision == Precision::FP16 || precision == Precision::BF16;
}
} // namespace
template <Precision::ePrecision T>
inline typename std::enable_if<isSpecificFloatPrecision(T), bool>::type
is_floating() {
return true;
}
template <Precision::ePrecision T>
inline typename std::enable_if<!isSpecificFloatPrecision(T), bool>::type
is_floating() {
return std::is_floating_point<typename PrecisionTrait<T>::value_type>::value;
}
template <Precision::ePrecision precision> template <Precision::ePrecision precision>
inline Precision::PrecisionInfo Precision::makePrecisionInfo(const char* name) { inline Precision::PrecisionInfo Precision::makePrecisionInfo(const char* name) {
Precision::PrecisionInfo info; Precision::PrecisionInfo info;
@ -455,7 +455,7 @@ inline Precision::PrecisionInfo Precision::makePrecisionInfo(const char* name) {
size_t nBits = precision == BIN ? 1 : 8; size_t nBits = precision == BIN ? 1 : 8;
info.bitsSize = nBits * type_size_or_zero<typename PrecisionTrait<precision>::value_type>(); info.bitsSize = nBits * type_size_or_zero<typename PrecisionTrait<precision>::value_type>();
info.isFloat = is_floating<precision>(); info.isFloat = PrecisionTrait<precision>::is_float;
info.value = precision; info.value = precision;
return info; return info;
} }