并行实现(共10篇)
并行实现 篇1
0 引言
在数字信号处理领域, FFT是应用非常广泛的算法之一, 在OFDM系统、GPS信号捕获和雷达信号捕获、频偏估计算法等方面都有应用。DSP器件凭借其高速运算的特点, 被广泛应用于许多数字信号处理工程实践中, 包括FFT的实现。但其串行实现的结构不能满足某些FFT算法高速、实时的场合。现场可编程门阵列 (FPGA) 在当今的数字信号处理领域被广泛采用, 并且其速度、集成度越来越高, 功耗却越来越小。其对算法可并行实现的特点弥补了DSP器件应用的不足, 是FFT算法高速实现的必然选择。
1 背景
在许多工程应用中, FFT算法通常选择2的整数次幂的长度, 便于硬件实现或采用FPGA厂家提供的IP Core实现[1]。但实际应用中并非所有的FFT都是2的幂次的长度。例如多载波解调系统中, 需要同时解调16路宽带信号, 实时性要求强, 由于A/D前端的抗混叠滤波器的频率响应并不是理想的门函数, 而是有一定的滚降区间, 不能够将16路信号带宽外的干扰完美滤除。因此, 在进行采样时, 不能按16路信号带宽来进行采样。设计时采用20路信号带宽来采样, 以保证不出现频谱混叠现象。这就要求后续的数字化分路器能够完成20路宽带信号的分路, 从中选择需要的16路信号, 即需要完成20点的FFT, 因此不规则点数的高速并行FFT算法很有实用价值。
2 FFT算法选择及实现
2.1 FFT算法分类及选择
Burrus简单地根据FFT算法的输入输出序列间有无多维索引映射将其分类[2], 如表1所示。按照Burrus提出的术语学体系, 无多维索引映射的算法统称为DFT算法, 而有多维索引映射的算法称为FFT算法。DFT算法与FFT算法不是“独立”的, 在满足一定条件下是可以相互结合应用的, 实际应用中大多数有效实现通常都是DFT和FFT组合应用的结果。
通过多维索引映射可以将N=N1N2点一维循环卷积分解成N1×N2二维循环卷积的方法。Cooley-Tuckey FFT算法是所有FFT算法中最通用的算法, 可以实现任意长度的DFT计算, 其索引映射最为简单, 但引入了旋转因子, 增加了乘法器数量, 在3种FFT算法中是需要乘法器数量最多的算法。Good-Thomas FFT算法通过改变索引映射方式, 消除了旋转因子, 减少了乘法器数量, 而且实现具有模块化结构。而Winograd FFT算法[3,4]是目前FFT算法中需要乘法器数量最少的FFT算法, 但其模块化实现不如Good-Thomas FFT算法, 一般用在中小规模 (<50点DFT) 全并行FFT算法实现中。3种FFT算法比较列表, 如表2所示。
通过对3种FFT算法的分析、比较, 选择GoodThomas FFT算法作为FFT实现算法, 选择Winograd DFT算法作为小点数DFT实现算法。
2.2 实现原理
Good-Thomas FFT算法通过改变索引映射方式, 消除了旋转因子, 被称为“实际的”二维DFT[5,6]。但是无旋转因子的代价就是因子之间必须是互质的, 而且如果索引映射采用运算的方式产生, 其产生的方法将会更加复杂, 不过可以将索引映射预先产生好, 采用查表的方式或者并行实现, 即可大大简化实现复杂度。索引映射原理及GoodThomas FFT算法消除旋转因子的推导涉及到数论的一些基础知识。以下主要介绍20点FFT索引映射的产生及算法的实现结构。
由于设计中采用的是20点FFT, 下面描述20点FFT实现方法。很明显, 20=4×5, 并且gcd (4, 5) =1, 那么令
则
式 (2) 中, () 表示欧拉函数;〈〉N1表示对N1求模, 那么20点FFT的Good-Thomas时域输入索引映射为:
频域输出索引映射为:
为了简化FPGA实现复杂度, 先根据式 (5) 和式 (6) 计算出n, k的值, 输入输出索引映射列表如表3、表4所示。
2.3 结果分析
按照如图1所示的实现方案, 采用VHDL硬件描述语言在FPGA中实现了20点FFT变换[7]。图1中, 索引映射采用Good-Thomas映射方法, 而小点数的4点、5点DFT采用Winograd DFT算法实现。通过实际测试, 工作速度可以达到120 MHz。运算结果和MATLAB仿真对比如图2所示。由图2可以看出FPGA实现结果与MATLAB仿真完全吻合。
2.4 应用扩展
根据2.2节中的实现原理可知, 该方法要求FFT分解因子互质, 根据这一特点, 大点数的FFT可以采用互质的小点数DFT模块通过级联方式实现[8,9,10]。例如, 3点、4点和5点DFT通过级联可以实现60点FFT, 5点、7点和9点DFT通过级联可以实现315点FFT。只需按照文中实现原理, 灵活采用各小点数DFT模块即可。
3 结束语
通过对FFT不同算法的分析, 选择合适的算法在FPGA中实现了高速的非规则20点FFT模块, 经过硬件仿真, 与MATLAB仿真输出结果吻合;在工程应用中表现良好, 满足工程应用。硬件实现结构采用模块化设计, 通过选择各小点数DFT模块, 通过级联可完成多种较大点数非规则FFT的实现, 便于扩展应用。结合MATLAB仿真工具, 在应用前就可以预先分析其性能, 并评估参数及数据位数等因素的变化对性能影响, 用以指导系统设计, 可以极大减小设计风险。
参考文献
[1]管吉兴.FFT的FPGA实现[J].无线电工程, 2005, 35 (2) :43-46.
[2] (美) 贝斯.数字信号处理的FPGA实现[M].北京:清华大学出版社, 2003:178-215.
[3]胡广书.数字信号处理:理论、算法与实现[M].北京:清华大学出版社, 2002:195-212.
[4]严砚飞, 杜伟韬, 杨占昕.使用Winograd算法实现不规则长度DFT[J].中国传媒大学学报 (自然科学版) , 2007, 14 (2) :39-43.
[5]MALCEOD M D.Multiplierless Winograd and Prime Fac-tor FFT Implementation[J].IEEE Transactions on SignalProcessing, 2004 (39) :740-743.
[6]NAGESHA V.On Computing the Discrete Fourier Trans-form of a Linear Phase Sequence[J].IEEE Transactionson Signal Process, 1991 (39) :225-226.
[7]李斌, 田素雷.大点数FFT设计中提高资源利用率的方法[J].无线电工程, 2011, 41 (1) :54-57.
[8]杨旭霞, 归琳, 余松煜.3780点FFT处理器的研究[J].电路与应用, 2005 (281) :32-34.
[9]MALCOLM D M.Multiplierless Winograd and Prime Fac-tor FFT Implementation[J].IEEE Signal Processing Let-ters, 2004, 119 (9) :740-743.
[10]陈志斌.一种可重构DFT/DHT/DCT/DST结构的设计[J].湘潭师范学院学报, 2005, 27 (4) :32-35.
并行实现 篇2
3.1 VLIW体系结构
TMS320C62x的内核结构如图1所示。内核中的8个功能单元可以完全并行运行,功能单元执行逻辑、位移、乘法、加法和数据寻址等操作。内核采用VLIW体系结构,单指令字长32位,取指令、指令分配和指令译码单元每周期可以从程序存储器传递8条指令到功能单元。这8条指令组成一个指令包,总字长为256位。芯片内部设置了专门的指令分配模块,可以将每个256位的指令分配到8个功能单元中,并由8个功能单元并行运行。TMS320C62x芯片的最高时钟频率可以达到200MHz。当8个功能单元同时运行时,该芯片的处理能力高达1600MIPS。
(本网网收集整理)
3.2 基于TMS320C62x的并行算法软件开发方法
基于TMS320C62x的并行编译系统支持C语言和汇编语言开发并行程序代码。通常,开发ATR并行算法按照代码开发流程的三个阶段进行并行程序设计:第一阶段是开发C代码;第二阶段是优化C代码;第三阶段是编写线性汇编代码。以上三个阶段不是必须的,如果在某一阶段已经实现了ATR算法的功能和性能要求,就不必进入下一阶段。
(1)开发C代码
开发C代码需要考虑的要点包括:
①数据结构
TMS320C62x编译器定义了各种数据结构的长度:字符型(char)为8位,短整型(short)为16位,整型(int)为32位,长整形(long)为40位,浮点型(float)为32位,双精度浮点型(double)为64位。在编写C代码时应当遵循的规则是:避免在代码中将int和long型作为同样长度处理;对于定点乘法,应当尽可能使用short型数据;对循环计数器使用int或者无符号int类型,避免不必要的符号扩展。
②提高C代码性能
应用调试器的Profile工具可以得到一个关于C代码中各特定代码段执行情况的统计表,也可以得到特定代码段招待所用的CPU时钟周期数。因此可以找出影响软件程序总体性能的C代码段加以改进,通常是循环代码段影响软件程序总体性能。
③数据的定标
由于TMS320C62x是定点系列芯片,不支持浮点操作。在程序编写过程中,应当尽量采用定点的数据结构。而实际处理的数据通常都是浮点的,所以需要把浮点数据通过定标转化为整型数据处理,提高程序的处理速度。数据的定标是十分关键的步骤,既要使数据处理精度满足性能要求,又要防止在数据处理过程中出现溢出。
(2)优化C代码
优化C代码包括向编译器指明不相关的指令、循环展开、循环合并、使用内联函数、使用字访问短整型数据和软件流水等方法。
①向编译器指明不相关的指令
为使指令并行操作,编译器必须确定指令间的相关性,只有不相关的指令才可以并行执行。如果编译器不能确定两条指令是不相关的,则认为是相关的,安排它们串行招待。用户可通过如下方法指明相关的指令:
・关键字const可以指定一个目标,const表示一个变量或者一个变量的存储单元保持不变,使用const可以提高代码的性能和适应性。
・一起使用-pm选项和-03选项可以确定程序优先级。在程序优先级中,所有源文件都被编译成一个模块,从而使编译器更有效地消除相关性。
・使用-mt选项向编译器说明在代码中不存在存储器相关性,即允许编译器在无存储器相关性的假设下进行优化。
②循环展开
循环展开就是把循环计数小的循环展开,成为非循环形式的串行程序,或者把循环计数大的循环部分展开,减少循环迭代次数,增加单个循环内的代码,使得循环内的操作可以均匀分布在各个功能单元上,保持DSP处理器的各个功能单元满负荷运行。
③循环合并
如果两个循环计数差不多、循环执行互不相同的操作,可以把它们合并在一起组成一个循不。当两个循环的负荷都不满时,这是非常有用的。
④使用内联函数
TMS320C62x编译器提供的内联函数是直接映射为内联指令的特殊函数,内联函数的代码高效、代码长度短。用户可以使用内联函数并行优化C代码。
⑤使用字节访问短整型数据
内联函数中有些指令是对存储在32位寄存器的高16位和低16位字段进行操作的。当有大量短整型数据进行操作时,可以使用字(整型数)一次访问两个短整型数据。然后使用内联函数对这些数据进行操作,从而减少对内存的访问。
⑥软件流水
软件流水是用来安排循环指令,使这个循环多次迭代并行执行的一种技术。在编译时使用-o2和-o3选项,编译器可对循环代码实现软件流水;使用-o3和-pm选项,使优化器访问整个程序,了解循环次数;使用_nassert内联函数,防止冗余循环产生;使用投机执行(_mh选项)消除软件注流水循环的排空,从而减少代码尺寸。
在嵌套循环中,编译器仅对最里面的循环执行软件流水,因此对招待周期很少的内循环作循环展开,外循环进行软件流水,这样可以改进C代码并行执行的性能。使用软件流水还应当注意:尽管软件流水循环可以包含内联函数,但是不能包含函数调用;在循环中不可以有条件终止指令;在循环体中不可以修改循环控制变量。
(3)编写线性汇编代码
编写线性汇编代码是并行算法软件开发流程的第三个阶段。了提高并行算法软件代码的性能,对影响并行程序速度的关键C代码可以用线性编重新编写。编写线性汇编代码不需要指明使用的寄存器、指令的并行与否、指令的延迟周期和指令使用的功能单元,汇编优化器会根据情况确定这些住处。优化线性汇编代码的方法包括:为线性汇编指令指定功能单元,使得最后的汇编指令并行执行;使用字访问短整型数据;使用软件流水对循环进行优化。编写线性汇编代码的工作量非常大,需要很长的开发周期,而且开发后的汇编代码不能像C代码那样移植在其它的DSP平台上。
由跟跑、并行向并行、领跑转变 篇3
中国纺织工业联合会会长王天凯,原会长杜钰洲,副会长兼秘书长、纺织之光科技教育基金会理事长高勇,中纺联副会长孙瑞哲、杨纪朝,副会长、纺织之光科技教育基金会副理事长夏令敏,中纺联党委副书记陈伟康,纪委书记王久新,顾问陈树津、张延恺等领导出席大会并为获奖代表颁奖。中纺联各部门、各专业协会领导,地方行业协会领导,中纺联奖励委员会委员以及本次会议表彰的科技工作者、企业家、院校教师与学生获奖代表及众多媒体代表 600 余人出席了表彰大会。会议由高勇主持,孙瑞哲在大会上作重要讲话。
会议对获得“纺织之光”2015年度中国纺织工业联合会科学技术奖、教育教学成果奖、教师奖、学生奖、针织内衣创新贡献奖、全国纺织行业技术能手、技能人才培育突出贡献奖的获奖单位和个人代表颁奖,并为全国纺织技术创新示范企业、全国纺织科技创新人才颁发证书,同时为纺织之光科技教育基金会捐款单位授牌。
并行实现 篇4
在大规模战争中,具有高精确性的制导武器对战争的结局起关键性作用,图像匹配技术作为精确制导图像处理器的关键技术具有重要的理论意义和实用价值。对于精确制导武器,匹配性能决定着制导武器的精确度[1]。通常情况下,匹配性能是随着模板面积的增加而提高,但是实际情况存在着几何失真的干扰,几何失真的强度会随着模板面积的增加而增加,从而导致匹配性能下降,因而单纯提高模板面积来提高匹配性能,在实际情况下是不可行的。由于单模板相关系数是包括模板图和搜索图每个像素点的函数,当搜索图受到某种干扰导致搜索图的某一部分发生变化,相关系数会有很大的影响。解决此问题,需要将模板图进行划分为多个模块,采用多个模板最优相关系数子集方法[2]。
多个模板相关算法是为了解决几何失真带来的匹配精度下降的问题,将大模板划分为多个子模板,然后分别将每个子模板与实时图像进行相关匹配,由于子模板的像素点少,所以当部分像素发生变化时,主要影响的是相对的子模板,而对其他子模板影响较小,将每个子模板的相关系数矩阵进行综合。这样综合之后匹配性能与大模板匹配性能相似,也减少了几何失真所导致的匹配性能下降[3]。
在基于灰度图像,本文采用的相关匹配算法是差的绝对值和相关法(Sum of Absolute Difference,SAD)[4]。由于SAD算法具有计算简单、重复性大等特点,因而可以并行处理多个像素点,使得计算时间降低。如果采用DSP计算多个模板的SAD,由于DSP是逐点计算,所以实时性往往不能达到要求。但是FPGA具有并行处理多个进程的特点和SAD算法具有被并行处理特性,采用FPGA来实现多个模板的SAD算法,是在基于并行处理特性上和实时性要求很高的情况下完成对多个模板的SAD计算,在规定时间内得到相关系数,能够提供足够的时间让DSP处理跟踪算法,从而提高整体系统实时性和精确性[5]。
2 多级模板并行匹配原理
2.1 模板匹配原理
基于图像灰度值模板匹配,本文采用的是SAD算法(差的绝对值和相关法)。如图1所示,设搜索图为(M+N)×(M+N),模板图为N×N。
SAD算法公式定义为
undefined
式中:i∈(0,M+N),j∈(0,N);R(i0,j0)为相似性度量函数在偏移量是(i0,j0)时的匹配度量值也称之为相关系数;S(i0+i,j0+j)为实时图像中搜索区域中各像素点灰度值;T(i0+i,j0+j)为模板图中各像素点灰度值;(i,j)为搜索图与模板图之间的偏移量,当R(i0,j0)取值最小时认为(i0,j0)为最佳匹配位置[2]。
2.2 实现过程
如图1所示,最初模板T坐标(0,0)和搜索图S坐标(0,0)对齐,计算完毕之后模板图T在搜索窗上进行滑动一次,使得模板图T坐标(0,0)与搜索窗坐标(0,1)对齐,同样进行相同SAD计算,计算出相关系数R(i0,j0)。每滑动一次计算出偏移量为(i,j)的相关系数R(i0,j0)。当滑动M×M次之后,得到全部偏移量对应的相关系数R(i0,j0)[6]。
当模板级数达到多级时,如果采用DSP进行计算,则一级模板所有的匹配度量值计算完毕之后,才会进行下一级模板计算。用此方案时间会成倍增加,比如模板有N级,计算时间是单个模板时间的N倍,因此DSP在计算多个模板,实时性不能满足要求。如果采用FPGA来实现多级模板的优势是显而易见的,FPGA并行处理特性可以并行处理多个模板,计算模板相关系数R(i0,j0)所用时间将会大大降低,多个模板所耗费时间等于单个模板耗费时间,比DSP计算时间减少N倍。采用FPGA实现多个模板SAD算法,能够很大程度上降低匹配时间,满足实时性要求。为DSP完成跟踪算法提供了足够时间,并且能够提高整个目标跟踪系统的可靠性和精确性[7]。
3 多级模板并行匹配的FPGA上实现
3.1 基本思路
本文采用的FPGA芯片是Altera公司CycloneIII系列EP3C40F484I7,总逻辑单元Total logic elements为39 600,Total memory bit为1 161 216 bit,M9K为126个[7]。
通过深入理解SAD算法原理之后,容易采用D触发器阵列存储模板图和搜索窗每个点,为了便于实现SAD算法,经资源分析之后此方案是不可能实现的。为此设计一种方法优化该设计,能够在满足性能情况下实现资源优化。该芯片逻辑单元不多,应该减少逻辑单元使用,虽然不能得到所有点的D触发器flip-flop阵列,但是能够得到一行数据的D触发器flip-flop,通过这样的思路可以降低资源消耗。
在模板一行数据和搜索窗一行数据都已经保留的情况下,搜索窗进行移位的同时计算行所有点的绝对差之和,并且能够在规定时间内计算出全部偏移量对应的相关系数R(i0,j0)。
3.2 设计方法
如图2所示,整个系统分为4个模块:存储模块、乒乓移位模块、SAD计算模块、SAD值存储模块。
1) 存储模块
如图3所示,模板图数据和搜索窗数据各有一个存储器,在写使能有效时,将模板数据和搜索窗数据分别存入各自存储器中,读取模板数据和搜索窗数据以128 bit数据读出,输出位宽越大,读数据所消耗的时间越少,该模块的输出作为兵乓移位模板的数据输入。
2) 乒乓移位模块
该模块设计如图4所示,基本思想是根据换行信号为高电平时,读取搜索图一行数据到移位寄存器A中,模板图一行数据读取到锁存器A中。同时移位寄存器B进行移位操作,锁存器B数据不变,锁存器B和移位寄存器B并行输出一行数据给SAD计算模块进行行相关系数值的计算。换行信号为低电平时,读取搜索图一行数据到移位寄存器B中,模板一行数据读取到锁存器B中。同时移位寄存器A进行移位操作,锁存器A数据不变,锁存器A和移位寄存器A并行输出一行数据给SAD计算模块进行行相关系数值的计算。
该模块优点为:首先,在计算当前行的SAD值时,就在存储下一行的数据,形成了行流水方式,节约了读取行消耗时间,减少匹配时间;其次,行与行相关系数计算占用逻辑单元少,有利于在有限的资源下计算多个模板。
3) SAD计算模块和SAD存储模块
如图5所示,T_data[n:0]和S_data[n:0]分别是模板图行数据和搜索窗行数据,SUB为16 bit减法器,ABS为16 bit取绝对值模块,多路ADD的作用是将行中所有点的绝对差值进行累加运算,SAD存储器用于暂存行相关系数值以及存储最终结果。
通过乒乓移位模块输出模板图行和搜索窗行的数据到SAD计算模块中,对它们进行减法,绝对值和求和运算。得到的一行相关系数将它送入2路ADD模块中用于累加。用模板图的滑动次数也就是偏移量作为SAD值存储器的读写地址。计算SAD值时,一直让SAD存储器处于读状态,便于下一行的相关系数能够与上一行的相关系数进行累加。最后滑动M×M次之后,完成了所有偏移量对应相关系数的计算,这样SAD存储器就存储了所有的相关系数,其中存储器地址于偏移量所对应,比如偏移量是(i0,j0),那么在SAD存储器地址为i0×16+j0的空间中就是偏移量(i0,j0)的相关系数。然后将所得到相关系数发送给DSP,DSP在相关系数基础上进行后续算法运算。
4 系统运行结果性能分析
4.1 Modelsim仿真结果及分析
首先定义4个模板图和搜索图分别是:模板图24×24对应搜索图40×40;模板图32×32对应搜索图40×40;模板图48×48对应搜索图为64×64;模板图64×64对应搜索图72×72。以模板图为24×24和搜索图是40×40为例,对仿真结果进行分析。如图6所示,模板图每行的数据0~23,搜索图每行数据16~55。
如图7和图8所示,在开关信号为低电平时,一行数据从存储器中读出来并且存储到移位寄存器当中,该图反应了一个时钟周期读出8个像素点数据并且存入移位寄存器当中。等待开关信号为高电平时移位寄存器进行移位操作,这样每移动一位就相当于模板图在搜索图中滑动一位。模板行数据的保存类似搜索图行数据的保存,只是在计算过程中模板行数据不进行移位操作,只是维持值不改变,等待一行计算完毕,再进行下一行存储。
如图9所示,SAD存储器发送地址(Mad_send_rdaddress)与模板图滑动次数即偏移量是相对应的。发送地址为0的时候表示模块处于初始位置,偏移量为(0,0)。图中0地址对应的最终绝对差之和实际值Mad_Sum为9 216(地址与数据有一个时钟的延迟)。如图6所示模板图和搜索图,容易得出模板图和搜索图偏移量为(0,0)时每个点对应的差值为16,总共有24×24个点,绝对差之和理论值为16×24×24=9 216。由图可以看出理论值和实际值相同,所以用FPGA实现的模板匹配具有匹配准确性。
本文采用Altera公司的CycloneIII系列EP3C40F484I7设计4个模板并行匹配处理系统,如图10所示,有4个SendMad_en读信号为高电平时,表示对于该模板的MAD计算完毕。整个系统实现了4个模板的匹配算法并行处理,由图分析可知,模板24×24首先计算完毕,64×64的最后计算完毕,由于模板越小计算量越小,所以匹配时间越小。
4.2 匹配时间上的分析与DSP性能对比
整个系统采用50 MHz分频之后13.5 MHz时钟作为基本时钟。在表1中Les为逻辑资源,MB为memory bit存储资源,从表中的数据可以看出FPGA在并行处理多个模板匹配的优势是很明显的,FPGA计算4个模板的匹配总的耗时等于单模板中最大耗时,模板32×32比模板24×24所用时间要小是由于其对应搜索图大小不同。但是DSP总的耗时便是4个模板匹配时间之和,超过场信号周期20 ms,没有办法用DSP来做4个模板相关系数计算。现在FPGA系统时钟采用13.5 MHz进行计算,如果系统时间进行倍频,计算时间将会成倍减少。
4.3 FPGA+DSP与单独DSP对比实际的效果跟踪图
验证FPGA并行处理多模板实时性和可靠性,为此构造一个背景单一的实时场景,背景采用白色,运动物体是一把黑色的钥匙,钥匙通过一根固定在上方的线连接,使钥匙做钟摆运动。图11的跟踪图是基于FPGA+DSP系统,由FPGA来完成4个模板的相关系数,通过图11分析跟踪框中心与运动物体中心始终对齐,匹配准确性高。图12的跟踪图是基于单DSP系统,由DSP来做4个模板相关系数以及跟踪算法,通过图12分析图像每隔一场,跟踪 表1 时间和资源统计框中心与运动物体的中心有很大的偏差,匹配性能差。通过图11和图12比较,能够得出FPGA+DSP具有良好的实时性和精确性。
5 小结
本文以低端FPGA为平台,实现了实现多个模板图与多个搜索图之间像素值差的绝对值和相关法。本设计巧妙和灵活,将匹配技术中适合在并行处理的SAD算法在FPGA上移植,为DSP分担了算法中大量的计算,并且利用有限的逻辑单元和RAM资源实现了4个模板同时进行相关系数的计算。特别是乒乓移位模块,进行移位的同时也在进行读取行的操作,很大程度上节约了匹配时间。匹配时间得到很大程度的降低,为DSP完成跟踪算法提高了足够的时间,从而提高了整体系统的实时性和精确性。
参考文献
[1]马莉,韩燮.主成分分析法(PCA)在SIFT匹配算法中的应用[J].电视技术,2011,35(1):129-132.
[2]李国辉.基于多片DSP的相关匹配算法的研究与实现[D].成都:电子科技大学,2004.
[3]TORU W,YUKIHIKO Y.Multi-template GAT/PAT correlation for char-acter recognition with a limited quantity of data[J].IEEE Computer Soci-ety,2010,10(704):2873-2876.
[4]MANZAR M A,CHEEMA T A,JALIL A,et al.New image matching tech-nique based on hyper-vectorisation of grey level sliced binary images[J].IET Image Processing,2008,2(6):337-351.
[5]高陈强,余迪虎,李强,等.视频图像中基于特征匹配的人流量统计[J].电视技术,2011,35(15):20-23.
[6]陈辰,王沛,韦芳芳.图像多通道边缘信息辅助的快速立体匹配算法[J].电视技术,2011,35(23):17-21.
并行实现 篇5
职级评定要跳出“单位级别依赖”
公务员职级改革的重难点是公务员的考评、奖惩、升降的公平性,它应严格约束长官意志,建立民主评定、申诉和调查、举证义务、责任追究等制度。
《意见》明确了公务员职级制度改革,无疑令人期待,它也是对十八届三中全会提出的“建立公务员的职务与职级并行、职级与待遇挂钩制度”的呼应。而需要明确的是,公务员职级制度是法治政府相关的“文官制度”的一部分,它需要恪守法治原则,也理应在技术方法、机制设计、关联制度等方面下工夫。
就制度改革本身而言,我认为至少应注意几个方面:首先,应解剖现行制度积弊的体制性成因。一直以来,公务员的职级与职务是紧紧挂钩的。弊端之一是,没有职务,职级就无法晋升。县以上有处级的调研员、巡视员等虚职;科级及其以下没有虚职。弊端之二是,公务员职级过度依赖其单位的级别,导致庙大和尚大、庙小和尚小,县级公安局一个能干的老刑警到退休可能只是科级,而国家部委中的能力普通者退休前至少是处级,明显不公平。这是体制性问题,须进行制度设计上的调整。
其次,应尽可能明确这项改革的目标:处级目标应是职级与职务相对分离,分开考评、升降,并建立相应待遇制度。职级对应的考评、调整,应主要以德、能、实绩、资历为依据,但也要考虑其所在单位的级别。县以下公务员的职级,可以到处级,特别突出者可以到司局级;或者按公务员分级,合理确定职级的上下区间。
至于各级、各类、各个公务员的工资待遇和财产状况,须严格遵循透明原则,接受全社会监督。对其任何不正当利益均应依法处理,贪污受贿必要时应降级直至开除;接受任何馈赠,均应及时报告、公开,并举证证明其不违法性。
而公务员职级改革,还需诸多关联性制度改革措施的配套。例如,应健全公务员的退出机制,取消事实上的铁饭碗。对每个公务员职位,须作尽可能明确的职责规定,并对其履职状况进行内外部评价。比照事业单位的聘期制,对部分公务员也实行聘期、任期制,打破终身制。又如,对不同种类的、同职级的公务员,应按照公务的复杂性、危险性、紧迫性程度,实行合理的差别待遇:如刑警的待遇应高于大多数种类的公务员。
另一重难点是公务员的考评、奖惩、升降的公平性及相关激励机制问题。长期以来,长官意志说了算的提任机制为害颇深。而相关改革应严格约束长官意志,建立民主评定、申诉和调查、举证义务、责任追究等制度。如果负责人特别主张提升某人的职级,则应公开对组织、公众承担证明义务,并对被晋级者的德、能、绩及法治意识、守法状况承担“担保责任”;对于不公平、不正当的升降,应严格追究负责人的责任。概言之,在此项改革中,要注重对症下药、方法缜密、公开公平、厉行法治,特别是管束好各级负责人,丝毫不能含糊。
就怕“职务职级并行”执行难
现实中的公务员考核里,虽然要求公务员考核要尽量体现公平和真实的文件不少,可囿于人情世故、利益固化等因素,实际执行效果并不理想。
作为基层公务员一名,听到“不当官也能享受官员待遇”的消息,看到职级改革有了纲领性文件,挺欣慰的:毕竟,这有利于解决由于职务的瓶颈导致福利待遇长期停留在低位的问题。
但欣慰之余,我也生出几丝隐忧:该制度的推行,从整体社会效益上讲,从促进基层待遇公平方面讲,都是大好事;但对基层公务员个体而言,却并不必然意味着工资待遇及心理感觉的必然公平。
县以下基层公务员实施职务与职级并行,或有两个明显的涵义,一是政策推行目的是激励基层勤勉公务员更努力地工作;二是必须切实公正地选出具有勤勉特质的公务员予以激励,才能起到涨士气的作用。
但现实中的公务员考核里,虽然有关方面出台了公务员考核要尽量体现公平和真实的意见和制度,可实际执行效果并不理想,很大程度上陷入了“你好我好大家好”的怪圈中,不论勤勉与否,不论工作成绩大小,只要不是有明显问题,考核都会是“称职”以上等次。而这种人情与关系绑架下的考核,很可能让勤勉的公务员和混日子的都能实现晋级涨工资,但却很难体现出能力、绩效的差异来;而这种“干好干坏一个样”的隐性不公,到头来,还会与实施基层公务员职务与职级并行的初衷相悖。
说起来,职务与职级并行,是《公务员法》赋予包括基层在内的一项基本制度,但它落不到实处也有好一阵子了。原因有多方面的:比如基层财力有限,比如职务与待遇挂钩的惯性认知——某种程度上,官员待遇也是种显示地位、刷优越感的方式。而到头来,它也使得一些地方领导手中的权力收益最大化,如把副主任科员、主任科员等当“官”卖,通过这些“官”职的私相授受寻租。而一些基层公务员为达到待遇晋升,不得不千军万马争“官”干,加剧了基层官场的腐败和跑官要官等现象。这不仅是某些“局中人”的亲身感受,很多民众对此也不乏认识。
给基层公务员一个增加福利待遇的通道,确实鼓舞人心,但出台职务与职级并行制度只是简单的第一步,关键是怎么啃“硬骨头”,让改革的韧性掰得赢固化利益圈的手腕,破除那些执行中的隐性不公。
并行实现 篇6
在城镇化与村镇建设动态监测的过程中, 常常需要借助于泰森多边形[1] (Thiessen Polygon, 又被称为Dirichlet图、Vorono图) 进行地理信息分析。对于大规模的数据点, 串行的泰森多边形的生成算法速度较慢, 因而需要一种并行算法提高生成速度。
生成Delaunay三角形是Thiessen多边形生成的基础, 二者可以通过一定规则互相转换[2]。而生成Delaunay三角形具有多种算法, 依照参考文献[3]的研究, 在串行计算的条件下, Dwyer算法[4]无论对于均匀分布或者非均匀分布点集, 在输入点数小于一定数量 (216) 的情况下, 都相对于其它的算法具有较佳的性能。并且其本身的分治特征也比较容易进行并行化, 所以本文在此的基础上设计与改进并行化的泰森多边形生成算法。
2、算法流程
一个较为实用的泰森多边形生成程序的算法流程如下所示:
1.输入点集读取, 并且去除点集中的重复点, 计算MBR (最小外包矩形)
2.在远离点集MBR的四角加入四个额外点
3.Delaunay三角剖分
4.将Delaunay三角形转换为泰森多边形
5.将生成的泰森多边形裁切到合适的范围内
6.输出最终结果
由于输入点集存储于ESRI Shape文件中, 其采取了四叉树的存储形式, 因而MBR可以直接获得。而去除重复点时如果采取数组作为查找存储结构, 则不得不多次线性扫描数组找出重复点, 数据量大时性能十分低下。因此可以建立一个哈希表, 以X坐标作为键值, Y坐标的链表作为查找存储结构。经过实验证明, 对于2万个输入点的问题规模, 该改进可以获得约30倍的性能提升。而对泰森多边形的裁切, 使用的是Sutherland Hodgman多边形裁切算法[5]。由于对于每一个泰森多边形的裁切都是独立的, 因而可以使用并行计算进行优化。
但是经过实验可知, 对于较大规模的问题 (输入点数1万以上) , 步骤3与步骤4的计算时间占了总时间的90%以上, 因而对这两个步骤进行并行化, 对于总计算性能的提高最为关键。
3、Quad-Edge
考虑到Delaunay三角形与Thiessen三角形的快速转换, 本算法使用Quad-Edge[6] (四方边缘结构) 作为存储数据结构。这是由于每个Quad-Edge单元都储存了两条主边 (e0与e2) 与两条对偶边 (e1与e3) , 并且按照逆时针顺序可以顺序访问。即对于每个顶点, 包围其的对偶边就是其泰森多边形的边, 并且可以直接转换为Shape文件格式所要求的顺时针顺序, 无需再进行额外的排序工作。所以这种情况下, Delaunay三角形与泰森多边形的转换是非常方便与快速的, 并且由于每个泰森多边形单元的转换独立性, 因此该过程也是可并行化的。
Quad-Edge的结构十分简单, 仅仅使用点与有向边即可完备的描述空间数据模型的拓扑与几何特性。对于Quad-Edge结构, Org表示当前有向边的起点, e Rot表示当前Quad-Egde中逆时针旋转90度的有向边即对偶边。e ONext为以当前Quad-Edge的基点逆时针旋转的下一条Quad-Edge。除此之外, 其定义了终点End, 左剖分区域Left与右剖分区域Right[7]。另外Quad-Edge在此基础上定义了基本的创建 (Make) 、连接 (Connect) 、接合与分解 (Splice) 等基本操作过程。具体可参见参考文献[6]。
经过实验可知, 采用了Quad-Edge结构后, 整个转换过程的性能得到极大提升, 相对于总时间, 步骤4的时间几乎可以忽略。因而一种并行化的Delaunay三角剖分算法, 对于整体计算性能的提高更为关键。
3、并行Delaunay三角化
本文选用的算法首先按照Dwyer的建议, 首先将按照之前计算的MBR, 将输入点集划分至个子区域。然后对于每个区域进行分治法求解, 再加以合并。由于无论是区域的划分还是每个区域的求解, 都存在独立的计算过程, 因而都可以进行并行优化。另外这里值得指出的是, 由于输入点集的分布未必均匀分布, 每个区域内的点数未必均衡。因此需要一定的措施保证各个线程的计算负载均衡, 一个较为简单的办法是产生远多于CPU内核数的计算线程, 通过一个线程池的管理, 保证CPU的各个核心一直都处于计算状态[8]。
算法对于每个小区域采用分治法求解。对于划分的区域仅有2个或者3个点的情况下, 生成操作比较简单, 直接连接这2个或者3个点构成Delaunay三角形即可。如果每个区域的点数大于等于4个, 则需要对其进行划分, 并且对于划分计算后的结果进行合并。
本算法使用的合并的方法如下所示。首先使用Zig-Zag算法[9]获得两子凸包的上下底边线, 分别记为B1B2与T1T2。在B1B2上寻找一点B3, 如果B3属于左子凸包, 那么新的下底边为B2B3, 如果B3属于右子凸包, 则新的下底边为B1B3。对于B3的选择, 尽量选择左子凸包的右侧或者右子凸包左侧Y坐标较低的点, 以减少后续的优化步骤。同时保证新的底边与原有左右凸包不能有相交, 重复这一步骤直至底边与顶边重合。这时合并后的结果还不是Delaunay三角形, 还需要执行LOP局部优化过程[10]。其主要过程是将有共同边的三角形合并成为一个多边形, 然后使用最大空圆准则[2]检验其第四个点是否在其它三个点构成的三角形外接圆之内。如果是, 则对调对角线, 完成局部优化处理。
值得注意的是, 点集中有大量的点位于同一垂直线上的时候, 按照此合并算法, 可能无法保证算法的鲁棒性, 因为底边可能会变成一条垂直线。为了避免这个问题, 可以在划分子区域的时候, 每一次迭代时变化划分区域的坐标轴方向, 即一次横向划分, 一次纵向划分, 避免过于狭长的子区域出现。
除此之外, 给定圆上的三个顶点, 为了求出第四个点是否在其外接圆内, 较为常见的做法是求出既有点的两两连线的垂直平分线交点即圆心, 进而以第四个点到圆心的距离与半径做比较, 判定其是否在园内。但是如果既有点三点共线, 垂直平分线两两无交点, 则必须考虑这种特殊情况。
分析合并步骤可知, 无论是上下公切线的查找, 还是边连接与优化, 其时间复杂度都是O (n) 。而由于分解步骤的时间复杂度为O (1) , 合并步骤的时间复杂度为O (n) , 设总时间复杂度为T (n) , 则T (n) =2T (n/2) +O (n) , 因此可以推算出算法的整体时间复杂度为O (nlogn) 。
4、实验结果
按照前文描述的算法, 我们使用.NET Framework 4.0 (C#) 平台实现了相应的计算程序。同时我们也使用ESRI Arc GIS Desktop 9.3中泰森多边形生成工具对于各组数据进行了计算, 用于计算速度的对比以及计算结果的正确性检验。其中各组测试数据都是均匀分布的随机生成点集。
本文所使用的测试环境为, CPU:Intel Core2 Quad Q9400 (2.66GHz*4, 1333Mhz FSB, 6M L2 Cache) , 内存:2G (DDR31333MHz) , 操作系统为Windows 7 (32bit) 。实验的结果如下表所示, 其中时间单位为秒, 采取计算5次的平均值。
5、结束语
由实验结果可知, 本文的单线程生成算法在点集少于8万时较Arc GIS性能具有一定的优势, 但是点数继续增加时, 算法的速度较低。但是经过多线程并行优化, 在多核处理器平台的支持下, 算法获得了较高的加速比, 并且依据参考文献[11], 可以推测出这种加速性可以随着处理器的个数或核数的增加而能够得到进一步的提高。
摘要:为了加快大规模二维平面点集的泰森多边形生成速度, 本文设计并实现了一种并行优化算法。该算法在保证与串行算法具有相同的精准度的条件下, 利用串行算法的分治特征对其有效的进行了并行化优化。经过实验证实, 该算法在并行计算的环境下有效地提高了计算速度, 减少了执行时间, 并且获得了较高的计算加速比。
并行实现 篇7
随着网络技术的发展, 通信在质量、速度、成本等领域都面临着新挑战。许多学者进行深入研究并提出了各种改善措施。其中, 循环冗余校验码 (Cyclical Redundancy Check, 简称为CRC) 作为一种特色编码对通信性能改进有举足轻重的作用。它具有严谨的代数结构, 其性能易于分析;循环结构特性, 编解码电路简单易于实现。特别是CRC系统码, 在编码电路上更能简化电路结构。CRC码在串行通信中有着得天独厚的优势, 电路成本较低;但是它的速度完全依赖于时钟频率的提高, 对于速度要求较高的场合, 特别是实时的通信, 时钟频率成为颈瓶[1]。为了提高速度, 并行算法相继出现:查表法[2]能一次处理一个字节或半个字节来生成CRC校验码, 但它需要预先计算512个字节或32个字节的查找表, 实际上码表会随着信息位数的增加以指数增加, 极大地降低其现实可行性。在深入分析系统CRC码的特点后得出一种并行编码实现方法。
1 CRC系统码的一般原理
CRC系统码是利用次数为n-k的生成多项式g (x) 为k位数据生成r个校验位, 在数据传送时将r个校验位附加在数据位的后面构成n位的数据, 接收方通过接收到的数据位和检验位进行验证, 判断数据位在传送过程中是否发生变化[3]。原理相当于
式中
分别为码字多项式、信息多项式及校验多项式及分别为码字、信息位及校验位。由 (1) 式容易得到
在二进制中, 逆元就是本身, 于是
因此, 结合二进制的除法性质, 用g (x) 除m (x) ⋅xn-k便可得到校验多项式r (x) 。
2 并行算法的校验码的逻辑关系推导
由CRC系统码的生成矩阵得到的码字结构上与 (1) 式相同:明显的分组码结构, 即前k位是信息位, 后r位是校验位。这有利于在解码部分快速提取信息位。系统码的生成矩阵G形式为:
该G矩阵的特殊性还在于每一行矢量都是该CRC系统码的码字, 基于此, 在同时要满足 (3) 与 (4) 的条件下, 唯有信息组基底 (1 0 0 0 0 0 0 0) , (01000000) , …, (00000001) 生成的互相独立的k个码字按照一定的顺序排列才能构造成有如 (4) 式结构的矩阵。所以将对应的信息多项式:mk-1 (x) =xk-1, mk-2 (x) =xk-2, …, 0m (x) =1, 分别乘以xn-k, 然后用g (x) 除就得到各自的余式, 再按照G的结构排列便得生成矩阵。
采用CRC-CCITT (16位) (国际电报电话咨询委员会推荐) 标准可捕捉一位或两位错;具有奇数个错的全部错误;所有低于16位的突发性错误, 长度为17的突发性错的99.998%, 长度18以上的突发性错误的99.997%[4]。CRC-CCITT的G矩阵通过式 (3) 得出:
假设待发送的信息组, 其生成的码字为, 由于生成矩阵G、信息组m&与任一码字c&都有这样的关系:c&=m&·G。于是便能得到基于该生成矩阵的各校验位与信息位的逻辑关系, 如表1所示。
对应不同的生成多项式, 生成矩阵也不尽相同;但只要计算出CRC系统码的生成矩阵便能得到与表1相似的逻辑关系表。
3 编码器的FPGA实现
CRC解码与编码的原理是相通的, 编码是对输入数据进行CRC编码, 解码是验证判断接收到的CRC编码是否正确, 计算采用的方式是相同的;只是解码部分要判断信息是否正确并且根据判断结果提取正确信息, 纠正或抛弃有误的信息[5]。所以并行处理应用在这两个模块中, 能大大提高通信的速度。并行处理方式是每次输入一组数据, 且在一个时钟内计算得出CRC结果。这种方式是要确定数据的位数, 在本文中, 采用VHDL (Very high speed integrated Circuit Hardware Description Language) 设计一个 (24, 8) 编码器, 利用FPGA (Field Programmable Gate Array, 即现场可编程门阵列) 技术进行仿真。表2是此设计的端口说明。
VHDL语言的主要代码:
对所设计的编码器进行时序仿真, 便得到如图1所示的波形图。
从图1可以看出, 16位的CRC码在数据输入当个周期内就能得到, 延迟时间与时钟周期之比远小于1%, 与传统硬件电路LFSR相比, 尽管串行电路的速度很高, 但每次只能处理一位数据, 本文的算法在时间上是绝对的占优势。而且本文的方法仅仅占用11个logic elements资源, 消耗的资源与串行方法相当。仿真是在QuartusⅡ6.1平台上, 所选用的器件为Strati系列。
4 结束语
从分析CRC码的特点出发, 提出了并行计算的方法对CRC—CCITT校验码进行了设计, 这种方法在8位数据并行输人大大提高了运行速度, 并且在数据输入的当前周期内就可以得到CRC校验码的结果。从综合的结果也可以看出, 这种方式具有逻辑简单, 速度更快, 占用资源更少的优点, 可以很方便地在FPGA中实现。
参考文献
[1]Braun, F., Waldvogel, M..Fast Incremental CRC Updates for IP over ATM Networks.High Performance Switching and Routing, 2001IEEE Workshop on.29-31May2001.p48–52.
[2]张莉丽, 张振权, 刘仁.CRC查表生成算法汇编的实现及其优化.计算机应用, 石油化工自动化, 2005, 第4期.
[3]王新梅, 肖国镇.纠错码一原理与方法[M].西安:西安电子科技大学出版社, 2001.
[4]程立辉, 黄贻彬, 付金华, 徐洁.CRC算法在计算机网络通信中的漏检分析.河南科学, 2007.6, 第25卷第3期.
并行实现 篇8
关键词:多核处理器,OpenMP,并行算法,快速排序
1. 引言
现代计算机的多核、众核技术正在快速发展,如何利用多核实现并行计算提高计算效率,已成为高性能计算技术领域研究的热点。对于配置了多核CPU的共享存储计算机系统,目前Open MP已是一种共享存储并行编程模型的工业标准,具有良好的可编程性,能够显著提高编程和计算效率。
本文分析Open MP的并行编程模型特点,应用Open MP设计和实现一种快速排序并行算法,并进行Open MP并行程序与串行程序性能比较,验证本文所采用的Open MP并行编程方法的有效性。
2. Open MP并行编程简介
计算机多核技术的发展带动了并行编程方法的研究和发展,其中以Open MP为代表的并行编程方法是多核计算机并行编程的主要方式。Open MP具有简单、移植性好和可扩展等优点,由一组与平台无关的编译指导命令(directives)、环境变量(environment variables)和运行库(runtime library)组成。Open MP的缩主语言目前支持Fortran、C和C++语言,当前最新版本为3.0。
Open MP是通过编译器对程序中编译指导语句的翻译来实现并行计算的。例如在C/C++语言中,用语句#pragma omp parallel来标识一段并行执行的程序块。Open MP编译指导语句可以根据需要包含多个子句项,在没有其它约束的条件下,子项可以无序和任意选择。例如#pragma omp parallel for[子句…]是使用最为频繁的编译指导语句,并且可以搭配使用private,firstprivate,if,lastprivate,reduction,schedule等多种子句。
Open MP并行编程模式主要有两种:(1)fork-join模型,常用于开发计算任务中内在的循环级并行性。其中fork负责建立多线程,启动多个线程完成并行计算量的任务;join使各线程汇集于主线程,由主线程完成串行计算量的任务,这种模式较为简单直观。(2)编写类似SPMD形式的程序,利用Open MP的库函数omp_get_num_threads()和omp_get_thread_num()可以进行任务划分。本文主要采用第二种方式。
3. Open MP快速排序并行算法
3.1 问题描述
快速排序(quick-sort)算法是对冒泡排序算法的一种改进,由C.A.R.Hoare在1962年提出。它的基本思想是:通过一次排序将数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归并行处理,以此达到整个数据变成有序序列。
3.2 串行算法描述
设要排序的数组为A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它之前,所有比它大的数放到它之后,这个过程称为一次排序。一次排序的算法描述如下:
(1)设有两个变量I、J,排序开始的时候:I=0,J=N-1;
(2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
(3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与A[I]交换;
(4)从I开始向后搜索,即由前向后搜索(I=I+1),找到第一个大于key的A[I],与A[J]交换;
(5)重复第3、4步,直到I=J;
(6)将数据A[0]放置到I处;
排序的整个算法采用递归调用一次排序的过程。设一次排序的函数为qkpass(),则递归形式快速排序算法如下:
3.3 快速排序并行算法的设计与实现
通过对传统快速排序串行算法并行化,可以形成快速排序Open MP并行算法。首先分析计算问题的数据依赖关系,挖掘其内在并行性,然后进行数据分割,创建N个线程,为每个线程分配一份分割后的数据,各线程分别对各自的数据进行排序后,再利用归并排序算法进行排序。具体过程如图1所示。
由图1所示的Open MP快速排序并行算法步骤如下:
(1)设随机产生的待排序数组为p,个数为count;
(2)由Open MP编译指导语句控制产生并行执行代码区段;
(3)各线程获取自己的线程号iam和总线程数量no;
(4)各线程调用串行快速排序算法:将p,iam*count/no,(iam+1)*count/no作为函数参数,并行地执行快速排序函数quicksort();
(5)调用merge()函数合并排序各个线程已经产生的部分有序数据。
以上代码中“#”开头所在行是编译指导语句。#pragma omp parallel表示下面一段代码并行执行,shared(A,count,no)表示A,count,no为所有线程共享变量,即每个线程都可以访问的变量,主要用于共享存储和数据交换。private(p)表示p为每个线程中私有变量,每个线程自身可以访问的变量,不能用于变量共享。
3.4 实验结果分析
实验环境和条件在拥有双CPU的4核处理器Intel E5405(主频2.0GHz)上进行实验)。
实验数据是模拟产生的100万个、500万个和2000万个随机整数,对三种规模的数据分别进行串行快速排序,计算时间分别为0.219秒,1.312秒,7.234秒。然后在分别设定2核、4核和8核的Open MP并行环境上进行同样三种数据规模的并行排序,对比结果表明,Open MP并行算法比串行算法效率有明显提高。两种算法计算效率对比如表1所示。
从表1可知,并行计算时间随处理器核的增加而减少。由表中数据生成的并行加速比(Speedup)图和并行效率(Efficiency)图分别如图2和图3所示。
由图2和图3可以得知,在多核CPU中,Open MP多线程并行加速比随处理器核个数的增加而增加,规模越大,加速比增加得越快。并行效率随处理器核的增加而降低,但若同时适当增大规模,则可基本保持并行效率不降低,因此本该算法具有良好的可扩展性。
5. 结束语
随着多核、众核时代的到来,多核软件编程方法将成为主流技术。从本文设计的Open MP快速排序并行算法可以看出,Open MP提供了一种简单的、可移植的方法来实现串行代码到并行代码的转换,以多线程方式并行运行程序,从而提高了处理器的利用效率。Open MP具有良好的可编程性,开发人员不需要考虑线程的通信和控制等问题,只需要编写适当的编译指导语句即可实现并行计算,使得开发人员可以致力于研究并行计算中的算法设计和负载均衡等核心问题,以提高并行效率。
参考文献
[1]Michael J.Quinn.MPI与OpenMP并行程序设计[M].陈文光,武永卫等译.北京:清华大学出版社,2004.
[2]OpenMP标准[EB/OL].http://www.openmp.org.2010.
[3]罗省贤,何大可.基于MPI的网络并行计算环境与应用[M].成都:西南交通大学出版社,2001.12.
[4]郭晶旭.基于快速排序的改进算法[J].计算机科学,2009,36(4A):343-344.
[5]陈国良.并行算法实践[M].北京:高等教育出版社,2004.
并行实现 篇9
边缘检测技术是图像处理和计算机视觉等领域最基本的技术[1]。当前, 图像边缘检测技术主要利用以CPU为核心的传统计算资源进行处理, 计算量大、能耗高、效率低, 不能很好地满足高分辨率图像的快速处理。
随着可编程图形处理器技术的快速发展, 当前的GPU已经具有很强的并行计算能力, 越来越多的算法被成功移植到GPU平台上, 并取得了很好的加速效果。然而由于GPU硬件体系结构的差异性, 在不同GPU硬件平台间实现算法移植是一件非常困难的工作。目前国内外已有的研究工作一般只针对单一的硬件平台, 没有考虑不同硬件平台间的可移植性。
近几年来, 由多核CPU、GPU或其他类型的处理器组成的异构框架作为一种新的计算机体系架构逐渐成为主流。其中, 开放式计算语言 (Open Computing Language, Open CL) 作为面向异构计算平台的通用编程框架[2], 一方面在实现性能目标的同时降低了能耗, 另一方面为实现GPU通用计算程序的跨平台移植提供了解决方案。为此, 本文提出了一种基于Open CL异构框架的Prewitt并行算法。
1 Prewitt算法原理
图像的边缘是图像的重要特征之一。常用边缘检测算法包括Roberts算法、Prewitt算法、Sobel算法、Canny算法和Laplace算法。
Prewitt算法作为一阶微分算子的边缘检测算法[3], 利用像素点上下、左右相邻点的灰度差, 在边缘处达到极值检测边缘, 去掉部分伪边缘, 对噪声具有平滑作用。其原理是在图像空间利用图1所示的水平、垂直两个方向的3×3模板与图2所示的图像像素3×3邻域进行卷积运算来完成。一个模板通常的垂直边缘响应最大, 而另一个对水平边缘响应最大。
图1中:水平模板用于检测水平边缘, 垂直模板用于检测垂直边缘。在处理时, 图像中每个点都用这两个模板进行卷积, 两个卷积的最大值作为该点的输出位。运算结果是一幅边缘幅度图像。图内模板的数字是模板系数, 中间的点表示中心元素。
对于像素f (i, j) , 则Prewitt算法定义如下:
水平方向梯度计算:
垂直方向梯度计算:
其中:Gx为像素点f (i, j) 的3×3领域与水平方向模板的卷积;Gy为像素点f (i, j) 的3×3领域与垂直方向模板的卷积。求出梯度G后, 设定一个常数n (n≤255) , 当G>n时, 标出该点为边界点, 其像素值设定为255 (白点) , 否则设定为G。实验表明, CPU上的Prewitt串行算法实现简单, 但是, 由于需要做大量的卷积运算, 当图像分辨率较高时, 计算量很大, 耗时较长, 难以满足大规模数据处理的要求。
2 Open CL简介
Open CL提供了统一的面向异构系统的并行编程环境。Open CL架构包括四部分:
2.1 平台模型
Open CL平台模型由一个主机 (Host) 连接一个或多个能执行Open CL的设备 (Device) 构成。在AMD的Open CL平台中, 主机一般指x86 CPU[4]。所有由OpenCL编写的应用程序都是从主机启动并在主机上结束的, 主机管理着整个平台上的所有计算资源。每个Open CL设备包括一个或多个计算单元 (CU) , 每个计算单元又包括一个或多个处理单元 (PE) 。应用程序会从主机端向各个Open CL设备的处理单元发送计算命令。该模型主要用来编写能够在设备上执行的Open CL的kernel函数。如图3所示。
2.2 执行模型
Open CL的执行模型包括在主机上执行的主程序 (Host Program) 和在Open CL设备上执行的内核程序 (kernel) [5]。Open CL执行模型主要管理kernel在OpenCL设备上的运行。
在主机将内核程序交到设备上执行时, 系统便会创建一个N维 (可以是一维, 二维或者三维) 的工作空间 (NDRange) 。工作空间被划分为多个工作组 (work group, 也就是块) 。每个工作组又包含多个节点 (workitem, 也就是线程) 。所有工作节点都将执行相同的内核程序。用全局ID (global ID) 表示每个工作节点在相应维度上的索引, 用局部ID (local ID) 表示工作组内部的节点相对该工作组的位置索引。通过一个global ID和一个work group内的local ID, 就能标定一个workitem。
如图4是一个二维工作空间NDRang (Gx, Gy) 的例子。工作空间的workitem数量为Gx乘以Gy, 一个workgroup内的workitem的数量为Sx乘以Sy。
2.3 内存模型
Open CL的内存模型定义被kernel用到的抽象内存层次, 有四种内存类型, 包括全局内存 (Global Memory) 、常数内存 (Constant Memory) 、局部内存 (Local Memory) 、私有内存 (Private Memory) 。各种内存之间的数据传输必须是显式进行的。
全局内存:工作空间内所有的工作节点都可以读/写的该内存区域中一个内存对象的任何元素。
常量内存:工作空间内所有的工作节点都可以只读的内存区域。这个内存区域在内核程序的执行过程中保持不变。主机分配并初始化该内存中的存储对象。
局部内存:局部从属于一个工作组的内存区域。这个内存区域可以用来分配由该工作组中所有工作节点共享的变量。
私有内存:是一个工作节点私有的内存区域。一个工作节点在该内存区域中定义的变量对其他工作节点不可见。
2.4 编程模型
Open CL的编程模型分为:数据并行编程模型、任务并行编程模型和混合编程模型。数据并行编程模型是在编写Open CL并行程序时采用的首要模型。
数据并行编程模型用一系列操作一个存储对象的多个元素的指令的形式定义了计算。Open CL实现的是一种松散的数据并行编程模型, 它不需要workitem和内存对象元素之间严格的一对一的映射。workgroup可以显示指定, 也可以隐式指定。
任务并行编程模型使内核程序的执行独立于线程索引空间。一个计算部件上只有一个workitem执行内核程序。
3 Prewitt算法的并行实现
3.1 主机端程序
Step1:先获得Open CL的平台信息, 在此平台上选定Open CL设备, 如GPU。接着建立上下文环境, 并建立命令队列用来执行内核实例。
Step2:创建并编译源程序, 建立内核实例。将内核程序代码保存在“Prewitt_Kernel.cl”文件中, 读到内存并存储为字符串数组形式。
Step3:首先分配主机内存, 将bmp灰度图像数据读入到主机内存中。然后, 在显存中申请2块与图像数据相等容量的空间。一块用于存放主机内存中图像数据拷贝, 另一外用于存放图像数据的处理的结果, 将数据复制到显存上。
Step4:设置内核参数。
Step5:执行内核程序。调用设备端kernel函数, 将处理过程交由设备。
Ste:6:验证结果。
Step7:将控制权交回主机端, 把计算结果从显存复制到主机内存中。
Step8:释放系统所占资源, 并由主机端将经过处理的图像结果显示输出。
Step9:输出状态和运行时间。
3.2 设备端程序
使用设备GPU时, Prewitt并行算法的图像卷积运算需要调用kernel程序实现。设备GPU根据主机端调用kernel函数时指定的参数形成块 (Block) 数workgroup以及每个块内线程 (Threads) 数workitem, 线程数为256。
4 实验结果与分析
4.1 实验运行平台
硬件平台:CPU采用Intel (R) Xeon (R) CPU E5620@2.40 GHz, 4核、8线程。系统内存为12.0 GB DDR3。显卡采用AMD Radeon HD 6970, GPU为Cayman, 显存为2 GB GDDR5。
软件平台:操作系统为64位Windows 7专业版。程序开发环境为Visual Stadio 2010, 以及AMD-APP-SDK2.8。
4.2 实验步骤与记录数据
预先处理好六幅不同分辨率大小的bmp灰度图像, 使用它们进行Prewitt边缘检测算法对比实验, 分别运行CPU上的串行算法和Open CL异构框架上的并行算法, 并记录处理时间, 结果如表1所示。
图5为1 920×1 200分辨率的原始图像, 图6和图7分别为对原图进行串行和并行Prewitt图像边缘检测算法的运行结果。
4.3 性能分析
实验结果表明:随着图像分辨率的不断增大, GPU的加速效果十分明显。例如, 在GPU上运行Prewitt并行算法对分辨率为4 800×3 600的图像进行边缘检测, 加速比达到了30倍。
5 结语
提出了一种基于Open CL的Prewitt图像边缘检测的算法, 借助GPU高效的运算能力, 在显存中对图像进行了并行化的边缘检测, 获得了较清晰的处理图像。通过实验可以看出, 采用Open CL异构框架实现Prewitt并行算法, 有较好的通用性和可移植性, 可以大大提高算法的执行效率, 对其他通用并行算法的实现有一定借鉴作用。
参考文献
[1]杨道普, 马秋禾, 石磊.边缘检测Prewitt算子的改进算法[J].测绘科学, 2008, 33 (z3) :100-103.
[2]肖汉, 郭运宏, 周清雷.面向CPU_GPU异构计算的SIFT特征匹配并行算法[J].同济大学学报:自然科学版, 2013, 41 (11) :1732-1737.
[3]GASTER B R, LEE H, KAELI D R, et al.OpenCL异构计算[M].张云泉, 张先轶, 龙国平, 等译.北京:清华大学出版社, 2012.
[4]刘蕊.数字图像中边缘检测算法的研究[D].镇江:江苏科技大学, 2009.
[5]迈克老狼.AMD大学教程中文版[EB/OL].[2013-01-03].http://www.opengpu.org.
[6]AMD上海研发中心.跨平台的多核与众核编程讲义:OpenCL的方式[M].上海:AMD上海研发中心, 2010.
并行实现 篇10
关键词:遗传算法,cilk,并行化
1 背景介绍
1.1 遗传算法
遗传算法是模拟达尔文的自然选择学说和自然界的生物进化过程的一种计算模型。它采用简单的编码技术来表示各种复杂的结构,并通过对一组编码表示进行简单的遗传操作和优胜劣汰的自然选择来指导学习和确定搜索的方向。遗传算法的操作对象是一群二进制串(称为染色体、个体),即种群。这里每一个染色体都对应问题的一个解。从初始种群出发,采用基于适应值比例的选择策略在当前种群中选择个体,使用杂交和变异来产生下一代种群。如此模仿生命的进化一代代演化下去,直到满足期望的终止条件为止。
由于遗传算法的整体搜索策略和优化搜索方法在计算是不依赖于梯度信息或其它辅助知识,而只需要影响搜索方向的目标函数和相应的适应度函数,所以遗传算法提供了一种求解复杂系统问题的通用框架,它不依赖于问题的具体领域,对问题的种类有很强的鲁棒性,所以广泛应用于许多科学,
GA也在生产调度问题、自动控制、机器人学、图象处理、人工生命、遗传编码和机器学习等方面获得了广泛的运用。
1.2Cilk技术
Cilk是在C语言上的扩展, 来简化多核并行化开发过程, 从而更好的发挥多核处理器的硬件性能。 Cilk非常适合,但不局限于分治算法。 其核心思想是将问题分解为能够独立执行的若干小任务, 然后将小任务的结果进行合并, 得到问题的最终结果。 递归函数在分治算法广泛应用, Cilk对其有良好的支持。
能够并行执行的任务可以是函数, 也可以是循环体。 Cilk++的关键字可以自动识别能够并行化的函数调用或循环体。 Cilk实时系统可以有效的调度这些任务到当前空闲的处理器。 Cilk++使用工作线程(Worker)代表操作系统线程,其数量与处理器的数目相同(对于支持超线程的处理器, 一个处理器将具有两个工作线程), 在Cilk程序中,Cilk调度器使用该线程来执行任务。
2Cilk技术的执行模型
首先,通过描述一个有向连通图(DAG)来说明Cilk++程序的串行/并行结构,有向连通图(DAG)不依赖于处理器的具体数量。执行模型描述实时调度器如何将可并行执行单元(strand)映射成若干个工作线程的。
随着多核处理器的普及,不同的可并行执行单元可以并行的执行。然而,在Cilk程序中,可并行执行单元可以被并行执行,但不是一定要并行执行。Cilk的调度器会动态地改变策略。这种策略类似于任务秘取调度(work-stealing scheduler),调度器会周期地检测各个处理器的负载情况,以便得到当前空闲处理器。例如双核CPU,它拥有 2个硬件线程( 同时有2个线程并行化执行) ,当Cilk调度器分配任务时,它首先会将整个任务分配给一个硬件线程,如果某时第2个硬件线程空闲,则第2个硬件线程会“窃取”第1个任务线程的一半任务进行处理,就这样一层一层地密取,最终使多个任务能够并行化完成。如图1所示,假设Cilk代码段:
如图2所示,该代码用有向图可以表示为
如果cilk调度器中存在大于1个工作线程,这段程序可能有两种方法执行:
整个程序执行在一个工作线程中;
调度器将可并行执行单元2和3调度到不同的工作线程上;
为了确保程序顺序执行,考虑程序在单核情况下的执行模型,可并行执行的任务(执行节
点3与主函数(执行节点4)应该是同一个线程中,因此,在cilk调度器中,在初始状态时,执行节点1和3必须在同一同一工作线程中。当调度器在进行处理器负载均衡的检测中,发现有一个工作线程空闲时,这时通过任务秘取机制,该线程会获取部分执行节点3的任务,即执行节点2,从此可并行化任务开始并行执行。
如图3所示,程序在单个工作线程上的执行与传统串行版本的程序完全相同,虽然任务在A点也被划分成为执行节点2和3两个部分,但由于没有空闲的工作线程节点2也只能在节点3完成后才能执行,最后在B点完成结果的合并,结束可并行执行的区域。如图4所示,如果系统中出现一个空闲工作线程,从A点开始,可并行任务被划分到执行节点2和3,并调度到不同的工作线程并行执行,执行完成后,两者在B点完成同步(所谓同步,就是保证所有并行的工作线程运行结束后,才进入下一步操作)。值得注意的是,在并行任务完成同步和结果的合并后,下一步的任务(即执行节点4)理论上可以在执行节点2或3所在的工作线程上继续执行,但cilk调度器为了更充分的利用程序执行的上下文环境,将会在最先前的工作线程上继续执行,即执行节点1和3所在的工作线程。
3 遗传算法并行化改造的设计
通过对遗传算法的学习,在进行并行化改造之前,首先设计遗传算法的串行执行版本,其流程图如图5所示。算法第一步主要进行一些初始化工作,主要是种群信息和遗传代数目,种群信息通过输入的20组基因数据(每一组为基因变化的上下界,数值在1到1000之间)和配置的种群数量动态生成,同时还需要设置最大遗传代数、基因数目、基因交叉概率和编译概率;第二步,使用遗传算法对第一代种群进行处理,并选出及保存第一代中的最优个体,同时保留中间结果到文件;第三步,对上一代种群中个体的基因进行筛选,形成新的种群并对新种群的基因不断交叉和突变,并将当前种群的最优个体和上一代种群最优个体进行比较,筛选出最优个体,这样反复迭代,直到种群的遗传代达到最大遗传代,最后得到最优个体。
如图6所示,通过Parallel Studio对串行程序进行并行化程度分析,可以发现程序的大量运行时间花在种群个体筛选(select函数)和基因变异(mutate函数),因此对这部分进行并行化改造,可以大大提高程序性能。另外,通过对遗传算法分析,个体筛选和基因变异都是对当前遗传代种群中个体的单独处理,与前后遗传代和种群中其他个体之间没有迭代关系,对其进行并行化改造是安全的。因此,对遗传算法的并行化改造,就是对当前种群个体的筛选和基因变异并行化执行。
如图7所示,遗传算法并行化改造设计流程图,实验环境采用Intel Q8200四核处理器,即工作线程数目为4。执行节点1主要实现种群信息和相关参数的初始化;当程序运行到A点,即对当前种群中个体进行筛选和基因变异处理,进入并行执行环境,所有的任务在开始时全部被调度到n1工作线程上,在理想情况下,此时另外3个工作线程应该处于空闲状态(视操作系统的不同负载情况而有所不同),工作线程n2、n3和n4会秘取n1的任务,从而实现任务的并行化执行;在B点(同步点),待所有工作线程运行结束,将各个线程的结果进行合并,再进入执行节点4。
4 遗传算法并行化的实现
4.1 遗传算法并行化改造流程
第一,通过intel parallel studio性能分析软件,对传统非并行程序进行性能分析,找出程序的运行瓶颈和存在并行化改造的地方,同时记录程序的运行的各个中间结果,便于比较。第二,结合Cilk并行化技术的特点,对程序中存在的可并行化部分,进行并行化优化。第三,通过intel parallel studio中的inspector检测软件,对并行化后程序中存在的数据竞争和死锁进行检测和修复,确保程序的并行化版本和非并行化版本的结果(包括中间结果)的完全一致性。第四,分析并行化程序的性能提升。
4.2 遗传算法并行化改造方法
在进行并行化改造的过程中,主要使用到了cilk_for、cilk_sync、grainsize、reducer_opadd、__cilkrts_get_nworkers()等cilk技术。通过遗传算法并行化改造的设计可知,并行化改造的核心工作就是要实现在当前种群中对个体筛选和基因突变的并行化化执行。
4.2.1 个体筛选函数(select)的并行化改造
如图8所示,该代码为并行化改造的最重要代码,采用cilk_for对程序中的for循环进行并行化改造。代码中的#pragma是一条编译指导语句grainsize=POPSIZE/__cilkrts_get_nworkers()-100,实现了对系统粒度值得设置,所谓粒度值就是最小的任务大小,系统通过它来划分任务,划分的过程采用二分法,即不断的将任务折半,直到任务的大小小于或等于粒度值。其中__cilkrts_get_nworkers()用来获取当前的工作线程的数量,在这里粒度没有按照系统实际拥有的工作线程数目平均分配,而是比这个平均值稍微小一点,这是因为多线程在并行执行一个任务时,其结束时间可能会不同,这就造成了执行速度快的线程会等待执行速度慢的线程。为了解决这个问题,我们适当多分出一点任务,让执行较快的线程通过任务密取来执行这部分任务,从而减少等待时间,更充分利用CPU。
对于循环体的并行化,该循环为一个二重循环,如果对内层循环采用cilk_for,这样会产生大量的子任务,过多的子任务会造成大量的开销,这样的开销远远大于并行化后带来的性能提升,因此这样做会造成程序的执行速度甚至比非并行程序还要慢,因此在外层循环中使用cilk_for,减少子任务数量,同时具有较好的并行性,有利于提高程序的运行效率。这样的设计就是将种群划分为若干较小种群,然后在各个较小种群中,并行地进行个体的筛选操作,从而达到并行化的改造效果。
4.2.2 基因突变函数(mutate)的并行化改造
如图9所示,对于基因突变操作,首先定义了函数randval来实现个体的基因突变操作,具体算法在输入的基因上下界中产生一个随机值,来代替原有基因。同时,在选择种群某个个体的某个基因进行基因突变时,采用随机概率小于变异概率的操作,实现了选择的随机性。
在并行化的改造过程中,由4.2.1的经验可得,应该对循环体外层进行并行化改造,这样的设计就是将种群划分为若干较小种群,然后在各个较小种群中,并行地进行基因突变操作,从而达到并行化的改造效果。
4.2.3 工作线程结果的合并
在实现任务并行执行后,必须对并行化执行的各个工作线程的运行结果进行合并,才能得到完整的最终运行结果,在cilk中,使用reducer进行结果的合并操作。
如图10所示,首先定义reducer_opadd类型的变量,该变量用来存储各个线程的私有结果,其次,定义reducer中合并操作,这里合并可以加、减、乘和除等运算,最后将reducer_opadd类型的变量赋值给返回值,程序的其他部分可通过返回值来访问并行算法的最后结果。
4.3 性能分析
4.3.1 程序运行结果分析
分析:程序运行的中间结果较多,在这里无法给出,具体可参照程序中的galog.txt文件。由于遗传算法中采用很多随机概率来决定交叉和变异的概率,同时加上浮点数运算,因此中间结果会有一定误差。但遗传算法的目的,是最终筛选出最优良的个体,只要保证并行化程序最后筛选出的结果与非并行程序相同,就可以说明并行化算法的正确性。如图11和图12可知,两者的结果均为764227.247,完全一致(注:由于浮点数计算有一定的误差,可能在运行的过程中并行与非并行程序的结果会有一定的误差,这样的误差很小,是可以接受的),因此可以认为并行化算法是正确的。
4.3.2 程序时间结果分析
分析:如图13和图14可知:并行化程序的执行时间约为7.19s,而非并行程序的执行时间为30.25s,因此程序的效率提升约为30.25/7.19=4.2倍。
4.3.3 程序执行中的性能分析
分析:如图16所示,Elapsed Time代表程序的整个运行时间,比前面的算法执行时间略长;CPU Time代表使用CPU的总时间(对于单线程的程序而言,该时间等于使用一个CPU的时间,而对于多线程并行执行的程序,该时间等于使用各个CPU的时间总和);Wait Time和Wait Count分别代表CPU等待的时间和次数;Core Count代表CPU拥有的核心数目;Threads Created代表程序运行的过程中创建的线程数目。非并行程序在执行的过程中,由于没有使用多核,因此在程序的整个执行过程中,仅仅创建了一个线程,因此CPU核数平均为1.00,因此其运行的时间较长;而并行化程序,其执行的过程中采用并行的方式,产生了5个线程,其中最开始在主函数中执行时,产生了1个线程,在并行化执行的部分,开启了4个线程来执行。由于存在非并行化的部分,因此并行化程序使用CPU核数平均为3.08,而不是理想情况下4,从CPU time可以看出,程序总体使用CPU的时间为24.781s,由于是同时使用4个CPU核心,因此程序的运行时间取决于最后结束线程的时间,这样把CPU的运行时间同时分配到多个CPU核心上,大大提高了CPU的利用率,是整个程序的执行效率大大提高。
参考文献
[1]戴文华.基于遗传算法的文本分类及聚类研究[M].北京:科学出版社,2008,10-55
[2]张军.计算智能[M].北京:清华出版社,2009,45-66
[3]英特尔网络软件学院.Cilk-Programmers-Guide.http://software.intel.com/en-us/articles/intel-parallel-studio-home.[电子文献]
[4]英特尔软件学院教材编写组.多核多线程技术[M].上海:上海交通大学出版社,2011:12-88
[5]Guang-Ien Cheng,Mingdong Feng,Charles E.Leiserson,Keith H.Randall,and Andrew F.Stark.Detecting data races in cilkprograms that use locks.In Proceedings of the Tenth Annual ACM Symposium on Parallel Algorithms and Architectures(SPAA’98)[C],pages 298–309,Puerto Vallarta,Mexico,June 28–July 2 1998.