0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

多面体模型的基本概念

jf_pmFSk4VX 来源:GiantPandaCV 2023-04-03 11:19 次阅读

多面体模型的基本概念

编译器中的多面体模型(polyhedral model)是一种高效的程序优化技术,它将复杂的循环依赖关系映射到高维几何空间,从而在编译阶段实现对计算任务的并行化和局部性优化。

通过构建和操作多面体表示能有效地调度指令和数据访问,以减少资源争用和缓存未命中德情况,从而提高程序执行的性能。

本文将介绍多面体编译技术的理论基础,并以发掘循环可并行部分为例子讲解。

将循环表示为线性不等式

首先我们来看一个常规的循环:

for(inti=1;i< N; ++i)
  for(intj=1;j< N; ++j)
    S[i][j] = .... 

我们先不关注循环内执行什么语句,而是关注迭代空间 ij 以及迭代限制条件:

i>=1
i< N
j >=1
j< N

转换为等价形式:

i>=1
i<= N - 1
j>=1
j<= N - 1

再统一转换为 >= 0 约束:

i-1>=0
-i+N-1>=0
j-1>=0
-j+N-1>=0

这样就将循环迭代空间表示成了一组线性不等式,然后矩阵形式表达如下:

这一组线性不等式其实就定义了二维空间上的一个矩形:

acdb141c-d177-11ed-bfe3-dac502259ad0.png

我们再来看一个例子,

for(inti=1;i< N; ++i)
  for(intj=1;j< N; ++j)
    if(i<= N - j + 1)
S[i][j]=....

这个循环相比上面的循环就是多了一个约束条件 i <= N - j + 1 也就是 j <= -i + N + 1,也就是在上面坐标轴上再加一条线:

ace5a0bc-d177-11ed-bfe3-dac502259ad0.png

这样就很清楚了,这些约束的交集对应了二维空间上的一个多面体(polyhedron),同理可得如果是三层循环空间,那就是对应了三维空间上的一个多面体,每个约束条件对应一个二维平面,而在 n 维空间上就是一个超平面了。

数据依赖距离向量的定义

接着我们来介绍怎么分析循环中的数据依赖,多面体模型中的数据依赖描述了在循环结构中,不同迭代之间因数据访问而产生的依赖关系。

而对于循环嵌套内的依赖关系,可以用距离向量来描述相对执行顺序。

比如对于以下循环:

for(inti=1;i< N; ++i)
  for(intj=1;j< N; ++j)
    A[i][j] = A[i-1][j]+A[i][j-1];

在当前次 (ij) 迭代中需要往 A[i][j] 中写入数据,然后需要读取 A[i-1][j]A[i][j-1] 的内容也就是循环维度 ij 的前一次迭代 i-1j-1 需要写入的位置,所以这就引入了一个先写然后再读取的数据依赖。

然后我们定义距离向量如下,向量的值大小表示了在对应循环维度上依赖的上一次迭代的距离:

  • A[i][j] -> A[i-1][j] 的距离向量为 [i - (i -1 ), j - j] = [1, 0]
  • A[i][j] -> A[i][j-1] 的距离向量为 [i - i, j - (j - 1)] = [0, 1]

矩阵形式表示:

能否简单从距离向量看出循环能否并行呢?

以下讨论均假设循环都是正向且迭代步长均为1,且迭代空间为常规的整数,且不保证结论能推广。

对于该循环

for(inti=1;i< N; ++i)
  for(intj=1;j< N; ++j)
    A[i][j] = A[i-1][j]+A[i][j-1];

其距离向量为:

分析第一行可以看到i 循环维度的上,依赖了前一次迭代的计算值,所以可以知道在 i 循环上无法并行。

而分析第二行依赖,j 循环维度也依赖了前一次迭代的计算值,所以可以知道在 j 循环上也无法并行。

又比如对于循环

for(inti=1;i< N; ++i)
  for(intj=1;j< N; ++j)
    A[i][j] = 0;

其距离向量为 [0]

循环维度 ij 对于前面的循环没有任何依赖,所以能将两个循环合并为一个然后并行运行。

又比如对于循环

for(inti=1;i< N; ++i)
  for(intj=1;j< N; ++j)
    A[i][j] = A[i][j-1];

其距离向量为 [0, 1]。循环维度 i 无依赖可以在该维度上并行,但是在 j 维度上有依赖无法并行。

又比如对于循环

for(inti=1;i< N; ++i)
  for(intj=1;j< N; ++j)
    A[i][j] = A[i-1][j]+A[i-1][j-1];

其距离向量为:

两个依赖的循环维度 i 都是大于0,所以在 i 维度无法循环,但是在 j 维度却可以并行。所以只要第一列都大于0,则不用分析第二维了,第二维是一定可以并行的。

有些循环的距离向量没法直接看出来,比如经典的矩阵乘法:

