Конвертировать FP32 в Bfloat16 в C ++ - PullRequest
0 голосов
/ 20 марта 2019

Как я могу преобразовать с плавающей запятой (1-битный знак, 8-битный опыт, 23-битный мантисса) в Bfloat16 (1-битный знак, 8-битный опыт, 7-битный мантисса) в C ++?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Как показано в ответе Ботье , достаточно скопировать верхнюю половину значения float, поскольку битовые комбинации одинаковы.То, как это делается в этом ответе, нарушает правила строгого наложения имен в C ++.Чтобы обойти это, используйте memcpy для копирования битов.

static inline tensorflow::bfloat16 FloatToBFloat16(float float_val)
{
    tensorflow::bfloat16 retval;
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
    memcpy(&retval, &float_val, sizeof retval);
#else
    memcpy(&retval, reinterpret_cast<char *>(&float_val) + sizeof float_val - sizeof retval, sizeof retval);
#endif
    return retval;
}

Если необходимо округлить результат, а не обрезать его, вы можете умножить на магическое значение, чтобы вытолкнуть некоторые из этих младших битов.в верхние биты.

float_val *= 1.001957f;
0 голосов
/ 20 марта 2019

Из реализации Tensorflow :

static inline tensorflow::bfloat16 FloatToBFloat16(float float_val) {
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
    return *reinterpret_cast<tensorflow::bfloat16*>(
        reinterpret_cast<uint16_t*>(&float_val));
#else
    return *reinterpret_cast<tensorflow::bfloat16*>(
        &(reinterpret_cast<uint16_t*>(&float_val)[1]));
#endif
}
...