并行算法與并行程序設計第02章 并行算法_第1頁
并行算法與并行程序設計第02章 并行算法_第2頁
并行算法與并行程序設計第02章 并行算法_第3頁
并行算法與并行程序設計第02章 并行算法_第4頁
并行算法與并行程序設計第02章 并行算法_第5頁
已閱讀5頁,還剩106頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第二章并行算法教師:彭四偉一、問題的并行性把有唯一輸入向量和唯一輸出向量的一個程序段在某一環(huán)境下的一次執(zhí)行稱為一個進程。設有一組程序段A1…An,若{Ai}在n個處理機上同時執(zhí)行的結(jié)果等同于{Ai}以任意順序執(zhí)行的結(jié)果,則稱{Ai}為可并行執(zhí)行的。一、問題的并行性設兩個程序段A、B,如果

(IA∩OB)∪(OA∩IB)∪(OA∩OB)≠Φ,

則稱A和B數(shù)據(jù)相關,否則稱之為數(shù)據(jù)無關。設兩個語句L1和L2,如果

L1的執(zhí)行結(jié)果能夠決定L2是否執(zhí)行,

則稱L2控制相關于L1。一、問題的并行性設兩個程序段A、B,且A先于B,若A與B數(shù)據(jù)相關或控制相關,則稱A是B的父進程。父進程關系可以傳遞,稱為祖先進程。記α(A,B)為A是B的父進程,αT即祖先進程關系。設某一程序P中的進程集合W,于是G=(W,α)可以構(gòu)成一張圖,稱為進程流程圖。A1:x=1A2:y=2A3:s=2*x+yA4:t=x*x*yA5:u=3*s-tA6:v=cos(t)A7:z=u*v+1如下例所示:u,vzA7tvA6s,tuA5x,ytA4x,ysA3yA2xA1輸入輸出進程輸入輸出表如下:A7A7A6A7A5A5,A6A4A5A3A3,A4A2A3,A4A1子進程父進程進程關系表如下:BeginA1A2A3A4A5A6A7End進程流程圖如下:二、并行算法的性能指標對問題規(guī)模n,所動用的處理器的數(shù)目p(n),運行時間或最壞運行時間tp(n)。粒度:并行單元的規(guī)模,通常將循環(huán)級及以下稱為小粒度,子程序級稱為大粒度。工作量Wp(n):Wp(n)=tp(n)*p(n),直觀上即模擬該并行算法的串行算法的計算量。工作量越小,算法的性能越好。如果對同一問題,并行算法A與串行算法B的工作量同階,稱A對B工作量有效,若A對最壞情況下的最優(yōu)算法B工作量有效,稱A工作量有效。加速比Sp(n):Sp(n)=ts(n)/tp(n),其中ts(n)是解同一問題在最壞情況下的最優(yōu)串行算法的運行時間。加速比反映運行時間的改進倍數(shù)。由于并行算法可以用串行算法來模擬,模擬的串行算法的運行時間不超過p(n)*tp(n),所以有1≤Sp(n)≤p(n)。工作效率Ep(n):Ep(n)=Sp(n)/p(n),反映算法所占用的處理器的工作效率,即工作飽滿程度。工作效率越高,算法的性能越好。由1≤Sp(n)≤p(n),有1/p(n)≤Ep(n)≤1。三、并行求和倍增法求和倍增法是并行分治的一種簡化形式。其基本思想是將原問題反復分解為等規(guī)模的兩個子問題,在逐步分解的過程中,子問題個數(shù)成倍增加。將各個子問題恰當?shù)赜成涞礁髋_處理機上,即可實現(xiàn)計算過程的并行化。intPSum(intL[],ints,intt){if(s==t)returnL[s];intk=(s+t)/2;returnPSum(L,s,k)+PSum(L,k+1,t);}三、并行求和倍增法求和計算序列L[0..n-1]的和,記為S(0,n-1)。S(0,7)S(0,3)S(4,7)S(0,1)S(2,3)S(4,5)S(6,7)三、并行求和倍減法求和計算序列L[0..n-1]的和,記為S(0,n-1)。設可用處理器為n/2個。intPSum(intL[],intn){ k=n/2; while(k>0) { forallPii=0..k-1do { L[i]+=L[i+k]; } k/=2; } returnL[0];}四、平衡樹法平衡樹法的基本思想用一棵平衡二叉樹組織并行計算,輸入元素存放在葉結(jié)點,然后逐層并行地計算一直到根結(jié)點。四、平衡樹法以求最大值問題為例計算序列L[0..n-1]中的最大值。不失一般性,設n=2m,A是一個大小為2n-1的數(shù)組,采用完全二叉樹的存儲結(jié)構(gòu),將序列分別存放到n個葉結(jié)點中,在樹的同一層各結(jié)點上作并行計算,逐層遞推,直到得到最終結(jié)果。fork=m-1to0doforallPii=0…2k-1doj2k-1+i;A[j]max(A[2*j+1],A[2*j+2]);四、平衡樹法平衡樹法的評估以平衡樹法求解最大值是一個EREW算法,計算時間tp(n)=O(logn),運用處理器最多為p(n)=n/2,工作量為O(nlogn),不是工作量有效的算法。平衡樹方法的優(yōu)點是在樹中能快速存取信息,對數(shù)據(jù)的傳遞、壓縮、抽取和前綴計算均十分有用。五、向量法向量法的基本思想以向量方式描述計算過程;以并行方式執(zhí)行向量計算。五、向量法以矩陣計算為例對n階矩陣,串行加法的計算量為n2,若動用n個(或n2個)處理器,分別處理每行(或列)的相加運算,則可以得到計算量亦為n2,工作量有效。五、向量法以矩陣計算為例矩陣相乘:C=A*Bfori=1tondo forj=1tondo ci,j=0 fork=1tondo ci,j+=ai,k*bj,kfori=1tondo forallPjj=1tondo ci,j=0 //Ci.=0 fork=1tondo //Ci.=∑ai,k*Bk. forallPjj=1tondo ci,j+=ai,k*bk,j串行算法:并行算法:六、線性遞推問題一般性線性遞推問題對一個k階,N式的線性遞推式,

