多面体编译基础(一)-- 从代码语法到多面体表示

写在前面

声明

本系列文章翻译自俄亥俄州立大学计算机科学与工程系Louis-Noël Pouchet教授Polyhedral Compilation Foundations课程的课件,对课件内容酌情筛选,并增加一些个人的内容,如存在错误或待争议部分,望各位同行(大佬)指正。

文章格式标准:

  1. 文章中出现的程序代码默认为C/C++格式

符号表

 

为什么要学习多面体编译

 

课程简介

学习目标

  1. 学会多面体编译技术中涉及到的基本数学概念。
  2. 建立对某些重要数学结论的记忆。
  3. 了解多面体便以技术的原理。

多面体程序优化三步走战略

  1. 分析:从代码到模型
  2. 模型变换
  3. 代码生成:从模型到代码

上述过程可概括为:从实例到规律,再从规律到实例。


本章内容

  1. 凸集(Convexity Set)

  2. 多面体(Polyhedra)

  3. 晶格(Lattices)

一、迭代域的几何表示

1.1 启发例子

先看一看如下所示的嵌套循环:

for (i = 0; i < 3; ++i)
    for (j = 0; j < 3; ++j)
        A[i][j] = i * j;

上述代码段的指令执行过程为:

  1. A[0][0] = 0 * 0;
  2. A[0][1] = 0 * 1;
  3. A[0][2] = 0 * 2;
  4. A[1][0] = 1 * 0;
  5. A[1][1] = 1 * 1;
  6. A[1][2] = 1 * 2;
  7. A[2][0] = 2 * 0;
  8. A[2][1] = 2 * 1;
  9. A[2][2] = 2 * 2;

通过观察上述指令执行过程我们可以得到一些规律:

  • 数组A的赋值语句被执行了9次
  • 每次给A赋值时数组索引i、j都不同
  • 语句的执行是存在顺序的

那么我们目标即为找到能够适当描述上述三个规律的模型

1.2 迭代域(Iteration Domain)

迭代域是一种由迭代向量构成的集合(或线性空间),在上面的例子中,对于数组元素A[i][j],迭代向量可表示如下:

\overrightarrow{x}_{S}=(i,j)

其中,S的含义为(Statement),表示用于迭代的语句;i,j皆表示迭代索引。在定义迭代向量后,我们可以通过构造线性不等式组来描述上面例子对应的迭代空间:

我们观察到上面的例子中i、j在迭代中的取值范围分别为:

0\leq i \leq 20 \leq j \leq 2

改写为向量形式,得:

\begin{pmatrix} i \\ j \end{pmatrix} \geq \begin{pmatrix} 0 \\ 0 \end{pmatrix}\begin{pmatrix} -i \\ -j \end{pmatrix} \geq \begin{pmatrix} -2 \\ -2 \end{pmatrix}

合并上述两项,得到完整的不等式组:

\begin{bmatrix} 1 & 0 \\ 0 & 1 \\ -1 & 0 \\ 0 & -1 \end{bmatrix} \begin{pmatrix} i \\ j \end{pmatrix} \geq \begin{pmatrix} 0 \\ 0 \\ -2 \\ -2 \end{pmatrix}

该不等式组即表示了上面例子中的迭代域,该迭代域是一个二维多面体,也是一个凸集,画在二维平面坐标系上如下图所示:

多面体编译基础(一)-- 从代码语法到多面体表示_第1张图片 示例迭代域

二、凸集

2.1 凸集定义

设S为n维实数域R^{n}上的一个集合,S为凸集当且仅当\forall \mu ,\lambda \in S且给定c \in [0,1]都有

[(1- c) \mu + c \lambda ] \in S

通俗地说,就是在S上任意两点之间画一条线段,若该线段上的每一点都在S集内,则S为凸集。

2.2 凸组合定义

设S为一凸集,对任意的向量\overrightarrow{\mu _{1}}, \overrightarrow{\mu _{2}},...,\overrightarrow{\mu _{r}} \in S,以及任意一组非负数\lambda_{1}, \lambda_{2},..., \lambda_{r}满足\sum\nolimits_{i=1}^{r} \lambda_{i}=1,那么令:

\overrightarrow{v} = \sum_{i=1}^{r} \overrightarrow{\mu_{i}} \lambda_{i} \in S

\overrightarrow{v}\{ \overrightarrow{\mu_{i}} \}的凸组合。

三、仿射

