Hybrid 前端开发指南#

如果你是开发者:

1. who is trying writing some preliminary patterns that have not been supported by TVM yet, maybe Hybrid 前端语言参考 is a better place for you.

  1. 想知道这个模块的实现细节,就在这里!

特性#

软件仿真#

在软件仿真中,最有趣的是装饰器 tvm.te.hybrid.script。此装饰师帮助了两件事:

  1. 导入运行时变量

  2. 根据传递的参数重载函数

如果我错了请纠正我:我相信:1. 执行是危险的,但我别无选择。我所做的就是将这些名字添加到 Python 字典 func.__global__ 中,并在调用 func 完成后,这些名称将被清除。

重载很简单:装饰器检查参数的类型,并确定应该实际调用哪个函数。

后端编译#

编译是很大的模块,你可以查看 python/tvm/te/hybrid/ 了解更多细节。第一阶段决定使用,或者更准确地说,每个变量的声明,第二阶段实际生成 IR。

属性#

到目前为止,只支持张量的 shape 属性。你可以在 python/tvm/te/hybrid/parser.py 中查看 visit_Subscript 了解更多细节。这是很糟糕的解决方案,我只检查下标时的属性。

循环#

在 HalideIR 中,循环总共有 4 种类型:serialunrolledparallelvectorized

备注

不像在 HalideIR 中那样,在 loop_type(a, b) 中,a 是起点,b 是迭代次数。这里 loop_type(a, b) 表示 [a, b)。因此,当 lower 到 HalideIR 时,则为 start, extent = a, b - a

备注

在 HalideIR,这些是枚举,它们是 passive 形式。这里我们使用 active 形式来注释循环,因为它们已经准备好运行了。

变量#

因为 HalideIR 中没有变量,所有的可变变量都将 lower 大小为 1 的数组。它将变量的第一个存储区作为它的声明。

数学指令#

到目前为止,这些数学指令,logexpsigmoidtanhpowerpopcount 是支持的。装饰器将导入数学指令。除了 popcountsigmoid 外,大多数指令都被库的实现所借用。我手动执行它们。

Casting#

可以把值通过使用关键字 uint8, uint16 uint32, uint64, int8, int16, int32, int64, float16, float32, float64 cast。