最近在进行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