aclSetDynamicTensorAddr
函数功能
通过aclSetAclOpExecutorRepeatable使能aclOpExecutor可复用后,若输入或输出Device内存地址变更,需要刷新对应aclTensorList中记录的Device内存地址。
函数原型
aclnnStatus aclSetDynamicTensorAddr(aclOpExecutor *executor, size_t irIndex, const size_t relativeIndex, aclTensorList *tensors, void *addr)
参数说明
参数名 |
输入/输出 |
说明 |
---|---|---|
executor |
输入 |
设置为复用状态的aclOpExecutor。 |
irIndex |
输入 |
待刷新的aclTensorList在算子IR原型定义中的索引,从0开始计数。 |
relativeIndex |
输入 |
待刷新的aclTensor在aclTensorList中的索引。如果aclTensorList有N个Tensor,其取值范围为[0, N-1]。 |
tensors |
输入 |
待刷新的aclTensorList指针。 |
addr |
输入 |
需要刷新到指定aclTensor中的Device存储地址。 |
返回值说明
返回0表示成功,返回其他值表示失败。
使用样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// 创建输入和输出的aclTensor和aclTensorList std::vector<int64_t> shape = {1, 2, 3}; aclTensor tensor1 = aclCreateTensor(shape.data(), shape.size(), aclDataType::ACL_FLOAT, nullptr, 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), nullptr); aclTensor tensor2 = aclCreateTensor(shape.data(), shape.size(), aclDataType::ACL_FLOAT, nullptr, 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), nullptr); aclTensor tensor3 = aclCreateTensor(shape.data(), shape.size(), aclDataType::ACL_FLOAT, nullptr, 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), nullptr); aclTensor tensor4 = aclCreateTensor(shape.data(), shape.size(), aclDataType::ACL_FLOAT, nullptr, 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), nullptr); aclTensor *list1[] = {tensor1, tensor2}; auto tensorList = aclCreateTensorList(list1, 2); aclTensor *list2[] = {tensor3 tensor4}; auto output = aclCreateTensorList(list2, 2); uint64_t workspace_size = 0; aclOpExecutor *executor; // AddCustom算子有两个输入(aclTensorList和aclTensor),一个输出(aclTensorList) // 调用第1段接口 aclnnAddCustomGetWorkspaceSize(tensorList, tensor3, output, &workspace_size, &executor); // 设置executor为可复用 aclSetAclOpExecutorRepeatable(executor); void *addr; aclSetDynamicTensorAddr(executor, 0, 0, tensorList, addr); // 刷新输入tensorlist中第1个aclTensor的device地址 aclSetDynamicTensorAddr(executor, 0, 1, tensorList, addr); // 刷新输入tensorlist中第2个aclTensor的device地址 aclSetDynamicTensorAddr(executor, 2, 0, tensorList, addr); // 刷新输出tensorlist中第1个aclTensor的device地址 aclSetDynamicTensorAddr(executor, 2, 1, tensorList, addr); // 刷新输出tensorlist中第2个aclTensor的device地址 ....... // 调用第2段接口 aclnnAddCustom(workspace, workspace_size, executor, stream); // 清理executor aclDestroyAclOpExecutor(executor); |
父主题: 基础接口