华为Tbe-Tik算子开发一些简单的知识
想学还是要去官网学,链接在下面
1. Tik 管理容器
tik.TIk #用于创建Tik DSL容器 tik.Tik.BulidCCE #用于将TIK DSL容器中的语句编译为昇腾AI处理器可执行代码 #exemple tik_instence=tik.Tik(disable_debug=False) input_tensor=tik.instance.Tensor(...) input_Scalar=tik.instance.Scalar(...) output_tensor=tik.instance.Tensor(...) tik.instance.BulidCCE(kernel_name='my_first_tik_program', inputs=[input_tensor], outputs=[oput_tensor])
2. Scalar(标量)
#使用之前先声明 #几种定义方式 def scalar_sample(): tik_instence=tik.Tik(disable_debug=False) #1 初始化:数据类型、名字、初值 data_A=tik.instance.Scalar(dtype='float32',name='data_A',init_value=10.1) tik_instance.tikdb.debug_print('data_A')#用来debug并输出data_A #2 初始化:数据类型、初值 data_B=tik.instance.Scalar(dtype='int16',init_value=5) tik_instance.tikdb.debug_print('data_B') #3 初始化:数据类型 + set_as(初值) data_C=tik.instance.Scalar(dtype='int32') data_C.set_as(8) tik_instance.tikdb.debug_print('data_C') tik.instance.BulidCCE(kernel_name='scalar_sample', inputs=[], outputs=[]) return tik_instance
3. Tensor(张量)
ub在芯片上,gm在内存中
from tbe import tik def tensor_sample(): tik_instance=tik.Tik(disable_debug=False) data_A=tik_instance.Tensor('int16',(4,),name='data_A',scope=tik.scope_ubuf) data_B=tik_instance.Tensor('int16',(4,),name='data_B',scope=tik.scope_ubuf) tenor_X=tik_instance.Tensor('int16',(2,2),name='tenor_X',scope=tik.scope_ubuf) scolar_A=tik_instance.Scalar('int16') scolar_A.set_as(1) tenor_X[0].set_as(scolar_A) scolar_A.set_as(2) tenor_X[1].set_as(scolar_A) scolar_A.set_as(3) tenor_X[2].set_as(scolar_A) scolar_A.set_as(4) tenor_X[3].set_as(scolar_A) scolar_A=tik_instance.Scalar(dtype='int16',init_value=4) data_B[1].set_as(scolar_A)#data_B的第2项赋值为4 tik_instance.tikdb.debug_print('data_B') data_A[0].set_as(data_B[1])#data_A的第1项赋值为4 print(data_A.shape) tik_instance.tikdb.debug_print('data_A') data_C=data_A.reshape((2,2)) print(data_C.shape) tik_instance.tikdb.debug_print('tenor_X') tik_instance.tikdb.debug_print('data_C') data_D=data_A.reinterpret_cast_to('uint32')#将int16数据data_A强制转换为uint32 tik_instance.tikdb.debug_print('data_D') data_E=data_C.reinterpret_cast_to('uint32')#将int16数据data_A强制转换为uint32 tik_instance.tikdb.debug_print('data_E') tik_instance.BuildCCE(kernel_name='tensor_sample', inputs=[], outputs=[]) return tik_instance if __name__=='__main__': tik_instance=tensor_sample() tik_instance.tikdb.start_debug(feed_dict={},interactive=True) #python的原生代码比如print会在debug开始的时候就全部执行
[4] [2, 2] c [TIK]>c [-23258 4 -10458 27414] [ 4 -6186 -5904 17635] [[1 2] [3 4]] [[ 4 -6186] [-5904 17635]] [3889561604 1155786992] [[3889561604] [1155786992]]
4. 程序控制接口
from tbe import tik def program_sample(): tik_instance=tik.Tik(disable_debug=False) scalar_a=tik_instance.Scalar('int16',init_value=4) #if-else with tik_instance.if_scope(scalar_a>4): scalar_a.set_as(100) with tik_instance.else_scope(): scalar_a.set_as(200) tik_instance.tikdb.debug_print('scalar_a') #for with tik_instance.for_range(0,10) as i:#一般只配置初始和结束位置0 1 2...9,i作为循环变量 tik_instance.tikdb.debug_print('i') data_A=tik_instance.Tensor('int16',(4,),name='data_A',scope=tik.scope_ubuf) tik_instance.tikdb.debug_print('data_A')#如果不给数据赋值将会得到随机数 #return tik_instance.tik_return()#直接退出了调试 tik_instance.tikdb.debug_print('data_A')#没有执行 tik_instance.BuildCCE(kernel_name='program_sample', inputs=[], outputs=[]) return tik_instance if __name__=='__main__': tik_instance=program_sample() tik_instance.tikdb.start_debug(feed_dict={},interactive=True)
5. Tik计算指令接口
指令接口分类
标量运算
#举例 #scalar_sqrt(dst,src) from tbe import tik def scalar_com(): tik_instance=tik.Tik(disable_debug=False) src_scalar=tik_instance.Scalar(dtype='int64') src_scalar.set_as(16) dst_scalar=tik_instance.Scalar(dtype='int64') tik_instance.scalar_sqrt(dst_scalar,src_scalar) tik_instance.tikdb.debug_print('dst_scalar') tik_instance.BuildCCE(kernel_name='scalar_com', inputs=[], outputs=[]) return tik_instance if __name__=='__main__': tik_instance=scalar_com() tik_instance.tikdb.start_debug(feed_dict={},interactive=False)
$$
dst= \sqrt{scr}
$$
4
矢量运算
数据处理
-
数据搬运 data_move
-
数据需要搬移到芯片上才能计算
-
32B=1Block
-
256B=8Block=1repeat(迭代的单位)
这块不操作或者只讲一遍很难听懂
SIMD指令执行模型(单指令操作多数据)
-
mask可以选择一次repeat计算的256B哪些数据参与计算 如果要算所有的float32的数据(4个字节)
$$
mask=\frac{256}{4}=64
$$ -
repeat_times:[0,255]最多算255次
-
dst_rep_stride,dst_rep_stride指的是上一次计算的头,到下一次计算的头,如果是连续就是8个Block(即1repeat)
6. 总结
昇腾CANN系列教程-TBE算子开发(高级)_在线课程_华为云开发者学堂_云计算培训-华为云 (huaweicloud.com)