基于CUDA平台的遗传算法并行实现研究概要

基于CUDA平台的遗传算法并行实现研究概要
基于CUDA平台的遗传算法并行实现研究概要

CN43-1258/TP

ISSN1007—130X

计算机工程与科学

CoM[PUTERENGINEERING&SCIENCE

2009年第31卷第A1期

V01.31。No.A1.2009

文章编号:1007—130X(2009)A1—0068—05

基于CUDA平台的遗传算法并行实现研究‘

Research

on

theParallelImplementationof

GeneticAlgorithmonCUDAPlatform

谭彩凤。马安国,邢座程

TAN

Cai-feng,MAAn-guo。:KINGZuo-cheng(国防科技大学计算机学院。湖南长沙410073)

(School

of

ComputerScience。NationalUniversityofDefenseTechnology。Changsha410073。China)

摘要:CUDA技术方便程序员在GPU上进行通用计算,但并没有提供随机数产生的应用接口。为此,本文提出并实现在CUDA开发平台上并行产生均匀随机数算法,测试证明算法可行。在此基础上优化基本遗传算法,并在GPU上并行实现其所有操作,提高其运行速度和准确度;分析了种群大小和遗传代数对此算法加速比及准确度的影响,并与MAT—U忸工具箱进行比较。实验表明,相比MATLAB遗传算法工具箱,基于CUDA平台实现的遗传算法性能更高,准确度更好。

Abstract:TheCImAtechnologyprovidesconveniencesofgeneralcomputationforprogrammers,butthereis

no

appli-

cation

programminginterfaceofgeneratingrandomnumber

on

CI『DA.Therefore,thispaperpresentsandimplements

methodforparallelproducingrandomnumberalgorithmon

CUDA,andthemethodsisprovedfeasiblebytesting.Onthiseondition,weimplement

parallelimplementationofGA

on

GPU,optimizetheefficiencyandprecisionofthestandardGA,

analyzetheinfluenceofpopulationsizeandgenerationsofevolutiontO

efficiencyandaccuracyofthisalgorithm.Theexperi-

mentshowsthatcomparedwithGAToolboxofMATLAB,theperformanceandtheprecisionofthismethodisbetter。

关键词:随机数;遗传算法;并行计算;GPGPU;CUDA;GPU

Keywords:genetic

algorithm;randomnumber;parallel

computation;GPGPU:CUDA;GPU

doi:10.3969/j.issm1007—130X.2009.A1.021中图分类号:TP301

文献标识码:A

引言

遗传算法广泛应用于各个领域,对遗传算法进行加速

具有重要的实际意义和应用价值。充分利用GPU硬件资源进行并行通用计算研究是一个新颖的研究方向。遗传算法是一种基于随机搜索的优化算法,以其较好的鲁棒性,具有全局的搜索能力,方便、简单、实用,能融合在各类算法之中,特别在NP问题领域内,应用广泛。已成功应用于函数优化、自动控制、生产调度、机器人学、图像处理、人工生命、机器学习和数据挖掘等领域。然而,因为它一般具有较大的群体规模,需要对较多的个体进行大量的遗传算子操作,耗费时间多。目前大多数对遗传算法的研究集中在理论性和并行模型的分析[1]。在遗传算法操作中,群体的初始化

和个体的遗传算子操作需要大量的随机数,随机数的并行

化对缩短遗传算法的运行时间,改进其性能尤为重要。而且,随机数广泛应用于统计、神经网络计算、随机性能仿真、密码、通信安全等领域。在这些应用中,通常都不能采集到完备的数据,因此需要用随机数来模拟现实世界中的随机现象,且其应用效果取决于生成的随机数的质量。不同领域内对随机数质量要求有较大差异。如密码学对其研究的重点是安全性,统计学对其研究重点是分布质量。在此基础上,随着计算机的发展,对随机数产生的并行性的研究也具有重要的意义。

GPU为加速图像的实时处理而设计,单个GPU拥有数百个浮点计算单元,具有超强的浮点计算能力。为了利用GPU的这种能力,2006年,NVIDI

A公司正式发布了统一架构的GPU体系结构Geforee80及CU】DA开发平台。

?收稿日期:2009—07—13;修订日期:2009—09—10

基金项目:国家自然科学基金资助项目(60873016);国家863计划资助项日(2009AA012102)作者简介:谭彩凤(1980一),女,湖南祁东人。硕t生,工程师,研究方向为高性能汁算。

通讯地址:410073湖南长沙国防科学技术大学计算机学院;Tel:13467532268;E—mail:emanly@126.corn

Address:SchoolofComputerScience,NationalUniversityofDefenseTechnology,Changsha,Hunan

410073。P.RChina

68

万方数据

CUDA利用较为通用的C语言扩展集,为程序员提供了一系列的接口,使得在GPU上进行通用计算变得简单可行。然而,CUDA平台并没有提供产生随机数的应用接口,这使得在利用CUDA平台进行信息安全、密码学、量子信息等领域内有关需要使用随机数的算法映射时十分不便,比如蒙特卡洛方法、统计抽样,计算机模拟通常只能在CPU上产生随机数。然后再将其复制至GPU上使用。

本文在ClJl)A平台上实现了两种均匀随机数的产生方法,并且比较了二者的性能和效果,将较好的方法应用于遗传算法中,在GPU的体系结构kx,t遗传算法进行加速,分析了CUDA平台上产生的随机数对遗传算法的影响,将其得到的结果与随机数重用的方法和MATLAB工具箱的遗传算法进行对比分析。

2随机数

2.1随机数产生原理

随机数按特点分为真随机数和伪随机数。真随机数是一系列毫无规律可循的随机数,不可推测,不会重复。目前,真随机数产生器一般利用无源器件中的热噪声,通过噪声放大器,经过采样和模数转换而来[3]。伪随机数有着一定的周期和规律,可以通过推演而能预测,即叮以逆向推演,伪随机数产生的方法是通过软件技术来达到的。

在CPU上基于软件所产生的随机数都是伪随机数,本文讨论的也是产生伪随机数的方法。常用的随机数概率模型有三种,即均匀分布、正态分布和指数分布模型。在众多的随机数分布模型中,服从均匀分布的随机数是基础,其它概率分布的模型都可以通过均匀分布的随机数进行一定的函数转换而得到[4],文中只讨论均匀分布随机数的产生。常用产生均匀分布随机数的算法主要有平方取中和线性同余法两种,在线性同余中又有混合同余、乘数同余、素数同余等算法[5]。在线性同余数的几种算法中,原理相同,只是参数设置不同,本文不再对线性同余细分。

平方取中法对设置的随机数种子进行平方,去掉头几位,再去尾几位,剩下的就是我们需要的随机数,并将其作为随机数种子再次进行同样的计算,如此反复,则得到了一系列的随机数序列,再对其进行标准化,即转换为[o,1]区间内的浮点数。其递推公式和标准化公式如式(1)和式(2)式所示:

,.卫

M一(湍)%(10抽)

(1)

磊2盏

(2)

线性同余方法通过对随机数种子进行线性转换得到的一系列随机数。其递推公式和标准化公式如(3)和式(4)所

示:

儿=(掣,rl+f)%m

(3)而=丝

(4)

在式(3)中,得到较为均匀随机数的关键在于模数m和乘数口的选择,而常数c对所产生随机数序列的质量没有影响,所以我们只对弘=掣,rl%班进行分析[6]。

,(y)=ay%m=口?y—m?I詈l=

m山一mlay

l;研(必一l盟1)

(5)

显然式(5)中0≤≮产一lamy

l<1,所以有0≤m(≮产一lamy

1)<m,即o≤,(y)<m。此算法是对原

