onnx2versal
Loading...
Searching...
No Matches
qlinearmac.h
1#ifndef QLINEARMAC_KERNEL_H
2#define QLINEARMAC_KERNEL_H
3
4#include <type_traits>
5#include <assert.h>
6#include <adf.h>
7
8
32template <typename TT, typename TTPARAM, int B, int W, int IS_RELU>
34
35 private:
36 alignas(32) TTPARAM (&weights)[W];
37 alignas(32) TTPARAM (&bias)[W];
38 float x_scale;
39 float w_scale;
40 float b_scale;
41 float z_scale;
42 float y_scale;
43 TT x_zero;
44 TTPARAM w_zero;
45 TTPARAM b_zero;
46 TT z_zero;
47 TT y_zero;
48
49 // precompute
50 float scale_x;
51 float scale_z;
52 float shift_x[W];
53 float shift_z[W];
54
55 public:
57 TTPARAM (&w)[W],
58 TTPARAM (&b)[W],
59 float x_scale,
60 float w_scale,
61 float b_scale,
62 float z_scale,
63 float y_scale,
64 TT x_zero,
65 TTPARAM w_zero,
66 TTPARAM b_zero,
67 TT z_zero,
68 TT y_zero
69 );
70
71 void filter(
72 input_window<TT>* in,
73 output_window<TT>* out
74 );
75
76 static void registerKernelClass() {
77 REGISTER_FUNCTION(QlinearMacScalar::filter);
78 REGISTER_PARAMETER(weights);
79 REGISTER_PARAMETER(bias);
80 }
81};
82
88template <typename TT, typename TTPARAM, int B, int W, int IS_RELU>
90
91 private:
92 alignas(32) TTPARAM (&weights)[W];
93 alignas(32) TTPARAM (&bias)[W];
94 float x_scale;
95 float w_scale;
96 float b_scale;
97 float z_scale;
98 float y_scale;
99 TT x_zero;
100 TTPARAM w_zero;
101 TTPARAM b_zero;
102 TT z_zero;
103 TT y_zero;
104
105 // precompute
106 int bitshift_x;
107 int bitshift_z;
108 int16_t scale_z;
109 alignas(32) int32_t scale_x[W];
110 alignas(32) int32_t shift_x[W];
111 alignas(32) int32_t shift_z[W];
112
113 public:
114 QlinearMac (
115 TTPARAM (&w)[W],
116 TTPARAM (&b)[W],
117 float x_scale,
118 float w_scale,
119 float b_scale,
120 float z_scale,
121 float y_scale,
122 TT x_zero,
123 TTPARAM w_zero,
124 TTPARAM b_zero,
125 TT z_zero,
126 TT y_zero
127 );
128
129 void filter(
130 input_stream<TT>* in,
131 output_stream<TT>* out
132 );
133
134 static void registerKernelClass() {
135 static_assert(W % 16 == 0);
136 REGISTER_FUNCTION(QlinearMac::filter);
137 REGISTER_PARAMETER(weights);
138 REGISTER_PARAMETER(bias);
139 }
140};
144#endif // QLINEARMAC_KERNEL_H
QlinearMac scalar implementation, QlinearMacScalar<14,128,0> 418101 cycles.
Definition qlinearmac.h:33
QlinearMac vector implementation, requires W%16 == 0, QlinearMacScalar<14,128,0> 1256 cycles,...
Definition qlinearmac.h:89