并行编程架构(指令流水、进程、线程、多核,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 一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过 ...
随机推荐
- Python学习进阶
阅读目录 一.python基础 二.python高级 三.python网络 四.python算法与数据结构 一.python基础 人生苦短,我用Python(1) 工欲善其事,必先利其器(2) pyt ...
- Android init介绍(上)
1. 介绍 init进程是Linux系统第一个用户进程,是Android系统应用程序的根进程,即1号进程(PID为1):Android中的init文件位于/init,代码位于system/core/i ...
- class Pagination(object)分页源码
class Pagination(object): def init(self, current_page, all_count, per_page_num=10, pager_count=11): ...
- wecenter系统关于标题及seo的修改
wecenter整个系统好像根本就没有考虑过SEO优化,就连Title的识别也是随意的许多,在使用这个cms来完成我们自己的需求的时候,适当的修改是比不可少的.下面说说title标题修改方法. 今天分 ...
- 【Selenium-WebDriver实战篇】基于java的selenium之验证码识别内容
==================================================================================================== ...
- volatile 关键词
volatile 关键字指示一个字段可以由多个同时执行的线程修改. 出于性能原因,编译器,运行时系统甚至硬件都可能重新排列对存储器位置的读取和写入. 声明了 volatile 的字段不进行这些优化.这 ...
- LOJ P10016 灯泡 题解
每日一题 day50 打卡 Analysis 用初中学的相似推一波式子,再用三分一搞就好了. #include<iostream> #include<cstdio> #incl ...
- Windbg的命令
前面介绍了Windbg的UI功能,也基本上能完成基本的调试任务,但是WinDBG主要是以命令方式工作的,这些命令在Command Window里输入.WinDBG共支持三类命令:标准命令.元命令和扩展 ...
- dbt 集成presto试用
dbt 团队提供了presto 的adapter同时也是一个不错的的参考实现,可以学习 当前dbt presto 对于版本的要求是0.13.1 对于当前最新版本的还不支持,同时需要使用源码安装pip ...
- 【JZOJ6228】【20190621】ni
题目 $ n $ 个数 $ E_i $ ,$ F(i) $ 表示对1-i的数任意排列 $ p $ ,初始 $ X=0 $ ,依次执行: \(X \lt E_{p_j} \ , \ X++\) $X \ ...