10 #include "fp16_emu.cuh"
12 namespace faiss {
namespace gpu {
66 half1 cpu_float2half_rn(
float f)
78 unsigned u = (x & 0x7fffffff), remainder, shift, lsb, lsb_s1, lsb_m1;
79 unsigned sign, exponent, mantissa;
87 sign = ((x >> 16) & 0x8000);
91 ret.x = sign | 0x7c00U;
95 ret.x = (sign | 0x0000);
99 exponent = ((u >> 23) & 0xff);
100 mantissa = (u & 0x7fffff);
102 if (exponent > 0x70) {
106 shift = 0x7e - exponent;
108 mantissa |= 0x800000;
115 remainder = (mantissa & lsb_m1);
117 if (remainder > lsb_s1 || (remainder == lsb_s1 && (mantissa & 0x1))) {
119 if (!(mantissa & 0x3ff)) {
125 ret.x = (sign | (exponent << 10) | mantissa);
131 float cpu_half2float(half1 h)
133 unsigned sign = ((h.x >> 15) & 1);
134 unsigned exponent = ((h.x >> 10) & 0x1f);
135 unsigned mantissa = ((h.x & 0x3ff) << 13);
137 if (exponent == 0x1f) {
138 mantissa = (mantissa ? (sign = 0, 0x7fffff) : 0);
140 }
else if (!exponent) {
145 msb = (mantissa & 0x400000);
149 mantissa &= 0x7fffff;
160 un.i = ((sign << 31) | (exponent << 23) | mantissa);