如下所示:x1= b1x2= a21x1+b2x3= a31x1+a32x2+b3x4= a41x1+a42x2+a43x3+b4……xN= aN1x1+aN2x2+…+aN,N-1xN-1+bN展開式如下:forallPkk=1…NdoS[k]=b[k];fori=2toN{ forallPkk=i…Ndo S[k]+=x[i-1]*a[k][i-1]; x[i]=S[i];}可得算法如下:六、線性遞推問題一階線性遞推問題有一階線性遞推式如下:x1= b1x2= a2b1+b2x3= a3a2b1+a3b2+b3x4= a4a3a2b1+a4a3b2+a3b3+b4x5= a5a4a3a2b1+a5a4a3b2+a5a4b3+a5b4+b5x6= a6a5a4a3a2b1+a6a5a4a3b2+a6a5a4b3+a6a5b4+a6b5+b6x7= a7a6a5a4a3a2b1+a7a6a5a4a3b2+a7a6a5a4b3+a7a6a5b4+a7a6b5+a7b6+b7x8= a8a7a6a5a4a3a2b1+a8a7a6a5a4a3b2+a8a7a6a5a4b3+a8a7a6a5b4+a8a7a6b5+a8a7b6+a8b7+b8展開式如下:定義:則xi=Q(i,1)forallPkk=1…Ndo{ P[k]=a[k]; Q[k]=b[k];}for(L=1;L<N;L+=L){ forallPkk=1…Ndo if(k-L>=1) { C[k]=P[k]*Q[k-L]+Q[k]; Q[k]=C[k]; C[k]=P[k]*P[k-L]; P[k]=C[k]; }}可得并行算法如下:可推導得到:P(i,i-k+1)*Q(i-k,i-2k+1)+Q(i,i-k+1)=Q(i,i-2k+1)約定P(i,i+1)=1,aj=1(j≤1),bj=0(j<1)設初始值:P[i]=P(i,i)=ai,Q[i]=Q(i,i)=bi設已知某一階線性遞推式的系數(shù)向量如下:a=(1,3,2,7,1,4,2,5)Tb=(2,1,9,3,2,4,6,3)T七、線性代數(shù)方程組高斯消去法for(k=1;i<N;i++){ for(j=k+1;j<=N+1;j++)A[k][j]/=A[k][k]; for(i=1;i<=N;i++) if(i!=k) for(j=k+1;j<=N+1;j++) A[i][j]-=A[i][k]*A[k][j];}串行求解算法:for(k=1;i<N;i++){ forallPjj=k…NdoA[k][j+1]/=A[k][k]; for(i=1;i<=N;i++) if(i!=k) forallPjj=k…Ndo A[i][j+1]-=A[i][k]*A[k][j+1];}并行求解算法:八、一元多項式的計算一元多項式的一般式八、一元多項式的計算一元多項式的串行最優(yōu)解法PN(x)=((…(aNx+aN-1)x+aN-2)x+…+a1)x+a0X0=1 P0=a0X1=X0*x P1=P0+a1*X1X2=X1*x P2=P1+a2*X2......XN=XN-1*x PN=PN-1+aN*XN八、一元多項式的計算并行解法作推導如下:令a(1)i=(a2i+a2i+1x),可將關于x的多項式看作關于x2的多項式:不失一般性,設N+1=2μ,反復利用上述方法,可得:其中:由此得到并行計算步驟:第1步:第2步:第3步:…………第μ步:在并行計算過程中同時計算八、一元多項式的計算一階線性遞推解法Y0= anY1= x*Y0+an-1Y2= x*Y1+an-2……Yi= x*Yi-1+an-i……Yn= x*Yn-1+a0PN(x)=((…(aNx+aN-1)x+aN-2)x+…+a1)x+a0令xai,aibn-i,即得一階線性遞推公式,代入一階線性遞推算法即可。九、指針跳越技術指針跳越技術是設計關于靜態(tài)鏈表快速操作并行算法的一個有力工具。012345678data-1925179861302215next5704832616117981519223025九、指針跳越技術表序問題已知n個元素,構(gòu)成一個靜態(tài)單鏈表,要求計算每個元素到表尾的距離d[i],即計算:6117981519223025voidD(slistL,intd[],inti){ if(L[i].next==0) d[i]=0; else { D(L,d,L[i].next); d[i]=d[L[i].next]+1; }}串行遞歸算法描述如下:voidD(slistL,intd[]){ StackS;InitStack(S); for(inti=0;L[i].next!=0;i=L[i].next) Push(S,L[i].next); Pop(S,i); d[i]=0; while(!EmptyStack(S)) { Pop(S,j); d[j]=d[i]+1; i=j; }}串行非遞歸算法描述如下:九、指針跳越技術表序問題使用指針跳越技術,用n個處理器并行對n個元素進行處理。012345678data-1925179861302215next570483261P1P2P3P4P5P6P7P8forallPii=1…ndo if(next[i]==0)d[i]=0;elsed[i]=1;while(存在next[i]!=0){ forallPii=1…ndo if(next[i]!=0) { d[i]+=d[next[i]]; next[i]=next[next[i]]; }}算法描述如下:611798151922302511111110611798151922302576543210第三趟跳越611798151922302544443210第二趟跳越611798151922302522222210第一趟跳越12345678data1925179861302215next70483261d1011111122122202dnextdata720418061522306198172519876543211次跳越42144403dnextdata200167001522306198172519876543212次跳越42175603dnextdata000000001522306198172519876543213次跳越九、指針跳越技術指針跳越操作將破壞原有的鏈結(jié)構(gòu),因此在操作前應復制原鏈結(jié)構(gòu),在復制的鏈結(jié)構(gòu)上進行跳越操作。可證明算法的正確性。在循環(huán)過程中,以每個元素為鏈頭的子表中的d值之和,恰好等于該元素到表尾的距離。在指針跳越過程中,將越過的元素的d值累積到被操作元素上,以保證上述性質(zhì)仍然成立。當元素沒有后繼元素時,其d值即是到表尾的距離值。注意:在對多個next指針進行更新時,要求讀寫操作保持同步,即讀取next值的操作要先于任何next的寫入操作。由于每次跳越將使一個子表被分裂成兩個子表,因此計算時間為O(logn)。九、指針跳越技術表前綴的并行計算表前綴計算問題由一個二元可結(jié)合運算⊕來定義,對一個輸入序列<x1…xn>,其輸出是序列<y1…yn>,滿足:y1=x1,且yk=yk-1⊕xk=x1⊕x2⊕…⊕xk,k=2,3,…,n即每一個yk是輸入序列的前k個元素的“累積”。表序計算可以看作表前綴的一個特例(須先將表顛倒)。為描述方便,定義如下符號:[i,j]=xi⊕xi+1⊕…⊕xj,1≤i≤j≤n則有:[k,k]=xk,[i,k]=[i,j]⊕[j+1,k],yk=[1,k]forallPii=1…ndo y[i]=x[i];while(存在next[i]!=0){ forallPii=1…ndo { if(next[i]!=0) { y[next[i]]=y[i]⊕y[next[i]]; next[i]=next[next[i]]; } }}并行算法描述如下:611798151922302511111111611798151922302512345678第三趟跳越611798151922302512344444第二趟跳越611798151922302512222222第一趟跳越九、指針跳越技術前綴運算中的循環(huán)終止條件的判斷對已知表長n的情況下,循環(huán)步長不超過logn。對未知表長n的情況下,表頭元素的循環(huán)步數(shù)最多,通過判斷表頭元素的next是否已變?yōu)?來作為循環(huán)的終止條件。可以通過O(1)的運算找到表頭單元。forallPii=1…ndo{ h[i]=1; if(next[i]!=0)h[next[i]]=0; if(h[i]==1)head=I;}九、指針跳越技術應用舉例中位元素定位查找鏈表中序號為K的元素。數(shù)組的前綴運算yk=yk-1⊕xk=x1⊕x2⊕…⊕xk藍色鏈表問題鏈表中有紅藍兩色的結(jié)點,將藍色結(jié)點挑出組成一個新的鏈表。循環(huán)鏈表的標識問題在循環(huán)鏈表上應用指針跳越技術,如何標識跳越的結(jié)束狀態(tài)。十、歐拉回路技術歐拉回路一個圖的歐拉回路是指經(jīng)過圖中每條弧恰好一次的一條回路。一個有向強連通圖有歐拉回路的充要條件是該圖中每個結(jié)點的出度等于入度。無向連通圖可以轉(zhuǎn)換為有歐拉回路的有向強連通圖。十、歐拉回路技術二叉樹的歐拉回路構(gòu)造構(gòu)造思路通過對二叉樹進行變形,構(gòu)造歐拉回路;將每個結(jié)點分解為三個單鏈子結(jié)點A、B、C;令A為父結(jié)點入口,左子出口;令B為左子入口,右子出口;令C為右子入口,父結(jié)點出口;歐拉回路鏈的順序為:A——左子樹——B——右子樹——C十、歐拉回路技術二叉樹的歐拉回路構(gòu)造構(gòu)造規(guī)則若一個結(jié)點有左子,則令結(jié)點的A指向左子結(jié)點的A,否則令結(jié)點的A指向結(jié)點的B;若一個結(jié)點有右子,則令結(jié)點的B指向右子結(jié)點的A,否則令結(jié)點的B指向結(jié)點的C;若一個結(jié)點是父結(jié)點的左子,則令C指向父結(jié)點的B;若是父結(jié)點的右子,則令C指向父結(jié)點的C;根結(jié)點的C指向空;十、歐拉回路技術計算二叉樹各結(jié)點的層次定義根結(jié)點為0層;定義子結(jié)點的層數(shù)為父結(jié)點的層數(shù)加1;0層1層2層3層十、歐拉回路技術計算二叉樹各結(jié)點的層次利用歐拉回路計算先構(gòu)造二叉樹的歐拉回路;令各結(jié)點的A的初值為1,B的初值為0,C的初值為-1;對該鏈進行前綴加和運算;各結(jié)點C中所得到的結(jié)果即該結(jié)點的層次;A——左子樹——B——右子樹——C十、歐拉回路技術計算二叉樹遍歷序設A初值為1,B初值為0,C初值為0,

