Halide(五)算法调度

这篇博客应该紧跟在第二节  Halide(二)算法描述 后面的,也是对官方教程的笔记。前面介绍了如何用Halide描述算法,进行调试,这一节就是讲如何对去调度算法,排算法的流水,让算法运行更快。

算法调度是一个很深入的课题,牵扯都各种平台、算法,这篇博客也仅仅是对官方教程第四节到第八节的简要笔记,记录一下Halide的相关API。

建议看教程代码,博主的笔记只是自己记下重点。

lesson5

reorder:可以改变循环遍历的顺序(默认行序遍历,可以修改成列序遍历)

splite:可以将一个循环拆解成两个循环

fuse:可以将两个循环合并成一个循环

splite+reorder:可以实现分块遍历图像

tile: 等效于两个splite,用于直接产生分块儿遍历的效果

vectorize:指定某个循环维度,进行向量化

parallel:指定某个循环纬度,进行并行化

print_loop_nest:打印循环遍历的顺序

lesson8

compute_root:提前计算该变量的状态值,并保存下来(相当于分了两个阶段)。

p.compute_at(c,y): 对于c,每个y坐标的值,需要计算p, 即p在c的y循环上计算 ,把p的行算完,再算c,相当于按照行,把计算分为两阶段(这样会把p的代码放在c 的for y循环里面,可以节省内存,因为只留了行buffer)

store_root: 在最外层循环外,预留一块儿buffer来保存所有结果。教程例子很好,对于有重复计算中间结果的算法,保存下所有结果,可以省去许多冗余计算

store_root + compute_at: 可以使数据存取调度单位更小(compute_at 会利用刚用过的数据,再次使用速度会快很多,而compute root会等到全部计算完毕再开始下一个阶段)

 

 

发表评论