




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、會(huì)計(jì)學(xué)1 計(jì)算流體力學(xué)李新亮計(jì)算流體力學(xué)李新亮cfd第第14講講mpi并行并行 程序設(shè)計(jì)初步程序設(shè)計(jì)初步 2 計(jì)算節(jié)點(diǎn)計(jì)算節(jié)點(diǎn) a.exe a.exe a.exe a.exe 對(duì)等式對(duì)等式 設(shè)計(jì)設(shè)計(jì) “對(duì)等式對(duì)等式”程序設(shè)計(jì)思想程序設(shè)計(jì)思想 如果我是其中一個(gè)進(jìn)程;如果我是其中一個(gè)進(jìn)程; 我應(yīng)當(dāng)做我應(yīng)當(dāng)做 完成我需要完成的任務(wù)完成我需要完成的任務(wù) 站在其中一個(gè)進(jìn)程的角度思考站在其中一個(gè)進(jìn)程的角度思考 第1頁(yè)/共62頁(yè) 3 第2頁(yè)/共62頁(yè) 發(fā)送發(fā)送 變量變量A 接收接收 到變量到變量B 配合使用配合使用 4 第3頁(yè)/共62頁(yè) 阻塞發(fā)送阻塞發(fā)送 開始開始 結(jié)束結(jié)束 消息成功發(fā)出消息成功發(fā)出 緩沖區(qū)
2、可釋放緩沖區(qū)可釋放 阻塞接收阻塞接收 開始開始 結(jié)束結(jié)束 消息成功接收消息成功接收 緩沖區(qū)數(shù)據(jù)可使緩沖區(qū)數(shù)據(jù)可使 用用 一、一、 阻塞式通信與非阻塞式通信阻塞式通信與非阻塞式通信 阻塞式發(fā)送與接收阻塞式發(fā)送與接收 MPI_Send( A, ) MPI_Recv( B , ) 5 第4頁(yè)/共62頁(yè) MPI_SendMPI_Send( ) ( ) 返回后緩沖區(qū)可釋放返回后緩沖區(qū)可釋放 sum= sum= call call MPI_SendMPI_Send(sum,)(sum,) sum= sum= 變量可重復(fù)利用變量可重復(fù)利用 MPI_RecvMPI_Recv() () 返回后緩沖區(qū)數(shù)據(jù)可使用返
3、回后緩沖區(qū)數(shù)據(jù)可使用 Call Call MPI_RecvMPI_Recv(sum1,)(sum1,) Sum=sum0+sum1Sum=sum0+sum1 6 第5頁(yè)/共62頁(yè) 非阻塞發(fā)送非阻塞發(fā)送 啟動(dòng)發(fā)送啟動(dòng)發(fā)送 立即返回立即返回 計(jì)計(jì) 算算 通信完成通信完成 釋放發(fā)送緩沖區(qū)釋放發(fā)送緩沖區(qū) 發(fā)發(fā) 送送 消消 息息 非阻塞接收非阻塞接收 啟動(dòng)接收啟動(dòng)接收 立即返回立即返回 計(jì)計(jì) 算算 通信完成通信完成 引用接收數(shù)據(jù)引用接收數(shù)據(jù) 接接 收收 消消 息息 計(jì)算計(jì)算 與與 通信通信 重疊重疊 非阻塞消息發(fā)送與接收非阻塞消息發(fā)送與接收 7 第6頁(yè)/共62頁(yè) 8 第7頁(yè)/共62頁(yè) 非阻塞通信調(diào)用后立
4、即返回,緩沖區(qū)不能非阻塞通信調(diào)用后立即返回,緩沖區(qū)不能立即使用立即使用 Sum= 計(jì)算某變量計(jì)算某變量 MPI_Isend(sum .) 發(fā)送該變量發(fā)送該變量 sum= 不能給變量重新賦值不能給變量重新賦值 (發(fā)送可能尚未完成)(發(fā)送可能尚未完成) MPI_Irecv(sum1, ) sum=sum0+sum1 數(shù)據(jù)不能立即使用數(shù)據(jù)不能立即使用 (接收可能未完成)(接收可能未完成) MPI_Isend(sum, , request, ) Call MPI_Wait(request,status,ierr) Sum= MPI_Irecv(sum1, , request, ) Call MPI_W
5、ait(request,status,ierr) Sum=sum0+sum1 9 第8頁(yè)/共62頁(yè) 利用通信與計(jì)算重疊技術(shù)提高效率利用通信與計(jì)算重疊技術(shù)提高效率 例:例: 計(jì)算差分計(jì)算差分 串行程序串行程序 real A(N,N),B(N,N),h . Do i=1,N B(I,1)=(A(I,2)-A(I,1)/h B(I,N)=(A(I,N)-A(I,N-1)/h enddo Do j=2,N-1 Do i=1,N B(i,j)=(A(i,j+1)-A(i,j-1)/(2.*h) Enddo Enddo 0 )2/()()( 1,1, hfff jijijiy J=1,2,3 . N-1,
6、 N i=1 i=2 i=N 10 第9頁(yè)/共62頁(yè) 并行程序并行程序 以兩個(gè)進(jìn)程并行為例以兩個(gè)進(jìn)程并行為例 real A(N,N/2),B(N,N/2),A1(N),h If(myid .eq. 0) then call MPI_send(A(1,N/2),N,MPI_real,1,99,MPI_Comm_world,ierr) call MPI_recv(A1,N,MPI_real,1,99,MPI_Comm_World,status,ierr) Else call MPI_recv(A1,N,MPI_real,0,99,MPI_Comm_World,status,ierr) call M
7、PI_send(A(1,1),N,MPI_real,0,99,MPI_Comm_world,ierr) endif 01 J=1,2 N/2 A(1,N/2) A(2,N/2) A(3,N/2) A(N,N/ 2) 11 第10頁(yè)/共62頁(yè) If(myid .eq. 0) then Do i=1,N B(i,1)=(A(i,2)-A(i,1)/h B(i,N)=(A1(i)-A(i,N-1)/(2.*h) Enddo Else Do i=1,N B(i,1)=(A(i,2)-A1(i)/(2.*h) B(i,N)=(A(i,N)-A(i,N-1)/h Enddo endif Do j=2,N-
8、1 Do i=1,N B(i,j)=(A(i,j+1)-A(i,j-1)/(2.*h) Enddo Enddo 01 J=1,2 N/2 特點(diǎn):特點(diǎn): 先收發(fā)邊界信息先收發(fā)邊界信息 再進(jìn)行計(jì)算再進(jìn)行計(jì)算 缺點(diǎn):缺點(diǎn): 通信過程中通信過程中CPU 空閑空閑 12 “內(nèi)邊界” 第11頁(yè)/共62頁(yè) 通信與計(jì)算重疊通信與計(jì)算重疊 real A(N,N/2),B(N,N/2),A1(N),h integer myid,ierr, req1, req2,status() If(myid .eq. 0) then call MPI_ISend(A(1,N/2),N,MPI_real,1,99,MPI_Com
9、m_world,req1, ierr) call MPI_Irecv(A1,N,MPI_real,1,99,MPI_Comm_World,req2,ierr) Else call MPI_Irecv(A1,N,MPI_real,0,99,MPI_Comm_World,req2,ierr) call MPI_Isend(A(1,1),N,MPI_real,0,99,MPI_Comm_world,req1,ierr) endif 01 J=1,2 N/2 13 第12頁(yè)/共62頁(yè) Do j=2,N-1 Do i=1,N B(i,j)=(A(i,j+1)-A(i,j-1)/(2.*h) Enddo
10、Enddo Call MPI_wait(req2,statue,ierr) If(myid .eq. 0) then Do i=1,N B(I,1)=(A(I,2)-A(I,1)/h B(I,N)=(A1(i)-A(I,N-1)/(2.*h) Enddo Else Do i=1,N B(I,1)=(A(I,2)-A1(i)/(2.*h) B(I,N)=(A1(i)-A(I,N-1)/h Enddo endif 01 J=1,2 N/2 特點(diǎn):特點(diǎn): 傳遞邊界信息傳遞邊界信息 同時(shí)同時(shí)進(jìn)行計(jì)算進(jìn)行計(jì)算 內(nèi)點(diǎn)內(nèi)點(diǎn) 讀取系統(tǒng)時(shí)間讀取系統(tǒng)時(shí)間 doubleprecision time time=MPI
11、_Wtime( ) 14 第13頁(yè)/共62頁(yè) 二、二、 如何收發(fā)非連續(xù)數(shù)據(jù)如何收發(fā)非連續(xù)數(shù)據(jù) 例如:例如: 發(fā)送數(shù)組的一行發(fā)送數(shù)組的一行 A(100,50) 發(fā)送發(fā)送 A(1,1),A(1,2) ,A(1,3) A(1,1), A(1,2), A(1,3) 方法方法1. 多次發(fā)送多次發(fā)送 通信開銷大、效率低通信開銷大、效率低 A(1,1), A(2,1), A(1,2), A(2,2) . A(1,3). 15 第14頁(yè)/共62頁(yè) 方法方法2. 將發(fā)送的數(shù)據(jù)拷貝到連續(xù)的數(shù)組中將發(fā)送的數(shù)據(jù)拷貝到連續(xù)的數(shù)組中 dimension A(100,50), B(50) If(myid .eq. 0) t
12、hen Do i=1,50 B(i)=A(1,i) Enddo call MPI_Send(B,50,MPI_REAL,1,99,MPI_COMM_WORLD,ierr) Else call MPI_Recv(B,50,MPI_Real,0,99, ) Do i=1,50 A(1,i)=B(i) Enddo endif 不足:不足: 額外的內(nèi)存占用額外的內(nèi)存占用 額外的拷貝操作額外的拷貝操作 通信不復(fù)雜的情況,內(nèi)存拷貝工作量不大,該方法也可以采用。通信不復(fù)雜的情況,內(nèi)存拷貝工作量不大,該方法也可以采用。 效果還可以效果還可以 16 第15頁(yè)/共62頁(yè) 方法方法3: 構(gòu)建新的數(shù)據(jù)結(jié)構(gòu)構(gòu)建新的數(shù)據(jù)
13、結(jié)構(gòu) Count: 塊的數(shù)量;塊的數(shù)量; blocklength: 每塊的元素個(gè)數(shù)每塊的元素個(gè)數(shù) Stride: 跨度跨度 (各塊起始元素之間的距離)(各塊起始元素之間的距離) Oldtype: 舊數(shù)據(jù)類型,舊數(shù)據(jù)類型, Newtype: 新數(shù)據(jù)類型新數(shù)據(jù)類型 (整數(shù))(整數(shù)) 例:例:integer MY_TYPE Call MPI_TYPE_VECTOR(4,1,3,MPI_REAL,MY_TYPE,ierr) Call MPI_TYPE_Commit(MY_TYPE,ierr) A(1,1), A(2,1) , A(3,1), A(1,2), A(2,2) , A(3,2), A(1,3
14、), A(2,3), A(3,3), A(1,4), A(2,4), A(3,4) Stride=3 固定間隔(跨度)的非連續(xù)數(shù)據(jù)固定間隔(跨度)的非連續(xù)數(shù)據(jù) MPI_TYPE_VECTOR(count ,blocklength, stride ,oldtype, newtype, ierr) A(1,1) A(1,2) A(1,3) A(1,4) A(2,1) A(2,2) A(2,3) A(2,4) A(3,1) A(3,2) A(3,3) A(3,4) 4塊,每塊塊,每塊1個(gè)元素,跨度為個(gè)元素,跨度為3(個(gè)元素)(個(gè)元素) Fortran 數(shù)組的一行數(shù)組的一行 Real A(3,4) .
15、 A(1,:) 在內(nèi)存中的排列次序 17 第16頁(yè)/共62頁(yè) 例:例: 發(fā)送三維數(shù)組中的一個(gè)面發(fā)送三維數(shù)組中的一個(gè)面 (Fortran) 數(shù)組:數(shù)組: real A(M,N,P) 通信通信 1) A(i,:,:) ; 2) A(:,j,:) ; 3) A(:,:,k) 通信通信1) A(1,1,1),A(2,1,1), A(3,1,1) ,A(M,1,1), A(1,2,1),A(2,2,1)., MPI_Type_Vector(N*P,1,M,MPI_Real, My_Type,ierr) 通信通信2) A(1,1,1),A(2,1,1), A(3,1,1) ., A(1,2,1),A(2,
16、2,1),A(3,2,1) , A(1,1,2),A(2,1,2),A(3,1,2) , MPI_Type_Vector(P,M,M*N,MPI_Real,My_Type,ierr) 通信通信3) 連續(xù)分布,無需構(gòu)造新類型連續(xù)分布,無需構(gòu)造新類型 18 第17頁(yè)/共62頁(yè) MPI_TYPE_INDEXED(count, array_of_blocklengths, array_of_displacements, oldtype,newtype,ierr) 構(gòu)造數(shù)據(jù)類型更靈活的函數(shù)構(gòu)造數(shù)據(jù)類型更靈活的函數(shù) 直接指定每塊的元素個(gè)數(shù)及偏移量直接指定每塊的元素個(gè)數(shù)及偏移量 塊的數(shù)量(整數(shù))塊的數(shù)量(整
17、數(shù))每塊元素的個(gè)數(shù)每塊元素的個(gè)數(shù) (整形數(shù)組)(整形數(shù)組) 每塊的偏移量每塊的偏移量 (整形數(shù)組)(整形數(shù)組) 例:例: 數(shù)組數(shù)組 real A(N,N), 欲將其欲將其上三角元素上三角元素作為消息發(fā)送,試構(gòu)造其數(shù)據(jù)類型作為消息發(fā)送,試構(gòu)造其數(shù)據(jù)類型 A(1, 1) A(1, 2) A(1, 3) A(1, 4) A(2, 2) A(2, 3) A(2, 4) A(4, 4) A(3, 3) A(3, 4) A(2, 1) A(3, 1) A(3, 2) A(4, 1) A(4, 2) A(4, 3) A(1, 1) A(2, 1) A(1, 2) A(2, 2) A(3, 1) A(4, 1
18、) A(3, 2) A(4, 2) A(1, 3) A(2, 3) A(3, 3) A(4, 3) A(1, 4) A(2, 4) A(3, 4) A(4, 4) 內(nèi)存中的存儲(chǔ)次序 (Fortran) N列 N行 注意:注意: Fortran 行優(yōu)先次序存儲(chǔ);行優(yōu)先次序存儲(chǔ); C為列優(yōu)先次序存儲(chǔ)為列優(yōu)先次序存儲(chǔ) 觀察規(guī)律:觀察規(guī)律: N塊;塊; 第第k塊有塊有k個(gè)元素;第個(gè)元素;第k塊的偏移為塊的偏移為(k-1)*N (從(從0算起)算起) Integer: count, blocklengths(N), displacements(N) Integer: Newtype,ierr count
19、=N do k=1,N blocklengthes(k)=k displacements(k)=(k-1)*N enddo call MPI_TYPE_INDEXED(count, blocklengths, column=int(myid/3) MPI_Comm_Split(MPI_Comm_World, raw, 0,Comm_Raw) MPI_Comm_Split(MPI_Comm_World,column,0,Comm_column) Call MPI_Comm_rank(Comm_Raw,myid_raw,ierr) Call MPI_Comm_rank(Comm_line, myi
20、d_line,ierr) MPI_Comm_World RAW Column Color, 分組標(biāo)準(zhǔn) Key, 排序依據(jù) 如相同,按原ID排 提交新定義的組提交新定義的組 (否則新組無效,不要忘記)(否則新組無效,不要忘記) 計(jì)算行號(hào)、列號(hào) 20 第19頁(yè)/共62頁(yè) 例:例: 計(jì)算差分計(jì)算差分 三維分割三維分割 A(M1,N1,P1) (M1=M/NM, N1=N/NN, P1=P/NP) 基本思路:基本思路: 1) “擴(kuò)大擴(kuò)大”的數(shù)組的數(shù)組 A(0: M1+1, 0: N1+1,0:P1+1) 2)分割成三個(gè)組)分割成三個(gè)組 Comm_X, Comm_Y, Comm_Z 得到組內(nèi)編號(hào)得到組內(nèi)
21、編號(hào) 3)建立三個(gè)方向通訊的數(shù)據(jù)結(jié)構(gòu)建立三個(gè)方向通訊的數(shù)據(jù)結(jié)構(gòu) 4) 通信通信 , 計(jì)算內(nèi)點(diǎn)差分計(jì)算內(nèi)點(diǎn)差分 5) 計(jì)算邊界差分計(jì)算邊界差分 z f y f x f , 0 2 14 3 5 7 6 8 9 10 11 MPI_Comm_World 21 第20頁(yè)/共62頁(yè) Parameter(M1=M/NM,N1=N/NN,P1=P/NP) Real A(0:M1+1,0:N1+1,0:P1+1) Integer myid,Comm_X,Comm_Y,Comm_Z,id_X,id_Y,id_Z, request(12),. Call MPI_Comm_Rank(MPI_Comm_World,
22、myid,ierr) Call MPI_Comm_Split(MPI_Comm_World, mod(myid,NM),0,Comm_X,ierr) Call MPI_Comm_Split(MPI_Comm_World,mod(myid,NM*NN)/NM,0,Comm_Y,ierr) Call MPI_Comm_Split(MPI_Comm_World,myid/(NM*NN),0,Comm_Z,ierr) Call MPI_Comm_Rank(Comm_X,id_x,ierr) Call MPI_Comm_Rank(Comm_Y,id_y,ierr) Call MPI_Comm_Rank(
23、Comm_Z,id_z,ierr) 定義三個(gè)方向的通信域定義三個(gè)方向的通信域 22 第21頁(yè)/共62頁(yè) Call MPI_Type_Vector(N1+2)*(P1+2),1,M1+2,MPI_real,Type_X,ierr) Call MPI_Type_Vector(P1+2,N1+2,(M1+2)*(N1+2),MPI_real,Type_Y,ierr) Call MPI_Type_Commit(Type_X,ierr) Call MPI_Type_Commit(Type_Y,ierr) . id_X_Pre=id_X-1, if(id_X_Pre .le. 0) id_X_pre=id
24、_X_Pre+NM Id_X_Next=id_X+1, if(id_X_Next .ge. NM) id_X_Next=id_X_Next-NM Call MPI_Isend(A(1,0,0) ,1,TYPE_X, id_X_Pre, 99,Comm_X,request(1),ierr) Call MPI_Isend(A(M1,0,0),1,TYPE_X,id_X_next,99,Comm_X,request(2),ierr) Call MPI_Irecv(A(0,0,0),1,TYPE_X,id_X_next,99,Comm_X,request(3),ierr) Call MPI_Irecv
25、(A(M1+1,0,0),1,TYPE_X,id_X_Pre,99,Comm_X,request(4),ierr) 定義新的數(shù)據(jù)結(jié)構(gòu)定義新的數(shù)據(jù)結(jié)構(gòu) 23 第22頁(yè)/共62頁(yè) Do k=2,P1-1 Do j=2,N1-1 Do i=2,M1-1 Ax(I,j,k)=(A(i+1,j,k)-A(i-1,j,k)/(2.*hx) Ay(I,j,k)=(A(I,j+1,k)-A(I,j-1,k)/(2.*hy) Az(I,j,k)=(A(I,j,k+1)-A(I,j,k-1)/(2.*hz) Enddo Enddo Enddo call MPI_Wait_All(12,request,status
26、,ierr) do k=1,P1 do j=1,N1 Ax(1,j,k)=(A(2,j,k)-A(0,j,k)/(2.*hx) Ax(M1 ,j,k)=(A(M1+1,j,k)-A(M1-1,j,k)/(2.*hx) enddo Enddo . 內(nèi)點(diǎn)內(nèi)點(diǎn) 邊界點(diǎn)邊界點(diǎn) 24 第23頁(yè)/共62頁(yè) 四、分布數(shù)組的文件存儲(chǔ)四、分布數(shù)組的文件存儲(chǔ) 分布數(shù)組分布數(shù)組 real A(M/m1,N/n1)real A(M/m1,N/n1) 存儲(chǔ)方式存儲(chǔ)方式1. 每個(gè)進(jìn)程存儲(chǔ)到獨(dú)立的文件每個(gè)進(jìn)程存儲(chǔ)到獨(dú)立的文件 real A(M/m1,N/n1) character(len=50) filename writ
27、e(filename,”(file-I4.4.dat)”) myid open(55,file=filename,form=unformatted) write(55) A close(55) - file-0000.dat file-0001.dat file-0002.dat 優(yōu)點(diǎn):程序簡(jiǎn)單優(yōu)點(diǎn):程序簡(jiǎn)單 缺點(diǎn):缺點(diǎn): 數(shù)據(jù)文件多,不易處理;數(shù)據(jù)文件多,不易處理; 改變處理器數(shù)目時(shí)需特殊處理改變處理器數(shù)目時(shí)需特殊處理 0 1 2 3 25 第24頁(yè)/共62頁(yè) 分布數(shù)組分布數(shù)組 real A(M/m1,N/n1)real A(M/m1,N/n1) 存儲(chǔ)方式存儲(chǔ)方式2: 收集到收集到0節(jié)點(diǎn)存儲(chǔ)
28、節(jié)點(diǎn)存儲(chǔ) 存儲(chǔ)到存儲(chǔ)到 一個(gè)文件一個(gè)文件 缺點(diǎn):缺點(diǎn): 改變處理器規(guī)模時(shí),需要處理改變處理器規(guī)模時(shí),需要處理 存儲(chǔ)方式存儲(chǔ)方式3: 收集到收集到0節(jié)點(diǎn),重新裝配成大數(shù)組節(jié)點(diǎn),重新裝配成大數(shù)組 收集收集 A(M/m1,N/n1) 組成組成 A0(M,N) real A0(M,N), A(M/m1,N/n1), A1(M/m1,N/n1) if(myid.eq.0) then do k=0,m1*n1 call MPI_recv(A1, M/m1*N/n1,MPI_real,k,.) . A0( i_global, j_global ) = A1(i,j ) 把把A1 裝配到裝配到A0 enddo
29、 Write(33) A0 else call MPI_Send(A,) endif 0 1 2 3 0 1 2 3 0 26 第25頁(yè)/共62頁(yè) 存儲(chǔ)方式存儲(chǔ)方式4. 按列搜集后存儲(chǔ)按列搜集后存儲(chǔ) Real Aj(M) If( myid .eq. 0) then open(33,file=“A.dat”,form= “binary”) do j=1,N 收集矩陣收集矩陣A0 的第的第 j 列存儲(chǔ)到列存儲(chǔ)到 Aj(:) write(33) Aj enddo Else endif 第第 1列列 第第 2列列 第第 3列列 優(yōu)點(diǎn):優(yōu)點(diǎn): 存儲(chǔ)的數(shù)據(jù)形式與內(nèi)存中存儲(chǔ)的數(shù)據(jù)形式與內(nèi)存中A0的存放格式一
30、致。的存放格式一致。 存儲(chǔ)的文件串行程序可直接讀取存儲(chǔ)的文件串行程序可直接讀取 real A(M,N) open(55,file=“A.dat”,form=“binary”) read(55) A close(55) 27 第26頁(yè)/共62頁(yè) 存儲(chǔ)方式存儲(chǔ)方式5 并行并行IO (MPI 2.0) 打開文件:打開文件: MPI_file_open(Comm,filename,mode,info,fileno,ierr) mode 打開類型:打開類型: MPI_Mode_RDONLY, MPI_Mode_RDWR, fileno 文件號(hào),文件號(hào), info 整數(shù)整數(shù) (信息)(信息) 關(guān)閉文件關(guān)閉
31、文件 : MPI_file_close(fileno,ierr) 指定偏移位置讀寫指定偏移位置讀寫 MPI_file_read_at(fileno,offset,buff,const,datatype,status,ierr) MPI_file_write_at(fileno,offset,buff,const,datatype,status,ierr) offset 偏移,偏移, buff 緩沖區(qū),緩沖區(qū),const 數(shù)目數(shù)目 28 第27頁(yè)/共62頁(yè) Part 3 實(shí)例教學(xué)實(shí)例教學(xué) CFD程序的程序的MPI實(shí)現(xiàn)實(shí)現(xiàn) 實(shí)例實(shí)例 (1) 用擬譜方法求解不可壓用擬譜方法求解不可壓N-S方程方程
32、實(shí)例(實(shí)例(2) 用流水線方法計(jì)算緊致差分用流水線方法計(jì)算緊致差分 常用的優(yōu)化方法常用的優(yōu)化方法 29 第28頁(yè)/共62頁(yè) 30 第29頁(yè)/共62頁(yè) 31 第30頁(yè)/共62頁(yè) 發(fā)送非連續(xù)數(shù)據(jù)發(fā)送非連續(xù)數(shù)據(jù)構(gòu)建新的數(shù)據(jù)結(jié)構(gòu)構(gòu)建新的數(shù)據(jù)結(jié)構(gòu) MPI_TYPE_VECTOR(count,blocklength,stride,oldtype,newtype,ierr) Count: 塊的數(shù)量;塊的數(shù)量; blocklength: 每塊的元素個(gè)數(shù)每塊的元素個(gè)數(shù) Stride: 跨度跨度 (各塊起始元素之間的距離)(各塊起始元素之間的距離) Oldtype: 舊數(shù)據(jù)類型,舊數(shù)據(jù)類型, Newtype: 新
33、數(shù)據(jù)類型新數(shù)據(jù)類型 (整數(shù))(整數(shù)) 例:例:integer MY_TYPE Call MPI_TYPE_VECTOR(50,1,100,MPI_REAL,MY_TYPE,ierr) Call MPI_TYPE_Commit(MY_TYPE,ierr) A(1,1), A(2,1), A(1,2), A(2,2) . A(1,3). 32 第31頁(yè)/共62頁(yè) 通訊域的分割通訊域的分割 MPI_Comm_Split(comm,color, key,New_Comm ) 0 2 14 3 5 7 6 8 9 10 11 Color 相同的進(jìn)程在同一組相同的進(jìn)程在同一組 根據(jù)根據(jù)key的大小排序的大
34、小排序 例如:例如: 12個(gè)進(jìn)程,個(gè)進(jìn)程, 分成分成 3行行4列列 Line=mod(myid,3); raw=myid/3 MPI_Comm_Split(MPI_Comm_World, raw, 0,Comm_Raw) MPI_Comm_Split(MPI_Comm_World,line,Comm_Line) Call MPI_Comm_rank(Comm_Raw,myid_raw,ierr) Call MPI_Comm_rank(Comm_line, myid_line,ierr) MPI_Comm_World 33 第32頁(yè)/共62頁(yè) 實(shí)例實(shí)例 1. 用(擬)譜方法求解二維不可壓用(擬)
35、譜方法求解二維不可壓N-S方程方程 jj i jj i j i i i xx u x p x u u t u x u Re 1 0 2p 物理模型物理模型 周期性邊界條件周期性邊界條件 按照給定能譜布置初始流動(dòng)按照給定能譜布置初始流動(dòng) 研究流動(dòng)的演化規(guī)律研究流動(dòng)的演化規(guī)律 34 第33頁(yè)/共62頁(yè) Fourier 變換變換 (1D) Njxeku N juuFu j N Nk kxi j /2,) ( 1 )( : ) ( 12/ 2/ p 1 0 1 )() ( : )( N j kxi j ejukuuFu Fourier 變換變換 的特點(diǎn):的特點(diǎn): 求導(dǎo)數(shù)求導(dǎo)數(shù) - 乘積乘積 )/( 1
36、 dxduFuik 0 i i x u 0 2211 ukuk 困難:困難: 非線性項(xiàng)非線性項(xiàng) )( j i j x u uF )(*)( j i j x u FuF 卷積卷積 計(jì)算量巨大計(jì)算量巨大 在物理空間計(jì)算在物理空間計(jì)算 j i j x u u Fourier 變換的快速算法變換的快速算法FFT 35 第34頁(yè)/共62頁(yè) 二維 Fourier 變換變換 12/ 2/ 12/ 2/ 2 2 ), ( 1 ),( : ) ( N Nk myi kxi N Nm j ie emku N jiuuFu )()( ,2jixymk uFFuF 兩次一維兩次一維 Fourier 變換變換 jj i
37、 jj i j i i i xx u x p x u u t u x u Re 1 0 )2( Re 1 ) 1 (0 2 ii i ii ukpk t u uk )( j i j x u uF 0)2( iii ukconsiderk 2 /kkp i ii i ukkk t u Re 1 )/1 ( 22 36 第35頁(yè)/共62頁(yè) ii i ukkk t u Re 1 )/1 ( 22 )( j i j x u uF 求解步驟:求解步驟: 1) 讀入初值讀入初值 2) 調(diào)用調(diào)用FFT 得到得到 3) 計(jì)算計(jì)算 調(diào)用調(diào)用FFT 得到得到 4) 計(jì)算計(jì)算 調(diào)用調(diào)用FFT 得到得到 5) 計(jì)算計(jì)
38、算 6) 積分積分 求出下一時(shí)間步的值求出下一時(shí)間步的值 7) 調(diào)用調(diào)用 FFT 得到得到 8) 循環(huán)循環(huán) 3)-7) 直到給定的時(shí)間直到給定的時(shí)間 ),(vuu i i u iju ki j i x u j i j x u u )( j i j x u uF iii ukkkQ Re 1 )/1 ( 22 i i Q t u )1( n i u )1(n i u 37 實(shí)際計(jì)算中,要采用抑制混淆誤差的措施 第36頁(yè)/共62頁(yè) 程序的并行化:程序的并行化: 二維二維 FFT )()( ,2jixymk uFFuF 二維二維FFT: 調(diào)用兩次一維調(diào)用兩次一維FFT 一維一維 FFT 算法復(fù)雜,并
39、行化難度大算法復(fù)雜,并行化難度大 二維二維 FFT 的并行:的并行: 重新分布重新分布 Subroutine FFT2d(nx,ny,u) integer nx,ny Complex u(nx,ny),Fu(nx,ny), u1(ny),u2(nx), do i=1,nx u1(:)= u(i,:) call FFT1d(ny,u1) Fu(i,:)=u1(:) enddo do j=1,ny u2(:)=Fu(:,j) call FFT1d(nx,u1) u(:,j)=u1(:) enddo end 38 第37頁(yè)/共62頁(yè) 數(shù)據(jù)重分布的實(shí)現(xiàn)數(shù)據(jù)重分布的實(shí)現(xiàn) A1(M/P,N) A2 (M,
40、N/P) 1234 a b c d 對(duì)等式編程思想對(duì)等式編程思想 “我我”需要完成的工作需要完成的工作 1) 將數(shù)據(jù)將數(shù)據(jù) A1(M/P,N) 切割成切割成P塊塊 ,存入數(shù)組,存入數(shù)組B1(M/P, N/P,P) 2) 將數(shù)據(jù)將數(shù)據(jù) B1(:,:,k) 發(fā)到發(fā)到 進(jìn)程進(jìn)程 k (k=0,1.P-1) 3) 從進(jìn)程從進(jìn)程k 接收接收 B2(:,:,k) 4) 組合組合 B2(:,:,k) 成成 A2 39 第38頁(yè)/共62頁(yè) 程序:程序: Subroutine Redistibute_ItoJ(A1,A2,M,N,P) Integer M,N,P,k,ierr,status(MPI_Status
41、_Size) real A1(M/P,N), A2(M,N/P), B1(M/P,N/P,P), B2(M/P,N/P,P) do k=1,P B1(:,:,P)=A1(:, (k-1)*N/P+1: k*N/P) ) call MPI_Send(B1,M*N/(P*P),MPI_Real, k-1, .) Enddo do k=1,P call MPI_Recv(B2,M*N/(P*P),MPI_Real, k-1, .) A2(k-1)*M/P+1: k*M/P) , : )=B2(:,:,P) Enddo end 問題:?jiǎn)栴}: 全部發(fā)送,全部發(fā)送, 發(fā)送成功發(fā)送成功后再啟動(dòng)接收。后再啟動(dòng)
42、接收。 容易死鎖容易死鎖 按行分布按行分布 - 按列分布按列分布 40 第39頁(yè)/共62頁(yè) Subroutine Redistibute_ItoJ(A1,A2,M,N,P) Integer M,N,P,k,ierr,status(MPI_Status_Size) real A1(M/P,N), A2(M,N/P), B1(M/P,N/P,P), B2(M/P,N/P,P) do k=1,P B1(:,:,P)=A1(:, (k-1)*N/P+1: k*N/P) ) id_send=myid-k mod P id_recv= myid+k mod P call MPI_Send(B1,M*N/(
43、P*P),MPI_Real, id_send, .) call MPI_Recv(B2,M*N/(P*P),MPI_Real, id_recv, .) A2(k-1)*M/P+1: k*M/P) , : )=B2(:,:,P) Enddo end 問題:?jiǎn)栴}: 按順序發(fā)送、接收,不易死鎖按順序發(fā)送、接收,不易死鎖 41 第40頁(yè)/共62頁(yè) 數(shù)據(jù)全交換:數(shù)據(jù)全交換: MPI_AlltoAll(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm, ierr) sendbuf 發(fā)送緩沖區(qū)(首地址)發(fā)送緩沖區(qū)(首地址) recvbuf
44、接收緩沖區(qū)(首地址)接收緩沖區(qū)(首地址) sendcount 發(fā)送數(shù)目發(fā)送數(shù)目 recvcount 接收數(shù)目接收數(shù)目 sendtype 發(fā)送類型發(fā)送類型 recvtype 接收類型接收類型 Comm 通信域通信域 ierr 整數(shù),返回錯(cuò)誤值(整數(shù),返回錯(cuò)誤值(0為成功)為成功) To 0To 1To 2To 3 Sendbuf 的數(shù)據(jù)格式的數(shù)據(jù)格式 sendcount From 0From 1From 2From 3 Recvbuf 的數(shù)據(jù)格式的數(shù)據(jù)格式 recvcount 42 第41頁(yè)/共62頁(yè) 程序:程序: Subroutine Redistibute_ItoJ(A1,A2,M,N,P)
45、 Integer M,N,P,k,ierr,status(MPI_Status_Size) real A1(M/P,N), A2(M,N/P), B1(M/P,N/P,P), B2(M/P,N/P,P) do k=1,P B1(:,:,P)=A1(:, (k-1)*N/P+1: k*N/P) ) enddo call MPI_AlltoAll (B1,M*N/(P*P),MPI_Real, B2, M*N/(P*P),MPI_Real, MPI_Comm_World,ierr) do k=1,P A2(k-1)*M/P+1: k*M/P) , : )=B2(:,:,P) Enddo end 問
46、題:?jiǎn)栴}: 無法做到計(jì)算與通信重疊無法做到計(jì)算與通信重疊 43 第42頁(yè)/共62頁(yè) 二維二維 并行并行FFT 的實(shí)現(xiàn)的實(shí)現(xiàn) (輸入數(shù)據(jù)、輸出數(shù)據(jù)均為按列分布)(輸入數(shù)據(jù)、輸出數(shù)據(jù)均為按列分布) 1) 調(diào)用一維調(diào)用一維FFT實(shí)現(xiàn)實(shí)現(xiàn) i- 方向的變換方向的變換 u - u1 2) 重新分布數(shù)據(jù)重新分布數(shù)據(jù) (按列(按列- 按行)按行) u1 - u2 3) 調(diào)用一維調(diào)用一維FFT 實(shí)現(xiàn)實(shí)現(xiàn)j- 方向的變換方向的變換 u2- Fu2 4) 重新分布數(shù)據(jù)重新分布數(shù)據(jù) (按行(按行 - 按列)按列) Fu2- Fu 44 第43頁(yè)/共62頁(yè) 實(shí)例實(shí)例 (2) 利用流水線利用流水線 實(shí)現(xiàn)緊致差分的并行化
47、實(shí)現(xiàn)緊致差分的并行化 緊致型差分格式:緊致型差分格式: 相同網(wǎng)格點(diǎn)上引入更多信息。相同網(wǎng)格點(diǎn)上引入更多信息。 性能更優(yōu)化。性能更優(yōu)化。 0 x u a t u i F i x u 是是 的差分逼近的差分逼近 普通差分格式:普通差分格式: 顯式給出顯式給出 Fi 的表達(dá)式的表達(dá)式 )2/()( 11 huuF jjj )945459( 60 1 321123 jjjjjjj uuuuuu h F 緊致型差分格式:緊致型差分格式: 隱式給出隱式給出 Fi 的表達(dá)式的表達(dá)式 )1236443( 120 1 5 2 5 3 21121 jjjjjjj uuuuu x FF 6 階中心 6 階對(duì)稱緊致階
48、對(duì)稱緊致 (Lele) 5 階迎風(fēng)緊致階迎風(fēng)緊致 (Fu) j-2 j-1 j j+1 j+2 hffffFFF jjjjjjj 36/ )2828(3/13/1 211211 45 第44頁(yè)/共62頁(yè) )945459( 60 1 321123 jjjjjjj uuuuuu h F 普通差分格式:普通差分格式: 直接計(jì)算導(dǎo)數(shù),并行容易直接計(jì)算導(dǎo)數(shù),并行容易 jjj dFF 1 5 2 5 3 緊致格式的計(jì)算:緊致格式的計(jì)算: 遞推遞推 )1236443( 120 1 2112 jjjjjj uuuuu x d 1 3/23/5 jjj FdF 遞推公式:遞推公式: 1)計(jì)算出計(jì)算出 (由邊界條
49、件或邊界格式給出)(由邊界條件或邊界格式給出) 2) 由由 遞推計(jì)算遞推計(jì)算 出全部導(dǎo)數(shù)出全部導(dǎo)數(shù) 1 F 1 3/23/5 jjj FdF 后面的數(shù)據(jù)必須等待前一步計(jì)算完成,無法并行后面的數(shù)據(jù)必須等待前一步計(jì)算完成,無法并行 46 第45頁(yè)/共62頁(yè) 1, 3/23/5 jijiji FdF 二維問題:二維問題: 流水線法求解流水線法求解 流水線示意圖流水線示意圖 步驟:步驟: 1) 計(jì)算計(jì)算 d(:,:) 2) for k=1,M 如果如果 myid=0, 計(jì)算計(jì)算 F(k,0), 否則否則 從從myid-1接收接收 F(k,0); for i=1,N1 (N1=N/P) 計(jì)算計(jì)算 F(k
50、,i); 如果如果myid P-1 向向 myid+1 發(fā)送發(fā)送 F(k,N1) 缺點(diǎn):缺點(diǎn): 通信次數(shù)過多通信次數(shù)過多 47 第46頁(yè)/共62頁(yè) 通信次數(shù)過于頻繁通信次數(shù)過于頻繁解決方法:解決方法: 分塊流水線分塊流水線 步驟:步驟: 1) 計(jì)算計(jì)算 d(:,:) 2) for kp=1,MP 如果如果 myid=0, 計(jì)算計(jì)算 F(kp,0), 否則否則 從從myid-1接收接收 F(kp,0); for j=1,N1 (N1=N/P) 計(jì)算計(jì)算 F(kp,j); 如果如果myid P-1 向向 myid+1 發(fā)送發(fā)送 F(kp,N1) F(kp,i) 表示第表示第kp 塊塊 48 第47
51、頁(yè)/共62頁(yè) 對(duì)稱緊致格式對(duì)稱緊致格式 jjjj dFFF 11 3/13/1hffffd jjjjj 36/ )2828( 2112 追趕法追趕法) 1 ( 11jjjjjj dFFF )2( 1jjjj BFAF 111 jjjj BFAF 令 則 代入(代入(1) 得得 111 ) 1( jjjjjjjj BdFFA 對(duì)比(對(duì)比(2) 得得 ) 3() 1/()(, ) 1/( 111 jjjjjjjjjj ABdBAA 邊界處導(dǎo)數(shù)可由邊界條件或邊界格式給出邊界處導(dǎo)數(shù)可由邊界條件或邊界格式給出: * 11NN FFFF 則 * 111 , 0FBA 步驟:步驟: 1) 2) 由由 (3)
52、式遞推,得到)式遞推,得到 3) 4) 由由 (2)式遞推,得到)式遞推,得到 jj BA , * NN FF j F 特點(diǎn):特點(diǎn): 兩次遞推。兩次遞推。 并行方法與前文類似并行方法與前文類似 49 第48頁(yè)/共62頁(yè) 3.常用的并行優(yōu)化方法常用的并行優(yōu)化方法 1) 通信與計(jì)算重疊通信與計(jì)算重疊 采用非阻塞通信采用非阻塞通信 Isend, Irecv 2) 用重復(fù)計(jì)算代替通信用重復(fù)計(jì)算代替通信 3) 拆分長(zhǎng)消息、合并短消息拆分長(zhǎng)消息、合并短消息 4) 優(yōu)化通信方式優(yōu)化通信方式 50 第49頁(yè)/共62頁(yè) 用重復(fù)計(jì)算代替通信用重復(fù)計(jì)算代替通信 例如:例如: 計(jì)算差分計(jì)算差分 u 分布存儲(chǔ)分布存儲(chǔ),
53、 f(u) 為為 u 的函數(shù)的函數(shù) 01 )(,uf xx u 方法方法 1) 計(jì)算出計(jì)算出 v=f(u) 通信得到通信得到 uN+1, vN+1 計(jì)算差分計(jì)算差分 方法方法 2) 計(jì)算出計(jì)算出 v=f(u) 通信得到通信得到 uN+1 (邊界外)(邊界外) 計(jì)算出計(jì)算出 vN+1 =f(uN+1) 計(jì)算差分計(jì)算差分 方法方法 2) 計(jì)算量大,通信量小計(jì)算量大,通信量小 當(dāng)函數(shù)當(dāng)函數(shù) f(u)不復(fù)雜時(shí),可提高效率不復(fù)雜時(shí),可提高效率 1, 2 N N+1 51 第50頁(yè)/共62頁(yè) 長(zhǎng)消息切割成多個(gè)短消息發(fā)送、接收長(zhǎng)消息切割成多個(gè)短消息發(fā)送、接收 call MPI_Send(A(1),10000
54、0, MPI_Real, 1, ) 改為:改為: do m=1,10 call MPI_Send(A(m-1)*10000+1),10000,MPI_real,1 ) enddo 長(zhǎng)消息:長(zhǎng)消息: 非緩沖;非緩沖; 短消息:短消息: 緩沖緩沖 緩沖區(qū) MPI_Send 緩沖區(qū) MPI_Send MPI_Recv MPI_Recv 52 第51頁(yè)/共62頁(yè) 合并短消息合并短消息 do m=1,100 call MPI_Send(A(1,m),1,MPI_real,1 ) enddo 改為改為 do m=1,100 B(m)=A(1,m) enddo call MPI_Send(B(1),100,
55、 MPI_Real, 1, ) 53 第52頁(yè)/共62頁(yè) 優(yōu)化通信方式優(yōu)化通信方式 例:例: 數(shù)據(jù)散發(fā)數(shù)據(jù)散發(fā) 0號(hào)號(hào) 進(jìn)程:進(jìn)程: 數(shù)據(jù)數(shù)據(jù) A(100), 散發(fā)給散發(fā)給 0-99 方式方式1) 0 進(jìn)程執(zhí)行進(jìn)程執(zhí)行100次次 MPI_Send 其他進(jìn)程執(zhí)行其他進(jìn)程執(zhí)行 MPI_Recv MPI_Scatter() 采用該算法采用該算法 方式方式 2) 0 進(jìn)程進(jìn)程 把把 A(100) 切割成切割成10份份 , 發(fā)送給發(fā)送給10個(gè)進(jìn)程個(gè)進(jìn)程 10個(gè)進(jìn)程接收個(gè)進(jìn)程接收A1(10) 后再散發(fā)后再散發(fā) 54 第53頁(yè)/共62頁(yè) OpenMP并行編程入門并行編程入門 一、一、 特點(diǎn)特點(diǎn) 1. 針對(duì)針
56、對(duì)共享內(nèi)存共享內(nèi)存計(jì)算機(jī)結(jié)構(gòu)計(jì)算機(jī)結(jié)構(gòu) 全部全部CPU/線程均可訪問內(nèi)存線程均可訪問內(nèi)存 2. 程序改動(dòng)量小、實(shí)現(xiàn)方便程序改動(dòng)量小、實(shí)現(xiàn)方便 (以編譯指示符為主)(以編譯指示符為主) 3. 適用于小規(guī)模并行或與適用于小規(guī)模并行或與MPI配合配合 進(jìn)行大規(guī)模并行進(jìn)行大規(guī)模并行 內(nèi)存 CPU( 核心) CPU( 核心) CPU( 核心) 1臺(tái)PC機(jī) / 1個(gè)計(jì)算節(jié)點(diǎn) (共享內(nèi)存構(gòu)架) CPU 內(nèi)存 CPU 內(nèi)存 CPU 內(nèi)存 外部網(wǎng)絡(luò) 節(jié)點(diǎn)1節(jié)點(diǎn)2 Cluster結(jié)構(gòu), 分布內(nèi)存構(gòu)架 第54頁(yè)/共62頁(yè) print*, code 1 !$OMP PARALLEL print*, code 2 !$
57、OMP END PARALLEL print*, code 3 end 例1 (test1.f90) : 編譯編譯 (在深騰(在深騰7000) 運(yùn)行結(jié)果(屏幕截圖) ifort test1.f90 -openmp 添加 openmp 選項(xiàng) 運(yùn)行: 1. 設(shè)置線程數(shù)(并行執(zhí)行的數(shù)目) export OMP_NUM_THREADS=4 (例如,4個(gè)) 2. 執(zhí)行: ./a.out 顯示結(jié)果: code 1 code 2 code 2 code 2 code 2 code 3 并行域中的代碼執(zhí)行了4次 Test2.f90 : print*, code 1 !$OMP PARALLEL print*,
58、 code 2“ !$OMP PARALLEL print*, “code 3” !$OMP END PARALLEL !$OMP END PARALLEL print*, code 4 end 第55頁(yè)/共62頁(yè) 3.DO 循環(huán)分解循環(huán)分解 (openMP最常用的并行方法)最常用的并行方法) !$OMP PARALLEL !$OMP DO do k=1,12 print*, k enddo !$OMP END DO !$OMP END PARALLEL end 示例: 線程線程0 k=1,2,3 線程線程1 k=4,5,6 線程線程2 k=7,8,9 線程線程2 k=10,11,12 !$O
59、MP PARALLEL !$OMP DO !$OMP PARALLEL DO 簡(jiǎn)寫 運(yùn)行結(jié)果 (屏幕截圖) 運(yùn)行結(jié)果: 1 2 3 7 8 9 4 5 6 10 11 12 線程0 線程2 線程1 線程3 第56頁(yè)/共62頁(yè) implicit none integer,parameter: N=100000000 integer: k real*8,dimension(:),allocatable: x,y,z real*8: time1,time2,OMP_get_wtime allocate(x(N),y(N),z(N) !$ time1=OMP_get_wtime() !$OMP PAR
60、ALLEL DO SHARED(x,y,z) PRIVATE(k) do k=1,N x(k)=(k-1.d0)/(N-1.d0) y(k)=(k+1.d0)/(N-1.d0) z(k)=x(k)+y(k) enddo !$OMP END PARALLEL DO !$ time2=OMP_get_wtime() deallocate(x,y,z) print*, Total Wall Time is , time2-time1 end 例:test 4屏幕截圖 采用單線程執(zhí)行:采用單線程執(zhí)行: 耗時(shí)耗時(shí)2.15秒秒 采用采用2線程執(zhí)行:耗時(shí)線程執(zhí)行:耗時(shí) 1.43秒秒 采用采用4線程執(zhí)行:線程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年開封運(yùn)輸從業(yè)資格證考試技巧
- 農(nóng)業(yè)設(shè)備供貨合同范本
- 勞動(dòng)合同范本大全
- 2025年運(yùn)城貨運(yùn)上崗證模擬考試試題
- 專利侵權(quán)檢索合同范本
- 買賣廢鋼材合同范本
- 勞務(wù)合同范本無社保
- 臨泉教師合同范本
- 三人合作協(xié)議合同范本
- 交電產(chǎn)品銷售合同范例
- 2025包頭青山賓館有限公司面向社會(huì)公開招聘18人筆試參考題庫(kù)附帶答案詳解
- 2025年業(yè)務(wù)員工作總結(jié)及工作計(jì)劃模版(3篇)
- 2025至2030年中國(guó)毛絨卡通玩具數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024年連云港市贛榆區(qū)區(qū)屬國(guó)企對(duì)外招聘筆試真題
- 海南省??谑?024-2025學(xué)年八年級(jí)上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 2025年度智能充電樁場(chǎng)地租賃合同范本3篇
- 2025年注射用賴氮匹林項(xiàng)目可行性研究報(bào)告
- 2025江西吉安市新廬陵投資發(fā)展限公司招聘11人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 技術(shù)推廣服務(wù)合同模板五篇
- 2025年山東出版集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 水泥基自流平地面技術(shù)交底
評(píng)論
0/150
提交評(píng)論