前綴計算后,A中即為前序的編號;設A初值為0,B初值為1,C初值為0,

前綴計算后,B中即為中序的編號;設A初值為0,B初值為0,C初值為1,

前綴計算后,C中即為后序的編號;根據(jù)歐拉回路鏈序:A——左子樹——B——右子樹——C十、歐拉回路技術計算二叉樹上各結(jié)點為根的子樹的規(guī)模根據(jù)歐拉回路鏈序:A——左子樹——B——右子樹——C在前序遍歷序計算中,每個結(jié)點的C-A+1即子樹規(guī)模;在中序和后序遍歷序計算中,每個結(jié)點的C-A的值即子樹規(guī)模;十、歐拉回路技術二叉樹的藍色鏈表問題設在一棵有n個結(jié)點的二叉樹T中,某些結(jié)點標記為藍色結(jié)點,將二叉樹T中的所有沒有藍色祖先的藍色結(jié)點連成一個鏈表。對藍色元素初始化為A=1,B=0,C=-1;對紅色元素初始化為:A=0,B=0,C=0;構(gòu)造歐拉回路,進行前綴計算后,結(jié)點的C中為“藍深度”,即藍色祖先結(jié)點的個數(shù)。將所有有藍色祖先的結(jié)點的顏色全改為紅色,用鏈表的藍色鏈算法剔除其中的無藍色祖先的結(jié)點。十、歐拉回路技術多叉有序樹的歐拉回路十一、MIMD算法算術表達式的同步MIMD算法例:(A+B(C+D*E*F))+G變形為:A+G+B*C+B*D*E*FP1P2P3P4a1=A+GP(r1)a1+=a2P(r3)a1+=a3a2=B*CV(r1)a3=B*DP(r2)a3*=a4V(r3)a4=E*FV(r2)十一、MIMD算法區(qū)間分割法解代數(shù)方程的根求單調(diào)連續(xù)函數(shù)f(x)=0的根。設已知兩端l~u,對區(qū)間進行n+1等分,令y[0]=f(l),y[n+1]=f(u)。lu…………十一、MIMD算法同步牛頓迭代法解代數(shù)方程的根迭代公式:P0P1while未達到精度{ y=f(x); wait(y’) x=x–y/y’;}while未達到精度{ wait(x) y’=f’(x);}并行進程如下:P0P1y0=f(x0)y0’=f’(x0)x1=x0–y0/y0’y1=f(x1)y1’=f’(x1)x2=x1-y1/y1’…………并行計算過程如下:十一、MIMD算法異步牛頓迭代法解代數(shù)方程的根P1P2While未達到精度{ y=f(x); x=x–y/y’;}While未達到精度{ y’=f’(x);}十二、MIMD算法異步枚舉排序算法用n個進程并行計算各元素在排序后序列中的位置。i01234567X1593233819214T4891519213233十二、MIMI算法異步快速排序算法在快速排序過程中,每一步劃分完成后,所得到的兩個待排序子序列是相互獨立的,可以創(chuàng)建兩個并行進程分別對這兩個子序列進行遞歸快速排序。intQSort(L,s,t){ if(s>=t)return0; k=Partition(L,s,t); QSort(L,s,k-1); QSort(L,k+1,t); return1;}十二、并行分治分治通過將一個問題分解成若干個性質(zhì)相同的子問題,并遞歸地對子問題進行求解,然后將各子問題的解加以合并構(gòu)造出原問題的解。分治步驟將問題的輸入進行均勻劃分,構(gòu)成規(guī)模大致相等的若干個同類的子問題;遞歸求解各子問題;將各子問題的解歸并成為原問題的解;十二、并行分治并行分治F(I){ if輸入足夠小then OAnswer(I); else {

分解輸入:I1,…Ik;

forallPii=1…kdo Oi

F(Ii,Oi); OCombine(O1,…Ok); }}十二、并行分治最近點對問題d1d2d2d十三、劃分法劃分法與分治法相似,劃分原理也是將原問題進行分解,分別求解,再歸并子問題的解。所不同的是,分治法采用簡單的分解方法,因此設計的難點在于如何歸并子問題的解,而劃分方法則講究分解的方法,以獲得簡單的歸并策略。十三、劃分法有序序列歸并設A=(a1,a2,…,an),

