2024年5月2日发(作者:尼康d700和d7000)
几年之前,CPU的性能还主要取决于CPU的主频,经
过超摩尔定律的发展后,没过多长时间CPU的主频速度
就已接近“极限”,使得单单靠提高CPU的主频来提升
性能变得非常困难。
目前,Intel、AMD等CPU生产商都转而采用了多核技术来提升CPU性能,甚至
提出了群核CPU的概念。这意味着,要充分发挥多核CPU的性能,程序就必须采用多
线程并发计算的方式,传统的串行程序将会极大地浪费多核CPU的运算能力!
C++是上世纪80年代诞生的语言,它的前身是同样风靡全球的C语言。一直以
来它都以代码效率卓越著称,进入多核时代后,因为C++标准库没有提供多线程支持,
要用C++开发出充分利用多核CPU的程序将面临很大挑战。
于是,在C++社区出现了不少优秀的库以支持并行编程,如各种跨平台的线程
库,Open MP,Clik++等。另一方面,微软也从Win2K开始不断地加入线程池API(如
QueueUserWork Item),C++09标准也明确地表示要加入多线程的支持。
使用线程库编写并行程序的优点是可以精确调度各个线程,并且可以在所有
C++编译器里使用。不过要充分发挥多核CPU的性能,还要考虑很多因素,主要难点
有:
死锁编写多线程必然会遇到同步问题,如果同步控制出现问题,就可能出现死
锁或脏数据。
线程之间通信使用何种机制在多个线程之间通信?即要保证通信数据同步又
要保证效率。
负载平衡分配到每个线程的工作量要尽量平衡,避免一个线程忙一个线程闲
的情形发生。
资源匹配程序应该使用多少个线程?过少的线程不能充分利用CPU的多核优
势,而过多的线程会造成线程调度过于频繁同样会降低效率。
OpenMP是目前比较流行的C++并行编程方式,它通过在代码中插入专用的
pragma编译指令来指示编译器把串行代码编译成并行程序。
它的优点是易于使用,几乎不用修改原代码就可对老程序进行并发支持的改
造。问题是它必须要有编译器的支持,尽管目前不少编译器都提供了OpenMP的支持,
但它毕竟不是C++的一部分,甚至它都不是真正意义上的C++库。。
现在,我们又有了一个新选择:Intel Thread Building Blocks(TBB,线程构建
模块)。TBB是一个开源的C++模板库,能够运行在 Windows、Linux、Macintosh以
及UNIX等系统上,只要是标准的C++编译器都可以使用它。
以下是程序测试的实验案例和测试结果:
for ( int j = 0; j < num; j++ )
{
k[j]=j;
for(int p=0;p<10000;p++)cout(p); //进行很大的for循环,又调用函数,主
要目的就是让它耗时间;
}
for(int i=0;i printf("%d ",k[i]);
发布者:admin,转转请注明出处:http://www.yc00.com/num/1714620869a2482179.html
评论列表(0条)