3#ifndef poplar_QuarterFloat_hpp_
4#define poplar_QuarterFloat_hpp_
6#if defined(__IPU__) && defined(__IPU_ARCH_VERSION__) && \
7 __IPU_ARCH_VERSION__ >= 21
14inline half toHalf(quarter q, quarter_metadata md) {
15 return quarterToHalf(&q, md);
18inline quarter toQuarter(half h, quarter_metadata md) {
19 return halfToQuarter(&h, md);
31 quarter(
unsigned x) { value = x; };
34typedef struct quarter_metadata {
35 enum format { f143, f152 } fmt;
44#if (!defined(__IPU__) && !defined(_IPUDEF_H)) || defined(__QUARTER_FOR_IPU__)
46#include <poplar/HalfFloat.hpp>
50half quarterToHalf(quarter q, quarter_metadata md);
52float quarterToFloat(quarter q, quarter_metadata md);
54quarter halfToQuarter(half h, quarter_metadata md);
56quarter floatToQuarter(
float h, quarter_metadata md);
58inline half toFloat(quarter q, quarter_metadata md) {
59 return quarterToFloat(q, md);
62inline half toHalf(quarter q, quarter_metadata md) {
63 return quarterToHalf(q, md);
66template <
typename T>
inline quarter toQuarter(T val, quarter_metadata md) {
67 return floatToQuarter(val, md);
70template <>
inline quarter toQuarter<half>(half val, quarter_metadata md) {
71 return floatToQuarter(val, md);
80typedef unsigned char MetadataType;
84inline quarter_metadata unpackMetadata(
const MetadataType *in) {
86 constexpr auto formatBit = 7;
87 constexpr auto formatBitMask = (1 << formatBit);
88 constexpr auto scaleSignBit = 5;
89 constexpr auto scaleSignBitMask = (1 << scaleSignBit);
90 constexpr auto scaleMask = (1 << (scaleSignBit + 1)) - 1;
91 constexpr auto scaleSignExtendMask = 0xff ^ scaleMask;
94 *in & formatBitMask ? quarter_metadata::f143 : quarter_metadata::f152;
95 out.scale =
static_cast<char>(*in & scaleMask);
96 if (out.scale & scaleSignBitMask) {
97 out.scale |= scaleSignExtendMask;
Poplar classes and functions.
Definition: ArrayRef.hpp:14