基于多线程并行技术研究及讨论

(整期优先)网络出版时间:2014-07-17
/ 2

基于多线程并行技术研究及讨论

麦宜

海南省东方市公安消防支队麦宜

摘要:通过对当前各种比较流行的多线程方法(如Windows线程,OpenMP,IntelTBB等)的学习和实践来深入了解多线程技术的工作原理和发展现状,然后通过设计了一个基于不同线程方法的运算程序并进行试验,来量化比较各种方法的优劣,本文主要研究和讨论多线程并行技术,并尝试分析了其中的原因,以找到对其进行改良的思路,认清多线程技术的发展趋势。

关键词:多线程;Windows线程;OpenMP;IntelTBB线程(thread),有时也被叫做轻量级进程(LightweightProcess,LWP),是一个程序流运行的基本单位,也是一个进程调度的最小单元。一个最基本的线程,是由线程ID,寄存器组快,堆栈和当前指令指针(PC)构成的。一个线程,能够撤销或创建其他线程,一个进程下的线程之间可以并发地同步执行。

线程在程序中是一个独立的顺序执行流程,一个程序中如果同时有多个线程运行完成各自的工作,被称作多线程[1]。

一、各种多线程方法概述(一)Windows多线程1、Windows多线程基本情况Windows98及以上版本的操作系统属于多任务操作系统,支持两种不同的多任务并行处理方法:基于进程(process)的多任务方法和基于线程(thread)的多任务方法。进程指的是执行中的程序,在执行中,线程相互影响,以至线程在执行中显示出间断的特性。线程的基本状态分为运行,就绪,阻塞三种。

2、Windows多线程同步机制程序的同步运行经常会引起和时间相关的错误,这就需要引入同步机制。同步机制可以调度线程间资源的并行访问。

Windows98为了解决多线程同步问题,设计了四种主要的线程同步对象[2],这些对象对线程而言有两个状态:非信号状态(nonsignalstate)和信号状态(signalstate)。当对象为信号状态时,线程执行并可以享用共享资源,否则则需要等待。

(二)OpenMP概述1、OpenMP基本概念OpenMP是在共享内存体系下的编程模型,它由三个基本API部分构成,它们分别是编译指令、运行部分和环境变量。

这个编程模型包括编译制导、运行库例程和环境变量[3]。OpenMP支持增量并行化,是C/C++和Fortan等的应用编程接口,已经被大多数计算机硬件和软件厂家所标准化。OpenMP的目标是使程序更具标准性,更简洁实用,使用更方便,可移植性更高。

2、OpenMP并行编程模型OpenMP是基于线程的并行编程模型,采用,Fork-Join体现的是一种分治的思想,多被用来分解处理问题。Fork-Join算法将当前问题细分为若干个子问题,然后对这些子问题执行一样的操作,若子问题细分的够小,就可以很快地直接被解决。

如果子问题全部得到解决,把它们结合起来也就解决了父问题。

(三)IntelTBB概述1、基本概念IntelTBB是一个C++多线程模板库,与直接使用API程序编程的方法相比,TBB为多线程编程适当地做了一些抽象,同时也涵盖了更丰富的内容,如提出了任务的概念,为常规算法提供了的完备的实现,负载自动平衡特性以及不对处理器数量进行绑定以提供方便的扩展性。我们可以通过使用这些库来很方便地设计多线程程序。

二、各种线程方法性能分析(一)性能分析实验1、实验目的了解各种线程工作方法的效率,理解各种多线程工作方法。

2、实验方法分别利用四种线程方法,对输入的一组数字{10000,30000,100000,300000,1000000}进行N以内的素数判定,记录所需的运算时间。实验重复10次,然后求出每种方法所需的平均运算时间。通过对运算时间的量化统计,并进行分析,以期望对各种线程方法的效率有更直观的了解。

3、实验结果记录结果求平均值结果如下表:表4-1-1实验结果列表

4、结果分析由实验结果我们可以看出:1)单线程方法耗时最多,IntelTBB最有效率,而Windows线程和OpenMP的效率则相对接近,处于中游。

2)在循环次数较少的时候,Windows线程方法不如OpenMP有效率,但随着循环计算次数的增加,Windows线程方法逐渐超越OpenMP算法。即随着算法复杂度的提升,Windows线程方法比OpenMP算法更能充分发挥其多线程的效率。

(二)合理选择多线程工具多线程开发究竟应该选用TBB,OpenMP,还是本地Windows线程,取决于很多方面的因素,不仅要考虑开发环境因素,还要根据多线程模式的复杂度来选择。

1、IntelTBB?OpenMP?Windows多线程?

由于这只是一个很简单的实验,意在对各种线程方法的效率有一个初步的认识,所以只是得出了很初步的结果分析。事实上,多线程开发究竟应该选用TBB,OpenMP,还是本地Windows线程,取决于很多方面的因素,不仅要考虑开发环境因素,还要根据多线程模式的复杂度来选择。

2、开发环境繁简因素从代码复杂度来分析,与OpenMP和TBB相比,Windows多线程需要更加冗长的代码,所以维护起来就更加复杂。所以,适当地使用OpenMP和TBB,使用它们所提供的API函数来帮你实现线程组的建立和调度,必然会为你省去不少功夫。

3、实现语言扩展性因素若利用C++编程,TBB的性能最佳。因为它利用了大量的C++模板和自定义用户对象类型,所以适合更加面向对象的语言。若利用C语言编程,也许OpenMP反而更加适合[4]。相对于TBB,它更方便结构型编码,所以代码的开销也相对低。同时,OpenMP需要编译器支持MPI库,而Windows线程方法和TBB则不需要。

三、多线程方法研究的意义在本论文中,对当前各种比较流行的多线程方法(Windows线程,OpenMP,IntelTBB等)也进行了比较透彻的分析。并通过程序设计的过程,分别完成了利用单线程,Windows多线程,OpenMP和IntelTBB来求2-1,000,000之间的素数的代码实现方法,在实践中更加深入地了解了各种多线程技术工作原理,并设计了一个简单实验的方法,量化地分析了各种线程方法的运算速度,从一个侧面更直观地了解了各种线程技术的性能。

与传统的多线程论文重理论、轻实践不同,本论文没有一味地罗列多线程方法的理论知识,而是从解决一个应用实例“求2-1,000,000之间的所有素数”出发,通过利用各种不同的线程方法解决这一问题,在实践过程中,更加深入地分析和阐述了多线程的工作机理。又通过设计实验的方法,对各种线程方法的性能进行了量化的分析,使得论文更加的生动,更具说服力。

参考文献:[1]WilliamStallings,操作系统——精髓与设计原理·陈渝译,北京:电子工业出版社,2005[2]陈国良,并行计算——结构·算法·编程(修订版),北京:高等教育出版社,2003[3]Wilkinson,B,Allen,M并行程序设计·陆鑫达等译,北京:机械工业出版社,2001[4]Park,Il.;,Ph.D,Implicitly-multithreadedprocessors,PurdueUniversity,2003