始线性同余算法的改进,因为其不受乘数的限制,从而较好地解决了原始算法的高次同余溢出问题。但是在原始算法

中增加了计算≮一,涉及浮点运算而影响计算速度。文

中针对该算法的特点,利用GPU的浮点计算能力来提高其运算速度。其中%是取余数的符号,口、c、m是长整型常数,一般情况下使口、聊足够大,从而保持足够长的周期。

由式(1)和式(3)可知,这种产生随机数的方法是串行的,存在大量数据相关,不适合并行执行。为提高运行速度,对式(3)进行进一步讨论。

设需得到均匀随机数序列,(yo)=盟二也,现并行产

生两个序列,(y1)=堕云丝79lf(yz)一堕≯,总存在参

数7和A满足口o=7al和no=,la2,从而满足ao?Yo一犯1?yo—al?yl,ao?yo=勉2?3Io=a2?y2。由前述可知,随机数序列质苣不受乘数限制,因此上述三个随机数序列服从独立均匀分布。

据此,可以设置不同的随机数种子,只要保持优一致,均能得到服从独立均匀分布的随机数序列。所以,算法的伪随机性的关键在于初始种子yo的设置。确定了yo后,其后的随机序列也是确定的,则在不同的随机序列中,随机数的产生通过一定的方法能并行执行。通常设置4=

314159

269,m=2”,c=45380691,也就是混合同余法。

2.2基于CUDA平台随机数产生

根据上述原理,文中采用线程号、循环次数、当前时间的乘积作为式(3)的随机数种子,即yo=线程号*循环次数*当前时间,多个线程同时产生随机数。由于每个线程的线程号不同,所以各个线程的随机数种子如也不同,从而不同的线程产生的随机数序列不同。根据上述原理,所有线程同时产生的随机数序列应该服从均匀分布。另外,加入当前系统时间作为随机数种子的因子,是为了增加随机数的安全性。

为了平衡线程之间的负载,提高运行速度,在产生随机数之前,首先要对需产生的随机数序列进行任务划分。如

果计划用m个线程来产生卯个随机数,则每个线程所产生的随机数的序列长度应该为n/m。这n/m个随机数则是由式(3)串行产生。根据GPU体系结构,充分利用GPU资源.优的设置应该尽量是16的倍数,且n/m尽量要大于

GPU中的SM处理器的个数。

图1和图z中曲线A为C语言中rand()函数生成的随机数效果曲线,B为CPU上串行线性同余算法生成的随机数效果曲线,C为CUDA平台上线性同余算法的并行实现效果曲线,D为CUDA平台上平方取中算法的并行实现效果曲线,纵坐标是随机数的个数,横坐标是所产生的随

69

万方数据

机数乘以10再取整。而图3是其对应的性能曲线图。

./飞.

苓产B≤厂\-b≥G∑矗々k-}么∑.YYY’y’弋K7

.\/

所产生的值?lO取整

图1随机数数量为512效果图

马l-载--4b--A:ra然nd0旃

昏1}净叫七国P台叫扣叼—I司

‘1H八

■、.

图2随机数数量为204800效果图图

图3随机数数量对加速比的影响

2.3算法结果分析

从图1、图2和图3中可以看出,在基于GPU体系结构的cUDA平台下进行随机数的生成时,需产生的随机数的数量无论多少,都能得到比较均匀的随机数,甚至比rand()取得的随机数均匀性更好,但计算速度差别很大,这从图3的性能曲线可以看出。然而,在GPU上使用同样的随机数种子用平方取中的算法产生随机数,当数量比较少时,方法可行;当数量较大时,所产生的随机数不满足均匀分布。应特别注意,本文在CPU编程实现线性同余法产生随机数时,编译前对代码进行了优化,即基于前述原理,文中通过将204800分成多个随机数序列,让编译器自动优化调度产生随机数,其结果是将总的个数进行4等分以后所计算出来的时间,然而对于CPU上用rand()产生的随机数则是编译器自动优化处理后的结果。加速比的计算是以rand()所用时间为基准而得到的,重

复200次,取时间平均值,块大小均为256。实验结果证明,文中提出的并行实现产生随机数的方法是可行的。

3基于GPU体系结构的遗传算法实现

3.1遗传算法的简介及并行模型

遗传算法以生物进化的过程作为模型,基本思想就是通过选择、交叉、变异得到下一代群体,如此反复,得到一个可以接受的解。核心是通过保持优秀个体有较大的概率被选择留在下一代,进行交叉、变异等操作,保持优秀个体的优越性,从而收敛至解空间。

70

