Tik语言要素

华为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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值