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);