目前,对于遗传算法的研究主要集中在基本遗传算法的优化、理论分析、混合遗传算法[7]和并行性的研究[乳9|。

遗传算法的并行模型主要有以下两类:标准型并行算法和分解型并行算法。标准型并行遗传算法开发思想:在进行染色体适应度的评价时,各个染色体的数据不相关,因而这部分非常适合并行计算,从而可以提高整个遗传算法的运行速度。标准并行性方法不改变遗传算法基本结构,适合共享存储器结构并行机。分解型并行算法将整个群体分成多个子群体,在各个子群体内部中同时进行遗传算法算子操作,各个子群体中染色体相互独立,没有数据相关,从而可以进行并行计算,然后在适当的时候在各个子群体之间相互交换信息,即让一部分个体在不同子群体中迁移。各个子群体分配到各自的处理器节点进行遗传算子操作。这种模型适合于分布式存储结构的s1MD和MIMD处理器机。按照迁移的拓扑结构可分为环形迁移、相邻迁移和网络迁移模型;如果拥有足够多的处理器,则可进行细粒度并行,即在每个处理机上进行单个个体的交叉、变异等遗传算子操作L1…。

3.2基于GPU体系结构的遗传算法优化

目前,在GPU上对遗传算法的性能优化方法有两种:CUDA平台和openGL平台。

在非统一架构的GPU上,WongM-L、WongT-T用openGL对遗传算法进行优化[2]。本文基于遗传算法的性

能考虑,针对GPU统一架构的特点,从以下几个方面设计遗传算法:

(1)针对访问全局内存时需对齐访问的特点,设计合适的并行计算模型。根据GPU体系结构CUDA平台SIMD的特点,将遗传算法的分解型并行方法做如下改进,为提高G】PU的并行速度,在访问全局内存时,尽量要保持对齐访问[1¨,因而在环形迁移的基础.h,形成一种向前顺序迁移方式,结合细粒度并行模型形成如图4所示的拓扑结构。本文利用一个线程来计算一个染色体的适应度的值,用一个线程块来做为一个子群体,达到所给的迁移条件后,再进行块间通信,将最好的几个个体做块间迁移操作。算法流程如图5所示。

线程块1

O∞卜_——.{线程块2

02)O

线程块6∞O

线程块3

O。。

t●

线程块5OOOI.——一线程块4CX2)O

—---------------J

网匿网网面圃团西圃函蚕丽石网蚕弱隔蕈翮…际两习

共享存储器

图4

CUDA平台上的细粒度并行

(2)对于GPU共享内存中的体冲突问题,优化求和算法、扫描算法、排序算法[12 ̄14]详细描述优化算法的细节。

(3)为应对分支对性能的影响,在算法设计时,尽量减少分支结构。

(4)标准遗传算法是不能收敛至最优解的。为了使遗

传算法的结果尽量收敛至最优解,本文算法对标准遗传算

;s孔幻挖引∞悖堪

一裁蹿

万方数据

图5算法流程图

法进行下列优化。在进化过程中,每一代中每个子群体的最优个体不参与遗传算子操作,即不交叉,不变异;根据优秀的父母会有优秀的子女的遗传规律,在交叉配对七,对配对的父母做了限制,即在配对的过程中,每个染色体只在群体中的中上等染色体中找自己的配对对象。每个子群中,每一次进化都按一定的比例淘汰差生[15]。

3.3实验结果

遗传算法中,需要用随机数来进行初始化群体和决定是否交叉、变异。并决定交叉和变异的位置。使用2.3节中的结果,在遗传算法中,选择用线性同余的方法并行产生随机数。

本文实验采用下列三个函数来验证上述算法思想:

九=≥:z!,z∈[-1,loo],fm=0(6)

.工矗‘

三_三

尼=>:{100(五+1一彳)2+叠1),

z‘。z—l

工∈(一30,30),/o=0

(7)

011

届=>:(Z一10cos(2艋f)+10),

工∈(一5.12,5.12),‰=0

(8)

下列实验结果图所示的本文算法曲线的所有遗传操作

都是在GPU上进行。

图6所示是验证函数在不同群体大小时,基于CUDA平台获得的性能曲线图,图中加速比计算以MATLAB为基准。曲线趋势表明,在CUDA平台上用本文提出的方法要比在MATI.AB遗传算法工具箱中性能平均高600倍。随着群体规模的增大,加速比增大,但是当总群体大于

20

480时,加速比不再增长。这是因为在总群体大小比较

小时,并没有完全利用GPU中的全部硬件资源。为了充分利用GPU的资源,图中的数据根据图中总群体大小手动改变子群体的大小,因此在总群体为4608时出现折点。图7所示是不同遗传代数对加速比的影响。

图6遗传代数为1000时性能图

图8、图9分别表示群体规模和遗传代数对准确度的

影响趋势,从图中可以看出,本文的优化算法取得了较好的

结果。对于函数月,在GPU上的执行效果很好,几乎是最优解,误差是lO.14(图中没有显示),因为门函数的搜索

区间较小,因此缩短函数自变量宅间是在GPU上得到较好的结果的方法之一。从图8中可以看到,增加遗传代数,精确度得到一定的提高,但是其能力有限,当遗传代数大于

500时,增加遗传代数对寻找最优解并不起作用。从图9

中可以看到,增加群体大小同样能减少误差。遗传代数和群体规模都能减少误差,但同样地要增加时间,但增加群体

规模更有利于得到最优解。

k东兰兰

伊■9j

遗传代数

图7群体大小为10240时性能图

嚣馨

图8群体大小为10240精确度

图9遗传代数为1000时精确度

3.4结果分析

上述实验只是反应一种趋势,因为在其随机数种子中加入了时间因子,每次运行的结果与MATLAB工具箱中的结果同样不可复现。另一方面因准确度与算子和参数的设置密切相关,为了得到客观的比较结果,本文使用的交叉和变异算子其参数与MATLAB遗传算法工具箱的算子参数设置一致。为此,使用MATLAB中遗传算法工具箱作为遗传算法结果的准确度、速度标准以及算子设计标准。因此,对MATLAB中的遗传算子进行优化改进,使其更好地适应GPU体系结构。这种改进影响了最终数据的准确性和处理时间。在此算法中,MATLAB工

具箱中算法设置为排序选择,单点交叉,单点变异,交叉概率为0.9,变异概率为0.1,EliteCOUrlt为1,interval为10,定标算法fit—

nessscalingrank,?unifo朋选择。

同时,遗传算法并行模型中的并行参数还有迁移个数

71

万方数据

和迁移间隔代数。在本文程序实现的基础上,针对迁移间隔和迁移染色体的数量对准确度和时间的影响做了大量的实验。在CUDA平台上,迁移阳】隔的大小对时间和结果的影响很大,间隔越大,所用时间相对较少,但是对于最优的扩散能力有限;迁移间隔越小,即迁移越频繁,所用时间越多,但会加速最优解的扩散,也就是说,能在较少的代数内得到一个比较优的解。

4结束语

遗传算法的最终结果依赖于牛成的随机数是否服从其解空间的分布,比如用高斯分布所得到的结果在对称区间内能得到比较好的结果,但是在非称Ⅸ域寻优能力则一般,针对这个问题,本文因此选择均匀选择来优化。本文充分利用和发挥GPU共享内存的优势从而得到很好的加速比,但是对于一些复杂的二次规划或是当染色体长度疗大于40时,这种加速比则肯定会下降,至于会降至多少,这将是我们将来要研究的内容。

参考文献:

[1]吉根林.遗传算法研究综述口].计算机应用与软件,2004,

21(2):69—73.

[2]WongM-L,Wong1。T.ParalMHybridGeneticAlgorithms

on

ConsumerLevelGraphicsHardware

EJ].IEEE,2006,21

(16):2972—2980.

[3]辛茜,曾晓洋,张国权,等.真随机数发生器的系统建模与仿

真[j].系统仿真学报,2005.17(1):53—56.

[4]杨振海,程维虎.非均匀数随机数的产生口].数理统计与管

理。2006,25(6):751-756.

[5]龚纯,王正林.MATI。AB语言常用算法程序集[M].北京:

电子工业出,2008:364—393.

[6]马华,张晓清,张鹏鸽.一种基于线性同余算法的伪随机数产

生器[J].纯粹数学与应用数学,2005。21(3):206—209.

[7]刘勇,康立山,陈毓屏.非数值并行算法——遗传算法[M].

北京:科学出版社,1995.

[8]王鹏,吕爽,聂治,等.并行计算应用及实战[M].北京:机械

工业出版社,2008.

[9]陈国良,王煦法,庄镇泉,等.遗传算法及其应用[M].北京:

人民邮电出版社,1996.

[10]陈宝国.并行化遗传算法研究[J].淮南师范学院学报,

2008。10(3):124-126.

[11]John

DO,DavidL,Naga,etaLASurveyofGeneral—Pur-pose

Computation

oll

GraphicsHardware[J].Computer

GraphicsForum,2007,26(1):80-113.

[12]Michael

G,ScottL

G,John

N,etaLParallel

Computing

ExperienceswithCUDA[J].IEEEComputerSociety,2008

(1):0272-1732.

[13]KiderJrJT-GPUas

Parallel

Machine:Sorting

oil

the

GPU[C]}}ProcofCIS’05,2005.

[14]HornnStreamReductionOperationsforGPGPUAppliea—

tions.GPUGems

2rM].Pharr,Ed:AddisonWesler.2005.[15]雷英杰.Matlab遗传算法工具箱及其应用[M].西安:西安

电子科技大学出版社,2005.72

(上接第51页)

向下递归到最大Rank层的Leaf交换机时,向下递归结束。依此类推,所有的Switch到cn01的路由就设置完成了,如图7所示。

图7所有Switch到en01上的路由

4.相关改进

4.1胖树路由算法的应用条件

遗传算法并行化的研究.doc

