多核和多CPU编程——有向无环图DAG应用

一、有向无环图

Directed Acyclic Graph,DAG,有向无环图。如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。接触过算法数据结构和离散数学的,基本都知道这个东西。图论是一个专门的数学分支这里不进行讨论,DAG的应用范围非常广,常见的如算法和数据结构中的最短路径问题,区块链的共识相关,包括本文要讲的任务调度问题。看一个基本的有向无环图的:

在这里插入图片描述

如果有对DAG感兴趣的,可以找本数学书籍看看。

二、DAG任务分解

任务的分解本身就是一个复杂的问题。当然,一些特定的任务不在其中。一般来说,完全把任务分解成互不依赖的可独立执行的子任务是最理想不过的,但实际情况这种现象往往是少之又少的。任务的分解,往往可以用一个类,一个函数,甚至一个代码块来做一个基本单元。分解任务不必一开始就做的很细,可以先粗略整理出一个大致的分解框架,然后再在其中不断的调整、细化。任务分解的过程,其实就是寻找任务执行的先后依赖顺序的过程,也是一个执行粒度大小的分解过程。在分解任务时,如果想去除任务循环,只要把相关的代码放到一个任务中即可。
在任务分解完成形成DAG后,如何进行任务高度,需要有算法来支撑。对DAG来说,任务图的分层算法就是一种很好的手段。什么是图的分层呢?在有向无环图中,按顶点将其分成多层,从DAG的特点可以看出,每一层都是可以独立执行的,看一下面的图:

在这里插入图片描述

这种任务调试的算法的时间复杂度为O(n),n是任务图的边数。
在DAG中,首先要明白,什么是出度什么是入度,进入顶点的有向边数量是入度,反之则为出度。在有向无环图中,一定存在一个入度为0的顶点,否则一定存在着环。那么拿到一个DAG后如何进行分层呢?
1、首先,明确图中各个点的入度。
2、将入度为0的顶点划成顶层或者说第一层。
3、从第二层开始以下各层,在去除上一层顶点子图中,查找入度为0的顶点划分成一层(即去除上一层顶点的入度)。
4、依3的方式进行循环,直至完全分解。
通过上述分析可以看出,用图来进行任务分解,简单清晰,是一种比较好的任务并行分解方法。

三、总结

数学是计算机科学的基础,计算机中的许多问题都可以抽象成数学问题来解决,这也是为什么搞算法研究的很多大牛都是数学出身。学好数学,是每一个计算机程序员不得不经历的一个过程。不要说,不学数学就可以把计算机搞得很好,如果你这样说,那恰恰暴露了自身的层次。可以不研究数学,但不能不学习数学;可以不学得很深,但一定明白原理。
基础不牢,地动山摇!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值