并行编程实战——TBB中的图

news2024/11/23 21:50:23

一、graph

在TBB框架中,基础的运行框架就是图graph。简单的回顾一下什么是图?图是由顶点和边组成的数学结构,表示对象及其之间的关系。图分为有向图和无向图。在TBB中,其实它的图叫做流图(Flow Graph),其实就可以理解成为一种有向图。流,一定不是静止的;一定是有方向的,也不可能乱流。
在流图中,分成节点(Node)和边(Edge)两种基本元素,可以把流图理解成节点和边的集合。整个TBB的运行其实就是通过对图特别是其内部的节点和边的操作来实现整体的计算任务的。
在图中有一个比较重要的问题需要说明,节点内的操作是异步的,任务是可并行的,但可并行并不意味着任务的立刻并行开始,它仍然需要底层线程的支持。并行的任务,只有在遇到可容纳的足量的线程时,才可能是真正并行的。

二、节点和边

在图中的节点有很多种类型,它通过会继承oneapi::tbb::flow::graph_node类,或者继承 oneapi::tbb::flow::sender 和 oneapi::tbb::flow::receiver。 但基本目的就是控制输入输出的端点数量或数据输入或输出的并行数量(这一点可以和Socket的端点进行类比)。
而边的功能很容易理解,就是把各个功能节点连接起来,实现数据的流动。这些边可以动态的修改如增、删。有了节点和边,就可以把数据与任务的流动整合起来,实现设计的目的。

三、图的应用

下面看一个官网上的图的应用的例子:

在这里插入图片描述

其相应的例程如下:

int sum = 0;
graph g;
function_node< int, int > squarer( g, unlimited, [](const int &v) {
    return v*v;
} );
function_node< int, int > cuber( g, unlimited, [](const int &v) {
    return v*v*v;
} );
function_node< int, int > summer( g, 1, [&](const int &v ) -> int {
    return sum += v;
} );
make_edge( squarer, summer );
make_edge( cuber, summer );

/×
for ( int i = 1; i <= 10; ++i ) {
  squarer.try_put(i);
  cuber.try_put(i);
}×/
//增加一个广播节点可以更好的体现TBB节点的流图
broadcast_node<int> b(g);
make_edge( b, squarer );
make_edge( b, cuber );
for ( int i = 1; i <= 10; ++i ) {
  b.try_put(i);
}
g.wait_for_all();


cout << "Sum is " << sum << "\n";

这是一个非常简单的图的应用,最左端的节点用来产生数据并传送给两个连接的计算功能节点,其中squarer用来计算平方值,并将结果继续传递给其后继的连接节点summer;同样,另外一个功能节点cuber接收到产生的数据后,将数据计算立方值并传递给summer。最后,由summer节点进行和计算并最终输出计算结果。
正如上面例程,可以直接向计算节点try_put数据,也可以增加广播节点;同样也可以使用input_node方式,而且这两种方式会更容易理解。但未必会节省代码,特别是使用输入节点后,反而会使程序变得更复杂。所以,一定要分清楚应用场景,而不能想怎么用就怎么用。

四、总结

TBB中图的使用是一个非常巧妙的设计,但是一定要明白图设计中的一些细节,特别是图连接状态与节点激活间先后以及是否保证数据的安全流动(如不丢失数据)。在前面分析的文章中就遇到了这类问题,所以一定要把TBB整体的流程和协调方式以及各种相关关系理清,才可能更大限度的发挥TBB的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode详解】直角三角形:用空间换时间(O(m*n*(m+n))>O(m*n))(思路详解)

思路详解&#xff1a; 0. 遍历矩阵grid中每个点&#xff0c;若为“1”&#xff0c;则尝试将其视为直角三角形的直角顶点&#xff0c;关注该点所在横、纵轴&#xff0c;是否有其他点为“1”&#xff08;来与之构成直角边&#xff09; 1. 关于如何计算以该点为直角顶点的直角三…

【Python实战】一键生成 PDF 报告,图文并茂,代码全公开

话接上篇&#xff1a; 自动化处理 PDF 文档&#xff0c;完美实现 WPS 会员功能如何优雅地实现 PDF 去水印&#xff1f; 后台有小伙伴们问&#xff1a;能否基于已有的内容&#xff08;文本、图像等&#xff09;&#xff0c;一键生成 PDF 文档&#xff1f; 或者说&#xff0c;…

性能测试强化训练营*-可看(随意)

一.性能测试:目的/意义&#xff0c;误区 功能测试 VS 性能测试:测试一辆汽车: 功能: 轮子转不转&#xff0c;方向盘转向动不动&#xff0c;点火能不能打开发动机… --使用者&#xff0c;功能能否按照我的想法去正常使用(应用) 性能: 噪音大不大&#xff0c;百公里加速多少秒&a…

会员制重启却陷“过期门”,盒马鲜生扩张背后隐忧重重

在新零售浪潮中&#xff0c;盒马鲜生曾以“新鲜每一刻”为口号&#xff0c;迅速崛起并赢得了众多消费者的青睐。然而&#xff0c;随着其会员制的重启&#xff0c;一系列食品安全问题却如同阴霾般笼罩在这家新零售巨头的上空&#xff0c;让新老会员倍感失望与不安。 近日&#x…

跳表Java

跳表&#xff08;Skip List&#xff09;是一种用于有序数据存储的数据结构&#xff0c;它在链表的基础上增加了多级索引&#xff0c;从而提高了查找、插入和删除操作的效率。跳表的平均时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)&#xff0c;与平衡二叉搜索树&#xff08…

编程小白如何成为大神?——新生入门指南