遗传算法并行化的研究 学号:SC02011036 姓名:黄鑫 摘要 本文是针对遗传算法并行化进行了研究,首先简要给出了基本遗传算法的形式化描述,然后做了并行性的分析,详细介绍了遗传算法的结构化并行模型:步进模型,岛屿模型,邻接模型,最后指出了进一步要研究的课题。 关键词:遗传算法,并行计算,结构化GA 1引言 遗传算法(GA)是根据达尔文进化论“优胜劣汰,适者生存”的一种启发式搜索算法。采用选择,交叉,变异等基本变化算子在解空间同时进行多点搜索,本身固有并行性。随着大规模并行机的迅速发展,将并行机的高速性与遗传算法并行性结合起来,从而促进遗传算法的发展。然而,仅仅将基本遗传算法硬件并行化伴随着大量通讯开销等问题,从而必须对标准GA的进行改进,使得并行遗传算法不单单是遗传算法硬件并行实现,更重要的是结构化的遗传算法。本文首先给出了GA形式化描述,对基本GA的可并行性做出分析,然后给出了并行GA的模型,最后指出了并行遗传算法还需要解决的问题。 2 基本遗传算法 在这里我们不对遗传算法做过多的介绍,只是给出基本遗传算法的形式化描述:begin (1)initialization (1.1)产生一个初始群体 (1.2)评估第一代整个群体的适应度值 (2)while running do (2.1)选择父代 (2.2)交叉操作 (2.3)子代变异 (2.4)评估子代的适应度 (2.5)子代取代父代,形成新的一带个体 endwhile end 3 遗传算法的并行性分析 从第一节对遗传算法的描述,我们可以看出基本遗传算法模型是一个反复迭代的进化计算过程,通过对一组表示候选解的个体进行评价、选择、交叉、变异等操作,来产生新一代的个体(候选解),这个迭代过程直到满足某种结束条件为止。对应于基本遗传算法的运行过程,为实现其并行化要求,可以从下面四种并行性方面着手对其进行改进和发展。 并行性Ⅰ:个体适应度评价的并行性。 个体适应度的评价在遗传算法中占用的运行时间比较大。通过对适应度并行计算方法的研究,可提高个体适应度评价的计算效率。 并行性Ⅱ:整个群体各个个体适应度评价的并行性。

2014-2015-并行程序设计期末考试卷

中 国 科 学 技 术 大 学 2014-2015学年第一学期考试试卷 考试科目: 并行程序设计 得分:___ ______ 学生所在系:______ _____ 姓名:____ _ _ 学号:_ ____ ______ 一、 分析以下3个循环中存在的依赖关系;分别通过循环交换、分布 和逆转等多种方法来尝试向量化和/或并行化变换:(3×10=30分) p 的二维 拓扑结构,并且将各个行或列进程组划分为单独的子通信域。这样,root 进程可先在其行子通信域中进行广播,然后该行中的所有进程在各自的列通信子域中再广播。给出该广播方案的MPI 具体实现。(20分)

三、设有两个进程A和B,以及结构变量stu。现在,进程A将stu发 送给进程B。请用三种不同的MPI实现来完成进程A的发送操作。(3×10=30分) struct Student {int id; char name[10];double mark[3]; char pass; } stu; 四、以下是单处理器上的矩阵求逆算法: Begin for i=1 to n do (1) a[i,i]=1/a[i,i] (2)for j=1 to n do if (j≠i) then a[i,j]=a[i,j]*a[i,i] end if end for (3)for k=1 to n do for j=1 to n do if ((k≠i and j≠i)) then a[k,j]=a[k,j]-a[k,i]*a[i,j] end if end for end for (4)for k=1 to n do if (k≠i) then a[k,i]= -a[k,i]*a[i,i] end if end for end for End 矩阵求逆的过程中,依次利用主行i(i=0,1,…,n-1)对其余各行j(j≠i)作初等行变换,由于各行计算之间没有数据相关关系,因此可以对矩阵A按行划分来实现并行计算。考虑到在计算过程中处理器之间的负载均衡,对A采用行交叉划分:设处理器个数为p,矩阵A的阶数为n,??p =,对矩阵A行交叉划分后,编号为i(i=0,1,…,p-1)的处理器存有A的第i, i+p,…, i+(m-1)p n m/ 行。在计算中,依次将第0,1,…,n-1行作为主行,将其广播给所有处理器,这实际上是各处理器轮流选出主行并广播。发送主行数据的处理器利用主行对其主行之外的m-1行行向量做行变换,其余处理器则利用主行对其m行行向量做行变换。 请写出矩阵求逆算法的MPI并行实现。(20分)

OpenCV环境下CUDA编程示例

OpenCV环境下CUDA编程示例 在CUDA平台上对图像算法进行并行加速是目前并行计算方面比较简单易行的一种方式,而同时利用OpenCV提供的一些库函数的话,那么事情将会变得更加easy。以下是我个人采用的一种模板,这个模板是从OpenCV里的算法CUDA源码挖掘出来的,我感觉这个用起来比较傲方便,所以经常采用。首先大牛们写的源码都很鲁棒,考虑的比较全面(如大部分算法将1,3,4通道的图像同时搞定),感觉还有一个比较神奇的地方在于CPU端GpuMat和GPU端PtrStepSzb的转换,让我欲罢不能,一个不太理想的地方在于第一帧的初始化时间比较长,应该是CPU到GPU的数据传输。代码中有考虑流,但貌似没有使用。 我使用的是赵开勇的CUDA_VS_Wizard,主函数还是用的cu文件。以下代码是对Vibe背景建模算法的并行,背景建模算法是目前接触到易于并行的一类,如GMM等,而且加速效果不错,因为一个线程执行的数据就是对应一个像素点。 代码如下: sample.cu [cpp] view plaincopy<span

style="font-size:14px;">/***************************** *************************************** * sample.cu * This is a example of the CUDA program. *************************************************** ******************/ #include <stdio.h> #include <stdlib.h> #include <cutil_inline.h> #include <iostream> #include <string> #include "opencv2/core/core.hpp" #include "opencv2/gpu/gpu.hpp" #include "opencv2/highgui/highgui.hpp" #include "Vibe_M_kernel.cu" #include "Vibe_M.h" using namespace std; using namespace cv; using namespace cv::gpu; enum Method { FGD_STAT, MOG, MOG2, VIBE, GMG }; int main(int argc, const char** argv) { cv::CommandLineParser cmd(argc, argv, "{ c | camera | flase | use camera }" "{ f | file | 768x576.avi | input video file }" "{ m | method | vibe | method (fgd, mog, mog2, vibe, gmg) }" "{ h | help | false | print help message }"); if (cmd.get<bool>("help")) { cout << "Usage : bgfg_segm [options]" << endl; cout << "Avaible options:" << endl; cmd.printParams(); return

遗传算法与优化问题

实验十遗传算法与优化问题 一、问题背景与实验目的 遗传算法(Genetic Algorithm —GA),就是模拟达尔文的遗传选择与自然淘汰的生物进化过程的计算模型,它就是由美国Michigan大学的J、Holla nd教授于1975 年首先提出的?遗传算法作为一种新的全局优化搜索算法,以其简单通用、鲁棒性强、适于并行处理及应用范围广等显著特点,奠定了它作为21世纪关键智能计算之一的地位. 本实验将首先介绍一下遗传算法的基本理论,然后用其解决几个简单的函数最值问题,使读者能够学会利用遗传算法进行初步的优化计算? 1. 遗传算法的基本原理 遗传算法的基本思想正就是基于模仿生物界遗传学的遗传过程?它把问题的参数用基因代表,把问题的解用染色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群体?这个群体在问题特定的环境里生存 竞争,适者有最好的机会生存与产生后代?后代随机化地继承了父代的最好特征,并也在生存环境的控制支配下继续这一过程.群体的染色体都将逐渐适应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题最优的解?值得注意的一点就是,现在的遗传算法就是受生物进化论学说的启发提出的,这种学说对我们用计算机解决复杂问题很有用,而它本身就是否完全正确并不重要(目前生物界对此学说尚有争议). (1)遗传算法中的生物遗传学概念 由于遗传算法就是由进化论与遗传学机理而产生的直接搜索优化方法;故而 在这个算法中要用到各种进化与遗传学的概念? 首先给出遗传学概念、遗传算法概念与相应的数学概念三者之间的对应关系这些概念

