2111-数据流语言设计-version1

初衷

为了研究为什么需要做数据流,什么应用需要数据流这个问题,我个人经历了一段时间的思考。 参考学习了COStream项目: 流程序,即有序处理数据序列的程序 COStream编程语言是一种面向并行体系结构的高性能流编程语言,采用同步数据流图的计算模式,即程序实现了一些独立的结点(为独立计算单元,COStream中称为actor),这些结点通过输入和输出通道进行数据传递(即actor的输出边和输出边),这些节点一起组成了代表整体运算的流图。

COStream语言的主要目的是:

  • 在多核架构下揭露并利用流程序固有的并行性
  • 自动实现特定域中流应用专家进行的优化
  • 提高程序员在流域中的工作效率

COStream如何实现程序的并行:

  1. 任务划分
    给数据流图中的各结点分配处理器核(核的总个数由后台程序员确定),一个结点对应一个核,一个核可对应多结点,使各核的计算量大致相同,总通信开销尽量小。
  2. 阶段赋值
    给数据流图中各结点分配阶段号(总的阶段号由编译器决定),使每一阶段的总工作量大致相同,前一阶段的结点所需数据不依赖后一阶段中结点的输出。
  3. 软件流水
    采用软件流水技术,实现并行。其中,软件流水中第n阶段执行阶段号为n的结点。

适用于数据流的应用: - 大的数据流 适合COStream应用的最根本特征体现在其在一个大数据序列(甚至是无穷的),即数据流上进行操作,数据流中的每一个数据项在有限的时间内被处理,然后被丢弃。

  • 独立的数据流结点 从概念上说,一个流的计算体现在该程序中数据流的转换。我们定义数据流的基本计算单元为actor:在每次执行阶段中,从输入流中读一个或多个数据项,对其进行计算,然后将一个或多个计算结果写入到输出流中。Actor通常都是独立和自足的,即没有包含对全局变量和其他actor的引用。一个流程序就是由一系列的actor组成的数据流图,其中一些actor的输出将是另外一些actor的输入。

  • 一个稳定的计算模式 在程序稳态执行的过程中,数据流图的结构通常是不变的。即,一系列确定的actor将按照一个有序的顺序反复执行,给定一个输入数据流,将产生一个输出数据流。

  • 滑动窗口的计算 数据流中的每一个值通常都会被同一个actor在连续的执行中所检测,也被称为滑动窗口。滑动窗口的例子包括生物序列分析、自然语言的处理、图像的处理(锐化、模糊化等)、网络数据包的检测等。

  • 偶尔的流外通信 除了大容量的数据流将从一个actor流向另一个actor,actor也将通信一些少量的控制信息在一些罕见的不规则的基础上。例如:改变手机的音量,在屏幕中打印错误信息,或者改变自适应FIR actor中的系数。 这些信息通常和数据流中的数据相同步,例如调频电台在数据流中的某个特定点的传输时改变其频率。

  • 高性能的期望 通常一些数据流程序需要满足实时性的限制,因此效率(延迟和吞吐量反面)是主要的考虑因素。另外有一些嵌入式的流程序将用于手机环境中,因此电量消耗,存储限制,代码大小限制等也很重要。

一个粗糙的设计

我们研究数据流有3个主要问题需要解决:

  1. 问题的描述和设计模式(数据描述方法)
  2. 任务划分和分配方法(数据流动方法)
  3. 任务执行需要的数据传输问题(数据依赖分析)

个人选择对应的三项研究分别为: 1. OP2 : 数据描述 2. SVF : 数据依赖分析 3. COStream :数据流动方法

这种时候必要的时候需要设计多级编译: 1. 第一级编译 (Data Compiler) : 原有程序不需要改动,将他编程更“规范”的数据描述模式 2. 第二级编译(Dependencies Compiler):如果程序需要流动,涉及依赖的部分需要复用数据和资源,这一部分需要通过旁路(Bypassing)处理 3. 第三级编译(Flow Compiler):将已经处理好依赖的部分编程更加适合计算的数据流,交付给具体的runtime

我们暂时借用OP2的基本数据设计模式: OP2 详情参考 [[2110-OP DSL]]

详细设计

数据编译设计

个人认为,数据编译设计最基本的单元是:数据元素、数据块

元素顾名思义,即为单个的item,从简设计,目前只提供:16/32/64 bits integer


2111-数据流语言设计-version1
http://blog.chivier.site/2022-01-22/2022/2111-数据流语言设计-version1/
Author
Chivier Humber
Posted on
January 22, 2022
Licensed under