共 1,393 篇文章
共 6,621 篇文章及评论
- Association for Computing Machinery TechNews (ACM)
- Go Parallel! (Dr. Dobbs)
- HPCwire (Tabor Communications, Inc.)
- insideHPC (John West)
- Joe Duffy's Weblog (Microsoft)
- Microsoft Parallel Programming Development Center (Microsoft Germany)
- MultiCoreInfo.com
- scalability.org (Scalable Informatics)
- Software Dev Blog (Intel Germany)
- Soft Talk Blog (Intel United Kingdom)
- The Moth (Microsoft)
Archives
帖子来自 Waiting4you 
进入多核时代的C++
作者: Waiting4you (1 篇文章) 日期: 五月 4, 2009 在 3:25 下午
评论 (0)
几年之前,CPU的性能还主要取决于CPU的主频,经过超摩尔定律的发展后,没过多长时间CPU的主频速度就已接近“极限”,使得单单靠提高CPU的主频来提升性能变得非常困难。 目前,Intel、AMD等CPU生产商都转而采用了多核技术来提升CPU性能,甚至提出了群核CPU的概念。这意味着,要充分发挥多核CPU的性能,程序就必须采用多线程并发计算的方式,传统的串行程序将会极大地浪费多核CPU的运算能力! C++是上世纪80年代诞生的语言,它的前身是同样风靡全球的C语言。一直以来它都以代码效率卓越著称,进入多核时代后,因为C++标准库没有提供多线程支持,要用C++开发出充分利用多核CPU的程序将面临很大挑战。 于是,在C++社区出现了不少优秀的库以支持并行编程,如各种跨平台的线程库,OpenMP,Clik++等。另一方面,微软也从Win2K开始不断地加入线程池API(如QueueUserWorkItem),C++09标准也明确地表示要加入多线程的支持。 使用线程库编写并行程序的优点是可以精确调度各个线程,并且可以在所有C++编译器里使用。不过要充分发挥多核CPU的性能,还要考虑很多因素,主要难点有: 死锁 编写多线程必然会遇到同步问题,如果同步控制出现问题,就可能出现死锁或脏数据。 线程之间通信 使用何种机制在多个线程之间通信?即要保证通信数据同步又要保证效率。 负载平衡 分配到每个线程的工作量要尽量平衡,避免一个线程忙一个线程闲的情形发生。 资源匹配 程序应该使用多少个线程?过少的线程不能充分利用CPU的多核优势,而过多的线程会造成线程调度过于频繁同样会降低效率。 OpenMP是目前比较流行的C++并行编程方式,它通过在代码中插入专用的pragma编译指令来指示编译器把串行代码编译成并行程序。 它的优点是易于使用,几乎不用修改原代码就可对老程序进行并发支持的改造。问题是它必须要有编译器的支持,尽管目前不少编译器都提供了OpenMP的支持,但它毕竟不是C++的一部分,甚至它都不是真正意义上的C++库。使用OpenMP的C++代码看上去总是有些怪异(个人观点^_^)。 现在,我们又有了一个新选择:Intel Thread Building Blocks(TBB,线程构建模块)。TBB是一个开源的C++模板库,能够运行在 Windows、Linux、Macintosh以及UNIX等系统上,只要是标准的C++编译器都可以使用它。 TBB的功能和优势 功能 优势 基于任务的并行化 在逻辑任务而非物理线程的角度来指定线程功能 让开发者关注更高层的可扩展任务级模式而非底层的线程机制 使用被证实可有效利用多内核的数据分解提取技术 自动负载平衡 高效地支持嵌套并行化,允许从一个并行组件中建立出一个新的并行组件 并行算法 从库中选择高效并行算法模板,即可快速地获得多核处理器带来的优势。 快速应用为并行性能及可量测性而设计的算法。 范型模板让你轻易地把它们定制成你所需要的算法。 支持简单插件部署到应用中提升软件速度,优化内核和本地缓存。 依靠预置的并行结构,在很多情况下都能减少生产多线程软件的工作量。 跨平台支持 编写一次应用就可以部署到多个操作系统中。 为32位和64位的Windows*、Linux* 和 ...
