一种针对地震数据块的并行循环方法

文档序号:6514460阅读:112来源:国知局
一种针对地震数据块的并行循环方法
【专利摘要】本发明提供了一种针对地震数据块的并行循环方法,属于计算机科学领域中的并行计算领域。本发明方法包括:(1)封装线程控制、同步原语;(2)循环算法的地震数据块分发控制线程模板化;(3)循环算法的特定数据块计算线程模板化。本发明封装了线程库的底层细节,透明化了线程库的使用,模板化了并行循环的编程模式,给各种应用场景的并行循环提供了一种快速、有效的并行化方法。
【专利说明】一种针对地震数据块的并行循环方法

【技术领域】
[0001]本发明属于计算机科学领域中的并行计算领域,具体涉及一种针对地震数据块的并行循环方法。

【背景技术】
[0002]在并行计算领域中,针对地震数据块的数据级并行,一般都会存在循环算法,而循环算法通常也是并行的热点。对于这种并行热点,目前的实现方式有:(I)使用制导语句(OpenMP等),它的使用简单,但会对每个并行循环进行一次创建和销毁,会消耗一定的时间;(2)使用线程库(Windows Threads、Pthread等)的一般方法是:①把循环所在的程序块封装在一个新函数中;②在新函数的循环中使用线程同步原语实现线程同步声明新函数形参:如循环次数及其它新函数执行需要的参数;④创建线程,并把新函数绑定在线程执行函数入口 ;⑤初始化线程,并给程序执行函数指定实参;?启动线程执行等待线程计算完成。这种方式控制复杂,需要充分理解线程同步、线程创建、线程初始化、线程控制的专业知识,不利于应用开发人员把注意力集中在应用开发上。
[0003]本申请要解决的技术问题是透明化复杂的线程控制和同步,设计一种模板化的针对地震数据块的循环算法的并行方法。


【发明内容】

