多面体编译,具体操作模式
1)
抽象分析阶段是基于ISL、PET 等开源库的方式来实现。PET 库是基于LLVM
编译框架与Clang 前端的多面体模型库。系统利用PET 库自动识别并抽取代码
中存在的静态控制块(静态控制块是代码的主要优化区域,常见的样式为嵌套
循环等),并对静态控制块进行迭代域、访问关系与依赖关系的分析,完成多
面体建模。识别出程序中的内核函数,使用ISL 库中的Feutrier 算法计算得到实
例间的依赖关系。线性整数规划工具ISL 以库的形式封装在多面体编译工具内。
2)
在变换过程中,首先输入串行C 语言代码,利用PET 库自动识别并抽取代
码中存在的静态控制块,在当前的实现中,数据传输是自动处理的,只发生在
静态控制循环嵌套的开始和结束,使用#pragma 标识。其次,使用ISL 为程序中
的依赖关系构建重调度所需的限制条件,并利用ISL 库中的增量调度求解器为
静态控制块求解出调度树,以便找到程序中具有并行性的带节点。
3)
在满足依赖关系的前提下,对默认的原始调度重计算转换成一个新的调度,
实质上是多维空间几何的变基过程,目的是找到程序中具有并行性的循环。将
具有并行性的调度带以及子树映射到DCU,旨在提升程序的并行性和数据的局
部性。
4)
将调度树中具有并行性的外层调度带节点及其子树标记为kernel 节点,表
示为一个内核函数,并按层次分别映射到DCU 的线程块和线程,调度带上层部
分生成主机端代码。接着,对于分块后的块循环,依据数组访问关系分析块循
环的单次迭代中语句访问数组的重叠情况,若存在被不同线程束重叠使用的数
组区域,则将其放入共享内存中。此时,在调度树中插入共享内存申请及拷贝
节点。
5)
在代码生成阶段,根据生成的调度树生成抽象语法树(AST)。使用ISL API
完成AST 的生成,将调度树中的节点转换为ISL-AST 表达式,计算出grid_size
的AST 表达式,对设备端数组声明、空间申请规模的计算表达式,同步语句的
AST 节点,还有其他的一些数据传输节点:init/clear/copy_to/copy_form device。
感觉是这个流程
使用了PET和ISL
感谢《基于多面体模型的国产DCU源源编译优化技术研究_牛靖钰》