(2)遗传算法的步骤 遗传算法计算优化的操作过程就如同生物学上生物遗传进化的过程,主要有三个基本操作(或称为算子):选择(Selection)、交叉(Crossover)、变异(Mutation). 遗传算法基本步骤主要就是:先把问题的解表示成“染色体”,在算法中也就就是以二进制编码的串,在执行遗传算法之前,给出一群“染色体”,也就就是假设的可行解.然后,把这些假设的可行解置于问题的“环境”中,并按适者生存的原则从中选 择出较适应环境的“染色体”进行复制 ,再通过交叉、变异过程产生更适 应环境的新一代“染色体”群.经过这样的一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就就是问题的最优解. 下面给出遗传算法的具体步骤,流程图参见图1: 第一步:选择编码策略,把参数集合(可行解集合)转换染色体结构空间; 第二步:定义适应函数,便于计算适应值; 第三步:确定遗传策略,包括选择群体大小,选择、交叉、变异方法以及确定交叉概率、变异概率等遗传参数; 第四步:随机产生初始化群体; 第五步:计算群体中的个体或染色体解码后的适应值; 第六步:按照遗传策略,运用选择、交叉与变异算子作用于群体,形成下一代群体; 第七步:判断群体性能就是否满足某一指标、或者就是否已完成预定的迭代次数,不满足则返回第五步、或者修改遗传策略再返回第六步. 图1 一个遗传算法的具体步骤

MPI并行程序设计实例教程

编辑推荐 ◆书中内容侧重于以MPI库为基础开发并行应用程序,对MP规范定义的各项功能和特征在阐述其特点基础上均配以实例加以说明和印证。 ◆书中所附实例尽量采用独立的功能划分,其中的代码片段可直接用于并行应用程序开发 ◆在讲述基本原理的同时,注重对各项消息传递和管理操作的功能及局限性、适用性进行分析从而使熟读此书的读者能够编写出适合应用特点,易维护、高效率的并行程序。 ◆与本书配套的电子教案可在清华大学出版社网站下载。 本书简介 本书旨在通过示例全面介绍MP1并行程序开发库的使用方法、程序设计技巧等方面的内容,力争完整讨论MP1规范所定义的各种特征。主要也括MPI环境下开发并行程序常用的方法、模式、技巧等 内容。在内容组织上力求全面综合地反映MPl-1和MPI-2规范。对MPI所定义的各种功能、特征分别

给出可验证和测试其工作细节的示例程序 目录 第1章 MPI并行环境及编程模型  1.1 MPICH2环境及安装和测试 1.1.1 编译及安装 1.1.2 配置及验汪 1.1.3 应用程序的编译、链接 1.1.4 运行及调试 1.1.5 MPD中的安全问题  1.2 MPI环境编程模型 1.2.1 并行系统介绍 1.2.2 并行编程模式 1.2.3 MPI程序工作模式  1.3 MPI消息传递通信的基本概念 1.3.1 消息 1.3.2 缓冲区 1.3.3 通信子 1.3.4 进样号和进程纰 1.3.5 通价胁议 1.3.6 隐形对象 第2章 点到点通信  2.1 阻糍通信 2.1.1 标准通信模式 2.1.2 缓冲通信模式 2.1.3 就绪通信模式 2.1.4 同步通信模式 2.1.5 小结  2.2 非阻塞通信 2.2.1 通信结束测试 2.2.2 非重复的非阻塞通信 2.2.3 可醺复的非阻塞通信 2.2.4 Probe和Cancel  2.3 组合发送接收 2.3.1 MPl_Send,MPI_RecvoMPl_Sendreev 2.3.2 MPI_Bsend←→MPl_Sendrecv 2.3.3 MPI_Rsend←→MPI_Sendrecv 2.3.4 MPl_Ssend←→MPl_Sendrecv 2.3.5 MPl_lsend←→MP1一Sendrecv 2.3.6 MPl_Ibsend←→MPI_Sendrecv 2.3.7 MPI_Irsend←→MPI_Sendrecv 2.3.8 MPl_Issend,MPI_Irecv←→MPI_Sendrecv 2.3.9 MPI Send_init←→MPl_Sendrecv 2.3.10 MPI一Bsendj init←→MPl_Sendrecv 2.3.11 MPI_Rsend_init←→MPI_Sendrecv 2.3.12 MPl_Ssend_init,MPl_Recv_init←→MPl_Sendrecv 2.4 点到点通信总结

并行程序设计

一、并行程序开发策略 1.自动并行化:有目的地稍许修改源代码 2.调用并行库:开发并行库 3.重新编写并行代码:对源代码做重大修改 二、并行编程模式 1.主从模式(任务播种模式):将待求解的任务分成一个主任务(主进程)和一些子任务 (子进程)。所考虑的因素是负载均衡,一般可以采用静态分配和动态分配两种方法。 2.单程序流多数据流(SPMD):并行进程执行相同的代码段,但操作不同的数据。 3.数据流水线:将各个计算进程组成一条流水线,每个进程执行一个特定的计算任务。 4.分治策略:将一个大而复杂的问题分解成若干个特性相同的子问题。 三、并行程序的编程过程(PCAM过程) 1.任务划分(Partitioning) 2.通信分析(Communication) 3.任务组合(Agglomeration):增加粒度和保持灵活性 4.处理器映射(Mapping):映射策略、负载均衡、任务的分配与调度(静态和动态) 动态调度:基本自调度(SS)、块自调度(BSS)、指导自调度(GSS)、因子分解调度(FS)、梯形自调度(TSS)、耦合调度(AS)、安全自调度(SSS)、自适应耦合调度(AAS) 串匹配问题是计算机科学中的一个基本问题,在文字编辑、图像处理等利于都得到了广泛的应用,串匹配算法在这些应用中起到至关重要的作用。因此研究快速的串匹配算法具有重要的理论和实际意义。 KMP是一种改进的字符串模式匹配的算法,他能够在o(m+n)时间复杂度内完成字符串的模式匹配算法。本文将详细的介绍KMP算法的思想,串行及并行实现。 一、KMP算法思想 1、问题描述 给定主串S[0...n-1]、模式串T[0...m-1],其中m<=n。在主串S中找出所有模式串T的起始位置。 2、算法思想 令指针i指向主串S,指针j指向模式串T中当前正在比较的位置。令指针i和指针j指向的字符比较之,如两字符相等,则顺次比较后面的字符;如不相等,则指针i不动,回溯指针j,令其指向模式串T的第pos个字符,使T[0...pos-1] == S[i-pos, i-1],然后,指针i和指针j所指向的字符按此种方法继续比较,知道j == m-1,即在主串S中找到模式串T为止。 从算法的思想思想中我们可以看出,其算法的难点在于如何求出指针j的回溯值,即:当指针j回溯时,j将指向的位置,我们几位next[j]。下面我们首先对kmp的算法做出详细的描述。 二、KMP算法描述 输入:主串S[0...n-1], 模式串T[0...m-1] 输出:m[0...n-1],当m[i] = 1时,则主串S中匹配到模式串,且i为起始位置 begin i = 0;j = 0; while(i < n) if(S[i] != T[j])

遗传算法概述