for(inti=0;i< N; ++i)
  for(intj=0;j< N; ++j)
    for(intk=0;k< N; ++j)
      C[i][j] = C[i][j] + A[i][k] * B[k][j];

这里在循环维度 k 上有个隐式的依赖,当前迭代(i', j', k')C[i'][j'] 计算依赖于上一次迭代 (i', j', k'-1) 计算得到的 C[i'][j'],所以距离向量为 [0, 0, k-(k'-1)=1],所以在k 维度上无法并行。

对循环做变换

多面体模型中对循环优化是通过对循环迭代空间做仿射变换实现的,下面我们介绍三种简单的变换,交换和倾斜。

以二层循环为例:

for(inti=1;i<= 2;++i)
for(intj=1;j<= 3;++j)
S[i][j]=...

对应的每一次迭代的执行顺序如下图,图中的圆型就对应每一次的迭代,序号就是原始执行顺序:

acf96ea8-d177-11ed-bfe3-dac502259ad0.png

假设变换后的循环维度分别是 i'j'

循环交换

对应的变换矩阵如下:

变换过程如下:

对应的循环就变为:

for(intj=1;j<= 3;++j)
for(inti=1;i<= 2;++i)
S[i][j]=...

对应的迭代执行顺序如下:ad05c93c-d177-11ed-bfe3-dac502259ad0.png

图中圆型的序号为变换前的原始执行顺序。

第一个执行的坐标是 (i'=1, j'=1),对应原始坐标是 (i=1, j=1),对应圆型 1

第二个执行的坐标是 (i'=1, j'=2),对应原始坐标是 (i=2, j=1),对应圆型 4

第三个执行的坐标是 (i'=2, j'=1),对应原始坐标是 (i=1, j=2),对应圆型 2

其他以此类推

循环反转

对应的变换矩阵如下,假设就对循环 i 做反转:

变换过程如下:

对应的循环就变为:

for(inti=-1;i>=-2;--i)
for(intj=1;j<= 3;++j)
S[i+3][j]=...

对应的迭代执行顺序如下:

ad19e098-d177-11ed-bfe3-dac502259ad0.png

图中圆型的序号为变换前的原始执行顺序。

第1个迭代 (i'=-1, j'=1) 对应原始坐标 (i=2, j=1) ,对应原始循环的圆型 4

第4个迭代 (i'=-2, j'=1) 对应原始坐标 (i=1, j=1) ,对应原始循环圆型 1

循环倾斜

对应的变换矩阵如下:

变换过程如下:

对应的循环就变为:

for(intd=2;d<= 5;++d)
for(intj=max(1,d-2);j<= min(3,d-1);++j)
inti=d-j;
S[i][j]=...

对应的迭代执行顺序如下:

ad2d8a76-d177-11ed-bfe3-dac502259ad0.png

图中圆型的序号为变换前的原始执行顺序。

第1个迭代 (d=2, j=1) 对应原始坐标 (i=1, j=1) ,对应原始循环的圆型 1

第2个迭代 (d=3, j=1) 对应原始坐标 (i=2, j=1) ,对应原始循环圆型 4

第3个迭代 (d=3, j=2) 对应原始坐标 (i=1, j=2) ,对应原始循环圆型 2

第4个迭代 (d=4, j=2) 对应原始坐标 (i=2, j=2) ,对应原始循环圆型 5

第5个迭代 (d=4, j=3) 对应原始坐标 (i=1, j=3) ,对应原始循环圆型 3

第6个迭代 (d=5, j=3) 对应原始坐标 (i=2, j=3) ,对应原始循环圆型 6

如何将串行执行的循环转换为可并行执行

以下面的循环为例:

for(inti=1;i<= N; i++) {
    for(intj=1;j<= N; j++) {
        A[i][j] = A[i-1][j]+A[i][j-1];
}
}

分析上其数据依赖分析可得其距离向量:

可知该循环在 ij 维度上都无法并行执行。

接下来尝试对循环空间 ij 做仿射变换,我们采用倾斜变换,其实这个是很经典的一个并行方法了,称之为对角线变换。

具体到多面体编译技术的代码的实现,是怎么自动找到这个变换的过程我还没完全弄懂,所以假设我们现在知道了是直接应用倾斜变换:

代码变为:

for(intd=2;d<= 2*N;++d){
for(intj=max(1,d-N);j<= min(N, d - 1);++j){
inti=d-j;
A[i][j]=A[i-1][j]+A[i][j-1];
}
}

接着分析数据依赖矩阵,这时候 A[i][j]= A[d-j][j] 的计算都只依赖于循环 d 前一次迭代的计算而循环 j 维度上没有数据依赖,所以依赖矩阵为:

从依赖矩阵可知,变换后的循环可以在 j 循环维度上做循环。

上面的文字解释可能有些抽象我们画图来辅助解释,假设循环上界 N=5,则原始的循环迭代空间如下图所示:

ad3fc11e-d177-11ed-bfe3-dac502259ad0.png

黑色实线箭头表示每个计算 A[i][j] 的计算顺序。

数据依赖关系如下:

ad550196-d177-11ed-bfe3-dac502259ad0.png

红色箭头表示数据依赖。

则经过倾斜变换后的循环迭代空间如下:

for(intd=2;d<= 2*5;++d){
for(intj=max(1,d-5);j<= min(5,d-1);++j){
inti=d-j;
A[i][j]=A[i-1][j]+A[i][j-1];
}
}
ad714e64-d177-11ed-bfe3-dac502259ad0.png

其实就是对应于原始空间上,按照对角线的顺序去遍历。

数据依赖如下:

ad8a3b4a-d177-11ed-bfe3-dac502259ad0.png

从数据依赖上看,可以看到变换后在 j 维度上没有数据依赖所以可以并行执行。

最后在 j 维度上加上 omp 并行:

for(intd=2;d<= 2*5;++d){
#pragmaompfor
for(intj=max(1,d-5);j<= min(5,d-1);++j){
inti=d-j;
A[i][j]=A[i-1][j]+A[i][j-1];
}
}

后记

这篇文章中对于多面体模型有并不少是个人理解,不一定准确。多面体编译技术个人感觉很复杂,在阅读相关文献和书籍的时候,还需要去搜过相关前置知识才能看懂大概。

而这篇学习笔记也仅仅是介绍了一些基本的入门概念,多面体编译技术能做的事情并不仅仅局限于本文所介绍的循环变换发掘可并行部分,感兴趣的读者可以阅读参考资料

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 线性
    +关注

    关注

    0

    文章

    198

    浏览量

    25147
  • 模型
    +关注

    关注

    1

    文章

    3229

    浏览量

    48812
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32853

原文标题:参考资料

文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Proteus涉及的基本概念

    Proteus涉及的基本概念
    发表于 08-01 20:58

    电子元件基本概念和原理

    电子元件基本概念和原理
    发表于 08-05 21:25

    Fpga Cpld的基本概念

    Fpga Cpld的基本概念
    发表于 08-20 17:14

    C语言基本概念

    C语言基本概念
    发表于 08-01 02:00

    数据结构的基本概念是什么

    数据结构之基本概念
    发表于 05-27 08:29

    阻抗控制相关的基本概念

    阻抗控制部分包括两部分内容:基本概念及阻抗匹配。本篇主要介绍阻抗控制相关的一些基本概念
    发表于 02-25 08:11

    智能天线的基本概念

    1智能天线的基本概念 智能天线综合了自适应天线和阵列天线的优点,以自适应信号处理算法为基础,并引入了人工智能的处理方法。智能天线不再是一个简单的单元,它已成为一个具有智能的系统。其具体定义为:智能
    发表于 08-05 08:30

    人工智能基本概念机器学习算法

    目录人工智能基本概念机器学习算法1. 决策树2. KNN3. KMEANS4. SVM5. 线性回归深度学习算法1. BP2. GANs3. CNN4. LSTM应用人工智能基本概念数据集:训练集
    发表于 09-06 08:21

    CODESYS的基本概念有哪些

    CODESYS是什么?CODESYS的基本概念有哪些?CODESYS有哪些功能?
    发表于 09-18 06:52

    无刷电机的基本概念和参数介绍及无刷电机在模型上的应用资料免费下载

    本文档的主要内容详细介绍的是无刷电机的基本概念和参数介绍及无刷电机在模型上的应用资料免费下载  主要内容包括了一、无刷电机的基本概念1、基本概念2、
    发表于 09-21 08:00 107次下载
    无刷电机的<b class='flag-5'>基本概念</b>和参数介绍及无刷电机在<b class='flag-5'>模型</b>上的应用资料免费下载

    计算机网络的基本概念和网络互连模型OSI资料免费下载

    本文档的主要内容详细介绍的是计算机网络的基本概念和网络互连模型OSI资料免费下载。
    发表于 10-11 08:00 0次下载
    计算机网络的<b class='flag-5'>基本概念</b>和网络互连<b class='flag-5'>模型</b>OSI资料免费下载

    通信原理的基本概念讲解

    通信原理的基本概念讲解。
    发表于 05-27 14:48 17次下载

    多面体模型中循环分块算法的设计方案

    多面体模型中循环分块算法的设计方案
    发表于 06-24 14:58 10次下载

    放大器的基本概念

      首先回顾一下基本概念,然后介绍四种类型的放大器:共源结构、共栅结构、源跟随器和共源共栅结构,对于每一种模型,我们先从其简化模型入手,然后逐渐考虑沟道长度调制效应和效应之类的二级效
    的头像 发表于 04-26 11:14 1488次阅读
    放大器的<b class='flag-5'>基本概念</b>

    基本概念.zip

    基本概念
    发表于 12-30 09:21 2次下载