本文介绍了多核时代下C++遇到的问题以及应对手段,最后简单介绍了怎样使用Intel Thread Building Blocks来让C++充分利用多核CPU的处理能力。
几年之前,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* 和 Mac OS* X 平台提供一种解决方案。
- 支持Intel、Microsoft及GNU的业界领先的编译器。
- 加快在多种多核平台中部署应用软件的速度。
|
程序库级解决方案 |
只需花费很小的精力就可得到高优化的并行功能。
- 你的 C++ 应用程序只需调用Intel Threading Building Blocks 库。
- 标准 C++ - 不需要使用新语言重写代码。
- 兼容其它线程包。
- 可无限制地和你的软件一起分发运行时库。
- 无缝整合到已有的开发环境中。
|
高并发容器 |
优化处理器的能力实现任务并发
- 使用线程安全并且高并发的接口简化多线程应用的开发。
- 使用预测试的数据结构提升应用软件质量。
- 更高效率的内核或处理器多路执行来提升应用软件性能。
|
分享到:
相关推荐
理解这些基本概念是进入多核编程的第一步。 接着,书中的内容将深入到C++的线程库,即C++11及后续标准中引入的`<thread>`库,讲解如何创建和管理线程,以及如何在不同的线程间进行数据交换。此外,还会讨论线程安全...
在这个时代背景下,网络讲坛的"多核时代下的并行编程(下)j.zip"视频教程成为了一个极具价值的学习资源。本课程深入探讨了如何有效地利用多核处理器的优势,进行高效的并行编程,以提升程序的运行速度和处理能力。 ...
C++11是2011年发布的第一个重大更新,标志着C++进入了现代时代。这个版本引入了大量的新特性,包括: 1. **自动类型推断(Auto)**:C++11引入了`auto`关键字,它允许编译器自动推断变量的类型,减少了显式类型声明...
并发编程涉及到线程、进程、同步与通信,是多核时代必备的知识。模板元编程则是利用编译时计算来提升程序性能的一种技术。 总之,《C~C++程序员实用大全——C~C++最佳编程指南》全面覆盖了C和C++的各个方面,无论是...
《2011年C++标准》是C++编程语言发展历程中的一个重要里程碑,它标志着C++进入了一个新的时代。这份标准,正式名为ISO/IEC 14882:2011,是对1998年C++标准的重大更新,引入了一系列新特性,提升了语言的效率、灵活性...
这标志着C++正式进入现代多核处理器编程的时代,为开发者提供了更为高效、便捷的并行编程手段。下面将对C++11多线程的支持进行详细介绍。 ### 一、C++11多线程库介绍 C++11标准库新增了`<thread>`头文件,它提供了...
随着多核时代的到来,多核编程也成为了进入这一层的必备技能。 这种分层模型提供了一个评估和比较程序员技术能力的框架。值得注意的是,不同公司和行业可能有不同的评价标准,但这个模型提供了一个通用的参考。对于...
微处理器的发明是计算机系统结构的一个革命性进展,因为它将之前分散在多个芯片上的处理能力集成到一个芯片上,这不仅极大地减小了计算机的体积,还使得计算机开始进入个人计算时代。 进入1970年代后期,随着VLSI...
异常处理确保了程序的健壮性,线程和并发控制则在多核处理器时代显得尤为重要。 随着.NET Core的推出,微软类库运行时进入了跨平台的新时代。.NET Core是轻量级、高性能的框架,兼容Windows、Linux和macOS。.NET ...
- **多线程支持**:Java支持多线程编程,能够有效地利用多核处理器资源。 #### 三、Java的应用实例 Java在多个领域都有广泛的应用,例如: - **Web开发**:使用Java开发Web应用程序,利用Spring框架、Hibernate等...
在当今科技日新月异的时代,智能车库系统的应用已经逐渐普及,而Cortex A53作为一款高效能、低功耗的处理器核心,常被用于嵌入式系统中,为智能车库系统提供强大的运算支持。本文将深入探讨基于Cortex A53的智能车库...
在多核处理器时代,充分利用多线程可以显著提升程序的性能。C#提供了丰富的API支持多线程编程,主要包括`System.Threading`命名空间下的类和方法。 #### 创建线程 在给定的代码片段中,可以看到通过`Thread`类创建...
- **硬件技术的进步**:从早期的单核处理器到多核处理器,从低容量硬盘到SSD固态硬盘,硬件技术的不断进步推动着个人电脑性能的不断提升。 #### 5. 移动设备的进步 - **智能手机的崛起**:从最初的通话功能到现在...
- **历史背景**:作为Intel公司的一款经典处理器,Pentium标志着个人计算机进入了一个全新的时代。 - **技术特点**:采用了超标量技术,即在一个时钟周期内可以执行多条指令,显著提高了处理速度。 #### 2.1.2 ...
,以及高性能网络服务器和多核并行开发等也有一定的研究。 目录 封面 -17 封底 489 扉页 -16 版权 -15 推荐序 -14 前言 -12 致谢 -9 目录 -7 第1章 阅读前的准备工作 1 1.1 系统架构 2 1.1.1 Android系统架构 2 ...