aclCreateTensor
函数功能
根据Tensor的数据类型、数据排布格式、维度、步长、偏移、Device侧存储地址等数据,创建aclTensor对象,作为单算子API执行接口的入参。
aclTensor是AscendCL定义的一种用来管理和存储张量数据的结构,开发者无需关注其内部实现,直接使用即可。
函数原型
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)
参数说明

- aclDataType由AscendCL框架定义,具体参见“aclDataType”。
- aclFormat由AscendCL框架定义,具体参见“aclFormat”。
- 关于aclTensor的StorageShape和ViewShape:
- ViewShape表示aclTensor的逻辑shape,是Tensor在实际使用时需要用到的大小。
- StorageShape表示aclTensor的实际物理排布shape,是Tensor在内存上实际存在的大小。
举例如下:
- StorageShape为[10, 20]:表示该aclTensor在内存上是按照[10, 20]排布的。
- ViewShape为[2, 5, 20]:在算子使用时,表示该aclTensor可被视为一块[2, 5, 20]的数据使用。
参数名 |
输入/输出 |
说明 |
---|---|---|
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。
约束与限制
- 本接口需与aclDestroyTensor接口配套使用,分别完成aclTensor的创建与销毁。
- 如需创建多个aclTensor对象,可调用aclCreateTensorList接口来存储张量列表。
- 调用aclGetDataType接口可以获取aclTensor的DataType。
- 调用aclGetFormat接口可以获取aclTensor的format。
- 调用aclGetStorageShape接口可以获取aclTensor的StorageShape。
- 调用aclGetViewOffset接口可以获取aclTensor的ViewOffset,即ViewShape对应的offset。
- 调用aclGetViewShape接口可以获取aclTensor的ViewShape。
- 调用aclGetViewStrides接口可以获取aclTensor的ViewStrides,即ViewShape对应的stride。
- 调用aclInitTensor接口初始化给定tensor的参数。
- 调用如下接口可刷新输入/输出aclTensor中记录的Device内存地址。
调用示例
aclTensor的定义与torch.Tensor相似,由一块连续或非连续的内存地址和一系列描述信息(如stride、offset等)组成。Tensor根据shape、stride、offset信息,可自由取出内存中的数据,也可获得非连续的内存(如图1中y)。
- 以图1为例,x tensor创建过程如下:
1 2 3 4 5 6 7
aclTensor *CteateXTensor() { int64_t viewDims = {2, 4}; int64_t stride = {4, 1}; // 第1维步长4,第2维步长1 int64_t storageDims = {2, 4}; return aclCreateTensor(viewDims, 2, ACL_FLOAT16, stride, 0, ACL_FORMAT_ND, storageDims, 2, nullptr); }
- 以图1为例,x对应的转置x^T tensor创建过程如下:
1 2 3 4 5 6 7
aclTensor *CreateXTransposedTensor() { int64_t viewDims = {4, 2}; int64_t stride = {1, 4}; // 转置跨度通过stride表示 int64_t storageDims = {2, 4}; return aclCreateTensor(viewDims, 2, ACL_FLOAT16, stride, 0, ACL_FORMAT_ND, storageDims, 2, nullptr); }
基于上述举例,将aclTensor作为单算子API执行接口入参的示例代码如下,仅供参考,不支持直接拷贝运行。
1 2 3 4 5 6 7 8 9 10 |
// 创建aclTensor aclTensor *xTensor = CteateXTensor(); aclTensor *xTransposedTensor = CreateXTransposedTensor(); // aclTensor作为单算子API执行接口的入参 auto ret = aclnnXxxGetWorkspaceSize(xTensor, xTransposedTensor, ..., outTensor, ..., &workspaceSize, &executor); ret = aclnnXxx(...); ... // 销毁aclTensor ret = aclDestroyTensor(xTensor); ret = aclDestroyTensor(xTransposedTensor); |