正如上一篇所说的,TVM借用了Halide的思想,将计算(compute)和用户计算加速的调度(schedule)分离,所以从业务场景上说,只要算法团队写好了算法,工程团队把schedule写好,就能用比较高效的方式部署业务应用了。
先用一个例子说明一下TVM是怎么做到计算和调度分离的
假如说用户想实现一个简单的矩阵按行reduction操作
1 | B = numpy.sum(A, axis=1) |
那么TVM怎么把这个计算实现呢?
1 | B = topi.sum(A, axis=1) |
对的这就实现了。
这时候有人就问,TVM操作靠谱不靠谱啊,talk is cheap, show me the code
1 | ts = te.create_schedule(B.op) # 创建调度实例 |
OK计算做好了,那么调度呢,并行优化呢,没看见你有写嘛
下面我们对这个简单的算法进行并行优化
优化思想如下:
即多个thread并发执行,每个thread处理不同的行
为了让搞CUDA的同事失业,下面并行化在CUDA上实现
在保持当前算法不变的情况下,代码修改如下
1 | from __future__ import absolute_import, print_function |
实验结果
这里需要把n, m变大效果才明显
CPU: Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz
TVM CUDA GTX1080(ms) | numpy CPU 单核(ms) | |
---|---|---|
n=1024, m=1024 | 0.684666 | 98.118 |
n=1024, m=4096 | 2.627865 | 378.038883 |
当然大家完全可以基于这个框架部署不同的算法,有机会再讲
后记
有算法并行加速问题欢迎找我讨论,love & peace