B=(b1,b2,…,bm),

是U上的單調(diào)增序列,且A∩B=Ф。

將A和B歸并到:

C=(c1,c2,…,cm+n)。十三、劃分法有序序列歸并定義:對U上的有序序列列X=(x1,x2,…,xt),x∈U,x在X上的位序rank(x:X)為X中小于等于x的元素個數(shù)。歸并問題即求rank(x:A∪B),x∈A∪B。分別求出rank(ai:B)和rank(bj:A),即可得到rank(x:A∪B)=rank(x:A)+rank(x:B)。這樣就可以在O(logn)時間內(nèi)用O(nlogn)工作量完成合并的任務。但這樣的解法不是一個工作量有效的算法。通過進一步劃分,可以得到工作量有效的解法。十三、劃分法有序序列歸并可以在O(logn)的時間內(nèi)將A和B劃分成p對子序列(Ai,Bi),i=0,1,…,p-1,

使得Ai和Bi中的每一個元素均大于Ai-1和Bi-1中的元素。

經(jīng)過這樣劃分,合并問題就轉(zhuǎn)化為子序列對(Ai,Bi)的合并問題了。Aa1…aj[1]aj[1]+1…aj[2]aj[2]+1…aj[3]……anBb1…bLbL+1…b2Lb2L+1…b3L……bmCPartition(A,B,n,m){ lm/p; j[0]0; j[p]n; forallPii=1…p-1do j[i]rank(bi*l:A); forallPii=0…p-1do { Bi

(bi*l+1,…,b(i+1)*l); Ai

(aj[i]+1,…,aj[i+1]); }}十四、流水線技術基本思想將一個計算任務t分成一系列連續(xù)子任務t1,t2,…,tm,使得一旦完成了子任務ti,其后繼的子任務ti+1就可以立即開始,并以同樣的速率進行計算。十四、流水線技術歸并排序設輸入長度為n=2r,用p(n)=r+1個處理器并行完全合并排序的任務。設處理器編號從1到r+1,其中首處理器有一個輸入,尾處理器有一個輸出,其他處理器各有兩個輸入和兩個輸出。各處理器同步運行,在一個時間步內(nèi),P1從原始輸入序列中讀取一個數(shù)并將其作為結(jié)果輸出,Pi(i=2…r+1)接收從Pi-1輸出的兩個長度為2i-2的子序列,并將其合并為一個長度為2i-1的子序列。從P1到Pr,每一個處理器交替地在上面和下面兩條輸出線上產(chǎn)生合并子序列。除P1外,每個處理器Pi當其前一個處理器的一條輸出線上已經(jīng)產(chǎn)生了長為2i-2的子序列,另一條輸出線上出現(xiàn)了第一個元素時,就可以開始歸并了。設Pi和Pi+1之間通過的隊列為q2i和q2i+1,即q2i和q2i+1是Pi的輸出序列,Pi+1的輸入序列。如下圖所示:設n=2r,p(n)=r+1,算法描述如下:P1:j2;fork=1tondo{ xkq1; qjxk; j=5-j;}Pi:i=2…rj0;k1;whilek<=ndo{ ifq2(i-1)+j已裝滿2i-2個元素and q2(i-1)+(1-j)已出現(xiàn)1個元素then { form=1to2i-1do q2i+jmin(q2(i-1)+j,q2(i-1)+(1-j)); j1-j; kk+2i-1; }}Pr+1:ifq2r已裝滿2r-1個元素,且q2r+1已出現(xiàn)1個元素then{ form=1to2rdo q2(r+1)min(q2r,q2r+1);}十四、流水線技術排序問題每個進程一次從前一個進程接收待排序序列中的一個數(shù),保存當前接受到的最大的數(shù)字,把比這個數(shù)小的其他數(shù)傳給下一個進程。第一個進程P0直接從待排序序列接收數(shù)據(jù)。P0P1P2P3P44|3|1|2|512345P0P1P2P3P4-----4|3|1|2|55----4|3|1|25----4|3|1252---4|3152---431531--42542--315431-254321十四、流水線技術質(zhì)數(shù)生成問題生成從2~n的所有質(zhì)數(shù)。埃拉托色尼篩選法從2開始,依次刪除2的所有倍數(shù);對余下的每個數(shù)字重復這個過程;只須考察從2到n1/2的數(shù)即可;對被考察數(shù)i,只須測試i2~n的所有數(shù)即可;2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,202,3,5,7,9,11,13,15,17,192,3,5,7,11,13,17,19十四、流水線技術質(zhì)數(shù)生成問題順序解法for(i=2;i<=n;i++) prime[i]=1;for(i=0;i<=sqrt_n;i++) if(prime[i]==1) for(j=i*i;j<=n;j+=i) prime[j]=0;十四、流水線技術質(zhì)數(shù)生成問題流水線解法第一個流水線級輸入一系列連續(xù)的數(shù),然后剔出所有2的倍數(shù),并把余下的數(shù)傳遞給第二級流水線;第二級剔出所有3的倍數(shù)并把余下的數(shù)傳遞給第三級流水線;以此類推;流水線的個數(shù)與質(zhì)數(shù)的個數(shù)的方根相同;P0P1P2xn-1,...,x1,x0數(shù)序列倍數(shù)比較第1個質(zhì)數(shù)第2個質(zhì)數(shù)第3個質(zhì)數(shù)進行埃拉托色尼篩選的流水線:P0:x0