第1期作者简介:李红梅(1978-),女,湖南湘潭人,硕士,广东白云学院讲师,研究方向为演化计算。 1遗传算法的发展史 遗传算法(Genetic Algorithms )研究的历史比较短,20世纪 60年代末期到70年代初期,主要由美国家Michigan 大学的John Holland 与其同事、学生们研究形成了一个较完整的理论 和方法,遗传算法作为具有系统优化、适应和学习的高性能计算和建模方法的研究渐趋成熟。我国对于GA 的研究起步较晚,不过从20世纪90年代以来一直处于不断上升中。 2遗传算法的基本思想 遗传算法是从代表问题可能潜在解集的一个种群(popu- lation )开始的,而一个种群则由经过基因(gene )编码(coding ) 的一定数目的个体(individual )组成。每个个体实际上是染色体(chromosome )带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现是某种基因组合,它决定了个体的形状的外部表现。初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation )演化产生出越来越好的近似解。在每一代中,根据问题域中个体的适应度(fitness )、大小挑选(selection )个体,借助于自然遗传学的遗传算子(genetic operators )进行组合交叉(crossover )和变异(mutation ),产生出代 表新的解集的种群。这个过程将导致后生代种群比前代更加适应环境,末代种群中的最优个体经过解码(decoding ),可以作为问题近似最优解。 3遗传算法的一般流程 (1)随机产生一定数目的初始种群,每个个体表示为染色 体的基因编码; (2)计算每个个体的适应度,并判断是否符合优化准则。若符合,输出最佳个体及其代表的最优解并结束计算,否则转向第3步; (3)依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体可能被淘汰; (4)执行交叉和变异操作,生成新的个体;(5)得到新一代的种群,返回到第2步。 4遗传算法的特点 传统的优化方法主要有三种:枚举法、启发式算法和搜索 算法: (1)枚举法 可行解集合内的所有可行解,以求出精确最 优解。对于连续函数,该方法要求先对其进行离散化处理,这样就可能因离散处理而永远达不到最优解。此外,当枚举空间比较大时,该方法的求解效率比较低,有时甚至在目前先进计算机工具上无法求解。 (2)启发式算法 寻求一种能产生可行解的启发式规则, 以找到一个最优解或近似最优解。该方法的求解效率比较高,但对每一个需求解的问题必须找出其特有的启发式规则。这个启发式规则一般无通用性,不适合于其它问题。 (3)搜索算法 寻求一种搜索算法,该算法在可行解集合 的一个子集内进行搜索操作,以找到问题的最优解或者近似最优解。该方法虽然保证不了一定能够得到问题的最优解,但若适当地利用一些启发知识,就可在近似解的质量和效率上达到一种较好的平衡。 遗传算法不同于传统的搜索和优化方法。主要区别在于: ①遗传算法直接处理问题参数的适当编码而不是处理参数集 本身。②遗传算法按并行方式搜索一个种群数目的点,而不是 遗传算法概述 李红梅 (广东白云学院计算机系,广东广州510450) 摘要:遗传算法是一种全局优化的随机搜索算法。它是解决复杂优化问题的有力工具。在工程设计、演化硬件电路 设计以及人工智能等方面应用前景广阔。系统地介绍了遗传算法的发展史、基本思想、特点、主要应用领域等相关方 面。 关键词:遗传算法;搜索;进化;最优解;种群中图分类号:TP312 文献标识码:A 文章编号:1672-7800(2009)01-0067-02 第8卷第1期2009年1月 Vol.8No.1Jan.2009 软件导刊 Software Guide

CUDA编程探讨

CUDA编程探讨 12 王 欣,王 宁 (1、无锡职业技术学院, 江苏 无锡 214073; 2、黄河水利职业技术学院, 河南 开封 475002) 【摘要】本文简要探讨了CUDA编程,并指出了其中需要注意的地方。 【关键词】GPGPU;CUDA 过程中没有warp的概念,warp对于程序员是透明的,这一层 一、引言 目前业界对多核处理器的研究主要分为两个方面:通用次的线程调度完全由硬件实现。 多核处理器和多用众核处理器。前者以Intel和AMD公司为代线程块:线程块是可以协同工作的一批线程,它们通过表,将多个传统通用处理器核心集成在单芯片内,构成片上高速共享内存有效的共享数据,并同步其执行以协调访存。多处理器(Chip Multi-Processor, CMP);后者以NVIDIA和更准确地说,用户可以在内核中指定同步点,块中的线程在ATI公司为代表,将大量轻量级核心集成在单芯片内,构成全部到达此同步点时挂起。 支持通用计算的图形处理器(General-Purpose Compution on 每个线程由线程ID(Thread ID)标识,这是块中的线程Graphics Processing Units, GPGPU)。GPGPU将更多的晶体管号。为了帮助基于线程ID的复杂寻址,应用程序还可以将块专用于数据处理,在多个核心和高存储带宽的配合下,具备指定为任意大小的二维或三维数组,并使用2个或3个索引来了超高的计算能力,十分适于计算密集型和高度并行的计标识每个线程。对于大小为(Dx,Dy )的二维块,索引为算。(x,y)的线程ID为(x+y Dx),对于大小为(Dx,Dy, 二、GPU简介Dz)的三维块,索引(x,y,z)的线程ID为(x+y Dx +z Dx GPU就是我们平时所说的“显卡”。众所周知,图形显Dy)。 示计算需要大量的并行运算,以显示每一个点在不同光线,2、GPU编程实例 不同角度所显示的颜色、明暗效果。因此,GPU将更多的晶__global__ void increment_gpu(float *a, float b) 体管专用于数据处理,而非数据高速缓存(cache)和流控{ 制(flow),更加适于计算密集型和高度并行的计算。使用int idx=blockIdx.x*blockDim.x+threadIdx.x; GPU作为计算部件基于以下两个原因:a[idx]=a[idx]+b; * 高性价比:目前,GPU的计算能力远远超过了CPU,} 举例来看,NVIDIA GeForce 9800GTX+理论上拥有void main() 235.52GFlops的计算能力,而使用SSE结构的奔腾IV处理器{ 仅仅为6GFlops。… * 性能增长快:在游戏市场繁荣的今天,GPU的性能增dim3 dimThread(threadsize); 长是CPU无法比拟的,与摩尔定律不同的是,GPU自1993年dim3 dimBlock(N/ threadsize); 以来,就以每年2.8倍的速度增长。increment_gpu<<< dimBlock, dimThread >>>(a,b); 由于GPU强大的计算能力,人们已经把GPU的使用范围} 从原来单一的图形计算,扩展到科学计算与试验中,如模拟其中,__global__关键字是CUDA对C语言的扩展,表示物理实验,线形方程求解,快速傅里叶变换,复杂的几何学本函数可以被CPU函数调用,但在GPU上执行; 问题,以及非传统的图形计算问题等等。blockIdx.x, blockDim.x, threadIdx.x均是内置的变量,用于 三、GPU编程模型——CUDA表示本线程的block号,block中线程数以及在某个block中的 CUDA(Compute Unified Device Architecture,统一计算线程号; 设备架构)是NVIDIA公司开发的一种GPU计算的新架构,increment_gpu函数实现的功能是:本线程将数组a中第是一种新型的硬件和软件架构,它将GPU视为数据并行计算线程号个元素加b,这样当整个程序执行完毕后,数组a中前设备,在其上进行计算的分配和管理,而无需将其映射到图N个数字将被加上b,其中N是dim3 dimBlock(N/threadsize)中形API。它可用于NVIDIA公司的GeForce8系列、Tesla解决方出现的N; 案和一些Quadro解决方案。操作系统的多任务机制负责管理在main函数中,increment_gpu被称为“kernel函数”,多个并发运行的CUDA应用程序和图形应用程序对GPU的访而increment_gpu<<>>(a,b)也是CUDA对问。CUDA软件堆栈由几层组成:硬件驱动程序,应用编程C语言的扩展,实现GPU kernel函数的调用。 接口(API)及其运行时(runtime),以及两个更高层的通3、GPU编程特点 用数学库CUFFT和CUBLAS。其使用的编程语言是C++语言虽然CUDA使用C语言作为用户编程语言,然而为达到中C语言子集的扩展集。GPU设备最大的利用率,编程时还必须注意GPU底层的硬件 1、GPU编程的逻辑结构结构: 通过CUDA编程时,将GPU看作可以并行执行非常多个* 由于shared memory被集成在芯片上,所以访存速度线程的计算设备(compute device)。快,然而大小有限,且过多使用会影响每次kernel函数调用作为CPU(或被称为宿主,host)的协处理器运作。换时并发的线程数。 句话说,在宿主上运行的应用程序中,数据并行的、计算密* global memory容量大,一般在几百兆,然而访存速度集型的部分被装载道协处理器设备上。更准确的说,应用程很慢,所需时间是shared memory的上百倍,过多使用,可能序中要执行多次,但要在不同数据上执行的部分可以被独立会使执行每个线程所需时间变长。 安排在此设备上,使用不同线程运行。要达到这种效果,可* 相比定点计算,GPU更擅长浮点运算,但由于硬件原将该函数编译到设备的指令集中,装载到设备上。因,其计算精度与IEEE所规定的精度不同。 宿主和设备都保留自己的DRAM,分别称为宿主内存最后,由于编译器尚处于不成熟的阶段,对于过于复杂(host memory)和设备内存(device memory)。用户可以通的宏,可能会出现编译不通过的现象。 过API调用将数据从一个DRAM复制到另一个DRAM中。四、总结 GPU依靠这种方式从外设读取数据。本文简要介绍了CUDA编程,通过利用GPU为计算机加执行内核(kernel)的一批线程组成线程块(block),速,能使得计算速度有显著提升,如再辅以其他网格技术,再由线程块组成网格(grid)。这里的block与grid和硬件结则对于研究和开发实用的高性能计算系统具有重要的参考意构中的block与grid相对应,而与硬件结构不同的是,在编程义。 104

