integrated support for binary16 = 16bit floating point numbers via half.hpp, IEEE 754-based half-precision floating-point library

This commit is contained in:
Mario Fink 2020-02-11 10:57:50 +01:00
parent 899582b0c1
commit 24c7aa4846
7 changed files with 4614 additions and 633 deletions

View File

@ -1,599 +0,0 @@
5.93
5.92
5.9
5.9
5.89
5.89
5.87
5.84
5.83
5.81
5.79
5.78
5.76
5.75
5.74
5.74
5.73
5.73
5.72
5.71
5.71
5.69
5.69
5.68
5.66
5.63
5.62
5.6
5.58
5.57
5.55
5.53
5.51
5.5
5.47
5.45
5.42
5.4
5.38
5.35
5.31
5.28
5.27
5.24
5.19
5.16
5.14
7.67
5.06
5.02
5
4.97
4.92
4.88
4.86
4.82
4.77
4.74
4.7
4.66
4.62
4.58
4.54
4.48
4.43
4.37
4.31
4.24
4.18
4.13
4.06
3.98
3.91
3.83
3.77
3.72
3.64
3.57
3.51
3.44
3.39
3.33
3.28
3.24
3.17
3.11
3.06
3.01
2.96
2.92
2.88
2.83
2.79
2.75
2.71
2.68
2.64
2.61
2.59
2.56
5.11
2.52
2.51
2.49
2.48
2.46
2.46
2.45
2.44
2.43
2.42
2.41
2.4
2.41
2.39
2.38
2.35
2.31
2.26
2.21
2.16
2.1
2.05
2.01
1.94
1.91
1.84
1.77
1.73
1.65
1.59
1.58
1.55
1.52
1.53
1.52
1.5
1.49
1.47
1.47
1.47
1.47
1.48
1.48
1.48
1.48
1.48
1.46
1.44
1.44
1.43
1.41
1.41
1.4
1.38
1.37
1.36
1.35
1.33
1.32
1.31
1.28
1.27
1.26
1.24
1.22
1.21
1.21
1.19
1.17
1.16
1.16
1.13
1.12
1.12
1.11
1.09
1.08
1.07
1.07
1.05
1.04
1.03
1.02
1.01
0.99
0.98
0.96
0.95
0.94
0.9
0.87
0.84
0.8
0.79
0.78
0.75
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1 5.93
5.93
5.92
5.9
5.9
5.89
5.89
5.87
5.84
5.83
5.81
5.79
5.78
5.76
5.75
5.74
5.74
5.73
5.73
5.72
5.71
5.71
5.69
5.69
5.68
5.66
5.63
5.62
5.6
5.58
5.57
5.55
5.53
5.51
5.5
5.47
5.45
5.42
5.4
5.38
5.35
5.31
5.28
5.27
5.24
5.19
5.16
5.14
7.67
5.06
5.02
5
4.97
4.92
4.88
4.86
4.82
4.77
4.74
4.7
4.66
4.62
4.58
4.54
4.48
4.43
4.37
4.31
4.24
4.18
4.13
4.06
3.98
3.91
3.83
3.77
3.72
3.64
3.57
3.51
3.44
3.39
3.33
3.28
3.24
3.17
3.11
3.06
3.01
2.96
2.92
2.88
2.83
2.79
2.75
2.71
2.68
2.64
2.61
2.59
2.56
5.11
2.52
2.51
2.49
2.48
2.46
2.46
2.45
2.44
2.43
2.42
2.41
2.4
2.41
2.39
2.38
2.35
2.31
2.26
2.21
2.16
2.1
2.05
2.01
1.94
1.91
1.84
1.77
1.73
1.65
1.59
1.58
1.55
1.52
1.53
1.52
1.5
1.49
1.47
1.47
1.47
1.47
1.48
1.48
1.48
1.48
1.48
1.46
1.44
1.44
1.43
1.41
1.41
1.4
1.38
1.37
1.36
1.35
1.33
1.32
1.31
1.28
1.27
1.26
1.24
1.22
1.21
1.21
1.19
1.17
1.16
1.16
1.13
1.12
1.12
1.11
1.09
1.08
1.07
1.07
1.05
1.04
1.03
1.02
1.01
0.99
0.98
0.96
0.95
0.94
0.9
0.87
0.84
0.8
0.79
0.78
0.75
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

BIN
eatit

Binary file not shown.

View File

@ -4,8 +4,8 @@ RAW = ../raw/
SRC = src/ SRC = src/
EXE = eatit EXE = eatit
CCC = g++ CCC = g++ -std=c++11
OPT = -O3 -Wall OPT = -O3 -Wall -mavx -mno-tbm -mf16c -mno-f16c
$(EXE) : $(SRC)main.cpp $(SRC)raweat.hpp $(SRC)half_precision_floating_point.hpp $(EXE) : $(SRC)main.cpp $(SRC)raweat.hpp $(SRC)half_precision_floating_point.hpp
$(CCC) $(OPT) $< -o $@ $(CCC) $(OPT) $< -o $@