receive(X);while(!EOF(X)){ xreceive(X); if(x%x0!=0)send(P1,x);}Pi:xi

receive(Pi-1);while(!EOF(X)){ xreceive(Pi-1); if(x%xi!=0)send(Pi+1,x);}十五、接力技術基本思想讓兩種算法接力,產(chǎn)生一個求解該問題的新算法,使得既有耗時少的特性又有工作量有效性較高的特性。先用需要較少時間(速度較快)的算法求解給定的問題,直到問題的規(guī)模減到某一個閾值為止;再用工作量有效性較高的算法,繼續(xù)求解,直到獲得最終的解答。十五、接力技術求解最大值的常數(shù)時間算法對n個元素的數(shù)組,可以動用n2個處理器,在O(1)的時間內(nèi)求解出最大值。A1A2A3mA1?F?FA2TTTTA3?F?FforallPii=1…ndo m[i]true;forallPi,ji=1…n,j=1…ndo if(A[i]<A[j])m[i]false;forallPii=1…ndo if(m[i]==true)maxA[i];十五、接力技術求解最大值的重對數(shù)時間算法設n個元素的序列,定義一棵以n個元素為葉結(jié)點的重對數(shù)深度平衡樹如下:

樹中每一個非葉子結(jié)點u的子結(jié)點的個數(shù)為以u為根的子樹上的葉結(jié)點的個數(shù)的平方根。則第0層為樹根,有一個結(jié)點,第1層為n1/2個結(jié)點,每個結(jié)點為根的子樹上有n/n1/2=n1/2個葉子,所以每個結(jié)點有n1/4個子結(jié)點,可以證明,以第i層上每一個結(jié)點為根的子樹上有個葉子結(jié)點,第i層上共有個結(jié)點,可知這樣一棵樹的高度為loglogn+1,因此稱為重對數(shù)深度平衡樹。在重對數(shù)深度平衡樹上,除第0層外,對每一層按父結(jié)點分組,對每一組用常數(shù)時間算法求解最大值,結(jié)果放在其父結(jié)點中??勺C明,共須n個處理器,經(jīng)過loglogn+1個并行步完成計算,時間復雜度為O(loglogn)。216個葉子根28個結(jié)點,每個分28個葉結(jié)點28*24個結(jié)點,每個分24個葉結(jié)點28*24*22個結(jié)點,每個分22個葉結(jié)點28*24*22*2個結(jié)點,每個分2個葉結(jié)點十五、接力技術對數(shù)深度樹和重對數(shù)深度樹算法接力第一步,利用對數(shù)深度平衡樹方法向上逐層進行計算,經(jīng)過logloglogn層的選拔后停下來。第二步,以第一步選拔出的最大值候選結(jié)點為葉結(jié)點,按重對數(shù)時間算法進行繼續(xù)計算,直到所求的解。第一步所需時間為O(logloglogn),工作量為O(nlogloglogn),在第一步結(jié)束時,剩下的結(jié)點數(shù)為:n’=n/2logloglogn=n/loglogn。則第二步需要的時間為O(loglogn’)=O(loglogn),工作量為O(n’loglogn)=O(n)。從而進一步提高了工作量的有效性。十六、遞歸的并行隨機消元法基本思想運用遞歸,且在遞歸的每一階段用最短的時間,并隨機地消去盡量多的元素,以迅速地壓縮問題的規(guī)模,直到規(guī)模為0,遞歸不再深入,再返回并逐步拼接原問題的解。以前綴計算為例。十六、遞歸的并行隨機消元法遞歸消元可以通過O(1)時間的操作將一個單鏈表改造成為一個雙向鏈表。對于規(guī)模為n的雙向鏈表,擬使用p個處理器,每個處理器負責處理鏈中的n/p個元素。先將n個元素任意地分配給各處理器,一經(jīng)分配,歸屬關系在遞歸過程中不再改變。十六、遞歸的并行隨機消元法遞歸消元第一步:消元各處理器按如下兩條原則并行地消去表中的一些元素:

①每一個處理器每次最多消去它所管轄的一個元素;

②不同時消去當前表中相鄰的兩個元素。

在消去當前表中它所轄的一個元素之前,都要取出該元素及其下一個元素的前綴當前值作⊕運算,并用運算的結(jié)果更新下一個元素的前綴當前值,除非是表尾元素。十六、遞歸的并行隨機消元法遞歸消元第二步:遞歸當?shù)谝徊降玫降男骆湵淼拈L度不為0時,遞歸消元。第三步:回收各處理器并行地收回在第一步被自己消去的元素,接入遞歸返回的鏈表,然后取出該元素與其前一個元素的前綴當前值作⊕運算,并用運算的結(jié)果更新該元素的前綴當前值,除非是表首元素。PiNovnextP114[4,4]621[1,1]332[2,2]5P247[7,7]853[3,3]165[5,5]9P379[9,9]088[8,8]796[6,6]4[1,1][2,2][3,3][4,4][5,5][6,6][7,7][8,8][9,9][1,1][2,2][3,3][4,5][6,6][7,8][1,2][3,5][6,6][1,5]空表[1,5][1,2][1,5][1,6][1,1][1,2][1,3][1,5][1,6][1,8][1,1][1,2][1,3][1,4][1,5][1,6][1,7][1,8][1,9]P1P1P2P1P2P3P2P3P3十六、遞歸的并行隨機消元法遞歸消元可見,在遞歸消元過程中,被消去元的前綴值累積到了后面的元素上;在遞歸返回時,回收的元素從前面的元素中獲得了尚未被累積的前綴值。因此保證了在遞歸結(jié)束時,每個元素都獲得了其前面的所有元素的前綴累積值。并行消元時的兩條原則保證了消元過程中不會出現(xiàn)沖突,且消元和回收都可以在O(1)時間內(nèi)完成。十六、遞歸的并行隨機消元法選擇待消元的方法在兩條消元原則下,消去盡量多的元素,且耗費時間盡量少,最好是O(1)。因此可以采用隨機消元法。方法如下:(1) 各處理器從所分管的元素中挑選一個未消去的元素作為候選元素;(2) 隨機地(拋硬幣)決定是否給該元素打一個標記;(3) 如果元素被標記,而元素next未標記,則消去該元素,否則不消去該元素;十六、遞歸的并行隨機消元法算法分析在每一個遞歸步中,每個處理器以至少1/4的概率消去一個元素,對p個處理器,每個處理器分管n/p個元素,因此在高概率下,消元的期望時間為O(n/p)。則總工作量為O(n)。十七、確定性破對稱技術基本概念破對稱:打破并行操作的對稱性,即避免兩個處理器同時被分派對同一個單元進行處理或同時不被分派進行處理。前面的隨機消元中的拋硬幣方法就是一種不確定的破對稱技術。確定性破對稱技術:利用處理器的編號來打破對稱性。例如前面的例子中,通過讓下標較小的處理器先訪問來打破對稱性。十七、確定性破對稱技術確定性破對稱算法要求從靜態(tài)鏈表中選出一部分元素,這部分元素在鏈表中兩兩不相鄰,且數(shù)目是鏈表中元素總數(shù)的常分數(shù)倍。n個處理器和O(log*n)的計算時間,其中l(wèi)og*n定義為:log*x=min{i|log(i)x<=1,i>=0};log(i)x定義為:對1≤n≤265536,有0≤log*n≤5,因此對一般的實際應用,log*n是一個小常數(shù)。十七、確定性破對稱技術確定性破對稱算法確定性破對稱算法分為兩個部分:第一部分:在O(log*n)時間內(nèi)給出鏈表的“6-著色”。第二部分:將6-著色轉(zhuǎn)化為表的一個“極大獨立集”,該極大獨立集將至少包含鏈表中的n/3個元素,且這些元素中任何兩個元素在鏈表中不相鄰。十七、確定性破對稱技術無向圖著色與極大獨立集無向圖G=(V,E)的一個著色是一個映射C:VN,使得對所有u,v∈V,如果C(u)=C(v),則(u,v)不屬于E,即相鄰點不同色。在鏈表上進行6-著色,可用的顏色號為{0,1,2,3,4,5},且相鄰元素不同色。雖然可以用O(logn)的時間并行地對鏈表進行2-著色,將奇、偶元素分別著以不同的顏色,但通常只要有一種O(1)的著色就可以了。下面的算法在O(log*n)的時間對n個元素的鏈表進行6-著色。十七、確定性破對稱技術無向圖著色與極大獨立集G=(V,E)的一個獨立集是其頂點集V的一個子集V’,使得E中的每條邊最多只與V’中的一個頂點相關聯(lián)。極大獨立集是一個不能再并入其他任何頂點的獨立集。最大獨立集是圖G的一個規(guī)模最大的獨立集。求極大獨立集是一個易解的問題,求最大獨立集卻是一個NP-完全問題。雖然對一個鏈表可以通過O(logn)時間分別標出奇偶點,從而得到兩個最大獨立集,但速度不夠快。而只要我們能求得鏈表的極大獨立集,則可知極大獨立集中的元素個數(shù)不小于n/3(每三個元素中,至少有一個元素屬于極大獨立集)。十七、確定性破對稱技術鏈表6-著色算法思想對鏈表中的每一個元素迭代地計算出一個著色序列C0[x],C1[x],…,Cm[x]。鏈表的初始著色C0是一個n-著色,每一次迭代產(chǎn)生一種新的著色,最后的著色Cm是一個6-著色。可以證明,m=log*n。初始著色C0可以定義為C0[x]=P(x)。每一種顏色的編號可通過logn個bit位來描述。十七、確定性破對稱技術鏈表6-著色迭代規(guī)則設Ck用了r位表示每一種顏色,通過查看每個元素的相鄰元素next[x]來確定新的顏色。設Ck[x]=a=<ar-1ar-2…a1a0>,

Ck[next[x]]=b=<br-1br-1…b1b0>,Ck[x]≠Ck[next[x]],

因此必存在一個最小下標i,使得ai≠bi,0≤i≤r-1,

則i可以用logr個bit位表示。x的新顏色值定義為i與ai的連接,

令Ck+1[x]=<i,ai>=<ilogr-1ilogr-2…i0ai>,若x是表尾,則定義Ck+1[x]=<0,…0a0>。這樣一來,新顏色的位數(shù)最多為logr+1位。ck[x]:01101101ck[next[x]]:10011001ck+1[x]:0101十七、確定性破對稱技術鏈表6-著色迭代規(guī)則證明可以證明,Ck+1仍是一個合法的著色。對非表尾元素x,Ck[x]≠Ck[next[x]],按Ck+1[x]的定義,設Ck+1[x]=<i,ai>,

Ck+1[next[x]]=<j,bj>,

若i≠j,則Ck+1[x]≠Ck+1[next[x]];

若i=j,則必有ai≠bj,所以Ck+1[x]≠Ck+1[next[x]]。ck[x]:01101101ck[n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論