[0004]本发明的目的在于解决上述现有技术中存在的难题,提供一种针对地震数据块的并行循环方法,既可以提供灵活的线程控制,也可以封装线程同步、线程创建、线程初始化、线程控制各种专业知识,让并行循环开发人员只把注意力集中在应用上。它的使用简单,可大幅度的降低并行循环的开发时间和开发复杂度。
[0005]本发明是通过以下技术方案实现的:
[0006]一种针对地震数据块的并行循环方法,包括:
[0007](I)封装线程控制、同步原语;
[0008](2)循环算法的地震数据块分发控制线程模板化;
[0009](3)循环算法的特定地震数据块计算线程模板化。
[0010]步骤⑵和步骤(3)之间没有先后顺序的关系,只是在排版上的顺序。所述地震数据块指可被循环算法计算所需的地震数据集,比如:N个地震道数据;所述特定地震数据块指在运行时相应计算线程从控制线程分发中得到的地震数据块。它是控制线程中所有地震数据块中的一部分。
[0011]所述步骤⑴包括:
[0012]①一次性创建计算线程,它的目的是减少线程多次创建和销毁的系统消耗。它通过线程库的创建线程函数接口实现;
[0013]②地震数据分发完成。当地震数据分发完成后,它通过线程库的互斥锁和条件变量实现对各个计算线程的通知,让计算线程启动计算,伪代码如下;
[0014]上锁;
[0015]设置所有计算线程数据准备好状态;
[0016]通知所有计算线程可以计算;
[0017]解锁;
[0018]③等待所有针对被分发的地震数据块的计算线程计算完成。它通过线程库的互斥锁和条件变量实现等待所有计算线程计算完成,伪代码如下;
[0019]上锁;
[0020]等待所有计算线程计算完成;
[0021]解锁;
[0022]④通知所有计算线程停止计算。它通过线程库的互斥锁和条件变量实现通知所有计算线程停止计算,伪代码如下;
[0023]上锁;
[0024]设置所有计算线程停止计算状态;
[0025]通知所有计算线程停止计算;
[0026]解锁;
[0027]⑤等待所有计算线程退出计算函数。它通过线程库的互斥锁和条件变量等待所有计算线程退出计算函数,伪代码如下;
[0028]上锁;
[0029]等待所有计算线程退出;
[0030]解锁;
[0031]⑥获取当前计算线程ID。它通过线程库的线程标识符获取函数实现;
[0032]⑦等待地震数据分发完成。它通过线程库的互斥锁和条件变量等待地震数据分发完成,伪代码如下;
[0033]上锁;
[0034]等待地震数据分发完成;
[0035]解锁;
[0036]⑧获取当前计算线程是否需要停止计算状态。状态值记录在数组中;
[0037]⑨通知控制线程当前计算线程计算完成。它通过线程库的互斥锁和条件变量通知控制线程当前计算线程计算完成,伪代码如下;
[0038]上锁;
[0039]设置当前线程ID的计算线程计算完成状态;
[0040]最后一个计算完成的计算线程通知控制线程计算完成;
[0041]解锁;
[0042]⑩通知控制线程当前计算线程退出计算函数。它通过线程库的互斥锁和条件变量通知控制线程当前计算线程退出计算函数,伪代码如下;
[0043]上锁;
[0044]设置当前线程ID的计算线程退出计算函数状态;
[0045]最后一个退出计算函数的计算线程通知控制线程计算完成;
[0046]解锁;
[0047](11)启动所有计算线程。它通过线程库的唤醒阻塞线程函数接口启动所有计算线程。
[0048]所述步骤⑵包括:
[0049]①把地震数据块大小平均分配给N个任务(这里的N个任务等同于N个计算线程)4201 ;
[0050]②使用“启动所有计算线程”功能,启动N个任务;
[0051]③读一个地震数据块,如地震数据块计算完了,则跳转到⑧执行,否则转入④;
[0052]④分发当前地震数据块给相应的计算线程;
[0053]⑤使用“地震数据分发完成”功能,通知计算线程可以针对被分配到的地震数据块进行计算;
[0054]⑥如果需要停止所有计算线程的计算,则跳转到⑧执行,否则使用“等待所有针对被分发的地震数据块的计算线程计算完成”功能,等待当前次所有计算线程计算完成;
[0055]⑦返回到③;
[0056]⑧使用“通知所有计算线程停止计算”功能,通知计算线程结束计算;
[0057]⑨使用“等待所有计算线程退出计算函数”功能。
[0058]所述步骤(3)包括:
[0059]①使用“获取当前计算线程ID”功能,获取当前所在的线程ID ;
[0060]②使用“等待地震数据分发完成”功能,等待当前线程获取相应的地震数据块;
[0061]③使用“获取当前计算线程是否需要停止计算状态”功能,判断是否要求当前线程强制结束计算,是则转入步骤⑥,否则转入④;
[0062]④多个计算线程同时执行针对相应地震数据块的算法;
[0063]⑤使用“通知控制线程当前计算线程计算完成”功能,通知控制线程,当前计算线程已完成计算,并跳转到②执行;
[0064]⑥使用“通知控制线程当前计算线程计算完成”功能,通知控制线程,当前计算线程已完成计算;
[0065]⑦使用“通知控制线程当前计算线程退出计算函数”功能,通知控制线程当前线程已经退出。
[0066]与现有技术相比,本发明的有益效果是:本发明封装了线程库的底层细节,透明化了线程库的使用,模板化了并行循环的编程模式。给各种应用场景的并行循环提供了一种快速、有效的并行化方法。

【专利附图】

【附图说明】
[0067]图1示出本发明的一个实施例的流程图。
[0068]图2示出本发明的一实施例的基于线程库的并行循环模板类;
[0069]图3示出用于实现图2中的关键函数的实施例。
[0070]图4本发明方法的步骤框图。