并行程序设计开题

并行程序设计开题报告 院系:信息技术科学学院 成员:王亚光2120100319 田金凤1120100119 题目:串匹配算法KPM和矩阵运算的并行算法实现与分析

1.文献综述 1.1消息传递并行程序设计(MPI)介绍 (1)M assage P assing I nterface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C (2)一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran 和C语言中可以直接对这些函数进行调用 (3)MPI是一种标准或规范的代表,而不是特指某一个对它的具体实 (4)MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准 (5)指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。 (6)在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。 (7)这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。 (8)并行计算粒度大,特别适合于大规模可扩展并行算法,由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法。 (9)消息传递是当前并行计算领域的一个非常重要的并行程序设计方式。 (10)高可移植性。MPI已在IBM PC机上、MS Windows上、所有主要的Unix 工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran 并行程序可不加改变地运行在IBM PC、MS Windows、Unix工作站、以及各种并行机上。 1.2串匹配算法 以字符序列形式出现而且不能将这些字符分成互相独立的关键字的一种数据称之为字符串(Strings)。字符串十分重要、常用的一种操作是串匹配(String Matching)。串匹配分为字符串精确匹配(Exact String Matching)和字符串近似匹配(Approximate String Matching)两大类。字符串匹配技术在正文编辑、文本压缩、数据加密、数据挖掘、图像处理、模式识别、Internet信息搜索、网络入侵检测、网络远程教学、电子商务、生物信息学、计算音乐等领域具有广泛的应用。而且串匹配是这些应用中最好时的核心问题,好的串匹配算法能显著的提高应用的效率。因此研究并设计快速的串匹配算法具有重要的理论价值和实际意义。 串匹配问题实际上就是一种模式匹配问题,即在给定的文本串中找出与模式串匹配的子串的起始位置。本文对已有的基于分布存储系统上的并行的串匹配算法(KMP)进行了分析和实现,并与串行的算法进行了比较。KMP算法首先是由D.E. Knuth、J.H. Morris以及V.R. Pratt分别设计出来的,所以该算法被命名为KMP算法。KMP串匹配算法的基本思想是:对给出的文本串T[1,n]与模式串P[1,m],假设在模式匹配的进程中,执行T[i]和P[j]的匹配检查。若T[i]=P[j],则继续检查T[i+1]和P[j+1]是否匹配。若T[i]≠P[j],则分成两种情况:若j=1,则模式串右移一位,检查T[i+1]和P[1]是否匹配;若1

并行遗传算法

并行遗传算法及其应用 1、遗传算法(GA)概述 GA是一类基于自然选择和遗传学原理的有效搜索方法,它从一个种群开始,利用选择、交叉、变异等遗传算子对种群进行不断进化,最后得到全局最优解。生物遗传物质的主要载体是染色体,在GA中同样将问题的求解表示成“染色体Chromosome”,通常是二进制字符串表示,其本身不一定是解。首先,随机产生一定数据的初始染色体,这些随机产生的染色体组成一个种群(Population),种群中染色体的数目称为种群的大小或者种群规模。第二:用适值度函数来评价每一个染色体的优劣,即染色体对环境的适应程度,用来作为以后遗传操作的依据。第三:进行选择(Selection),选择过程的目的是为了从当前种群中选出优良的染色体,通过选择过程,产生一个新的种群。第四:对这个新的种群进行交叉操作,变异操作。交叉、变异操作的目的是挖掘种群中个体的多样性,避免有可能陷入局部解。经过上述运算产生的染色体称为后代。最后,对新的种群(即后代)重复进行选择、交叉和变异操作,经过给定次数的迭代处理以后,把最好的染色体作为优化问题的最优解。 GA通常包含5个基本要素:1、参数编码:GA是采用问题参数的编码集进行工作的,而不是采用问题参数本身,通常选择二进制编码。2、初始种群设定:GA随机产生一个由N个染色体组成的初始种群(Population),也可根据一定的限制条件来产生。种群规模是指种群中所含染色体的数目。3、适值度函数的设定:适值度函数是用来区分种群中个体好坏的标准,是进行选择的唯一依据。目前主要通过目标函数映射成适值度函数。4、遗传操作设计:遗传算子是模拟生物基因遗传的操作,遗传操作的任务是对种群的个体按照它们对环境的适应的程度施加一定的算子,从而实现优胜劣汰的进化过程。遗传基本算子包括:选择算子,交叉算子,变异算子和其他高级遗传算子。5、控制参数设定:在GA的应用中,要首先给定一组控制参数:种群规模,杂交率,变异率,进化代数等。 GA的优点是擅长全局搜索,一般来说,对于中小规模的应用问题,能够在许可的范围内获得满意解,对于大规模或超大规模的多变量求解任务则性能较差。另外,GA本身不要求对优化问题的性质做一些深入的数学分析,从而对那些不

遗传算法的并行实现

遗 传 算 法 (基于遗传算法求函数最大值) 指导老师:刘建丽 学号:S201007156 姓名:杨平 班级:研10级1班

