AIfES 2  2.0.0
aimath_q7_cmsis.h File Reference

Go to the source code of this file.

Functions

void aimath_q7_cmsis_linear32_bt (const aitensor_t *a, const aitensor_t *b, const aitensor_t *c, aitensor_t *result)
 Performs a matrix multiplication of Q7 matrices a and b (transposed) and adds a Q31 vector c to each row. More...
 

Detailed Description

Version
2.2.0

Function Documentation

◆ aimath_q7_cmsis_linear32_bt()

void aimath_q7_cmsis_linear32_bt ( const aitensor_t a,
const aitensor_t b,
const aitensor_t c,
aitensor_t result 
)

Performs a matrix multiplication of Q7 matrices a and b (transposed) and adds a Q31 vector c to each row.

The addition of the horizontal vector c is performed via broadcast, i.e. element wise in each column Mathematically this broadcast is equal to multiplying c with an vertical vector (with the same number of elements as c) and adding the result to \( a \cdot b^T \).

The quantization parameters of the vector c have to be {zero_point = 0, shift = a.shift + b.shift}!

\[ result = a \cdot b + \left( \begin{array}{c} 1 \\ 1 \\ \vdots \\ 1 \\ \end{array}\right) \cdot c \]

Example:

\[ a = \left( \begin{array}{rrr} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right) \]

\[ b = \left( \begin{array}{rr} 1 & 0 & 0 \\ 0 & 1 & 0 \end{array}\right) \]

\[ c = \left( \begin{array}{rr} 2 & 5 \end{array}\right) \]

\[ result = a \cdot b^T + \left( \begin{array}{r} 1 \\ 1 \\ 1 \\ \end{array}\right) \cdot c \]

\[ = \left( \begin{array}{rr} 1 & 2 \\ 4 & 5 \\ 7 & 8 \end{array}\right) + \left( \begin{array}{rr} 2 & 5 \\ 2 & 5 \\ 2 & 5 \end{array}\right) \]

\[ = \left( \begin{array}{rr} 3 & 7 \\ 6 & 10 \\ 9 & 13 \end{array}\right) \]

Example:

uint16_t a_shape[2] = {3, 3};
aimath_q7_params_t a_params = {1, 0}; // {shift, zero point}
int8_t a_data[3*3] = { 2, 4, 6,
8, 10, 12,
14, 16, 18};
aitensor_t a = AITENSOR_2D_Q7(a_shape, &a_params, a_data);
uint16_t b_shape[2] = {2, 3};
aimath_q7_params_t b_params = {2, 0}; // {shift, zero point}
int8_t b_data[2*3] = {4, 0, 0,
0, 4, 0};
aitensor_t b = AITENSOR_2D_Q7(b_shape, &b_params, b_data);
uint16_t c_shape[2] = {1, 2};
aimath_q31_params_t c_params = {3, 0}; // {shift, zero point}
int32_t c_data[1*2] = {16, 40};
aitensor_t c = AITENSOR_2D_Q31(c_shape, &c_params, c_data);
uint16_t result_shape[2] = {3, 2};
aimath_q7_params_t result_params = {1, 0}; // {shift, zero point}
int8_t result_data[3*2];
aitensor_t result = AITENSOR_2D_Q7(result_shape, &result_params, result_data);
aimath_q7_cmsis_linear32_bt(&a, &b, &c, &result);
print_aitensor(&result);
void print_aitensor(const aitensor_t *tensor)
Printing a tensor to console.
void aimath_q7_cmsis_linear32_bt(const aitensor_t *a, const aitensor_t *b, const aitensor_t *c, aitensor_t *result)
Performs a matrix multiplication of Q7 matrices a and b (transposed) and adds a Q31 vector c to eac...
Parameters used for the quantized Q31 values, used as property of a tensor.
Definition: aimath_q31.h:149
Parameters used for the quantized Q7 values, used as property of a tensor.
Definition: aimath_q7.h:148
A tensor in AIfES.
Definition: aifes_math.h:89
Parameters
*aQ7 matrix a (2D tensor of shape [N x K])
*bQ7 matrix b (2D tensor of shape [M x K])
*cQ31 vector c (2D tensor of shape [1 x M] or 1D tensor of shape [M])
*resultResulting Q7 matrix (2D tensor of shape [N x M])