编程小白如何成为大神&#xff1f;——新生入门指南 作为一名已经从985高校毕业的研究生&#xff0c;我深刻体会到编程已成为当代大学生的必备技能。无论是为了学术研究&#xff0c;还是未来的职业发展&#xff0c;掌握编程都能为我们提供更多的机会和竞争优势。然而&#xff…

vscode启动不了的问题解决

1、安全模式下启动vscode从中查看日志&#xff1a; code --verbose at Ce.d (C:\Users\yonghu\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\code\electron-main\main.js:116:3783)at Ce.a (C:\Users\yonghu\AppData\Local\Programs\Microsoft VS Code\res…

ts保姆级学习指南

什么是 TypeScript&#xff1f; TypeScript&#xff0c;简称 ts&#xff0c;是 JavaScript 的超集&#xff0c;而且它最大的特点之一就是引入了静态类型支持。这意味着开发者可以在 TypeScript 中定义变量、函数参数等的类型&#xff0c;编译器会在编译时进行类型检查&#xf…

Ubuntu配置Ngbatis学习环境

引言 经过考虑&#xff0c;我感觉与NebulaGraph交互的ORM框架还是Ngbatis好。因为现在这个框架开发的比较完善&#xff0c;而且还在不断更新&#xff0c;社区活跃的用户多。从今日开始学习&#xff0c;首先要配置一下环境。 1.安装maven和jdk 选择的版本是maven3.8和jdk17.以…

iPhone可运行的谷歌Gemma 2 2B模型,性能超GPT-3.5

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

关于inet_addr()中的参数不能是 sring类型的 只能是 string类型变量.c_str()

源码展示&#xff1a; extern in_addr_t inet_addr (const char *__cp) __THROW inet_addr中的参数是const char *类型的 定义一个string 类型的ip 使用这个inet_addr()接口 local.sin_addr.s_addr inet_addr(ip_.c_str()); local.sin_addr.s_addr inet_addr(&ip_);…

ELK对业务日志进行收集

ELK对业务日志进行收集 下载httpd 进到文件设置收集httpd的文件进行 设置 编辑内容 用于收集日志的内容 将日志的内容发送到实例当中 input {file{path > /etc/httpd/logs/access_logtype > "access"start_position > "beginning"}file{path &g…

基于SpringBoot+Vue的健身俱乐部网站(带1w+文档)

基于SpringBootVue的健身俱乐部网站(带1w文档) 基于SpringBootVue的健身俱乐部网站(带1w文档) 该系统采用java技术&#xff0c;结合ssm框架使页面更加完善&#xff0c;后台使用MySQL数据库进行数据存储。系统主要分为三大模块&#xff1a;即管理员模块和用户模块、教练模块。本…

openstack之nova-conductor工作原理及常见问题处理

openstack之nova-conductor工作原理及常见问题处理 这里写目录标题 openstack之nova-conductor工作原理及常见问题处理一、简介1. 概念2. 作用3. 体系结构 二、组件1. nova-api2. nova-scheduler3. nova-compute4. nova-conductor5. nova-api-metadata6. nova-placement-api7. …

Java AI伪原创视频创作视频提取文案改写去水印系统小程序源码

&#x1f525;AI赋能创作新纪元&#xff01;伪原创视频文案提取改写去水印全能系统大揭秘 &#x1f680; 开篇&#xff1a;创意无界&#xff0c;AI来助力 在这个视觉盛行的时代&#xff0c;视频创作成为了表达自我、传递信息的重要方式。但你是否曾为寻找灵感、撰写文案、处理…

SD-WAN的两种方案及其价值

SD-WAN&#xff08;软件定义广域网&#xff09;作为一种新兴的网络架构解决方案&#xff0c;给企业网络带来了极大的灵活性和可扩展性。它允许企业以更低的成本将广泛分布的分支机构连接到数据中心或其他分支机构&#xff0c;同时还能优化网络性能和用户体验。 SD-WAN的工作原理…

C语言之“文件操作”

文章目录 1. 什么是文件&#xff1f;&#xff08;1. 为什么使用文件&#xff1f;&#xff08;2.什么是文件2.1 程序文件2.2 数据文件2.3 文件名 2. 二进制文件和文本文件&#xff1f;3. 文件的打开和关闭3.1 流和标准流3.2 文件指针(用来管理流的)3.3 文件的打开与关闭 4. 文件…

vitis (eclipse) 的Indexer不能搜索、不能跳转到函数和变量定义和声明不能打开调用层次的解决方法

在使用vitis(2021.1) 过程中&#xff0c;有一个非常方便实用的功能&#xff0c;就是在函数或变量等源代码上通过右键菜单或快捷键F3、F4、CtrlAltH&#xff0c;也可以按住Ctrl键然后鼠标停留在函数名或变量名上&#xff0c;点击出现的链接&#xff0c;可以跳转到函数或变量的定…

linux磁盘可视化分析工具

在 Linux 系统中&#xff0c;了解磁盘使用情况对于系统维护和优化至关重要。文件和目录随着时间的推移会占据大量磁盘空间&#xff0c;了解哪些部分占用的空间最多可以帮助我们更好地管理和清理磁盘。Baobab&#xff0c;也称为 GNOME Disk Usage Analyzer&#xff0c;是一款非常…

数据化信息时代中开源 AI 智能名片拓客微信小程序的角色与价值

摘要&#xff1a;本文深入探讨了数据化信息的特性&#xff0c;包括其数字化基础、多媒体表现、可转化性及增值利用特点。同时&#xff0c;着重阐述了开源 AI 智能名片拓客微信小程序在这一背景下的重要作用和独特价值&#xff0c;为信息传播与利用提供了新的视角和思路。 关键…