【文献阅读】Counting Integer Points in Parametric Polytopes Using Barvinok‘s Rational Functions

题目:Counting Integer Points in Parametric Polytopes Using Barvinok’s Rational Functions
时间:2007
会议/期刊:Algorithmica
研究机构:

Barvinok

摘要

许多编译器优化技术依赖于计算满足特定条件的元素数量的能力。如果这些条件可以用线性约束来表示,那么这些问题就相当于计算(可能的)参数多面体parametric polytopes中的整数点的数量。

众所周知,这样一个集合的枚举数可以用一个由一组拟多项式组成的显式函数表示,每个拟多项式都与参数空间中的一个腔室chamber相关联。以前,插值被用来获得这些准多项式,但这种技术有几个缺点。它对单个拟多项式的最坏情况计算时间是输入大小的指数,即使对于固定维度也是如此。这种拟多项式的最坏情况大小(以表示拟多项式所需的位数为单位)也是输入大小的指数。在某些条件下,这种技术甚至无法产生解决方案。

我们的主要贡献是一种用于解析计算所需准多项式的新方法。它扩展了基于 Barvinok 分解的现有方法,用于计算非参数多面体中的整数点数。我们的技术总是产生一个解决方案并在多项式时间内计算多项式大小的枚举数(对于固定维度)。

Key Words. Barvinok’s decomposition, Compiler analysis, Ehrhart quasi-polynomial, Parametric polytope, Polyhedral model, Vector partition function, Signed unimodular decomposition.

1. Introduction

In many program analyses and optimizations, questions starting with “how many” need to be answered, e.g.,
– How many memory locations are touched by a loop? [23]
– How many operations are performed by a loop? [35]
– How many cache lines are touched by a loop? [23]
– How many array elements are accessed between two points in time? [7]
– How many array elements are live at a given iteration (i, j)? [1], [2], [34], [52]
– How many times is a statement executed before an iteration (i, j)? [48], [25]
– How many parallel processing elements can be used when executing a loop on an FPGA? [6], [19], [24], [29]
– How many cache misses does a loop generate? [15], [13], [27]
– How much memory is dynamically allocated by a piece of code? [11]
– How many different array elements are accessed before element (x, y) is accessed? [38]
– How many bytes are transmitted between parallel tasks for a given parallel schedule of computation? [10], [30], [47]

回答这些问题通常是程序转换和优化的基石之一,例如增加并行度 [48]、最小化内存大小 [52]、[48]、估计最坏情况下的执行时间 [35]、估计能耗 [33] 、提高缓存效率 [7]、DSP 应用程序的高级转换 [25],以及将软件循环转换为并行硬件实现 [48]、[29]。基于这些程序分析,已经报告了令人印象深刻的程序改进,例如将嵌入式系统中的内存大小要求从 262400 字节减少到 257 字节 [34],将 DSP 应用程序的执行速度提高 7 倍 [25],并减少执行在并行分布式 NUMA 机器上,时间乘以 3.5 倍 [30]。

对于上述许多分析,计数问题被形式化为计算线性不等式系统的整数解的数量,问题变成“有多少整数点 x ⃗ ∈ Z d \vec{x} ∈ Z_d x Zd 满足 A x ⃗ ≥ b ⃗ A\vec{x} ≥ \vec{b} Ax b ?”,其中 A 是整数矩阵和 b 是一个整数向量。

此外,许多分析要求答案是某些参数 p ⃗ \vec{p} p 的函数,因此必须计算以下集合中的整数点数:
在这里插入图片描述

其中 p ⃗ \vec{p} p 是参数向量,A 和 B 是整数矩阵, c ⃗ \vec{c} c 是整数向量。 P p ⃗ P_{\vec{p}} Pp 称为参数多面体parametric polytope,当满足 A x ⃗ ≥ B p ⃗ + c ⃗ A\vec{x} \geq B\vec{p}+\vec{c} Ax Bp +c 的点的个数对于 p ⃗ \vec{p} p 的每个值都是有限的。 Clauss 和 Loechner [14] 表明, P p ⃗ P_{\vec{p}} Pp 中的整数点数可以用一组准多项式quasi-polynomials表示,每个准多项式在不同的腔室chamber中有效。 (这些概念将在第 2.2 节中解释。)例如,考虑图 1 中的循环,并假设我们希望知道语句 t += A[i+j] 执行了多少次,用N和M的函数表示。这个问题的答案可以通过计算(2)式中整数点的个数来计算:
在这里插入图片描述
在这里插入图片描述

观察不等式,它等价于:
i ≥ N i ≥ N − M i ≤ N − M + 3 j ≥ 0 j ≤ N − 2 i i \geq N \\ i \geq N-M \\ i \leq N-M+3 \\ j \geq 0 \\ j \leq N-2i iNiNMiNM+3j0jN2i

