并行编程实战——TBB中Task Scheduler的执行

一、Task Scheduler默认执行

在TBB中,一般情况下,默认会允许任务调度器使用所有的可用计算资源 。这种情况当然是为了更大化的利用计算机的资源,但这也有可能在一些场合下,导致与其它任务的资源竞争。所以,TBB也允许对任务调度器进行控制,从而只使用其中的一部分资源。
但需要提醒的是,在对任务调度器进行配置控制时,可能导致一些问题。需要加以认真对待。

二、TBB配置任务调度器

TBB中,提供了task_arena接口作为控制任务管理器的引导。task_arena其实就是一个并行资源的管理器或者说并行的环境管理器,它允许创建一个隔离的线程池,同时它还支持嵌套的使用。
task_arena 应用的主要目的是:
1、控制并行度:指定 task_arena 中的线程数,控制并行任务的执行。
2、资源隔离:不同的 task_arena 可以运行在不同的 CPU 核心上,实现资源的隔离和优化。
3、优先级调度:不同的任务集分配可分配不同的 task_arena,实现优先级调度。
它可以通过下面两种方式来控制任务调度:
1、设置首选计算单元
2、限制部分计算单元

三、任务调度配置的内容

在知道任务管理器提供的接口task_arena后,就可以看看其如何应用 。这些任务的控制一般封装在task_arena::constraints中,它包括对下面几部分的控制:
1、首选NUMA节点
其实是就NUMA架构上,任务被随机调度到不同的节点上时,可能产生性能的损失,所以可以将任务分配到指定的NUMA节点,即可以在task_arena::constraints::numa_id域上进行标记节ID,见下面的代码:

std::vector<tbb::numa_node_id> numa_indexes = tbb::info::numa_nodes();
std::vector<tbb::task_arena> arenas(numa_indexes.size());
std::vector<tbb::task_group> task_groups(numa_indexes.size());for(unsigned j = 0; j < numa_indexes.size(); j++) {arenas[j].initialize(tbb::task_arena::constraints(numa_indexes[j]));arenas[j].execute([&task_groups, &j](){task_groups[j].run([](){/*some parallel stuff*/});});
}for(unsigned j = 0; j < numa_indexes.size(); j++) {arenas[j].execute([&task_groups, &j](){ task_groups[j].wait(); });
}

2、首选核心类型
这个可能是与CPU的核心类型有关,如果是同构的简单的处理器,可能就没有意义了。但如果在异构的有多种核心类型的CPU,可能就可以充分利用某个类型的核心,如下面的代码:

std::vector<tbb::core_type_id> core_types = tbb::info::core_types();
tbb::task_arena arena(tbb::task_arena::constraints{}.set_core_type(core_types.back())
);arena.execute( [] {/*the most performant core type is defined as preferred.*/
});

3、每个核心同时调度的最大逻辑线程数
这个就比较简单了,主要是针对Intel CPU的超线程技术,可以通过 task_arena::constraints::max_threads_per_core来限制每个核心同时运行的最大线程数,其实就是变相提高指定的目标的运行效率,有点线程绑定的味道,但又有很大不同。下面的代码表示一个核心只能运行一个线程:

tbb::task_arena no_ht_arena( tbb::task_arena::constraints{}.set_max_threads_per_core(1) );
no_ht_arena.execute( [] {/*parallel work*/
});

4、task_arena并发级别
这个其实和上面的目的相同,只是处理起来更简单,见下面的代码:

int no_ht_concurrency = tbb::info::default_concurrency(tbb::task_arena::constraints{}.set_max_threads_per_core(1)
);
tbb::task_arena arena( no_ht_concurrency );
arena.execute( [] {/*parallel work*/
});

同样的线程资源可以通过一种简单的约束控制起来,而不是去直接的控制,更方便控制。

四、总结

任务调度在哪儿都是一种非常让人纠结的事情。就像一个大厨,有一两个人时,饭菜就容易为所有人所表扬,可当面对上百人时,可能就有不少人给差评了。所以一个好的框架,不但要提供默认的管理调度手段,也要提供针对个性化的定制场景的接口。既要面对主流,也要取悦小众。难点,在于一个平衡!
做为开发者,要从学习代码的最初的功能到学习其架构,在到其整体的设计思想,这才是最终极的目标。

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

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

相关文章

高密原型验证系统解决方案(上篇)

0 引言 随着当今 SoC 设计规模的快速膨胀&#xff0c;仅仅靠几 颗当代最先进的 FPGA 已经无法满足原型验证的需求。简单的增加系统的容量&#xff0c;会遇到系统时钟复位同 步&#xff0c;设计分割以及高速接口和先进 Memory控制器 IP 验证等多重困难。此时&#xff0c;一个商用…

Contact Form 7最新5.9.8版错误修复方案

最近有多位用户反应Contact Form 7最新5.9.8版的管理页面有错误如下图所示 具体错误文件的路径为wp-content\plugins\contact-form-7\admin\includes\welcome-panel.php on line 153 找到welcome-panel.php这个文件编辑它&#xff0c;将如下图选中的部分删除 删除以后&#xf…

