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

news/2024/9/22 13:27:41 标签: c++, 并行编程

一、Task Scheduler

Task Scheduler,任务调度器。其实这个名词相对来说非常容易理解,毕竟从学习计算机开始,从操作系统的进程管理到内存管理,再到分布式中的各种任务管理,其中一个重要之处就在于任务的调度。现实世界中就是对工作的系统控制,而在计算机世界中就是对资源的系统控制。
在TBB中,Task Scheduler(任务调度器),是指一个loop模板的引擎。在实际的应用中,TBB文档推荐使用loop模板而非直接使用这个引擎。当然,如果实际的开发中遇到了无法将算法映射到给定的高阶模板(即loop 模板)时,只能使用任务调度器了。
上面的话不容易理解,简单解释一下,任务调度器是一个引擎,它用来支持一系列的公开的算法模板,这些算法模板其实就是循环的调用了这个引擎(也可以理解成引擎可以循环的处理这个模板)。比如TBB中常见的parallel_for、parallel_reduce‌等。

二、工作原理

所谓的任务调度器,在TBB中,任务调度器是通过类似于树的图表递归操作来进行。每个节点对应着一个任务对象,而每个任务又指向了其后驱(Successor)即继任节点。而每个对象都一个类似于智能指针的引用计数,通过它来计算继任节点以此为依赖的数量。TBB中的任务调度器在平衡深度和广度遍历时,倾向于使用最小内存处理需求并进行跨线程间的通信。
同样,线程在调用任务时,会按下面的规则进行处理:

  1. 得到上一个task的execute方法返回的task,如为空则继续调用其获得
  2. 在自身队列底部弹出一个task,如队列为空,则继续获取下一条进行判断
  3. 任选一个任务队列,从其顶部Steal一个task;如选择队列为空,则继续遍历其余队列,直到成功
    如同内核,TBB也支持调度旁路(scheduler bypass),目的同样都是为了优化执行序列,提高效率。在这种情况下需要开发者直接指定下一个运行的任务。
    TBB还支持任务再生,即不再使用任务的分配与再分配,直接创建一个任务进行执行。
    另外还需要对持续传递进行一下简单的说明,其实这个也比较容易理解,就是如果让父任务在等待所有的子任务完成后再继续进行自己的任务,则有可能导致效率的下降。在某些情况下,可能不需要所有的子任务执行完成,父任务就处理就绪态了,此时,父任务如果再等待子任务,则等同于一种资源的浪费。解决方法就是父任务只负责子任务的创建而不等待其的完成。子任务不再是父任务的父子依赖关系,它只是父任务的一种持续任务(continuation task)。这个说明起来有点麻烦,理解应该还是比较容易的。这样的好处就在于,没有了依赖关系,则线程在执行完子任务务后就可以偷窃其它子任务进行工作,提高线程的利用效率。

三、注意点

在使用任务调度器时,需要注意以下几点:

  1. 尽量使用官方推荐的new方法分配task。避免创建局部或者文件作用域的task对象
  2. 请保证在运行任何任务前,它的兄弟任务都必须分配完成
  3. 采用持续传递、绕过调度器,以及任务再生等技术获得运行的最大性能
  4. 未标记为再执行的任务完成会自动销毁。因此,其继任者的引用计数会减少1,直到0时继任者会被自动产出

四、总结

任务调试器等于是TBB底层提供的一种基础控制流程的手段。它既是一个非常强大的应用方式,也是一种很复杂很难驾驭的任务调度方式,所以TBB的应用中,尽量还是多使用其上层封装好的相关并行算法和任务调度模板。这就和汽车一样,主流的情况下请采用自动档驾驶,但遇到一些特殊情况,可以使用手动方式进行驾驶。
万物相通,道理相同!


http://www.niftyadmin.cn/n/5670342.html

相关文章

新峰商城之订单(一):确认页面开发

新峰商城订单从生成到处理结束,主要以下几个流程: (1)提交订单(商城用户发起) (2)订单入库(后台逻辑) (3)支付订单(商城…

14.面试算法-字符串常见算法题(三)

1. 字符串回文问题 1.1 LeetCode.125. 验证回文串 回文问题在链表中是重点,在字符串中同样是个重点。当初我去美团面试第一轮技术面的第一个算法题就是让写判断字符串回文的问题。 这个本身还是比较简单的,只要先转换成字符数组,然后使用双…

java实现LRU 缓存

如果碰到这种题⽬先不要慌张,现在脑海⾥回忆⼀遍 LRU 的基本概念:LRU(Least Recently Used,最近最少使⽤)是⼀种缓存算法,其核⼼思想是将最近最少使⽤的缓存项移除,以便为更常 ⽤的缓存项腾出空…

Dify 中的讯飞星火平台工具源码分析

本文主要对 Dify 中的讯飞星火平台工具 spark 进行了源码分析,该工具可根据用户的输入生成图片,由讯飞星火提供图片生成 API。通过本文学习可自行实现将第三方 API 封装为 Dify 中工具的能力。 源码位置:dify-0.6.14\api\core\tools\provide…

入门Django

Django Django 简介URL组成部分详解第一个Django项目创建一个Django项目运行Django项目项目结构介绍project和app的关系 URL与视图函数的映射URL的两种传参方式在URL中携带参数 path函数url路由模块化url反转 Django 简介 Django 是一个高级的 Python Web 框架,用于…

windows@文件系统链接@快捷方式@快捷键方式和符号链接及其对比

文章目录 abstract快捷方式和符号链接的比较创建方式快捷方式的作用快捷方式的构成如何创建快捷方式快捷方式的管理快捷方式的高级用法快捷方式的命令行创建 对比👺快捷方式与符号链接的区别符号链接支持相对路径解析具体使用场景👺总结 abstract 快捷方…

SQL server学习01-SQL server环境配置

目录 一,手动下载及安装 microsoft .net framework 3.5 1,下载 2,安装 二,安装SQL server2014 1,下载 2,安装 3,启动SQL server服务 三,下载及安装Microsoft SQL Server…

Java安全(加密+HTTPS+WEB安全)

Java加密 单向加密 接收一段明文,然后以一种不可逆的方式将它转换成一段密文 ①、MD5,将无论多长的数据最后编码128位数据,常用文件校验、密码加密、散列数据 byte[] data ...;//明文数据 MessageDigest md5 MessageDigest.getInstance…