4575
src/half.hpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -43,8 +43,8 @@ int main(int argc, char* argv[])
} }
// convert unsigned char data in buffer to desired data type // convert unsigned char data in buffer to desired data type
//eatraw.convert_data();
eatraw.convert_data_16_bit_float(); eatraw.convert_data_16_bit_float();
//eatraw.convert_data_32_bit_float();
// get array of encoded data // get array of encoded data
std::vector<double> maindata = eatraw.get_data(); std::vector<double> maindata = eatraw.get_data();
@ -67,7 +67,21 @@ int main(int argc, char* argv[])
std::cout<<std::hex<<bssc.to_ulong()<<"\n\n"; std::cout<<std::hex<<bssc.to_ulong()<<"\n\n";
endian endi; endian endi;
std::cout<<(endi.little_endian()?"little endian":"big endian")<<"\n"; std::cout<<(endi.little_endian()?"little endian":"big endian")<<"\n\n";
std::cout<<sizeof(long int)<<"\n";
std::cout<<sizeof(int)<<"\n";
std::cout<<sizeof(short int)<<"\n";
std::cout<<sizeof(unsigned int)<<"\n";
std::cout<<sizeof(unsigned short int)<<"\n";
std::cout<<sizeof(half_float::half)<<"\n";
// short int myi = 34;
// std::cout<<myi<<"\n";
// float myfl = 0.0;
// myfl = _cvtsh_ss(myi);
////float _cvtsh_ss(unsigned short x);
// std::cout<<myfl<<"\n";
return 0; return 0;
} }

View File

@ -6,12 +6,19 @@
#include <assert.h> #include <assert.h>
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <sstream>
#include <iomanip> #include <iomanip>
#include <vector> #include <vector>
#include <iterator> #include <iterator>
#include <map> #include <map>
#include <cmath>
#include "half_precision_floating_point.hpp" // support for 16bit floats
#include <emmintrin.h>
#include <immintrin.h>
//#include <f16cintrin.h>
#include "half.hpp"
//#include "half_precision_floating_point.hpp"
#include "endian.hpp" #include "endian.hpp"
//---------------------------------------------------------------------------// //---------------------------------------------------------------------------//
@ -213,14 +220,14 @@ public:
} }
// convert actual measurement data // convert actual measurement data
void convert_data() void convert_data_32_bit_float()
{ {
assert ( (datsize_-28)%4 == 0 && "length of buffer is not a multiple of 4" ); assert ( (datsize_-28)%4 == 0 && "length of buffer is not a multiple of 4" );
unsigned long int totnumfl = (datsize_-28)/(int)sizeof(float); unsigned long int totnumfl = (datsize_-28)/(int)sizeof(float);
for ( unsigned long int numfl = 0; numfl < totnumfl; numfl++ ) for ( unsigned long int numfl = 0; numfl < totnumfl; numfl++ )
{ {
// assuming 4 byte float // assuming 4 byte (32bit) float
float num = 0.0; float num = 0.0;
uint8_t* pnum = reinterpret_cast<uint8_t*>(&num); uint8_t* pnum = reinterpret_cast<uint8_t*>(&num);
for ( int byi = 0; byi < (int)sizeof(float); byi++ ) for ( int byi = 0; byi < (int)sizeof(float); byi++ )
@ -238,39 +245,23 @@ public:
// convert half-precision (16bit) floating point numbers // convert half-precision (16bit) floating point numbers
void convert_data_16_bit_float() void convert_data_16_bit_float()
{ {
// single (32bit) floating point number assert ( (datsize_-28)%2 == 0 && "length of buffer is not a multiple of 2" );
float fl = 0.0;
unsigned long int totnumby = (datsize_-28)/2; unsigned long int totnumby = (datsize_-28)/2;
for ( unsigned long int by = 0; by < totnumby; by++ ) for ( unsigned long int by = 0; by < totnumby; by++ )
{ {
// retrieve two bytes of floating point number // declare single (16bit) floating point number
std::vector<uint8_t> pnum; half_float::half hfl;
for ( int i = 0; i < 2; i++ ) pnum.push_back(datasec_["datas marker"][(unsigned long int)(28+by*2+i)]);
// obtain bitset // reinterpret bytes in buffer as memory of floating point number
std::bitset<8> byA(pnum[0]), byB(pnum[1]); uint8_t* pnum = reinterpret_cast<uint8_t*>(&hfl);
for ( int i = 0; i < (int)sizeof(half_float::half); i++ )
{
pnum[i] = (int)datasec_["datas marker"][(unsigned long int)(28+by*sizeof(half_float::half)+i)];
}
// TODO all following code only works for little endian!! // add number to array
datmes_.push_back((double)hfl);
// sign
float sign = byB[0];
// exponent of 16bit float
long int expo = 0;
for ( int i = 0; i < 5; i++ ) if ( byB[1+i] ) expo += pow(2.0,4-i);
expo -= 15;
// convert to exponent of 32bit float
// mantissa
// declare bitset of float
std::bitset<8> flA(0x00), flB(0x00), flC(0x00), flD(0x00);
} }
} }