Tensor

BMLang操作的数据为Tensor和Scalar,以下为BMLang编程时对应的数据类型。

typedef enum {
  FLOAT32 = 0,  // float
  FLOAT16 = 1,  // IEEE fp16
  INT8    = 2,  // signed char
  UINT8   = 3,  // unsigned char
  INT16   = 4,  // signed short
  UINT16  = 5,  // unsigned short
  INT32   = 6,  // signed int
  UINT32  = 7,  // unsigned int
  DOUBLE  = 8   // double
} DataType;

注意:

  • BM1682芯片只支持FLOAT32,所以所有的数据都会被转成FLOAT32进行计算。

  • BM1684芯片支持FLOAT32/INT8/UINT8/INT16/UINT16,所以BMLang程序中INT32/UINT32/DOUBLE会被转成FLOAT32。部分操作会将INT32/UINT32转成UINT16/INT16,后面会特殊指出。

张量(Tensor)

定义一个张量Tensor,如下所示。

定义一个张量Tensor或者设置该Tensor属性时,为了避免BMLang编程错误, Tensor的name, data,data type, tensor type均最多只能声明或者设置1次。

一般情况下推荐创建Tensor不指定Name,以免因为Name相同导致问题。 只有在必须指定Name时,才需要在创建Tensor时指定Name。

对于作为Operator输出的Tensor,可以不指定shape,因为Operator会自行推导。 即使指定了shape,若Tensor是Operator的输出,则同样由Operator自行推导并修改。

Tensor(); // 仅声明Tensor,Tensor的属性可之后设置
Tensor(   // 声明Tensor,并指定其name, data type
    const string& name, DataType dtype,
    int shape_dim0 = 0, int shape_dim1 = 0,
    int shape_dim2 = 0, int shape_dim3 = 0,
    int shape_dim4 = 0, int shape_dim5 = 0,
    int shape_dim6 = 0, int shape_dim7 = 0);
Tensor(const string& name, DataType dtype,  // 声明Tensor,并指定其name, data type, shape
       const vector<int>& shape);
Tensor(const string& name, DataType dtype,  // 声明Tensor,并指定其name, data type, tensor type, shape
       TensorType ttype, const vector<int>& shape);
Tensor(   // 声明Tensor,并指定其data type
    DataType dtype,
    int shape_dim0 = 0, int shape_dim1 = 0,
    int shape_dim2 = 0, int shape_dim3 = 0,
    int shape_dim4 = 0, int shape_dim5 = 0,
    int shape_dim6 = 0, int shape_dim7 = 0);
Tensor(DataType dtype, const vector<int>& shape);  // 声明Tensor,并指定其data type, shape

声明Tensor的示例:

// C++ version
// Define a tensor with setting name, data type and shapes
bmlang::Tensor  tensor("name", bmlang::FLOAT32, 2, 3, 4, 5);

// Define a tensor with only data type.
// Name and shapes will be set when calling operations.
bmlang::Tensor  tensor(bmlang::INT8);

Tensor的类型如下所示。其中DATA_TENSOR为默认的,表示runtime时数据会变化的Tensor。 COEFF_TENSOR表示数据固定的Tensor,因此对于数据固定的Tensor,我们需要设置其TensorType,并为该Tensor设置数据。

typedef enum {
  DATA_TENSOR,
  COEFF_TENSOR,
  UNKNOWN_TYPE
} TensorType;

Tensor的主要成员函数为:

/* 设置Tensor属性的函数 */
void set_tensor_type(TensorType type);  // 设置Tensor类型
void set_dtype(TensorType type);        // 设置Tensor的数据类型
int set_data(const char* data_addr);    // 设置Tensor的数据
/* 获取Tensor信息的函数 */
const vector<int>& shape(void) const;   // 获取Tensor的shape
inline int shape(int index) const;      // 获取Tensor的第index维shape值
inline int num_axes(void) const;        // 获取Tensor的shape维数
int count(void) const;                  // 获取Tensor总共有多少个data type大小的数据
int get_data(char* data_addr);          // 获取Tensor的数据,数据将被memcpy到data_addr指针所指内存中
const string& name(void) const;         // 获取Tensor的name
const TensorType get_tensor_type(void); // 获取Tensor的tensor type
DataType get_dtype(void) const;         // 获取Tensor的data type

标量(Scalar)

定义一个标量Scalar. Scalar是一个常量,在声明时指定,且不能修改。

标量Scalar只有在Operator要用到时才需要声明。

// Define a scalar with value and data type
bmlang::Scalar  scalar(100.0f, bmlang::FLOAT32);