已合并
refactor(op_fallback): 删除废弃的 EXEC_OPAPI_CMD 转发宏并补充接口文档 #737
yuyuanfeng创建于 6 天前
refactor(op_fallback): 删除废弃的 EXEC_OPAPI_CMD 转发宏并补充接口文档 #737
已合并
共 8 个文件变更+152-3
| @@ -77,4 +77,8 @@ | |||
| 77 | - [InferShape4Elewise](infershape/InferShape4Elewise.md) | 77 | - [InferShape4Elewise](infershape/InferShape4Elewise.md) |
| 78 | - [InferShape4Reduce](infershape/InferShape4Reduce.md) | 78 | - [InferShape4Reduce](infershape/InferShape4Reduce.md) |
| 79 | 79 | ||
| 80 | +- [op_graph](op_graph/op_graph.md) | ||
| 81 | + - [CANN\_OPS\_OPB\_SYN\_EXEC\_ACLNN](op_graph/CANN_OPS_OPB_SYN_EXEC_ACLNN.md) | ||
| 82 | + - [CANN\_OPS\_OPB\_ASYN\_EXEC\_ACLNN](op_graph/CANN_OPS_OPB_ASYN_EXEC_ACLNN.md) | ||
| 83 | + | ||
| 80 | - [预留接口](reserved_interface_op_common.md) | 84 | - [预留接口](reserved_interface_op_common.md) |
| @@ -9,3 +9,5 @@ | |||
| 9 | - **[platform](platform/platform.md)** | 9 | - **[platform](platform/platform.md)** |
| 10 | 10 | ||
| 11 | - **[infershape](infershape/infershape.md)** | 11 | - **[infershape](infershape/infershape.md)** |
| 12 | + | ||
| 13 | +- **[op\_graph](op_graph/op_graph.md)** | ||
| @@ -307,6 +307,16 @@ | |||
| 307 | <td>reduce类算子的infershape方法。</td> | 307 | <td>reduce类算子的infershape方法。</td> |
| 308 | <td rowspan="1">op_common/op_host/infershape_reduce_util.h</td> | 308 | <td rowspan="1">op_common/op_host/infershape_reduce_util.h</td> |
| 309 | </tr> | 309 | </tr> |
| 310 | + <tr> | ||
| 311 | + <td rowspan="2">op_graph</td> | ||
| 312 | + <td><a href='op_graph/CANN_OPS_OPB_SYN_EXEC_ACLNN.md'>CANN_OPS_OPB_SYN_EXEC_ACLNN</a></td> | ||
| 313 | + <td>Aclnn接口在图场景的通用执行接口(同步接口),内部串行调用两阶段执行。</td> | ||
| 314 | + <td rowspan="2">op_common/op_graph/op_fallback.h</td> | ||
| 315 | + </tr> | ||
| 316 | + <tr> | ||
| 317 | + <td><a href='op_graph/CANN_OPS_OPB_ASYN_EXEC_ACLNN.md'>CANN_OPS_OPB_ASYN_EXEC_ACLNN</a></td> | ||
| 318 | + <td>Aclnn接口在图场景的通用执行接口(异步接口),内部调用了一阶段接口,并把二阶段注册给了GE的context</td> | ||
| 319 | + </tr> | ||
| 310 | <tr> | 320 | <tr> |
| 311 | <td><a href='reserved_interface_op_common.md'>预留接口</a></td> | 321 | <td><a href='reserved_interface_op_common.md'>预留接口</a></td> |
| 312 | <td>-</td> | 322 | <td>-</td> |
| @@ -0,0 +1,38 @@ | |||
| 1 | +# CANN\_OPS\_OPB\_ASYN\_EXEC\_ACLNN | ||
| 2 | + | ||
| 3 | +## 功能说明 | ||
| 4 | + | ||
| 5 | +Aclnn接口在图场景的通用执行接口(异步接口),内部调用了一阶段接口,并把二阶段注册给了GE的context | ||
| 6 | + | ||
| 7 | +## 函数原型 | ||
| 8 | + | ||
| 9 | +```cpp | ||
| 10 | +CANN_OPS_OPB_ASYN_EXEC_ACLNN(ctx, aclnnApi, ...) | ||
| 11 | +``` | ||
| 12 | + | ||
| 13 | +## 参数说明 | ||
| 14 | + | ||
| 15 | +| 参数名 | 输入/输出 | 说明 | | ||
| 16 | +| --- | --- | --- | | ||
| 17 | +| ctx | 输入 | 算子执行上下文(OpExecuteContext),用于托管算子参数并设置Workspace大小。 | | ||
| 18 | +| aclnnApi | 输入 | 待回调执行的ACLNN算子API名称,如aclnnScatterList。 | | ||
| 19 | +| ... | 输入 | 算子输入、输出及属性参数,支持gert::Tensor、gert::Tensor列表、标量、属性等类型。 | | ||
| 20 | + | ||
| 21 | +## 返回值说明 | ||
| 22 | + | ||
| 23 | +返回int类型,GRAPH_SUCCESS表示Prepare阶段准备成功,GRAPH_FAILED表示执行失败。 | ||
| 24 | + | ||
| 25 | +## 约束说明 | ||
| 26 | + | ||
| 27 | +无 | ||
| 28 | + | ||
| 29 | +## 调用示例 | ||
| 30 | + | ||
| 31 | +关键代码示例如下,仅供参考,不支持直接拷贝运行。 | ||
| 32 | + | ||
| 33 | +```cpp | ||
| 34 | +auto apiRet = CANN_OPS_OPB_ASYN_EXEC_ACLNN(hostApiCtx, aclnnScatterList, geTenserListVar, indices, update, mask, | ||
| 35 | + reduce, *axis); | ||
| 36 | +OP_CHECK_IF(apiRet != GRAPH_SUCCESS, OP_LOGE(hostApiCtx->GetNodeName(), "apiRet faild:%d", apiRet), | ||
| 37 | + return GRAPH_FAILED); | ||
| 38 | +``` | ||
| @@ -0,0 +1,38 @@ | |||
| 1 | +# CANN\_OPS\_OPB\_SYN\_EXEC\_ACLNN | ||
| 2 | + | ||
| 3 | +## 功能说明 | ||
| 4 | + | ||
| 5 | +Aclnn接口在图场景的通用执行接口(同步接口),内部串行调用两阶段执行。 | ||
| 6 | + | ||
| 7 | +## 函数原型 | ||
| 8 | + | ||
| 9 | +```cpp | ||
| 10 | +CANN_OPS_OPB_SYN_EXEC_ACLNN(ctx, aclnnApi, ...) | ||
| 11 | +``` | ||
| 12 | + | ||
| 13 | +## 参数说明 | ||
| 14 | + | ||
| 15 | +| 参数名 | 输入/输出 | 说明 | | ||
| 16 | +| --- | --- | --- | | ||
| 17 | +| ctx | 输入 | 算子执行上下文(OpExecuteContext),用于分配Workspace和获取Stream。 | | ||
| 18 | +| aclnnApi | 输入 | 待回调执行的ACLNN算子API名称,如aclnnScatterList。 | | ||
| 19 | +| ... | 输入 | 算子输入、输出及属性参数,支持gert::Tensor、gert::Tensor列表、标量、属性等类型。 | | ||
| 20 | + | ||
| 21 | +## 返回值说明 | ||
| 22 | + | ||
| 23 | +返回int类型,GRAPH_SUCCESS表示执行成功,GRAPH_FAILED表示执行失败。 | ||
| 24 | + | ||
| 25 | +## 约束说明 | ||
| 26 | + | ||
| 27 | +无 | ||
| 28 | + | ||
| 29 | +## 调用示例 | ||
| 30 | + | ||
| 31 | +关键代码示例如下,仅供参考,不支持直接拷贝运行。 | ||
| 32 | + | ||
| 33 | +```cpp | ||
| 34 | +auto apiRet = CANN_OPS_OPB_SYN_EXEC_ACLNN(hostApiCtx, aclnnScatterList, geTenserListVar, indices, update, mask, | ||
| 35 | + reduce, *axis); | ||
| 36 | +OP_CHECK_IF(apiRet != GRAPH_SUCCESS, OP_LOGE(hostApiCtx->GetNodeName(), "apiRet faild:%d", apiRet), | ||
| 37 | + return GRAPH_FAILED); | ||
| 38 | +``` | ||
| @@ -0,0 +1,5 @@ | |||
| 1 | +# op\_graph | ||
| 2 | + | ||
| 3 | +- **[CANN\_OPS\_OPB\_SYN\_EXEC\_ACLNN](CANN_OPS_OPB_SYN_EXEC_ACLNN.md)** | ||
| 4 | + | ||
| 5 | +- **[CANN\_OPS\_OPB\_ASYN\_EXEC\_ACLNN](CANN_OPS_OPB_ASYN_EXEC_ACLNN.md)** | ||
| @@ -84,3 +84,58 @@ | |||
| 84 | | FloorAlign\<T\>(T a, T b) | kernel侧向下对齐。 | | 84 | | FloorAlign\<T\>(T a, T b) | kernel侧向下对齐。 | |
| 85 | | GetUbBlockSize() | kernel侧获取UB block单元大小(32bytes)。 | | 85 | | GetUbBlockSize() | kernel侧获取UB block单元大小(32bytes)。 | |
| 86 | | GetVRegSize() | kernel侧获取向量寄存器大小。 | | 86 | | GetVRegSize() | kernel侧获取向量寄存器大小。 | |
| 87 | +| aclOpExecutor | acl算子执行器结构体类型。 | | ||
| 88 | +| aclTensor | acl张量结构体类型。 | | ||
| 89 | +| aclScalar | acl标量结构体类型。 | | ||
| 90 | +| aclTensorList | acl张量列表结构体类型。 | | ||
| 91 | +| \_aclCreateTensor | aclCreateTensor接口的函数指针类型。 | | ||
| 92 | +| \_aclCreateScalar | aclCreateScalar接口的函数指针类型。 | | ||
| 93 | +| \_aclCreateIntArray | aclCreateIntArray接口的函数指针类型。 | | ||
| 94 | +| \_aclCreateFloatArray | aclCreateFloatArray接口的函数指针类型。 | | ||
| 95 | +| \_aclCreateBoolArray | aclCreateBoolArray接口的函数指针类型。 | | ||
| 96 | +| \_aclCreateTensorList | aclCreateTensorList接口的函数指针类型。 | | ||
| 97 | +| \_aclDestroyTensor | aclDestroyTensor接口的函数指针类型。 | | ||
| 98 | +| \_aclDestroyScalar | aclDestroyScalar接口的函数指针类型。 | | ||
| 99 | +| \_aclDestroyIntArray | aclDestroyIntArray接口的函数指针类型。 | | ||
| 100 | +| \_aclDestroyFloatArray | aclDestroyFloatArray接口的函数指针类型。 | | ||
| 101 | +| \_aclDestroyBoolArray | aclDestroyBoolArray接口的函数指针类型。 | | ||
| 102 | +| \_aclDestroyTensorList | aclDestroyTensorList接口的函数指针类型。 | | ||
| 103 | +| ResetCacheThreadLocal | ResetCacheThreadLocal接口的函数指针类型。 | | ||
| 104 | +| GET\_OP\_API\_FUNC(apiName) | 获取指定acl算子API的函数地址,并转换为对应的函数指针类型。 | | ||
| 105 | +| index\_sequence\<Is...\> | 编译期索引序列结构体模板。 | | ||
| 106 | +| make\_index\_sequence\_helper\<N, Is...\> | 编译期索引序列生成辅助结构体模板。 | | ||
| 107 | +| make\_index\_sequence\<N\> | 生成编译期索引序列的别名模板。 | | ||
| 108 | +| GetOpApiLibName() | 获取内置opapi算子库名称。 | | ||
| 109 | +| GetCustOpApiLibName() | 获取自定义算子opapi库名称。 | | ||
| 110 | +| GetOpApiFuncAddrInLib(void \*handler, const char \*libName, const char \*apiName) | 从指定动态库中按符号名查找函数地址。 | | ||
| 111 | +| GetOpApiLibHandler(const char \*libName) | 加载指定动态库并返回句柄。 | | ||
| 112 | +| GetAclnnAddrByApiName(const char \*apiName) | 遍历opapi领域库查找函数地址。 | | ||
| 113 | +| GetOpApiFuncAddr(const char \*apiName) | 依次从cust\_opapi库、opapi库、领域库中查找函数地址。 | | ||
| 114 | +| GetConvertType(const gert::Tensor \*ge\_tensor) | 将ge数据类型转换为acl数据类型。 | | ||
| 115 | +| ConvertType(const gert::Tensor \*ge\_tensor) | 将ge Tensor转换为acl Tensor。 | | ||
| 116 | +| ConvertType(std::vector\<const gert::Tensor \*\>\& ge\_tensorList) | 将ge Tensor列表转换为acl TensorList。 | | ||
| 117 | +| ConvertType(T value) | 通用类型转换模板,非Tensor类型原样返回。 | | ||
| 118 | +| ConvertScalarType(T value) | 将标量转换为acl Scalar。 | | ||
| 119 | +| Release(aclTensor \*p) | 释放acl Tensor。 | | ||
| 120 | +| Release(aclScalar \*p) | 释放acl Scalar。 | | ||
| 121 | +| Release(aclTensorList \*p) | 释放acl TensorList。 | | ||
| 122 | +| Release(T value) | 通用类型释放模板,非acl类型不做处理。 | | ||
| 123 | +| CallRelease(Tuple t, index\_sequence) | 展开tuple并逐个调用Release释放资源。 | | ||
| 124 | +| ReleaseConvertTypes(Tuple \&t) | 释放tuple中所有转换结果。 | | ||
| 125 | +| ConvertTypes(Ts\&... args) | 将多个ge类型参数转换为acl类型并打包为tuple。 | | ||
| 126 | +| call(Function f, Tuple t, index\_sequence) | 展开tuple参数并调用目标函数。 | | ||
| 127 | +| call(Function f, Tuple t) | 展开tuple参数并调用目标函数。 | | ||
| 128 | +| ConvertToOpApiFunc(params, opApiAddr, index\_sequence) | 将函数地址转换为与参数类型匹配的函数指针。 | | ||
| 129 | +| ConvertToOpApiFunc(params, opApiAddr) | 将函数地址转换为与参数类型匹配的函数指针。 | | ||
| 130 | +| OpApiAnyValueDeleter | 通用参数资源销毁函数指针类型。 | | ||
| 131 | +| OpApiAnyValue | 通用参数容器结构体,保存参数指针及其销毁器。 | | ||
| 132 | +| OpApiFunc2Stage | 两阶段Launch函数指针类型。 | | ||
| 133 | +| OpApiParams | 两阶段执行参数结构体,封装转换后的参数列表、算子执行器与Launch函数。 | | ||
| 134 | +| Collect(aclTensor \*p, std::vector\<OpApiAnyValue\>\& params) | 收集acl Tensor参数及其销毁器到参数列表。 | | ||
| 135 | +| Collect(aclScalar \*p, std::vector\<OpApiAnyValue\>\& params) | 收集acl Scalar参数及其销毁器到参数列表。 | | ||
| 136 | +| Collect(aclIntArray \*p, std::vector\<OpApiAnyValue\>\& params) | 收集acl IntArray参数及其销毁器到参数列表。 | | ||
| 137 | +| Collect(aclBoolArray \*p, std::vector\<OpApiAnyValue\>\& params) | 收集acl BoolArray参数及其销毁器到参数列表。 | | ||
| 138 | +| Collect(aclTensorList \*p, std::vector\<OpApiAnyValue\>\& params) | 收集acl TensorList参数及其销毁器到参数列表。 | | ||
| 139 | +| Collect(T value, std::vector\<OpApiAnyValue\>\& params) | 通用参数收集模板,非acl类型不做处理。 | | ||
| 140 | +| CallCollect(Tuple t, index\_sequence, std::vector\<OpApiAnyValue\>\& params) | 展开tuple并逐个调用Collect收集参数。 | | ||
| 141 | +| CollectConvertedTypes(Tuple \&t, std::vector\<OpApiAnyValue\>\& params) | 收集tuple中所有转换后的参数及其销毁器。 | | ||
| @@ -77,8 +77,6 @@ namespace fallback { | |||
| 77 | (ret); \ | 77 | (ret); \ |
| 78 | }) | 78 | }) |
| 79 | 79 | ||
| 80 | - | ||
| 81 | - | ||
| 82 | 80 | ||
| 83 | ({ \ | 81 | ({ \ |
| 84 | static auto ret = GRAPH_SUCCESS; \ | 82 | static auto ret = GRAPH_SUCCESS; \ |
| @@ -120,7 +118,6 @@ namespace fallback { | |||
| 120 | } while (false); \ | 118 | } while (false); \ |
| 121 | (ret); \ | 119 | (ret); \ |
| 122 | }) | 120 | }) |
| 123 | - | ||
| 124 | } // namespace fallback | 121 | } // namespace fallback |
| 125 | 122 | ||
| 126 | 123 | ||