背景
看代码的时候,一直有一个疑问,在https://gitee.com/ascend/cann-ops/中的算子,并没有显示的定义aclnn*GetWorkspaceSize和aclnn*这2个接口函数(*表示具体的算子),算子调用的时候,又直接使用的是这2个接口,那这2个接口,是怎么来的呢?
比如查看foreach_norm算子目录下:
[root@localhost foreach_norm]# pwd
/root/zjun/cann-ops/src/foreach/foreach_norm
[root@localhost foreach_norm]# tree
.
├── CMakeLists.txt
├── docs
│ └── aclnnForeachNorm.md
├── examples
│ └── AclNNInvocationNaive
│ ├── CMakeLists.txt
│ ├── gen_data.py
│ ├── main.cpp
│ ├── README.md
│ ├── run.sh
│ └── verify_result.py
├── op_host
│ └── foreach_norm.cpp
├── op_kernel
│ ├── foreach_norm.cpp
│ └── foreach_norm.h
├── opp_kernel_aicpu
├── README.md
└── tests
├── st
└── ut
9 directories, 12 files
在这些文件中,去找aclnn开头的,但是并没有,如下图所示:

抱着好奇,那这2段式的接口,到底是怎么生成的呢?
过程分析
这步骤,我们先从结果进行分析发现,通过编译过程,会发现如下代码:

也就是在autogen的目录,会生成aclnn_foreach_norm.cpp文件。
打开主路径(cann-ops)路径下的文件编译后的生成的文件:build/autogen/aclnn_foreach_norm.cpp
会发现如下的函数定义:
aclnnForeachNormGetWorkspaceSize
aclnnStatus aclnnForeachNormGetWorkspaceSize(
const aclTensorList *x,
const aclScalar *scalar,
const aclTensorList *out,
uint64_t *workspaceSize,
aclOpExecutor **executor)
{
aclnnForeachNorm
aclnnStatus aclnnForeachNorm(
void *workspace,
uint64_t workspaceSize,
aclOpExecutor *exec

最低0.47元/天 解锁文章
1859

被折叠的 条评论
为什么被折叠?



