# FullConnection — MindSpore Signal+ 使用手册 alpha 文档

# FullConnection

传入输入矩阵与权重矩阵，执行全连接计算（矩阵乘法），并可选择性地叠加偏置项与激活函数， 最终输出结果矩阵。

\[ \begin{align}\begin{aligned}dst_{i,j} = \sum_{k=0}^{K-1} A_{i,k} \cdot B_{k,j} + bias_{i,j}\\dst_{i,j} = activation(dst_{i,j})\end{aligned}\end{align} \]

其中激活函数支持 ReLU 与 ReLU6。

输入：

  - A - 输入矩阵地址，形状为 `M × K`。

  - B - 权重矩阵地址，形状为 `K × N`。

  - bias - 偏置矩阵地址，形状为 `M × N`，可为 `NULL`。

  - M - 输出矩阵行数。

  - N - 输出矩阵列数。

  - K - 中间维度大小。

  - activation_type - 激活函数类型。

  - core_mask - 核掩码（仅适用于共享存储版本）。

输出：

  - C - 输出矩阵地址，形状为 `M × N`。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持fp, int8

- MT7004 支持hp, fp

- activation_type 支持 `ACTIVATION_NONE`、`ACTIVATION_RELU`、`ACTIVATION_RELU6`

共享存储版本:

void i8_fullconnection_s(int8_t *A, int8_t *B, int8_t *C, int8_t *bias, int M, int N, int K, int activation_type, int core_mask)

void fp_fullconnection_s(float *A, float *B, float *C, float *bias, int M, int N, int K, int activation_type, int core_mask)

void hp_fullconnection_s(half *A, half *B, half *C, half *bias, int M, int N, int K, int activation_type, int core_mask)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <fullconnection.h>
     4
     5int main(int argc, char* argv[]) {
     6    float *A = (float *)0xA0000000;
     7    float *B = (float *)0xA0010000;
     8    float *C = (float *)0xC0000000;
     9    float *bias = NULL;
    10    int M = 4, N = 8, K = 16;
    11    int activation_type = ACTIVATION_RELU;
    12    int core_mask = 0xff;
    13    fp_fullconnection_s(A, B, C, bias, M, N, K, activation_type, core_mask);
    14    return 0;
    15}

私有存储版本:

void i8_fullconnection_p(int8_t *A, int8_t *B, int8_t *C, int8_t *bias, int M, int N, int K, int activation_type)

void fp_fullconnection_p(float *A, float *B, float *C, float *bias, int M, int N, int K, int activation_type)

void hp_fullconnection_p(half *A, half *B, half *C, half *bias, int M, int N, int K, int activation_type)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <fullconnection.h>
     4
     5int main(int argc, char* argv[]) {
     6    float *A = (float *)0x10810000;
     7    float *B = (float *)0x10820000;
     8    float *C = (float *)0x10830000;
     9    float *bias = NULL;
    10    int M = 4, N = 8, K = 16;
    11    int activation_type = ACTIVATION_RELU6;
    12    fp_fullconnection_p(A, B, C, bias, M, N, K, activation_type);
    13    return 0;
    14}