The solution to this question is:
在这里插入图片描述
with ⌊ x ⌋ \lfloor x\rfloor x the lower integer part of x. This solution contains four chambers, each with a different quasi-polynomial.

# P指集合P的元素个数。

在某些分析中,对参数的需求取决于问题实例(例如,在存在符​​号循环边界的情况下),而在其他技术中,例如 [7]、[11]、[13]、[23]、[25 ]、[35]、[38] 和 [48],计数问题本质上是参数化的。一个内在参数计数问题的例子将在 5.2 节的例子 10 中讨论。它也是一个更一般的计数问题的示例,需要一些预处理才能将其转换为式 (1) 的约束系统。上面引用的许多程序分析 [1]、[2]、[7]、[10]、[13]、[15]、[29]、[30]、[33] 需要类似的预处理。

最近,已经为类似的计数问题开发了新技术,但它们要么不支持参数,例如 [9] 和 [41],要么仅在非常有限的范围内,例如 LattE [18]。另一方面,Clauss的方法 [14] 确实可以处理参数,但在最坏情况下是指数的,唯一已知的实现甚至无法为某些类别的问题 [48]、[13] 提供解决方案。

在本文中,我们提出了一种枚举参数多面体的新方法,它结合了 [14] 中的分解成腔室decomposition into chambers和 [18] 中计数算法的参数版本a parametric version of the counting algorithm。与以前的方法相比,得到的算法:
– handles general parametric polytopes of the form (1),
– always produces an answer,
– computes quasi-polynomials that are only polynomially large in terms of the input size (for fixed dimensions), by using a representation for these quasi-polynomials that differs from the one used in [14], and
– computes each of these quasi-polynomials in polynomial time, when the number of variables in the inequalities is fixed.

在下一节中,将介绍基本的理论背景。 第 3 节讨论了用于计算多面体中整数点数的 Barvinok 算法。在第 4 节中,介绍了 Barvinok 算法在 (1) 中的参数多面体中的应用。 第 5 节解释了处理更一般的计数问题所需的预处理。 与相关工作的比较在第 6 节中进行。关于算法实现的更多细节在第 7 节中介绍。第 8 节评估我们的算法并将其与克劳斯的方法进行比较,使用由几个编译器生成的大量线性不等式系统 分析。 第 9 节是结束语。本文是 [50] 的修订版。

2. Basic Concepts

In this section we first recall some basic polyhedral definitions. We further recall some theoretical results on polytope enumeration and introduce some new terminology(术语).

2.1 Basic Polyhedral Definitions

在这里插入图片描述
在这里插入图片描述

仿射包affine hull是包含一个集合的最小仿射集。
仿射集:对于集合 C C C,如果通过集合 C C C 中任意两个点的直线仍在集合 C C C 中, 那么称 C C C 是仿射集.
参考:https://www.zhihu.com/question/310774959

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Counting Supports of Candidates Using Hash Tree”是一种利用哈希树来计算候选项集支持度的方法。以下是一个简单的例子,说明如何使用哈希树来计算候选项集的支持度。 假设我们有一个包含以下事务的数据集: ``` t1: {1, 2, 3, 4} t2: {1, 2, 4, 5} t3: {2, 4, 5} t4: {1, 2, 3, 4, 5} ``` 我们要计算每个2项集的支持度。首先,我们需要生成所有的2项集: ``` {1, 2} {1, 3} {1, 4} {1, 5} {2, 3} {2, 4} {2, 5} {3, 4} {3, 5} {4, 5} ``` 接下来,我们可以使用哈希树来计算每个2项集的支持度。首先,对于每个项集,我们将其插入到哈希树中。具体地,从根节点开始,对于每个项集中的元素,根据哈希函数计算其子节点的位置,并将项集插入到相应的节点中。例如,对于项集{1, 2},我们需要依次插入到根节点、子节点1和子节点2中。最终,我们得到以下哈希树: ``` {} / | | \ 1 2 3 4 /| | | \ 2 3 4 5 5 / | | | 3 4 5 4 ``` 在计算支持度时,我们只需要遍历哈希树的叶子节点,找到包含在每个事务中的项集,并增加其计数器的值。例如,当处理事务t1时,我们需要遍历项集{1, 2}、{1, 3}、{1, 4}和{2, 3},并增加其计数器的值。最终,我们得到每个2项集的支持度: ``` {1, 2}: 3 {1, 3}: 1 {1, 4}: 2 {1, 5}: 1 {2, 3}: 2 {2, 4}: 3 {2, 5}: 2 {3, 4}: 2 {3, 5}: 2 {4, 5}: 2 ``` 这就是使用哈希树来计算候选项集支持度的简单示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值