在计算机科学和深度学习领域,算子 tiling(有时也被称作操作符 tiling 或者循环 tiling)是一种优化技术,主要用于提高计算效率,尤其是在处理大规模张量运算时。Tiling 技术通常用于将大的计算任务分解成更小的块,这些小块可以在内存中更高效地处理,或者更适合并行计算环境。
在深度学习框架中,算子 tiling 可以应用于不同的场景:
在深度学习模型的实现过程中,特别是在卷积神经网络(CNNs)中,经常会遇到需要对输入数据进行切片处理的情况。例如,在一些深度学习框架中,可以使用特定的API来实现 tiling 操作。
需要注意的是,“tiling”一词在不同的上下文中可能有不同的含义。在图像处理中,tiling 也可能指的是将图像分割成多个小块(tiles),以便于独立处理或存储。而在计算机图形学中,tiling 则可能涉及到纹理映射或屏幕渲染中的技术。不过,在上述情况下讨论的“算子 tiling”主要指的是与计算优化相关的一种技术。
tiling操作输出的数据,就叫做tilingdata,是kernel的分片参数,用于决定kernel实际计算时的分片策略。在ATB中(ATB是什么? - 知乎 (zhihu.com))通常以结构体的形式存储,由用户输入的参数与张量Shape计算而来。
tiling data的计算通常放到host侧,tiling data在host侧计算完毕后,ATB再将其拷贝到device侧,作为kernel的输入提供给kernel。
既然是host->device肯定涉及到内存的拷贝,那如何优化这种拷贝任务也需要一种设计上的优化。在ATB中,存在三种不同的tiling data搬移策略:tiling整体搬移、多stream搬移、tiling随kernel下发搬移,当前默认使用的是tiling随kernel下发搬移这一方式。
tiling整体搬移方式会把每次计算出的tiling data存放到一片连续的host内存中,待所有kernel的tiling data计算完成后,再一次性搬移到device侧。
在性能优化方面,内存整体搬移相较于单个内存搬移,肯定是由有优势的。机器指令下发次数少,机器寻址次数也少。
多stream搬移方式则是针对整体搬移方式做出的改良,其核心思路是通过stream并行的方式来减少tiling data搬移所消耗的时间。在该搬移策略中,ATB会准备好两个stream、一个环状的device缓冲区以及一系列同步信号量。
如上这种方式,也就是将tiling搬移作为异步任务下发,与kernel的执行形成流水的任务。这也是性能优化一种常用的手段。
注意:多stream搬移方式下的tiling data还是多个kernel的tiling data,不是单kernel的tiling data。
3.3 tiling随kernel下发搬移
该策略对tiling整体搬移方式进行了性能优化,但优化方式与多stream搬移方式不同。
tiling随kernel下发搬移的核心思路是:
如下图所示,相较于多stream搬移方式,在tiling data搬移速度过快时会导致的device缓存区不足,从而导致tiling data被覆盖,tiling随kernel下发搬移的方式不受两者(tiling data拷贝速度与kernel执行速度)速度的限制,且性能优化也更进一步。
tiling随kernel下发搬移策略
这种方式下,还是一个异步操作。
疑问:性能上相比多stream搬移方式有提升吗?感觉是是差不多的,主要是不是解决device缓存区不足,从而导致tiling data被覆盖的问题?
参考:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。