根据Tensor的数据类型、数据排布格式、维度、步长、偏移、Device侧存储地址等数据,创建aclTensor对象,作为单算子API执行接口的入参。
aclTensor是框架定义的一种用来管理和存储张量数据的结构,开发者无需关注其内部实现,直接使用即可。
aclTensor *aclCreateTensor(const int64_t *viewDims, uint64_t viewDimsNum, aclDataType dataType, const int64_t *stride, int64_t offset, aclFormat format, const int64_t *storageDims, uint64_t storageDimsNum, void *tensorData)
举例如下:
|
参数名 |
输入/输出 |
说明 |
|---|---|---|
|
viewDims |
输入 |
tensor的ViewShape维度值,为非负整数。 |
|
viewDimsNum |
输入 |
tensor的ViewShape维度数。 |
|
dataType |
输入 |
tensor的数据类型。 |
|
stride |
输入 |
tensor各维度元素的访问步长,为非负整数。 |
|
offset |
输入 |
tensor首元素相对于storage的偏移,为非负整数。 |
|
format |
输入 |
tensor的数据排布格式。 |
|
storageDims |
输入 |
tensor的StorageShape维度值,为非负整数。 |
|
storageDimsNum |
输入 |
tensor的StorageShape维度数。 |
|
tensorData |
输入 |
tensor在Device侧的存储地址。 |
成功则返回创建好的aclTensor,否则返回nullptr。
aclTensor的定义与torch.Tensor相似,由一块连续或非连续的内存地址和一系列描述信息(如stride、offset等)组成。Tensor根据shape、stride、offset信息,可自由取出内存中的数据,也可获得非连续的内存(如图1中y)。
1 2 3 4 5 6 7 |
aclTensor *CreateXTensor() { std::vector<int64_t> viewDims = {2, 4}; std::vector<int64_t> stride = {4, 1}; // 第1维步长4,第2维步长1 std::vector<int64_t> storageDims = {2, 4}; return aclCreateTensor(viewDims.data(), 2, ACL_FLOAT16, stride.data(), 0, ACL_FORMAT_ND, storageDims.data(), 2, nullptr); } |
1 2 3 4 5 6 7 |
aclTensor *CreateXTransposedTensor() { std::vector<int64_t> viewDims = {4, 2}; std::vector<int64_t> stride = {1, 4}; // 转置跨度通过stride表示 std::vector<int64_t> storageDims = {2, 4}; return aclCreateTensor(viewDims.data(), 2, ACL_FLOAT16, stride.data(), 0, ACL_FORMAT_ND, storageDims.data(), 2, nullptr); } |
基于上述举例,将aclTensor作为单算子API执行接口入参的示例代码如下,仅供参考,不支持直接拷贝运行。
1 2 3 4 5 6 7 8 9 10 |
// 创建aclTensor aclTensor *xTensor = CreateXTensor(); aclTensor *xTransposedTensor = CreateXTransposedTensor(); // aclTensor作为单算子API执行接口的入参 auto ret = aclxxXxxGetWorkspaceSize(xTensor, xTransposedTensor, ..., outTensor, ..., &workspaceSize, &executor); ret = aclxxXxx(...); ... // 销毁aclTensor ret = aclDestroyTensor(xTensor); ret = aclDestroyTensor(xTransposedTensor); |