【具体实施方式】
[0071]下面结合附图对本发明作进一步详细描述:
[0072]如图4所示,本发明描述了一种针对地震数据块的并行循环方法。本发明通过封装线程库的使用细节,管理线程的创建、初始化、执行、同步,并在这些基础上,提供了一个通用的并行循环模板。利用并行循环模板,可以简单、有效的开发出各种应用场景下的循环并行化程序。本发明既封装了线程库的使用细节,也为循环并行化提供了一种通用、简洁的模式。
[0073]本发明的一个实施例的步骤如图1所示,包括:
[0074](I)确定需要并行的循环算法。
[0075](2)基于并行循环模板类200,新建一个类102。
[0076](3)并行循环模板类102的初始化;
[0077]①拷贝循环算法放入并行循环模板类200的并行循环函数209的循环体内;
[0078]②把循环的迭代次数、迭代的开始值、结束值和步长分别赋给并行循环模板类200的循环的迭代次数203A、循环迭代的开始值203B、循环迭代的结束值203C和循环迭代的步长 203D ;
[0079]③把循环算法中用到的共享数据,通过局部变量使其变为每个线程的私有数据,如果必须共享的数据,在读写使用时,调用并行循环模板类200的锁获取函数208(该函数的作用是保证多个线程访问的数据一致性),使用完后,释放锁,以便给其它线程使用此共享数据;
[0080]④如果循环算法中有其它需要使用的参数,则将其封装在并行循环模板类200的容器数据结构体205中,以便并行循环函数209中的循环体内程序209A(它的内容是待并行的循环算法)可以读写使用。
[0081](4)实例化并行循环模板类102,并且调用实例化类对象的函数,即并行循环模板类200的线程创建、初始化函数206初始化线程,然后调用其对象的控制线程函数207,等到并行循环计算完成、或被停止后,控制线程函数207就会返回。
[0082]所述步骤⑷包括:
[0083](41)创建、初始化函数206的步骤如下:
[0084]①一次性创建N个线程4101,本发明中的N等于多核处理器的核数;
[0085]②初始化N个线程;
[0086]③挂起线程,等待并行循环服务请求。
[0087](42)控制线程函数207的实施例步骤如下:
[0088]①根据并行循环模板类200中的迭代次数、迭代的开始值、结束值、步长和容器数据结构体,为每个线程构建迭代数据和其它并行循环需要的参数(具体哪些参数必须是根据应用的并行循环算法来确定的,所以到底有哪些参数必须根据实际应用决定,也就是并行循环算法中需要多少参数,就可以把这些参数写入到容器数据结构体中即可);
[0089]②设置并行循环体函数入口,即将并行循环函数209设置到指定的线程执行入口处;
[0090]③把①中构建的数据传递给每个线程;
[0091]④执行绑定在每个线程上的并行循环函数209 ;
[0092]⑤如果不强制结束每个线程上的并行循环函数209的计算,则转入步骤⑥,否则转到步骤⑦;
[0093]⑥判断是否计算完成,如果完成,则转入步骤⑦,否则返回步骤⑤;
[0094]⑦等待所有计算线程计算结束,退出并行循环函数209。
[0095](43)并行循环函数209的实施例步骤如下:
[0096]①获取当前所在的线程ID ;
[0097]②把控制线程函数207构建并传入的数据设置到相应的循环程序中(模板自动设置);
[0098]③执行循环体内的程序209A ;
[0099]④判断是否要求当前线程强制结束计算,是则转入步骤⑥,否则转入步骤⑤;
[0100]⑤判断当前线程的循环是否结束,是则转入步骤⑥,否则返回步骤③;
[0101]⑥通知控制线程函数207当前线程计算完成;
[0102]⑦通知控制线程函数207当前线程退出。
[0103]图2示出实现并行循环模板的并行循环模板类200。它继承了线程管理类202,为线程创建、初始化206,控制线程函数207和并行循环函数的构建及其之间的同步,及各种锁的获取208提供了基础设施。
[0104]图3示出了一个创建、初始化线程206,控制线程函数207及并行循环函数209的实施例。
[0105]本发明的实施例通过封装线程库的线程创建、线程初始化、线程同步、线程控制功能,形成线程类;在线程类的基础上,实现线程管理类;在线程管理类的基础上,编写了循环并行化的通用模板。需要并行循环的用户,只要根据通用模板的替换要求,简单替换掉相应的函数名及函数体即可实现循环算法并行化。
[0106]上述技术方案只是本发明的一种实施方式,对于本领域内的技术人员而言,在本发明公开了应用方法和原理的基础上,很容易做出各种类型的改进或变形,而不仅限于本发明上述【具体实施方式】所描述的方法,因此前面描述的方式只是优选的,而并不具有限制性的意义。
【权利要求】
1.一种针对地震数据块的并行循环方法,其特征在于:所述方法包括: (1)封装线程控制、同步原语; (2)循环算法的地震数据块分发控制线程模板化; (3)循环算法的特定数据块计算线程模板化。
2.根据权利要求1所述的针对地震数据块的并行循环方法,其特征在于:所述步骤(I)包括: ①一次性创建计算线程4101,它的目的是减少线程多次创建和销毁的系统消耗; ②地震数据分发结束4102; ③等待所有针对被分发的地震数据块的计算线程计算结束4103; ④通知所有计算线程停止计算4104; ⑤等待所有计算线程退出计算函数4105; ⑥获取当前计算线程ID4106; ⑦等待地震数据分发结束4107; ⑧获取当前计算线程是否需要停止计算状态4108; ⑨通知控制线程当前计算线程计算结束4109; ⑩通知控制线程当前计算线程退出计算函数4110; (11)启动所有计算线程4111。
3.根据权利要求2所述的针对地震数据块的并行循环方法,其特征在于:所述步骤(2)包括: ①把地震数据块大小平均分配给N个任务4201; ②使用“启动所有计算线程4111”功能,启动N个任务4202; ③读一个地震数据块,如地震数据块计算完了,则跳转到⑧执行,否则继续下一步执行4203 ; ④分发当前地震数据块给相应的计算线程4204; ⑤使用“地震数据分发结束4102”功能,通知计算线程可以针对被分配到的地震数据块进行计算4205 ; ⑥如果需要停止所有计算线程的计算,则跳转到⑧执行,否则使用“等待所有针对被分发的地震数据块的计算线程计算结束4103”功能,等待当前次所有计算线程计算完成4206 ; ⑦跳转到③执行4207; ⑧使用“通知所有计算线程停止计算4104”功能,通知计算线程结束计算4208; ⑨使用“等待所有计算线程退出计算函数4105”功能,4209。
4.根据权利要求3所述的针对地震数据块的并行循环方法,其特征在于:所述步骤(3)包括: ①使用“获取当前计算线程ID4106”功能,获取当前所在的线程ID4301; ②使用“等待地震数据分发结束4107”功能,等待当前线程获取相应的地震数据块.4302 ; ③使用“获取当前计算线程是否需要停止计算状态4108”功能,判断是否要求当前线程强制结束计算,是则转入步骤⑥,否则继续执行下一步2303 ; ④多个计算线程同时执行针对相应地震数据块的算法2304; ⑤使用“通知控制线程当前计算线程计算结束4109”功能,通知控制线程,当前计算线程已完成计算2305,并跳转到②执行; ⑥使用“通知控制线程当前计算线程计算结束4109”功能,通知控制线程,当前计算线程已完成计算2306 ; ⑦使用“通知控制线程当前计算线程退出计算函数4110”功能,通知控制线程当前线程已经退出2307。
【文档编号】G06F9/38GK104516717SQ201310462138
【公开日】2015年4月15日 申请日期:2013年9月30日 优先权日:2013年9月30日
【发明者】洪承煜, 杨尚琴, 陈浩, 岳承琪, 王昀, 吴边 申请人:中国石油化工股份有限公司, 中国石油化工股份有限公司石油物探技术研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1