一种轻量级裸片代码的创建及并行运行方法_2

文档序号:9921882阅读:来源:国知局
的环境信息,然后配置子线程的环境;
56、根据用户是否需要线程同步的信息,决定由子线程采用公用计数器单独执行并行运行的代码或者由子线程和父线程采用公用计数器共同执行并行运行的代码。
[0019]进一步作为优选的实施方式,所述所需的环境信息包括但不限于父线程当前函数的所有变量、并行运行代码块的起始位置和结束位置。
[0020]进一步作为优选的实施方式,所述步骤SI,其包括:
511、父线程按照单线程的方式执行到需要并行运行的代码处;
512、获取用户要求并发的线程数以及用户是否需要线程同步的信息,并对公用计数器进行初始化;
进一步作为优选的实施方式,在所述步骤S12,其包括:
父线程获取用户要求并发的线程数以及用户是否需要线程同步的信息;
父线程设定公用计数器的类型、变量名和初始值,并修改公用计数器所采用的函数; 父线程设定线程任务继续执行的条件;
父线程设定线程执行并行运行代码块的代码前需执行的额外代码;
父线程设定所需的参数或用逗号分隔的参数组。
[0021 ]进一步作为优选的实施方式,所述步骤S4,其具体为:
若用户需要线程同步,则创建η-1个子线程;反之,则创建η个子线程,其中,η为用户要求并发的线程数。
[0022]进一步作为优选的实施方式,所述步骤S5,其包括:
551、子线程获取由父线程传入的所需的环境信息;
552、子线程根据获得的环境信息配置本子线程的变量信息,以使本子线程获得父线程的变量快照;
553、子线程跳转至并行运行代码块的起始位置。
[0023]进一步作为优选的实施方式,所述步骤S6,其具体为:
若用户需要线程同步,则父线程与创建的η-1个子线程等价,父线程执行完一次并行运行代码块的代码至并行运行代码块的结束位置后,等待η-1个子线程分别采用公用计数器执行完一次并行运行代码块的代码;反之,则父线程与创建的η个子线程异步,父线程直接跳转至并行运行代码块的结束位置,等待η个子线程分别采用公用计数器执行完一次并行运行代码块的代码。
[0024]进一步作为优选的实施方式,所述η-1个子线程分别采用公用计数器执行完一次并行运行代码块的代码或η个子线程分别采用公用计数器执行完一次并行运行代码块的代码这一步骤,其包括:
561、以n-1个子线程或η个子线程中的任一子线程作为当前子线程,判断公用计数器是否被其他子线程或父线程锁定,若是,则当前子线程进入阻塞等待状态,直至公用计数器被解锁后执行步骤S62,反之,则当前子线程直接执行步骤S62;
562、当前子线程锁定公用计数器;
563、判断公用计数器是否符合设定的退出规则,若是,则当前子线程解锁公用计数器并跳转至并行运行代码块的结束位置,反之,则当前子线程执行步骤S64;
564、当前子线程获得公用计数器的副本,并以获得的副本的值作为当前子线程本轮的计数器值;
565、当前子线程采用计数器修改函数修改公用计数器,然后解除公用计数器的锁定;
566、当前子线程以当前子线程本轮的计数器值作为计数器的值,执行完一次并行运行代码块的代码,然后以下一个子线程作为当前子线程返回步骤S61。
[0025]进一步作为优选的实施方式,在所述步骤S5之后还设有步骤S6,所述步骤S6,其具体为:父线程执行并行运行代码块后的其它代码,并在执行完毕后释放所占的资源。
[0026]进一步作为优选的实施方式,当用户需要线程同步时,所述父线程与子线程的堆内存空间是共享的而栈空间是独立的。
[0027]下面结合说明书附图和具体实施例对本发明作进一步详细说明。
[0028]实施例一
参照图2-9,本发明的第一实施例:
本发明提出了一个非函数形式的多线程并行运行方法,在不用为集成开发环境安装任何辅助插件的前提下,令编程人员可以像普通的for或while语句一样,并行化执行代码片段,而不再需要使用传统将代码封装至函数的繁琐执行方式,有效地提高了多线程程序的编写效率,运行效率与代码易读性。本发明的方法与for语句较为类似,使用公用计数器来控制多线程并行运行的执行流程,通过把一个循环的不同执行遍数均衡分派到多个线程来提高并行程序的运行效率。普通单线程代码中的for或while语句只需要经过简单的替换处理也可使用本发明来进行并行化,本发明具有良好的兼容性和可迀移性。本发明对每个并行的线程来说,堆是共享的而栈是独立的,既保证了数据的共享性,又维护了线程的独立性。此外,本发明还类似于编程的多重循环结构(此处将一个子线程束看做一重循环),既可创建单级并发线程束;而且在cpu核数允许的前提下,也可创建多个嵌套的子线程束。其中,子线程束是由同一父线程创建的所有子线程的集合,用于分流计算负载,以提高程序的并行度。这也极大地增强了并行编程开发的灵活性。
[0029]本发明的调用结构如图6、7、8和9所示,而内存管理结构图则如图3所示。由图3可知,对每个并行的线程来说,堆是共享的而栈是独立的。
[0030]如图2所示,本发明一种轻量级裸片代码的创建及并行运行方法主要包括父线程处理和子线程处理这两个主要处理过程。下面分别对这两个过程进行详细说明。
[0031](一)父线程处理过程
本实施例的父线程处理过程,主要包括以下步骤:
(I)父线程按照单线程的方式执行至需并行运行的代码处,然后设定如下要素:
I)用户要求并发的线程数η。其中,η为正整数,实际创建的最大线程数量受限于CPU核数和计算机存储及运算资源。故该线程数η依照CPU核数来进行设定,若其数量少于CPU核数则不能充分利用CPU的性能;若其数量多于CPU核数,则将产生CPU线程分时间片执行的状况,随之产生额外运算开销。为保持该方法对用户透明,默认情况下,此参数η设置为CPU核数。
[0032]2)公用计数器的数据类型。其中,公用计数器为全局变量,可被父线程与所有子线程访问。
[0033]3)公用计数器的变量名。公用计数器,用于对并行运行代码块的执行次数进行控制。
[0034]4)公用计数器的初始值。该初始值的类型为公用计数器的数据类型的变量或该类型的常量。
[0035]5)任务继续执行的条件。该继续执行的条件的结果值为布尔表达式的值。
[0036]6)修改公用计数器的函数,可带参数。
[0037]7)线程是否需要同步。线程是否需要同步采用布尔值来表示,默认其为true。
[0038]8)每条线程执行并行运行代码块的代码前需执行的额外代码。该要素为可选的要素,默认为空。
[0039]9)所需的参数或用逗号分隔的参数组。该要素也为可选的要素。
[0040](2)设定并行运行代码块的起始位置和并行运行代码块的结束位置。
[0041](3)获取必要的环境信息,包括父线程(即当前线程)、当前函数的所有变量以及并行运行代码块的起始位置和结束位置。
[0042](4)若用户需要线程同步,则创建η-1个子线程;若用户需要线程异步,则创建η个子线程。
[0043](5)父线程向子线程传递步骤(3)中获取的环境信息。
[0044](6)若用户需要线程同步,则父线程与步骤(4)创建的子线程等价,此时η-1个子线程分别采用公用计数器执行完一次并行运行代码块的代码,父线程执行完一次并行运行代码块的代码至并行运行代码块的结束位置后,等待直至所有子线程执行完毕;父线程直接跳转至并行运行代码块的结束位置,等待η个子线程分别采用公用计数器执行完一次并行运行代码块的代码。
[0045](7)父线程执行并行运行代码块后的其它代码,并在执行完毕后释放所占的资源
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1