Intel TBB:Pipeline,软件流水线的威力

2023-12-06 10:38

本文主要是介绍Intel TBB:Pipeline,软件流水线的威力,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参观过工厂装配线的人一定对流水线这个名字不陌生,半成品在皮带机上流过一系列的流水线节点,每个节点以自己的方式进一步装配,然后传给下一节点。现代的高性能CPU均采用了这种流水线设计,将计算任务分为取指,译码,执行,访存,反馈等几个阶段。采用流水线设计的最大优点就是增加了系统吞吐量,例如,当第一条指令处于执行阶段的时候,译码单元可以在翻译第二条指令,而取指单元则可以去加载第三条指令。甚至,在某些节点还可以并行执行,例如,现代的MIMD多指令多数据的计算机,可以在同一时间执行多条指令,或者同时更新多个数据。

 

在Intel认识到频率已成为CPU性能瓶颈之后,多核处理器应运而生。如今高性能程序设计的根本已经转变为如何更充分的利用CPU资源,更快更多地处理数据,而Intel所开发的开源 TBB库巧妙的利用了流水线这种思想,实现了一个自适应的高性能软件流水线TBB::pipeline。本文将会以text_filter为例,简单介绍pipeline的实现原理和一些关键技术点,以求达到抛砖引玉的效果。

 

介绍TBB::pipeline之前不得不先说一下TBB库的引擎-task scheduler,它又被称为TBB库的心脏[Intel TBB nutshell book],是所有算法的基础组件,用于驱动整个TBB库的运作。例如,TBB库所提供的parallel_for算法,里面就有task scheduler的踪影,pipeline也不例外。

 

先看看parallel_for的实现:

 

template<typename Range, typename Body>

 

void parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner=simple_partitioner() ) {

 

    internal::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);

 

}

 

再往下看:

 

    template<typename Range, typename Body, typename Partitioner>

 

    class start_for: public task {

 

        Range my_range;

 

        const Body my_body;

 

        typename Partitioner::partition_type my_partition;

 

        /*override*/ task* execute();

 

 

 

        //! Constructor for root task.

 

        start_for( const Range& range, const Body& body, Partitioner& partitioner ) :

 

...

 

        }

 

可以看到,class start_for是从task继承的,而这个class task,就是task scheduler中进行任务调度的基本元素---task,这也是TBB库的灵魂所在。相对于原生线程库(Raw Thread),例如POSIX thread(pthread),TBB库可以看作是一种对多线程更高层面的封装,它不再使用thread,而是以task作为基本的任务抽象,从而能够更好的整合计算资源并最优化的调度任务。TBB库的种种优点,如自动调整工作负荷,系统扩展性等,全是拜task scheduler所赐。TBB提供的每种算法都有其独特的应用背景,如果算法不能满足用户的需求,那么完全可以以task为基类派生出新类,扩展出新的任务执行和调度算法。这种思想贯穿了TBB的整个设计,而TBB::pipeline,也是这种思想的典型体现。

 

TBB::pipeline的优点:

 

保证数据执行的顺序

线程负载自动调节

更高的Cache命中率

系统扩展性

 

假如目前有这样一项任务,对一个文件的内容进行分析,将每一个字符串的首字符改为大写,然后写入一个新文件里。

 

一个传统的串行执行的解决方案是:

 

分别创建读入和写出文件

 

while (!EOF)

{

从文件读入一个字符串

首字符转化为大写字符

写入一个字符串到文件

}

关闭读入和写出文件的描述符

 

这么简单的过程,还有可能通过TBB::Pipeline来提供性能吗?我们来看看Pipeline的解决方案:

 

1.分别创建读入和写出文件描述符

 

2.建立三个task,分别是“从文件读入一个字符串”,“首字符转化为大写字符”,“ 写入一个字符串到文件”,其中需要指定“从文件读入一个字符串”和“写入一个字符串到文件”这两个task为串行执行。(为什么要串行执行,请自行思考或者去看Intel TBB的nutshell book)

 

3.启动Pipeline,让Pipeline通过内建的task scheduler来调度这些task的运行。

 

 

用一个29MB的文件作为测试用例,在我的双核机器上串行执行的速度是 0.527582秒,而Pipeline的速度是0.446161,对于更复杂的逻辑,Pipeline的性能还会显著提升。性能提升的奥秘,就在于Pipeline能够自动根据系统情况,以并行方式执行“首字符转化为大写字符”这个task。

 

具体的Pipeline的示例代码和使用,可以去参考Intel TBB的nutshell book,这里想继续深究一下:

 

1.  为什么Pipeline可以保证数据执行的顺序?既然TBB归根到底是通过多线程执行任务,为什么不会在读入先后两个字符串后,后读入的字符串先被下一个task处理?Pipeline里是不是有一个类似于FIFO 先进先出队列之类的东西?

 

2.  为什么Pipeline能够自动地并行执行“首字符转化为大写字符”这个task?如果这个task被并行执行了,那么又怎么保证第一点?

 

3.  Pipeline是怎么保证那些task被串行执行的。

 

4.  所谓“自动根据系统情况,进行任务调度”是怎么一回事?

 

这些既是问题,也是Pipeline中的关键技术点,有心的可以去研读一下Pipeline的代码先睹为快。

 

Intel TBB的nutshell book -- <Intel Threading Building Blocks –Outfitting C++ for Multi-Core Processor Parallelism>

 

 

<待续>

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/softarts/archive/2009/04/25/4123957.aspx

这篇关于Intel TBB:Pipeline,软件流水线的威力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461521

相关文章

Ubuntu 怎么启用 Universe 和 Multiverse 软件源?

《Ubuntu怎么启用Universe和Multiverse软件源?》在Ubuntu中,软件源是用于获取和安装软件的服务器,通过设置和管理软件源,您可以确保系统能够从可靠的来源获取最新的软件... Ubuntu 是一款广受认可且声誉良好的开源操作系统,允许用户通过其庞大的软件包来定制和增强计算体验。这些软件

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

梳理2024年,螺丝钉们爱用的3款剪辑软件

这年头,视频到处都是,就跟天上的星星一样数不清。不管你是公司里的新面孔,还是职场上的老狐狸,学会怎么剪视频,就好比找到了赢的秘诀。不管是给上司汇报工作,展示你的产品,还是自己搞点小视频记录生活,只要是剪辑得漂亮,肯定能一下子吸引大家的目光,让人记得你。咱们今天就来侃侃现在超火的三款视频剪辑工具,尤其是PR剪辑,你肯定听说过,这货在剪辑界可是大名鼎鼎,用它剪视频,既专业又麻利。 NO1. 福昕轻松

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

Go并发模型:流水线模型

Go作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,Go并发模型有多种模式,通过流水线模型系列文章,你会更好的使用Go的并发特性,提高的程序性能。 这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。 Golang的并发核心思路 Golang并发核心思路是关注数据流动。数据流动的过程交给cha