|
|
|
@@ -113,58 +113,6 @@ void Mat::substract_mean_normalize(const float* mean_vals, const float* norm_val |
|
|
|
delete op; |
|
|
|
} |
|
|
|
|
|
|
|
// convert half precision floating point to float |
|
|
|
static float half2float(unsigned short value) |
|
|
|
{ |
|
|
|
// 1 : 5 : 10 |
|
|
|
unsigned short sign = (value & 0x8000) >> 15; |
|
|
|
unsigned short exponent = (value & 0x7c00) >> 10; |
|
|
|
unsigned short significand = value & 0x03FF; |
|
|
|
|
|
|
|
// fprintf(stderr, "%d %d %d\n", sign, exponent, significand); |
|
|
|
|
|
|
|
// 1 : 8 : 23 |
|
|
|
union |
|
|
|
{ |
|
|
|
unsigned int u; |
|
|
|
float f; |
|
|
|
} tmp; |
|
|
|
if (exponent == 0) |
|
|
|
{ |
|
|
|
if (significand == 0) |
|
|
|
{ |
|
|
|
// zero |
|
|
|
tmp.u = (sign << 31); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// denormal |
|
|
|
exponent = 0; |
|
|
|
// find non-zero bit |
|
|
|
while ((significand & 0x200) == 0) |
|
|
|
{ |
|
|
|
significand <<= 1; |
|
|
|
exponent++; |
|
|
|
} |
|
|
|
significand <<= 1; |
|
|
|
significand &= 0x3FF; |
|
|
|
tmp.u = (sign << 31) | ((-exponent + (-15 + 127)) << 23) | (significand << 13); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (exponent == 0x1F) |
|
|
|
{ |
|
|
|
// infinity or NaN |
|
|
|
tmp.u = (sign << 31) | (0xFF << 23) | (significand << 13); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// normalized |
|
|
|
tmp.u = (sign << 31) | ((exponent + (-15 + 127)) << 23) | (significand << 13); |
|
|
|
} |
|
|
|
|
|
|
|
return tmp.f; |
|
|
|
} |
|
|
|
|
|
|
|
Mat Mat::from_float16(const unsigned short* data, int size) |
|
|
|
{ |
|
|
|
Mat m(size); |
|
|
|
@@ -224,7 +172,7 @@ Mat Mat::from_float16(const unsigned short* data, int size) |
|
|
|
#endif // __ARM_NEON |
|
|
|
for (; remain>0; remain--) |
|
|
|
{ |
|
|
|
*ptr = half2float(*data); |
|
|
|
*ptr = float16_to_float32(*data); |
|
|
|
|
|
|
|
data++; |
|
|
|
ptr++; |
|
|
|
|