AUTOSAR入门篇

AUTOSAR简介 AUTomotive Open System ARchitecture 汽车开放系统结构 AUTOSAR背景 随着车载控制系统日益先进和复杂化,每辆汽车投入的软件开发工数(时间及人力)2010年将达到2002年的5-10倍。汽车电子系统设计复杂化造成的可靠性隐患导致汽车因安全隐患被“招回”的现象频繁…

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo 洪涝洪水滑坡灾害数据集 数据集描述 该数据集是一个专门用于检测和识别洪涝、洪水和滑坡等自然灾害的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度学习的目标检测模型。数据集涵盖了两种常见的自然灾害…

Java—SPI 机制详解

参考文章 Java常用机制 - SPI机制详解 | Java 全栈知识体系包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 数据库原理, MySQL, ElasticSearch, MongoDB, Docker, k8s, CI&CD, Linux, DevOps, 分布式, 中间件, 开发工具, Git, IDE, 源码阅读&a…

力扣之183.从不订购的客户

1. 183.从不订购的客户 1.1 题干 Customers 表&#xff1a; -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Ord…

有关shell指令练习2

写一个shell脚本&#xff0c;将以下内容放到脚本中 在家目录下创建目录文件&#xff0c;dir dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz移动到dir1中 …

MATLAB基于传统方法的车道线检测实现

MATLAB基于传统方法的车道线检测实现 本文实现的是基于传统方法的车道线检测&#xff0c;所谓传统方法就是没有涉及到深度学习算法&#xff0c;基于直观的手段和数学知识来实现&#xff0c;后期会实现基于深度学习的车道线检测方法。 实现步骤&#xff1a; Canny边缘检测手动…

html 几行的空间分成3个区域

1.代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>三个区域示例</title> …

SpringBoot+Vue考试系统免费分享

源码说明&#xff1a; 这是一个开源的SpringBoot与Vue开发的在线考试系统。经过站长测试&#xff0c;系统稳定可用&#xff0c;允许重复考试。 环境&#xff1a; 需要安装的环境包括Node.js v14.21.3、JDK8、Maven以及MySQL 5.7。 前端部署教程&#xff1a; 执行 npm inst…

掌控历史:如何通过Git版本管理工具提升你的开发效率

先一览全局: git目录 一.打开git二.git bash的基础命令三.配置git四.仓库搭建五.文件操作和状态六.忽略文件七.gitee的使用1.添加公钥2.创建仓库 八.vs中使用git九.git分支常用命令十.文件差异比较十一.文件回溯和推进十二.合并冲突和消除十三.合并/压缩提交十四.远程仓库推拉十…

新160个crackme - 062-syllogism-crackme1

运行分析 需要破解Name和Serial PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到成功弹窗字符串&#xff0c;双击进入函数 分析关键函数&#xff0c;还需要分析sub_401368函数 分析sub_401368函数&#xff0c;发现是将Name第一位替换为空格&#…

带你0到1之QT编程:十六、三种框架自带Dialog,助你在开发一臂之力

此为QT编程的第十六谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

信息安全工程师(12)网络攻击概述

前言 网络攻击&#xff08;Cyber Attacks&#xff0c;也称赛博攻击&#xff09;是指针对计算机信息系统、基础设施、计算机网络或个人计算机设备的任何类型的进攻动作。这些攻击旨在破坏、揭露、修改、使软件或服务失去功能&#xff0c;或在未经授权的情况下偷取或访问计算机数…

消息中间件---Kafka

一、什么是Kafka&#xff1f; Kafka是一个分布式流处理平台,类似于消息队列或企业消息传递系统&#xff1b; 流处理事什么呢&#xff1f; 流处理就是数据处理工作流&#xff0c;本质上是一种计算机编程范例。流处理是对接收到的新数据事件的连续处理。‌它涉及对从生产者到消…

spring boot(学习笔记第二十课) vue + spring boot前后端分离项目练习

spring boot(学习笔记第二十课) vue spring boot前后端分离项目练习 学习内容&#xff1a; 后端程序构建前端程序构建 1. 后端程序构建 前后端分离结构 前后端就是前端程序和后端程序独立搭建&#xff0c;通过Restful API进行交互&#xff0c;进行松耦合的设计。后端程序构建…

WebGL入门(一)绘制一个点

源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scr…

【开源免费】基于SpringBoot+Vue.JS教师工作量管理系统(JAVA毕业设计)

本文项目编号 T 043 &#xff0c;文末自助获取源码 \color{red}{T043&#xff0c;文末自助获取源码} T043&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【C++】内联函数(inline function)详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 语法: 在函数定义前加上关键字 inli…

学不会最短路问题?看这篇就够了

数据结构入门学习&#xff08;全是干货&#xff09;——图论问题之最短路径 1 最短路径问题概述 最短路径问题的定义 在一个网络&#xff08;图&#xff09;中&#xff0c;求解两个顶点之间所有路径中边的权值之和最小的路径。这条路径称为最短路径。 源点(Source)&#xff…