CN106445666A - 一种doacross循环的并行优化方法 - Google Patents
一种doacross循环的并行优化方法 Download PDFInfo
- Publication number
- CN106445666A CN106445666A CN201610851036.XA CN201610851036A CN106445666A CN 106445666 A CN106445666 A CN 106445666A CN 201610851036 A CN201610851036 A CN 201610851036A CN 106445666 A CN106445666 A CN 106445666A
- Authority
- CN
- China
- Prior art keywords
- circulation
- piecemeal
- thread
- node
- doacross
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Complex Calculations (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供一种DOACROSS循环的并行优化方法,在保证数据依赖正确性基础上,通过加入了一个状态矩阵和一个就绪节点队列,将同步操作转变为对就绪节点队列的入队/出队操作。本发明实现了各线程对计算区域的动态任务分配,即,在保证波阵面推进的基础上,某一线程将不再固定于执行某一片计算区域,而是总是及时地执行已经满足可执行条件的那些分块,同时也实现了多维分块。本发明的理论执行时间要短于现有三种策略的理论执行时间,且接近最优执行时间。
Description
技术领域
本发明涉及计算机程序的并行性开发领域,尤其涉及一种高效的DOACROSS循环的并行优化策略。
背景技术
开发并行程序以充分发挥多核乃至众核处理器的性能仍然是一个开放式难题。自动并行化技术因具备多重优势,能够在增强多核处理器系统性能上发挥重要作用。以科学和工程计算应用程序为代表的很多计算密集型应用程序,其中的嵌套循环会占用大量的运行时间。按照循环携带的依赖关系,可以将循环分为三类:不携带跨迭代依赖的循环(所有的迭代都可与其他迭代进行完全并行),这样的循环称之为DOALL循环;而将携带跨迭代依赖的循环称为DOACROSS循环;相应的,只能串行执行的循环称之为串行循环。在这三种循环中,DOALL循环的并行性最强,其次为DOACROSS循环,而串行循环则不具有任何并行性。大部分研究者和并行编译器将关注点放在DOALL循环上,而将DOACROSS循环作为串行程序处理。但是,Amdahl定律指出,串行执行的DOACROSS循环势必会严重制约程序总体的并行加速效果。所以,开发DOACROSS循环中的潜在并行性具有重要意义。
对于DOACROSS循环的研究已有多年历史。现有主流的自动化并行策略主要包括以下三种策略:
一、Unnikrishnan在文章《A practical approach to DOACROSSparallelization》中认为单层的并行性足以开发可利用资源,只考虑了规则DOACROSS循环(即能够静态确定依赖关系的DOACROSS循环),提出了一种complier-and-runtime的方法,称为依赖折叠(dependence folding)。该方法使用一个保守依赖(conservativedependence)表示循环分块携带的多个相邻依赖。通过该方法,为每个线程分配的同步变量个数不会超过嵌套循环的层数;此外,还给出了一个收益分析模型来选择最优的流水计算粒度。以下简称ENPA策略。
二、Liu在文章《面向共享存储结构的并行编译优化技术研究》的工作面向的也是规则DOACROSS循环中的单层并行性,设计了一个从循环层中寻找计算划分层和循环分块层的启发式算法,并且再次减少了每个线程的同步变量个数,限定为1。此外,她还提出了一个基于流水并行的代价模型,用以选择最佳流水计算粒度。以下简称CHPA策略。
三、PLuTo是一款针对仿射嵌套循环的基于多面体模型的自动并行局部性优化工具。PLuTo通过为手工标记的C语言源代码寻找有效的仿射变换序列生成分块后的OpenMP并行代码,通过循环偏斜的方法对代码进行了转换,由转换后的并行程序在多核架构上可以获得较好的性能提升。以下简称PLuTo策略。
在实际使用时,以上三种策略各有优劣,但均未能达到多核处理器并行加速效果的最佳值。
发明内容
为了克服上述现有技术存在的问题,本发明的目的在于提供一种DOACROSS循环的并行优化方法,能够获得相比现有并行策略更好的加速比,以及更好的并行可扩展性。
为达到上述目的,本发明采用了以下技术方案:
并行计算完美嵌套循环时,每一个空闲线程申请进入临界区A;成功进入A的线程从就绪节点队列头部获取一个节点,并将该节点从就绪节点队列中删除后退出A;获取该节点的线程计算该节点所指示的分块,计算完成后申请进入临界区B;成功进入B后的线程根据自身最近计算完成的分块更新完美嵌套循环的循环分块状态矩阵,并根据更新后的循环分块状态矩阵更新就绪节点队列,然后退出B,成为空闲线程,再次申请进入临界区A;所述节点是用于指向一个分块在循环分块状态矩阵中的坐标的数据结构。
所述循环分块状态矩阵的元素表示依据矩形循环分块方法对完美嵌套循环的计算区域进行划分所形成的各个分块的执行完成情况;元素与分块一一对应。
所述更新就绪节点队列包括以下步骤:根据更新后的循环分块状态矩阵,若按字典序小于分块b且与分块b直接相邻的分块都已经计算完成,则将分块b对应的节点加入就绪节点队列尾部。
所述完美嵌套循环是通过对初始嵌套循环进行循环融合和循环交换操作而得到的,所述初始嵌套循环为非完美嵌套循环。
所述完美嵌套循环在并行计算前对阻止波阵面的规则推进的依赖关系进行消除。
所述完美嵌套循环的理论执行时间TYZPA按下式计算:
其中,N表示经过分块后得到的分块总数,p表示可用线程数,tj i表示第i个线程执行第j个分块所花费的总时间,i_last表示编号最大的线程。
本发明的有益效果体现在:
本发明通过引入一个就绪节点队列,将同步操作转变为调度操作,实现了将计算区域动态分配给各线程,即,某一线程将不再固定于执行某一片计算区域,而是总是可以及时地执行已经满足可执行条件的那些分块。通过本发明,消除了现有策略存在的静态任务分配导致的资源浪费现象,并通过理论分析证明了本发明的效果接近最优。
附图说明
图1是调度策略整体流程图;
图2是一个二维循环TSM示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步地详细说明。应当理解,此处所描述的实施例仅仅用于解释本发明的基本构想,并不用于限定本发明的保护范围。
本发明提供一种高效的DOACROSS循环的并行优化策略(简称YZPA策略)。在引出该策略之前,本发明提出了关于波阵面规则推进的两个约束条件:
约束一:统一采取矩形循环分块方法。
约束二:循环分块间的块间依赖集合IBS包含分块后迭代空间的所有单位坐标向量。波阵面的推进需要保持正确的块间依赖。
本发明在保证数据依赖正确性基础上,未采用现有策略中将某一片计算任务固定分配给各线程后利用线程间同步来进行并行化的做法,而是加入了一个状态矩阵和一个就绪节点队列,将同步操作转变为对就绪节点队列的入队/出队操作。本发明实现了各线程对计算区域的动态任务分配,即,在保证波阵面推进的基础上,某一线程将不再固定于执行某一片计算区域,而是总是及时地执行已经满足可执行条件的那些分块,同时也实现了多维分块。
本发明需要维护一个n维循环分块状态矩阵(Tile State Matrix,TSM),以及一个就绪节点队列(Ready Node Queue,RNQ),采用矩形循环分块方式。TSM用于标记分块后的循环空间的执行完成情况,TSM中的一个元素s对应一个分块b,元素s的坐标对应分块空间中分块b的坐标,元素s为0表示该分块尚未完成计算,为1则表示该分块已经完成计算。RNQ中的节点是一个简易数据结构,包含n个成员(n为循环深度),用以指向一个分块在上述矩阵中的坐标。当上述矩阵中按字典序小于某元素(假设对应分块b)且与该元素直接相邻的元素都已经计算完成,该元素(分块b)对应的节点将被加入上述队列。这个限制保证了波阵面规则推进(即约束二)。
本发明的并行优化策略如表1所示:
表1.YZPA策略主体
参见图1,YZPA策略具体包括以下步骤:
第一步,对初始嵌套循环进行循环融合和循环交换操作(如果可以),优化循环的局部性。循环融合(Loop Merge)是指将两个及以上的循环合并为一个循环,用以增大循环体大小,增强局部性,并且可用于消除某些阻止其他循环变换的状态。循环交换(LoopInterchange)是指交换两层循环的相对位置,可以增强数据的局部性,但需要满足一定的约束条件才可进行。对循环进行优化的原则是不能破坏循环携带依赖关系,否则会导致错误结果。表2给出本步骤的具体过程。
表2.循环优化步骤
第二步,经过循环优化后如果不能得到一个完美嵌套循环(Perfectly NestedLoops),则该循环无法应用本策略。而对于得到的完美嵌套循环,需要消除阻止波阵面的规则推进的依赖关系。因为要保持循环进行的正确性,固有依赖关系不能凭空消除,只不过是利用循环偏斜等技术将其改变。阻止波阵面的规则推进的依赖关系只是因为该依赖关系包含有负元素,所以,利用循环偏斜等技术将其负元素“归零”即可“消除”该依赖关系。表3给出本步骤的具体过程。
表3.依赖消除步骤
第三步,对第二步所得到的循环进行矩形循环分块,并按照分块因子初始化TSM,创建一个RNQ;将按字典序最小的分块的n维坐标写入一个节点(初始化RNQ),并将该节点插入RNQ尾部;进入并行区后,每一个空闲线程申请进入临界区A;成功进入A的线程将从RNQ头部获取一个节点,并将其从RNQ中删除后退出A;获得节点的线程将会计算该节点所指示的计算区域(一个循环分块),计算完成后申请进入临界区B;成功进入B的线程将更新TSM,并根据新的TSM更新RNQ,退出B后再次申请进入A。由此往复,直到所有计算区域均已完成。这一步是整个策略的核心部分。表4给出本步骤的具体过程。
表4.核心调度步骤
YZPA策略应用实例
如图2所示的一个2维TSM,它表示了一个2维完美嵌套循环的循环分块状态矩阵,对于就绪节点队列的维护(指加入或取出节点)需要各线程互斥进行,所以设立了临界区A和临界区B,分别实现就绪节点队列的互斥取出和互斥加入。假设线程x完成了分块(1,4)的计算,开始申请进入临界区B维护RNQ;线程x成功进入临界区B后将TSM的s14(表示矩阵中第1行第4列的元素)置1,到达图2所示状态,正方形圈出的元素s15对应的分块(1,5)已经满足开始执行的条件,于是线程x将该分块对应的节点(1,5)加入就绪节点队列(RNQ)尾部。线程x维护完RNQ后退出临界区B,成为空闲进程,开始申请进入临界区A。
第一步,当线程y(y可以等于x)完成当前分块的计算并且维护完RNQ退出临界区B后,线程y成为空闲进程,开始申请进入临界区A。假设线程y成功进入临界区A访问RNQ,它将取出节点(1,5)(假设该节点已位于队列头部),并计算该节点所指示的分块。因为圆圈圈出的元素s42尚未满足加入队列的条件(其左侧相邻元素s41为0),所以它将不被加入队列,而是要等到s41为1时才可以被加入队列。(s41、s32,即位于s42左侧和上侧位置的元素所对应的分块在字典序上小于s42所对应的分块。s42的对角线位置上的元素不是其相邻元素,相应分块也不是相邻分块。)
第二步,一旦线程y完成分块(1,5)的计算,它将申请进入临界区B更新TSM,将s15置1,并依此来维护RNQ(如果有新的节点满足开始计算的条件,线程y将其加入RNQ,如果没有,则跳过)。至此,线程y完成了一次完整的计算周期,退出临界区B成为空闲进程,直接进入下一个周期,跳到第一步。
本发明除了提出YZPA策略,还用理论分析的方法给出了各策略的理论执行时间。
用tj i表示线程i执行分块j所花费的总时间,包括运算时间和同步开销时间。注意,因为各策略的同步机制不尽相同,所以对于不同的策略,t的值也不尽相同。N表示经过分块后得到的分块总数,p表示可用线程数,线程编号由1开始,i_last表示编号最大的线程。为了理论估计的简单起见,令N很大,则可以将流水线填充和排空时间都不纳入考虑。此时,处于满载状态的流水线长度为N/p-(p-1)。经过理论分析得出的各策略的理论执行时间TCHPA、TENPA、TPLuTo、TYZPA如下:
可以看出,在不考虑各策略的同步开销有所不同的情况下(即认为同步开销相同),本发明提出的YZPA策略的理论执行时间要短于现有三种策略的理论执行时间,且接近最优执行时间Tmin。无法达到最优执行时间的原因在于:在实际实现中,因为YZPA策略需要使用互斥操作维护一个全局队列,互斥操作的开销较大,所以其性能不会达到最优加速性能。
经过实验验证,本发明YZPA策略的性能加速比以及并行可扩展性都优于另外三种策略。
Claims (6)
1.一种DOACROSS循环的并行优化方法,其特征在于:包括以下步骤:
并行计算完美嵌套循环时,每一个空闲线程申请进入临界区A;成功进入A的线程从就绪节点队列头部获取一个节点,并将该节点从就绪节点队列中删除后退出A;获取该节点的线程计算该节点所指示的分块,计算完成后申请进入临界区B;成功进入B后的线程根据自身最近计算完成的分块更新完美嵌套循环的循环分块状态矩阵,并根据更新后的循环分块状态矩阵更新就绪节点队列,然后退出B,成为空闲线程,再次申请进入临界区A;所述节点是用于指向一个分块在循环分块状态矩阵中的坐标的数据结构。
2.根据权利要求1所述一种DOACROSS循环的并行优化方法,其特征在于:所述循环分块状态矩阵的元素表示依据矩形循环分块方法对完美嵌套循环的计算区域进行划分所形成的各个分块的执行完成情况;元素与分块一一对应。
3.根据权利要求1所述一种DOACROSS循环的并行优化方法,其特征在于:所述更新就绪节点队列包括以下步骤:根据更新后的循环分块状态矩阵,若按字典序小于分块b且与分块b直接相邻的分块都已经计算完成,则将分块b对应的节点加入就绪节点队列尾部。
4.根据权利要求1所述一种DOACROSS循环的并行优化方法,其特征在于:所述完美嵌套循环是通过对初始嵌套循环进行循环融合和循环交换操作而得到的,所述初始嵌套循环为非完美嵌套循环。
5.根据权利要求1所述一种DOACROSS循环的并行优化方法,其特征在于:所述完美嵌套循环在并行计算前对阻止波阵面的规则推进的依赖关系进行消除。
6.根据权利要求1所述一种DOACROSS循环的并行优化方法,其特征在于:所述完美嵌套循环的理论执行时间TYZPA按下式计算:
其中,N表示经过分块后得到的分块总数,p表示可用线程数,tj i表示第i个线程执行第j个分块所花费的总时间,i_last表示编号最大的线程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610851036.XA CN106445666B (zh) | 2016-09-26 | 2016-09-26 | 一种doacross循环的并行优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610851036.XA CN106445666B (zh) | 2016-09-26 | 2016-09-26 | 一种doacross循环的并行优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106445666A true CN106445666A (zh) | 2017-02-22 |
CN106445666B CN106445666B (zh) | 2019-10-11 |
Family
ID=58171254
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610851036.XA Active CN106445666B (zh) | 2016-09-26 | 2016-09-26 | 一种doacross循环的并行优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106445666B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106990995A (zh) * | 2017-03-22 | 2017-07-28 | 西安交通大学 | 一种基于机器学习的循环分块大小选择方法 |
CN108038304A (zh) * | 2017-12-08 | 2018-05-15 | 西安交通大学 | 一种利用时间局部性的格子玻尔兹曼方法并行加速方法 |
CN111124415A (zh) * | 2019-12-06 | 2020-05-08 | 西安交通大学 | 一种开发循环代码中潜在可向量化循环的方法 |
CN111381886A (zh) * | 2020-03-02 | 2020-07-07 | 西安交通大学 | 一种针对模板计算的菱形分块并行优化方法 |
CN116414541A (zh) * | 2023-05-26 | 2023-07-11 | 摩尔线程智能科技(北京)有限责任公司 | 兼容多种任务工作模式的任务执行方法和装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7571301B2 (en) * | 2006-03-31 | 2009-08-04 | Intel Corporation | Fast lock-free post-wait synchronization for exploiting parallelism on multi-core processors |
CN101944014A (zh) * | 2010-09-15 | 2011-01-12 | 复旦大学 | 一种自动流水并行的实现方法 |
CN102222019A (zh) * | 2011-05-19 | 2011-10-19 | 西南交通大学 | 基于OpenMP的小波和小波包多核并行计算方法 |
CN105700933A (zh) * | 2016-01-12 | 2016-06-22 | 上海交通大学 | 可重构处理器的高级语言的并行化和循环优化方法及系统 |
-
2016
- 2016-09-26 CN CN201610851036.XA patent/CN106445666B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7571301B2 (en) * | 2006-03-31 | 2009-08-04 | Intel Corporation | Fast lock-free post-wait synchronization for exploiting parallelism on multi-core processors |
CN101944014A (zh) * | 2010-09-15 | 2011-01-12 | 复旦大学 | 一种自动流水并行的实现方法 |
CN102222019A (zh) * | 2011-05-19 | 2011-10-19 | 西南交通大学 | 基于OpenMP的小波和小波包多核并行计算方法 |
CN105700933A (zh) * | 2016-01-12 | 2016-06-22 | 上海交通大学 | 可重构处理器的高级语言的并行化和循环优化方法及系统 |
Non-Patent Citations (2)
Title |
---|
刘松等: "面向局部性和并行优化的循环分块技术", 《计算机研究与发展》 * |
刘松等: "面向数据访存和程序并行优化的循环分块技术", 《高性能计算发展与应用》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106990995A (zh) * | 2017-03-22 | 2017-07-28 | 西安交通大学 | 一种基于机器学习的循环分块大小选择方法 |
CN106990995B (zh) * | 2017-03-22 | 2020-10-27 | 西安交通大学 | 一种基于机器学习的循环分块大小选择方法 |
CN108038304A (zh) * | 2017-12-08 | 2018-05-15 | 西安交通大学 | 一种利用时间局部性的格子玻尔兹曼方法并行加速方法 |
CN108038304B (zh) * | 2017-12-08 | 2020-08-18 | 西安交通大学 | 一种利用时间局部性的格子玻尔兹曼方法并行加速方法 |
CN111124415A (zh) * | 2019-12-06 | 2020-05-08 | 西安交通大学 | 一种开发循环代码中潜在可向量化循环的方法 |
CN111124415B (zh) * | 2019-12-06 | 2022-02-01 | 西安交通大学 | 一种开发循环代码中潜在可向量化循环的方法 |
CN111381886A (zh) * | 2020-03-02 | 2020-07-07 | 西安交通大学 | 一种针对模板计算的菱形分块并行优化方法 |
CN111381886B (zh) * | 2020-03-02 | 2022-07-12 | 西安交通大学 | 一种针对模板计算的菱形分块并行优化方法 |
CN116414541A (zh) * | 2023-05-26 | 2023-07-11 | 摩尔线程智能科技(北京)有限责任公司 | 兼容多种任务工作模式的任务执行方法和装置 |
CN116414541B (zh) * | 2023-05-26 | 2023-09-05 | 摩尔线程智能科技(北京)有限责任公司 | 兼容多种任务工作模式的任务执行方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106445666B (zh) | 2019-10-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106445666A (zh) | 一种doacross循环的并行优化方法 | |
George et al. | Parallel Cholesky factorization on a shared-memory multiprocessor | |
US8661449B2 (en) | Transactional computation on clusters | |
Ashari et al. | On optimizing machine learning workloads via kernel fusion | |
CN103226487B (zh) | 面向异构众核多级存储结构的数据分布与局部性优化方法 | |
CN102708009A (zh) | 一种基于cuda实现多任务共享gpu的方法 | |
Jeon et al. | Parallel exact inference on a CPU-GPGPU heterogenous system | |
Sun et al. | Real-time scheduling and analysis of synchronous openmp task systems with tied tasks | |
Henzinger et al. | Scheduling large jobs by abstraction refinement | |
Chiu et al. | Programming Dynamic Task Parallelism for Heterogeneous EDA Algorithms | |
CN103810041A (zh) | 一种支持动态伸缩的并行计算的方法 | |
Wang et al. | Partitioning-based scheduling of OpenMP task systems with tied tasks | |
Asaduzzaman et al. | A talented CPU-to-GPU memory mapping technique | |
CN104793922A (zh) | 一种大整数乘法Comba算法基于OpenMP的并行实现方法 | |
Geng et al. | The importance of efficient fine-grain synchronization for many-core systems | |
Silberstein et al. | An exact algorithm for energy-efficient acceleration of task trees on CPU/GPU architectures | |
Zou et al. | Automatic energy efficient parallelization of uniform dependence computations | |
Huang et al. | Partial flattening: a compilation technique for irregular nested parallelism on GPGPUs | |
Hugo et al. | A runtime approach to dynamic resource allocation for sparse direct solvers | |
Blelloch et al. | Improved parallel cache-oblivious algorithms for dynamic programming and linear algebra | |
Cabrera et al. | Energy efficient dynamic load balancing over multigpu heterogeneous systems | |
Yasugi et al. | Parallel graph traversals using work-stealing frameworks for many-core platforms | |
CN109670001A (zh) | 基于cuda的多边形栅格化gpu并行计算方法 | |
Gustedt et al. | Relaxed synchronization with ordered read-write locks | |
Mrabet et al. | A clustering allocation and scheduling analysis approach for multiprocessor dependent real-time tasks |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |