在章节CANN算子类型介绍中,我们了解到CANN算子有几种开发方式:TBE DSL、TBE TIK与AI CPU。针对全新开发的算子,在进行代码开发前,首先需要选择合适的算子实现方式。
本节我们就介绍全新开发算子的场景下,如何进行算子开发方式的选择,并以一些具体实例进行介绍。
TBE DSL计算接口已高度封装,开发者仅需完成计算过程的表达,后续的调度、优化及编译都可通过已有接口一键式完成,实现较为简单。
但提供的TBE DSL计算接口有限,一般适用于实现多个向量运算的组合;对于较复杂的矩阵类计算接口,不支持与其他计算接口组合使用,详细可参见TBE DSL API中对应接口的约束说明。
若通过TBE DSL计算接口,无法表达算子的计算逻辑,则参见2.c。
TBE TIK适用各类算子的开发,对于无法通过lambda表达描述的复杂计算场景也有很好的支持,例如排序类操作。但此开发方式难度较大,需要开发者使用TBE TIK提供的API完成计算过程的描述及Schedule过程,需要手工控制数据搬运的参数和调度。
- |
CANN内置算子组合 |
TBE DSL |
TBE TIK |
AI CPU |
---|---|---|---|---|
语言 |
C++ |
Python |
Python |
C++ |
推荐级别 |
优选 |
次优选 |
次选 |
再次选 |
优点 |
|
TBE DSL开发方式无需感知硬件内部逻辑,入门较快。 |
TBE TIK对数据的操作更加灵活,开发者自行控制数据搬运的参数和Schedule过程,对于熟悉昇腾AI处理器架构的开发者,可以很快开发出高效的算子。 |
|
适用场景 |
功能可以通过CANN内置算子组装实现的场景。 |
适用于逻辑简单的向量运算。 |
适用各类算子的开发,对于无法通过lambda表达描述的复杂计算场景也有很好的支持,例如排序类操作。 |
无法通过AI Core实现某些算子,或者需要临时快速打通网络的场景。 |
不足 |
仅支持需要实现的逻辑可通过内置算子组合实现的场景。 |
|
开发难度较大,需要理解昇腾AI处理器架构,并且需要熟悉TIK API特征。 |
|
优先分析DSL计算接口,sqrt(x)可以通过tbe.dsl.vsqrt接口实现,除法可以通过tbe.dsl.vdiv接口实现,所以此算子可以选用TBE DSL的开发方式实现。
由于此算子涉及对tensor的不同维度上的不同元素同时计算,TBE DSL计算接口无法满足此算子的计算要求,所以需要考虑使用TIK方式进行实现。