HALIDE环境配置 添加链接描述
这篇文章的内容主要来自于Halide官方教程。Halide前端描述算法的计算方式和流水调度,让算法运行得尽可能地快。算法调度的内容牵扯到计算平台架构和算法,为便于调整代码的性能,Halide里的调度原语可用于屏蔽底层硬件的底层细节。这篇简要记录官方教程第四节到第八节,包括相关API。
常用的调度原语包括:
- reorder:改变各层循环的遍历顺序(默认行序遍历,如可修改成列序遍历);
- split:拆解一个循环成两个循环;
- fuse:合并两个循环成一个循环;
- split+reorder:实现分块遍历图像;
- tile: 等效于两个split,产生分块遍历;
- vectorize:指定某个循环维度,进行向量化;
- parallel:指定某个循环纬度,进行并行化;
- print_loop_nest:打印循环遍历的顺序;
- 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会等到全部计算完毕再开始下一个阶段)。