遗传算法 一、 遗传算法的基本描述 遗传算法(Genetic Algorithm ,GA )是通过模拟自然界生物进化过程来求解优化问题的一类自组织、自适应的人工智能技术。它主要基于达尔文的自然进化论和孟德尔的遗传变异理论。多数遗传算法的应用是处理一个由许多个体组成的群体,其中每个个体表示问题的一个潜在解。对个体存在一个评估函数来评判其对环境的适应度。为反映适者生存的思想,算法中设计一个选择机制,使得:适应度好的个体有更多的机会生存。在种群的进化过程中,主要存在两种类型的遗传算子:杂交和变异。这些算子作用于个体对应的染色体,产生新的染色体,从而构成下一代种群中的个体。该过程不断进行,直到找到满足精度要求的解,或者达到设定的进化代数。显然,这样的思想适合于现实世界中的一大类问题,因而具有广泛的应用价值。遗传算法的每一次进化过程中的,各个体之间的操作大多可以并列进行,因此,一个非常自然的想法就是将遗传算法并行化,以提高计算速度。本报告中试图得到一个并行遗传算法的框架,并考察并行化之后的一些特性。为简单起见(本来应该考虑更复杂的问题,如TSP 。因时间有些紧张,做如TSP 等复杂问题怕时间不够,做不出来,请老师原谅),考虑的具有问题是:对给定的正整数n 、n 元函数f ,以及定义域D ,求函数f 在D 内的最大值。 二、 串行遗传算法 1. 染色体与适应度函数 对函数优化问题,一个潜在的解就是定义域D 中的一个点011(,,...,)n x x x -,因此,我们只需用一个长度为n 的实数数组来表示一个个体的染色体。由于问题中要求求函数f 的最大值,我们可以以个体所代表点011(,,...,)n x x x -在f 函数下的值来判断该个体的好坏。因此,我们直接用函数f 作为个体的适应度函数。 2. 选择机制 选择是遗传算法中最主要的机制,也是影响遗传算法性能最主要的因素。若选择过程中适应度好的个体生存的概率过大,会造成几个较好的可行解迅速占据种群,从而收敛于局部最优解;反之,若适应度对生存概率的影响过小,则会使算法呈现出纯粹的随机徘徊行为,算法无法收敛。下面我们介绍在实验中所使用的选择机制。

cuda并行计算

随着多核CPU和众核GPU的到来,并行编程已经得到了业界越来越多的重视,CPU-GPU异构程序能够极大提高现有计算机系统的运算性能,对于科学计算等运算密集型程序有着非常重要的意义。 Jetson tk1 GK20a GPU中拥有192个CUDA核(单独的ALU),因此非常适合并行计算,而且数值计算的速度远远优于CPU。CUDA是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口(OpenGL和Direct 3D)来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。 从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动。 开发库是基于CUDA技术所提供的应用开发库。目前CUDA提供了两个标准的数学运算库——CUFFT(离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员在开发库的基础上可以快速、方便的建立起自己的计算应用。 运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。基于CUDA开发的程序代码在实际执行中分为两种,一种是运行在CPU上的宿主代码(Host Code),一种是运行在GPU上的设备代码(Device Code)。不同类型的代码由于其运行的物理位置不同,能够访问到的资源不同,因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分,基本上囊括了所有在GPGPU开发中所需要的功能和能够使用到的资源接口,开发人员可以通过运行期环境的编程接口实现各种类型的计算。 由于目前存在着多种GPU版本的NVidia显卡,不同版本的GPU之间都有不同的差异,因此驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能的。目前基于CUDA 开发的应用必须有NVIDIA CUDA-enable的硬件支持。 一个.cu文件内既包含CPU程序(称为主机程序),也包含GPU程序(称为设备程序)。如何区分主机程序和设备程序?根据声明,凡是挂有“__global__”或者“__device__”前缀的函数,都是在GPU上运行的设备程序,不同的是__global__设备程序可被主机程序调用,而__device__设备程序则只能被设备程序调用。 没有挂任何前缀的函数,都是主机程序。主机程序显示声明可以用__host__前缀。设备程序需要由NVCC进行编译,而主机程序只需要由主机编译器(如VS2008中的cl.exe,Linux上的GCC)。主机程序主要完成设备环境初始化,数据传输等必备过程,设备程序只负责计算。 主机程序中,有一些“cuda”打头的函数,这些都是CUDA Runtime API,即运行时函数,主要负责完成设备的初始化、内存分配、内存拷贝等任务。我们前面第三节用到的函数cudaGetDeviceCount(),cudaGetDeviceProperties(),cudaSetDevice()都是运行时API。 线程并行将线程的概念引申到CUDA程序设计中,我们可以认为线程就是执行CUDA 程序的最小单元,在GPU上每个线程都会运行一次该核函数。但GPU上的线程调度方式与CPU有很大不同。CPU上会有优先级分配,从高到低,同样优先级的可以采用时间片轮转法实现线程调度。GPU上线程没有优先级概念,所有线程机会均等,线程状态只有等待资源和执行两种状态,如果资源未就绪,那么就等待;一旦就绪,立即执行。当GPU资源很充裕时,所有线程都是并发执行的,这样加速效果很接近理论加速比;而GPU资源少于总线程个数时,有一部分线程就会等待前面执行的线程释放资源,从而变为串行化执行。

基于OpenMP+MPI+CUDA并行混合编程的N体问题实现

N-Body问题的并行混合编程实现 Abstract:Multi level SMP cluster programming model is the effective way to increase the computing performance of.SMP cluster from the hardware can be divided into nodes, and nodes within a single processor instruction level parallelism on three layer architecture. Based on the research of parallel programming model based on SMP cluster hardware architecture and SMP cluster hierarchy, realization N-body algorithm in the design of hybrid programming model based on OpenMP+MPI+CUDA. Finally, the program test in dawning W580I cluster, and combined with the method of performance evaluation of multi-core SMP cluster hierarchy programming, the algorithm with the traditional N. Parallel algorithm is performed to compare the execution time and speedup, and the conclusion is drawn. Key words: parallel programming;OpenMP+MPI+CUDA;n-body problem;cluster system 摘要:SMP集群上的多级层次化编程模型是提升计算性能的有效方式。SMP集群从硬件上可以分为节点间、节点内和单个处理器上的指令级并行三层架构。本文在对SMP集群硬件体系结构和SMP集群多层次并行化编程模型的研究基础上,实现N-body问题算法的基于OpenMP+MPI+CUDA的混合编程模型的设计。最后在曙光W580I 机群上进行程序测试,并结合多核SMP集群层次化编程的性能评测方法,将该算法与传统的N体并行算法进行了执行时间与加速比的比较,得出总结性论述。 关键词:并行编程;OpenMP+MPI+CUDA混合编程模型;N体问题;SMP集群1.引言 N-Body模拟问题在天体物理、分子动力学等很多领域都有重要应用。可以描述为一个物理系统中的N个粒子,每对粒子间都存在着相互作用力(万有引力、库仑力等)。它们从一个初始的状态开始,每隔一定的时间步长,由于粒子间的相互作用,粒子的状态会有一个增量,需要对粒子的加速度、速度和位置信息进行更新。N-body的串行算法需要计算N(N-1)次受力,故此算法的时间复杂度为O (n^2)。然而,一般模拟的粒子规模都很大,一个体系中可以包含数百万乃至上千万的粒子,直接计算的话O(N^2)的量级对于任何高性能的单个处理器都是一个难以突破的瓶颈。N体问题从并行化的数据相关性、控制相关性和并行化粒度等方面都是典型的可并行化处理的问题。 对于一些大规模的应用问题,单一处理器计算机远不能满足需求:(1)一些大型复杂科学计算问题对计算精度要求比较高,同时也意味着大的计算量;(2)大量的科学技术和工程问题,对问题的求解有强烈的时效性要求,超过一定的时间结果就毫无意义。因此,出现了并行体系结构计算机和并行编程技术。高性能并行计算(HPC)是求解大规模计算问题的有力手段之一。HPC把计算问题分解成小的计算任务,同时在多个计算单元上执行各个计算任务。 本文基于当前流行的SMP集群硬件体系结构和SMP集群多层次并行化编程

相关文档
最新文档