论文部分内容阅读
摘 要:通过对当前各种比较流行的多线程方法(如Windows线程,OpenMP,Intel TBB等)的学习和实践来深入了解多线程技术的工作原理和发展现状,然后通过设计了一个基于不同线程方法的运算程序并进行试验,来量化比较各种方法的优劣,本文主要研究和讨论多线程并行技术,并尝试分析了其中的原因,以找到对其进行改良的思路,认清多线程技术的发展趋势。
关键词:多线程;Windows线程;OpenMP;IntelTBB
线程(thread),有时也被叫做轻量级进程(Lightweight Process,LWP),是一个程序流运行的基本单位,也是一个进程调度的最小单元。一个最基本的线程,是由线程ID,寄存器组快,堆栈和当前指令指针(PC)构成的。一个线程,能够撤销或创建其他线程,一个进程下的线程之间可以并发地同步执行。线程在程序中是一个独立的顺序执行流程,一个程序中如果同时有多个线程运行完成各自的工作,被称作多线程[1]。
一、 各种多线程方法概述
(一)Windows多线程
1、Windows多线程基本情况
Windows98及以上版本的操作系统属于多任务操作系统,支持两种不同的多任务并行处理方法:基于进程(process)的多任务方法和基于线程(thread)的多任务方法。进程指的是执行中的程序,在执行中,线程相互影响,以至线程在执行中显示出间断的特性。线程的基本状态分为运行,就绪,阻塞三种。
2、Windows多线程同步机制
程序的同步运行经常会引起和时间相关的错误,这就需要引入同步机制。同步机制可以调度线程间资源的并行访问。Windows98为了解决多线程同步问题,设计了四种主要的线程同步对象[2],这些对象对线程而言有两个状态:非信号状态(nonsignalstate)和信号状态(signal state)。当对象为信号状态时,线程执行并可以享用共享资源,否则则需要等待。
(二)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 实验结果列表
线程方法/测试数据 10000 30000 100000 300000 1000000
单线程 29.8ms 95.3ms 385.7ms 1320.4ms 4748.0ms
Windows线程 29.6ms 99.9ms 384.4ms 1291.2ms 4723.6ms
OpenMP
26.6ms 95.3ms 384.6ms 1308.7ms 4732.2ms
Intel TBB 24.7ms
98.6ms 379.7ms 1282.8ms 4651.1ms
4、 结果分析
由实验结果我们可以看出:
1) 单线程方法耗时最多,Intel TBB最有效率,而Windows线程和OpenMP的效率则相对接近,处于中游。
2) 在循环次数较少的时候,Windows线程方法不如OpenMP有效率,但随着循环计算次数的增加,Windows线程方法逐渐超越OpenMP算法。即随着算法复杂度的提升,Windows线程方法比OpenMP算法更能充分发挥其多线程的效率。
(二)合理选择多线程工具
多线程开发究竟应该选用TBB,OpenMP,还是本地Windows线程,取决于很多方面的因素,不仅要考虑开发环境因素,还要根据多线程模式的复杂度来选择。
1、 Intel TBB?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,Intel TBB等)也进行了比较透彻的分析。并通过程序设计的过程,分别完成了利用单线程,Windows多线程,OpenMP和Intel TBB来求2-1,000,000之间的素数的代码实现方法,在实践中更加深入地了解了各种多线程技术工作原理,并设计了一个简单实验的方法,量化地分析了各种线程方法的运算速度,从一个侧面更直观地了解了各种线程技术的性能。
与传统的多线程论文重理论、轻实践不同,本论文没有一味地罗列多线程方法的理论知识,而是从解决一个应用实例“求2-1,000,000之间的所有素数”出发,通过利用各种不同的线程方法解决这一问题,在实践过程中,更加深入地分析和阐述了多线程的工作机理。又通过设计实验的方法,对各种线程方法的性能进行了量化的分析,使得论文更加的生动,更具说服力。
参考文献
[1] William Stallings,操作系统——精髓与设计原理·陈渝译,北京:电子工业出版社,2005
[2] 陈国良,并行计算——结构·算法·编程(修订版),北京:高等教育出版社,2003
[3] Wilkinson,B,Allen,M 并行程序设计·陆鑫达等译,北京:机械工业出版社,2001
[4] Park, Il.;, Ph.D,Implicitly-multithreaded processors, Purdue University, 2003
关键词:多线程;Windows线程;OpenMP;IntelTBB
线程(thread),有时也被叫做轻量级进程(Lightweight Process,LWP),是一个程序流运行的基本单位,也是一个进程调度的最小单元。一个最基本的线程,是由线程ID,寄存器组快,堆栈和当前指令指针(PC)构成的。一个线程,能够撤销或创建其他线程,一个进程下的线程之间可以并发地同步执行。线程在程序中是一个独立的顺序执行流程,一个程序中如果同时有多个线程运行完成各自的工作,被称作多线程[1]。
一、 各种多线程方法概述
(一)Windows多线程
1、Windows多线程基本情况
Windows98及以上版本的操作系统属于多任务操作系统,支持两种不同的多任务并行处理方法:基于进程(process)的多任务方法和基于线程(thread)的多任务方法。进程指的是执行中的程序,在执行中,线程相互影响,以至线程在执行中显示出间断的特性。线程的基本状态分为运行,就绪,阻塞三种。
2、Windows多线程同步机制
程序的同步运行经常会引起和时间相关的错误,这就需要引入同步机制。同步机制可以调度线程间资源的并行访问。Windows98为了解决多线程同步问题,设计了四种主要的线程同步对象[2],这些对象对线程而言有两个状态:非信号状态(nonsignalstate)和信号状态(signal state)。当对象为信号状态时,线程执行并可以享用共享资源,否则则需要等待。
(二)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 实验结果列表
线程方法/测试数据 10000 30000 100000 300000 1000000
单线程 29.8ms 95.3ms 385.7ms 1320.4ms 4748.0ms
Windows线程 29.6ms 99.9ms 384.4ms 1291.2ms 4723.6ms
OpenMP
26.6ms 95.3ms 384.6ms 1308.7ms 4732.2ms
Intel TBB 24.7ms
98.6ms 379.7ms 1282.8ms 4651.1ms
4、 结果分析
由实验结果我们可以看出:
1) 单线程方法耗时最多,Intel TBB最有效率,而Windows线程和OpenMP的效率则相对接近,处于中游。
2) 在循环次数较少的时候,Windows线程方法不如OpenMP有效率,但随着循环计算次数的增加,Windows线程方法逐渐超越OpenMP算法。即随着算法复杂度的提升,Windows线程方法比OpenMP算法更能充分发挥其多线程的效率。
(二)合理选择多线程工具
多线程开发究竟应该选用TBB,OpenMP,还是本地Windows线程,取决于很多方面的因素,不仅要考虑开发环境因素,还要根据多线程模式的复杂度来选择。
1、 Intel TBB?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,Intel TBB等)也进行了比较透彻的分析。并通过程序设计的过程,分别完成了利用单线程,Windows多线程,OpenMP和Intel TBB来求2-1,000,000之间的素数的代码实现方法,在实践中更加深入地了解了各种多线程技术工作原理,并设计了一个简单实验的方法,量化地分析了各种线程方法的运算速度,从一个侧面更直观地了解了各种线程技术的性能。
与传统的多线程论文重理论、轻实践不同,本论文没有一味地罗列多线程方法的理论知识,而是从解决一个应用实例“求2-1,000,000之间的所有素数”出发,通过利用各种不同的线程方法解决这一问题,在实践过程中,更加深入地分析和阐述了多线程的工作机理。又通过设计实验的方法,对各种线程方法的性能进行了量化的分析,使得论文更加的生动,更具说服力。
参考文献
[1] William Stallings,操作系统——精髓与设计原理·陈渝译,北京:电子工业出版社,2005
[2] 陈国良,并行计算——结构·算法·编程(修订版),北京:高等教育出版社,2003
[3] Wilkinson,B,Allen,M 并行程序设计·陆鑫达等译,北京:机械工业出版社,2001
[4] Park, Il.;, Ph.D,Implicitly-multithreaded processors, Purdue University, 2003