【昇腾CANN训练营】AscendC编程简单问答(一)

举报
黄生 发表于 2025/08/11 16:43:30 2025/08/11
【摘要】 问: msopgen里面的-f选项有什么用?会生成什么文件呢?答: 在msopgen工具中,-f选项用于指定生成的算子工程框架类型。具体来说,-f aclnn表示生成的是简易自定义算子工程,该工程支持通过单算子API执行(aclnn)方式进行调用。使用这个选项时,生成的工程将包含算子host侧代码实现文件、kernel侧实现文件以及工程编译配置文件等,这些都是后续进行算子开发所必需的模板文件...

问: msopgen里面的-f选项有什么用?会生成什么文件呢?
答: 在msopgen工具中,-f选项用于指定生成的算子工程框架类型。具体来说,-f aclnn表示生成的是简易自定义算子工程,该工程支持通过单算子API执行(aclnn)方式进行调用。使用这个选项时,生成的工程将包含算子host侧代码实现文件、kernel侧实现文件以及工程编译配置文件等,这些都是后续进行算子开发所必需的模板文件。-f选项如下:

  -f FRAMEWORK, --framework FRAMEWORK
                        <Optional> op framework type(case insensitive) tf, tensorflow, caffe, ms, mindspore, onnx, aclnn, pytorch.

对于初学者来说,建议使用选项 -f alcnn 这样生成的目录更简洁清爽。生成的目录如下:

├── cmake
│   └── util
│       └── makeself
├── op_host
└── op_kernel

如果不指定该选项,默认是tf,生成的目录如下:

├── cmake
│   └── util
│       └── makeself
├── framework
│   └── tf_plugin
├── op_host
├── op_kernel
└── scripts

问: msopgen会生成相关调用代码吗?
答: 不会。不管是kernel直调,或是aclnn二段式API接口调用,或是ST测试调用,或是框架调用,调用代码都可以参考samples仓、或者cann-ops仓里面的调用代码来写。

问: 介绍下算子的kernel直调工程
答: 算子的kernel直调工程是一种专为开发者快速完成算子Kernel直调而设计的工程框架,旨在简化算子开发与调试过程。该工程支持printf功能与DumpTensor功能,便于开发者进行调试与性能分析,同时可以通过msProf命令行采集和解析性能数据。
kernel直调分为CPU侧和NPU侧调用两种方式。CPU侧通过ICPU_RUN_KF宏调用,而NPU侧则通过Kernel Launch接口或<<<>>>内核调用符进行调用。工程目录通常包括CMake编译文件、算子实现文件及主程序文件,开发者需完成算子kernel侧实现、编写调用应用程序及相应的CMake配置,最终通过执行编译运行脚本完成算子的编译与调用验证。因为砍掉了算子部署的过程,此工程较大地方便了算子的功能快速验证与优化。

问: 标准算子工程/自定义算子工程的kernel侧实现,可以直接拿到kernel直调工程里使用吗?
答: 不可以。目前kernel直调工程的CMake编译配置,相比标准算子工程,缺少一些编译过程中宏的处理,比如在TilingData结构体定义中使用的宏,以及算子输入输出张量的类型定义的宏( DTYPE_X 泛型参数等),所以对应需要做一些小小的修改,但大部分代码是可以使用的。

问: 什么是 DTYPE_X ?
答: ​​DTYPE_X 是由 AscendC 框架在编译期根据算子输入参数的实际数据类型自动推导生成的宏​​,它 ​​并不是一个全局预定义的常量或类型​​,而是 ​​依赖于开发者在算子接口中声明的输入参数名称和类型,并通过框架在编译时生成对应的DTYPE_<Arg>宏,其中<Arg>需替换为参数名称的大写形式(如输入参数x对应DTYPE_X)

问: workspace参数有什么用,为什么在kernel直调工程里不需要这个参数?
答: workspace参数主要用于提供额外的内存空间,以支持算子计算过程中所需的临时数据存储或中间结果缓存,特别是对于像Matmul这类复杂计算,系统可能需要额外的workspace来存储中间状态或优化计算流程。对于高阶API(如Matmul),系统workspace是必须的,它由框架管理,包含用户workspace和系统自身需要的空间,开发者通常只需设置总空间大小,框架会自动处理分配与管理。
但在Kernel直调工程中,workspace参数通常不需要开发者显式传递或管理,原因在于:当开启 -DHAVE_WORKSPACE 编译选项时,框架会自动为核函数设置好系统workspace,开发者无需手动调用如 SetSysWorkSpace 接口来传递或设置该参数。因此,在正确配置编译选项的情况下,kernel直调工程可以隐式使用workspace而无需显式传递该参数。

问: AscendC::GetBlockNum() 获取的是什么?
答: 该函数返回的是当前任务中配置的核的总数,开发者可以利用这个值来进行多核计算时的逻辑分配与控制。但它不一定等于NPU拥有的物理核的总数。

问: TilingContext是个什么东西?它是怎么获取的?Kernel直调,可以访问到TilingContext 吗?
答: TilingContext 是 AscendC 算子开发中用于 Tiling(数据切分)计算的核心上下文类,主要负责在算子 Tiling 阶段提供必要的上下文信息与接口,包括获取算子的输入输出 shape、输入张量信息、Tiling 参数以及访问硬件平台信息等。它为开发者提供了设置和获取 TilingKey、BlockDim、TilingData、Workspace 等关键信息的接口,使得开发者可以根据硬件资源与输入数据特征,灵活地制定数据切分与并行计算策略。
TilingContext 通常 不是直接实例化 的,简言之,TilingContext 是在算子 Tiling 实现过程中,通过特定的构建流程间接获取并使用的上下文对象,用于支撑算子执行前的数据切分与调度决策。
在Kernel直调工程中,​​不可以访问TilingContext​​。

问: 访问不到TilingContext,我想在Kernel直调里访问硬件平台信息,怎么办呢?
答: 在Kernel直调工程中,虽然无法直接访问TilingContext,但开发者可以通过PlatformAscendCManager类来获取硬件平台信息。该类是专为Kernel直调场景设计的,通过单例模式提供硬件平台信息访问功能。
开发者只需包含头文件#include "tiling/platform/platform_ascendc.h",并在编译时链接tiling_apiplatform动态库,即可使用PlatformAscendCManager::GetInstance()获取平台对象。通过该对象,您可以调用如GetCoreNum()(获取总核数)或GetCoreNumAic()/GetCoreNumVector()(分别获取Cube Core和Vector Core核数,仅限分离架构)等方法,直接查询当前NPU硬件的核心资源配置。

问: 我看算子API接口文档中,有的标注了ISASI是什么意思?
答: ISASI是 Instruction Set Architecture Special Interface 的缩写,是硬件体系结构相关的接口,主要用于直接访问和操作硬件底层能力,例如核内同步(如SetFlag/WaitFlag)、内存管理、流水线控制等与硬件体系结构紧密相关的功能。但需要注意的是,由于ISASI接口直接依赖于硬件体系结构,它们通常不能保证跨硬件版本的兼容性,使用时需确保目标硬件平台支持相应接口,并谨慎管理事件ID和同步逻辑,以避免未定义行为或性能损失。
在常规开发中,推荐优先使用保证兼容性的高阶API。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。