11 #include "fp16_emu.cuh"
13 namespace faiss {
namespace gpu {
67 half1 cpu_float2half_rn(
float f)
79 unsigned u = (x & 0x7fffffff), remainder, shift, lsb, lsb_s1, lsb_m1;
80 unsigned sign, exponent, mantissa;
88 sign = ((x >> 16) & 0x8000);
92 ret.x = sign | 0x7c00U;
96 ret.x = (sign | 0x0000);
100 exponent = ((u >> 23) & 0xff);
101 mantissa = (u & 0x7fffff);
103 if (exponent > 0x70) {
107 shift = 0x7e - exponent;
109 mantissa |= 0x800000;
116 remainder = (mantissa & lsb_m1);
118 if (remainder > lsb_s1 || (remainder == lsb_s1 && (mantissa & 0x1))) {
120 if (!(mantissa & 0x3ff)) {
126 ret.x = (sign | (exponent << 10) | mantissa);
132 float cpu_half2float(half1 h)
134 unsigned sign = ((h.x >> 15) & 1);
135 unsigned exponent = ((h.x >> 10) & 0x1f);
136 unsigned mantissa = ((h.x & 0x3ff) << 13);
138 if (exponent == 0x1f) {
139 mantissa = (mantissa ? (sign = 0, 0x7fffff) : 0);
141 }
else if (!exponent) {
146 msb = (mantissa & 0x400000);
150 mantissa &= 0x7fffff;
161 un.i = ((sign << 31) | (exponent << 23) | mantissa);