CN112445486A - 基于编译指导的有读写依赖循环的多线程并行方法 - Google Patents
基于编译指导的有读写依赖循环的多线程并行方法 Download PDFInfo
- Publication number
- CN112445486A CN112445486A CN201910800767.5A CN201910800767A CN112445486A CN 112445486 A CN112445486 A CN 112445486A CN 201910800767 A CN201910800767 A CN 201910800767A CN 112445486 A CN112445486 A CN 112445486A
- Authority
- CN
- China
- Prior art keywords
- data
- read
- write
- state table
- dependent
- 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.)
- Withdrawn
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/451—Code distribution
- G06F8/452—Loops
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种基于编译指导的有读写依赖循环的多线程并行方法,包括以下步骤:S1、在循环迭代开始处添加编译指导语句;S2、编译器根据编译指导语句生成数据读写状态表;S3、编译器在对程序中依赖数组进行读访问时,增加判断语句;S4、编译器在对程序中依赖数组进行写访问后,增加对数据读写状态表中该数据对应元素的更新操作;S5、当程序多线程运行时,数据读写状态表中所有数据状态均初始化成false;S6、线程x执行对依赖数组中一个数据的写访问后,将数据读写状态表中对应的状态设置为true。本发明实现了迭代间有先写后读依赖的循环的并行计算,解决了多线程并行时数据的无序竞争访问,能有效提高程序的性能。
Description
技术领域
本发明涉及一种基于编译指导的有读写依赖循环的多线程并行方法,属于计算机技术领域。
背景技术
以OpenMP为代表的共享内存并行编程机制广泛的应用于共享内存系统中数据并行的处理,利用现代处理器计算核心多的特点,通过多线程并发地处理不同的数据缩短程序的执行时间。其处理的代码形式通常为循环,通过分而治之的方式,将循环迭代区间分配给不同的线程执行,从而获得并行加速的效果。
循环迭代是实际应用程序执行时间最长的部分之一,在多核或众核系统上通常采用多线程并行的方式加速循环的执行。然而若循环迭代间有数据依赖关系,直接并行则会因线程之间数据的竞争而产生错误的结果,因此对于这类循环难以采用多线程并行的方式加速。
OpenMP多线程并行通常需要并行循环的迭代间无数据相关性,即要求每个线程所修改的数据与其他线程无重叠。对于有数据依赖的循环,往往需要通过锁等互斥机制对有相关性的数据访问进行保护或者无法并行计算。现有的自动并行优化技术,通过编译器自动分析代码间的相关性,采取一些的依赖消除技术消除循环间相关性,但是自动并行技术存在很大的局限性,实现复杂、并行化识别率不高。
发明内容
本发明的目的是提供一种基于编译指导的有读写依赖循环的多线程并行方法,该基于编译指导的有读写依赖循环的多线程并行方法实现了迭代间有先写后读依赖的循环的并行计算,解决了多线程并行时数据的无序竞争访问,使得这类传统上只能串行执行的循环也能利用多线程并行的方式加速,能有效提高程序的性能。
为达到上述目的,本发明采用的技术方案是:一种基于编译指导的有读写依赖循环的多线程并行方法,基于共享内存架构,包括以下步骤:
S1、在循环迭代开始处添加编译指导语句,用于描述有迭代间依赖关系的数组;
S2、编译器根据编译指导语句生成数据读写状态表,此状态表中的每个元素有两种状态,false状态表示数据没有更新,true状态表示数据已更新,一个元素对应依赖数组中的一个数据;
S3、编译器在对程序中依赖数组进行读访问时,增加判断语句,线程执行到该语句时,根据该依赖数组的数据读写状态表判断所依赖的数据是否已被更新,若已更新则继续执行,否则等待状态更新;
S4、编译器在对程序中依赖数组进行写访问后,增加对数据读写状态表中该数据对应元素的更新操作,标记对应的数值为已被写更新;
S5、当程序多线程运行时,数据读写状态表中所有数据状态均初始化成false;
S6、线程x执行对依赖数组中一个数据的写访问后,即将写的这一个数据在数据读写状态表中对应的状态设置为true;
S7、线程y执行到对依赖数组读访问时,判断需要访问的这一数据在数据读写状态表中的状态是否为true,如果状态不为true,表明这一数据的依赖条件没满足,则需要等待其状态变成true后再执行读访问操作;
S8、线程z执行到对依赖数组读访问时,判断需要访问的这一数据在数据读写状态表中的状态是否为true,如果是true状态,表明这一数据的依赖条件已满足,则直接执行读访问操作。
由于上述技术方案的运用,本发明与现有技术相比具有下列优点:
本发明基于编译指导的有读写依赖循环的多线程并行方法,其针对循环迭代中某些编译器不能有效自动分析的具有真数据依赖关系的数组,结合采用“用户添加数据访问特征描述”和“编译分析变换”的方式,通过共享内存上的数据状态表协调多线程对相同数据单元的访问,通过编译指示描述循环中数据的先写后读依赖关系,编译器生成读写状态表保证数据的先写后读的访问顺序,消除了线程间无序的数据竞争,从而实现了迭代间有先写后读依赖的循环的并行计算,解决了多线程并行时数据的无序竞争访问,使得这类传统上只能串行执行的循环也能利用多线程并行的方式加速,能有效提高程序的性能,且编译指示使用方便简洁,综合收益大。
附图说明
附图1为本发明多线程并行方法流程示意图;
附图2为本发明多线程并行方法流程图。
具体实施方式
实施例:一种基于编译指导的有读写依赖循环的多线程并行方法,基于大规模异构系统,基于共享内存架构,包括以下步骤:
S1、在循环迭代开始处添加编译指导语句,用于描述有迭代间依赖关系的数组;
S2、编译器根据编译指导语句生成数据读写状态表,此状态表中的每个元素有两种状态,false状态表示数据没有更新,true状态表示数据已更新,一个元素对应依赖数组中的一个数据;
S3、编译器在对程序中依赖数组进行读访问时,增加判断语句,线程执行到该语句时,根据该依赖数组的数据读写状态表判断所依赖的数据是否已被更新,若已更新则继续执行,否则等待状态更新;
S4、编译器在对程序中依赖数组进行写访问后,增加对数据读写状态表中该数据对应元素的更新操作,标记对应的数值为已被写更新;
S5、当程序多线程运行时,数据读写状态表中所有数据状态均初始化成false;
S6、线程x执行对依赖数组中一个数据的写访问后,即将写的这一个数据在数据读写状态表中对应的状态设置为true;
S7、线程y执行到对依赖数组读访问时,判断需要访问的这一数据在数据读写状态表中的状态是否为true,如果状态不为true,表明这一数据的依赖条件没满足,则需要等待其状态变成true后再执行读访问操作;
S8、线程z执行到对依赖数组读访问时,判断需要访问的这一数据在数据读写状态表中的状态是否为true,如果是true状态,表明这一数据的依赖条件已满足,则直接执行读访问操作。
实施例进一步解释如下:
利用编译指示描述循环中的先写后读依赖关系,降低编译器自动分析的要求,提升并行化的效果,降低并行化的难度,通过维护写状态表的方式,解决多线程间的写-读依赖关系,保证写-读的顺序和原始语义,从而实现了多线程的并行执行的正确性。
先写后读的数据依赖关系是程序中最常见的依赖,称为真依赖。由于应用程序的数据访问的复杂性,编译器往往很难分析出循环中的真依赖关系。本专利提供了一种基于编译指导方法,即针对具有真依赖关系的循环,设计了描述数据真依赖特征的编译指导语句,辅助编译器在编译过程中进行相应的程序变换。此外,为了解决线程之间的数据依赖关系,需要基于共享内存机制维护数据读写状态表,每个线程通过数据读写状态表保证并行执行后数据依赖顺序和结果的正确性。具体的流程如下:
1、用户在循环迭代开始处添加编译指导语句,描述有真依赖关系的数组。
2、编译器根据编译指示生成数据读写状态表,状态表的每个元素有两种状态,false表示数据没有更新,true表示数据已更新;一个元素对应依赖数组中的一个数据。
3、编译器对程序中依赖数组的读访问时增加判断语句,线程根据该数组的状态表判断是否已被更新,若已更新则继续执行,否则等待状态更新;
4、编译器在程序中依赖数组的写访问后增加对状态表该数据对应元素的更新操作,标记对应的数值已被写更新。
以一个例子说明:
下面的循环中A[i][j]的数值更新需要用到A[i-1][j]的值;
假设当多线程并行时,线程0执行i=1循环,线程1执行i=2循环;
常规方式下,线程1必须要等到线程0执行完才能执行,因为此时线程1用到的A[i-1][j]是需要线程0先进行更新的 ,否则结果就会出错。此时并行时没有效果的,相当于串行执行;
#pragma omp parallel for
for(i = 1; i<N; i++)
{
A[i][j] = A[i-1][j] *2 + A[i][j]*3;
}
根据本发明方法,可以构建一个读写状态表,通过这个读写状态表把A[i][*]对A[i-1][*]的整体依赖分解到其中的每个元素单元,当有部分数据单元的依赖满足时,线程1就可以先执行,不用等到正给A[i-1][*]更新完再执行;同样后续的线程2~n也是如此,这样才有并行的意义。
采用上述基于编译指导的有读写依赖循环的多线程并行方法时,其针对循环迭代中某些编译器不能有效自动分析的具有真数据依赖关系的数组,结合采用“用户添加数据访问特征描述”和“编译分析变换”的方式,通过共享内存上的数据状态表协调多线程对相同数据单元的访问,通过编译指示描述循环中数据的先写后读依赖关系,编译器生成读写状态表保证数据的先写后读的访问顺序,消除了线程间无序的数据竞争,从而实现了迭代间有先写后读依赖的循环的并行计算,解决了多线程并行时数据的无序竞争访问,使得这类传统上只能串行执行的循环也能利用多线程并行的方式加速,能有效提高程序的性能,且编译指示使用方便简洁,综合收益大。
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。
Claims (1)
1.一种基于编译指导的有读写依赖循环的多线程并行方法,其特征在于:基于共享内存架构,包括以下步骤:
S1、在循环迭代开始处添加编译指导语句,用于描述有迭代间依赖关系的数组;
S2、编译器根据编译指导语句生成数据读写状态表,此状态表中的每个元素有两种状态,false状态表示数据没有更新,true状态表示数据已更新,一个元素对应依赖数组中的一个数据;
S3、编译器在对程序中依赖数组进行读访问时,增加判断语句,线程执行到该语句时,根据该依赖数组的数据读写状态表判断所依赖的数据是否已被更新,若已更新则继续执行,否则等待状态更新;
S4、编译器在对程序中依赖数组进行写访问后,增加对数据读写状态表中该数据对应元素的更新操作,标记对应的数值为已被写更新;
S5、当程序多线程运行时,数据读写状态表中所有数据状态均初始化成false;
S6、线程x执行对依赖数组中一个数据的写访问后,即将写的这一个数据在数据读写状态表中对应的状态设置为true;
S7、线程y执行到对依赖数组读访问时,判断需要访问的这一数据在数据读写状态表中的状态是否为true,如果状态不为true,表明这一数据的依赖条件没满足,则需要等待其状态变成true后再执行读访问操作;
S8、线程z执行到对依赖数组读访问时,判断需要访问的这一数据在数据读写状态表中的状态是否为true,如果是true状态,表明这一数据的依赖条件已满足,则直接执行读访问操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910800767.5A CN112445486A (zh) | 2019-08-28 | 2019-08-28 | 基于编译指导的有读写依赖循环的多线程并行方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910800767.5A CN112445486A (zh) | 2019-08-28 | 2019-08-28 | 基于编译指导的有读写依赖循环的多线程并行方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112445486A true CN112445486A (zh) | 2021-03-05 |
Family
ID=74741019
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910800767.5A Withdrawn CN112445486A (zh) | 2019-08-28 | 2019-08-28 | 基于编译指导的有读写依赖循环的多线程并行方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112445486A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115408157A (zh) * | 2022-08-31 | 2022-11-29 | 北京中科睿信科技有限公司 | 一种基于线程池的模型并行化数据仿真方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101807144A (zh) * | 2010-03-17 | 2010-08-18 | 上海大学 | 一种前瞻多线程并行执行优化方法 |
CN105260222A (zh) * | 2015-10-13 | 2016-01-20 | 哈尔滨工程大学 | 一种可重构编译器中循环流水迭代间启动间距优化方法 |
CN105487911A (zh) * | 2015-11-24 | 2016-04-13 | 无锡江南计算技术研究所 | 一种基于编译指导的众核数据分片方法 |
-
2019
- 2019-08-28 CN CN201910800767.5A patent/CN112445486A/zh not_active Withdrawn
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101807144A (zh) * | 2010-03-17 | 2010-08-18 | 上海大学 | 一种前瞻多线程并行执行优化方法 |
CN105260222A (zh) * | 2015-10-13 | 2016-01-20 | 哈尔滨工程大学 | 一种可重构编译器中循环流水迭代间启动间距优化方法 |
CN105487911A (zh) * | 2015-11-24 | 2016-04-13 | 无锡江南计算技术研究所 | 一种基于编译指导的众核数据分片方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115408157A (zh) * | 2022-08-31 | 2022-11-29 | 北京中科睿信科技有限公司 | 一种基于线程池的模型并行化数据仿真方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7571301B2 (en) | Fast lock-free post-wait synchronization for exploiting parallelism on multi-core processors | |
US9720667B2 (en) | Automatic loop vectorization using hardware transactional memory | |
Boyer et al. | Automated dynamic analysis of CUDA programs | |
US8010550B2 (en) | Parallelizing sequential frameworks using transactions | |
Fauzia et al. | Characterizing and enhancing global memory data coalescing on GPUs | |
EP2171592B1 (en) | Parallelizing sequential frameworks using transactions | |
US20100095286A1 (en) | Register reduction and liveness analysis techniques for program code | |
US10466988B2 (en) | Systems and methods for automatic computer code parallelization | |
US20040123280A1 (en) | Dependence compensation for sparse computations | |
US20230325194A1 (en) | In-core parallelisation in a data processing apparatus and method | |
Jenista et al. | OoOJava: An out-of-order approach to parallel programming | |
CN112445486A (zh) | 基于编译指导的有读写依赖循环的多线程并行方法 | |
Spear et al. | Reducing memory ordering overheads in software transactional memory | |
Abe et al. | Reducing state explosion for software model checking with relaxed memory consistency models | |
CN111124415B (zh) | 一种开发循环代码中潜在可向量化循环的方法 | |
Sun et al. | Speculative vectorisation with selective replay | |
Liu et al. | Lightweight dependency checking for parallelizing loops with non-deterministic dependency on gpu | |
Chen et al. | A lock-free cache-friendly software queue buffer for decoupled software pipelining | |
Jeyakumaran et al. | Improving performance of transactional applications through adaptive transactional memory | |
Wang et al. | Balancing thread partition for efficiently exploiting speculative thread-level parallelism | |
Kashuba et al. | Automatic Generation of a Hybrid Query Execution Engine | |
Khaldi et al. | Task parallelism and synchronization: An overview of explicit parallel programming languages | |
Corral-García et al. | Efficient code development for improving execution performance in high-performance computing centers | |
Feng et al. | Programming support for speculative execution with software transactional memory | |
Sheiue et al. | A Practical Software-based Programming Model for Thread-level Speculation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WW01 | Invention patent application withdrawn after publication |
Application publication date: 20210305 |
|
WW01 | Invention patent application withdrawn after publication |