3.1 仿射函数

函数f:K^{m} \rightarrow K^{n}为仿射函数(线性映射)仅当存在向量\overrightarrow{b} \in K^{n}和矩阵A \in K^{m \times n}且满足:

\forall \overrightarrow{x} \in K^{m}, f(\overrightarrow{x})=A \overrightarrow{x} + \overrightarrow{b}

3.2 仿射半空间

仿射半空间K^{m}(仿射约束)定义为以下集合:

\{ \overrightarrow{x} \in K^{m} | \overrightarrow{a} \overrightarrow{x} \leq \overrightarrow{b} \}

在一个空间中,超平面将该空间分割为两个半空间,而超平面的表达式为:

\{ \overrightarrow{x} \in K^{m} | \overrightarrow{a} \overrightarrow{x} = \overrightarrow{b} \}

它表示的是一个m维空间中的m-1维平面。

四、多面体

4.1 多面体定义

集合S \in K^{m}是一个多面体仅当存在一组有限个数的不等式A \overrightarrow{x} \leq \overrightarrow{b}如下:

P=\{ \overrightarrow{x} \in K^{m} | A \overrightarrow{x} \leq \overrightarrow{b} \}

在上面的例子中:A=\begin{bmatrix} 1 & 0 \\ 0 & 1 \\ -1 & 0 \\ 0 & -1 \end{bmatrix}, \overrightarrow{x} = \begin{pmatrix} i \\ j \end{pmatrix}, \overrightarrow{b} \begin{pmatrix} 0 \\ 0 \\ -2 \\ -2 \end{pmatrix}

注意:英语中的“Polyhedron”与“Polytope”不同,“Polyhedron”泛指多面体,而“Polytope”特指有界多面体。

4.2 Z-多面体(整多面体)

这是一种所有顶点都为整数的多面体。

4.3 整数包(Integer Hull,不知道正式中文名是什么,我翻译成“整数包”)

一个有理多面体(所有顶点都是有理数的多面体)P的整数包是在P内所有整数点的集合。

4.4 多面体的二重表示法(Dual Representation)

二重表示法是一种结合线段L(lines)、射向R(Rays)和顶点(Vertices)的多面体表示法,其形式如下:

P:\{ \overrightarrow{x} \in Q^{n} | \overrightarrow{x} = L \overrightarrow{\lambda} + R \overrightarrow{\mu} + V \overrightarrow{v}, \overrightarrow{\mu} \geq 0, \overrightarrow{v} \geq 0, \sum_i v_i=1 \}

4.5 表面(Face)

多面体P的表面F定义为P的交叉超平面,满足:

dim(F) \leq dim(P)

其中,dim(F)表示F的维度。

4.6 侧面(Facet)

多面体P的侧面F是一种特殊的表面,侧面满足:

dim(F)=dim(P)-1

侧面的维度总是比多面体小1。

4.7 多面体分解基本定理

若P为多面体,则它可被拆分为有界多面体V与多面体锥(Polyhedral Cone)L之和。

4.8 参数化多面体

\overrightarrow{n}为符号参数向量,P为准多面体,定义如下:

P=\{ \overrightarrow{x} \in K^{m} | A \overrightarrow{x} \leq B \overrightarrow{n} + \overrightarrow{b} \}

4.9 凸集的交(Intersection)、和(Union)

两个凸集P_{1}P_{2}的交集P定义如下:

P=\{ \overrightarrow{x} \in K^{m} | \overrightarrow{x} \in P_{1} \wedge \overrightarrow{x} \in P_{2} \}

借助作图易证P也是凸集。

多面体编译基础(一)-- 从代码语法到多面体表示_第2张图片 凸集交

两个凸集P_{1}P_{2}的和P定义如下:

P=\{ \overrightarrow{x} \in K^{m} | \overrightarrow{x} \in P_{1} \vee \overrightarrow{x} \in P_{2} \}

借助作图可以轻易地看出P不一定为凸集。

多面体编译基础(一)-- 从代码语法到多面体表示_第3张图片 凸集和

五、晶格(Lattices)

称n维有理数空间Q^{n}中的一个子集L为晶格仅当L由有限个向量整体组合而成:

L=L(a_{1},..., a_{n})=\{ \lambda_{1} a_{1} + ... + \lambda_{n} a_{n} | \lambda_{i} \in Z \}

 

 

你可能感兴趣的:(笔记,高性能计算)