290 likes | 716 Views
龙芯编译器中多面体优化技术的研究与实现. 胡士文 指导老师:冯晓兵 连瑞琦. 大 纲. 大 纲. 学位论文研究情况和已完成的研究内容. 学位论文研究情况和已完成的研究内容. 学位论文研究情况和已完成的研究内容. 大 纲. 龙芯编译器中的多面体模型. WHIRL. SCoP 分析: WRaP -IT 程序分析和变换: PLuTo 代码生成: CLooG. WRaP -IT. w2pscop. SCoP_Cvt. clan_scop. PLuTo. . cloog 文件. CLooG. clast. WLooG. WHIRL.
E N D
龙芯编译器中多面体优化技术的研究与实现 胡士文 指导老师:冯晓兵 连瑞琦
龙芯编译器中的多面体模型 WHIRL SCoP分析:WRaP-IT 程序分析和变换:PLuTo 代码生成:CLooG WRaP-IT w2pscop SCoP_Cvt clan_scop PLuTo .cloog文件 CLooG clast WLooG WHIRL
龙芯编译器中的多面体模型 • w2pscop转换成clan_scop • 语句的迭代域存在对应关系,直接转换 • 调度函数的转换 # i j n 1 1 1 0 0 0 1 -1 0 1 -1 1 0 1 0 0 1 0 -1 1 -1 S1的迭代域 for (i = 0; i < n; i++) for (j = 0; j < n; j++) S1: a[i][j] = b[i][j]; # p0 p1 p2 p3 p4 i j n 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 -1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 0 0 1 0 0 0 0 w2pscop中S1的调度函数 # i j n 1 [ 0 0 0 0 0] [ 0 1 0 0 0 ] [ 0 0 0 0 0 ] [ 0 0 1 0 0 ] [ 0 0 0 0 0 ] clan_scop中S1的调度函数
龙芯编译器中的多面体模型 for (i = 0; i < n; i++) for (j = 0; j < n; j++) S1:a[i][j] = b[i][j]; • w2pscop转换成clan_scop • 仿存函数的转换 Accessed array strings: a b # i j n 1 [ 1 1 0 0 0 ] [ 0 0 1 0 0 ] [ 2 1 0 0 0 ] [ 0 0 1 0 0 ] clan_scop中S1的仿存函数形式 a 0 1 0 0 1 0 0 0 b 0 1 0 0 1 0 0 0 w2pscop中S1的仿存函数形式
龙芯编译器中的多面体模型 • CLooG中生成AST的地方,生成相应的WHIRL • 变换前后WHIRL的对应问题 • 程序的多面体表示形式没有原来的中间表示的符号信息以及循环中语句的信息 • 变换结果可以用符号的对应关系来表达 • 变换之前,我们需要收集循环变量和循环参数的信息 • 变换之后,将符号变换的赋值语句和原来的循环语句插入循环中 • 多面体模型在编译器内部的交互问题 • 额外调用一次Pre_Optimizer来维护du和别名信息
龙芯编译器中的多面体模型 for (k=0; k<N; k++) { for (j=k+1; j<N; j++) a[k][j] = a[k][j]/a[k][k]; 原程序 #define S1(k,j) a[k][j]=a[k][j]/a[k][k]; for (t0=0;t0<=floord(N-1,90);t0++) for (t1=0;t1<=floord(N-1,90);t1++) for (t2=max(2,90*t1);t4<=min(N-1,90*t1+89);t4++) for (t3=max(2,90*t2);t5<=min(N-1,90*t2+89);t5++) S1(t2,t3); Pluto优化后的结果
龙芯编译器中的多面体模型 for (k=0; k<N; k++) { for (j=k+1; j<N; j++) a[k][j] = a[k][j]/a[k][k]; 原程序 for (t0=0;t0<=floord(N-1,90);t0++) for (t1=0;t1<=floord(N-1,90);t1++) for (t2=max(2,90*t1);t4<=min(N-1,90*t1+89);t4++) for (t3=max(2,90*t2);t5<=min(N-1,90*t2+89);t5++) { k = t2; j = t3; S1(k, j); } 多面体模型优化后的抽象表示
多面体模型的优化 • 强大的tiling • 在polybench的17个程序上,平均加速2.2倍 • 优化mgrid的最热循环,加速7.2%(166 -> 178) • 缺乏一个好的loop fusion模型 • 对swim优化效果不佳 • 缺乏自动计算最优tile size的算法
多面体模型的优化 • 指导SIMD优化 • 在多面体中识别可向量化的循环 • 循环迭代间依赖分析 • 迭代和仿存的步长分析 • 按照SIMD宽度tile一次,并在LOOP INFO中标记,为后续代码生成做准备 • Jacobi等用例可被向量化 SIMD优化的三个步骤
与预期计划不符情况及原因 • 实际情况 • 多面体模型不能处理很多大型程序(如spec)中的循环结构的表示形式 • 发现除多面体变换算法以外的影响性能的因素(tile size的选择) • 原计划 • 2011.7~8 • 实现龙芯编译器中的多面体优化 • 2011.9~10 • 解决多面体优化在编译器中的交互问题 • 2011.11~2012.2 • 分析性能并改进多面体程序变换算法 • 2012.3~2012.5 • 技术改进,撰写论文
下一步工作计划 • 多面体模型的进一步调优 • Tile后tile size的选择算法 • SIMD优化跟后端代码生成的集成 • 增强模型的实用性 • 提高正确性 • 支持spec06中复杂的循环表示形式,为优化奠定基础 • 向open64提交 • 为开源社区做出贡献 • 测试X86上的性能
谢谢! 祝各位老师、同学新春愉快!