欢迎来到天天文库
浏览记录
ID:21390632
大小:60.00 KB
页数:5页
时间:2018-10-21
《多核多线程技术编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、儿年之侃,CPU的性能还主要取决于CPU的主频,经过超摩尔定律的发展后,没过多长吋间CPU的主频速度就已接近“极限”,使得单单靠提高CPU的主频来提升性能变得非常困难。H前,Intel,AMD等CPU生产商都转而采川了多核技术來提升CPU性能,其至提出了群核CPU的概念。这意味着,要充分发挥多核CPU的性能,程序就必须采用多线程并发计算的方式,传统的串行程序将会极大地浪费多核CPU的运算能力!C++是上世纪80年代诞生的语言,它的前身是同样风靡全球的C语言。一直以来它都以代码效率卓越著称,进入多核时代fi,因为C++标准库没有提供多线程支持,要用C++开发出充分利用多核C
2、PU的程序将則临很大挑战。干是,在C++社区岀现了不少优秀的库以支持并行编程,如各种跨平台的线程库,OpenMP,Clik++等。另一方面,微软也从Win2K开始不断地加入线程池API(如QueueUserWorkItem),C++09标准也明确地表示要加入多线程的支持。使川线程库编写并行程序的优点是可以精确调度各个线程,并.R.可以在所冇C++编译器垠使用。不过耍充分发挥多核CPU的性能,还耍考虑很多W素,主耍难点有:•死锁编写多线程必然会遇到M步问题,如染M步控制出现问题,就讨能出现死锁或脏数据。•线程之间通信使川何种机制在多个线程之间通信?即要保证通信数据同步乂要保
3、证效率。•负载平衡分配到每个线程的工作量要尽量平衡,避免一个线程忙一个线程闲的怙形发生。•资源匹配程序应该使用多少个线程?过少的线程不能充分利用CPU的多核优势,而过多的线程会造成线程凋度过于频繁同样会降低效率。OpenMP是目前比较流行的C++并行编程方式,它通过在代码巾插入专用的pragma编译指令來指示编译器把串行代码编译成丼行程序。它的优点是易于使用,几乎不用修改原代码就可对老程序进行并发文待的改造。问题是它必须要有编泽器的支持,尽管目前不少编译器都提供了OpenMP的支持,侃它毕竟不是C++的-部分,甚至它都不是真正意义上的C++库。。现在,我们又有了一个新选择
4、:IntelThreadBuildingBlocks(TBB,线程构建模块)。TBB是一个开源的C++模板库,能够运行在Windows、Linux、Macintosh以及UNIX等系统上,只要是标准的C++编译器都可以使用它。以不足程序测试的实验案例和测试结果:for(intj=0;j5、序,其中的for(intp=0;p〈10000;p++)cout(p);是一个内嵌了提高程序复杂性的函数的人循环,主要是为了提尚程序的额外幵销,以便于我们能够明显的观察到多线程程序与单线程程序之间的性能差异。整个for程序执行的流程如卜所示:j=0->k[j]=j-〉进行复杂运算_〉j!=j++并继续下一个循环mam-1?:退出循环并顺序显示k[nuni]中的内容有一点需耍注意的是,由于单线程的程序是顺序执行的,所以上而这个程序笫二个for语句其实是可以不必使用的,可以将它内嵌入第一个for语句中:for(intj=0;j6、000;p++)cout(p);//进行很大的for循环,又调用函数,主要目的就是让它耗时间;printf(〃%d",k[i]);}这样nJ■以减少程序额外开销,但是对于多线程程序来说,这点开销是必须的,如果输出必须是顺序的话,那我们有必耍控制它的输出顺序,否则将会Hi现乱序输Hi-尽管结果是:lh:确的,假是输出的顺序却足我们不想看到的。当然,第二个for语句所增加的开销,远远比不上外行税序运行吋所节约的开销。我们使川Intel的openmp技术來创建多线程的程序,因为openmp技术够良观,也很界易去分析与理解,所以我们无需去调用底层APT就能够轻易的实现多线程编程。7、要使用openmp技术就要安装Intel编译器及下的openmp组件,Intel编译器可以很好的与VisualStdio整合在一起,起码要求是你的计算机上必须安装了Visual0+6.0。当然,安装完之后我们必须进行一些设置,以VisualStdio2008为例,如果我们想要使用openi叩技术的话,我们须在VC项目下右边的“资源管理器”屮点“属性”一“C/C++”一“语言”-有个“opernnp支持”选项,选“是(/openmp)”即可。另外我们必须在程序中插入〈omp.h〉的头文件。做完了最基木的设置之V;,我们就可以丌始
5、序,其中的for(intp=0;p〈10000;p++)cout(p);是一个内嵌了提高程序复杂性的函数的人循环,主要是为了提尚程序的额外幵销,以便于我们能够明显的观察到多线程程序与单线程程序之间的性能差异。整个for程序执行的流程如卜所示:j=0->k[j]=j-〉进行复杂运算_〉j!=j++并继续下一个循环mam-1?:退出循环并顺序显示k[nuni]中的内容有一点需耍注意的是,由于单线程的程序是顺序执行的,所以上而这个程序笫二个for语句其实是可以不必使用的,可以将它内嵌入第一个for语句中:for(intj=0;j6、000;p++)cout(p);//进行很大的for循环,又调用函数,主要目的就是让它耗时间;printf(〃%d",k[i]);}这样nJ■以减少程序额外开销,但是对于多线程程序来说,这点开销是必须的,如果输出必须是顺序的话,那我们有必耍控制它的输出顺序,否则将会Hi现乱序输Hi-尽管结果是:lh:确的,假是输出的顺序却足我们不想看到的。当然,第二个for语句所增加的开销,远远比不上外行税序运行吋所节约的开销。我们使川Intel的openmp技术來创建多线程的程序,因为openmp技术够良观,也很界易去分析与理解,所以我们无需去调用底层APT就能够轻易的实现多线程编程。7、要使用openmp技术就要安装Intel编译器及下的openmp组件,Intel编译器可以很好的与VisualStdio整合在一起,起码要求是你的计算机上必须安装了Visual0+6.0。当然,安装完之后我们必须进行一些设置,以VisualStdio2008为例,如果我们想要使用openi叩技术的话,我们须在VC项目下右边的“资源管理器”屮点“属性”一“C/C++”一“语言”-有个“opernnp支持”选项,选“是(/openmp)”即可。另外我们必须在程序中插入〈omp.h〉的头文件。做完了最基木的设置之V;,我们就可以丌始
6、000;p++)cout(p);//进行很大的for循环,又调用函数,主要目的就是让它耗时间;printf(〃%d",k[i]);}这样nJ■以减少程序额外开销,但是对于多线程程序来说,这点开销是必须的,如果输出必须是顺序的话,那我们有必耍控制它的输出顺序,否则将会Hi现乱序输Hi-尽管结果是:lh:确的,假是输出的顺序却足我们不想看到的。当然,第二个for语句所增加的开销,远远比不上外行税序运行吋所节约的开销。我们使川Intel的openmp技术來创建多线程的程序,因为openmp技术够良观,也很界易去分析与理解,所以我们无需去调用底层APT就能够轻易的实现多线程编程。
7、要使用openmp技术就要安装Intel编译器及下的openmp组件,Intel编译器可以很好的与VisualStdio整合在一起,起码要求是你的计算机上必须安装了Visual0+6.0。当然,安装完之后我们必须进行一些设置,以VisualStdio2008为例,如果我们想要使用openi叩技术的话,我们须在VC项目下右边的“资源管理器”屮点“属性”一“C/C++”一“语言”-有个“opernnp支持”选项,选“是(/openmp)”即可。另外我们必须在程序中插入〈omp.h〉的头文件。做完了最基木的设置之V;,我们就可以丌始
此文档下载收益归作者所有