并行编程架构(指令流水、进程、线程、多核,Pipe and Filter)
最近在进行DSP软件优化时,查阅文献,看到了几种并行机制,下面予以总结:
关键词一:指令流水
关键词二:多进程
关键词三:多线程
关键词四:多核(多处理器、超线程结构、多核结构、多核超线程架构)
在体系架构中,Pipe and Filter(管道过滤器架构),如下图所示,所有的Filter并行执行,Pump 或者Producer是data sources,可以是静态的文本文件,也可以是任何输入(比如键盘、网络数据等等); Sink 或者 Consumer是数据目标(data,target),可以是另一个文本文件,或者是数据库、计算机屏幕等。Pipe即是connector,在filter之间传递数据,应当具有data buffer(数据缓存)的作用,以匹配适应filter的处理速度;而Filter则是一个个处理单元,它接收来自pipe的数据,并进行处理(filter
or transform),Filter可以有N多个input Pipes,也可以由N多个output Pipes。
典型的应用案例:
Unix编程:一个程序的输出linked to(connected)另一个程序的输入;
DSP6678:一种数据流(data stream)的架构,每个core(内核)可以作为一个Filter,而共享内存等可以作为Pipes。这是DSP多核编程的一种常用架构。
编译器:连贯的过滤器进行词汇分析、语法分析、语义分析和代码生成等。
基于这样的架构(software architecture),所有的filter都可以在不同的线程(thread)、coroutines或者不同的机器上执行,可以是软件上或者是硬件上(FPGA)实现。
缺点:
1. 很明显,当Filter在等待它接收到所有的data并开始执行前,Pipe的有可能data buffer 溢出或者发生死锁。
2. 管道的数据类型可能会使得过滤器需要进行解析,这将slow down processing speed。如果构建了不同数据类型的管道,则该管道将不能链接到任何的过滤器上。
这里主要对Pipe/Filter架构进行总结。因为上面几种都比较简单,也最常见,所以就没有进行总结。
最后,讲一个在DSP应用开发中的采用此架构进行开发的一个案例:在进行ARM到DSP通过以太网口传图处理的一个开发中,ARM负责从USB摄像头读取图像数据,然后通过以太网口发送至DSP处理。为了保证实时性处理,在验证了DSP算法处理的速度之后,发现如果采用ARM发送来一帧,DSP处理一帧,DSP处理完,ARM再进行下一帧采集和发送这样的串行机制,实时处理几乎是不现实的。最后采用了多级PingPong操作,ARM和DSP管道缓存均设置为5个图像大小,在DSP处理的时候,ARM依然进行图像采集和处理,直到DSP
管道Buffer 满为止。进行过这样的处理,最后实现了整个嵌入式开发的实时性处理。其实就是类似操作系统中著名的生产者-消费者模型。今天总结的Pipe/Filter实质上都与此思想相近。
参考文献:
1. 操作系统之哲学原理
2. http://www.dossier-andreas.net/software_architecture/pipe_and_filter.html
并行编程架构(指令流水、进程、线程、多核,Pipe and Filter)的更多相关文章
- C#并行编程(6):线程同步面面观
理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读 ...
- 深入C#并行编程(1) -- 了解线程
一.操作系统用进程(Processe)分隔正在执行的程序,用线程(Thread)作为操作系统分配处理器时间的基本单元,进程上下文中可以运行多个线程,进程的所有线程共享其虚拟地址空间,所有线程均可执行程 ...
- Python并行编程(十一):基于进程的并行
1.基本概念 多进程主要用multiprocessing和mpi4py这两个模块. multiprocessing是Python标准库中的模块,实现了共享内存机制,可以让运行在不同处理器核心的进程能读 ...
- 并发编程(六)--进程/线程池、协程、gevent第三方库
一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...
- 并发编程(六)——进程/线程池、协程、gevent第三方库
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...
- 深入C#并行编程(2) -- 使用线程
一.可以使用位于命名空间System.Threading中的Thrad类开启线程: //声明一个新的线程 Thread myThread = new Thread(LoopFunc); //传递一个T ...
- C#并行编程(1):理解并行
什么是并行 并行是指两个或者多个事件在同一时刻发生. 在程序运行中,并行指多个CPU核心同时执行不同的任务:对于单核心CPU,严格来说是没有程序并行的.并行是为了提高任务执行效率,更快的获取结果. 与 ...
- C#并行编程中的Parallel.Invoke
一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过程中一般会将很多任务划分成若干个互相独立子任务, ...
- C#并行编程
C#并行编程中的Parallel.Invoke 一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过 ...
随机推荐
- socket mac终端调试工具 nc netcat
今天想学点socket ,因此搜索socket 工具,找到了netCat工具.可以打开两个终端window ,实现终端之间的socket的收发信息,为以后学习socket调试做准备用吧.两个终端分别打 ...
- 小米BL不解锁刷机
关于小米NOTE顶配近期解锁的问题中发现还有很多人不会用9008模式刷机,现出个简单教程方便米粉们救砖.硬件:小米NOTE顶配手机 win10系统的电脑 手机与电脑相连的数据线软件:老版本的mifla ...
- EntityFramework6 学习笔记(三)
你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除一组记录,如果按照正常的流程 ...
- Highcharts error #16: www.highcharts.com/errors/16 js 单例
一.问题项目某一个页面用的highcharts用来显示一张图表,第一次刷新正常,第二次就出来这个错.1二.解决问题过程在网上找了很多同样是这个错误的解决方案. 第一:加载了highstock.js然后 ...
- Tensorflow细节-P212-循环神经网络
本节的循环神经网络一图足以说明 import numpy as np X = [1, 2] state = [0.0, 0.0] # 定义RNN的参数 # 以下两个本来是像这样分开的,但是在运算时合并 ...
- Vigil 发送多人邮件通知的处理
Vigil 默认是只能发送单人邮件,但是我们有需要发送多个的场景. 解决方法: 大家使用一样的账户登陆 使用邮件组 修改下源码 为了学习下Vigil 的构建,以及原理,我简单通过修改源码的方式(目前支 ...
- mysql 根据发音查找内容
当前表 mysql> select * from table1; +----------+------------+-----+ | name_new | transactor | pid | ...
- mysql 存储过程 REPEAT ... UNTIL ... END REPEAT
begin declare b int; declare use_no varchar(10); declare use_name varchar(400); decla ...
- centos7下配置ftp服务器
第一步,安装vsftpd这款ftp服务器软件,yum install -y vsftpd 第二步,设置vsftpd服务开机自启动,然后重启服务,查看ftp服务端口,centos6命令如下: #chkc ...
- 微信小程序之使用wx:for遍历循环
效果图如下: 实现代码如下:type.js: // pages/type/type.js Page({ /** * 页面的初始数据 */ data: { types: "" }, ...