时间:2024-05-04
曹 杭 袁 良 黄 珊 张云泉 徐勇军 陆鹏起 张广婷
1(计算机体系结构国家重点实验室(中国科学院计算技术研究所) 北京 100190)
2(中国科学院大学 北京 100049)
Stencil计算(模板计算)是科学工程应用中一类常见的嵌套循环算法,也被称为“结构化网格计算”,是13个伯克利核心计算模式之一.在动态规划、图像处理等领域的很多算法中也包含相似的依赖模式.Stencil定义了一种更新结点所需邻居结点的模式.Stencil计算在时间维度上迭代更新规则的d维网格(也称为数据空间),数据空间沿着时间维度更新,产生的d+1维空间被称为迭代空间.
与其他的数值算法不同,例如稠密或稀疏矩阵计算类型的多样性主要来源于输入数据如稠密或稀疏矩阵的数据量,Stencil的计算类型本质上取决于问题的类型.Stencil可以从不同的角度进行分类,如格点维度(1维,2维,…),邻居数目,即阶数(3点,5点,…),形状(盒型,星型,…),依赖类型(高斯-赛德尔,雅可比,…)和边界条件(常量的,周期的,…)等.
Stencil计算具有计算密集度低的特征,d维Stencil的简单实现由d+1个循环组成,其中最外层循环遍历时间维度,内层循环更新d维空间的所有格点.简单实现的数据重用度较差且典型的带宽受限.
分块是提高多重嵌套循环的数据局部性和并行度最有效的优化技术之一,目前有大量针对Stencil计算分块方案的研究.空间分块算法促进了2维至更高维度Stencil在一个时间步内的数据重用.为了进一步增强数据重用度,往往同时考虑时间维度和空间维度,后文将详细介绍这些技术.另一类工作采用简单的超矩形分块形状[1-4]并引入冗余计算来解决块间数据依赖.这些研究包括自动调优框架[5-12]、编程模型[13-14]、CPU[2,15-18]、GPU[19-23]和Phi[24-25]上的手动调优实现.
不同的Stencil类型也衍生出不同的解决方案.Pluto系统[26]延伸到周期性边界条件Stencil的处理[27].菱形分块最初是针对1维Stencil的分块[28],然后扩展到更高维度的Stencil[29].高速缓存参数无关(cache oblivious)方案从最初的算法[30-31],CORALS(cache oblivious parallelograms)方案[32],发展到能处理任意Stencil并达到最大并发度的Pochoir系统[33].
据我们所知,目前没有针对不同Stencil形状的解决方案,特别是盒型和星型Stencil.星型Stencil只依赖于每个坐标轴上的点,盒型Stencil在此之外还有对角线上的数据依赖.不区分盒型和星型Stencil的根本原因可能是盒型Stencil包含星型Stencil,任何适用于盒型Stencil的算法也能应用到星型Stencil.
本文首先在数据空间上提出“自然块”的概念来确定星型和盒型Stencil之间的区别.然后针对星型Stencil提出了一个新的2层密铺方案,在此方案中,自然块和它的后继块可以密铺整个空间,而他们沿着时间维度扩展后形成对迭代空间的密铺.密铺框架类似于文献[34]中提出的方法.我们将统一阐述基于自然块概念的2种方案并将已有的方案称为盒型密铺而将新提出的方案称为星型密铺.
在密铺方案中区别盒型和星型Stencil有2个主要的优点,分别利用不同层次上的数据局部性.首先,当给定缓存大小时,相比盒型密铺,用星型Stencil的自然块密铺能得到更大的块,这样可以更有效地减少内存系统的压力;其次,我们针对第二后继块中的元素提出了一个新颖的“2次更新”技术,可对1个元素连续进行2次更新,进一步提升了核心数据的重用.
分块技术[35-39]是探究多层嵌套循环数据局部性和并行度最有效的转换技术之一.Wonnacott和Strout[40]对比了一些现有分块方案的可扩展性,下面我们将总结一些和Stencil计算有关的技术.
1) 重叠分块(overlapped tiling).高性能领域中经常在手动调优的实现中采用超矩形分块[1-4].为了执行多个时间步,往往采用冗余计算[41]来解决分块之间的依赖,这就是重叠分块[28,42].Philips和Fatica[22]提出了GPU上手动调优的手写3.5维分块实现方案,在2.5维分块方案[4]上增加了时间维度上的划分.Demmel等人[43-44]减少了2倍的冗余计算.形状规则的超矩形可以获得更高的并发度和更多细粒度优化.
2) 时间偏移(time skewing).时间偏移分块[45-47](分块形状在2维上是平行四边形,在3维上是平行六面体,在更高维上是超平行体)消除了冗余计算,但是大多数方法只用单一形状的块填充空间,导致流水线启动和有限的并发度[48-49].
3) 菱形分块(diamond tiling).Bondhugula等人[26]对1维Stencil采用菱形分块.Bandishti等人[29,50]将此方法扩展到更高空间维度的Stencil.Grosser等人[51]对2维的菱形尖端粗粒度化形成六边形,在3维上演化成截掉顶端的八面体.
4) 缓存无关分块(cache oblivious tiling).缓存无关技术旨在内存层次结构参数未知时充分利用数据局部性.Frigo和Strumpen提出了第1个串行[30]和并行[31]缓存无关Stencil算法.缓存无关平行四边形方法[32]同时分离时间空间维度,但是会导致波阵面并行.Pochior[33]实现了多维空间划分,能够同时划分所有空间维度.
5) 分裂分块(split tiling).分裂分块方法发掘每个块中的独立子块,然后将这些子块发送给他们的后继块,使得剩下的区域同样可以并发执行[28,52-54].Grosser等人[55]提出了另一个类似于具有缓存无关范式的多维空间划分的分裂分块方法.嵌套分裂分块(the nested split-tiling)[56]能在所有空间维度递归分裂.
6) 混合分块(hybrid tiling).Strzodka等人[57]提出的CATS(cache accurate time skewing)算法结合了菱形分块、平行四边形分块和流水线处理.Grosser等人[58]采用混合六边形和平行四边形的分块算法.这些算法取某一维空间和时间维度组成平面,用六边形分块和菱形分块进行划分,在剩下的空间维度中采用时间偏移分块,从而分解迭代空间.混合分裂分块方法[56]结合了嵌套分裂分块和时间偏移分块.
7) 密铺分块(tessellating).密铺方案[34]适用于包括星型和盒型等不同Stencil类型.空间被一系列分块密铺,分块之间可以无冗余并行执行.相应地,这些分块在时间维度上扩展后得到的扩展块可以在迭代空间中形成密铺.简单明了的数学特性使得这种方法可以与细粒度优化方法相结合.
为了使核心程序达到更高的性能,核心内的优化技术如计算重用[59-60]、计算重组[61]、向量化[15,62-64]和数据布局转换[65-66]等十分关键.但是这些方法大多没有对不同的Stencil形状进行区分.本文设计实现了一个新颖的技术来提升星型Stencil核心程序级别上的数据重用.这种技术也可以应用到其他的分块方法上.
本节首先介绍一个新的概念,即自然块,来区分不同的Stencil形状特征.然后围绕自然块和后继块这2个方面,详细描述新提出的星型Stencil密铺方案以及已有的盒型密铺方案[34].最后将密铺方案应用于高阶Stencil和不同的边界条件.
Gauss-Seidel Stencil需要执行逐点45°流水线启动,使用分块技术也不能使其完全并发启动[28].因此我们仅考虑Jacobi Stencil.此外,星型Stencil只能应用到2维数据空间中,我们只讨论2维Stencil.在第5节的实验中,对于3维星型Stencil将保留1维数据空间不进行切分.
密铺3维迭代空间对应于计算2维Stencil,我们首先将其划分成多个相同的时间片.在一个时间片开始时所有格点处于同一时间维度,结束时所有格点都更新了t个时间步(在下面的例子中t=4).不失一般性,我们只讨论第1个时间片的密铺,即密铺前所有格点的时间维度均为0,密铺后所有格点的时间维度为t.
Fig. 1 Natural block B0(0)图1 自然块B0(0)
当所有格点在时间维度上的值相同时,更新某一格点t个时间步所需的最小邻居点集被称为时间步为t的自然块,简称自然块.
图1(a)和图1(b)分别展示了2D9P盒型Stencil和2D5P星型Stencil时间步长为4的自然块.
最大更新方法[34]与自然块概念相近.具体定义为:在数据空间中给定B,沿着时间维度最大更新每个格点,直到不满足Stencil定义的依赖关系为止.形式上而言,对所有格点b∈B,满足以下2个条件中任一个时,停止更新:
1)time[b]=t,t是给定的最大时间更新步数;
2) 存在至少一个b的邻居b′,b′的时间维度严格小于b(time[b′]
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!