Page 81 - 《软件学报》2024年第6期
P. 81

方燕飞 等: 申威众核处理器访存与通信融合编译优化                                                       2657


                 4   基于优化收益模型的编译器分析与实现

                    本文设计的编译指示的典型应用背景是: 用户掌握基本的存储层次特征, 对于小容量核心数据, 用户已经用相
                 关关键字变量进行声明, 布局进最适合的存储层次中, 或者基于前期已有编译优化                          [12] , 可以由编译器一次性布局
                 进最适合的存储层次中. 因此, 需要用本文第            3  节中设计的优化编译指示的典型场景是: 循环中有大数组变量的访
                 问, 这些数组不能一次性布局进          LDM  或  SDM  空间, 但是具有较好的空间局部性, 可以通过循环变换, 分段缓冲
                 进  LDM  或者  SDM  空间, 增加重用性, 减少访问开销.
                    对于主存局部离散访问数组的优化, 主要是由编译器根据指示信息完成相应空间上的一整块数据传输和循环
                 中相应数组访问的直接变换, 而无需考虑对循环的分块以及对数组访问的映射. 因此, 下文重点将放在对连续访问
                 数组的优化建模的讨论上. 另外, 双缓冲与单缓冲的建模原理相同, 可以在单缓冲模型基础上稍作调整即可得出双
                 缓冲优化方案, 为方便描述, 下文重点讨论单缓冲编译指示下的连续访问数组的优化过程.

                 4.1   优化收益模型设计与制约关系分析
                    当编译器根据指示信息开展循环优化时, 所采取的循环优化方案必须解决以下                          3  个关键问题.
                 上通信融合的收益模型及循环优化方案求解算法.
                    1) 对循环进行合理分块. 待优化的数组都是难以一次性布局进更高层存储层次的, 必须对循环进行合理分块,
                 才能分段传输到缓冲区. 如何选取循环分块长度, 使得缓冲区空间需求不超过可用空间, 又能使缓冲开销尽量小,
                 是在循环分块方案求解中要解决的问题.
                    2) 对数组访问进行合理分区         (以下简称数组分区为       region). 当被编译指示的循环中有多个变量或者同一变量
                 的多个不同引用需要进行访问优化时, 不仅需要对缓冲区进行合理划分以缓冲不同的数组, 同一数组的多个不同
                 访问也需要进行合理的聚类. 对不同的引用如何进行聚类, 以及如何划分缓冲区, 有多种可能的方案. 需要一种能
                 够高效快速找到优势聚类方案的方法. 聚类过程还需要考虑依赖距离, 以确保代码变换的合法性问题. 如图                                 10  所
                 示, 循环中共有    4  个访问  a[i]、a[i+1]、a[i–1] 和  a[i+128], 编译器需要结合依赖距离考虑   4  个不同访问的分区聚类
                 方法和循环分块长度.

                                         #pragma ccc sbuf mem2ldm(a) ldm_addr(buf) ldm_size(1024)
                                         for(i = 1; i <N; i++)
                                         {
                                            a[i]+= (a[i+1] + a[i-1]);
                                            a[i+128] += (a[i+1] -a[i-1]);
                                            …//其他代码
                                         }
                                          图 10 需要考虑分区聚类的数组访问代码示意

                    3) 任何一个数组访问在被实施优化后所取得的性能提升不能为负. 如果因为不合理的分块或者分区导致某些
                 数组访问优化引入的开销超过延迟降低带来的收益, 则应该放弃这样的优化方案. 如图                            9  所示, 最后一个循环中
                 对  sum  的优化, 需要结合   sum  的物理地址分布情况以及         RMA  的启动开销和     sdm  访问延迟综合判断是否要对
                 sum  数组访问实施优化.
                    本文首先构建优化收益与开销模型, 寻找时间开销与空间开销的制约关系变量以及优化收益目标函数. 然后
                 基于开销与空间开销的制约关系设计了二分搜索算法的循环分块和                        region  求解方法. 最后, 基于收益模型设计了
                 启发式循环优化方案迭代求解框架. 下文先介绍优化收益与开销模型.
                    在模型构建过程中, 本文对         DMA/RMA  启动开销、传输带宽等系统性能数据进行参数化描述, 构建访存和片


                    设待优化循环中共有         N  个待优化的数组      (经过前述规则做了转化), 序号           0, 1,…, N–1; 不妨设  N=N1+
                 N2+N3, 其中  N1  个数组属于  mem2ldm, N2  个数组属于   mem2sdm, N3  个属于  sdm2ldm, 每个数组在循环中有若干
                 个访问. 在进行计算循环分块大小时, 为了充分利用缓冲区空间, 需要对同一数组的访问进行聚类, 同一类的称作
                 一个  region, 一个  region  对应一个  DMA  或  RMA  缓冲, 一个  region  需要的缓冲区长度设为  region_space.
                    根据转换规则, 对于同一        region  中的数组访问, 优化维索引表达式有如下形式: i+S k , 其中        i 为循环变量,   S k  为
   76   77   78   79   80   81   82   83   84   85   86